<?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>radmen&#039;s techblog</title>
	<atom:link href="http://techblog.radmen.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://techblog.radmen.info</link>
	<description>Kolejna witryna oparta na WordPressie</description>
	<lastBuildDate>Mon, 02 Jan 2012 22:09:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Tworzenie plików o dużym rozmiarze</title>
		<link>http://techblog.radmen.info/2011/12/12/tworzenie-plikow-o-duzym-rozmiarze/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tworzenie-plikow-o-duzym-rozmiarze</link>
		<comments>http://techblog.radmen.info/2011/12/12/tworzenie-plikow-o-duzym-rozmiarze/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 19:07:36 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tips & tricks]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=97</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Gdzieś w sieci spotkałem pytanie o treści: jak stworzyć plik o określonej wielkości (gdzie zawartość nie ma znaczenia) w PHP?. &#8230; <a href="http://techblog.radmen.info/2011/12/12/tworzenie-plikow-o-duzym-rozmiarze/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Gdzieś w sieci spotkałem pytanie o treści: <em>jak stworzyć plik o określonej wielkości (gdzie zawartość nie ma znaczenia) w PHP?</em>. Pytanie proste, aczkolwiek znalazłem aż trzy możliwe sposoby na jego rozwiązanie.</p>
<p><strong>1. dd</strong></p>
<p>Systemy Uniksowe mają takie zgrabne narzędzie o nazwie <a href="http://en.wikipedia.org/wiki/Dd_(Unix)">dd</a>. Wielokrotnie przydawało mi się, pomyślałem, że tym razem również z niego skorzystam.</p>
<p>Skrypt, generujący 500 <a href="http://en.wikipedia.org/wiki/Mebibit">MiB</a> mieści się w jednej linijce i wygląda tak:</p>
<pre class="brush: php; title: ; notranslate">
`dd if=/dev/urandom of=/tmp/sample.txt bs=1024 count=512000`;
</pre>
<p>Niestety to rozwiązanie jest <strong>najwolniejsze</strong>. Czas wykonania skryptu na mojej maszynie wirtualnej wyniósł:  <em>67s</em></p>
<p><em></em>Nie jest to rozwiązanie w pełni PHPowe. Uznałem jednak, że można je tutaj dopisać, jako że w części wypadków ma się dostęp do powłoki systemowej i można korzystać z takich narzędzi.</p>
<p><strong>2. Wypełnienie pliku</strong></p>
<p>Zdaje się, że jest to najbardziej oczywisty sposób. Generujemy ciąg znaków odpowiedniej długości i zapisujemy to do pliku.</p>
<p>Najprostsza forma tego rozwiązania wygląda tak:</p>
<pre class="brush: php; title: ; notranslate">
$size = 1024 * 1024 * 500;
file_put_contents('/tmp/sample.txt', str_repeat(' ', $size));
</pre>
<p>Czas wykonania: <em>10s</em><br />
Całkiem nieźle, aczkolwiek jest jeden problem. Przedstawione rozwiązanie potrzebuje tyle wolnej pamięci ile chcemy danych ulokować w pliku (w tym przypadku było to 500MiB). Raczej kiepsko, aby skrypt potrzebował do wykonania tyle pamięci.</p>
<p>Rozwiązanie tego problemu jest proste &#8211; nie przechowywać w pamięci takiej ilości danych tylko od razu wrzucać je do pliku:</p>
<pre class="brush: php; title: ; notranslate">
$size = 1024 * 1024;
$file = new SplFileObject('/tmp/sample.txt', 'w');

while($size--) {
  $file-&gt;fwrite(str_repeat(' ', 500));
}
</pre>
<p>Czas wykonania: <em>7s</em><br />
Zużyta pamięć: <em>9 MiB</em></p>
<p><strong>3. fseek</strong></p>
<p>Jakiś czas temu pisałem o <a href="http://techblog.radmen.info/2011/11/04/powrot-do-korzeni-operacje-na-plikach-odczytzapis/">podstawowych operacjach na plikach</a>. Wspominałem tam o funkcji <a href="http://php.net/fseek">fseek</a>, oraz jej specyficznym zachowaniu.</p>
<p>W tym przypadku fseek&#8217;a, można użyć do tego aby przesunąć wskaźnik pliku na określoną pozycję, zapisać do niej jeden znak, a resztę załatwi FS (puste miejsca zostaną wypełnione &#8222;śmieciami&#8221;).</p>
<p>Przykładowy skrypt:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$size = 1024 * 1024 * 500; // 500 MiB
$file = new SplFileObject('/tmp/sample.txt', 'w');
$file-&gt;fseek($size - 1);
$file-&gt;fwrite(' ');
</pre>
<p>Czas wykonania: <em>0.025s</em></p>
<p>Widać różnicę prawda? ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/12/12/tworzenie-plikow-o-duzym-rozmiarze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamiczna deklaracja &#8222;metod&#8221; w PHP</title>
		<link>http://techblog.radmen.info/2011/12/08/dynamiczna-deklaracja-metod-w-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dynamiczna-deklaracja-metod-w-php</link>
		<comments>http://techblog.radmen.info/2011/12/08/dynamiczna-deklaracja-metod-w-php/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 20:06:11 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[eksperymenty]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=89</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Swego czasu zdarzyło mi się napisać prostą grę w Pythonie. Pamiętam, że podczas pisania kolejnych klas przyszła sytuacja, w której &#8230; <a href="http://techblog.radmen.info/2011/12/08/dynamiczna-deklaracja-metod-w-php/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Swego czasu zdarzyło mi się napisać prostą grę w Pythonie. Pamiętam, że podczas pisania kolejnych klas przyszła sytuacja, w której chciałem aby działanie pewnej metody było inne. Nie chciałem jej parametryzować, chciałem po prostu aby w tym jednym konkretnym miejscu zachowywała się inaczej.</p>
<p>Tutaj przyszło piękno Pythona (i nie tylko jego) &#8211; jest możliwość podmiany metod. Wystarczy tylko podmienić referencję do funkcji na którą wskazuje atrybut (czy też metoda).</p>
<p>Ostatnio naszła mnie taka myśl &#8211; czy w PHP mogę podmienić metodę na zupełnie inną? Czy jest możliwość &#8222;dopisywania&#8221; metod do obiektu? Od razu odpowiem &#8211; takie coś jest możliwe, chociaż jest to twór, który raczej emuluje działanie podobne do tego z Pythona.</p>
<p>Zanim wspomnę o tym jak rozwiązać problem chciałbym jeszcze naprowadzić na mój tok rozumowania. Punktem początkowym były <a href="http://mootools.net/docs/core/Class/Class">pseudo-klasy</a>, jakich używam w bibliotece <a href="http://mootools.net">MooTools</a>. Po stworzeniu obiektu &#8222;metody&#8221; są tak naprawdę atrybutami z referencją na funkcję. Przy takiej budowie bez problemu mogę wykonać kod:</p>
<pre class="brush: jscript; title: ; notranslate">
var example = new Class({
    test: function() {}
});

var obj = new example();
console.log(typeof obj.test); // function
</pre>
<p>Niestety w PHP to tak nie działa. Deklarowana metoda nie jest referencją funkcji. Z tego powodu próba wykonania podobnego kodu zakończy się porażką.</p>
<p>A gdyby tak przypisać do jednego z atrybutów klasy funkcję anonimową? Wtedy kod mógłby wyglądać tak:</p>
<pre class="brush: php; title: ; notranslate">
$example = new stdClass();
$example-&gt;test = function() { };

$example-&gt;test(); // wrong..
</pre>
<p>Niestety, błąd. Dlaczego? Takie odwołanie sugeruje interpreterowi aby &#8222;szukał&#8221; metody, a jak wiadomo nie jest ona zapisana jako atrybut, także nie istnieje, także jest błąd ;)</p>
<p>Z pomocą przychodzi funkcja <a href="http://php.net/__call#language.oop5.overloading.methods">__call</a>. Jeśli nastąpi próba uruchomienia metody, która nie jest zdefiniowana ta funkcja przejmie pałeczkę i odpali funkcję (przy użyciu <a href="http://php.net/call_user_func">call_user_func</a>) przypisaną do wybranego atrybutu. Proste? ;) Okazuje się, że nawet tutaj trzeba zastosować mały &#8222;hack&#8221;, ale przejdźmy do konkretów.</p>
<p>Przykład klasy, która może uruchamiać pseudo-metody (kod został nieco uproszczony, chętnych odsyłam na <a href="https://github.com/radmen/ProtoClass">Githuba</a>):</p>
<pre class="brush: php; title: ; notranslate">
class PyClass {

    public function __call($method, $args) {
        $func = $this-&gt;$method;

        array_unshift($args, $this);
        call_user_func_array($func, $args);
    }
}
</pre>
<p>Oraz przykład wykorzystania:</p>
<pre class="brush: php; title: ; notranslate">
class Person extends PyClass {

    public $name;

    public function __construct($name) {
        $this-&gt;name = $name;
    }
}

$frank = new Person('Frank');
$frank-&gt;sayHello = function(Person $self) {
    echo &quot;Howdy! I'm {$self-&gt;name}!\n&quot;;
};

$frank-&gt;sayHello();
</pre>
<p>Teraz niestety napiszę trochę o wadach takiego rozwiązania.</p>
<p>Największym problemem jest to, że deklarowanie tych pseudo-metod automatycznie odcina dostęp do metod i atrybutów klasy, które mają zasięg private/protected. Co więcej, anonimowe funkcje są tak naprawdę obiektem, także odpada korzystanie z <code>$this</code> jako odwołania do klasy, w której zdefiniowano &#8222;metodę&#8221;. Z tego powodu <em>__call</em> przekazuje w pierwszym argumencie wywołania funkcji referencję <code>$self</code>. Czy widać tutaj podobieństwa z Pythona? ;)</p>
<p>Jest jeszcze jedna, dość poważna wada &#8211; takie rozwiązanie straszliwie zaciemnia kod, oraz może utrudniać jego późniejszą analizę.</p>
<p>Podsumowując &#8211; w PHP jest możliwość tworzenia dla obiektu pseudo-metod, które wywołaniem nie będą różnić się niczym od oryginału. Niestety nie ma mowy o tym aby takie metody mogły działać dokładnie tak samo jak te &#8222;pełnoprawne&#8221;. Dodatkowo takie rozwiązanie zaciemnia kod.</p>
<p>W takim razie, czy jest sens korzystania z tego? Wydaje mi się, że jest, ale tylko w jednym celu - <a href="http://fabien.potencier.org/article/12/do-you-need-a-dependency-injection-container">Dependency Injection Container</a>. Sami zdecydujcie, czy warto korzystać z takiego potworka ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/12/08/dynamiczna-deklaracja-metod-w-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WhatTheCode &#8211; dekodowanie URLa</title>
		<link>http://techblog.radmen.info/2011/11/23/whatthecode-dekodowanie-urla/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=whatthecode-dekodowanie-urla</link>
		<comments>http://techblog.radmen.info/2011/11/23/whatthecode-dekodowanie-urla/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 21:13:34 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[What The Code]]></category>
		<category><![CDATA[kwiatki]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=85</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
W pracy zdarza się odkryć różne &#8222;kwiatki&#8221;. Z niektórymi warto się podzielić. Na pierwszy ogień pójdzie metoda na to jak &#8230; <a href="http://techblog.radmen.info/2011/11/23/whatthecode-dekodowanie-urla/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>W pracy zdarza się odkryć różne &#8222;kwiatki&#8221;. Z niektórymi warto się podzielić. Na pierwszy ogień pójdzie metoda na to jak zdekodować jeden z parametrów $_GET, tak aby przypominał swój oryginał:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$str = implode(' ', explode('+', $_GET['str']));
?&gt;
</pre>
<p>Pamiętajcie &#8211; używanie <a href="http://pl.php.net/urldecode">(raw)urldecode</a> jest zbyt mainstream ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/11/23/whatthecode-dekodowanie-urla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microtime nie jest unikalnym ID</title>
		<link>http://techblog.radmen.info/2011/11/21/microtime-nie-jest-unikalnym-id/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=microtime-nie-jest-unikalnym-id</link>
		<comments>http://techblog.radmen.info/2011/11/21/microtime-nie-jest-unikalnym-id/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 13:24:36 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=77</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Czasami zachodzi potrzeba wygenerowania losowego id (np dla rekordów tymczasowych). Jest nawet dedykowana do tego celu funkcja &#8211; uniqid(). Jednakże &#8230; <a href="http://techblog.radmen.info/2011/11/21/microtime-nie-jest-unikalnym-id/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Czasami zachodzi potrzeba wygenerowania losowego id (np dla rekordów tymczasowych). Jest nawet dedykowana do tego celu funkcja &#8211; <a href="http://php.net/uniqid">uniqid()</a>. Jednakże często nie jest ona wykorzystywana (a powinna). Powodem jest jej słaba wydajność, przez co wielu woli zrezygnować z użycia tej funkcji na rzecz innych rozwiązań.</p>
<p>Chyba najprostszym z nich jest wykorzystanie funkcji <a href="http://php.net/microtime">microtime()</a>, która zwraca czas uniksowy z dokładnością do mikrosekund. Wydaje się, że każdorazowe odpalenie tej funkcji zwróci różne wartości prawda? Poniżej przedstawiam prosty kod wraz z wynikiem jaki otrzymuję:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
echo microtime().&quot;\n&quot;;
echo microtime().&quot;\n&quot;;
?&gt;
// radmen@devel:~$ php microtime.php
// 0.52810300 1321880773
// 0.52831200 1321880773
</pre>
<p>Jak widać zwrócone wartości są różne.</p>
<p>Czy jest tak zawsze? Niestety nie. Pamiętam, że od dawien dawna wynik zwracany przez <code>microtime</code> w tej formie mało komu odpowiadał. Najczęściej zwrócony string rozbijano po spacji po czym obie wartości były sumowane (patrz &#8222;Example 1&#8243; w <a href="http://pl2.php.net/microtime#example-655">manualu</a>). Później dodano argument do wywołania <code>$get_as_float</code>, który robi dokładnie to samo o czym wcześniej wspomniałem.</p>
<p>Niestety tutaj wyniki są już nieco inne:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
echo microtime(true).&quot;\n&quot;;
echo microtime(true).&quot;\n&quot;;
?&gt;
// radmen@devel:~$ php microtime.php
// 1321881083.88
// 1321881083.88
</pre>
<p>Skąd taka różnica? Najpewniej jest to błąd wynikający z operacji dokonywanych na liczbach zmiennoprzecinkowych. Tutaj cała sprawa nie jest za dużym problemem &#8211; wykonałem funkcje jedna za drugą, także czas ich odpalenia można uznać za &#8222;jednakowy&#8221;.</p>
<p>Z tego powodu postanowiłem sprawdzić, jak się ta funkcja zachowa w symulowanym &#8222;środowisku&#8221;. Założenie jest proste &#8211; użyję <code>microtime</code> jako generatora unikalnego id, w prostej pętli.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
for($i = 0; $i &lt; 10; $i++) {
  echo microtime(true).&quot;\n&quot;;

  // czekamy 1ms na kolejna iteracje
  usleep(1000);
}
?&gt;
// radmen@devel:~$ php microtime.php
// 1321881405.97
// 1321881405.97
// 1321881405.98
// 1321881405.98
// 1321881405.98
// 1321881405.98
// 1321881405.98
// 1321881405.98
// 1321881405.99
// 1321881405.99
</pre>
<p>Widać wyraźnie, że moje &#8222;id&#8221; wcale nie są takie unikalne.</p>
<p>Czy to stanowi problem? Podam przykład z &#8222;życia&#8221; &#8211; podpinaliśmy flashowy uploader plików. Każdy wrzucany plik miał id wygenerowane przez <code>microtime</code>, a jego informacje były zapisywane w sesji. Później działy się pewne cuda (głównie po stronie klienta &#8211; JS), a na samym końcu robiliśmy zapis tych plików. Okazało się, że jeśli użytkownik zaznaczał podczas uploadu wiele plików część z nich otrzymała to samo id..</p>
<p>Wniosek &#8211; nie używać <code>microtime</code> jako funkcji generującej unikalne id wewnątrz jakiejkolwiek pętli (bądź kolejki). W tej sytuacji lepiej korzystać z <code>uniqid</code>, lub z innego rozwiązania (nawet zwykły licznik wystarczyłby do tego celu).</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/11/21/microtime-nie-jest-unikalnym-id/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Zapisywanie CSS przez Firebug</title>
		<link>http://techblog.radmen.info/2011/11/12/zapisywanie-css-przez-firebug/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zapisywanie-css-przez-firebug</link>
		<comments>http://techblog.radmen.info/2011/11/12/zapisywanie-css-przez-firebug/#comments</comments>
		<pubDate>Sat, 12 Nov 2011 12:18:13 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[Tips & tricks]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[firefile]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=67</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Firebug jest jednym z tych narzędzi, bez którego nie wyobrażam sobie pracy. Każdy, kto korzysta z niego wie co potrafi, &#8230; <a href="http://techblog.radmen.info/2011/11/12/zapisywanie-css-przez-firebug/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p><a href="http://getfirebug.com/">Firebug </a>jest jednym z tych narzędzi, bez którego nie wyobrażam sobie pracy. Każdy, kto korzysta z niego wie co potrafi, także nie będę tutaj o tym pisać. Jednak czy wiecie o tym, że Firebug posiada pokaźną gamę <a href="http://getfirebug.com/wiki/index.php/Firebug_Extensions">rozszerzeń</a>? Wśród nich znajduje się pewna perełka &#8211; <a href="https://addons.mozilla.org/en-US/firefox/addon/firefile/">FireFile</a>.</p>
<p>FireFile jest rozszerzeniem, które pozwala na zapisywanie edytowanych w konsoli Firebug&#8217;a CSSów. Dzięki niemu nie trzeba przeskakiwać pomiędzy edytorem, a przeglądarką i kopiować zmienionych CSSów. To rozwiązanie znacznie zmniejsza czas jaki trzeba poświęcić na edycję CSSów (zwłaszcza poprawek jakiś pierdółek).</p>
<p>Niestety, jak to bywa, są pewne ograniczenia. FireFile widzi tylko te reguły CSS, które są przeznaczone dla Firefoksa. Oznacza to, że gdy jakiś element posiada reguły specyficzne dla przeglądarek (z prefiksem <code>-webkit</code>, <code>-o</code>, <code>-ms</code>) zostaną one zignorowane, a po zapisie do pliku <strong>wyrzucone z arkusza stylów</strong>. Takie zachowanie wydaje mi się raczej oczywiste &#8211; Firefox nie interpretuje CSSów przeznaczonych dla innych przeglądarek, także nie są one nawet dostępne w Firebugu. Nie jest to jedyna wada tego rozszerzenia &#8211; zdarza się, że pomijane są niektóre reguły dotyczące stricte Firefoksa (np. <code>@-moz-keyframes</code>).</p>
<p>Jeśli dość mocno wykorzystujemy CSS3 polecam przeniesienie wszelkich <em><a href="http://php.refulz.com/vendor-specific-css-properties/">vendor-specific properties</a></em> do osobnego arkusza CSS. Jeśli nic w nich nie będzie zmieniane FireFile nie zmodyfikuje ich zawartości.</p>
<p>Czy warto korzystać z tego rozszerzenia? Myślę, że odpowiedź na to pozostawię Wam.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/11/12/zapisywanie-css-przez-firebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VirtualBox/Apache &#8211; brak odświeżania plików graficznych</title>
		<link>http://techblog.radmen.info/2011/11/09/virtualboxapache-brak-odswiezania-plikow-graficznych/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=virtualboxapache-brak-odswiezania-plikow-graficznych</link>
		<comments>http://techblog.radmen.info/2011/11/09/virtualboxapache-brak-odswiezania-plikow-graficznych/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 22:37:49 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[Tips & tricks]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=59</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Do pracy wykorzystuję maszynę wirtualną. Hostem jest Windows 7, a na maszynie wirtualnej (emulowanej przez VirtualBox) zainstalowałem Debiana. Serwer jest &#8230; <a href="http://techblog.radmen.info/2011/11/09/virtualboxapache-brak-odswiezania-plikow-graficznych/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Do pracy wykorzystuję maszynę wirtualną. Hostem jest Windows 7, a na maszynie wirtualnej (emulowanej przez VirtualBox) zainstalowałem Debiana. Serwer jest typową konfiguracją LAMP, z tym tylko wyjątkiem, że pliki projektów znajdują się na hoście w katalogu współdzielonym.</p>
<p>Póki robiłem na tym serwerze małe rzeczy nie zauważyłem jednego mankamentu tej konfiguracji &#8211; po modyfikacji plików graficznych zmian nie było widać na edytowanych stronach. Myślałem, że była to kwestia jakiegoś cache. Nie myliłem się, chociaż sprawa jest nieco bardziej złożona.</p>
<p>Dla hosta katalog współdzielony jest zwykłym katalogiem. W maszynie wirtualnej aby go zamontować (konkretnie pod Linuksem) trzeba mieć zainstalowany sterownik do specyficznego filesystemu (dla VirtualBox jest to <em>vboxfs</em>). Sterownik ten po prostu pobiera dane z katalogu tak jakby to był zwykły zasób LAN, czyli robi to &#8222;po sieci&#8221;. W tej konfiguracji Apache w jakiś przedziwny sposób keszuje takie pliki (chociaż normalnie nie stosuje żadnego cache&#8217;a).</p>
<p>Nie udało mi się znaleźć dokładnych wyjaśnień problemu, ale jak wspomniałem udało mi się znaleźć rozwiązanie.  Wystarczy do pliku z konfiguracją Apache&#8217;a (w moim przypadku <em>/etc/apache2/httpd.conf</em>) dopisać:</p>
<pre>#Disable image serving for network mounted drive
EnableSendfile off</pre>
<p>Po restarcie serwera problem powinien się rozwiązać.</p>
<p>Zainteresowanych odsyłam do wątku <a href="http://forums.opensuse.org/english/get-technical-help-here/applications/445462-how-clear-apache-cache-2.html">How clear Apache cache</a> - jeden z ostatnich postów przedstawia rozwiązanie problemu.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/11/09/virtualboxapache-brak-odswiezania-plikow-graficznych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak w JavaScript działa AND i OR?</title>
		<link>http://techblog.radmen.info/2011/11/06/jak-w-javascript-dziala-and-i-or/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jak-w-javascript-dziala-and-i-or</link>
		<comments>http://techblog.radmen.info/2011/11/06/jak-w-javascript-dziala-and-i-or/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 00:00:27 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[linkdump]]></category>
		<category><![CDATA[szorty]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=49</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Czy wiesz jaki będzie wynik wyrażenia (true &#38;&#38; 2) w JavaScript? Jeśli uważasz, że będzie to TRUE jesteś w błędzie &#8230; <a href="http://techblog.radmen.info/2011/11/06/jak-w-javascript-dziala-and-i-or/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Czy wiesz jaki będzie wynik wyrażenia <code>(true &amp;&amp; 2)</code> w JavaScript? Jeśli uważasz, że będzie to <code>TRUE</code> jesteś w błędzie ;)<br />
Chciałem to zjawisko wyjaśnić dokładniej, jednak ostatnio znalazłem ciekawy artykuł poruszający tą kwestię. Jeśli angielski nie jest Ci obcy polecam wpis <a href="http://websymphony.net/blog/2011/11/02/how-logical-and-and-or-operators-actually-work-in-javascript/">How Logical AND and OR Operators Actually Work in Javascript</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/11/06/jak-w-javascript-dziala-and-i-or/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Powrót do korzeni: operacje na plikach &#8211; odczyt/zapis</title>
		<link>http://techblog.radmen.info/2011/11/04/powrot-do-korzeni-operacje-na-plikach-odczytzapis/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=powrot-do-korzeni-operacje-na-plikach-odczytzapis</link>
		<comments>http://techblog.radmen.info/2011/11/04/powrot-do-korzeni-operacje-na-plikach-odczytzapis/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 22:04:49 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[Newbie]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pliki]]></category>
		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=26</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Operacje na plikach są chyba jedną z pierwszych rzeczy, które poznaje się podczas nauki jakiegokolwiek języka. Miałem dokładnie tak samo &#8230; <a href="http://techblog.radmen.info/2011/11/04/powrot-do-korzeni-operacje-na-plikach-odczytzapis/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Operacje na plikach są chyba jedną z pierwszych rzeczy, które poznaje się podczas nauki jakiegokolwiek języka. Miałem dokładnie tak samo podczas nauki PHP. Większość kursów dotyczących obsługi plików zaczyna się od stwierdzenia (wracam pamięcią do czasów <strong>PHP 4</strong>), że <em>wszystkie funkcje obsługi plików (oprócz tej otwierającej plik) jako parametr pobierają tzw. „wskaźnik do pliku” (ang. “file pointer”)</em>.</p>
<p>Sprawa banalna co nie? Otwiera się wskaźnik do pliku, wykonuje jakieś operacje, po czym ten wskaźnik zostaje zamknięty. Wraz z rozwojem PHP sprawy stały się jeszcze prostsze. PHP 5 wprowadził <a href="http://pl.php.net/file_get_contents">file_get_contents</a> i <a href="http://pl2.php.net/file_put_contents">file_put_contents</a>. Właściwie od tego czasu przestałem używać wskaźników do plików, aż w końcu zapomniałem o podstawach.</p>
<p><span id="more-26"></span></p>
<p>Owe podstawy dość szybko musiałem sobie przypomnieć, ponieważ potrzebowałem z nich skorzystać podczas pisania naprawdę prostego skryptu. W skrócie &#8211; skrypt otwierał plik,odczytywał zawartość, po czym nadpisywał zawartość pliku i go zamykał.</p>
<p>Normalnie zrobiłbym to w ten sposób:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$i = file_get_contents('sample.txt);
file_put_contents('sample.txt', $i+1);
?&gt;
</pre>
<p>Proste prawda? Zapomniałem dodać, że chciałem na edytowany plik zakładać blokadę, która uniemożliwiała jednoczesne otwieranie przez wiele wątków. Chciałem się do tego celu posłużyć funkcją <a href="http://pl2.php.net/flock">flock</a>. Problem jest taki, że ta funkcja działa w oparciu o <em>wskaźnik pliku</em>. Sprawa wydawała się prosta także od razu zabrałem się za przepisywanie. Będąc bardziej kozacki postanowiłem skorzystać z dobrodziejstw SPLa i wykorzystałem klasę <a href="http://pl2.php.net/SplFileObject">SplFileObject</a>, która jest prostym wrapperem na wszelkie funkcje związane z operacjami na plikach.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$file = new SplFileObject('sample.txt', 'r+');

// skrypt bedzie czekac tak dlugo az uda mu sie uzyskac lock na plik
while(false === $file-&gt;flock(LOCK_EX)) {
  usleep(70);
}

$i = $file-&gt;fgets();
$file-&gt;fwrite($i+1);

$file-&gt;flock(LOCK_UN);
$file = null;
?&gt;
</pre>
<p><span class="Apple-style-span" style="line-height: 19px;">Proste prawda? Niestety wkradł się błąd. Zapomniałem o tym, że metoda (lub funkcja) write zapisuje do pliku dane </span><strong style="line-height: 19px;">zaczynając od miejsca, w którym znajduje się wskaźnik pliku</strong><span class="Apple-style-span" style="line-height: 19px;">. Gdy otwieramy plik jego wskaźnik ustawia się na początku pliku. Podczas odczytywania kolejnych znaków przesuwa się o jedną pozycję dalej. Podczas wywołania <code>fgets</code> wskaźnik przesunął się na koniec pliku. Już na tym etapie wyszło pierwsze przyzwyczajenie z korzystania z <code>file_put_contents</code> (wywołując tą funkcję nie trzeba się przejmować położeniem wskaźnika).</span></p>
<p>Skoro wskaźnik się przesunął to wystarczy go cofnąć na początek pliku i wtedy zapisać prawda? Poprawka jest prosta.</p>
<pre class="brush: php; title: ; notranslate">
$file-&gt;rewind();
$file-&gt;fwrite($i+1);
</pre>
<p>Ku mej tragedii to rozwiązanie nadal nie działało. Tym razem nowe dane zapisały się na początku pliku zachowując stare dane na końcu. Szukam i szukam, aż w końcu znalazłem wybawcę: <a href="http://pl2.php.net/ftruncate">ftruncate</a>. Szybka poprawka i otrzymuję takie coś:</p>
<pre class="brush: php; title: ; notranslate">
$file-&gt;ftruncate(0);
$file-&gt;fwrite($i+1);
</pre>
<p>Można pomyśleć, że to wystarczy prawda? W końcu czyszczę plik, a dopiero później wrzucam nową zawartość. Niestety ten kod nadal nie działa poprawnie.</p>
<p>Zawartość pliku owszem jest wyczyszczona, natomiast przed nowymi danymi zaczęły pojawiać się krzaki. Dlaczego? Jak wspomniałem wcześniej podczas wywołania <code>fputs</code> został przesunięty wskaźnik. Wywołanie funkcji <code>ftruncate</code> wyczyściło plik, ale nie przesunęło wskaźnika. Zapis następował od miejsca, na które wskazywał wskaźnik także wcześniejsze pozycje zostały zapełnione losowymi danymi. Ostatecznie, po wszelkich poprawkach, ten jakże prosty skrypt wygląda tak:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$file = new SplFileObject('sample.txt', 'r+');

// skrypt bedzie czekac tak dlugo az uda mu sie uzyskac lock na plik
while(false === $file-&gt;flock(LOCK_EX)) {
  usleep(70);
}

$i = $file-&gt;fgets();
$file-&gt;ftruncate(0);
$file-&gt;rewind();
$file-&gt;fwrite($i++);

$file-&gt;flock(LOCK_UN);
$file = null;
?&gt;
</pre>
<p>Wykonanie tego skryptu (a właściwie rozwiązanie zagadki ze śmieciami wstawianymi podczas zapisu) zajęło mi jakąś godzinę. Niech to będzie dla mnie nauczką aby nie zapominać o pewnych podstawach programowania w PHP.</p>
<p>Niestety mój przypadek nie jest odosobniony. Podczas rozmów rekrutacyjnych zdarzały nam się osoby, które nie potrafiły pisać SQLi. Co prawda pisały aplikacje wykorzystujące bazę danych, ale za żadne skarby nie potrafiły napisać prostego zapytania. Powód był prosty &#8211; używany framework wyręczył programistę od tego. Co prawda jest to wielka wygoda, jednakże w sytuacji gdy trzeba zejść do rozwiązań niskopoziomowych (pozostając w obrębie PHP, nie mam na myśli przejścia do korzystania z np. C) taki programista jest bezradny.</p>
<p>Warto o tym czasami pomyśleć. Nasza wygoda kosztuje czasami więcej niżby się wydawało.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/11/04/powrot-do-korzeni-operacje-na-plikach-odczytzapis/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHPCon 2011</title>
		<link>http://techblog.radmen.info/2011/10/26/phpcon-2011-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=phpcon-2011-2</link>
		<comments>http://techblog.radmen.info/2011/10/26/phpcon-2011-2/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 20:25:35 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpcon]]></category>
		<category><![CDATA[relacja]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=16</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Czy znacie jakieś konferencje dotyczące PHP, które odbywają się w kraju? No właśnie, ja też nie znam. A właściwie nie &#8230; <a href="http://techblog.radmen.info/2011/10/26/phpcon-2011-2/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Czy znacie jakieś konferencje dotyczące PHP, które odbywają się w kraju? No właśnie, ja też nie znam. A właściwie nie znałem niczego innego poza PHPCon&#8217;em. Rok temu nie miałem przyjemności dostać się na tą konferencję. Na szczęście w tym roku udało się nadrobić zaległości.</p>
<p>To co zachęciło mnie na wybranie się na drugi koniec Polski to przede wszystkim agenda. Wydawała się być naprawdę porządna, a tematy poruszały nader ciekawe kwestie. Rzeczywistość niestety okazała się nieco inna. Wiele z prelekcji (niestety głównie polskich) była merytorycznie nijaka. Odniosłem wrażenie, że prelegenci jakoś nie specjalnie przygotowali się do tego co mieli przedstawiać.<br />
Na szczęście sytuację ratowali zagraniczni prelegenci. Widać naprawdę sporą różnicę (oraz zdecydowanie większe obycie) w sposobie prowadzenia wykładów.</p>
<p>Wyjątkowo dokuczliwa była audiencja. Ludzie w trakcie wykładów potrafili dość głośno rozmawiać między sobą, przez co ciężko było się skupić nad tematem prelekcji. Wiele osób również z uporem maniaka chodziło w tę i z powrotem po sali, co chwila trzaskając drzwiami.</p>
<p>Na szczęście tego typu konferencje to nie tylko wykłady. Jest też coś takiego jak kuluary i dopiero w nich miałem okazję przeprowadzić kilka naprawdę interesujących rozmów. Najciekawszą z rozmów okazała się ta, którą miałem przyjemność prowadzić z <a href="https://twitter.com/#!/davidcoallier">@</a><a href="https://twitter.com/#!/davidcoallier">Davidem Coallier</a>, oraz Grześkiem z <a href="http://megiforge.pl">MegiForge</a>. Dowiedziałem się kilku dość ciekawych rzeczy, a nawet miałem okazję poznać kilka tajemnic związanych z rozwojem PHP ;)</p>
<p>Pozostając w temacie interakcji międzyludzkich. Niestety odniosłem wrażenie, że nie ma czegoś takiego jak &#8222;polska społeczność PHP&#8221;. Owszem są programiści, ale ciężko stwierdzić aby była to społeczność żyjąca swoim życiem. Brakowało mi atmosfery panującej chociażby podczas <a href="http://blog.radmen.info/2010/10/24/malo-konkretna-relacja-z-fronttrends-2010/">FrontTrends</a>. Brakuje &#8222;wiary&#8221;. Czegoś co by sprawiło, że programiści nakręcają siebie nawzajem do rozwijania języka i tworzenia nowych zajebistych rzeczy.<br />
Bardziej jestem skłonny stwierdzenia, że na tej konferencji byli zwykli klepacze kodu. Ludzie, którzy nie potrafili pojąć najprostszych prawd (&#8222;po co używać dwóch monitorów?&#8221;, &#8222;jaki może być zysk z korzystania ze skrótów klawiszowych?&#8221;)..</p>
<p>Równie negatywne mam odczucia w stosunku do projektu <a href="http://liga.php.pl">liga.php.pl</a>, którego zarys został przedstawiony. Z tego co zrozumiałem ma to być projekt (działający w formule cyklicznego konkursu), który ma na celu wyłonienie tzw &#8222;ligi&#8221; programistów PHP w kraju. Idea może i ciekawa, aczkolwiek później okazało się, że cała inicjatywa tak naprawdę ma być jedynie czymś w rodzaju narzędzia do <em>head hunting&#8217;u</em>.</p>
<p>Na konferencję jechałem z małym kompleksem dotyczącym własnych umiejętności. Muszę przyznać, że szybko się z niego wyleczyłem. Czy warto było jechać? Myślę, że tak. Co prawda wykłady były raczej słabe, ale rozmowy w kuluarach wniosły pewną świeżość. Choćby dlatego warto jechać.<br />
Mam nadzieję, że kolejna edycja odbędzie się w bardziej dostępnej lokalizacji. Jeśli nie to niech przynajmniej hotel będzie wyremontowany, a drzwi nie będą wypadać po byle pchnięciu ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/10/26/phpcon-2011-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Witaj, świecie!</title>
		<link>http://techblog.radmen.info/2011/10/24/witaj-swiecie/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=witaj-swiecie</link>
		<comments>http://techblog.radmen.info/2011/10/24/witaj-swiecie/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 18:33:05 +0000</pubDate>
		<dc:creator>radmen</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>
		<category><![CDATA[blog]]></category>

		<guid isPermaLink="false">http://techblog.radmen.info/?p=1</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Tym oto słowem wstępu po raz kolejny podejmuję się pisania bloga technicznego. Z czasem zobaczymy czy moje postanowienie zostanie prawidłowo &#8230; <a href="http://techblog.radmen.info/2011/10/24/witaj-swiecie/" class="more-link">Learn more</a>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<pre class="brush: php; title: ; notranslate">
&lt;?php
abstract class Blog {

  private $mAuthor;

  private $mBlogCategories;

  public function __construct($pAuthor, array $pBlogCategories) {
    $this-&gt;mAuthor = $pAuthor;
    $this-&gt;mBlogCategories = $pBlogCategories;
  }

  abstract public function helloWorld();

}

// let's see how it will end..
$blog = new Blog('Radosław Mejer', array(
  'PHP',
  'JavaScript',
  'IT',
  'Programming',
));

$blog-&gt;helloWorld();
?&gt;
</pre>
<p>Tym oto słowem wstępu po raz kolejny podejmuję się pisania bloga technicznego. Z czasem zobaczymy czy moje postanowienie zostanie prawidłowo realizowane.</p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.radmen.info/2011/10/24/witaj-swiecie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

