<?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"
	>

<channel>
	<title>Maciek Rogoziński</title>
	<atom:link href="http://www.rogozinski.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rogozinski.net</link>
	<description></description>
	<pubDate>Wed, 21 May 2008 19:16:25 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>5 praktycznych wyrażen regularnych w PHP</title>
		<link>http://www.rogozinski.net/2008/05/21/5-praktycznych-wyrazen-regularnych-w-php/</link>
		<comments>http://www.rogozinski.net/2008/05/21/5-praktycznych-wyrazen-regularnych-w-php/#comments</comments>
		<pubDate>Wed, 21 May 2008 19:16:25 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[regular expression]]></category>

		<category><![CDATA[wyrażenia regularne]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/?p=166</guid>
		<description><![CDATA[5 praktycznych wyrażen regularnych w PHP]]></description>
			<content:encoded><![CDATA[<p>Za każdym razem gdy przychodzi mi skorzystać z dobrodziejstwa jakim są wyrażenia regularne (które swoją drogą mogłyby się dorobić jakiegoś ogólnie uznawanego standardu), sięgam po gotowe i sprawdzone wzorce. Poniżej umieściłem kilka najczęściej używanych przeze mnie wyrażeń regularnych wraz z przykładowym kodem w PHP.</p>
<p><strong>Adres email</strong><br />
Walidacja adresu email jest często spotykanym przykładem użycia wyrażeń regularnych. Adres email składa się z 3 podstawowych części:</p>
<ul>
<li>nazwy użytkownika - za sprawdzenie tego elementu odpowiada ([0-9a-zA-Z]([-_.\w]*[0-9a-zA-Z_])*</li>
<li>symbolu @</li>
<li>oraz nazwy domeny - za sprawdzenie tego elementu odpowiada (([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})</li>
</ul>
<p>Całość daje nam razem uproszczony adres email, którego poprawność możemy sprawdzić używając poniższego kodu:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$test_string</span> = <span style="color: #ff0000;">&quot;przykladowy@email.tutaj.pl&quot;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/^([0-9a-zA-Z]([-_.<span style="color: #000099; font-weight: bold;">\w</span>]*[0-9a-zA-Z_])*@(([0-9a-zA-Z])+([-<span style="color: #000099; font-weight: bold;">\w</span>]*[0-9a-zA-Z])*<span style="color: #000099; font-weight: bold;">\.</span>)+[a-zA-Z]{2,9})$/'</span>, <span style="color: #0000ff;">$test_string</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'OK'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'Failed'</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>Adres URL</strong><br />
Czyli format adresowania zasobów internetowych najczęściej kojarzony z adresami stron www. Adres ten możemy rozbić na następujące części:</p>
<ul>
<li>rodzaj protokołu - (http|https|file)</li>
<li>opcjonalna nazwa użytkownika i hasło - (\w*:\w*@)?</li>
<li>nazwa hosta - [-\w.]+</li>
<li>opcjonalny numer portu - (:\d+)?</li>
<li>ścieżka dostępu - (/([\w/_.]*</li>
<li>zapytanie - (\?\S+)?</li>
</ul>
<p>Poprawność URLa możemy sprawdza następujący kawałek kodu:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$test_string</span> = <span style="color: #ff0000;">&quot;http://login:haslo@www.rogozinski.net:80/admin/test.php?action=edit&amp;amp;id=166&quot;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;/^(http|https|file):<span style="color: #000099; font-weight: bold;">\/</span><span style="color: #000099; font-weight: bold;">\/</span>(<span style="color: #000099; font-weight: bold;">\w</span>*:<span style="color: #000099; font-weight: bold;">\w</span>*@)?[-<span style="color: #000099; font-weight: bold;">\w</span>.]+(:<span style="color: #000099; font-weight: bold;">\d</span>+)?(<span style="color: #000099; font-weight: bold;">\/</span>([<span style="color: #000099; font-weight: bold;">\w</span><span style="color: #000099; font-weight: bold;">\-</span><span style="color: #000099; font-weight: bold;">\.</span><span style="color: #000099; font-weight: bold;">\/</span>]*(<span style="color: #000099; font-weight: bold;">\?</span><span style="color: #000099; font-weight: bold;">\S</span>+)?)?)?$/&quot;</span>, <span style="color: #0000ff;">$test_string</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'OK'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'Failed'</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>Adres IP</strong></p>
<p>W wydaniu IPv4, są to cztery liczby od 0 do 255 oddzielone kropkami.</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$test_string</span> = <span style="color: #ff0000;">&quot;255.255.255.0&quot;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/^(?:25[0-5]|2[0-4]<span style="color: #000099; font-weight: bold;">\d</span>|1<span style="color: #000099; font-weight: bold;">\d</span><span style="color: #000099; font-weight: bold;">\d</span>|[1-9]<span style="color: #000099; font-weight: bold;">\d</span>|<span style="color: #000099; font-weight: bold;">\d</span>)(?:[.](?:25[0-5]|2[0-4]<span style="color: #000099; font-weight: bold;">\d</span>|1<span style="color: #000099; font-weight: bold;">\d</span><span style="color: #000099; font-weight: bold;">\d</span>|[1-9]<span style="color: #000099; font-weight: bold;">\d</span>|<span style="color: #000099; font-weight: bold;">\d</span>)){3}$/'</span>, <span style="color: #0000ff;">$test_string</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'OK'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'Failed'</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>Data i godzina (w formacie 24H)</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$string</span> = <span style="color: #ff0000;">'2007-02-15 03:15'</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/^([0-9]{4}-[0-9]{2}-[0-9]{2})<span style="color: #000099; font-weight: bold;">\s</span>((0{0,1}[0-9])|(1[0-9])|([2][0-4])):([0-5][0-9])$/'</span>, <span style="color: #0000ff;">$string</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'OK'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'Failed'</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>Kod pocztowy</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$test_string</span> = <span style="color: #ff0000;">'05-324'</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">preg_match</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/^[0-9]{2}[-]([0-9]{3})?$/'</span>, <span style="color: #0000ff;">$test_string</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'OK'</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">echo</span> <span style="color: #ff0000;">'Failed'</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Wszystkie przykłady wyświetlają napis &#8216;OK&#8217; w razie prawidłowego rozpoznania wzorca i &#8216;Failed&#8217; w razie porażki.</p>
<p>Warto zobaczyć:</p>
<ul>
<li><a href="http://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html">Wprowadzenie do PHP Regex</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/05/21/5-praktycznych-wyrazen-regularnych-w-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Even Dummies Wear Seatbelts</title>
		<link>http://www.rogozinski.net/2008/04/22/even-dummies-wear-seatbelts/</link>
		<comments>http://www.rogozinski.net/2008/04/22/even-dummies-wear-seatbelts/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 18:18:32 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Off topic]]></category>

		<category><![CDATA[Fińskie Ministerstwo Transportu]]></category>

		<category><![CDATA[pasy bezpieczeństwa]]></category>

		<category><![CDATA[reklama]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/?p=167</guid>
		<description><![CDATA[Bardzo ciekawa reklama propagująca zapinanie pasów bezpieczeństwa, wyprodukowany przez Fińskie Ministerstwo Transportu.]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/55K859sAouE&amp;hl=en" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://www.youtube.com/v/55K859sAouE&amp;hl=en" wmode="transparent"></embed></object></p>
<p>Bardzo ciekawa reklama propagująca zapinanie pasów bezpieczeństwa, wyprodukowany przez Fińskie Ministerstwo Transportu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/04/22/even-dummies-wear-seatbelts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Odległość Levenshteina przy porównywaniu ciągów znaków</title>
		<link>http://www.rogozinski.net/2008/03/20/odleglosc-levenshteina-przy-porownywaniu-ciagow-znakow/</link>
		<comments>http://www.rogozinski.net/2008/03/20/odleglosc-levenshteina-przy-porownywaniu-ciagow-znakow/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 00:07:45 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[.net]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Levenshtein]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[porównywanie ciągów znaków]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/03/20/odleglosc-levenshteina-przy-porownywaniu-ciagow-znakow/</guid>
		<description><![CDATA[Zwykłe porównywanie stringów czy to w php czy asp, sprowadza się do porównywania napisów znak po znaku i wyniku w postaci true lub false. Czasami jednak potrzebujemy porównać napisy powołując się nie na ich bezpośrednią równość, ale na ich podobieństwo.

Jednym z prostszych algorytmów, który pozwoli nam na zbadanie podobieństwa dwóch ciągów znaków jest algorytm Levenshteina, [...]]]></description>
			<content:encoded><![CDATA[<p>Zwykłe porównywanie stringów czy to w php czy asp, sprowadza się do porównywania napisów znak po znaku i wyniku w postaci true lub false. Czasami jednak potrzebujemy porównać napisy powołując się nie na ich bezpośrednią równość, ale na ich podobieństwo.</p>
<div style="float: left; margin-right:4px"></div>
<p>Jednym z prostszych algorytmów, który pozwoli nam na zbadanie podobieństwa dwóch ciągów znaków jest algorytm Levenshteina, określający tzw. <strong>odległość Levenshteina</strong>.</p>
<p>Algorytm w oparciu o zdefiniowane wcześniej operacje proste (np. wstawienie znaku, usunięcie znaku, zmiana znaku na inny) określa najmniejszą liczbę operacji, potrzebnych do transformacji pierwszego napisu w drugi. Łatwo sobie wyobrazić, że dla identycznych napisów odległość  Levenshteina będzie równa 0, natomiast dla dwóch całkowicie różnych napisów, będzie równa liczbie znaków dłuższego z ciągów. Krótko mówiąc im mniejsza odległość, tym napisy są bardziej do siebie podobne.</p>
<p>Algorytm ten można modyfikować dodając np. nowe operacje, lub przypisując operacjom wagi.</p>
<p>Warto zauważyć, że PHP dostarcza nam własną implementację algorytmu Levenshteina, możemy jej użyć wywołując funkcję <a title="PHP function levenshtein" href="http://pl.php.net/levenshtein">levenshtein</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="php">int <span style="color: #000066;">levenshtein</span> <span style="color: #66cc66;">&#40;</span> string <span style="color: #0000ff;">$str1</span>, string <span style="color: #0000ff;">$str2</span> <span style="color: #66cc66;">&#91;</span>, int <span style="color: #0000ff;">$cost_ins</span>, int <span style="color: #0000ff;">$cost_rep</span>, int <span style="color: #0000ff;">$cost_del</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Natomiast w C# porównywaniem string&#8217;ów musimy się zająć sami. Przykładowa implementacja może wyglądać na przykład tak:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> LevenshteinDistance<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span> s1, <span style="color: #FF0000;">String</span> s2<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">const</span> <span style="color: #FF0000;">int</span> cost_ins = <span style="color: #FF0000;">1</span>;
	<span style="color: #0600FF;">const</span> <span style="color: #FF0000;">int</span> cost_del = <span style="color: #FF0000;">1</span>;
	<span style="color: #0600FF;">const</span> <span style="color: #FF0000;">int</span> cost_sub = <span style="color: #FF0000;">1</span>;
&nbsp;
	<span style="color: #FF0000;">int</span> n1 = s1.<span style="color: #0000FF;">Length</span>;
	<span style="color: #FF0000;">int</span> n2 = s2.<span style="color: #0000FF;">Length</span>;
&nbsp;
	<span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> p = <span style="color: #008000;">new</span> <span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span>n2<span style="color: #FF0000;">+1</span><span style="color: #000000;">&#93;</span>;
	<span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> q = <span style="color: #008000;">new</span> <span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span>n2<span style="color: #FF0000;">+1</span><span style="color: #000000;">&#93;</span>;
	<span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> r;
&nbsp;
	p<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span> = <span style="color: #FF0000;">0</span>;
	<span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span> <span style="color: #FF0000;">int</span> j = <span style="color: #FF0000;">1</span>; j &amp;lt;= n2; ++j <span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		p<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span> = p<span style="color: #000000;">&#91;</span>j<span style="color: #FF0000;">-1</span><span style="color: #000000;">&#93;</span> + cost_ins;
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span> <span style="color: #FF0000;">int</span> i = <span style="color: #FF0000;">1</span>; i &amp;lt;= n1; ++i <span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		q<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span> = p<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span> + cost_del;
		<span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span> <span style="color: #FF0000;">int</span> j = <span style="color: #FF0000;">1</span>; j &amp;lt;= n2; ++j <span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #FF0000;">int</span> d_del = p<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span> + cost_del;
			<span style="color: #FF0000;">int</span> d_ins = q<span style="color: #000000;">&#91;</span>j - <span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span> + cost_ins;
			<span style="color: #FF0000;">int</span> d_sub = p<span style="color: #000000;">&#91;</span>j - <span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span> + <span style="color: #000000;">&#40;</span>s1<span style="color: #000000;">&#91;</span>i - <span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span> == s2<span style="color: #000000;">&#91;</span>j - <span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span> ? <span style="color: #FF0000;">0</span> : cost_sub<span style="color: #000000;">&#41;</span>;
			q<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span> = Math.<span style="color: #0000FF;">Min</span><span style="color: #000000;">&#40;</span> Math.<span style="color: #0000FF;">Min</span><span style="color: #000000;">&#40;</span> d_del, d_ins <span style="color: #000000;">&#41;</span>, d_sub <span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
		r = p;
		p = q;
		q = r;
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0600FF;">return</span> p<span style="color: #000000;">&#91;</span>n2<span style="color: #000000;">&#93;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Wynikiem funkcji Levenshteina jest liczba całkowita. Co jednak zrobić gdy na podstawie porównania ciągów znaków chcemy je klasyfikować? Liczba całkowita nie jest w tym wypadku zbyt wymowna. Lepszym pomysłem jest uzależnienie wyniku od maksymalnej długości ciągu.</p>
<p>Przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">float</span> LevenshteinTextComparison<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span> s1, <span style="color: #FF0000;">String</span> s2<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>s1.<span style="color: #0000FF;">Equals</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span>.<span style="color: #0000FF;">Empty</span><span style="color: #000000;">&#41;</span> &amp;amp;&amp;amp; s2.<span style="color: #0000FF;">Equals</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span>.<span style="color: #0000FF;">Empty</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span>;
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span> - <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">float</span><span style="color: #000000;">&#41;</span>LevenshteinDistance<span style="color: #000000;">&#40;</span>s1, s2<span style="color: #000000;">&#41;</span> / <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">float</span><span style="color: #000000;">&#41;</span>Math.<span style="color: #0000FF;">Max</span><span style="color: #000000;">&#40;</span>s1.<span style="color: #0000FF;">Length</span>, s2.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Teraz zamiast mało mówiącej liczby całkowitej, otrzymujemy liczbę rzeczywistą z zakresu &lt;0, 1&gt; określającą podobieństwo napisów. Im bliżej jedynki tym ciągi są bardziej podobne i w drugą stronę, im bliżej zera, tym ciągi bardziej się od siebie różnią.</p>
<p>Przydatne linki:</p>
<p><a title="Odległość Levenshteina" href="http://pl.wikipedia.org/wiki/Odleg%C5%82o%C5%9B%C4%87_Levenshteina">http://pl.wikipedia.org/wiki/Odległość_Levenshteina</a><br />
<a title="Odległość Levenshteina" href="http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance"> http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/03/20/odleglosc-levenshteina-przy-porownywaniu-ciagow-znakow/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zdjęcia w Blogger Play</title>
		<link>http://www.rogozinski.net/2008/03/13/zdjecia-w-blogger-play/</link>
		<comments>http://www.rogozinski.net/2008/03/13/zdjecia-w-blogger-play/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 23:17:23 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Google]]></category>

		<category><![CDATA[Oprogramowanie]]></category>

		<category><![CDATA[blogger]]></category>

		<category><![CDATA[blogger play]]></category>

		<category><![CDATA[flickr]]></category>

		<category><![CDATA[matt cutts]]></category>

		<category><![CDATA[zdjęcia]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/03/13/zdjecia-w-blogger-play/</guid>
		<description><![CDATA[Matt Cutts na swoim blogu zwrócił uwagę na uzależniające działanie  Blogger Play. Szczerze mówiąc jest to moje pierwsze spotkanie z tym bardzo prostym i zarazem wciągającym serwisem.
Blogger Play to slideshow wyświetlający zdjęcia, które są aktualnie wrzucane do systemu Blogger przez ludzi na całym świecie.

Warto zauważyć, że Flickr również posiada podobną funkcjonalność.
]]></description>
			<content:encoded><![CDATA[<p>Matt Cutts na <a href="http://www.mattcutts.com/blog/blogger-play/">swoim blogu</a> zwrócił uwagę na uzależniające działanie <img src='http://www.rogozinski.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <a href="http://play.blogger.com/">Blogger Play</a>. Szczerze mówiąc jest to moje pierwsze spotkanie z tym bardzo prostym i zarazem wciągającym serwisem.</p>
<p>Blogger Play to slideshow wyświetlający zdjęcia, które są aktualnie wrzucane do systemu Blogger przez ludzi na całym świecie.</p>
<p style="text-align: center"><img src="http://www.rogozinski.net/wp-content/uploads/2008/02/blogger_play.jpg" alt="Blogger Play" /></p>
<p>Warto zauważyć, że Flickr również posiada <a href="http://flickr.com/photos/tags/google/show/">podobną funkcjonalność</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/03/13/zdjecia-w-blogger-play/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kontrolki kompozytowe w ASP.NET a ClientID</title>
		<link>http://www.rogozinski.net/2008/03/10/kontrolki-kompozytowe-w-aspnet-a-clientid/</link>
		<comments>http://www.rogozinski.net/2008/03/10/kontrolki-kompozytowe-w-aspnet-a-clientid/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 11:00:04 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[ASP]]></category>

		<category><![CDATA[Programowanie]]></category>

		<category><![CDATA[ClientID]]></category>

		<category><![CDATA[composite controls]]></category>

		<category><![CDATA[CreateChildControls]]></category>

		<category><![CDATA[kontrolki kompozytowe]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/03/10/kontrolki-kompozytowe-w-aspnet-a-clientid/</guid>
		<description><![CDATA[Wyprodukowałem sobie dzisiaj bardzo prostą kontrolkę kompozytową. Jej zadaniem jest pokazywanie i chowanie div&#8217;a z tekstem. Całość odbywa się tylko po stronie klienta. Normalnie (mam na myśli HTML) byłoby to banalnie proste, niestety nie w ASP.
Div&#8217;a zastąpił mi Panel, a przycisk po wciśnięciu którego pojawia się panel, powstał jako oddzielna kontrolka (także kompozytowa).  Wszystko [...]]]></description>
			<content:encoded><![CDATA[<p>Wyprodukowałem sobie dzisiaj bardzo prostą kontrolkę kompozytową. Jej zadaniem jest pokazywanie i chowanie div&#8217;a z tekstem. Całość odbywa się tylko po stronie klienta. Normalnie (mam na myśli HTML) byłoby to banalnie proste, niestety nie w ASP.</p>
<p>Div&#8217;a zastąpił mi Panel, a przycisk po wciśnięciu którego pojawia się panel, powstał jako oddzielna kontrolka (także kompozytowa).  Wszystko ładnie złożyłem i opakowałem w metodę CreateChildControls(). Ku mojemu zdziwieniu JavaScript wywoływany po wciśnięciu przycisku powodował błąd. Okazuje się, że ClientId panelu jest puste (względnie nie zawiera wartości, której się spodziewam). Dlaczego? Otóż ClientId nie jest dostępne z poziomu metody CreateChildControls(), prawidłową wartość możemy uzyskać dopiero tuż przed wyrenderowaniem kontrolki, czyli np. na preRenderze.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp"><span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> <span style="color: #0600FF;">void</span> OnPreRender<span style="color: #000000;">&#40;</span>EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #008080; font-style: italic;">// tutaj możemy się odwołać do ClientId kontrolek</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Faktem jest, że unikalne ID tagów html&#8217;owych generowanych przez ASP może być zbudowane tylko przy kompletnym drzewie kontrolek, ale czy nie można było zaoszczędzić czasu i napisać o tym w dokumentacji właściwości ClientId?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/03/10/kontrolki-kompozytowe-w-aspnet-a-clientid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Koniec urlopu&#8230; wracamy do pracy :&#124;</title>
		<link>http://www.rogozinski.net/2008/03/03/koniec-urlopu-wracamy-do-pracy/</link>
		<comments>http://www.rogozinski.net/2008/03/03/koniec-urlopu-wracamy-do-pracy/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 22:54:10 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Off topic]]></category>

		<category><![CDATA[urlop]]></category>

		<category><![CDATA[wakacje]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/03/03/koniec-urlopu-wracamy-do-pracy/</guid>
		<description><![CDATA[Jestem świeżo po urlopie. Góry, śnieg i narty. Bez laptopa i internetu (no prawie  ). Przede wszystkim bez codziennego pośpiechu. Chwila oddechu, która pozwoliła na oderwanie się od problemów, natłoku myśli i informacji. Mała szansa na zerwanie z codzienną rutyną i szarymi ulicami miasta.

Wracam, próbuję nadrobić zaległości, zaczynam czytać i na co trafiam?
- Wiesz, [...]]]></description>
			<content:encoded><![CDATA[<p>Jestem świeżo po urlopie. Góry, śnieg i narty. Bez laptopa i internetu (no prawie <img src='http://www.rogozinski.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Przede wszystkim bez codziennego pośpiechu. Chwila oddechu, która pozwoliła na oderwanie się od problemów, natłoku myśli i informacji. Mała szansa na zerwanie z codzienną rutyną i szarymi ulicami miasta.</p>
<p style="text-align: center"><img src="http://www.rogozinski.net/wp-content/uploads/2008/03/stok_narciarski.jpg" alt="Stok narciarski" /></p>
<p>Wracam, próbuję nadrobić zaległości, zaczynam czytać i na co trafiam?</p>
<blockquote><p>- Wiesz, oprócz komputerów jest jeszcze rzeczywistość: kwiaty, drzewa, żywi ludzie&#8230;<br />
- To znaczy gdzie, za firewallem?&#8230;</p></blockquote>
<p>Rozbroiło mnie to totalnie <img src='http://www.rogozinski.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/03/03/koniec-urlopu-wracamy-do-pracy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reset iPoda nano</title>
		<link>http://www.rogozinski.net/2008/02/29/reset-ipoda-nano/</link>
		<comments>http://www.rogozinski.net/2008/02/29/reset-ipoda-nano/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 16:57:54 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[how to]]></category>

		<category><![CDATA[ipod]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/02/29/reset-ipoda-nano/</guid>
		<description><![CDATA[Raz na jakiś czas urządzenia po prostu odmawiają posłuszeństwa i przestają działać tak, jak tego od nich oczekujemy. To samo przydarzyło się mojemu iPodowi. Tuż po tym jak próbowałem podłączyć dwa różne iPody do jednego komputera, jeden z nich (iPod nano) zawiesił się. Co należy zrobić w takiej sytuacji?
Czasami po prostu musimy go zresetować, mniej [...]]]></description>
			<content:encoded><![CDATA[<p>Raz na jakiś czas urządzenia po prostu odmawiają posłuszeństwa i przestają działać tak, jak tego od nich oczekujemy. To samo przydarzyło się mojemu iPodowi. Tuż po tym jak próbowałem podłączyć dwa różne iPody do jednego komputera, jeden z nich (iPod nano) zawiesił się. Co należy zrobić w takiej sytuacji?<img src="http://www.rogozinski.net/wp-content/uploads/2008/02/nano.png" alt="iPod nano" align="right" /></p>
<p>Czasami po prostu musimy go zresetować, mniej więcej tak, jak to się robi z komputerami. Restart iPoda jest bardzo łatwą czynnością, należy zaznaczyć, że nie spowoduje utraty muzyki, plików ani ustawień.</p>
<ol>
<li>Sprawdź czy iPod jest odblokowany, przycisk na spodzie odtwarzacza powinien być przesunięty w lewo, tak by nie było widać pomarańczowego tła.</li>
<li>Naciśnij jednocześnie i przytrzymaj przez 10 sekund przyciski &#8220;Menu&#8221; i &#8220;Select&#8221; (to ten po środku kółka).</li>
</ol>
<p>Po zresetowaniu, na wyświetlaczu pojawi się logo Apple, a zaraz potem menu główne. <img src='http://www.rogozinski.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Wpis jest luźnym tłumaczeniem artykułu: <a href="http://www.methodshop.net/mp3/ipodsupport/restart/index.shtml">http://www.methodshop.net/mp3/ipodsupport/restart/index.shtml</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/02/29/reset-ipoda-nano/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Jestem niewidoczny w Gmail Chat</title>
		<link>http://www.rogozinski.net/2008/02/27/jestem-niewidoczny-w-gmail-chat/</link>
		<comments>http://www.rogozinski.net/2008/02/27/jestem-niewidoczny-w-gmail-chat/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 23:01:50 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Google]]></category>

		<category><![CDATA[Oprogramowanie]]></category>

		<category><![CDATA[Gmail Chat]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/02/27/jestem-niewidoczny-w-gmail-chat/</guid>
		<description><![CDATA[Google wprowadziło w Gmail Chat nowy status: niewidoczny. Teraz możemy się zalogować i przeglądać listę kontaktów, tak aby inni nie wiedzieli, że jesteśmy dostępni. Opcja ta nie jest jeszcze widoczna w polskiej wersji językowej (można ją zobaczyć po zmianie języka na English (US)), nie ma jej również w kliencie Google Talk.

Należy zwrócić uwagę, że status [...]]]></description>
			<content:encoded><![CDATA[<p>Google wprowadziło w Gmail Chat nowy status: niewidoczny. Teraz możemy się zalogować i przeglądać listę kontaktów, tak aby inni nie wiedzieli, że jesteśmy dostępni. Opcja ta nie jest jeszcze widoczna w polskiej wersji językowej (można ją zobaczyć po zmianie języka na English (US)), nie ma jej również w kliencie Google Talk.</p>
<p align="center"><img src="http://www.rogozinski.net/wp-content/uploads/2008/02/gmail_chat.jpg" alt="Gmail Chat" /></p>
<p>Należy zwrócić uwagę, że status &#8216;niewidoczny&#8217; występuje tylko w nowej wersji Gmaila.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/02/27/jestem-niewidoczny-w-gmail-chat/feed/</wfw:commentRss>
		</item>
		<item>
		<title>John Cleese chce kredyt gotówkowy</title>
		<link>http://www.rogozinski.net/2008/02/25/john-cleese-chce-kredyt-gotowkowy/</link>
		<comments>http://www.rogozinski.net/2008/02/25/john-cleese-chce-kredyt-gotowkowy/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 12:02:11 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[Off topic]]></category>

		<category><![CDATA[BZ WBK]]></category>

		<category><![CDATA[Johnem Cleese]]></category>

		<category><![CDATA[Monty Python]]></category>

		<category><![CDATA[reklama]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/02/25/john-cleese-chce-kredyt-gotowkowy/</guid>
		<description><![CDATA[

Pojawiła się pierwsza, z serii reklam banku BZ WBK z Johnem Cleesem, legendarnym liderem kabaretu Monty Python. Wszyscy, którzy lubią absurdalny, brytyjski humor na pewno nieźle się uśmieją :).
]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/sv4sQEKroa8&#038;rel=1"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/sv4sQEKroa8&#038;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object>
</p>
<p>Pojawiła się pierwsza, z serii reklam banku BZ WBK z Johnem Cleesem, legendarnym liderem kabaretu Monty Python. Wszyscy, którzy lubią absurdalny, brytyjski humor na pewno nieźle się uśmieją :).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/02/25/john-cleese-chce-kredyt-gotowkowy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sposób na sitemap.xml w bloggerze</title>
		<link>http://www.rogozinski.net/2008/02/20/sposob-na-sitemapxml-w-bloggerze/</link>
		<comments>http://www.rogozinski.net/2008/02/20/sposob-na-sitemapxml-w-bloggerze/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 22:53:35 +0000</pubDate>
		<dc:creator>maciek</dc:creator>
		
		<category><![CDATA[HowTo]]></category>

		<category><![CDATA[Oprogramowanie]]></category>

		<category><![CDATA[blogger]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[mapa strony]]></category>

		<category><![CDATA[RSS]]></category>

		<category><![CDATA[sitemap.xml]]></category>

		<guid isPermaLink="false">http://www.rogozinski.net/2008/02/20/sposob-na-sitemapxml-w-bloggerze/</guid>
		<description><![CDATA[Przyglądałem się trochę bloggerowi (bardzo fajny i przyjazny system blogowania, niestety jeśli chodzi o funkcjonalność jest nadal za WordPressem). To co rzuciło mi się w oczy to fakt, że blogger sam z siebie nie oferuje generowania mapy strony w postaci pliku XML (sitemap.xml). Co w takim razie  zrobić jeśli chcemy aby mapa naszego bloggerowego [...]]]></description>
			<content:encoded><![CDATA[<p>Przyglądałem się trochę bloggerowi (bardzo fajny i przyjazny system blogowania, niestety jeśli chodzi o funkcjonalność jest nadal za WordPressem). To co rzuciło mi się w oczy to fakt, że blogger sam z siebie nie oferuje generowania mapy strony w postaci pliku XML (sitemap.xml). <strong>Co w takim razie  zrobić jeśli chcemy aby mapa naszego bloggerowego bloga była widoczna w Google Webmasters?</strong></p>
<p>Mapę strony możemy zastąpić linkiem do kanału RSS naszego bloga. Wszystko co trzeba zrobić to:</p>
<ol>
<li>Wejść do Google Webmasters:<br />
<a href="https://www.google.com/webmasters/sitemaps/" target="_blank" rel="nofollow">https://www.google.com/webmasters/sitemaps/</a></li>
<li>Dodać witrynę:<br />
my-blog.blogspot.com</li>
<li>Dodać mapę witryny. Link do mapy powinien wyglądać następująco:<br />
my-blog.blogspot.com/atom.xml?redirect=false&amp;start-index=1&amp;max-results=100</li>
</ol>
<p><strong>Adres &#8216;my-blog.blogspot.com&#8217; należy oczywiście zastąpić adresem własnego bloga.</strong> W ten sposób dodamy mapę strony, która z każdym nowym postem będzie automatycznie uaktualniana.</p>
<p>Informacje zapożyczyłem z <a href="http://groups.google.com/group/blogger-help-howdoi/browse_thread/thread/c90c1c8326c6c15e/3e97390507d80264?q=sitemap#3e97390507d80264">grupy googlowej</a>.<a href="http://groups.google.com/group/blogger-help-howdoi/browse_thread/thread/c90c1c8326c6c15e/3e97390507d80264?q=sitemap#3e97390507d80264"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rogozinski.net/2008/02/20/sposob-na-sitemapxml-w-bloggerze/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
