<?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>myGeeBlog &#187; php</title>
	<atom:link href="http://urzenia.net/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://urzenia.net</link>
	<description>blog programisty z piekła rodem...</description>
	<lastBuildDate>Sat, 10 Jul 2010 20:21:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>4Developers</title>
		<link>http://urzenia.net/468/4developers/</link>
		<comments>http://urzenia.net/468/4developers/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 12:31:55 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[4developers]]></category>
		<category><![CDATA[it]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=468</guid>
		<description><![CDATA[Wczoraj odbyła się druga konferencja z serii 4Developers. I ja tam byłem, Allegro i herbatę piłem, ciastek się najadłem i w ogóle ;) Sama konferencja była podzielona na 4 ścieżki: Zarządzanie projektami IT, Java, .Net &#038; C# oraz PHP. Ja wybrałem sobie kilka wykładów z Zarządzania projektami IT (w sumie większość) i zahaczyłem także o [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj odbyła się druga konferencja z serii <a href="http://2010.4developers.org.pl/">4Developers</a>. I ja tam byłem, <em>Allegro</em> i herbatę piłem, ciastek się najadłem i w ogóle ;)</p>
<p>Sama konferencja była podzielona na 4 ścieżki: <a href="http://2010.4developers.org.pl/zarzadzanie-projektami-it-agenda">Zarządzanie projektami IT</a>, <a href="http://2010.4developers.org.pl/java-agenda">Java</a>, <a href="http://2010.4developers.org.pl/net-c-agenda">.Net &#038; C#</a> oraz <a href="http://2010.4developers.org.pl/php-agenda">PHP</a>. Ja wybrałem sobie kilka wykładów z <em>Zarządzania projektami IT</em> (w sumie większość) i zahaczyłem także o wykłady nt. <em>PHP</em>.</p>
<p>Pierwszy wykład na którym byłem, była to zrealizowana w formacie <a href="http://pl.wikipedia.org/wiki/Pecha_Kucha">Pecha Kucha</a> (coś na kształt <a href="http://en.wikipedia.org/wiki/Lightning_talk">Lightning Talk</a>) seria 3 prezentacji na tematy dotyczące, a jakże, zarządzania ;) Podobało mi się, 3 panów z organizacji <a href="http://www.poznan.pmi.org.pl/">PMI Poznań</a> fajnie poopowiadało o tematach takich jak &#8220;Produktywne lenistwo&#8221;, &#8220;Przyczyny porażek startupów&#8221; i &#8220;Projekt w opałach&#8221;. Wykłady dużo nowego mi nie powiedziały, ale kilka rzeczy nazwały po imieniu w miejscach gdzie się czegoś domyślałem, albo zwróciły mi na coś uwagę. Ogólnie zdecydowanie za.</p>
<p>Kolejny wykład który mnie interesował, odbył się w tej samej sali, też z <em>Zarządzania projektem IT</em>. Tym razem <a href="http://2010.4developers.org.pl/prelegenci/monika-konieczny">Monika Konieczny</a> opowiadała o tym, jak można pogodzić/ułatwić współpracę testerów z programistami. Trzeba przyznać, że Monika miała świetny pomysł z ciastem ;) Oprócz tego, że wykład dał mi sporo tematów do przemyśleń i podsunął trochę pomysłów, to z przyjemnością patrzyło się na kogoś kto z łatwością i zaangażowaniem prowadził zajęcia. Widać było, że Monika raz, wiedziała o czym mówi, dwa, ma sporo swoich przemyśleń na ten temat, trzy, była doskonale przygotowana. Myślę że dla mnie to najlepszy wykład na całej konferencji. A Monice tylko pogratulować :)</p>
<p>Na następny wykład miałem dylemat: pójść na <em>PHP</em>: &#8220;Aplikacje internetowe wydajne od początku&#8221;, czy zostać na <em>Zarządzaniu projektami IT</em>: &#8220;Zarządzanie rozwojem oprogramowania – nieco bardziej &#8216;funky&#8217;&#8221;. W końcu stwierdziłem że trochę technikaliów mi nie zaszkodzi, poszedłem sobie na <em>PHP</em>. Jeszcze wtedy nie wiedziałem co czynię&#8230; Panowie niestety nie dość że byli słabo przygotowani do wykładu (więcej czytali ze slajdów niż byli w stanie powiedzieć, patrzyli co chwila na siebie, który ma właśnie mówić etc), to nie do końca mieli pojęcie o czym mówią. Niestety. Być może później wyprostowali trochę swój wizerunek, ale tego już nie wiem, bo wyszedłem po 15 minutach. Po tym jak kilkukrotnie potraktowali wymiennie bufor z cache (używali tych słów jak synonimów), a wcześniej puścili kilka innych bezsensownych stwierdzeń. Najgorszy z możliwych wykładów IMHO.</p>
<p>Po tym jak uciekłem z &#8220;Aplikacji internetowych wydajnych od początku&#8221;, poszedłem na wspomniane &#8220;Zarządzanie rozwojem oprogramowania – nieco bardziej &#8216;funky&#8217;&#8221;. <a href="http://2010.4developers.org.pl/prelegenci/peter-horsten">Peter Horsten</a> poopowiadał nieco o rzeczach które znałem już doskonale, więc sam temat mnie nie do końca zainteresował (myślałem że będzie to nieco głębsze wejście w temat, tutaj było tylko pobieżnie), ale sam sposób prowadzenia wykładu to bajka. Najlepiej poprowadzony wykład na całym 4Developers, z tych na których byłem. Peter z lekkością i wprawą poopowiadał o wszystkim, z humorem, etc. Z przyjemnością go słuchałem :)</p>
<p>Po lunchu znów poszedłem na wykład <em>PHP</em>: &#8220;PHP wysokiej wydajności&#8221;. Tutaj było zdecydowanie lepsze przygotowanie techniczne <a href="http://2010.4developers.org.pl/prelegenci/mariusz-gil">Mariusza Gila</a> niż kolegów od wydajności z poprzedniego wykładu. Nie było już wrażenia że nie wie o czym mówi, wręcz przeciwnie, większość tego o czym wspominał znam z własnych testów, choć nigdy nie miałem tak porywającego serwisu napisanego w PHP żebym musiał to stosować w praktyce :) Ogólnie sam wykład mnie nie szczególnie zainteresował, bo bardzo niewiele nowego miałem okazję się dowiedzieć (zapisałem sobie chyba tylko kilka nazw narzędzi z którymi warto żebym się zapoznał), ale oceniam go znacznie wyżej niż poprzedników ;)</p>
<p>Później już nie wychodziłem ze ścieżki &#8220;Zarządzania projektami IT&#8221;. Najpierw <a href="http://2010.4developers.org.pl/prelegenci/jakub-dabkowski">Jakub Dąbkowski</a> w fajny sposób, z humorem, poopowiadał o jednym z aspektów <a href="http://pl.wikipedia.org/wiki/Scrum">metodyki Scrum</a>, czyli o pytaniach jakie są ważne podczas &#8220;scrum meeting&#8221;. Wykład oceniam wysoko, Jakub zwrócił uwagę na powody dla których te pytania są ważne dla członków zespołu. </p>
<p>Następnie byłem na &#8220;Praktyce zarządzania portfelem projektów IT&#8221;. Okazało się jednak, że temat nie zainteresował mnie tak bardzo jak na to liczyłem. Wygląda na to, że te 40 minut jakie miał <a href="http://2010.4developers.org.pl/prelegenci/szymon-wlochowicz">Szymon Włochowicz</a> to zdecydowanie za mało na omówienie choćby częściowo tego tematu, usłyszeliśmy ledwie zajawkę, więc na sali było sporo osób które, jak mi się wydaje, podobnie jak ja nie zostali przekonani do takiego podejścia.</p>
<p>Ostatnim wykładem był &#8220;Łączenie ognia i wody – proces projektowy w Gratka Technologie&#8221;, ale tutaj było za mało interesujących tematów, ot, prelegent poopowiadał o swoich doświadczeniach, niestety myślę że zrobił to nieco za wcześnie, gdyż jeszcze miał ich nieco za mało. Mam mocno mieszane uczucia odnośnie tej prezentacji.</p>
<p>Ogólnie jestem bardzo zadowolony z całości. Ciekawe wykłady, rewelacyjne hostessy ;) darmowy wyjazd (sponsorowany przez firmę ;) ), i nie za daleko od domu (w sensie: mało czasu straconego w ciapągu) &#8211; zdecydowanie było warto :) Do tego stopnia, że jak tylko będę miał możliwość, to w przyszłym roku na pewno się wybiorę na kolejną edycję &#8211; nawet pomimo tego że konkurs komiksowy wygrał rysunek uzupełniony z oryginalnego Garfielda, a nie nasz :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/468/4developers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHPPHP</title>
		<link>http://urzenia.net/410/phpphp/</link>
		<comments>http://urzenia.net/410/phpphp/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 16:59:03 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=410</guid>
		<description><![CDATA[Dawno tu nie pisałem&#8230; No cóż, (bardzo) dużo pracy, życie osobiste i takie tam &#8211; to odstrasza od blogowania ;) Jeśli już, to od czasu do czasu coś publikuję jeśli chodzi o zdjęcia, a sprawy &#8220;kodowe&#8221; to raczej &#8220;robię&#8221; niż o nich piszę :) Jako że od kilka dni jestem na L4, to się ostro [...]]]></description>
			<content:encoded><![CDATA[<p>Dawno tu nie pisałem&#8230; No cóż, (bardzo) dużo pracy, życie osobiste i takie tam &#8211; to odstrasza od blogowania ;) Jeśli już, to od czasu do czasu coś publikuję jeśli <a href="http://h2o.sztolcman.eu">chodzi o zdjęcia</a>, a sprawy &#8220;kodowe&#8221; to raczej &#8220;<a href="http://code.google.com/u/urzenia/">robię</a>&#8221; niż o nich piszę :)</p>
<p>Jako że od kilka dni jestem na <a href="http://pl.wikipedia.org/wiki/Zwolnienie_lekarskie">L4</a>, to się ostro opierdzielam, ale dopiero dziś jestem w stanie podjąć jakikolwiek intelektualny wysiłek&#8230; No to popatrzyłem sobie m.in. na <a href="http://goldenline.pl">GoldenLine</a>. Dziś na forum PHPowym ktoś poruszył dość banalny problem, ktoś inny podrzucił rozwiązanie (<a href="http://php.net/preg_replace_callback"><code>preg_replace_callback ()</code></a>, a ja zacząłem się zastanawiać czemu wszyscy w PHP tak napierają na <a href="http://pl.wikipedia.org/wiki/Regexp">regexp</a>y (rozumiem w Perlu, ale PHP?). Jak zacząłem się zastanawiać jak to zrobić bez regexpów, to zacząłem się bawić w zakodowanie tego ;)</p>
<p>Najpierw zrobiłem dość banalną wersję, przy użyciu <a href="http://php.net/strlen">strlen ()</a>, <a href="http://php.net/strpos">strpos ()</a> i <a href="http://php.net/substr">substr ()</a>, i chciałem ją podać jako wersję <em>hardcore</em> ;) Wtedy pomyślałem sobie, że prawdziwa wersja <em>hardcore</em>, to byłaby bez użycia tychże funkcji&#8230; najprostsza postać tego to zastąpienie tychże funkcji swoimi ;) I o ile <code>substr ()</code> i <code>strpos ()</code> są dość banalne, o tyle dla mnie prawdziwym <em>hardcorem</em> jest <code>strlen ()</code> ;)</p>
<p>Oczywiście nie są to najbardziej <del datetime="2009-04-18T14:26:09+00:00">optymalne</del> <ins datetime="2009-04-18T14:26:09+00:00">wydajne</ins> rozwiązania (a jeśli są to tylko przypadkiem), bo jeśli chodzi o optymalizację, <del datetime="2009-04-18T14:26:09+00:00">to trzeba by używać wersji natywnych</del> <ins datetime="2009-04-18T14:26:09+00:00">to trzeba by się najpierw zastanowić i sprawdzić czy jest co optymalizować</ins>&#8230; :) <strong>A całość warto potraktować stricte jako zabawę</strong>, którą dla mnie było pisanie tego :)</p>
<p>W całym &#8220;problemie&#8221; chodziło o zastąpienie w tekście wystąpień &#8220;[userId]ID[/userId]&#8221; tym, co zostanie wyplute przez dodatkową funkcję której podajemy zawartość tego co jest między znacznikami. Użycie <code>preg_replace_callback ()</code> jest chyba najbardziej intuicyjnym rozwiązaniem, ale nie jedynym&#8230; :) Poniżej obydwie wersje: <a href="#hardcore"><em>hardcore</em></a> i <a href="#hardcore2"><em>bardziej hardcore</em></a> &#8211; enjoy ;)</p>
<h2><a name="hardcore"><em>hardcore</em></a></h2>
<pre><code>function replace_user_id ($str, $fn) {
    $tags = array ('start' => '[userId]', 'end' => '[/userId]');
    $tag_len = array (
        'start' => strlen ($tags['start']),
        'end'   => strlen ($tags['end'])
    );
    $offset = $pos_end = 0;
    $ret    = '';
    $strlen = strlen ($str);

    while ($pos_end < $strlen) {
        if (
            ($pos_start = strpos ($str, $tags['start'], $pos_end)) !== false &#038;&#038;
            ($pos_end   = strpos ($str, $tags['end'], $pos_start)) !== false
        ) {
            $ret .= substr ($str, $offset, $pos_start - $offset);
            $pos_start += $tag_len['start'];

            $ret .= $fn (substr ($str, $pos_start, $pos_end - $pos_start));

            $pos_end += $tag_len['end'];
            $offset = $pos_end;
        }
        else {
            break;
        }
    }

    return $ret;
}</code></pre>
<h2><a name="hardcore2"><em>bardziej hardcore</em></a></h2>
<pre><code>class __mstrlen__ErrH {
    private static $error = false;
    private function __construct () {}
    static public function errh ($errno, $errstr, $errfile = '', $errline = 0, $errctx = array ()) {
        if ($errno != E_NOTICE) {
            return false;
        }

        $expected = 'Uninitialized string offset';
        for ($i=0; $i<26; ++$i) {
            if ($expected[$i] != $errstr[$i]) {
                return false;
            }
        }

        self::$error = true;
    }
    public static function isError () {
        return self::$error;
    }
    public static function zero () {
        self::$error = false;
    }
}

function mstrlen ($str) {
    $str = (string) $str;

    $len = -1;
    __mstrlen__ErrH::zero ();
    set_error_handler (array ('__mstrlen__ErrH', 'errh'), E_NOTICE);
    while (__mstrlen__ErrH::isError () === false) {
        ++$len;
        $q = $str[$len];
    }

    restore_error_handler ();
    return $len < 0 ? 0 : $len;
}

function mstrpos ($str, $seek, $offset=0) {
    if (!is_int ($offset) || $offset < 0) {
        $offset = 0;
    }

    $str_len = mstrlen ($str);
    if ($offset > $str_len) {
        return false;
    }

    $seek_len = mstrlen ($seek);
    for ($i=$offset; $i < $str_len; ++$i) {
        for ($j=0; $j < $seek_len; ++$j) {
            if ($str[$i + $j] != $seek[$j]) {
                break;
            }
        }

        if ($j == $seek_len) {
            return $i;
        }
    }
    return false;
}

function msubstr ($str, $start, $length = null) {
    $str_len = mstrlen ($str);
    if (!is_int ($start)) {
        trigger_error ('Incorrect offset');
    }
    else if ($start >= $str_len) {
        return false;
    }
    else if ($start < 0) {
        $start = $str_len + $start;
    }

    if (!is_int ($length)) {
        $length = $str_len - $start;
    }
    else if ($length < 0) {
        $length = $str_len + $length - $start;
    }
    else if ($length + $start > $str_len) {
        $length = $str_len - $start;
    }

    $ret = '';
    for ($i=0; $i < $length; ++$i) {
        $ret .= $str[$i + $start];
    }

    return $ret;
}

function replace_user_id2 ($str, $fn) {
    $tags = array ('start' => '[userId]', 'end' => '[/userId]');
    $tag_len = array (
        'start' => mstrlen ($tags['start']),
        'end'   => mstrlen ($tags['end'])
    );
    $offset = $pos_end = 0;
    $ret    = '';
    $strlen = mstrlen ($str);

    while ($pos_end < $strlen) {
        if (
            ($pos_start = mstrpos ($str, $tags['start'], $pos_end)) !== false &#038;&#038;
            ($pos_end   = mstrpos ($str, $tags['end'], $pos_start)) !== false
        ) {
            $ret .= msubstr ($str, $offset, $pos_start - $offset);
            $pos_start += $tag_len['start'];

            $ret .= $fn (msubstr ($str, $pos_start, $pos_end - $pos_start));

            $pos_end += $tag_len['end'];
            $offset = $pos_end;
        }
        else {
            break;
        }
    }

    return $ret;
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/410/phpphp/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Useless-scripts: wwwshell.php 0.2</title>
		<link>http://urzenia.net/381/useless-scripts-wwwshellphp-02/</link>
		<comments>http://urzenia.net/381/useless-scripts-wwwshellphp-02/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 10:54:32 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[skrypt]]></category>
		<category><![CDATA[useless-scripts]]></category>
		<category><![CDATA[wwwshell]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=381</guid>
		<description><![CDATA[wwwshell.php to skrypt napisany w php, pozwalający obejść część ograniczeń związanych z brakiem shella na hostingu. Jako że w home.pl takowego nie ma, musiałem jakiś czas temu ratować się takim wynalazkiem ;) Założeniem które przyświecało od początku jego istnienia była kompaktowość (wszystko w jednym pliku), używalność, wygoda. Wydaje mi się że jak na razie spełnia [...]]]></description>
			<content:encoded><![CDATA[<p>wwwshell.php to skrypt napisany w php, pozwalający obejść część ograniczeń związanych z brakiem shella na hostingu. Jako że w <a href="http://home.pl">home.pl</a> takowego nie ma, musiałem <a href="http://urzenia.net/357/po-przeprowadzce/">jakiś czas temu</a> ratować się takim wynalazkiem ;)</p>
<p>Założeniem które przyświecało od początku jego istnienia była kompaktowość (wszystko w jednym pliku), używalność, wygoda. Wydaje mi się że jak na razie spełnia wszystkie wymienione ;) Ograniczeniami są PHP >= 4.3.0 i nie zablokowane wykonywanie funkcji <code>proc_open ()</code> i <code>proc_close ()</code>.</p>
<p>Zalety (z mojego punku widzenia ;) ):</p>
<ul>
<li>wszystko w jednym pliku (biblioteki jQuery pobierane są bezpośrednio z serwera <a href="http://jquery.com/">jQuery.com</a></li>
<li>obsługa aliasów</li>
<li>prostota użytkowania</li>
<li>historia poleceń</li>
</ul>
<p>Wady:</p>
<ul>
<li>no cóż, to jednak nie prawdziwy shell&#8230; </li>
<li>brak uzupełniania</li>
<li>uprzyjemniacze typu historia wymagają połączenia z netem lub modyfikacji skryptu i używania lokalnych kopii bibioteki jQuery</li>
</ul>
<p>Znane błędy:</p>
<ul>
<li>nie zapamiętuje ustawionego rozmiaru czcionki w okienku wyjścia</li>
<li>czasem z jakiegoś powodu historia nie działa, trzeba np. otworzyć okienko konsoli w ff i je zamknąć, wtedy jest ok :/</li>
</ul>
<p>Nie sprawdzałem też (ani nawet nie zamierzam jak na razie) sprawdzać jak wygląda i działa pod IE. Może się coś sypać :)</p>
<p>Jeśli ktoś jest zainteresowany tą zabawką, to zapraszam do pobierania na <a href="http://code.google.com/p/useless-scripts/downloads/list">GoogleCode</a>, i komentowania/krytykowania pod tą notką ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/381/useless-scripts-wwwshellphp-02/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WP-Blip! 0.3.2</title>
		<link>http://urzenia.net/378/wp-blip-032/</link>
		<comments>http://urzenia.net/378/wp-blip-032/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 23:01:37 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=378</guid>
		<description><![CDATA[Mały bugfix release (zgłoszony przez WPNinja): W przypadku gdy nie można zapisać pliku z cache do katalogu ustawionego jako zmienna $wp_blip_cacheroot, próbuje zapisać do systemowego katalogu tymczasowego (o ile się uda takowy znaleźć). Gdy także i ta operacja się nie powiedzie, zostanie rzucony E_USER_NOTICE z informacją o problemie, a wtyczka po prostu nie będzie korzystała [...]]]></description>
			<content:encoded><![CDATA[<p>Mały bugfix release (zgłoszony przez <a href="http://wpninja.pl/blip-i-wordpress/">WPNinja</a>): W przypadku gdy nie można zapisać pliku z cache do katalogu ustawionego jako zmienna <code>$wp_blip_cacheroot</code>, próbuje zapisać do systemowego katalogu tymczasowego (o ile się uda takowy znaleźć). Gdy także i ta operacja się nie powiedzie, zostanie rzucony <code>E_USER_NOTICE</code> z informacją o problemie, a wtyczka po prostu nie będzie korzystała z funkcji cacheowania wpisów.</p>
<p>Do pobrania z <a href="http://code.google.com/p/wp-blip/downloads/list">GoogleCode</a>. Jak zawsze proszę o informacje i uwagi nt działania wtyczki, a także ucieszyłbym się z informacji że ktoś gdzieś moich wypocin używa :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/378/wp-blip-032/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WP-Blip! 0.3</title>
		<link>http://urzenia.net/371/wp-blip-03/</link>
		<comments>http://urzenia.net/371/wp-blip-03/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 18:38:03 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=371</guid>
		<description><![CDATA[Kolejna odsłona WP-Blip!a :) Tym razem jeden bugfix (no, powiedzmy że fix), i jedna zmiana: możliwość formatowania daty dodania statusu (via komentarz Julka) naprawione linkowanie tagów i userów &#8211; teraz łapie poprawnie polskie znaczki. Może nie do końca poprawnie działać jeśli kodowanie znaków jest inne niż UTF-8, proszę wtedy dać znać, mam wrażenie że coś [...]]]></description>
			<content:encoded><![CDATA[<p>Kolejna odsłona WP-Blip!a :) Tym razem jeden bugfix (no, powiedzmy że fix), i jedna zmiana:</p>
<ul>
<li>możliwość formatowania daty dodania statusu (via <a href="http://urzenia.net/370/wp-blip-02/#comment-33358">komentarz Julka</a>)</li>
<li>naprawione linkowanie tagów i userów &#8211; teraz łapie poprawnie polskie znaczki. Może nie do końca poprawnie działać jeśli kodowanie znaków jest inne niż UTF-8, proszę wtedy dać znać, mam wrażenie że coś źle przemyślałem ;)</li>
</ul>
<p>Standardowo proszę o komentarze pod tym wpisem, lub na <a href="http://urzenia.net/email">email</a> :) A nowa wersja pluginu jest do <a href="http://code.google.com/p/wp-blip/downloads/list?can=2&#038;q=0.3&#038;colspec=Filename+Summary+Uploaded+Size+DownloadCount">pobrania na Google Code</a>.</p>
<p><ins datetime="2008-07-10T18:58:21+00:00">UPDATE:</ins></p>
<p>Już nowa wersja &#8211; 0.3.1 ;)</p>
<ul>
<li>fix: pliterki w tagach teraz działają lepiej</li>
<li>fix: myślnik w tagach też działa lepiej</li>
<li>add: linki we wpisach są obejmowana tagiem &lt;a /&gt;</li>
</ul>
<p>Do pobrania tradycyjnie na <a href="http://code.google.com/p/wp-blip/downloads/list?can=2&#038;q=0.3.1&#038;colspec=Filename+Summary+Uploaded+Size+DownloadCount">GoogleCode</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/371/wp-blip-03/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WP-Blip! 0.2</title>
		<link>http://urzenia.net/370/wp-blip-02/</link>
		<comments>http://urzenia.net/370/wp-blip-02/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 05:54:52 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=370</guid>
		<description><![CDATA[Nowa wersja plugina do WordPressa pokazującego statusy z Blip!a. Zmiany: update BlipApi.php do nowej wersji linkowanie tagów i użytkowników dodanie pliku README z podstawową dokumentacją Zainteresowanych zapraszam ściągania i aktualizowania :)]]></description>
			<content:encoded><![CDATA[<p>Nowa wersja plugina do <a href="http://wordpress.org/">WordPress</a>a pokazującego statusy z <a href="http://blip.pl">Blip!</a>a. Zmiany:</p>
<ul>
<li>update BlipApi.php do nowej wersji</li>
<li>linkowanie tagów i użytkowników</li>
<li>dodanie pliku README z podstawową dokumentacją</li>
</ul>
<p>Zainteresowanych zapraszam <a href="http://code.google.com/p/wp-blip/downloads/list">ściągania i aktualizowania</a> :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/370/wp-blip-02/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BlipApi.php 0.02.5</title>
		<link>http://urzenia.net/368/blipapiphp-0025/</link>
		<comments>http://urzenia.net/368/blipapiphp-0025/#comments</comments>
		<pubDate>Sun, 25 May 2008 12:46:20 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[blipapi]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=368</guid>
		<description><![CDATA[Kilka dni temu Tomasz Tybulewicz (http://tybulewicz.com/) podesłał mi wersję BlipApi.php z dodaną obsługą operacji na obrazkach, jakie zaczęło oferować Blip!owe API :) Tomek równocześnie dołączył do &#8220;zespołu&#8221; tworzącego i rozwijającego BlipApi, które obecnie jest tylko w wersji PHP, a docelowo, o ile czas pozwoli, pojawi się w jeszcze kilku językach. Nie będę na razie mówił [...]]]></description>
			<content:encoded><![CDATA[<p>Kilka dni temu Tomasz Tybulewicz (<a href="http://tybulewicz.com/">http://tybulewicz.com/</a>) podesłał mi wersję BlipApi.php z dodaną obsługą operacji na obrazkach, jakie zaczęło oferować <a href="http://blip.pl">Blip!</a>owe API :) Tomek równocześnie dołączył do &#8220;zespołu&#8221; tworzącego i rozwijającego BlipApi, które obecnie jest tylko w wersji PHP, a docelowo, o ile czas pozwoli, pojawi się w jeszcze kilku językach. Nie będę na razie mówił w jakich, bo to dość niepewna przyszłość ;)</p>
<p>Nową wersję można pobrać ze specjalnie utworzonego w tym celu projektu na <a href="googlecode.com">Google Code</a>: <a href="http://blipapi.googlecode.com">blipapi.googlecode.com</a> (jeśli ktoś kojarzy projekt blipapi-php na Google Code, to niech wymaże go ze swoich bookmarków, został usunięty).</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/368/blipapiphp-0025/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Słówko o PHP6</title>
		<link>http://urzenia.net/366/slowko-o-php6/</link>
		<comments>http://urzenia.net/366/slowko-o-php6/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 07:51:34 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php6]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=366</guid>
		<description><![CDATA[Dokopałem się właśnie do pewnego wpisu na PeHaPowym Wiki omawiającego status i różne ciekawostki dotyczące PHP6. Można się dowiedzieć fajnych rzeczy&#8230; Ale po kolei. Czego nie ma, a być powinno Co mi się nie podoba: w &#8220;odrzuconych&#8221; są takie kwiatki jak add named parameters, czyli parametry nazwane w funkcjach. Jestem dość mocno skażony Pythonem, więc [...]]]></description>
			<content:encoded><![CDATA[<p>Dokopałem się właśnie do pewnego wpisu na <a href="http://wiki.php.net/">PeHaPowym Wiki</a> omawiającego <a href="http://wiki.php.net/todo/php60">status i różne ciekawostki dotyczące PHP6</a>. Można się dowiedzieć fajnych rzeczy&#8230; Ale po kolei.</p>
<h2>Czego nie ma, a być powinno</h2>
<p>Co mi się nie podoba: w &#8220;odrzuconych&#8221; są takie kwiatki jak <cite>add named parameters</cite>, czyli parametry nazwane w funkcjach. Jestem dość mocno skażony Pythonem, więc ten wynalazek uważam za świetny pomysł, niestety został odrzucony :(</p>
<p>O ile parametry nazwane to kwestia gustu, i da się to przeżyć, o tyle gorzej że ten sam los spotkał wpis oznaczony jako <cite>all fatal errors to become exceptions</cite> Chodzi tutaj o zamianę chorego systemu błędów (które potrafią ot tak zatrzymać działanie skryptu i nie pozwalające zrobić z tym faktem niczego) na wyjątki. Dziwna sprawa jak dla mnie, jako że ogólnie PHP5 już ma na tyle zaawansowaną obsługę wyjątków i obiektów w ogólności, że nie powinien to być problem. Tym bardziej, że to ma być zupełnie nowa <strong>wersja</strong> interpretera (nie <strong>podwersja</strong>), więc taka zmiana powinna być w pełni akcpetowalna :(</p>
<p><cite>make function names match CS and unify parameter order</cite> &#8211; o ile zmiana akurat na <em>camel case</em> mnie nie bawi, bo wolę wersję z podkreśleniami, o tyle lepsze to niż obecna ruletka. A już druga część podpunktu (czyli unifikacja kolejności parametrów w funkcjach wbudowanych) to jak dla mnie takie &#8220;musiszmieć&#8221;, a oni to tak po prostu odrzucają. Porażka :( Co za problem, skoro i tak jest śmietnik, zostawić stare funkcje jako aliasy na nowe, dorzucając errora typu <em>deprecated</em>, i zrobić wreszcie jakiś porządek? :/</p>
<p><cite>add support for <code>&lt;?php="foo" ?&gt;</code></cite> &#8211; cóż, szkoda. Pozostanie pisać mi dalej w <a href="http://wordpress.org">WordPress</a>ie <code>&lt;?php echo "foo"; ?&gt;</code> :) Ale nadmiernie z tego powodu nie rozpaczam :)</p>
<p>Nieco bardziej ruszył mnie punkt dotyczący <a href="http://urzenia.net/361/cechy-w-php-traits/">wielokrotnego dziedziczenia</a>, ale płakał też nie będę. Cóż, tak samo jak z punktem poprzednim, da się żyć bez tego.</p>
<p>Natomiast zupełnie nie rozumiem dlaczego odrzucono pomysł bloku <code>finally</code> (<cite>a &#8216;finally&#8217; block for exception handling</cite>, bez którego system wyjątków jest, teges, upośledzony :(</p>
<h2>O czym nie chciało im się jeszcze rozmawiać</h2>
<p>Jednym z ciekawszych elementów nad którym nie przeprowadzono jeszcze dyskusji, jest dostarczenie globalnej funkcji <code>__call ()</code>, wywoływanej w momencie gdy zostanie użyta nieistniejąca funkcja. Coś, czym jest <code>__autoload ()</code> dla klas. Fajna sprawa, imho jak najbardziej powinno mieć to miejsce.</p>
<p>Ciekawostką jak dla mnie jest używanie wyrażeń regularnych w bloku <code>switch ()</code>. Jeśli przepchną coś takiego, to pójdą w stronę perla, gdzie w wersji 5.10 dodano tenże blok (nazywając go <code>given ()</code>), który wykorzystuje magiczny, specjalnie dla niego stworzony operator <code>~~</code>. Magiczny dlatego, że sposób jego działania (porównywania) jest zależny od tego jakie operandy są porównywane. Bez <a href="http://perldoc.perl.org/perlsyn.html">specjalnej tabeli</a> (szukaj podpunktu <em>Smart matching in detail</em>) nie podchodź.</p>
<p>Za to dwa inne podpunkty mi się nawet podobają: <cite>&#8220;ext/pimpmydate&#8221;, new date/time features, real OO interface</cite> (obiektowe podejście do operowania na datach) i <cite>being able to use array() when defining constants</cite> (możliwość definiowania stałych jako tablice). Byłoby miło gdyby to zostało wprowadzone :)</p>
<h2>Nad czym pracują i co na pewno będzie wykonane</h2>
<p>Standardowo &#8211; pełne wsparcie dla Unicode. W końcu. Co prawda, podobnie jak <a href="http://pornel.net/php6#sec10">porneL</a> nie rozumiem czemu wybór padł akurat na UTF-16, ale lepsze to niż obecne zabawy z niepełnym modułem <em>mb</em>. Trwają jeszcze prace nad pełną implenetacją tego (np. w <a href="http://php.net/pdo">PDO</a>), ale ważne że będzie ;)</p>
<p><strong>Nie ma już <code>register_globals</code> i <code>safe_mode</code></strong>. Te dwa zabytki, do spółki z <code>magic_quotes</code> są baaaardzo wkurzającymi, i często niebezpiecznymi ustawieniami dotyczącymi PHP. Na szczęście zmiany z tego podpunktu dotyczą także <a href="http://urzenia.net/349/php-53/">PHP 5.3</a>. Hip hip, hurra! :D</p>
<p>Zostanie wyrzucone z głównego drzewa rozszerzenie <code>ereg</code>, za to <code>pcre</code> zostanie jego stałą częścią bez możliwości wyłączenia.</p>
<p>Do PHP wprowadzono <code>goto</code>. Na razie działa <code>break</code>owanie do konkretnej etykiety (<code>label</code>), a niedługo dojdzie też <code>goto</code> jako takie&#8230; O ile <code>break</code> rozumiem, o tyle <code>goto</code> niespecjalnie.</p>
<p>Podoba mi się wprowadzenie rozwijania tablic do <code>foreach</code>. Wykorzystywałoby się w tym celu funkcję <code>list ()</code>, a całość wyglądałaby tak:</p>
<pre><code>
$a = array (
  array (1, 2),
  array (3,4)
);
foreach ($a as $k =&gt; list ($b, $c)) {
  echo $b .':'. $c;
}</code></pre>
<p>Przestrzenie nazw.</p>
<p>Wbudowane zabezpieczenie przeciwko <a href="http://en.wikipedia.org/wiki/Http_response_splitting">HTTP Response Splitting</a> (funkcją <code>header ()</code> będzie można wysłać tylko jeden nagłówek naraz, czyli wstrzyknięcie &#8220;Header1: Value\nHeader2:Value&#8221; nie będzie już możliwe).</p>
<h2>I co z tego?</h2>
<p>Jako podsumowanie napiszę tylko, że wprowadzane zmiany są tak jakby&#8230; chaotyczne. Z jednej strony próba wyprowadzenia różnych zaszłości, które strasznie denerwują ludzi nieco bardziej obeznanych z programowaniem. Z drugiej zostawianie rzeczy i śmietnika które denerwują nie mniej. Teoretycznie, wersja piąta jest na tyle dobrą wersją tego języka, że dałoby się z nią przeżyć jeden rok więcej. Dzięki temu można by wprowadzić znacznie więcej zmian które oczyściłyby ten jeden wielki śmietnik, jakim jest PHP.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/366/slowko-o-php6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Settery, gettery i inna magia &#8211; Python</title>
		<link>http://urzenia.net/364/settery-gettery-i-inna-magia-python/</link>
		<comments>http://urzenia.net/364/settery-gettery-i-inna-magia-python/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 23:29:22 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[kod]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=364</guid>
		<description><![CDATA[Jakiś czas temu napisałem artykuł o setterach i getterach w PHP5. Może warto poruszyć podobny temat dotyczący Pythona? :) Przede wszystkim, model obiektowy Pythona jest zupełnie inny niż PHP. Nie będę go tu omawiał, ponieważ to temat na dość obszerną książkę :) Generalnie obiektówka Pythona jest pełniejsza, ma większe możliwości przeciążania zarówno metod, jak i [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu <a href="http://urzenia.net/339/settery-gettery-i-inna-magia/">napisałem artykuł o setterach i getterach</a> w PHP5. Może warto poruszyć podobny temat dotyczący Pythona? :)</p>
<p>Przede wszystkim, model obiektowy Pythona jest zupełnie inny niż PHP. Nie będę go tu omawiał, ponieważ to temat na dość obszerną książkę :) Generalnie obiektówka Pythona jest pełniejsza, ma większe możliwości przeciążania zarówno metod, jak i operatorów (których w PHP przeciążyć nie można).</p>
<p>Podstawą do pisania własnych setterów i getterów są w Pythonie dwie metody <em>magiczne</em>: <code>__getattr__()</code> i <code>__setattr__()</code>. Istnieje także metoda <code>__delattr__()</code> służąca do implementacji usuwania konkretnego atrybutu. Dobra, koniec smęcenia, może jakiś przykład:</p>
<pre><code>class Test (object):
  x = 1
  def __init__ (self):
    super (Test, self).__setattr__ ('data', dict ())
  def __setattr__ (self, var, value):
    self.data[var] = value
  def __getattr__ (self, var):
    return self.data[var]
</code></pre>
<p>Wtrącę jednak małe omówienie obiektówki Pythonowej: w Pythonie 2.x są dwa modele klas: nowy i stary. Deklaracja klasy nowego typu oznacza jawne dziedziczenie z obiektu <code>object</code>, co zobrazowane jest w linii pierwszej (zalecane jest korzystanie z nowego typu klas).</p>
<p>Inną ciekawostką jest deklarowanie właściwości obiektu (które są współdzielone między instancjami &#8211; zmiana jej wartości w jednej instancji powoduje też jej zmianę w drugiej instancji) i właściwości instancji (które są indywidualne dla każdej instancji): pierwsze deklaruje się w ciele klasy, co pokazane jest w linii drugiej. Drugie &#8220;dodaje się&#8221; w konstruktorze czy też dowolnej innej metodzie (z konwencji robi się to w konstruktorze, który w Pythonie nazywa się <code>__init__ ()</code>). W naszym przykładzie sytuacja się nieco komplikuje, jako że my nadpisujemy wbudowaną metodą <code>__setattr__ ()</code>. Aby dodać sobie właściwość instancji, musimy skorzystać z metody <code>__setattr__ ()</code> superklasy klasy <code>Test</code> (czyli <code>object</code>), co pokazuje nam linia czwarta. W linii tej deklarujemy sobie jakiś <em>słownik</em> (w PHP nazywa się tą strukturę <em>tablicą asocjacyjną</em>), w którym będziemy przechowywać nasze dane. Tutaj występuje pewna różnica w stosunku do PHP, gdzie metoda <code>__set</code> wykonywana jest w momencie gdy właściwość którą próbujemy ustawić nie jest zadeklarowana w obiekcie, lub gdy jest do niej ograniczony dostęp za pomocą akcesora <code>private</code>. W Pythonie metoda <code>__setattr__ ()</code> używana jest przy dostępie do <strong>jakiejkolwiek</strong> właściwości (zadeklarowanej wcześniej lub też nie). Jeśli sam sobie w definicji <code>__setattr__ ()</code> nie zapewnisz dostępu do jakiejś właściwości, to nie będziesz jej miał. Trzeba pamiętać przy tym, że sama metoda <code>__setattr__ ()</code> nie korzysta z samej siebie, czyli wewnątrz niej mamy dostęp do zadeklarowanych wcześniej właściwości.</p>
<p>Wróćmy do przykładu. Nasz setter dodaje do słownika <code>data</code> (lub zmienia wartość) klucz <code>var</code>, przypisując mu wartośc <code>value</code>. Getter po prostu zwraca szukaną właściwość, lub też, jeśli nie została jeszcze zdefiniowana, rzuci wyjątkiem (przydałoby się przechwycenie go i rzucenie właściwego wyjątku, ale to już inna kwestia).</p>
<p>A co jeśli trzeba dorobić sprawdzanie poprawności niektórych własności? No cóż, trzeba to zrobić podobnie jak w PHP, czyli zadeklarować dla nich konkretne metody sprawdzające.</p>
<pre><code>class Test2 (object):
  def __init__ (self):
    super (Test2, self).__setattr__ ('data', dict ())
  def __setattr__ (self, var, value):
    if hasattr (self, '_check__' + var):
      self.data[var] = getattr (self, '_check__' + var) (value):
    self.data[var] = value
  def __getattr__ (self, var):
    return self.data[var]
  def _check__X (self, value):
    if isinstance (value, int) or (isinstance (value, str) and value.isdigit ()):
      return int (value)
    raise ValueError (u'Podana wartość nie jest liczbą!')</code></pre>
<p>Ten kod pozwoli na przypisanie dowolnej wartości wszystkim własnościwościom poza <code>X</code>, której jedyną możliwą wartością do przypisania jest <code>integer</code>, lub napis zawierający same cyfry. W przypadku podania innej wartości zostanie rzucony wyjątek <code>ValueError</code>.</p>
<p>Powyżej została opisana jedna z możliwości stosowania własnych setterów i getterów. W Pythonie 2.2 została dodana jeszcze jedna możliwość, ta bardziej lubiana przeze mnie: funkcja (którą od wersji Pythona 2.4 można użyć jako <em>dekorator</em>) <code>property ()</code>. Funkcja ta bierze od jednego do czterech parametrów. Pierwszym z nich jest metoda pełniąca funkcję gettera, druga &#8211; settera, trzecia &#8211; funkcji usuwającej właściwość, a czwarta &#8211; napis dokumentujący. Jeden ze sposobów użycia:</p>
<pre><code>class Test3 (object):
  def __init__ (self):
    self.data = dict ()
  def _set__X (self, value):
    if isinstance (value, int) or (isinstance (value, str) and value.isdigit ()):
      self.data['X'] = int (value)
      return
    raise ValueError (u'Niewłaściwa wartość')
  def _get__X (self):
    return self.data['X']
  X = property (_get__X, _set__X)</code></pre>
<p>Powyższy przykład robi dokładnie to samo co wcześniejszy <code>Test2</code>, z wyjątkiem umieszczania <em>wszystkich</em> własności w słowniku <code>data</code>. Różnice widoczne sa tylko w implementacji, dla użytkownika klasy różnice nie występują.</p>
<p>Funkcja <code>property</code> pozwala także na stworzenie atrybutu tylko do odczytu:</p>
<pre><code>class Test4 (object):
  def __init__ (self, x):
    self.__x = x
  @property
  def x (self):
    return self.__x
t = Test4 (5)
print t.x
t.x = 6</code></pre>
<p>Wykonanie kodu z ostatniego przykładu spowoduje rzucenie wyjątku <code>AttributeError</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/364/settery-gettery-i-inna-magia-python/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Po przeprowadzce</title>
		<link>http://urzenia.net/357/po-przeprowadzce/</link>
		<comments>http://urzenia.net/357/po-przeprowadzce/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 04:39:41 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[home]]></category>
		<category><![CDATA[mygeeblog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[skrypt]]></category>
		<category><![CDATA[useless-scripts]]></category>
		<category><![CDATA[wwwshell]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=357</guid>
		<description><![CDATA[Przeniosłem na razie bloga (i w sumie nie tylko) z Dreamhosta, z którego radośnie rezygnuję, na home.pl. Przenosiny odbyły się z problemami, konkretnie dwoma: nie mogłem się zalogować do panelu administracyjnego WordPressa spi&#8230; się kodowanie Problemy naprawione, a dla potomności: Problem pierwszy: problem z zalogowaniem się. Problemu by nie było, gdybym zostawił dokładnie taki sam [...]]]></description>
			<content:encoded><![CDATA[<p>Przeniosłem na razie bloga (i w sumie nie tylko) z Dreamhosta, z którego radośnie rezygnuję, na <a href="http://home.pl">home.pl</a>. Przenosiny odbyły się z problemami, konkretnie dwoma:</p>
<ol>
<li>nie mogłem się zalogować do panelu administracyjnego WordPressa</li>
<li>spi&#8230; się kodowanie</li>
</ol>
<p>Problemy naprawione, a dla potomności:</p>
<p>Problem pierwszy: problem z zalogowaniem się. Problemu by nie było, gdybym zostawił dokładnie taki sam prefix tabel jaki był na dreamhoście. Niestety, wpadłem na pomysł zmiany prefiksu, i tu się wszystko rozjechało. Trzeba było poza aktualizacją pliku <code>wp-config.php</code> (która była oczywista) zaktualizować także zawartośc tabel <code>PREFIX_options</code> i <code>PREFIX_users</code>, zmieniając nazwom opcji prefiksy ze starego (u mnie np <code>wp_opcja</code>) na nowy (w moim przypadku byłoby to coś na kształt <code>urzeniawp_opcja</code>). Bez tego wyświetla się w kółko komunikat że nie mam uprawnień do zobaczenia żadnej strony w panelu&#8230;</p>
<p>Problem drugi: kodowanie. Nie udało mi się tutaj zrobić żadnej sztuczki, żadnego prostego zabiegu, nic. W końcu po prostu na dumpie z bazy danych wykonałem szereg operacji podstawiania &#8216;krzaczków&#8217; na odpowiadające im litery. Zmienionego dumpa wrzuciłem z powrotem do bazy, do tego dodałem opcję (mój plik konfiguracyjny ma kilka lat) <code>DB_CHARSET</code> do pliku konfiguracyjnego, i zaczęło działać poprawnie. Porażka troszkę, ale cóż robić :(</p>
<p>Na tą chwilę wszystko powinno już działać OK, i to zdecydowanie szybciej &#8211; Dreamhost do demonów szybkości raczej nie należy ;) Liczę też że dużo bardziej niezawodnie ;)</p>
<p>Jeszcze tylko dopowiem, że przy całej walce z WordPressem na <a href="http://home.pl">home</a>, gdzie nie ma shella, wydatnie pomogła mi moja kolejna zabawka: <a href="http://useless-scripts.googlecode.com/files/wwwshell-0.1.php">wwwshell.php</a>. Wbrew moim obawom, działa to całkiem nieźle, i gdyby nie brak historii i reakcji na enter po komendzie (tak, wiem, łatwo to naprawić zmieniając typ pola na <code>&lt;input type="text" /&gt;</code>), to prawie nie byłoby różnicy ze zwykłym shellem ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/357/po-przeprowadzce/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Koniec repo.urzenia.net</title>
		<link>http://urzenia.net/356/koniec-repourzenianet/</link>
		<comments>http://urzenia.net/356/koniec-repourzenianet/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 00:03:48 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[repo]]></category>
		<category><![CDATA[skrypt]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=356</guid>
		<description><![CDATA[Jako, że zbliża się koniec ważności mojego konta na DreamHost, a przedłużać go zamiaru nawet namniejszego nie mam, zaczęłem się przygotowywać do migracji. Jeszcze nie wiem gdzie pójdę sobie, ale pójdę na pewno :) Jedną z rzeczy z tym związanych jest usunięcie mojego repo (repo.urzenia.net). Cała jego zawartość znajdzie się niedługo jako konkretne projekty na [...]]]></description>
			<content:encoded><![CDATA[<p>Jako, że zbliża się koniec ważności mojego konta na DreamHost, a przedłużać go zamiaru nawet namniejszego nie mam, zaczęłem się przygotowywać do migracji. Jeszcze nie wiem gdzie pójdę sobie, ale pójdę na pewno :)</p>
<p>Jedną z rzeczy z tym związanych jest usunięcie mojego repo (<a href="http://repo.urzenia.net/">repo.urzenia.net</a>). Cała jego zawartość znajdzie się niedługo jako konkretne projekty na <a href="http://code.google.com">code.google.com</a>. W sumie już wszystko przeniosłem, poza BlipApi.php, które też się tam niedługo znajdzie. Nowe adresy projektów to:</p>
<dl>
<dt><a href="http://m-pack.googlecode.com">mPack</a></dt>
<dd>zestaw bibliotek pomocnych przy tworzeniu serwisów w PHP: <a href="http://m-pack.googlecode.com">m-pack.googlecode.com</a>.</dd>
<dt><a href="http://useless-scripts.googlecode.com">useless-scripts</a></dt>
<dd>kilka skryptów które wykorzystuje w mojej codziennej pracy na komputerze: <a href="http://useless-scripts.googlecode.com">useless-scripts.googlecode.com</a>. Tutaj też dostał się mój ostatni &#8220;produkt&#8221; <a href="http://urzenia.net/355/killer/">killer.pl</a>.</dd>
<dt><a href="http://wp-blip.googlecode.com">WP Blip!</a></dt>
<dd>Plugin do <a href="http://wordpress.org">WordPress</a>a, wyświetlający na nim ostatnie wpisy z serwisu <a href="http://blip.pl">Blip!</a>: <a href="http://wp-blip.googlecode.com">wp-blip.googlecode.com</a>.</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/356/koniec-repourzenianet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP Blip! v.0.1</title>
		<link>http://urzenia.net/353/wp-blip-v01/</link>
		<comments>http://urzenia.net/353/wp-blip-v01/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 01:30:40 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/353/wp-blip-v01/</guid>
		<description><![CDATA[Jestem na fali: w ciągu całej przerwy świątecznej (dla mnie to okres od 22.12.2007 do 2.01.2008 włącznie) wklepałem całe mnóstwo (kilka tysięcy) linii kodu. Trochę firmowych, trochę prywatnych (nie publikowanych), a trochę (jak te związane z Blip!em) publicznych. Właśnie skończyłem upublicznianie pluginu do WordPressa do wyświetlania ostatnich statusów z Blip!a. Jakaś dokumentacja pojawi się niedługo [...]]]></description>
			<content:encoded><![CDATA[<p>Jestem na fali: w ciągu całej przerwy świątecznej (dla mnie to okres od 22.12.2007 do 2.01.2008 włącznie) wklepałem całe mnóstwo (kilka tysięcy) linii kodu. Trochę firmowych, trochę prywatnych (nie publikowanych), a trochę (jak te związane z <a href="http://blip.pl">Blip!</a>em) publicznych. Właśnie skończyłem upublicznianie pluginu do <a href="http://wordpress.org">WordPress</a>a do wyświetlania ostatnich statusów z Blip!a.</p>
<p>Jakaś dokumentacja pojawi się niedługo na stronie projektu (<del datetime="2008-05-25T12:49:03+00:00"><a href="http://repo.urzenia.net/PHP:WP_Blip!">repo.urzenia.net/PHP:WP_Blip!</a></del><ins datetime="2008-05-25T12:49:03+00:00"><a href="http://wp-blip.googlecode.com">wp-blip.googlecode.com</a></ins>), w tej chwili sam plugin można pobrać ze strony na Google Code (<a href="http://code.google.com/p/wp-blip/">code.google.com/p/wp-blip</a>).</p>
<p>Krótka instrukcja obsługi:</p>
<ul>
<li>pobrać plik z Google Code, rozpakować go w katalogu<br />
WORDPRESS_ROOT/wp-content/plugins (zostanie utworzony katalog<br />
wp-blip)</li>
<li>w panelu administracyjnym WordPressa uaktywnić plugin</li>
<li>w Options->WP Blip! ustawić login i hasło do swojego konta w Blip!ie (także kilka innych opcji)</li>
<li>gdzieś w szablonie dodać wywołanie funkcji:
<pre><code>&lt;?php
if (function_exists ('wp_blip')) { wp_blip("\n", 1); }
?&gt;</code></pre>
</li>
<p>Wszelkie uwagi mile widziane :) Można je zostawić w komentarzach do tego wpisu, lub dowolną inną metodą (kilka metod kontaktu ze mną opisanych jest na podstronie <a href="http://urzenia.net/kontakt/">urzenia.net/kontakt</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/353/wp-blip-v01/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>BlipApi.php 0.02.4</title>
		<link>http://urzenia.net/352/blipapiphp-0024/</link>
		<comments>http://urzenia.net/352/blipapiphp-0024/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 00:36:39 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://urzenia.net/352/blipapiphp-0024/</guid>
		<description><![CDATA[Twórcy Blip!a wydali wersję 0.02 API, więc zrobiłem co w mojej mocy aby skończyć moją PeHaPową bilbiotekę do tegoż ;) Zmian dużo, do wersji API 0.01 była ona mocno testowa, i w sumie nie jest poprawnie zrobiona, są w niej błędy etc, których nie zamierzam już poprawiać. Wersja 0.02.4 niesie z sobą pełną obsługę protokołu, [...]]]></description>
			<content:encoded><![CDATA[<p>Twórcy <a href="http://blip.pl">Blip!</a>a wydali <a href="http://www.blip.pl/api-0.02.html">wersję 0.02 API</a>, więc zrobiłem co w mojej mocy aby skończyć moją PeHaPową bilbiotekę do tegoż ;) Zmian dużo, do wersji API 0.01 była ona mocno testowa, i w sumie nie jest poprawnie zrobiona, są w niej błędy etc, których nie zamierzam już poprawiać. Wersja 0.02.4 niesie z sobą pełną obsługę protokołu, wykorzystując wszystko co producenci dali, szczegóły w oficjalnej dokumentacji Blip!a.</p>
<p>Szczegóły numeracji biblioteki: pierwszą część stanowi wersja API (w tym wyapdku 0.02), drugą &#8211; odsłona samej biblioteki (w tym wypadku 4).</p>
<p>BlipApi.php można używać na dwa sposoby:</p>
<ol>
<li>
<p>wywołując metodę <code>BlipApi::execute()</code>, gdzie pierwszym parametrem jest nazwa komendy do wykonania (spis komend w oficjalnej dokumentacji, jedyną różnicą jest <code>dirmsg</code> zamiast <code>directed_messages</code>), a następnie dostępne parametry metody (szczegóły w pliku klasy i w oficjalnej dokumentacji Blip!a), np.:</p>
<pre><code>$bapi = new BlipApi ('login', 'haslo');
$bapi->connect ();
$bapi->execute ('update_read', null, 'mysz');</code></pre>
<p>Pobierze ostatnie 10 statusów użytkownika mysz.</p>
</li>
<li>
<p>wywołując komendę jako konkretną metodą obiektu BlipApi:</p>
<pre><code>$bapi->update_read (null, 'mysz');</code></pre>
<p>Powyższe dwa wywołania są sobie równoważne.</p>
</li>
</ol>
<p>Jeśli ktoś znajdzie jakieś błędy, lub ma uwagi co do samej biblioteki, proszę o komentarze tutaj, lub kontakt mailowy: <a href="http://urzenia.net/email/">urzenia.net/email</a>. Z góry dziękuję za feedback ;)</p>
<p><del datetime="2008-03-18T09:45:21+00:00">Bibliotekę można pobrać/obejrzeć z: <a href="http://repo.urzenia.net/files/blipapi-0.02.phps">repo.urzenia.net/files/blipapi-0.02.phps</a></del>. W tej chwili nie ma skąd pobrać samej biblioteki, jako że usunąłem repo.urzenia.net. Dołączona jest za to do pakietu <a href="http://code.google.com/p/wp-blip/">WP Blip!</a>, skąd można ją &#8220;ręcznie&#8221; wyciągnąć :) Przepraszam za kłopot :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/352/blipapiphp-0024/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CURLowe zagwozdki</title>
		<link>http://urzenia.net/350/curlowe-zagwozdki/</link>
		<comments>http://urzenia.net/350/curlowe-zagwozdki/#comments</comments>
		<pubDate>Sun, 16 Dec 2007 02:19:57 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://urzenia.net/350/curlowe-zagwozdki/</guid>
		<description><![CDATA[Od kilku tygodni bawię się po trochu CURLem, w ramach tworzenia PeHaPowej biblioteki do Blip!a. Poniżej kilka zagwozdek, na które ciężko znaleźć sensowną odpowiedź w google, albo ja nie wiem jak pytać&#8230; Jak poprawnie wykonać zapytanie PUT? (aka: metoda PUT i &#8220;select/poll returned error&#8221;) Nad tym spędziłem najwięcej czasu. Kombinowałem na mnóstwo sposobów. Kluczem do [...]]]></description>
			<content:encoded><![CDATA[<p>Od kilku tygodni bawię się po trochu CURLem, w ramach tworzenia PeHaPowej biblioteki do <a href="http://blip.pl">Blip!</a>a. Poniżej kilka zagwozdek, na które ciężko znaleźć sensowną odpowiedź w google, albo ja nie wiem jak pytać&#8230;</p>
<ol>
<li>
<p>Jak poprawnie wykonać zapytanie PUT? (aka: metoda PUT i &#8220;select/poll returned error&#8221;)</p>
<p>Nad tym spędziłem najwięcej czasu. Kombinowałem na mnóstwo sposobów. Kluczem do sukcesu okazało się podejrzenie wersji konsolowej CURLa z dokładnie takim samym zapytaniem, jakie wysyłałem za pomocą skryptu PHP. W skrócie: należy wymusić na CURLu HTTP 1.0, za pomocą ustawienia opcji:</p>
<pre><code>curl_setopt ($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); # gdzie $ch jest obiektem utworzonym za pomocą curl_init ()</code></pre>
<p>Po tej operacji zapytania śmigają jak należy (dodam tylko, że czasem zamiast &#8220;select/poll returned error&#8221; dostawałem &#8220;connection reset by peer&#8221;).</p>
</li>
<li>
<p>Przy rozwiązywaniu powyższego problemu, pomogła mi mała sztuczka. Mianowicie musiałem podejrzeć jakie nagłówki wysyła CURL. Normalnie PHPowy CURL nie zamierza pokazać co jest wysyłane <del datetime="2007-12-16T16:43:21+00:00">i odbierane</del> (Rozpisałem się &#8211; oczywiście nagłówki odbierane bez problemu można zobaczyć. Dzięki, Arek ;) ), bo i po co&#8230; Ja posłużyłem się tutaj specjalnie na tą okazję utworzonym skryptem PHP z dokładnie wyizolowanym &#8216;testcase&#8217;. Tutaj, po zaimplementowaniu opcji:</p>
<pre><code>curl_setopt ($ch, CURLOPT_VERBOSE, 1);</code></pre>
<p>i odpaleniu skryptu z konsoli, grzecznie została mi pokazana komunikacja <ins datetime="2007-12-16T16:43:21+00:00" title="uściślenie">wychodząca</ins> z serwerem, co było kluczem do rozwiązania problemu (okazało się że był wysyłany dodatkowy nagłówek <code>Expect</code> należący do HTTP 1.1, a po wrzuceniu tego w google znalazłem informacje które mnie nakierowały na właściwy trop).</p>
</li>
<li>
<p>Jak wysłać plik POSTem?</p>
<p>Ech, w sumie rozwiązanie jest banalne, jeśli ktoś dokładniej przeczyta <a href="http://php.net/manual/en/ref.curl.php">manual na stronach PHP dotyczący CURLa</a>. Ale skoro już opisuję zagwozdki&#8230;</p>
<p>PHPowy CURL pozwala wysyłać dane na dwa sposoby (akceptowane i sprecyzowane, oczywiście, w odpowiednim RFC). Jeden to <code>x-www-form-urlencoded</code> (tak są wysyłane <em>dane</em> za pomocą webowych formularzy), drugi to <code>multi-part form-data</code> (tak są wysyłane <em>pliki</em>, także z formularzy). Normalnie dla opcji <code>CURLOPT_POSTFIELDS</code> podaje się <code>string</code> który wygląda dokładnie tak samo jak ten widoczny w URLach skryptów pehapowych (mówiąc po laicku), np. <code>a=1&#038;b=2</code> &#8211; wtedy dane są wysyłane metodą <code>x-www-form-urlencoded</code>. Aby zmusić CURLa do wysłania danych metodą <code>multi-part form-data</code>, jako parametr opcji <code>CURLOPT_POSTFIELDS</code> musimy podać tablicę. Tak, właśnie tablicę, gdzie kluczem powinne być nazwa pola (odpowiadająca temu z prawdziwego formularza), a wartością ścieżka do pliku, ale uwaga: <strong>ścieżka powinna być poprzedzona znakiem &#8220;małpy&#8221;: @</strong>. Czyli powinno wyglądać to tak:</p>
<pre><code>curl_setopt ($ch, CURLOPT_POSTFIELDS, array ('pole' => '@/sciezka/do/pliku.jpg'));</code></pre>
<p>Po tej operacji wysłanie pliku nie powinno być już problemem :)</p>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/350/curlowe-zagwozdki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blip!</title>
		<link>http://urzenia.net/347/blip/</link>
		<comments>http://urzenia.net/347/blip/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 23:36:46 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[blip]]></category>
		<category><![CDATA[bliposfera]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://urzenia.net/347/blip/</guid>
		<description><![CDATA[Jakiś czas temu zacząłem się bawić Blip!em. Wstawiłem sobie nawet na główną stronę myGeeBloga wklejkę z ostatnim statusem ;) Ichnich wklejki sa jak dla mnie kiepskie (flasha nie lubię, a wersja jsowa pozwala na pobranie tylko ostatniego statusu), więc pomyślałem o pluginie do WordPressa. Żeby móc to urzeczywistnić, potrzeba mi jakiejś klasy do obsługi tego [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu <a href="http://mysz.blip.pl">zacząłem się</a> bawić <a href="http://blip.pl">Blip!</a>em. Wstawiłem sobie nawet na główną stronę myGeeBloga wklejkę z ostatnim statusem ;) Ichnich wklejki sa jak dla mnie kiepskie (flasha nie lubię, a wersja jsowa pozwala na pobranie tylko ostatniego statusu), więc pomyślałem o pluginie do <a href="http://wordpress.org">WordPress</a>a. Żeby móc to urzeczywistnić, potrzeba mi jakiejś klasy do obsługi tego &#8211; a z pomocą udostępnionego API zrobiłem sobie taką. Na razie wersja pre-alpha ;)</p>
<dl>
<dt>do podejrzenia:</dt>
<dd><a href="http://repo.urzenia.net/files/blipapi.phps">repo.urzenia.net/files/blipapi.phps</a></dd>
<dt>do pobrania:</dt>
<dd><a href="http://repo.urzenia.net/files/get.php?f=blipapi.php">http://repo.urzenia.net/files/get.php?f=blipapi.php</a></dd>
</dl>
<p>O feedback poproszę za pomoca formularza: <a href="http://urzenia.net/email/">urzenia.net/email</a> lub na liście blip-api: <a href="http://groups.google.com/group/blip-devel/browse_thread/thread/3096e1724d036f55">groups.google.com/group/blip-devel/browse_thread/thread/3096e1724d036f55</a>.</p>
<p><ins datetime="2007-11-21T21:39:16+00:00">UPDATE:</ins> wprowadziłem kilka zmian w klasie blipapi, częściowo kosmetycznych, częściowo optymalizacyjnych. Do pobrania pod wymienionymi wyżej adresami :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/347/blip/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Settery, gettery i inna magia</title>
		<link>http://urzenia.net/339/settery-gettery-i-inna-magia/</link>
		<comments>http://urzenia.net/339/settery-gettery-i-inna-magia/#comments</comments>
		<pubDate>Sun, 24 Jun 2007 11:23:25 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://urzenia.net/339/settery-gettery-i-inna-magia/</guid>
		<description><![CDATA[W PHP5 został wprowadzony nowy, zupełnie odmienny, i znacznie pełniejszy model obiektowy (w porównaniu do PHP4). W modelu tym znalazło się miejsce dla kilku magicznych metod, które chciałbym tutaj omówić. Dwoma z najprzyjemniejszych metod magicznych w PHP5 są __set() i __get(), które pozwalają na przechwytywanie odwołań do nieistniejących (lub niedostępnych z powodu akcesorów) zmiennych obiektu. [...]]]></description>
			<content:encoded><![CDATA[<p>W PHP5 został wprowadzony nowy, zupełnie odmienny, i znacznie pełniejszy model obiektowy (w porównaniu do PHP4). W modelu tym znalazło się miejsce dla kilku magicznych metod, które chciałbym tutaj omówić.</p>
<p>Dwoma z najprzyjemniejszych metod magicznych w PHP5 są <code>__set()</code> i <code>__get()</code>, które pozwalają na przechwytywanie odwołań do nieistniejących (lub niedostępnych z powodu akcesorów) zmiennych obiektu.</p>
<p>Wcześniej, przed wersją piątą PHP, jedynym sposobem na pobranie/ustawienie właściwości w pewien uniwersalny i umożliwiający rozwój sposób było stosowanie znanych m.in. z Javy setterów/getterów, które zwyczajowo mają postać:</p>
<pre><code>class Test1 {
    var $elem1;
    function getElem1();
    function setElem1($value);
}</pre>
<p></code></p>
<p>Używałem tej samej metody, jako że innej nie było. Ale magiczne właściwości <code>__set()</code> i <code>__get()</code> załatwiają dla nas masę pustego klepania kodu. Sposób użycia:</p>
<pre><code>class Test1 {
    private $elem1;
    function __get($var) {
        return $this-&gt;$var;
    }
    function __set($var, $value) {
        $this-&gt;$var = $value;
    }
}</code></pre>
<p>Oczywiście powyżej można zawrzeć także sprawdzanie czy dana właściwość istnieje w obiekcie, ale to już osobna kwestia. Co nam daje powyższy zapis? To, że dla drugiej właściwości, w metodzie "starej", trzeba by utworzyć kolejne metody <code>setXXX()</code> i <code>getXXX()</code>, natomiast przy wykorzystaniu metod magicznych pozostaje nam dodać tylko kolejne pole do definicji klasy:</p>
<pre><code>[...]
    private $elem1;
    private $elem2;
[...]</code></pre>
<p>Ktoś może powiedzieć: ale ręczne tworzenie setterów i getterów daje nam możliwość bardziej zaawansowanej walidacji poprawności wprowadzanych danych etc. Owszem, zawsze do bardziej zaawansowanej walidacji potrzebna będzie osobna metoda (no dobrze, można to ominąć kosztem zaciemnienia kodu, ale to nie jest dobre rozwiązanie...), ale to nie powód żeby zrezygnować z magii:</p>
<pre><code>class Test2 {
	private $integer;
	private $string;

	public function __get($var) {
		return $this-&gt;$var;
	}
	public function __set($var, $value) {
		if (method_exists($this, '_check__'.$var)) {
			if (call_user_func_array(array($this, '_check__'.$var), $value)) {
				$this-&gt;$var = $value;
			} else {
				throw new Exception('zła wartość właściwości '. $var);
			}
		} else {
			$this-&gt;$var = $value;
		}
	}
	private function _check__integer($data) {
		return is_int($data);
	}
	private function _check__string($data) {
		return is_string($data);
	}
}</code></pre>
<p>Powyższy kod pozwala na dodawanie dowolnej ilości właściwości klasy, a po dodaniu funkcji sprawdzającej także walidację tejże właściwości. Trzeba tylko pamiętać o właściwej nazwie funkcji sprawdzającej, ale to samo dotyczy tradycyjnych getterów :).</p>
<p>Inną magiczną funkcją w PHP5 jest <code>__call()</code>, która pełni podobną funkcję jak <code>__set()</code> i <code>__get()</code>, tylko że dotyczy metod obiektu: przechwytuje odwołania do nieistniejących metod obiektu (niestety, nie dotyczy to metod o zastrzeżonym dostępie). Przykład zastosowania:</p>
<pre><code>class Test3 {
	public $data;
	public function __call($method, $args) {
		if (preg_match('/^get([A-Z][a-z]+)$/', $method, $matches)) {
			settype($this-&gt;data, strtolower($matches[1]));
			return $this-&gt;data;
		}
	}
}</code></pre>
<p>Przykład powyżej pozwala na pobranie właściwości o typie takim jaką metodą ją wywołamy. Dla wywołania: <code>$test3->getInteger()</code> otrzymamy wartość o typie <code>integer</code>, dla <code>$test3->getString()</code> - ciąg znaków etc.</p>
<p>Jeśli korzystamy z magicznych <code>__set()</code> i <code>__get()</code> jako funkcji dostępowych do właściwości, trzeba czasem sprawdzać czy dana właściwość jest ustawiona czy też jej nie ma. Nie pomoże tutaj ani <code>property_exists()</code> (oczywiście zakładając tutaj że nasze właściwości obiektu mają ustawiony akcesor <code>private</code> lub <code>protected</code>), ani nawet <code>get_object_vars()</code>. Jedyną możliwością jest dodanie metody <code>__isset()</code>, która będzie zwracała odpowiednio prawdę lub fałsz. Dzięki niej będzie możliwe wykorzystanie wbudowanej instrukcji <code>isset()</code> na właściwości klasy, żeby można było stwierdzić czy dana właściwość istnieje:</p>
<pre><code>class Test4 {
	private $data;
	public function __isset($var) {
		return (property_exists($this, $var));
	}
}</code></pre>
<p>Wystarczy teraz użyć:</p>
<pre><code>isset($test4->data)</code></pre>
<p>żeby można było sprawdzić istnienie właściwości.</p>
<p>Skoro istnieje możliwość sprawdzania istnienia właściwości, powinna być też możliwość jej usunięcia - do tego służy metoda <code>__unset()</code>, której przykład można zobaczyć poniżej:</p>
<pre><code>class Test5 {
	private $_data = array();
	public function __set($var, $value) {
		$this-&gt;_data[$var] = $value;
	}
	public function __get($var) {
		return $this-&gt;_data[$var];
	}
	public function __isset($var) {
		return array_key_exists($var, $this-&gt;_data);
	}
	public function __unset($var) {
		unset($this-&gt;_data[$var]);
	}
}</code></pre>
<p>Dzięki zastosowaniu <code>__unset()</code> stało się możliwe usuwanie poszczególnych właściwości obiektu za pomocą wbudowanej funkcji <code>unset()</code>:</p>
<pre><code>$o = new Test5();
$o-&gt;a = 1;
$o-&gt;b = 2;
$o-&gt;c = 3;

echo 'właściwość "a": '; var_dump (isset($o-&gt;a)); echo '&lt;br /&gt;';
echo 'właściwość "b": '; var_dump (isset($o-&gt;b)); echo '&lt;br /&gt;';
echo 'właściwość "c": '; var_dump (isset($o-&gt;c)); echo '&lt;br /&gt;';

echo '&lt;br /&gt;usuwamy a:&lt;br /&gt;';
unset($o-&gt;a);

echo 'właściwość "a": '; var_dump (isset($o-&gt;a)); echo '&lt;br /&gt;';
echo 'właściwość "b": '; var_dump (isset($o-&gt;b)); echo '&lt;br /&gt;';
echo 'właściwość "c": '; var_dump (isset($o-&gt;c)); echo '&lt;br /&gt;';

echo '&lt;br /&gt;usuwamy c:&lt;br /&gt;';
unset($o-&gt;c);

echo 'właściwość "a": '; var_dump (isset($o-&gt;a)); echo '&lt;br /&gt;';
echo 'właściwość "b": '; var_dump (isset($o-&gt;b)); echo '&lt;br /&gt;';
echo 'właściwość "c": '; var_dump (isset($o-&gt;c)); echo '&lt;br /&gt;';</code></pre>
<p>Ostatnią z opisywanych przeze mnie magicznych funkcji jest użyteczne szczególnie przy debugowaniu metoda <code>__toString()</code>. Pozwala ona na zdefiniowanie ciągu znaków jaki zostanie wyświetlony lub zwrócony podczas rzutowania naszego obiektu na typ <code>string</code>, czyli np. gdy zechcemy wyświetlić nasz obiekt. Przykład:</p>
<pre><code>class Test6 {
	public function __toString() {
		return 'To moja klasa ' . get_class($this);
	}
}</code></pre>
<p>Gdy teraz chcemy sprawdzić instancję jakiej klasy mamy w zmiennej, wystarczy wyprintować ją za pomocą <code>print()</code> lub <code>echo()</code>:</p>
<pre><code>$test6 = new Test6();
echo $test6;</code></pre>
<p>To nie wszystkie magiczne właściwości jakich dostarcza nam PHP5, ale pozostałych nie będę tu omawiał ze względu na rozwlekłość artykułu, a także na nieco bardziej zaawansowaną tematykę. W powyższych przykładach brakuje oczywiście dokładnego sprawdzania błędów i innych udoskonaleń, ale w końcu nie o tym był ten artykuł :)</p>
<p>PS. Kilka przykładów użycia magicznych właściwości znajduje się też w innym moim wpisie: <a href="http://urzenia.net/298/obiekt-jako-tablica-wprowadzenie-do-spl/">Obiekt jako tablica (wprowadzenie do SPL)</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/339/settery-gettery-i-inna-magia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>It&#8217;s not a bug!</title>
		<link>http://urzenia.net/334/its-not-a-bug/</link>
		<comments>http://urzenia.net/334/its-not-a-bug/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 14:34:38 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/334/its-not-a-bug/</guid>
		<description><![CDATA[Niedawno spotkałem się z pewną&#8230; ciekawostką, którą podsunął mi jeden ze współuczestników szkolenia w jakim brałem udział. W języku PHP można komentować kod na kilka sposobów: &#60;?php # to jest komentarz jednolinijkowy ?&#62; &#60;?php // to jest komentarz jednolinijkowy ?&#62; &#60;?php /* to jest komentarz wielolinijkowy */ ?&#62; Moja ciekawostka dotyczy wersji 1 i 2. [...]]]></description>
			<content:encoded><![CDATA[<p>Niedawno spotkałem się z pewną&#8230; ciekawostką, którą podsunął mi jeden ze współuczestników <a href="http://www.mysql.com/training/courses/mysql_5_upgrading_new_features.html">szkolenia</a> w jakim brałem udział. W języku <a href="http://php.net/">PHP</a> można komentować kod na kilka sposobów:</p>
<ol>
<li>
<pre><code>&lt;?php
# to jest komentarz jednolinijkowy
?&gt;</code></pre>
</li>
<li>
<pre><code>&lt;?php
// to jest komentarz jednolinijkowy
?&gt;</code></pre>
</li>
<li>
<pre><code>&lt;?php
/* to jest komentarz
wielolinijkowy */
?&gt;</code></pre>
</li>
</ol>
<p>Moja ciekawostka dotyczy wersji 1 i 2. Teraz pytanie, dość proste: co zostanie wyświetlone w wyniku parsowania pliku PHP o treści:</p>
<pre><code>&lt;?php
echo 'aaa?&gt;';
echo 'bbb';
?&gt;</code></pre>
<p>Dość oczywistym jest wynik:</p>
<pre><samp>aaa?&gt;bbb</samp></pre>
<p>No to teraz pytanie drugie: co będzie wynikiem parsowania poniższego skryptu?</p>
<pre><code>&lt;?php
#echo 'aaa?&gt;';
echo 'bbb';
?&gt;</code></pre>
<p>Dla mnie, i dla conajmniej kilku innych osób które od dość długiego czasu zajmują się PHP, oczywistym jest wynik:</p>
<pre><samp>bbb</samp></pre>
<p>Ale dla developerów PHP logicznym jest inny rezultat:</p>
<pre><samp>'; echo 'bbb'; ?&gt; </samp></pre>
<p>Cytat z manuala:</p>
<blockquote cite="http://www.php.net/manual/en/language.basic-syntax.comments.php"><p>The &#8220;one-line&#8221; comment styles only comment to the end of the line or the current block of PHP code, whichever comes first. This means that HTML code after // &#8230; ?&gt; or # &#8230; ?&gt; WILL be printed: ?&gt; breaks out of PHP mode and returns to HTML mode, and // or # cannot influence that. If the asp_tags configuration directive is enabled, it behaves the same with // %&gt; and # %&gt;.</p>
</blockquote>
<p class="note">Źródło: <a href="http://www.php.net/manual/en/language.basic-syntax.comments.php">manual PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/334/its-not-a-bug/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Akismet na jednej stronie?</title>
		<link>http://urzenia.net/333/akismet-na-jednej-stronie/</link>
		<comments>http://urzenia.net/333/akismet-na-jednej-stronie/#comments</comments>
		<pubDate>Sun, 11 Mar 2007 15:16:16 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://urzenia.net/333/akismet-na-jednej-stronie/</guid>
		<description><![CDATA[Strasznie mnie wkurza nabyta niedawno maniera Akismet-a na stronicowanie listy spamerskich komentarzy dodanych na WordPressie. Nie wiem też czy poprawili to co było na początku po tej zmianie, czyli jeśli w międzyczasie, gdy byłeś na stronie 4 spamów, sprawdzając czy coś się nie nawinęło, a w międzyczasie doszły nowe komentarze, to wyświetlane były na stronie [...]]]></description>
			<content:encoded><![CDATA[<p>Strasznie mnie wkurza nabyta niedawno maniera <a href="http://akismet.com/">Akismet</a>-a na stronicowanie listy spamerskich komentarzy dodanych na <a href="http://wordpress.org/">WordPress</a>ie. Nie wiem też czy poprawili to co było na początku po tej zmianie, czyli jeśli w międzyczasie, gdy byłeś na stronie 4 spamów, sprawdzając czy coś się nie nawinęło, a w międzyczasie doszły nowe komentarze, to wyświetlane były na stronie 1, która była już przez Ciebie sprawdzana&#8230; I tak oto można było wywalić w kosmos kilka, kilkanaście pozytywnych komentarzy.</p>
<p>Poprawienie tego &#8220;błędu&#8221; (mówię ogólnie o stronicowaniu spamów) jest dość proste &#8211; w obecnej, 2.1.2, wersji WordPressa, w pliku <code>/wp-content/plugins/akismet/akismet.php</code> wywalamy linie 365 do 372 włącznie, wstawiając zamiast nich:</p>
<pre><code>$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC");</code></pre>
<p>Wywalamy także linie: 379 do 410 włącznie, i 449 do 479 włącznie. Od tej chwili Akismet nie będzie już stronicował wyników :)</p>
<p>Można też ściągnąć gotowego patcha (<a href="/wp-content/akismet.wordpress.212.patch">akismet.wordpress.212.patch</a>) do WordPress-a, do głównego katalogu WordPressa w Twojej instalacji i go zaaplikować:</p>
<pre><code>patch -p0 < akismet.wordpress.212.patch</code></pre>
<p>co powinno być nieco prostsze ;) o ile masz dostęp do jakiegoś shella :) Jako bonus, patch spowoduje także numerowanie wszystkich spamów na liście :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/333/akismet-na-jednej-stronie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skracanie tekstu</title>
		<link>http://urzenia.net/316/skracanie-tekstu/</link>
		<comments>http://urzenia.net/316/skracanie-tekstu/#comments</comments>
		<pubDate>Sun, 14 Jan 2007 14:59:00 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[repo]]></category>

		<guid isPermaLink="false">http://urzenia.net/316/skracanie-tekstu/</guid>
		<description><![CDATA[Jakiś czas temu, na forum 4programmers.net przewinął się temat skracania tekstu. Temat o tyle skomplikowany, że chodziło o skrócenie głównej treści artykułu, zostawiając w nim wszystkie znaczniki. Problemy tutaj są dwa (podstawowe): dbanie o nieucinanie znaczników, żeby każdy rozpoczęty był we właściwej kolejności zakończony skracanie tekstu tak, żeby długość widocznego tekstu nie była skracana o [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu, na <a href="http://forum.4programmers.net">forum 4programmers.net</a> przewinął się temat <a href="http://forum.4programmers.net/viewtopic.php?id=100528">skracania tekstu</a>. Temat o tyle skomplikowany, że chodziło o skrócenie głównej treści artykułu, zostawiając w nim wszystkie znaczniki. Problemy tutaj są dwa (podstawowe):</p>
<ol>
<li>dbanie o nieucinanie znaczników, żeby każdy rozpoczęty był we właściwej kolejności zakończony</li>
<li>skracanie tekstu tak, żeby długość <strong>widocznego</strong> tekstu nie była skracana o tekst znaczników</li>
</ol>
<p>W przytoczonym wątku problemem są tagi <a href="http://pl.wikipedia.org/wiki/BBCode">BBCode</a>, które mogą mieć różne formy:</p>
<pre><code>[tag]treść[/tag]
[tag=coś]treść[/tag]
[tag]</code></pre>
<p>Trzeba pamiętać (na co mi zwrócono uwagę w przytoczonym wątku), że w takim np. tagu <code>[url]</code> <em>może</em> być zawarty adres URL, który <strong>nie może</strong> zostać ucięty. Skrócony może zostać tylko i wyłącznie tekst zawarty między znacznikiem rozpoczynającym a kończącym.</p>
<p>Sposób, na jaki wpadłem, opierał się na rozbiciu tekstu na poszczególne części za pomoca <a href="http://php.net/preg_split"><code>preg_split</code></a>, i późniejszej obróbki powstałej w ten sposób tablicy. Po ominięciu pewnych trudności z kombinacjami takimi jak:</p>
<pre><code>[url][img=aa]coś coś[/img][/url]</code></pre>
<p>skonstruowałem funkcję, której można użyć do tego celu.</p>
<p>Jeśli komuś mogłaby się ona przydać (a myślę że więcej osób może mieć tego typu problem), to <a href="http://code.google.com/p/m-pack/source/browse/trunk/ns_strings.php">zapraszam do skorzystania z gotowca</a> :).</p>
<p>W przypadku, gdy ktoś nie korzysta z BBCode&#8217;u, można użyć do tego celu parsera XML (zakładam korzystanie z XHTML raczej, niż HTML). Dodałem podobną funkcjonalność do mojej klasy mParser, która docelowo służy do filtrowania w tekście pobranym od użytkownika niebezpiecznych danych (<a href="http://m-pack.googlecode.com">klasa dostępna w pakiecie mPack</a>).</p>
<p><ins datetime="2010-01-25T12:53:23+00:00">UPDATE:</ins></p>
<p>Zaktualizowałem linki.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/316/skracanie-tekstu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php: foreach vs while, odsłona druga</title>
		<link>http://urzenia.net/300/php-foreach-vs-while-odslona-druga/</link>
		<comments>http://urzenia.net/300/php-foreach-vs-while-odslona-druga/#comments</comments>
		<pubDate>Thu, 20 Jul 2006 01:50:58 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://urzenia.net/300/php-foreach-vs-while-odslona-druga/</guid>
		<description><![CDATA[Kilka dni temu, Mariusz Jakubowski aka kg zauważył jeden, dość poważny brak w moich testach dotyczących szybkości foreach() i while(), mianowicie brak w odpowiednim miejscu reset()-owania tablicy. Dość diametralnie zmieniło to wyniki&#8230; Dla porównania: stara wersja testu (bez resetowania) oraz nowa wersja testu (aby zobaczyć jak jest testowana całość, proponuje dodać do powyższych linków literkę [...]]]></description>
			<content:encoded><![CDATA[<p>Kilka dni temu, <a href="http://kg.alternatywa.info/">Mariusz Jakubowski aka kg</a> <a href="http://urzenia.net/132/php-foreach-vs-while#comment-1555">zauważył</a> jeden, dość poważny brak w moich testach dotyczących szybkości <a href="http://php.net/foreach">foreach()</a> i <a href="http://php.net/while">while()</a>, mianowicie brak w odpowiednim miejscu <a href="http://php.net/reset">reset()</a>-owania tablicy. Dość diametralnie zmieniło to wyniki&#8230;</p>
<p>Dla porównania: <a href="http://urzenia.net/tests/foreach:while1.php">stara wersja testu</a> (bez resetowania) oraz <a href="http://urzenia.net/tests/foreach:while2.php">nowa wersja testu</a> (aby zobaczyć jak jest testowana całość, proponuje dodać do powyższych linków literkę &#8216;s&#8217;). Kod używanej przeze mnie tablicy jest pod adresem: <a href="http://urzenia.net/tests/foreach:while_array.phps">urzenia.net/tests/foreach:while_array.phps</a>.</p>
<p>Nie mam na razie jak sprawdzić dla PHP w wersji 4, ale dla wersji jaka jest na serwerze (czyli 5.1.2) wersje <code>foreach()</code> jest zawsze odrobinę szybsza, a także przyjemniejsza w odczycie :)</p>
<p>Podsumowując: <a href="http://urzenia.net/132/php-foreach-vs-while">wyniki testu z 5.06.2005 r</a> uznaję za niebyłe, radośnie wracając wszelką chwałę używanemu przeze mnie namiętnie <code>foreach()</code> ;)</p>
<p>PS. kg: dzięki!</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/300/php-foreach-vs-while-odslona-druga/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
