<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>myGeeBlog</title>
	
	<link>http://urzenia.net</link>
	<description>czyli kolejny blog programisty</description>
	<pubDate>Sun, 28 Dec 2008 16:15:06 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/mysz" type="application/rss+xml" /><item>
		<title>Useless-scripts: wwwshell.php 0.2</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/373365239/</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 wszystkie [...]]]></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>
		<feedburner:origLink>http://urzenia.net/381/useless-scripts-wwwshellphp-02/</feedburner:origLink></item>
		<item>
		<title>WP-Blip! 0.3.2</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/372261119/</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>
		<feedburner:origLink>http://urzenia.net/378/wp-blip-032/</feedburner:origLink></item>
		<item>
		<title>SBLAM! Blacklist Update v.0.4</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/358951360/</link>
		<comments>http://urzenia.net/372/sblam-blacklist-update-v04/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 01:03:44 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[python]]></category>

		<category><![CDATA[sblam]]></category>

		<category><![CDATA[sblam blacklist update]]></category>

		<category><![CDATA[skrypt]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=372</guid>
		<description><![CDATA[Mały update do SBLAM! Blacklist Update: jako że czasem (jak obecnie) pojawiają się błędy w generowanej black liście, do naszego .htaccess dodawane są tylko poprawne linie zawierające adres IP, oraz komentarze. Wszystko inne jest ignorowane, i nie spowoduje problemu w działaniu naszego serwisu :)
Skrypt jak ciągle dostępny do pobrania z adresu: urzenia.net/wp-content/sblam_blacklist_update.txt.
Podziękowania dla Elusia za [...]]]></description>
			<content:encoded><![CDATA[<p>Mały update do SBLAM! Blacklist Update: jako że czasem (jak obecnie) pojawiają się błędy w generowanej black liście, do naszego .htaccess dodawane są tylko poprawne linie zawierające adres IP, oraz komentarze. Wszystko inne jest ignorowane, i nie spowoduje problemu w działaniu naszego serwisu :)</p>
<p>Skrypt jak ciągle dostępny do pobrania z adresu: <a href="http://urzenia.net/wp-content/sblam_blacklist_update.txt">urzenia.net/wp-content/sblam_blacklist_update.txt</a>.</p>
<p>Podziękowania dla <a href="http://geekspace.pl">Elus</a>ia za <a href="http://geekspace.pl/2008/8/7/sblam-blacklist">zwrócenie uwagi</a> :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/372/sblam-blacklist-update-v04/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/372/sblam-blacklist-update-v04/</feedburner:origLink></item>
		<item>
		<title>WP-Blip! 0.3</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/331972239/</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 - 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 [...]]]></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 - 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 - 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>
		<feedburner:origLink>http://urzenia.net/371/wp-blip-03/</feedburner:origLink></item>
		<item>
		<title>WP-Blip! 0.2</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/328608934/</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>
		<feedburner:origLink>http://urzenia.net/370/wp-blip-02/</feedburner:origLink></item>
		<item>
		<title>BlipApi.php 0.02.5</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/297736653/</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>
		<feedburner:origLink>http://urzenia.net/368/blipapiphp-0025/</feedburner:origLink></item>
		<item>
		<title>Słówko o PHP6</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/268226239/</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 ten wynalazek [...]]]></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> - 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> - 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 - 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>
		<feedburner:origLink>http://urzenia.net/366/slowko-o-php6/</feedburner:origLink></item>
		<item>
		<title>Skryptowanie Vima w Pythonie - cz.2</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/264799300/</link>
		<comments>http://urzenia.net/365/skryptowanie-vima-w-pythonie-cz2/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 00:12:16 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[programowanie]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[vim]]></category>

		<category><![CDATA[vimtips]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=365</guid>
		<description><![CDATA[Od jakiegoś czasu wymyślam sobie różne udoskonalenia dla Vima, i piszę je zazwyczaj w Pythonie :) Niedawno opisywałem jak wyświetlić listę funkcji z edytowanego pliku, później zrobiłem sobie wygodne komentowanie kodu (wersje które znalazłem na sieci nie satysfakcjonowały mnie), teraz przyszedł czas na sprytne (w sensie: wygodne) uruchamianie właśnie edytowanego skryptu/programu :)
Do niedawna używałem prostego [...]]]></description>
			<content:encoded><![CDATA[<p>Od jakiegoś czasu wymyślam sobie różne udoskonalenia dla Vima, i piszę je zazwyczaj w Pythonie :) Niedawno opisywałem jak <a href="http://urzenia.net/359/skrypty-pythona-w-vimie/">wyświetlić listę funkcji z edytowanego pliku</a>, później zrobiłem sobie wygodne komentowanie kodu (wersje które znalazłem na sieci nie satysfakcjonowały mnie), teraz przyszedł czas na sprytne (w sensie: wygodne) uruchamianie właśnie edytowanego skryptu/programu :)</p>
<p>Do niedawna używałem prostego Pythonowego skryptu, który wywoływem z Vima:</p>
<pre><code>!$ %</code></pre>
<p>Wykrzyknik to polecenie wywołania programu z shella, <code>$</code> to nazwa skryptu, a <code>%</code> jest rozwijany przez Vima do pełnej ścieżki bieżącego pliku. Było to o tyle wygodne, że nieważne w jakim języku pisałny był skrypt/program, <code>$</code> uruchamiał odpowiedni interpreter, ze skonfigurowanymi parametrami i wyświetlał wyjście. Tą funkcjonalność oczywiście potrzebowałem zachować, ale wykonywanie zewnętrznego programu jest strasznie niewygodne ;) Więc zrobiłem sobie wygodniejszą, i nieco bardziej rozbudowaną wersję. Inne założenia to możliwość przekazywania parametrów do wykonywanego programu, oraz dla niektórych języków możliwość wcześniejszej, automatycznej kompilacji.</p>
<p>Założyłem taki format konfiguracji poszczególnych typów plików:</p>
<pre><code>[wywolanie interpretera, przeksztalcenie pliku wykonywalnego]</code></pre>
<p>Gdzie <code>wywolanie interpretera</code> może być tuplą/listą wywołań lub zwykłym napisem z kluczami:</p>
<dl>
<dt>fname</dt>
<dd>nazwa biezacego pliku</dd>
<dt>exe</dt>
<dd>nazwa wersji wykonywalnej (nie jest wymagane)</dd>
<dt>params</dt>
<dd>dodatkowe parametry</dd>
</dl>
<p>Klucze te są zastępowane oczywiście właściwymi danymi z wykorzystaniem skłądni &#8220;procentowej&#8221;. Przykład takiej konfiguracji:</p>
<pre><code>'java':     [('javac -Xlint %(fname)s', 'java %(exe)s %(params)s'), lambda f: os.path.splitext (os.path.basename (f))[0], ],</code></pre>
<p>W takim przypadku zostanie najpierw zostanie uruchomione polecenie <code>javac -Xlint %(fname)s</code>, następnie <code>java %(exe)s %(params)s</code>, gdzie <code>%(fname)s</code> zostanie zastąpione pełną ścieżką do bieżącego pliku, <code>%(exe)s</code> rezultatem działania funkcji <code>lambda f: os.path.splitext (os.path.basename (f))[0]</code> (która zwróci samą nazwę pliku bez ścieżki i rozszerzenia), a <code>%(params)s</code> - dodatkowymi opcjami. Zamiast funkcji generującej wersję <code>exe</code> można podać napis którym ma zostać zastąpione rozszerzenie pliku, lub <code>None</code> jeśli nie ma być w ogóle zmieniane.</p>
<p>Największym problemem było wygodne uruchamianie zbudowanej funkcji - lepiej mi używać już zewnętrznego skryptu niż pisanie na przykład:</p>
<pre><code>python MDP_Execute ('arg1', 'arg2', 'arg3')</code></pre>
<p>W tym celu stworzyłem sobie funkcję Vimową (nie pythonową!) o tej samej nazwie (czyli <code>MDP_Execute ()</code>), a do tego dorzuciłem komendę którą nazwałem <code>Exe</code>. Domyślnie komendy w Vimie nie pozwalają na używanie dodatkowych argumentów. Można jednak zmienić to zachowanie poprzez dodatkowy parametr <code>-nargs</code>, który może przyjąć wartości:</p>
<dl>
<dt>0</dt>
<dd>wartość domyślna, nie pozwalająca na argumenty</dd>
<dt>1</dt>
<dd>musi być dokładnie jeden argument (może to być oczywiście inna cyfra/liczba)</dd>
<dt>*</dt>
<dd>dowolna ilość argumentów</dd>
<dt>?</dt>
<dd>0 lub 1 argument</dd>
<dt>+</dt>
<dd>1 lub więcej argumentów</dd>
</dl>
<p>W moim przypadku odpowiednim parametrem była gwiazdka:</p>
<pre><code>-nargs=*</code></pre>
<p>Problemem jeszcze było odebranie tych parametrów wewnątrz funkcji, a także przekazanie ich do funkcji pythonowej. Rozwiązaniem była najpierw definicja funkcji Vimowej z &#8220;trzykropkiem&#8221;:</p>
<pre><code>function! MDP_Execute (...)</code></pre>
<p>dzięki czemu funkcja może przyjąć dowolną ilość argumentów (ale mniejszą lub równą 20 - ograniczenie Vima), a odbiera się je wewnątrz funkcji jako zmienne funkcyjne (tzn. takie które istnieją tylko wewnątrz funkcji) o nazwie takiej samej jak index tej funkcji. Jest to mało jasne wyjaśnienie, więc może przykład:</p>
<pre><code>function! MDP_Execute (...)
    echo a:1 " wydrukuje pierwszy z parametrów wywołania
    echo a:2 " wydrukuje drugi z parametrów, etc
endfunction</code></pre>
<p>Specjalne znaczenie mają dwie zmienne: <code>a:0</code> i <code>a:000</code> - pierwszy zawiera liczbę podanych (nienazwanych) parametrów, drugi zawiera listę tychże (wygodne gdy musimy po tym przeiterować).</p>
<p>Następnie trzeba było przekazać argumenty podane do komendy do funkcji. Robi się to za pomocą argumentu <code>&lt;args&gt;</code>, a konkretnie jego odmiany <code>&lt;q-args&gt;</code>, który automatycznie przekształca parametry komendy na odpowiednio sformatowaną wersję (czyli nie musimy sami wkładać poszczególnych parametrów w cudzysłowia jakby trzeba to było robic z wersją <code>&lt;args&gt;</code>). W tym momencie można już w funkcji Vimowej <code>MDP_Execute ()</code> odebrać wywołanie komendy:</p>
<pre><code>Exe arg1 arg2 "long arg3"</code></pre>
<p>Pozostaje przekazanie tych samych argumentów do funkcji Pythonowej, ale tutaj po części wyręcza nas sam Vim - po prostu z wewnątrz funkcji pobierzemy sobie wartość zmiennej <code>a:000</code> za pomocą wbudowanej w moduł <code>vim</code> funkcji <code>eval ()</code>:</p>
<pre><code>data['params'] = ' '.join (vim.eval ('a:000'))</code></pre>
<p>Całość skrypciku wygląda tak:</p>
<pre><code>
if !has('python')
    echo "Error: Required vim compiled with +python"
    finish
endif

python &lt;&lt; EOF
import os.path
import subprocess
import types

import vim

def MDP_System (cmd):
    p   = subprocess.Popen (cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    ret = list (p.communicate ())
    ret.insert (0, p.returncode)
    return ret

def MDP_GetFileType (default=None):
    ft = vim.eval ('&#038;ft')
    if not ft:
        ft = os.path.splitext (vim.current.buffer.name)
        if len (ft) > 1:
            ft = ft[1][1:].lower ()
        else:
            ft = default

    return ft

MDP_Run_Script_ftypes = {
    'python':   ['python -tt %(fname)s %(params)s', ],
    'perl':     ['perl %(fname)s %(params)s', ],
    'sh':       ['bash %(fname)s %(params)s', ],
    'txt':      ['bash %(fname)s %(params)s', ],
    'php':      ['php -f %(fname)s %(params)s', ],
    'cs':       [('mcs %(fname)s', 'mono %(exe)s %(params)s'), '.exe', ],
    'd':        [('rebuild -oqobj %(fname)s', '%(exe)s %(params)s'), '', ],
    'java':     [('javac -Xlint %(fname)s', 'java %(exe)s %(params)s'), lambda f: os.path.splitext (os.path.basename (f))[0], ],
}

def MDP_Execute ():
    cmd_data = MDP_Run_Script_ftypes.get (MDP_GetFileType (), '')
    if not cmd_data:
        print 'Unknown filetype to execute'
        return

    if not isinstance (cmd_data[0], (list, tuple)):
        cmd_data[0] = ( cmd_data[0], )

    data = dict (
        fname   = vim.current.buffer.name,
        params  = ' '.join (vim.eval ('a:000')),
        exe     = vim.current.buffer.name,
    )

    # jesli trzeba, to wyszukujemy wersje exe
    if len (cmd_data) &gt;= 2:
        if isinstance (cmd_data[1], str):
            tmp = os.path.splitext (data['fname'])[0]
            if cmd_data[1]:
                tmp += '.' + cmd_data[1]
            data['exe'] = tmp
        elif isinstance (cmd_data[1], types.FunctionType):
            data['exe'] = cmd_data[1] (data['fname'])

    for c in cmd_data[0]:
        res = MDP_System (c % data)
        print res[1]
        if res[0]:
            print 'Błąd:'
            print res[2]

EOF
function! MDP_Execute (...)
    python MDP_Execute ()
endfunction
command! -nargs=* Exe call MDP_Execute (&lt;q-args&gt;)
map &lt;C-e&gt; &lt;Esc&gt;:call MDP_Execute ()&lt;cr&gt;
</code></pre>
<p>Ostatnia linijka odpowiada za wykonanie skryptu (bez żadnych parametrów) po wciśnięciu kombinacji klawiszy <code>Ctrl+e</code>. Jeśli wymagane są jakiekolwiek parametry, trzeba ręcznie wywołać komendę <code>Exe</code> podając po niej wymagane do poprawnego działania naszego programu argumenty :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/365/skryptowanie-vima-w-pythonie-cz2/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/365/skryptowanie-vima-w-pythonie-cz2/</feedburner:origLink></item>
		<item>
		<title>Settery, gettery i inna magia - Python</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/255200759/</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 operatorów [...]]]></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 - 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 - settera, trzecia - funkcji usuwającej właściwość, a czwarta - 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>
		<feedburner:origLink>http://urzenia.net/364/settery-gettery-i-inna-magia-python/</feedburner:origLink></item>
		<item>
		<title>Python 3000 - print, format</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/245138643/</link>
		<comments>http://urzenia.net/363/python-3000-print-format/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 22:59:12 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[programowanie]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[python3k]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=363</guid>
		<description><![CDATA[Już od jakiegoś czasu deweloperzy Pythona przygotowują nową, niekompatybilną z poprzednimi, wersję Pythona. Python, gdyby ktoś nie wiedział, to jeden z najfajniejszych języków jakie wymyślono ;) (oczywiście to mocno subiektywne uczucie, ale może kogoś zachęci ;) ). Napiszę tutaj o dwóch ważnych zmianach, co do których nie byłem zupełnie przekonany (a konkretnie: w ogóle nie [...]]]></description>
			<content:encoded><![CDATA[<p>Już od jakiegoś czasu deweloperzy <a href="http://python.org">Python</a>a przygotowują nową, niekompatybilną z poprzednimi, wersję Pythona. Python, gdyby ktoś nie wiedział, to jeden z najfajniejszych języków jakie wymyślono ;) (oczywiście to mocno subiektywne uczucie, ale może kogoś zachęci ;) ). Napiszę tutaj o dwóch ważnych zmianach, co do których nie byłem zupełnie przekonany (a konkretnie: w ogóle nie byłem przekonany), a które spodobały mi się po dzisiejszej krótkiej zabawie z wersją alpha3 Pythona 3000 :)</p>
<p>Jedną z tych zmian jest wycofanie konstrukcji językowej, jaką był <code>print</code>. Został on zastąpiony funkcją o dość nietypowej, zaskakującej nazwie, jaką jest <code>print()</code> ;) Czym się różnią?</p>
<p>Konstrukcja <code>print</code> była zupełnie niekonfigurowalna. Zawsze łączył podane elementy znakiem spacji, prawie zawsze na końcu sam dodawał znak nowej linii&#8230; Jedyną sensowną metodą naprawy tego było ręczne pisanie do <code>sys.stdout</code>, co do ładnych rozwiązań nie należało. Funkcja <code>print()</code> rozwiązuje ten problem za pomocą parametrów nazwanych, do których należą m.in. <code>sep</code> i <code>end</code>. Pierwszy odpowiada za separator parametrów, a drugi za znak dodawany na końcu konstrukcji. Czyli jeśli mamy do wyświetlenia 3 elementy, które chcemy rozdzielić znakiem wykrzyknika, a zakończyć znakiem hasza, w Pythonie 2.x zrobilibyśmy np.:</p>
<pre><code>print '!'.join ('a', 's', 'd')+'#',</code></pre>
<p>lub:</p>
<pre><code>print 'a' + '!' + 's' + '!' + 'd' + '#',</code></pre>
<p>W Pythonie 3000 będzie to wyglądało nieco ładniej:</p>
<pre><code>print ('a', 's', 'd', sep='!', end='#')</code></pre>
<p>W Pythonie 2.x można było także skorzystać z alternatywnej składni, która pozwalała nam pisać do dowolnego &#8216;uchwytu&#8217; (np. otworzonego pliku, ja często z tego korzystałem przy wypisywaniu błędów na STDERR):</p>
<pre><code>print &gt;&gt;sys.stderr, "komunikat błędu"</code></pre>
<p>W nowej wersji składnia tego typu jest niedostępna, zamiast tego jest inny parametr nazwany: <code>file</code>:</p>
<pre><code>print ("komunikat błędu", file=sys.stderr)</code></pre>
<p>Druga z rzeczy które chciałbym pokazać to formatowanie tekstu. Do tej pory można było korzystać ze składni &#8220;z procentem&#8221;:</p>
<pre><code>print 'liczba całkowita: %d, liczba zmiennoprzecinkowa: %0.1f' % (3.14, 3.14)</code></pre>
<p>Ta składnia w Pythonie 3000 nie będzie już obsługiwana, zamiast tego wszystkie obiekty typu <code>string</code> dostały nową metodę: <code>.format()</code>. Metoda ta umożliwia znacznie bardziej rozbudowane formatowanie i konwersję podawanych parametrów, niż do tej pory było to możliwe za pomocą składni &#8220;procentowej&#8221;. Dajmy na to taki przykład:</p>
<pre><code>class mysz:
  def __init__ (self):
    self.fname = 'Marcin'
    self.lname = 'Sztolcman'
    self.nname = 'MySZ'
    self.age = 28
    self.city = 'Szczecin'
  def __str__ (self):
    return '{0.fname} {0.nname:_^10} {0.lname}'.format (self)

print ('Jestem {0}, mam {0.age} lat, i mieszkam w mieście {0.city}.'.format (mysz ()))</code></pre>
<p>Przykład jest może nieco infantylny ;) ale pokazuje to co chciałem pokazać: zaawansowane możliwości formatowania tekstu, jakich użycza nam metoda <code>.format()</code>. Powyższy przykład powinien nam wyświetlić:</p>
<pre><samp>Jestem Marcin ___MySZ___ Sztolcman, mam 28 lat, i mieszkam w mieście Szczecin.</samp></pre>
<p>Pełna składnia i format napisów formatujących opisany jest w Pythonowym manualu: <a href="http://docs.python.org/dev/3.0/library/string.html#format-string-syntax">docs.python.org/dev/3.0/library/string.html#format-string-syntax</a>. Ja powiem tylko że po tym jak troszę się tym pobawiłem, zrozumiałem powody rezygnacji z mojej naprawdę bardzo lubianej składni, jak ją nazwałem, &#8220;procentowej&#8221; na rzecz <code>.format()</code> :)</p>
<p>Oczywiście Python 3000 wprowadza znacznie więcej zmian i nowości, być może jeszcze kilka z nich opiszę niedługo na łamach tegoż bloga (obiecuję że się postaram ;) ).</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/363/python-3000-print-format/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/363/python-3000-print-format/</feedburner:origLink></item>
		<item>
		<title>Cechy w PHP (Traits)</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/240092564/</link>
		<comments>http://urzenia.net/361/cechy-w-php-traits/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 21:43:15 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[php5]]></category>

		<category><![CDATA[programowanie]]></category>

		<category><![CDATA[traits]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=361</guid>
		<description><![CDATA[Developerzy PHP, projektując &#8220;nową&#8221; implementację OOP (nową w cudzysłowiu, bo raz że to było już kilka lat temu, a dwa, że dotyczy tylko i wyłącznie samego PHP), dość mocno wzorowali się na Javie. Czy to dobrze czy to źle to kwestia gustu, jednak wynika z tego kilka znaczących drobiazgów. Jednym z nich jest jednodziedziczenie (czyli [...]]]></description>
			<content:encoded><![CDATA[<p>Developerzy <a href="http://php.net">PHP</a>, projektując &#8220;nową&#8221; implementację <a href="http://pl.wikipedia.org/wiki/OOP">OOP</a> (nową w cudzysłowiu, bo raz że to było już kilka lat temu, a dwa, że dotyczy tylko i wyłącznie samego PHP), dość mocno wzorowali się na <a href="http://java.sun.com">Javie</a>. Czy to dobrze czy to źle to kwestia gustu, jednak wynika z tego kilka znaczących drobiazgów. Jednym z nich jest <em>jednodziedziczenie</em> (czyli że jedna klasa w PHP może mieć tylko jedną klasę bazową). Od zawsze uważałem to za dużą niewygodę ;) Jak widać, nie tylko ja.</p>
<p>Padła propozycja dołączenia systemu &#8220;Cech&#8221; (ang. Traits) do PHP (podejrzewam że do wersji 6, ale to tylko moje zgadywanie - w każdym bądź razie są gotowe łatki m.in. do 5.2 i 5.3). Do czego służą Traitsy? W sumie&#8230; do obejście problemu jednodziedziczenia, czyli do wprowadzenia <em>wielodziedziczenia</em>.</p>
<p>Trzeba pamiętać, że ten mechanizm został podobno (nie sprawdzałem osobiście) sportowany także do Javy i <a href="http://msdn2.microsoft.com/en-us/vcsharp/aa336809.aspx">C#</a>, natomiast nie istnieje jeszcze ofiacjalna wersja dla PHP. Sam &#8220;wygląd&#8221; kodu, słowa kluczowe etc nie są jeszcze ustalone, ale to tylko szczegóły.</p>
<p>Szczegóły są dostępne w oficjalnym RFC: <a href="http://www.stefan-marr.de/artikel/rfc-traits-for-php.html">stefan-marr.de/artikel/rfc-traits-for-php.html</a>. Ja tylko powiem, że da się często <a href="http://stronger.jogger.pl/2008/02/22/traits-w-php/">obejść</a> niedogodność wynikajacą z braku <em>wielodziedziczenia</em>, ale problem leży właśnie w konieczności <strong>obchodzenia</strong> braków w języku (tak, wiem, to akurat jedna z typowych wojen wyższości jednych świąt nad drugimi ;) ale to akurat moje zdanie ;) ). Prostszym wyjściem byłoby wprowadzenie po prostu możliwości posiadania kilku klas bazowych, ale w to nie wnikam. Ja ogólnie jestem na tak.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/361/cechy-w-php-traits/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/361/cechy-w-php-traits/</feedburner:origLink></item>
		<item>
		<title>Truecrypt 5.0</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/233719901/</link>
		<comments>http://urzenia.net/360/truecrypt-50/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 12:25:17 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[linux]]></category>

		<category><![CDATA[security]]></category>

		<category><![CDATA[truecrypt 5]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=360</guid>
		<description><![CDATA[Już od jakiegoś czasu używałem TrueCrypta, do przechowywania dość wrażliwych danych. Niedawno wyszła wersja 5.0, więc trzeba było się przesiąść ;) Jakkolwiek pierwsze odczucie nie było zbyt pozytywne, o tyle później już mniej więcej wróciło do normy.
Domyślnie, TrueCrypt dla linuksa potrafi sformatować nowy wolumen tylko jako FAT32. Można to nieco obejść, samemu formatując wolumen, a [...]]]></description>
			<content:encoded><![CDATA[<p>Już od jakiegoś czasu używałem <a href="http://www.truecrypt.org/">TrueCrypt</a>a, do przechowywania dość wrażliwych danych. Niedawno wyszła wersja 5.0, więc trzeba było się przesiąść ;) Jakkolwiek pierwsze odczucie nie było zbyt pozytywne, o tyle później już mniej więcej wróciło do normy.</p>
<p>Domyślnie, TrueCrypt dla linuksa potrafi sformatować nowy wolumen tylko jako FAT32. Można to nieco obejść, samemu formatując wolumen, a w oknie wyboru typu systemu plików, wybrać <code>None</code> (cały proces tworzenia wolumenu wraz ze zrzutami obrazów na <a href="http://www.jarzebski.pl/read/nowy-truecrypt-5.so">jarzebski.pl</a>). Następnie trzeba zamontować stworzony wolumen, ale zaznaczając opcję w oknie dialogowym &#8216;Do not mount&#8217;. Teraz pozostaje sformatować urządzenie loopbackowe (w moim przypdku było to /dev/loop0 - można podejrzeć wynik polecenia <code>mount</code>) na wybrany system plików (ext3 w moim wypadku), odmontować, zamontować ponownie już bindując pod wybrany katalog, i zacząć używać tak stworzonego wolumenu.</p>
<p>Problemy także występują przy próbie użycia kluczy. Jeśli wybrałem dowolny klucz (klucze teraz działają nieco inaczej niż w poprzedniej wersji TrueCrypta - do wersji 4.3 były generowane przez sam program, w tej chwili wskazuje mu się dowolną ilość plików i te pliki są traktowane jako klucze) przy tworzeniu wolumenu, to nie dało się podmontować go - krzyczał że niewłaściwy klucz. Okazało się, że klucze zostały olane, i montować trzeba bez nich ;) Za to po dodaniu kluczy do już stworzonego wolumenu wszystko działa jak powinno.</p>
<p>Od długiego czasu używałem swojego skryptu do montowania zaszyfrowanych wolumenów TrueCrypta. Oczywiście, jako zatwardziały zwolennik konsoli, działa on w trybie tekstowym :) Mam stworzony mały pliczek mapujący konkretną nazwę (alias) na plik zaszyfrowanego wolumenu, klucz użyty do zaszyfrowania go, i katalog pod który należy podmontować wolumen. Tutaj wyszedł problem - po każdym wywołaniu truecrypta z wybranymi opcjami, otwierało mi się okienko GUIowe i kazało klikać :/ Tutaj pomogło dodanie parametru <code>-t</code> do wywołania TrueCrypta.</p>
<p>Pozostał jeszcze jeden kłopot. Teoretycznie, nie można pod linuksem stworzyć &#8220;ukrytego wolumenu&#8221; - na etapie tworzenia wyskakuje monit &#8220;The selected feature is currently not supported on your platform.&#8221;. Więc, niech mi ktoś wyjaśni, dlaczego po próbie zamontowania zaszyfrowanego pliku w trybie tekstowym, dostaję jeszcze pytanie o włączenie ochrony ukrytego wolumenu? :/ I nie da się tego wyłączyć (OK, ja nie znalazłem, jeśli komuś się udało to proszę o info).</p>
<p>No dobra, powyżej skłamałem. Obeszłem problem brzydkim hackiem - w swoim skrypcie po prostu pobieram hasło samodzielnie, a następnie przekazuję je do odpowiednio wywołanej instancji TrueCrypta poprzez STDIN. Brzydkie, brudne, i źle działa przy błędnie wpisanym haśle, ale to akurat szczegół. Ważne że chwilowo działa&#8230;</p>
<p>To by było na tyle moich bojów z nową wersją programu. Zainteresowanych tematem odsyłam do dwóch artykułów:</p>
<ul>
<li>wspomniany wcześniej artykuł na <a href="http://www.jarzebski.pl/read/nowy-truecrypt-5.so">jarzebski.pl</a></li>
<li>bardzo ciekawy artykuł na temat starszej wersji TrueCrypta na <a href="http://jakilinux.org/howto/truecrypt-prawdziwe-szyfrowanie/">jakilinux.org</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/360/truecrypt-50/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/360/truecrypt-50/</feedburner:origLink></item>
		<item>
		<title>Skrypty Pythona w Vimie</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/223733326/</link>
		<comments>http://urzenia.net/359/skrypty-pythona-w-vimie/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 00:06:25 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[programowanie]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[vim]]></category>

		<category><![CDATA[vimtips]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=359</guid>
		<description><![CDATA[Stwierdziłem niedawno, że brakuje mi w Vimie takiego drobiazgu jak wyświetlanie listy funkcji z edytowanego właśnie pliku.  Można z jednej strony wykorzystać ctags, ale (pewien nie jestem, nie jestem znawcą tagsów ani ich obsługi w Vimie) po dodaniu funkcji/metody/czegokolwiek innego co można by nazwać tagiem trzeba by od nowa generować listę tagów. Nie jest [...]]]></description>
			<content:encoded><![CDATA[<p>Stwierdziłem niedawno, że brakuje mi w Vimie takiego drobiazgu jak wyświetlanie listy funkcji z edytowanego właśnie pliku.  Można z jednej strony wykorzystać <a href="http://ctags.sourceforge.net">ctags</a>, ale (pewien nie jestem, nie jestem znawcą <code>tags</code>ów ani ich obsługi w Vimie) po dodaniu funkcji/metody/czegokolwiek innego co można by nazwać tagiem trzeba by od nowa generować listę tagów. Nie jest to problemem takim bardzo dużym, do momentu gdy ciągle pracuje się nad różnymi projektami, z czego sporej części nie mam na dysku (tylko wykorzystując plugin netrw pracuję via ftp). W tym momencie moja znajomość systemu ctags podpowiada mi że robi się ciężko&#8230;</p>
<p>Postanowiłem więc napisać sobie prosty skrypt do tego, a że język wewnętrzny Vima mnie nieco odrzuca, postawiłem na Pythona ;) Żeby jakikolwiek skrypt pythona (jak ktoś lubi, można użyć też np perla) mógł zadziałać w Vimie, ten ostatni musi być skompilowany z jego obsługą. W Ubuntu wystarczy zainstalować pakiet vim-full. Łatwo sprawdzić czy Vim ma wkompilowaną obsługę pythona:</p>
<pre><code>vim --version|gi '+python'</code></pre>
<p>Jeśli wyświetliła Ci się podobna linijka:</p>
<pre><samp>+python +quickfix +reltime +rightleft +ruby +scrollbind +signs +smartindent</samp></pre>
<p>to znaczy że możesz śmiało używać pythona do oskryptowania Vima :)</p>
<p>Skrypty Pythona w Vimie przekazywane są do funkcji Vimowej o zaskakującej, nietypowej nazwie <code>python</code>. Tradycyjne <samp>Hello world</samp> wyglądałoby tak:</p>
<pre><code>:python print "Hello world"</code></pre>
<p>Interakcję z samym Vimem umożliwia nam moduł o kolejnej zaskakującej nazwie: <code>vim</code>, który powinniśmy zaimportować na początku funkcji/skryptu. Szczegółowa jego dokumentacja jest na stronach Vima: <a href="http://www.vim.org/htmldoc/if_pyth.html">vim.org/htmldoc/if_pyth.html</a>.</p>
<p>Pierwszym krokiem jest wczytanie zawartości całego bufora. Do jego zawartości dostajemy się poprzez obiekt <code>vim.current.buffer</code>:</p>
<pre><code>fc = "\n".join (line for line in vim.current.buffer)</code></pre>
<p>Samo wyszukanie deklaracji funkcji w plikach pythona można by zrobić mniej więcej tak:</p>
<pre><code>re.findall (r'^\s*def\s+(\w+)', fc, re.M)</code></pre>
<p>Jednak nam najwygodniej pobrać będzie jednocześnie z nazwą funkcji, także całą linijkę w której ta została zdefiniowana. Przyda to się przy przechodzeniu do miejsca w kodzie w którym funkcja jest zdefiniowana. Ja końcowo zrobiłem to tak:</p>
<pre><code>re.findall (r'^(\s*def\s+(\w+\s*\(.*?\))\s*:)', fc, re.M)</code></pre>
<p>Teraz, gdy mamy listę funkcji, trzeba je wyświetlić userowi, a następnie pobrać informację do deklaracji jakiej funkcji w kodzie chcemy się przenieść. Najpierw chciałem skorzystać ze standardowego pythonowego <code>raw_input ()</code>, ale ta funkcja w Vimie nie działa. Użyłem wobec tego Vimowego <code>input ()</code>. Aby skorzystać z funkcji Vimowych, moduł <code>vim</code> udostępnia nam dwie funkcje: <code>vim.eval ()</code> i <code>vim.command ()</code>. Tutaj odpowiedni będzie <code>vim.eval ()</code>:</p>
<pre><code>choice = vim.eval ('input ("Which one: ")')</code></pre>
<p>W tej chwili mamy już praktycznie napisany cały skrypt. Pozostało tylko znalezienie offsetu w jakim się zaczyna deklaracja wybranej przez usera funkcji w buforze, a następnie za pomocą  <code>vim.command ()</code> przenieść kursor w wybrane miejsce:</p>
<pre><code>vim.command ('goto '+str (pos+1))</code></pre>
<p>Całość w moim wykonaniu jest nieco bardziej rozbudowana (minimalnie), jako że staram się zrobić sobie mały framework do skryptowania Vima. Wycinek realizujący odpowiednią funkcjonalnośc w moim przypadku wygląda tak:</p>
<pre><code>" importy ogólne, przydatne funkcje, etc
python &lt;&lt; EOF
import re
import sys

import vim

def MyDevPlugins_GetFileType (default=None):
	ft = vim.eval ('synIDattr(synID(line("."), col("."), 1), "name")')
	if ft:
		m = re.findall (r'^([a-z]+)', ft)
		if m:
			return m[0]
	if not ft:
		ft = default

	return ft

EOF

" FindSubs - wyszukiwanie funkcji
python &lt;&lt; EOF
FindSubs_ftypes = {
	'perl':		r'^(\s*sub\s+(\w+(?:\s*\(.*?\))?))',
	'python':	r'^(\s*def\s+(\w+\s*\(.*?\))\s*:)',
	'php':		r'^(\s*function\s+(\w+\s*\(.*?\)))',
}
FindSubs_ftypes['java'] = FindSubs_ftypes['html'] = FindSubs_ftypes['php']

def FindSubs_Find (ft='perl'):
	try:
		rxp = FindSubs_ftypes[ft]
	except KeyError:
		print 'Unknown filetype: "%s"' % ft
		return

	# read buffer content
	fc = "\n".join (line for line in vim.current.buffer)

	# find all functions names
	m = re.findall (rxp, fc, re.M)
	if not m:
		print 'Not found'
		return

	# print them for user
	for i, sub in enumerate (m):
		print '%d. %s' % (i+1, sub[1])

	# ask for function he want to go
	choice = vim.eval ('input ("Which one: ")')
	try:
		choice = int (choice) - 1
	except:
		print 'Incorrect value'
		return

	# find file offset
	pos = fc.find (m[choice][0].strip ())
	if pos &lt; 0:
		print &gt;&gt;sys.stderr, "Some error occured."
		return

	# and go there
	vim.command ('goto '+str (pos+1))

def FindSubs_Main ():
	FindSubs_Find (MyDevPlugins_GetFileType ())

EOF

function! FindSubs()
	python FindSubs_Main()
endfunction
map &lt;F5&gt; :call FindSubs ()&lt;CR&gt;</code></pre>
<p>Ostatnia linijka odpowiada za podmapowanie wywołania funkcji pod klawisz F5.</p>
<p>Natomiast problemy sprawia opcja rozpoznawania typu pliku. Nie doszukałem się nigdzie w dokumentacji lepszego sposobu, a ten czasem zawodzi :( Nic na to chwilowo nie poradzę. Oczywiście przydałoby się rozpoznawanie większej ilości języków, ale to co jest obecnie wystarcza mi w  zupełności, w razie czego można sobie dorobić odpowiednie regexpy do słownika <code>FindSubs_ftypes</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/359/skrypty-pythona-w-vimie/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/359/skrypty-pythona-w-vimie/</feedburner:origLink></item>
		<item>
		<title>“Geneza powstania perla”</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/223691893/</link>
		<comments>http://urzenia.net/358/geneza-powstania-perla/#comments</comments>
		<pubDate>Sat, 26 Jan 2008 22:14:28 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[humor]]></category>

		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://urzenia.net/?p=358</guid>
		<description><![CDATA[Słyszeliście historyjkę, jak to kot wskoczył na klawiaturę, wklepując losowe znaki, a Larry stwierdził że to musi dać &#8220;Hello world&#8221; ? Znalazł się spec który odtworzył ten ciąg znaków:
perl -e 's^^i6(!@*^+s;\*; Wo\$_\;~;.s![(_\!]!l!g+y"i\$@"Hro"+tr-6;~-ed\012-;print'
Ja leżę i kwiczę :)
Źródło: goldenline.pl/forum/perl/127239
]]></description>
			<content:encoded><![CDATA[<p>Słyszeliście historyjkę, jak to kot wskoczył na klawiaturę, wklepując losowe znaki, a Larry stwierdził że to musi dać &#8220;Hello world&#8221; ? Znalazł się spec który odtworzył ten ciąg znaków:</p>
<pre><code>perl -e 's^^i6(!@*^+s;\*; Wo\$_\;~;.s![(_\!]!l!g+y"i\$@"Hro"+tr-6;~-ed\012-;print'</code></pre>
<p>Ja leżę i kwiczę :)</p>
<p>Źródło: <a href="http://www.goldenline.pl/forum/perl/127239">goldenline.pl/forum/perl/127239</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/358/geneza-powstania-perla/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/358/geneza-powstania-perla/</feedburner:origLink></item>
		<item>
		<title>Po przeprowadzce</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/222074863/</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 prefix tabel jaki był [...]]]></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 - 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>
		<feedburner:origLink>http://urzenia.net/357/po-przeprowadzce/</feedburner:origLink></item>
		<item>
		<title>Koniec repo.urzenia.net</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/220081868/</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 code.google.com. [...]]]></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>
		<feedburner:origLink>http://urzenia.net/356/koniec-repourzenianet/</feedburner:origLink></item>
		<item>
		<title>Killer!</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/215324891/</link>
		<comments>http://urzenia.net/355/killer/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 03:07:57 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[code]]></category>

		<category><![CDATA[killer]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[perl]]></category>

		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://urzenia.net/355/killer/</guid>
		<description><![CDATA[Zrobiłem Killera ;)
Killer to skrypt w perlu który wyświetla tabelę dostępnych procesów, i pozwala wysłać dowolny sygnał (komenda kill w linuksie) do wybranych procesów. Działanie jest bardzo proste, wygląd jeszcze bardziej&#8230; Jak ktoś ma ochotę dorobić ładne cssy to jestem za tym żeby je tam dorzucić ;)
Skrypt jest do pobrania z jego strony domowej: repo.urzenia.net/Perl:Killer.
]]></description>
			<content:encoded><![CDATA[<p>Zrobiłem Killera ;)</p>
<p>Killer to skrypt w perlu który wyświetla tabelę dostępnych procesów, i pozwala wysłać dowolny sygnał (komenda <code>kill</code> w linuksie) do wybranych procesów. Działanie jest bardzo proste, wygląd jeszcze bardziej&#8230; Jak ktoś ma ochotę dorobić ładne cssy to jestem za tym żeby je tam dorzucić ;)</p>
<p>Skrypt jest do pobrania z jego strony domowej: <a href="http://repo.urzenia.net/Perl:Killer">repo.urzenia.net/Perl:Killer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/355/killer/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/355/killer/</feedburner:origLink></item>
		<item>
		<title>Ubuntu na Toshiba Satellite A200 1S9</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/213898094/</link>
		<comments>http://urzenia.net/354/ubuntu-na-toshiba-satellite-a200-1s9/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 17:00:00 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[atheros]]></category>

		<category><![CDATA[gutsy]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[radeon 2400]]></category>

		<category><![CDATA[radeonhd]]></category>

		<category><![CDATA[satellite]]></category>

		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://urzenia.net/354/ubuntu-na-toshiba-satellite-a200-1s9/</guid>
		<description><![CDATA[Jako że mojej kobiecie zepsuł się komputer (tzn zaczął się psuć, ale jak na karcie graficznej i na płycie głównej są &#8216;wypchane&#8217; kondensatory to nie wróżę im długiego życia), trzeba było coś z tym zrobić. Stwierdziłem że nie będę się wygłupiał i rzęcha z 2k2 roku naprawiał i kombinował, szczególnie że Ani marzył się laptop. [...]]]></description>
			<content:encoded><![CDATA[<p>Jako że mojej kobiecie zepsuł się komputer (tzn zaczął się psuć, ale jak na karcie graficznej i na płycie głównej są &#8216;wypchane&#8217; kondensatory to nie wróżę im długiego życia), trzeba było coś z tym zrobić. Stwierdziłem że nie będę się wygłupiał i rzęcha z 2k2 roku naprawiał i kombinował, szczególnie że Ani marzył się laptop. Poszliśmy i kupiliśmy laptopa.</p>
<p>Jako ciekawostka: model jaki wybraliśmy jest w &#8220;Nie dla idiotów&#8221; tańszy niż w większości sklepów w necie&#8230; Zdziwiłem się - choć wyboru nie miałem, musiałem kupić go w MM ;)</p>
<p>Wybrałem dla niej <a href="http://eu.computers.toshiba-europe.com/cgi-bin/ToshibaCSG/jsp/productPage.do?service=EU&#038;PRODUCT_ID=135291">Toshibę Satellite A200 1S9</a>. IMHO bardzo fajny sprzęt za tą cenę, dobrego i lubianego przeze mnie producenta (zawsze lubiłem laptopy Satellite).</p>
<p>Wybierając go zrobiłem jeden błąd, którego wystrzegałem się całe moje informatyczne &#8220;rzycie&#8221;: w laptopie jest karta ATI. O ile nie jest to problem pod Windowsem, o tyle na tym laptopie Windows będzie używany raz na kilka miesięcy. W sumie zrobiłem także drugi błąd, ale jego się nie wystrzegałem wcześniej ;) Tym drugim błędem jest to że jest tam karta sieciowa (wszędzie poniżej mówię o Wi-Fi) do której nie znalazłem działających wolnych sterowników, a <a href="http://ndiswrapper.sourceforge.net/">ndiswrapper</a> średnio sobie z nim radzi&#8230;</p>
<p>OK, wymieniłem 2 najważniejsze problemy, a poniżej sposób na poradzenie sobie z nimi.</p>
<p>Moje założenia które przyświecały mi przy instalacji:</p>
<ul>
<li>Windows na laptopie zostaje (dysk jest 160GB więc te 20GB Ania przeżyje)</li>
<li>instalowanie z płyty Ubuntu Gutsy (7.10)</li>
</ul>
<p>Na pewno nie ma sensu próby wywalenie Windowsa i instalacja go z dostarczanej płyty na własnym rozmieszczeniu partycji - instalator na to nie pozwala :( Trzeba odpalić system z płyty Ubuntu (przy starcie komputera F12 i wybrać bootowanie z DVD), po uruchomieniu środowiska graficznego uruchomić GParted (System -> Administracja -> Partition Editor), i tam wybrać zmniejszenie drugiej partycji (pierwsza to jakaś backupowa czy inne gówna Toshibianego Windowsa, lepiej to zostawić w sumie). Z powstałego w ten sposób wolnego miejsca utworzyłem najpierw partycję Primary na swap (1024MB), z pozostałego miejsca parycję Extended, a na niej dwie partycje logiczne: 20480 na / (trzeba ustawić taki punkt montowania) z systemem plików ext3, a resztę podpiąłem pod /home (również ext3).</p>
<p>Przechodzimy dalej, aż do etapu gdy zacznie się wszystko kopiować na dysk. Niech sobie kopiuje, wróć do tekstu za jakąś godzinę&#8230;</p>
<p>Zakładam że wszystko jest już skopiowane, system się zrestartował i uruchomił na nowo i wszystko gra i buczy. Prawie wszystko&#8230;</p>
<p>Trzeba zacząć od instalacji sieci. W tym celu potrzebny jest najnowszy kernel dostępny w repo (2.6.22-14). Ściągamy go (korzystając z drugiego kompa lub logując się na Windowsie), wracamy do linuksa, i instalujemy:</p>
<pre><code>% sudo dpkg -i linux*deb</code></pre>
<p>Potrzebny będzie także pakiet <code>ndiswrapper</code> i <code>madwifi</code> - znajdziesz je na płycie instalacyjnej. Potraktować je należy podobnie jak te z kernelem. Teraz trzeba podrzucić Windowsowy sterownik do karty sieciowej ndiswrapperowi. W tym celu na konsoli przechodzimy do katalogu Windowsa (<code>/media/sdb2/Windows/System32</code>) i poleceniem:</p>
<pre><code>sudo ndiswrapper -i net5211.inf</code></pre>
<p>instalujemy sterownik. Upewniamy się że system nie załaduje nam sterowników &#8216;natywnych&#8217;:</p>
<pre><code>sudo rmmod ath-pci ath-hal</code></pre>
<p>Do <code>/etc/modprobe.d/blacklist</code> jako root dopisujemy:</p>
<pre><code>blacklist ath-pci
blacklist ath-hal</code></pre>
<p>Usuwamy i dodajemy ponownie moduł ndiswrapper:</p>
<pre><code>sudo rmmod ndiswrapepr
sudo modprobe ndiswrapper</code></pre>
<p>W tym momencie sieć powinna już działać. Jeśli po wydaniu komendy <code>iwconfig</code> znajdziesz interfejs <code>wlan0</code>, to wszystko OK. Jeśli nie, to poszukaj na <a href="">wiki ndiswrappera</a> co może nie być w porządku.</p>
<p>Jeśli chodzi o interfejs Wi-Fi, to pozostaje kazać zapisać konfigurację modułów:</p>
<pre><code>sudo ndiswrapper -m
sudo ndiswrapper -mi
sudo ndiswrapper -ma</code></pre>
<p>Pozostaje skonfigurować dostęp do sieci korzystając z NetworkManagera, i powinno działać.</p>
<p>Niestety, nie zawsze po restarcie sieć wstaje. Nie miałem czasu szukać czemu i czy można coś na to zaradzić. Najprostszą metodą jest zrestartowanie komputera (czasem kilkukrotne), można też spróbować usunąć i ponownie załadować moduł ndiswrapper:</p>
<pre><code>sudo rmmod ndiswrapper
sudo modprobe ndiswrapper</code></pre>
<p>Z kartą graficzną jest mniejszy nieco problem (jeśli już się wie czego szukać i co zrobić). Nie ma sensu instalowanie z repo sterowników &#8216;radeonhd&#8217; czy &#8216;flgrx&#8217; - nie działają (przynajmniej na chwilę obecną). Nie ma sensu też ściągać ze strony ATI najnowszej wersji sterów (również nie działają). Chyba za świeży chipset :(</p>
<p>Jedynym rozwiązaniem które zaczęło mi działać, to samemu skompilować moduł &#8216;radeonhd&#8217; z repozytorium. Cała operacja jest opisana na stronie <a href="http://www.phoronix.com/scan.php?page=article&#038;item=843&#038;num=1">phoronix.com/scan.php?page=article&#038;item=843&#038;num=1</a>.</p>
<p>To samo po polsku w kilku krokach:</p>
<ol>
<li>Trzeba zainstalować na początek kilka narzędzi w systemie:
<pre><code>sudo apt-get install build-essential git-core configure-debian automake autoconf xorg-dev libtool</code></pre>
</li>
<li>pobieramy źródła modułu:
<pre><code>git-clone git://anongit.freedesktop.org/git/xorg/driver/xf86-video-radeonhd</code></pre>
</li>
<li>budujemy i instalujemy moduł:
<pre><code>cd xf86-video-radeonhd/
./autogen.sh --prefix=/usr/
make
sudo make install</code></pre>
</li>
<li>poprawiamy konfigurację serwera X, zmieniając obecny sterownik (prawdopodobnie <code>vesa</code>) na <code>radeonhd</code>. Edytujemy w tym celu plik <code>/etc/X11/xorg.conf</code> jako root, znajdujemy linijkę <code>Driver "vesa"</code> i zmieniamy co trzeba. Ddodatkowo trzeba na razie ręcznie wyłączyć kilka modułów, których ta wersja sterownika na razie nie pbsługuje. Na końcu tego pliku trzeba dopisać:
<pre><code>Section "Extensions"
Option "Composite" "Off"
EndSection

Section "ServerFlags"
Option "AIGLX" "Off"
EndSection</code></pre>
</li>
</ol>
<p>Voila! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/354/ubuntu-na-toshiba-satellite-a200-1s9/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/354/ubuntu-na-toshiba-satellite-a200-1s9/</feedburner:origLink></item>
		<item>
		<title>WP Blip! v.0.1</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/209646108/</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 na [...]]]></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>
		<feedburner:origLink>http://urzenia.net/353/wp-blip-v01/</feedburner:origLink></item>
		<item>
		<title>Sposób pracy na Subversion (branche, tagi etc)</title>
		<link>http://feeds.feedburner.com/~r/mysz/~3/205067731/</link>
		<comments>http://urzenia.net/351/sposob-pracy-na-subversion-branche-tagi-etc/#comments</comments>
		<pubDate>Sun, 23 Dec 2007 11:00:50 +0000</pubDate>
		<dc:creator>MySZ</dc:creator>
		
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://urzenia.net/351/sposob-pracy-na-subversion-branche-tagi-etc/</guid>
		<description><![CDATA[Musiałem utworzyć do firmy mały poradnik, jak korzystać z branchy i tagów w Subversion, a że pisałem to w miarę (jak mi się zdaje) łopatologicznie, to stwierdziłem że umieszczę to i tutaj dla szerszego grona :)
Nie jest to pozycja dla osoby nie mającej dotychczas styczności z Subversion, nie jest więc wytłumaczone co to jest commit [...]]]></description>
			<content:encoded><![CDATA[<p>Musiałem utworzyć do firmy mały poradnik, jak korzystać z <strong>branchy</strong> i <strong>tagów</strong> w <a href="http://subversion.tigris.org">Subversion</a>, a że pisałem to w miarę (jak mi się zdaje) łopatologicznie, to stwierdziłem że umieszczę to i tutaj dla szerszego grona :)</p>
<p>Nie jest to pozycja dla osoby nie mającej dotychczas styczności z Subversion, nie jest więc wytłumaczone co to jest <em>commit</em> i w ogóle Subversion czy też <a href="http://pl.wikipedia.org/wiki/System_kontroli_wersji">system kontroli wersji</a>, są za to informacje jak ja i kilka osób na świecie widzą korzystanie z tak ważnych rzeczy jakimi są <strong>branche</strong> i <strong>tagi</strong> :)</p>
<p>Generalnie, podstawową strukturą katalogów jest układ:</p>
<pre>/
|-trunk
|-branches
|-tags</pre>
<p>W <strong>trunk</strong> przechowywana jest aktualna rozwojowa wersja systemu. Tutaj nanoszone są bieżące zmiany, poprawki etc. <strong>Branches</strong> służą do przechowywania oddzielnych gałęzi systemu, które niosą zbyt rewolucyjne zmiany, żeby umieszczać je w drzewku głównym, które musi być czasem gotowe do natychmiastowej synchronizacji z systemem głównym. W katalogu <strong>tags</strong> tworzone są aktualne <em>snapshoty</em> systemu produkcyjnego - każda wersja, która idzie na system produkcyjny, powinna najpierw zostać przeniesiona (<em>zamrożona</em>) do konkretnego <strong>taga</strong>, i dopiero później system powinien zostać zsynchronizowany.</p>
<p>Najpierw troszkę samej teorii:</p>
<p>Zarówno <strong>branche</strong>, jak i <strong>tagi</strong>, tworzone są poprzez skopiowanie dowolnej z gałęzi<br />
rozwijanego systemu (może to być zarówno system <strong>trunk</strong>, jak i dowolna gałąź utworzona przez któregokolwiek użytkownika) poleceniem <strong>cp</strong> (<strong>copy</strong>):</p>
<pre><code>svn cp svn://repo/trunk svn://repo/branches/moja_galaz</code></pre>
<p>Powyższe polecenie tworzy nową gałąź o nazwie <em>moja_galaz</em> którą można dowolnie sobie rozwijać, testować, modyfikować według własnych potrzeb, a następnie, gdy przyjdzie odpowiedni czas/ochota, dołączyć do aktualnego systemu.</p>
<p>W podobny sposób tworzy się konkretne <strong>tagi</strong> (<strong>tagi</strong> zwyczajowo oznacza się wielkimi literami):</p>
<pre><code>svn cp svn://repo/trunk svn://repo/tags/HOME_20071210_1</code></pre>
<p>Utworzy to aktualny <em>snapshot</em> repozytorium w katalogu <em>/tags/HOME_20071210_1</em> (ostatnia<br />
cyfra oznacza rewizję w ciągu tego samego dnia - oczywiście schemat nazewnictwa jest umowny).</p>
<p>Po utworzeniu własnej gałęzi, powinniśmy się na nią przełączyć, ponieważ domyślnie ciągle pracujemy na poprzedniej wersji repozytorium. Do przełączania się między gałęziami służy polecenie <strong>sw</strong> (<strong>switch</strong>):</p>
<pre><code>svn sw svn://repo/branches/moja_galaz</code></pre>
<p>W tym momencie pracujemy już na naszej gałęzi, i wszelkie commity, zmiany etc będą się odnosić do naszej wersji.<br />
Co dalej?</p>
<p>Podstawowe prace i rozwijanie systemu powinno odbywać się na gałęzi <strong>trunk</strong>, która w razie puszczania zmian na system produkcyjny, powinna zostać skopiowana do odpowiedniego <strong>tagu</strong>, a następnie zsynchronizowana. Pozostaje jeszcze jeden problem: jak połączyć zmiany dokonane na osobnej gałęzi z tym, co dzieje się w aktualnym drzewku?</p>
<p>Tutaj pomoże nam komenda <strong>merge</strong>. Załóżmy hipotetyczną sytuację:</p>
<p>W repozytorium, w gałęzi <strong>trunk</strong>, znajduje się plik <em>index.php</em>. Ma on zawartość:</p>
<pre><code>&lt;?php

include 'some_file.php';

?&gt;</code></pre>
<p>W tej chwili tworzymy osobnego brancha:</p>
<pre><code>svn cp svn://repo/trunk svn://repo/branches/mysz1
svn sw svn://repo/branches/mysz1</code></pre>
<p>Od tego momentu pracujemy już na <strong>branchu</strong> <em>mysz1</em>. Sprawdzić to możemy za pomocą<br />
komendy <strong>info</strong>:</p>
<pre><code>svn info
[...]
URL: svn://repo/branches/mysz1
[...]</code></pre>
<p>Dokonujemy zmiany w pliku <em>index.php</em>, tak że zawiera on teraz:</p>
<pre><code>&lt;?php
include 'some_file.php';
echo date ('Ymdhis'); // branches/mysz1
?&gt;</code></pre>
<p>Wykonujemy commit pliku, po czym przenosimy się na <strong>trunka</strong>:</p>
<pre><code>svn sw svn://repo/trunk
svn info
[...]
URL: svn://repo/trunk
[...]</code></pre>
<p>Sprawdzamy zawartość pliku <em>index.php</em>:</p>
<pre><code>svn cat index.php
&lt;?php
include 'some_file.php';
?&gt;</code></pre>
<p>Dokonujemy zmian, żeby plik wyglądał tak:</p>
<pre><code>&lt;?php
include 'some_file.php';
print strftime ('%Y%m%d %H%M%S', time ()); // trunk
?&gt;</code></pre>
<p>Commit, i wracamy na <em>mysz1</em>:</p>
<pre><code>svn sw svn://repo/branches/mysz1
svn info
[...]
URL: svn://repo/branches/mysz1
[...]
svn cat index.php
&lt;?php
include 'some_file.php';
echo date ('Ymdhis'); // branches/mysz1
?&gt;</code></pre>
<p>No to teraz próbujemy nanieść zmiany z <em>branches/mysz1</em> na główną gałąź systemu:</p>
<pre><code>svn merge -r 6:HEAD svn://repo/branches/mysz1 .</code></pre>
<p>(na końcu jest kropka).</p>
<p>Co znaczą poszczególne części, wyjaśniam poniżej:</p>
<dl>
<dt>svn merge</dt>
<dd>polecenie</dd>
<dt>-r 6:HEAD</dt>
<dd>wersje która mają zostać połączone: najpierw numer wersji na której aktualnie pracujemy (w tym wypadku <strong>6</strong>), później wersji do której chcemy się uaktualnić (<strong>HEAD</strong>, oznaczający najbardziej aktualną wersję, ale może to również być liczba oznaczająca konkretną rewizję)</dd>
<dt>svn://repo/branches/mysz1</dt>
<dd>branch który łączymy z trunkiem</dd>
<dt>.</dt>
<dd>(kropka) aktualna ścieżka (równie dobrze mogło to być svn://repo/trunk)</dd>
</dl>
<p>W tym wypadku powstanie nam konflikt, który rozwiązujemy tradycyjnym sposobem (kasując, dodając i poprawiając konkretne linie), a na końcu, po rozwiązaniu wszystkich problemów, robimy tradycyjny commit.</p>
<p>Więcej informacji znaleźć można na:</p>
<ul>
<li><a href="http://svnbook.org">svnbook.org</a>.</li>
<li><a href="http://pl.wikibooks.org/wiki/Subversion">WikiBooks</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://urzenia.net/351/sposob-pracy-na-subversion-branche-tagi-etc/feed/</wfw:commentRss>
		<feedburner:origLink>http://urzenia.net/351/sposob-pracy-na-subversion-branche-tagi-etc/</feedburner:origLink></item>
	</channel>
</rss>
