<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Innowacyjne technologie &#187; Dla programistów</title>
	<atom:link href="http://tomwys.info/category/dla-programistow/feed/" rel="self" type="application/rss+xml" />
	<link>http://tomwys.info</link>
	<description>czyli co piszczy w internecie</description>
	<lastBuildDate>Mon, 02 Aug 2010 15:29:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>UserScripts w Google Chrome</title>
		<link>http://tomwys.info/2010/08/userscripts-w-google-chrome/</link>
		<comments>http://tomwys.info/2010/08/userscripts-w-google-chrome/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 15:18:12 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=599</guid>
		<description><![CDATA[UserScripts to skrypty w JavaScript, mające na celu modyfikowanie zachowania stron internetowych, bez udziału właściciela strony. Modyfikacja odbywa się jedynie po stronie przeglądarki, zatem jest bezpieczna dla serwisu internetowego. UserScripts są bardzo przydatne, ze względu na to, że pozwalają na udostępnienie użytkownikom funkcji, których właściciele serwisu z jakiegoś powodu nie mogą lub nie chcą udostępnić. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tomwys.info/wp-content/uploads/2010/08/chrome.jpg"><img class="alignleft size-full wp-image-600" title="chrome" src="http://tomwys.info/wp-content/uploads/2010/08/chrome.jpg" alt="" width="230"  /></a>UserScripts to skrypty w JavaScript, mające na celu modyfikowanie zachowania stron internetowych, bez udziału właściciela strony. Modyfikacja odbywa się jedynie po stronie przeglądarki, zatem jest bezpieczna dla serwisu internetowego. UserScripts są bardzo przydatne, ze względu na to, że pozwalają na udostępnienie użytkownikom funkcji, których właściciele serwisu z jakiegoś powodu nie mogą lub nie chcą udostępnić.<br />
<span id="more-599"></span><br />
Dzisiaj natkałem się na filmik prezentujący jak w Google Chrome została rozwiązana kwestia bezpieczeństwa UserScripts i innych rozszerzeń. Jest to naprawde świetne! Zapraszam do oglądania:<br />
<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/laLudeUmXHM&amp;hl=pl_PL&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/laLudeUmXHM&amp;hl=pl_PL&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/08/userscripts-w-google-chrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jaki jest koszmar każdego programisty?</title>
		<link>http://tomwys.info/2010/07/jaki-jest-koszmar-kazdego-programisty/</link>
		<comments>http://tomwys.info/2010/07/jaki-jest-koszmar-kazdego-programisty/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 13:31:18 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Rozrywka]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=505</guid>
		<description><![CDATA[Ostatnio na Stack Overflow padło pytanie ,,Co przeraża Cię najbardziej jako programistę?&#8221;. W temacie zostało zaproponowanych prawie 100 odpowiedzi. Okazuje się, że programiści najbardziej boją się, że: Błąd w ich programie zrobi fizyczną krzywdę komuś lub czemuś. Ich program znajdzie się na TheDailyWTF (serwis wyśmiewający błędy programistów). Zostaną skłonieni do nauczenia się Javy. Rynek zdominują [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio na <a href="http://stackoverflow.com/questions/3347190/whats-your-biggest-fear-as-a-programmer-closed">Stack Overflow</a> padło pytanie <a href="http://stackoverflow.com/questions/3347190/whats-your-biggest-fear-as-a-programmer-closed">,,Co przeraża Cię najbardziej jako programistę?&#8221;</a>. W temacie zostało zaproponowanych prawie 100 odpowiedzi. Okazuje się, że programiści najbardziej boją się, że:  <span id="more-505"></span></p>
<ol>
<li>Błąd w ich programie zrobi fizyczną krzywdę komuś lub czemuś.</li>
<li>Ich program znajdzie się na <a rel="nofollow" href="http://thedailywtf.com">TheDailyWTF</a> (serwis wyśmiewający błędy programistów).</li>
<li>Zostaną skłonieni do nauczenia się Javy.</li>
<li>Rynek zdominują zamknięte platformy takie jak Apple&#8217;s iOS (<a href="http://stackoverflow.com/questions/3347190/whats-your-biggest-fear-as-a-programmer/3347414#3347414">dłuższe wyjaśnienie &#8211; ang.</a>).</li>
<li>Pójdą do pracy w firmie, w której trzeba nosić krawat.</li>
<li>Będą mieli przełożonego, który nie zna się na rzeczy, jednak wszystko musi być tak jak on zdecyduje.</li>
<li>Znudzą się programowaniem lub przeciąży ich prędkość rozwoju informatyki.</li>
<li>Zostania zwolnionym za używanie Stack Overflow w pracy.</li>
<li>Stracą ważne dane.</li>
<li>Pająków internetowych.</li>
</ol>
<p>Jest to oczywiście skrót. Dokładniejsze opisy można znaleźć na <a href="http://stackoverflow.com/questions/3347190/whats-your-biggest-fear-as-a-programmer-closed">stronie</a>.  Ja osobiście najbardziej chyba się boje urazów, które są wywoływane przez ciągłe przesiadywanie przy komputerze, takich jak pogorszenie wzroku czy <a href="http://en.wikipedia.org/wiki/Repetitive_strain_injury">RSI</a>.  <strong>Napisz w komentarzu, czego Ty najbardziej boisz się jako programista!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/07/jaki-jest-koszmar-kazdego-programisty/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pythonowe sztuczki &#8211; property</title>
		<link>http://tomwys.info/2010/07/pythonowe-sztuczki-property/</link>
		<comments>http://tomwys.info/2010/07/pythonowe-sztuczki-property/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 10:39:53 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[property]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=499</guid>
		<description><![CDATA[Krótkie video pokazujące jak wykorzystywać property w Pythonie.]]></description>
			<content:encoded><![CDATA[<p>Krótkie video pokazujące jak wykorzystywać property w Pythonie.<br />
<object width="640" height="506" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param value="true" name="allowfullscreen"/><param value="always" name="allowscriptaccess"/><param value="high" name="quality"/><param value="true" name="cachebusting"/><param value="#000000" name="bgcolor"/><param name="movie" value="http://www.archive.org/flow/flowplayer.commercial-3.2.1.swf" /><param value="config={'key':'#$aa4baff94a9bdcafce8','playlist':['format=Thumbnail?.jpg',{'autoPlay':false,'url':'Recovery_from_Addiction_512kb.mp4'}],'clip':{'autoPlay':true,'baseUrl':'http://www.archive.org/download/SeanKellyRecoveryfromAddiction/','scaling':'fit','provider':'h264streaming'},'canvas':{'backgroundColor':'#000000','backgroundGradient':'none'},'plugins':{'controls':{'playlist':false,'fullscreen':true,'height':26,'backgroundColor':'#000000','autoHide':{'fullscreenOnly':true}},'h264streaming':{'url':'http://www.archive.org/flow/flowplayer.pseudostreaming-3.2.1.swf'}},'contextMenu':[{},'-','Flowplayer v3.2.1']}" name="flashvars"/><embed src="http://www.archive.org/flow/flowplayer.commercial-3.2.1.swf" type="application/x-shockwave-flash" width="640" height="506" allowfullscreen="true" allowscriptaccess="always" cachebusting="true" bgcolor="#000000" quality="high" flashvars="config={'key':'#$aa4baff94a9bdcafce8','playlist':['format=Thumbnail?.jpg',{'autoPlay':false,'url':'Recovery_from_Addiction_512kb.mp4'}],'clip':{'autoPlay':true,'baseUrl':'http://www.archive.org/download/SeanKellyRecoveryfromAddiction/','scaling':'fit','provider':'h264streaming'},'canvas':{'backgroundColor':'#000000','backgroundGradient':'none'},'plugins':{'controls':{'playlist':false,'fullscreen':true,'height':26,'backgroundColor':'#000000','autoHide':{'fullscreenOnly':true}},'h264streaming':{'url':'http://www.archive.org/flow/flowplayer.pseudostreaming-3.2.1.swf'}},'contextMenu':[{},'-','Flowplayer v3.2.1']}"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/07/pythonowe-sztuczki-property/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pythonowe sztuczki &#8211; Generatory</title>
		<link>http://tomwys.info/2010/07/pythonowe-sztuczki-generatory/</link>
		<comments>http://tomwys.info/2010/07/pythonowe-sztuczki-generatory/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 15:00:59 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=434</guid>
		<description><![CDATA[Python ma to do siebie, że udostępnia ułatwienia dla programistów, które występują w niewielu innych językach. Sceptyk mógłby powiedzieć, że nie wnoszą one niczego nowego. To prawda, wszystkie rzeczy, które można za ich pomocą osiągnąć, można również uzyskać innymi sposobami w dowolnym języku. Gdyby jednak chodziło tylko o osiągany efekt, moglibyśmy pisać wszystko w asemblerze. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tomwys.info/wp-content/uploads/2009/11/python-logo.png"><img class="alignleft size-medium wp-image-209" title="Logo pythona" src="http://tomwys.info/wp-content/uploads/2009/11/python-logo-300x101.png" alt="" width="300" height="101" /></a>Python ma to do siebie, że udostępnia ułatwienia dla programistów, które występują w niewielu innych językach. Sceptyk mógłby powiedzieć, że nie wnoszą one niczego nowego. To prawda, wszystkie rzeczy, które można za ich pomocą osiągnąć, można również uzyskać innymi sposobami w dowolnym języku. Gdyby jednak chodziło tylko o osiągany efekt, moglibyśmy pisać wszystko w asemblerze. Tak naprawdę w cenie jest również zwięzłość zapisu i elegancja.  W tym wpisie przedstawiam jedną z moich ulubionych wyjątkowych cech Pythona &#8211; generatory. <span id="more-434"></span> <strong>Generatory</strong> Podstawowe dwa cele, które osiąga się za pomocą generatorów to:</p>
<ul>
<li>czytelniejszy kod</li>
<li>oszczędność pamięci</li>
</ul>
<p>Istnieją również inne ich zastosowania, jednak tutaj skupię się na tym podstawowym.  Rozważmy przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> foo<span style="color: black;">&#40;</span>bar<span style="color: black;">&#41;</span>:
    result = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> bar:
&nbsp;
        <span style="color: #808080; font-style: italic;"># praca praca praca</span>
&nbsp;
        result.<span style="color: black;">append</span><span style="color: black;">&#40;</span>y<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> result
baz = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>foo<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">3</span>,<span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>i funkcja, która robi dokładnie to samo z użyciem <code>yield</code></p>
<p>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> foo<span style="color: black;">&#40;</span>bar<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> bar:
&nbsp;
        <span style="color: #808080; font-style: italic;"># praca praca praca</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">yield</span> y
baz = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>foo<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">3</span>,<span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Efekt działania obu przykładów jest taki sam. Realizują go one jednak w inny sposób. Pierwsza funkcja zwraca listę, druga zaś tworzy generator, który za pomocą funkcji <code>list</code> jest konwertowany na listę.  Zyskaliśmy zatem większą czytelność zapisu.  <strong>W czym jednak kryje się wyjątkowość generatora?</strong> Aby to zobaczyć, należy prześledzić poniższy kod:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> foo1<span style="color: black;">&#40;</span>bar<span style="color: black;">&#41;</span>:
    result = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> bar:
        y = x <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">3</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;foo1: %d&quot;</span> <span style="color: #66cc66;">%</span> y
        result.<span style="color: black;">append</span><span style="color: black;">&#40;</span>y<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> result
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> foo2<span style="color: black;">&#40;</span>bar<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> bar:
        y = x <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">3</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;foo2: %d&quot;</span> <span style="color: #66cc66;">%</span> y
        <span style="color: #ff7700;font-weight:bold;">yield</span> y
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> mysum<span style="color: black;">&#40;</span>l<span style="color: black;">&#41;</span>:
    result = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> l:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;mysum: %d&quot;</span> <span style="color: #66cc66;">%</span> x
        result += x
    <span style="color: #ff7700;font-weight:bold;">return</span> result
&nbsp;
mysum<span style="color: black;">&#40;</span>foo1<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">3</span>,<span style="color: #ff4500;">4</span>,<span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
mysum<span style="color: black;">&#40;</span>foo2<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">3</span>,<span style="color: #ff4500;">4</span>,<span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>i wynik jego działania:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">foo1: 3
foo1: 6
foo1: 9
foo1: 12
foo1: 15
mysum: 3
mysum: 6
mysum: 9
mysum: 12
mysum: 15
foo2: 3
mysum: 3
foo2: 6
mysum: 6
foo2: 9
mysum: 9
foo2: 12
mysum: 12
foo2: 15
mysum: 15</pre></div></div>

<p>Jak widać, generator jest wyliczany ,,leniwie&#8221;. Oznacza to ni mniej, ni więcej, że dana wartość jest liczona dopiero wtedy, gdy zażąda jej <code>for</code>, by wykonać kolejny obrót pętli.  Z punktu widzenia procedury wygląda to tak, że jej praca jest wstrzymywana, gdy wywoływany jest <code>yield</code> i wznawiana, gdy ktoś z zewnątrz zażąda następnej wartości.  Największą zaletą wykorzystania generatora jest to, że w procedurze nie jest tworzona tymczasowa tablica, dzięki czemu oszczędza się dużo pamięci. Wadą rozwiązania jest to, że jakiekolwiek zmiany w obiektach z których korzysta generator, w trakcie gdy generator jest wstrzymany, mogą doprowadzić do rezultatów, których się nie spodziewaliśmy, pisząc tę procedurę.  Podsumowując, generatory pozwalają na prowadzenie obliczeń w sposób kaskadowy, bez tworzenia tymczasowych tablic, które w niektórych przypadkach mogą kosztować bardzo dużo pamięci.</p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/07/pythonowe-sztuczki-generatory/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Najnowszy, podatny na ataki serwis Google</title>
		<link>http://tomwys.info/2010/05/najnowszy-podatny-na-ataki-serwis-google/</link>
		<comments>http://tomwys.info/2010/05/najnowszy-podatny-na-ataki-serwis-google/#comments</comments>
		<pubDate>Thu, 06 May 2010 06:32:34 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[black hat]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=414</guid>
		<description><![CDATA[Najnowsza zabawka Google Jarlsberg to mikroblog z dziurami. Celem aplikacji jest umożliwienie programistom atakowania na stronę i przez to nauczenie ich kwestii związanych z bezpieczeństwem aplikacji www. Jarlsberg został napisany w Pythonie. Na stronie można zażądać własnej instancji systemu i dzięki temu swobodnie bawić się w włamywacza, nie interferując z innymi użytkownikami. Dodatkowo na stronie [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tomwys.info/wp-content/uploads/2010/05/jarlsberg-78.png"><img class="alignleft size-full wp-image-415" title="jarlsberg-78" src="http://tomwys.info/wp-content/uploads/2010/05/jarlsberg-78.png" alt="" width="78" height="78" /></a>Najnowsza zabawka Google <a href="http://jarlsberg.appspot.com/">Jarlsberg</a> to mikroblog z dziurami. Celem aplikacji jest umożliwienie programistom atakowania na stronę i przez to nauczenie ich kwestii związanych z bezpieczeństwem aplikacji www.</p>
<p><span id="more-414"></span></p>
<p><strong>Jarlsberg </strong>został napisany w Pythonie. Na stronie można zażądać własnej instancji systemu i dzięki temu swobodnie bawić się w włamywacza, nie interferując z innymi użytkownikami. Dodatkowo na stronie zostały umieszczone materiały edukacyjne na temat bezpieczeństwa, oraz szereg misji, które należy wykonać. Można by rzec, że jest to takie Mafia Wars dla programistów (-:</p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/05/najnowszy-podatny-na-ataki-serwis-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 10.04</title>
		<link>http://tomwys.info/2010/04/ubuntu-10-04/</link>
		<comments>http://tomwys.info/2010/04/ubuntu-10-04/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 20:26:13 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=375</guid>
		<description><![CDATA[Ubuntu 10.04 wydane. Zachęcam wszystkich do instalacji/aktualizacji. Wśród programów, które są nowe w tej wersji polecam Gource &#8211; wizualizator repozytorium gita. http://code.google.com/p/gource/]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="alignleft size-full wp-image-376" title="logo" src="http://tomwys.info/wp-content/uploads/2010/04/logo.png" alt="logo" width="202" height="55" /><a href="http://www.ubuntu.com/">Ubuntu</a> 10.04 wydane. Zachęcam wszystkich do <a href="http://www.ubuntu.com/getubuntu/download">instalacji</a>/aktualizacji. Wśród programów, które są nowe w tej wersji polecam <a href="http://code.google.com/p/gource/">Gource</a> &#8211; wizualizator repozytorium gita.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://code.google.com/p/gource/</div>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/04/ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Nowe Django w maju.</title>
		<link>http://tomwys.info/2010/04/nowe-django-w-maju/</link>
		<comments>http://tomwys.info/2010/04/nowe-django-w-maju/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:18:41 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[1.2]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=363</guid>
		<description><![CDATA[Na blogu Django pojawiła się wiadomość potwierdzająca, że ostatni tydzień prac nad nową wersją Django odbył się zgodnie z harmonogramem. Oznacza to, że nowej wersji Django możemy spodziewać się w pierwszej połowie Maja. Jest to bardzo dobra wiadomość, ze względu na to, że nowa wersja dodaje wiele przydatnych funkcjonalności. Dla wszystkich niewtajemniczonych warto powiedzieć, że [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-368" title="django-logo" src="http://tomwys.info/wp-content/uploads/2010/04/django-logo-300x136.png" alt="django-logo" width="239" height="108" />Na <a href="http://www.djangoproject.com/weblog/">blogu Django</a> pojawiła się <a href="http://www.djangoproject.com/weblog/2010/apr/28/django-1_2-release-schedule-update-7/">wiadomość</a> potwierdzająca, że ostatni tydzień prac nad nową wersją Django odbył się zgodnie z harmonogramem. Oznacza to, że nowej wersji Django możemy spodziewać się w pierwszej połowie Maja. Jest to bardzo dobra wiadomość, ze względu na to, że nowa wersja dodaje wiele przydatnych funkcjonalności.</p>
<p><span id="more-363"></span></p>
<p>Dla wszystkich niewtajemniczonych warto powiedzieć, że Django to jeden z najbardziej popularnych frameworków webowych dla <a href="http://www.python.org/">Pythona</a>.</p>
<p>Nowe funkcjonalności godne uwagi to między innymi:</p>
<p><span style="text-decoration: line-through;"><strong>E-mail backend</strong> &#8211; sposób wysyłania maili będzie ujednolicony. Do tej pory aby wysłać maila trzeba było skorzystać z jakiejś biblioteki dostępnej dla Pythona. Teraz Django będzie posiadało własny interfejs do wysyłania maili, a wybór biblioteki będzie się dokonywało na poziomie konfiguracji (warto zauważyć, że <a href="http://www.symfony-project.org/">Symfony</a> również wprowadziło podobną funkcjonalność w swojej ostatniej wersji, wydanej w listopadzie 2009).</span></p>
<p><strong>Wsparcie dla wielu baz danych </strong>- do tej pory można było korzystać z kilku baz danych &#8222;żaglując&#8221; konfiguracją. Teraz dodano oficjalne wsparcie, gdzie dla konkretnych obiektów będzie można wybierać bazę danych, do której będą się serializować.</p>
<p><strong>Walidacja modeli</strong> &#8211; z mojego punktu widzenia najważniejsza zmiana wykonana w tej wersji. Walidacja modeli pozwala na sprawdzenie czy dane są poprawne tuż przed zapisaniem ich do bazy danych. Do tej pory było to możliwe, jednak niewygodne. Wprowadzenie walidacji do oficjalnie wspieranych funkcjonalności powinno uprościć ten proces. Warto zauważyć, że walidacja modeli jest bardzo ważnym elementem pisania dobrej aplikacji. Dzięki temu, że modele są walidaowane, programista czuje się znacznie pewniej z aplikacją, którą pisze, ponieważ wie, że nawet jeśli popełni błąd w innej części programu, walidacja modeli wykryje niepoprawne dane.</p>
<p>Podsumowując, wersja 1.2 Django to krok milowy w rozwoju tego frameworka. Polecam przesiadanie się na nową wersję już teraz, mimo że nie została jeszcze oficjalnie wydana (zostały do naprawienia tylko 2 bugi).</p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2010/04/nowe-django-w-maju/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Python zjada dinozaury</title>
		<link>http://tomwys.info/2009/11/python-zjada-dinozaury/</link>
		<comments>http://tomwys.info/2009/11/python-zjada-dinozaury/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 15:00:12 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=205</guid>
		<description><![CDATA[Od jakiegoś czasu uczę się programować w Pythonie z wykorzystaniem Django. Pierwsze wrażenia &#8211; oszałamiające. Do tej pory programując w wielu językach, wiedziałem, że jest coś z nimi nie tak, ale nie wiedziałem dokładnie co. Teraz już wiem! Myślę, że tysiące studentów ucząc się nowego języka zadawało setki razy pytanie: &#8222;dlaczego autor nie zrobił tego [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-209" title="Logo pythona" src="http://tomwys.info/wp-content/uploads/2009/11/python-logo-300x101.png" alt="Logo pythona" width="300" height="101" /></p>
<p>Od jakiegoś czasu uczę się programować w <a href="http://www.python.org">Pythonie</a> z wykorzystaniem <a href="http://www.djangoproject.com/">Django</a>. Pierwsze wrażenia &#8211; oszałamiające. Do tej pory programując w wielu językach, wiedziałem, że jest coś z nimi nie tak, ale nie wiedziałem dokładnie co. Teraz już wiem!</p>
<p><span id="more-205"></span></p>
<blockquote class="right"><p>Myślę, że tysiące studentów ucząc się nowego języka zadawało setki razy pytanie: &#8222;dlaczego autor nie zrobił tego tak aby MI było wygodnie&#8221;?</p></blockquote>
<p>Ucząc się kolejnych języków miewałem często wrażenie, że: &#8222;ten język widział jeszcze dinozaury&#8221; (Pascal, C++) lub &#8222;ten język napisał pewnie jakiś student na pracę zaliczeniową&#8221; (PHP), albo też &#8222;ten język ma dobrych kolegów, którzy widzieli dinozaury&#8221; (Java).</p>
<p>Problem tak naprawdę polega na tym, że języki te nie były projektowane tak by być wygodnymi dla programistów, tylko z jakichś innych pobudek. Z tego powodu mają w sobie mnóstwo elementów, które są niewygodne i po prostu nie chce się z nich korzystać.</p>
<p>Myślę, że tysiące studentów ucząc się nowego języka zadawało setki razy pytanie: &#8222;dlaczego autor nie zrobił tego tak aby <strong>MI</strong> było wygodnie&#8221;? Pytanie to jest bardzo ważne, bo w końcu język programowania jest dla programisty. Nikogo innego nie obchodzi. Maszyna jest w stanie sparsować prawie wszystko, a manager nie czyta kodu.</p>
<p>Niestety bardzo wiele języków nie powstało z myślą o programistach.</p>
<h2>Czas na Pythona!</h2>
<blockquote class="right"><p>Pythona wyróżnia to, że czujesz, że język ten został stworzony z myślą o Tobie &#8211; programiście.</p></blockquote>
<p>Po Pythona sięgam tak naprawdę po raz drugi. Pierwszy raz bawiłem się nim w gimnazjum. Było to jednak na tyle niezobowiązujące i krótkie, że zdążyłem ten język niemal kompletnie zapomnieć. Teraz więc odkrywam go na nowo.</p>
<p>To co w Pythonie zadziwia na początku to, że jest super-łatwy do czytania. Patrząc na jego kod praktycznie od razu wiesz co się gdzie dzieje. Python może nie jest jedynym językiem z tą właściwością, jednak pozytywnie wyróżnia się pod tym względem. Wystarczy rzucić okiem na jakiś prosty kod:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">a = <span style="color: #ff4500;">2</span>
<span style="color: #ff7700;font-weight:bold;">print</span> a
b = a <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">3</span>
<span style="color: #ff7700;font-weight:bold;">print</span> b
x = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'ala'</span>, <span style="color: #483d8b;">'ma'</span>, <span style="color: #483d8b;">'kota'</span><span style="color: black;">&#93;</span>
x = x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:<span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> y <span style="color: #ff7700;font-weight:bold;">in</span> x:
	<span style="color: #ff7700;font-weight:bold;">print</span> y
<span style="color: #ff7700;font-weight:bold;">def</span> foo<span style="color: black;">&#40;</span>a<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">return</span> a <span style="color: #66cc66;">*</span> a
<span style="color: #ff7700;font-weight:bold;">print</span> foo<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Poza tym, że Python jest łatwy do nauki i prosty w czytaniu, jest również dobrze zaprojektowany (dobry podział na moduły, duża biblioteka standardowa), elastyczny (rachunek lambda, możliwość modyfikowania typów w locie), szybki (kompilowany) , przenośny (kompiluje się do kodu pośredniego tak jak Java).</p>
<p>Pythona wyróżnia to, że czujesz, że język ten został stworzony z myślą o Tobie &#8211; programiście.</p>
<h2>Czas na prawdziwy hit!</h2>
<blockquote class="right"><p>W Pythonie piszę się większość rzeczy bardzo krótko i zwięźle. Jest to zaleta, którą powinni docenić zarówno programiści, jak i managerowie.</p></blockquote>
<p>Niemal wszystkie języki mają rozliczne zalety. Dlaczego więc Python? Odpowiedź banalna: mimo bardzo prostej i mało rozbudowanej składni w Pythonie piszę się większość rzeczy bardzo krótko i zwięźle. Jest to zaleta, którą powinni docenić zarówno programiści, jak i managerowie.</p>
<p>Posłużę się przykładem, który jest bardzo frustrujący dla wielu programistów &#8211; gettery i settery. Oto przykładowe kody w PHP i Pythonie, które robią to samo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">bar<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setBar<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>bar <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
?<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span></pre></div></div>

<p>to samo w Pythonie:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Foo:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">bar</span> = <span style="color: #ff4500;">0</span></pre></div></div>

<p><em>(sic! To nie jest pomyłka. W Pythonie piszesz gettery i settery dopiero gdy faktycznie są potrzebne i nic przez to nie tracisz!)</em></p>
<p>Różnica niebanalna prawda? Patrząc na coś takiego trudno się nie oprzeć wrażaniu, że PHP nie zostało zaprojektowane z myślą o programistach. Nie przypomina mi sie żaden inny język programowania, który miałby porządnie rozwiązaną kwestię getterów i setterów.</p>
<h2>Podsumowując</h2>
<p>Jesteś programistą? Spróbuj Pythona, poczujesz różnicę. Jesteś managerem? Poproś swoich programistów by opowiedzieli Ci o Pythonie. Zainteresujesz ich w ten sposób tematem i w przypływie dobrego humoru sami się go nauczą, a ty oszczędzisz na szkoleniu.</p>
<p>PS. Jeśli znasz inny język, który jest tak samo przyjazny jak Python, czekam na komentarz.</p>
<p>Wracam do Pythona. Mam nadzieje, że w przyszłości Python wywrze na mnie jeszcze większe wrażenie.</p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2009/11/python-zjada-dinozaury/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Gravatar: czy Twój awatar podąża za Tobą?</title>
		<link>http://tomwys.info/2009/10/gravatar-czy-twoj-awatar-podaza-za-toba/</link>
		<comments>http://tomwys.info/2009/10/gravatar-czy-twoj-awatar-podaza-za-toba/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 19:03:59 +0000</pubDate>
		<dc:creator>Tomasz Wysocki</dc:creator>
				<category><![CDATA[Dla programistów]]></category>
		<category><![CDATA[Serwisy internetowe]]></category>

		<guid isPermaLink="false">http://tomwys.info/?p=76</guid>
		<description><![CDATA[Awatar &#8211; niewielki obrazek symbolizujący użytkownika &#8211; to jeden z bardziej udanych internetowych wynalazków. Na co dzień często niedoceniany ze względu na swą wszechobecność. Gdyby jednak awatary nagle zniknęły, życie uczestników społeczności internetowych stałoby się znacznie trudniejsze. Bo czy ktokolwiek z was pamięta nicki wszystkich osób, z którymi dyskutuje na forach lub portalach społecznościowych? Czy [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-80" title="gravatar" src="http://tomwys.info/wp-content/uploads/2009/10/gravatar.png" alt="gravatar" width="274" height="55" />Awatar &#8211; niewielki obrazek symbolizujący użytkownika &#8211; to jeden z bardziej udanych internetowych wynalazków. Na co dzień często niedoceniany ze względu na swą wszechobecność. Gdyby jednak awatary nagle zniknęły, życie uczestników społeczności internetowych stałoby się znacznie trudniejsze. Bo czy ktokolwiek z was pamięta nicki wszystkich osób, z którymi dyskutuje na forach lub portalach społecznościowych?<br />
<span id="more-76"></span></p>
<h2><img class="alignright size-full wp-image-151" style="border: 1px solid black;" title="avatars" src="http://tomwys.info/wp-content/uploads/2009/10/avatars.png" alt="avatars" width="172" height="446" />Czy z awatarów można korzystać w sposób wygodny?</h2>
<p>Powstaje jednak pytanie: jak wygodnie zarządzać swoimi awatarami? Pytanie to dotyczy szczególnie serwisów, których użytkownikami jesteśmy bardzo rzadko lub korzystamy z nich tylko jeden raz. Zakładanie konta i dodawanie awatara w serwisie, w którym chcemy napisać zaledwie jedna wiadomość, jest marnotrawstwem czasu. Z drugiej strony, nawet w razie korzystania z wielu serwisów regularnie, powstaje problem: jak zmienić awatar? Wgrywanie nowego awatara do każdego serwisu z osobna nie jest zbyt wydajnym rozwiązaniem.</p>
<h2>Gravatar przychodzi z odsieczą!</h2>
<p>Problemy te zauważyli autorzy serwisu <a href="http://gravatar.pl">Gravatar.com</a>. Gravatar czyli Globally Recognized Avatar to serwis, który daje możliwość opublikowania swojego awatara w sposób łatwo dostępny dla innych serwisów. Oznacza to, że każdy programista tworzący stronę internetową, może  zaimplementować obsługę gravatara, dzięki czemu gdy tylko dodasz do serwisu komentarz lub zarejestrujesz konto, Twój awatar pojawi się tam automatycznie. Gravatar jest obsługiwany domyślnie przez niektóre aplikacje (np. <a href="http://wordpress.org">WordPress</a>). Dzięki temu jeśli zarejestrujesz się w serwisie Gravatar i dodasz komentarz do tego posta, Twój awatar pojawi się automatycznie obok (polecam spróbować). Proces dodawania swojego awatara demonstruje poniższy filmik:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="563" height="317" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://v.wordpress.com/UyDfmflZ" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="563" height="317" src="http://v.wordpress.com/UyDfmflZ" allowfullscreen="true"></embed></object></p>
<h2>Jak działa Gravatar?</h2>
<p>Gravatar przypisuje awatary do adresów e-mail. Oznacza to, że Twój awatar może zostać automatycznie pobrany i wyświetlony wszędzie tam, gdzie został podany Twój adres.</p>
<h2>Czy Gravatar jest bezpieczny?</h2>
<p>Moim zdaniem, kwestia bezpieczeństwa Gravatara jest wątpliwa. Na razie sam korzystam z ich usług bez większych obaw. Wysłałem jednak do autorów e-mail z moimi uwagami co do bezpieczeństwa. Mam uzasadnione obawy, że zauważone przeze mnie luki mogą skompromitować bezpieczeństwo tego serwisu.</p>
]]></content:encoded>
			<wfw:commentRss>http://tomwys.info/2009/10/gravatar-czy-twoj-awatar-podaza-za-toba/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
