<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Python blogowo.net</title>
	<link rel="self" href="http://python.blogowo.net/atom.xml"/>
	<link href="http://python.blogowo.net/"/>
	<id>http://python.blogowo.net/atom.xml</id>
	<updated>2010-02-10T22:51:44+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="pl">
		<title type="html">PyQt4 dostępne w Maemo</title>
		<link href="http://www.python.rk.edu.pl/w/p/pyqt4-dostepne-w-maemo/"/>
		<id>http://www.python.rk.edu.pl/w/p/pyqt4-dostepne-w-maemo/</id>
		<updated>2010-02-09T14:58:28+00:00</updated>
		<content type="html">PyQt w wersji 4.7 trafiło do repozytorium &quot;Extras&quot; systemu Maemo napędzającego smartphony Nokii: N800/N810/N900. PyQt możne korzystać z Qt 4.5 (Extras) lub Qt 4.5 (Extras-devel), dodano także zestaw przykładowych aplikacji i pomocniczych narzędzi jako pakiet python2.5-qt4-doc. Więcej można znaleźć na stronach &lt;a href=&quot;http://maemo.org/&quot;&gt;maemo.org&lt;/a&gt; #python, #maemo, #qt</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Django 1.2 beta 1 wydana</title>
		<link href="http://www.python.rk.edu.pl/w/p/django-12-beta-1-wydana/"/>
		<id>http://www.python.rk.edu.pl/w/p/django-12-beta-1-wydana/</id>
		<updated>2010-02-06T04:44:29+00:00</updated>
		<content type="html">Kilka godzin temu wydano &lt;a href=&quot;http://www.djangoproject.com/weblog/2010/feb/06/12-beta-1/&quot;&gt;Django 1.2 Beta 1&lt;/a&gt; - kolejny krok do stabilnego wydania 1.2. Zmiany w Beta 1 obejmują: zmiany w testach, klas feedów, czy enkodowanie znaków , i ; w wartościach cookie. Nowości to nadawanie uprawnień na obiekt, uprawnienia dla anonimowego użytkownika oraz usprawnienia select_related. Szczegóły w &lt;a href=&quot;http://docs.djangoproject.com/en/dev/releases/1.2-beta-1/&quot;&gt;notce wydania&lt;/a&gt;. Wersja stabilna powinna być wydana na początku marca. #django</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python 2.5.5</title>
		<link href="http://www.python.org.pl/python,255.html"/>
		<id>http://www.python.org.pl/python,255.html</id>
		<updated>2010-01-31T16:20:11+00:00</updated>
		<content type="html">Dzisiaj ukazała się piąta wersja poprawkowa Pythona 2.5. W wydaniu tym poprawiono jedynie błędy związane z bezpieczeństwem i udostępniono tylko wersję źródłową.  
     
   Poprawki dotyczą modułów:  
    - logging  
    - tarfile  
    - expat  
     
   Wszystkim użytkownikom Pythona 2.5 zaleca się przesiadkę na najnowszą wersję z serii 2.x, Pythona 2.6.4.  
     
   Więcej informacji jest dostępnych w pliku NEWS.txt.  
     
   Żrodło: python.org</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Epydoc - generowanie dokumentacji kodu</title>
		<link href="http://www.python.rk.edu.pl/w/p/epydoc-generowanie-dokumentacji-kodu/"/>
		<id>http://www.python.rk.edu.pl/w/p/epydoc-generowanie-dokumentacji-kodu/</id>
		<updated>2010-01-31T05:18:12+00:00</updated>
		<content type="html">Opis narzędzia epydoc do generowania dokumentacji kodu Pythona na podstawie docstringów #python, #django</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Migracja videotesty.pl z PHP na Django/Python</title>
		<link href="http://www.python.rk.edu.pl/w/p/migracja-videotestypl-z-php-na-djangopython/"/>
		<id>http://www.python.rk.edu.pl/w/p/migracja-videotestypl-z-php-na-djangopython/</id>
		<updated>2010-01-30T06:50:26+00:00</updated>
		<content type="html">Podsumowanie zalet i efektów migracji serwisu videotesty.pl na Django/Python #django, #python, #php</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">PyYAML - parser formatu YAML</title>
		<link href="http://www.python.rk.edu.pl/w/p/pyyaml-parser-formatu-yaml/"/>
		<id>http://www.python.rk.edu.pl/w/p/pyyaml-parser-formatu-yaml/</id>
		<updated>2010-01-28T18:54:50+00:00</updated>
		<content type="html">Opis parsera YAML konwertującego dane zapisane w tym formacie do Pythonowych słowników.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Uwolnienie potęgi iPhona - jailbreaking</title>
		<link href="http://blog.zabiello.com/2010/01/17/iphone-jailbreak"/>
		<id>tag:blog.zabiello.com:Article1404</id>
		<updated>2010-01-17T14:22:02+00:00</updated>
		<content type="html">&lt;div&gt;
&lt;p&gt;Tak, jak pewnie większość użytkowników iPhone’a, mimo że słyszałem od dawna o możliwości zdjęcia apple’owskich blokad (proces określany jako jailbreaking), to trochę się obawiałem że taka operacja to potencjalne ryzyko zablokowania aparatu lub jakichś innych nieodwracalnych uszkodzeń. Prawda jest taka, że to wszystko to brednie i ploty. Jailbreak jest bardzo łatwy do przeprowadzenia i jest to proces w pełni odwracalny.&lt;/p&gt;


	&lt;p&gt;Jailbreak iPhone’a wytrąca z ręki krytyków tego urządzenia większość argumentów. Nie wszyscy wiedzą, ale Cydia (jedno z najpopularniejszych zasobów aplikacji na jailbreakowanego iPhone’a) istniała na długo zanim Apple wpadł na pomysł ze swoim AppStore. Aktualnie istnieje już wiele tego typów repozytoriów aplikacji, wszystkie są integrowane w jeden, szybki system za pomocą pakietu &lt;code&gt;Rock&lt;/code&gt; (o czym niżej).&lt;/p&gt;


	&lt;p&gt;Czy są jakieś wady (lub ograniczenia) związane z  jailbreakiem? Owszem, jest pewna niedogodność. Przed aktualizacją kolejnej wersji systemu operacyjnego iPhone\a (co jest dosyć rzadkim wydarzeniem) należy przywrócić z powrotem oryginalny system, zrobić aktualizację, i dopiero po tym odpalić ponownie jailbreak  (choć przy większych zmianach iPhone OS można się wcześniej upewnić czy jailbreak już jest z nim kompatybilny).&lt;/p&gt;


	&lt;p&gt;Dla pewności,  dobrze zrobić sobie backup iPhone (oczywiście za pomocą ITunes). Gdyby cokolwiek poszło źle można łatwo odzyskać z powrotem poprzednią zawartość iPhone’a.&lt;/p&gt;


	&lt;p&gt;Jailbreak (przy okazji usuwany jest simlock) przeprowadza się w banalny sposób. Należy podpiąć iPhone kabelkiem &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; do komputera i uruchomić program &lt;code&gt;blackra1n&lt;/code&gt; ściągnięty ze strony  &lt;a href=&quot;http://www.blackra1n.com&quot;&gt;http://www.blackra1n.com&lt;/a&gt; (program jest dostępny zarówno dla Mac OS-X jak i dla sytemu Windows)&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://blog.zabiello.com/images/articles/jailbreak1.png&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;Po kliknięciu w  przycisk “make it ra1n”, może pojawić się okienko ITunes z informacją że iPhone  został przełączony w tryb recovery. Można je spokojnie zignorować.&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://blog.zabiello.com/images/articles/jailbreak2.png&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;Po odpaleniu &lt;code&gt;blackra1n&lt;/code&gt; iPhone zostanie przeładowany, a na liście aplikacji pojawi się dodatkowa &lt;code&gt;blackra1n&lt;/code&gt;. Należy ją uruchomić. Z zaproponowanych do instalacji pakietów: Cydia, Rock i sn0w. Należy wybrać &lt;strong&gt;Rock&lt;/strong&gt; (zobacz: &lt;a href=&quot;http://www.rockyourphone.com/&quot;&gt;http://www.rockyourphone.com&lt;/a&gt;). Jest dużo szybszy od Cydii i oczywiście wszystkie aplikacje dostępne dla Cydii są też dostępne dla Rock’a. Poza tym Rock posiada automatyczny system backupu. Wystarczy zarejestrować sobie darmowe konto na serwerze (robi się to z poziomu Rock’a) i wtedy nie trzeba się przejmować aby robić backup ściągniętych aplikacji. Rock zrobi to automatycznie i automatycznie je przywróci jak trzeba. Do kontrolowania pakietów/aplikacji Rock używa &lt;span class=&quot;caps&quot;&gt;APT&lt;/span&gt;,  system podobny do używanego w  Debianie/Ubuntu, lecz wszystko działa w ładnym &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Jeśli po jailbreake’u masz jakieś problemy z działaniem Wifi, należy zrestartować w iPhonie ustawienia sieciowe (Ustawienia -&amp;gt; Ogólne -&amp;gt; Wyzeruj -&amp;gt; Wyzeruj ustawienia sieciowe) Ja musiałem to zrobić dwa razy. Od tego momentu już więcej nie było problemów.&lt;/p&gt;


	&lt;p&gt;Co warto sobie zainstalować na początek?&lt;/p&gt;


	&lt;p&gt;Na pewno warto zacząć od &lt;a href=&quot;http://simblog.pl/sbsettings-centrum-dowodzenia-w-iphonie/&quot;&gt;SBSettings&lt;/a&gt; (oczywiście wszystko się instaluje za pomocą aplikacji Rock). SBSettings to b. wygodna aplikacja, pozwala ubijać inne aplikacje, wyświetla ilość dostępnego &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;’u, pozwala czyścić &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;, chować ikony innych aplikacji itp.&lt;/p&gt;


	&lt;p&gt;Drugą aplikacją “must have” to &lt;a href=&quot;http://code.google.com/p/iphone-backgrounder/wiki/Documentation&quot;&gt;Backgrounder&lt;/a&gt;  – służy do odpalania dowolnej innej aplikacji w tle.&lt;/p&gt;


	&lt;p&gt;Trzecią to &lt;a href=&quot;http://www.topiphoneresource.info/organize-your-iphone-apps-with-categories-jailbreak-app/&quot;&gt;Categories&lt;/a&gt; pozwalająca na grupowanie ikon programów w foldery. Dużo wygodniej niż stary bałagan, zwłaszcza jak się ma dużo aplikacji.&lt;/p&gt;


	&lt;p&gt;Do łatwiejszej lokalizacji aplikacji (bo są w katalogach o mało czytelnych nazwach) dobrze doinstalować sobie Prostą aplikację &lt;code&gt;AppLinks&lt;/code&gt; (w &lt;code&gt;/var/mobile/AppLinks&lt;/code&gt; stworzy czytelne linki symboliczne do wszystkich aplikacji).&lt;/p&gt;


	&lt;p&gt;Co dalej? No, zależy co kto potrzebuje. Ja zainstalowałem sobie  Pythona, Ruby, Haskella, Javę (kompaktowa &lt;a href=&quot;http://jamvm.sourceforge.net/&quot;&gt;JamVM&lt;/a&gt;), Scalę, Clojure, Vim’a, Midnight Commandera, wget, lynx, git, svn oraz oczywiście serwer OpenSSH. Dzięki temu ostatniemu mogę połączyć się z iPhonem za pomocą &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; (dla tych co nie wiedzą, domyślne hasło root’a w iPhonie to “alpine”). Dzięki &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; można łatwo modyfikować dowolne pliki i aplikacje. Przeszkadzają komuś reklamy w jakimś programie? :) Najczęściej wystarczy tylko prosta edycja pliku javascriptowego. Poza tym za pomocą &lt;span class=&quot;caps&quot;&gt;SFTP&lt;/span&gt; można przerzucać dowolne programy i pliki z pominięciem iTunes. Jest nawet program &lt;a href=&quot;http://iphoneblloger.blogspot.com/2009/03/installous.html&quot;&gt;Installous&lt;/a&gt; specjalnie do instalowania aplikacji bez pośrednictwa ITunes.&lt;/p&gt;


&lt;pre&gt;
$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [arm-darwin9]

$ python    
Python 2.5.1 (r251:54863, xx/xx/xx, xx:xx:xx) 
[GCC 4.2.1 (Based on Apple Inc. build 5555)] on darwin

$ java -version
java version &quot;1.5.0&quot; 
JamVM version 1.5.1
Copyright (C) 2003-2008 Robert Lougher &amp;lt;rob@lougher.org.uk&amp;gt;
...
Execution Engine: direct-threaded interpreter with stack-caching
Compiled with: gcc 4.2.1 (Based on Apple Inc. build 5555)

Boot Library Path: /usr/lib/classpath
Boot Class Path: /usr/share/jamvm/classes.zip:/usr/share/classpath/glibj.zip
&lt;/pre&gt;

	&lt;p&gt;Python zainstalował mi się w wersji 2.5. Za pomocą setuptools doinstalowałem ipythona, django, pylons, sqlalchemy, mako. Odpaliłem prosty projekt w Django. Działa bez problemu. Ruby instaluje się w wersji 1.8.6 ale ma starsze RubyGems 1.3.2. Ściągnąłem zatem z sieci najnowsze i bez problemu doinstalowały się: Rails, Merb i Sinatra. Niestety jako serwer działa tylko Webrick. Thin i Mongrel się nie skompilowały, ale to dlatego że nie miałem programu make.&lt;/p&gt;


	&lt;p&gt;Powodzenia w hackowaniu. Teraz to iPhone naprawdę Rocks ;)&lt;/p&gt;      &lt;/div&gt;</content>
		<author>
			<name>Jarosław Zabiełło</name>
			<uri>http://blog.zabiello.com</uri>
		</author>
		<source>
			<title type="html">Jarosław Zabiełło - BLOG : Tag python, everything about python</title>
			<subtitle type="html">moje notatki, linki, komentarze</subtitle>
			<link rel="self" href="http://blog.zabiello.com/tag/python.atom"/>
			<id>tag:blog.zabiello.com:tagpython</id>
			<updated>2010-02-10T22:51:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Sortowanie danych w MySQL i Django</title>
		<link href="http://www.python.rk.edu.pl/w/p/sortowanie-danych-w-mysql-i-django/"/>
		<id>http://www.python.rk.edu.pl/w/p/sortowanie-danych-w-mysql-i-django/</id>
		<updated>2010-01-07T14:49:42+00:00</updated>
		<content type="html">Przykład niestandardowego sortowania za pomocą metody extra ORM Django. #django, #mysql</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wyciąganie i konwersja MVE z Baldurs Gate do formatu mp4</title>
		<link href="http://www.python.rk.edu.pl/w/p/wyciaganie-i-konwersja-mve-z-baldurs-gate-do-formatu-mp4/"/>
		<id>http://www.python.rk.edu.pl/w/p/wyciaganie-i-konwersja-mve-z-baldurs-gate-do-formatu-mp4/</id>
		<updated>2010-01-07T09:07:29+00:00</updated>
		<content type="html">Wykorzystanie modułu struct Pythona oraz FFmpeg do wyciągnięcia i skonwertowania klipów wideo z Baldurs Gate. #python, #baldur, #baldurs, #ffmpeg</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Django 1.2 alfa 1</title>
		<link href="http://www.python.rk.edu.pl/w/p/django-12-alfa-1/"/>
		<id>http://www.python.rk.edu.pl/w/p/django-12-alfa-1/</id>
		<updated>2010-01-06T16:22:52+00:00</updated>
		<content type="html">&lt;p&gt;W środę wydano pierwszą wersję alfa nowej wersji Django 1.2. Dostępna jest szczegółowa &lt;a href=&quot;http://docs.djangoproject.com/en/dev/releases/1.2-alpha-1/&quot;&gt;notka wydania&lt;/a&gt;, jak i opis rozbudowanego &lt;a href=&quot;http://zerokspot.com/weblog/2010/01/06/messaging-in-django12/&quot;&gt;systemu wiadomości&lt;/a&gt; (messages).&lt;/p&gt;
&lt;p&gt;Z wstecznie niezgodnych zmian można wymienić zmiany w ochronie CSRF jak i brak obsługi zmiennych o nazwach: and/or/not w tagu {% if %}. Zmienia się także format zapisu danych bazy danych (obecny będzie obsługiwany do Django 1.4) ze względu na wprowadzenie obsługi wielu baz danych. Z nowości pojawiły się także wtyczki do wysyłania maili, czy pole BigIntegerField (64 bitowy integer). Planowo stabilna wersja 1.2 ma ukazać się 9 marca.&lt;/p&gt; #django</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Plan wydania Pythona 3.2</title>
		<link href="http://www.python.org.pl/plan,wydania,pythona,32.html"/>
		<id>http://www.python.org.pl/plan,wydania,pythona,32.html</id>
		<updated>2009-12-30T19:49:02+00:00</updated>
		<content type="html">Georg Brandl opublikował PEP-0392 (Python Enhancement Proposals), w którym zamieścił plan wydania Pythona 3.2.  
     
   Ci, którzy spodziewają się znaczących zmian w języku, zawiodą się, gdyż PEP-3003 (Python Language Moratorium), o którym pisaliśmy tutaj, ciągle obowiązuje.  
     
   Pierwsza alfa spodziewana jest na początek czerwca, a wydanie końcowe w grudniu 2010 roku. Planowane zmiany można śledzić na bieżąco w dokumencie 'What's new' z dokumentacji Pythona 3.2.  
     
   Więcej informacji: PEP-0392  
   Źródło: python.org</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">IronPython 2.6</title>
		<link href="http://www.python.org.pl/ironpython,26.html"/>
		<id>http://www.python.org.pl/ironpython,26.html</id>
		<updated>2009-12-16T22:57:04+00:00</updated>
		<content type="html">Po ponad pół roku pracy, 11 grudnia, ukazała się ostateczna wersja IronPythona 2.6, finalne wydanie poprzedziła jedna alfa, dwie bety, oraz trzy wydania Release Candidate.  
     
   Jest to pierwsza, z alternatywnych implementacji, wersja Pythona, zgodna z najnowszym standardem serii 2.x.  
     
   Do głównych zmian można zaliczyć:  
   - Lepsza integracja z .NET  
   - Najnowsza wersja DLR  
   - Przyśpieszenie działania, w szczególności szybszy start  
   - Dodanie brakujących funkcji z poprzednich wersji CPythona oraz poprawa wielu zgłoszonych błędów  
     
   Szczegółowe informacje na temat IronPythona można uzyskać na nowo powstałej stronie: ironpython.net.  
     
   Pobierz: IronPython 2.6</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">GtkTreeView w Glade</title>
		<link href="http://husio.homelinux.com/blog/post/gtktreeview-w-glade/"/>
		<id>http://husio.homelinux.com/blog/post/gtktreeview-w-glade/</id>
		<updated>2009-12-14T20:16:28+00:00</updated>
		<content type="html">&lt;p&gt;To co zawsze było dla mnie problemem w &lt;a href=&quot;http://www.gtk.org/&quot;&gt;GTK+&lt;/a&gt;, to
   wszelkiego rodzaju listy danych. Mimo takich bibliotek jak 
   &lt;a href=&quot;http://www.async.com.br/projects/kiwi/example-list-datatypes.html&quot;&gt;kiwi&lt;/a&gt;,
   zawsze zastanawiałem się, dlaczego w GTK jest to takie trudne i nie można tego zrobić w &lt;a href=&quot;http://glade.gnome.org/&quot;&gt;glade&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Glade wraz z każdym kolejnym wydaniem przynosi sporo zmian. Używając wersji
   3.6.7 i biblioteki
   &lt;a href=&quot;http://library.gnome.org/devel/gtk/unstable/GtkBuilder.html&quot;&gt;GtkBuilder&lt;/a&gt;,
   udało mi się &lt;strike&gt;prawie&lt;/strike&gt; w całości wyklikać widok drzewa wraz z modelem! Ponieważ nie znalazłem żadnego opisu i 
   zajęło mi to trochę czasu, poniżej krótki przykład jak to zrobić, wraz z linkiem do
   &lt;a href=&quot;http://github.com/husio/tutorials/tree/master/gtkbuilder_treeview/&quot;&gt;repozytorium zawierającego dobrze opisany
kod&lt;/a&gt;.
&lt;/p&gt;

&lt;h2&gt;Glade 3&lt;/h2&gt;
&lt;p&gt;Jaki jest glade, &lt;a href=&quot;http://github.com/husio/tutorials/raw/master/gtkbuilder_treeview/glade3_main_window.png&quot;&gt;każdy
widzi&lt;/a&gt;
   i chyba nie ma się nad czym specjalnie rozpisywać. Po lewej stronie można
   wybrać widget, aby następnie umieścić go wewnątrz innego. Po prawej obejrzeć
   można drzewo obiektów i ustawić ich atrybuty oraz obsługę sygnałów.
&lt;/p&gt;
&lt;p&gt;W utworzonym przeze mnie modelu ważne są trzy elementy: 
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;code&gt;treeview&lt;/code&gt;, który odpowiada za wyświetlanie danych
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;combobox_parent&lt;/code&gt;, który pozwala na wybranie rodzica dla właśnie
   umieszczanych w drzewie danych
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;treestore&lt;/code&gt; - model w którym trzymane są dane wyświetlane przez dwa powyższe widoki 
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wszystkie obiekty należy odpowiednio skonfigurować - ustawić kolumny i każdemu
   widokowi przyporządkować model, a każdej kolumnie  obiekt renderujący.
&lt;/p&gt;

&lt;h2&gt;Krótki opis przykładu&lt;/h2&gt;
&lt;p&gt;Aplikacja pozwala na zapisywanie danych tekstowych, ze wskazaniem rodzica
   dla wprowadzanego tekstu. Po lewej stronie jest &lt;code&gt;combobox&lt;/code&gt; który współdzieli
   model razem z głównym &lt;code&gt;treeview&lt;/code&gt; i pozwala wybrać rodzica. Na prawo od niego
   jest &lt;code&gt;entry&lt;/code&gt; do wprowadzania danych i &lt;code&gt;button&lt;/code&gt; do potwierdzenia i zapisania. Cały przykład to 80 linii kodu, z czego ponad połowa to puste linie i komentarze.
&lt;/p&gt;</content>
		<author>
			<name>Piotr Husiatyński</name>
			<uri>http://husio.homelinux.com/linkpython/</uri>
		</author>
		<source>
			<title type="html">Piotr Husiatynski - Blog - Python</title>
			<subtitle type="html">&lt;h1&gt;Unhandled Exception&lt;/h1&gt;
&lt;p&gt;An unhandled exception was thrown by the application.&lt;/p&gt;</subtitle>
			<link rel="self" href="http://husio.homelinux.com/blog/rss/tag/python/"/>
			<id>http://husio.homelinux.com/blog/rss/tag/python/</id>
			<updated>2010-01-11T10:47:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Zarządzanie danymi tabelarycznymi za pomocą dhtmlxGrid</title>
		<link href="http://www.python.rk.edu.pl/w/p/zarzadzanie-danymi-tabelarycznymi-za-pomoca-dhtmlxgrid/"/>
		<id>http://www.python.rk.edu.pl/w/p/zarzadzanie-danymi-tabelarycznymi-za-pomoca-dhtmlxgrid/</id>
		<updated>2009-12-12T11:24:45+00:00</updated>
		<content type="html">Prosta aplikacja Django zarządzająca danymi tabelarycznymi za pomocą grida dhtmlxGrid stworzonego przez DHTML eXtensions. #django, #javascript, #grid, #xgrid, #dhtmlx</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Licznik aktywnych użytkowników: txActiveUsersCounter</title>
		<link href="http://husio.homelinux.com/blog/post/licznik-aktywnych-uzytkownikow-txactiveuserscounter/"/>
		<id>http://husio.homelinux.com/blog/post/licznik-aktywnych-uzytkownikow-txactiveuserscounter/</id>
		<updated>2009-12-09T20:57:03+00:00</updated>
		<content type="html">&lt;p&gt;Ponieważ niedługo będzie mi prawdopodobnie potrzebny licznik &quot;aktywnych&quot;
   użytkowników na stronie, napisałem szybką implementację opartą na samodzielnym
   serwerze napisanym w twisted oraz pluginie jQuery. Projekt dostępny jest na
   github pod nazwą
   &lt;a href=&quot;http://github.com/husio/txActiveUsersCounter&quot;&gt;txActiveUsersCounter&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Algorytm zliczania jest bardzo prosty. Każdy użytkownik posiada unikalny &lt;code&gt;id&lt;/code&gt;
   generowany na podstawie aktualnej daty i losowej liczby, który przechowuje w
   ciastkach. Przy pobieraniu informacji o ilości osób na stronie, przesyła w
   requeście swój &lt;code&gt;id&lt;/code&gt; i opcjonalnie nazwę grupy. Serwer, jeśli jeszcze nie ma
   takiego &lt;code&gt;id&lt;/code&gt; na liście, zapisuje go na &lt;code&gt;N&lt;/code&gt; sekund, po których wygaśnie. W
   odpowiedzi, zawracana jest liczba &lt;code&gt;id&lt;/code&gt; dla wybranej grupy.
&lt;/p&gt;
&lt;p&gt;To co sprawiło mi najwięcej problemu to znalezienie informacji jak działa
   &lt;a href=&quot;http://docs.jquery.com/Ajax/jQuery.getJSON&quot;&gt;jsonp&lt;/a&gt;, dzięki któremu możliwe
   jest wykonywanie &lt;em&gt;cross domain xhr&lt;/em&gt; . Czytając różne przykłady doszedłem do
   tego, że używając jQuery wystarczy aby w url zawarty był parametr ze znakiem
   &lt;code&gt;?&lt;/code&gt; zamiast wartości, który zastąpiony zostanie przez &lt;code&gt;jsonp&amp;lt;numer&amp;gt;&lt;/code&gt;, którym
   serwer musi opakować zwracany obiekt json. 
&lt;/p&gt;
&lt;p&gt;Przykład: klient wykonuje funkcję &lt;code&gt;$.get&lt;/code&gt; podając jako jeden z argumentów adres &lt;code&gt;http://localhost/?a=1&amp;amp;crossjson=?&lt;/code&gt;, który w efekcie zostanie zamieniony na &lt;code&gt;http://localhost/?a=1&amp;amp;crossjson=jsonp123&lt;/code&gt;. Serwer po odebraniu takiego requesta zwraca
   obiekt json opakowany wartością znajdującą się pod kluczem &lt;code&gt;crossjson&lt;/code&gt;, czyli
   na przykład &lt;code&gt;jsonp123({'random': 4})&lt;/code&gt;.
&lt;/p&gt;</content>
		<author>
			<name>Piotr Husiatyński</name>
			<uri>http://husio.homelinux.com/linkpython/</uri>
		</author>
		<source>
			<title type="html">Piotr Husiatynski - Blog - Python</title>
			<subtitle type="html">&lt;h1&gt;Unhandled Exception&lt;/h1&gt;
&lt;p&gt;An unhandled exception was thrown by the application.&lt;/p&gt;</subtitle>
			<link rel="self" href="http://husio.homelinux.com/blog/rss/tag/python/"/>
			<id>http://husio.homelinux.com/blog/rss/tag/python/</id>
			<updated>2010-01-11T10:47:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Scala - język przyszłości</title>
		<link href="http://blog.zabiello.com/2009/03/28/scala-lang"/>
		<id>tag:blog.zabiello.com:Article1388</id>
		<updated>2009-12-06T01:42:56+00:00</updated>
		<content type="html">&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming&quot;&gt;Kiedy zapytano Jamesa Goslinga&lt;/a&gt; (twórcę Javy) o to, który z języków programowania współpracujących z &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt; (wirtualną maszyną Javy) by użył &lt;em&gt;teraz&lt;/em&gt;, pomijając samą Javę, odpowiedź była zaskakująco szybka i bardzo jasna – &lt;a href=&quot;http://scala-lang.org&quot;&gt;&lt;strong&gt;Scala&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Nazwa “Scala” pochodzi od “&lt;strong&gt;Sca&lt;/strong&gt;lable &lt;strong&gt;la&lt;/strong&gt;nguage” (język skalowalny). Język ten nadaje się równie dobrze do krótkich, zwartych skryptów jak i do tworzenia wydajnych, ogromnych, bezpiecznych systemów sieciowych. W swych założeniach Scala nawiązuje do minimalizmu składni Lispa i Smalltalka (większość rzeczy oparta jest na bibliotekach a nie na składni) dzięki czemu język ten praktycznie nie ma ograniczeń rozwoju i doskonale się skaluje (w miarę potrzeb można tworzyć nowe typy i całe nowe struktury wyglądające jak nowa składnia języka).&lt;/p&gt;


	&lt;p&gt;Scala jest językiem kompilowanym do bytecodu &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt; dzięki czemu potrafi się integrować w sposób praktycznie przezroczysty, z całą platformą Javy (istnieje co prawda implementacja Scali dla platformy .NET ale jest jeszcze niedojrzała). W Scali mamy też wygodną konsolę do interaktywnego testowania kodu (tak jak to jest w Pythonie i Ruby). W Scali każda wartość jest obiektem, każda funkcja zwraca wartość. Zatem każda funkcja też jest obiektem (first class object). Funkcje są też obiektami wyższego rzędu (higher order kinds), można je zagnieżdżać, przekazywać w parametrach, a nawet stosować mechanizm dziedziczenia.&lt;/p&gt;


	&lt;h2&gt;Java jako platforma i jako język&lt;/h2&gt;


	&lt;p&gt;Słowo “Java” oznacza z jednej strony język programowania, z drugiej platformę &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt;. Sam język Java jest co prawda prosty, ale też dosyć toporny. Nic dziwnego, że pada wiele słów krytyki pod jego adresem. Co innego platforma Javy. &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt; jest dopracowana, stabilna i szybka (ze swoim &lt;a href=&quot;http://en.wikipedia.org/wiki/HotSpot&quot;&gt;HotSpotem&lt;/a&gt; potrafi pobić &lt;a href=&quot;http://www.stefankrause.net/wp/?p=6&quot;&gt;kod napisany w języku C&lt;/a&gt;). Biblioteki są dojrzałe i używane masowo w biznesie i instytucjach finansowych. Każda nowość błyskawicznie znajduje swoje odzwierciedleniew Javie (ilość projektów w Javie wielokrotnie przewyższa to, co jest dostępne dla platformy .NET). Platforma Javy mocno prze do przodu i zwiększa stale swoją pozycję. Wydaje się tylko, że sam język nie za bardzo nadąża za tymi zmianami.&lt;/p&gt;


	&lt;p&gt;Gdy Microsoft “wyskoczył” ze swoją koncepcją .NET umożliwiającą tworzenie aplikacji na tą platformę w kilku językach a nie “jedynym prawidłowym”, można było odebrać to jako prztyczek w nos dla starej doktryny lansowanej kiedyś w środowisku Javy (jako jednego języka do wszystkiego). W rzeczy samej, patrząc dziś, Microsoft ze swymi językami zgodnymi z &lt;span class=&quot;caps&quot;&gt;CLR&lt;/span&gt; niczym specjalnym nie zachwyca. Po pierwsze, istnieje dziś już ok. &lt;a href=&quot;http://www.is-research.de/info/vmlanguages/&quot;&gt;240 różnych języków zgodnych z platformą Javy&lt;/a&gt; (jakieś 5x tyle co dla &lt;span class=&quot;caps&quot;&gt;CLR&lt;/span&gt;). Javowe implementacje powstały nawet do języków dynamicznie typowanych (&lt;a href=&quot;http://groovy.codehaus.org&quot;&gt;Groovy&lt;/a&gt;) oraz takich jak Python (&lt;a href=&quot;http://www.jython.org/Project/&quot;&gt;Jython&lt;/a&gt;), Ruby (&lt;a href=&quot;http://jruby.codehaus.org/&quot;&gt;JRuby&lt;/a&gt;), JavaScript (&lt;a href=&quot;http://www.mozilla.org/rhino/&quot;&gt;Rhino&lt;/a&gt;) czy &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; (&lt;a href=&quot;http://www.caucho.com/resin-3.0/quercus/&quot;&gt;Quercus&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;Po drugie, w przeciwieństwie do .NET, Java jest prawdziwie &lt;strong&gt;multiplatformowa&lt;/strong&gt; (istnieje co prawda projekt Mono, ale wciąż odstaje jakością od windowsowego .NET). Mówiąc krótko, platforma Javy trzyma się mocno. Ale sam język jest przestarzały i wszyscy się zastanawiają nad tym, co by mogło go zastąpić. Moim zdaniem, coraz więcej wskazuje, że tym językiem może być &lt;strong&gt;Scala&lt;/strong&gt;. (Swoją drogą język Java tak całkiem to pewnie nigdy nie zniknie. Raczej zredukuje się do miana assemblera &lt;span class=&quot;caps&quot;&gt;XXI&lt;/span&gt; wieku. Zresztą już dziś tak wielu myśli o Javie, jako o assemblerze dla &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt;)&lt;/p&gt;


	&lt;h2&gt;Scala jako pure &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;Scala jest językiem obiektowym w stopniu większym niż Java. W Scali nie ma sztucznego podziału na obiekty i typy prymitywne (int, float, string). Każda wartość jest w Scali pełnym obiektem (choć pod spodem kompilator Scali, tam gdzie się da, sam dokonuje inteligentnych konwersji na javowe prymitywy).&lt;/p&gt;


	&lt;p&gt;Każdy operator jest też metodą. Np. zapis &lt;code&gt;1 + 2&lt;/code&gt; odpowiada dokładnie temu samemu co &lt;code&gt;(1).+(2)&lt;/code&gt;. Innymi słowy obiekt “1” używa tu metody ”+” operującej na parametrze będącym obiektem “2”. A to, że można opuścić nawiasy związane jest z tzw. &lt;strong&gt;notacją operatorową&lt;/strong&gt; jaka jest możliwa Scali. O ile Ruby pozwala opuszczać nawiasy w niektórych sytuacjach (w definicji i wywołaniu metody), to Scala pozwala na opuszczanie ich w wypadku każdej metody pomiędzy dwoma wyrażeniami. W efekcie Scala pozwala na pisanie testów &lt;span class=&quot;caps&quot;&gt;BDD&lt;/span&gt; &lt;a href=&quot;http://code.google.com/p/specs/&quot;&gt;przypomijących jeszcze bardziej język naturalny&lt;/a&gt; niż &lt;a href=&quot;http://rspec.info&quot;&gt;RSpec&lt;/a&gt; do Ruby’ego (też &lt;a href=&quot;http://code.google.com/p/scalaz/&quot;&gt;scalaz&lt;/a&gt;, &lt;a href=&quot;http://www.artima.com/scalatest/&quot;&gt;scalatest&lt;/a&gt;). Także tworzenie nowych języków specjalnego zastosowania, tzw. &lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt;’i, dzięki notacji operatorowej &lt;a href=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=251945&quot;&gt;wyglądają w Scali ładniej niż w Ruby&lt;/a&gt;. W ramach żartu pokazującego elastyczność składni Scali napisano nawet &lt;a href=&quot;http://blog.fogus.me/2009/03/26/baysick-a-scala-dsl-implementing-basic/&quot;&gt;interpreter języka &lt;span class=&quot;caps&quot;&gt;BASIC&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;W Scali, w przeciwieństwie do Javy, nie ma też statycznych metod ani zmiennych (żałosne jest to, że tak nieobiektowe konstrukcje w ogóle wprowadzono do &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;). Zamiast nich Scala używa singletonów i metod klasowych. Oczywistą przewagą takiego podejścia jest m.in. możliwość dziedziczenia.&lt;/p&gt;


	&lt;p&gt;Podczas gdy Ruby i Python trzymają definicje metod klasowych i instancji razem, Scala trzyma je zgrupowane oddzielnie.&lt;/p&gt;


&lt;pre class=&quot;brush:python&quot;&gt;
# Python:
class C(Object):
    def metoda_instancji(self):
        return &quot;Jestem metodą instancji&quot; 
    @classmethod
    def metoda_klasowa(cls):
        return &quot;Jestem metodą klasową&quot; 
print C.metoda_klasowa()
print C().metoda_instancji
&lt;/pre&gt;

&lt;pre class=&quot;brush:ruby&quot;&gt;
# Ruby:
class C
  def self.metoda_klasowa
    &quot;Jestem metodą klasową&quot; 
  end
  def metoda_instancji
    &quot;Jestem metodą instancji&quot; 
  end                       
end
puts C.metoda_klasowa
puts C.new.metoda_instancji
&lt;/pre&gt;

&lt;pre class=&quot;brush:scala&quot;&gt;
# Scala
class C {
  def metoda_instancji = 
    &quot;Jestem metodą instancji&quot;    
}          
object C {
  def metoda_klasowa = 
    &quot;Jestem metodą klasową&quot; 
} 
println((new C).metoda_instancji)
println(C.metoda_klasowa)         
&lt;/pre&gt;

	&lt;h3&gt;Scala jako język statycznie typowany z inteligentną inferencją typów&lt;/h3&gt;


	&lt;p&gt;Scala jest językiem &lt;strong&gt;statycznie typowanym&lt;/strong&gt;. Z pewnością ucieszy to tych, co nie chcą pisać tony dodatkowych testów jednostkowych. Statyczna kontrola typów zapewnia większą kontrolę nad kodem. Można się zdziwić, jakim cudem przedstawiony wyżej kod działa, skoro nie ma w nim żadnej deklaracji typów. Właściwie to powyższa deklaracja klas i singletonu formalnie wygląda tak&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;
class C {
  def metoda_instancji(): String = 
    return &quot;Jestem metodą instancji&quot;;
}          
object C {
  def metoda_klasowa(): String = 
    return &quot;Jestem metodą klasową&quot;;
} 
&lt;/pre&gt;

	&lt;p&gt;Jednak nie trzeba pisać tak rozwleklego kodu. Scala posiada wyrafinowany mechanizm &lt;strong&gt;inferencji typów&lt;/strong&gt; pozwalający na ograniczenie niepotrzebnego deklarowania typów w wypadkach kiedy kompilator jest w stanie to sobie samemu wywnioskować (podobną inferencję typów stosują inne języki, np. Haskell).&lt;/p&gt;


	&lt;p&gt;W Scali także (podobnie jak w Ruby czy JavaScript) końcowe średniki zamykające wyrażenie można pominąć,  nawiasy dla metod bez parametrowych są opcjonalne i nie trzeba używać komendy &lt;code&gt;return&lt;/code&gt; aby zwrócić wartość z metody. W Scali (podobnie jak w Ruby) zawsze zwracana jest ostatnia wartość wyrażenia.&lt;/p&gt;


	&lt;p&gt;Scala, podobnie jak Java i Ruby, nie posiada dziedziczenia wielobazowego. W przeciwieństwie do Javy, Scala nie posiada interfejsów. I bardzo dobrze, bo ich przydatność jest wysoce wątpliwa (oczywiście do &lt;span class=&quot;caps&quot;&gt;PHP5&lt;/span&gt; dodano bezmyślnie te nieszczęsne interfejsy). Ich główną wadą jest to, że nie mogą posiadać żadnej implementacji ani deklaracji zmiennych. Z kolei klasy abstrakcyjne w Javie mogą posiadać częściową implementację, ale nie można dziedziczyć po wielu klasach abstrakcyjnych tylko po interfejsach które nie mają żadnej implementacji. Bardzo niewygodne. Scala rozwiązuje ten problem za pomocą traits. Traits działają podobnie do modułów w Ruby. Nie mają konstruktorow ani nie można stworzyć ich instancji więc odpada efekt konfliktu kolejności konstruktorów. Traits mogą jednak podlegać dziedziczeniu, mogą mieć częściową lub pełną implementację metod, oraz mogą posiadać zadeklarowane zmienne. I każda klasa może dziedziczyć po kilku traitsach. Proste i wygodne.&lt;/p&gt;


	&lt;h3&gt;Niejawne konwersje (implicit conversion)&lt;/h3&gt;


	&lt;p&gt;Idea niejawnych konwersji nie jest w zasadzie niczym nowa. Występuje już w języku C. Gdy dodawane są dwie zmienne o typach &lt;code&gt;short&lt;/code&gt; i &lt;code&gt;long&lt;/code&gt; to ta pierwsza zostaje domyślnie przekształcona do &lt;code&gt;long&lt;/code&gt;. Nie trzeba wykonywać żadnego jawnego rzutowania typu.&lt;/p&gt;


	&lt;p&gt;Scala idzie dalej. Za pomocą mechanizmu implicit conversions potrafi uzyskać efekty podobne jak w Ruby, ale bardziej bezpieczne. Zobaczmy jednak wpierw jak to się robi Ruby (który wykorzystuje swoją koncepcję &lt;a href=&quot;http://blog.zabiello.com/2006/03/04/dynamika-otwartych-klas-ruby-vs-python&quot;&gt;otwartych klas&lt;/a&gt;).&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
class Integer
  def kb
    self * 1024
  end     
  def mb
    self * 1024 * kb
  end  
end                   

class String 
  def welcome
    &quot;Hello &quot; + self
  end
end

puts 10.kb # =&amp;gt; 10240
puts 10.mb # =&amp;gt; 10485760
puts &quot;Jarek&quot;.welcome # =&amp;gt; Hello Jarek
&lt;/pre&gt;           

	&lt;p&gt;Co prawda Ruby potrafi “zamrozić” swoje obiekty uniemożliwiając ich modyfikację&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
Fixnum.freeze

class Integer
  def kb
    self * 1024
  end
end   
# =&amp;gt; TypeError: can't modify frozen class                     
&lt;/pre&gt;           

	&lt;p&gt;ale technika ta (zwana też trochę niepoprawnie jako “monkey patching”) jest używana dosyć powszechnie w Ruby. Główną jej wadą jest to, że takie zmiany w klasach są &lt;strong&gt;globalne&lt;/strong&gt; i to może prowadzić do różnych nieporozumień w innych częściach kodu.&lt;/p&gt;


	&lt;p&gt;Scala nie ma tego problemu. Pozwala na uzyskanie podobnych efektów bez konieczności globalnych zmian w obiekcie. Zamiast otwierania klas, Scala dodaje definicje niejawnych konwersji. Jeśli wywołujemy metodę obiektu której on nie posiada, Scala patrzy na leksykalny kontekst definicji dostępnych konwersji dla danego typu (jak pamietamy, Scala jest językiem statycznie typowanym). Jeśli znajdzie sygnaturę metody taką jak nazwa wywoływanej metody, użyje jej tak jakby należała do obiektu.&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
class StrConvert(s: String) {
  def welcome = &quot;Hello &quot; + s
}                         

class IntConvert(x: Int) {
   def kb = 1024 * x
   def mb = x * 1024 * kb
}                    

implicit def str_convert(s: String) =  new StrConvert(s)
implicit def int_convert(i: Int) =  new IntConvert(i)

println(10.kb)
println(2 mb)
println(&quot;Jarek&quot; welcome)
&lt;/pre&gt;           

	&lt;p&gt;Kropki w wywołaniach metod są oczywiście w Scali opcjonalne ze względu na notację operatorową.&lt;/p&gt;


	&lt;p&gt;Niejawne konwersje Scali przydają się w wypadku korzystania z cudzego kodu. Nie musimy (tak jak w Ruby) ingerować i zmieniać cudzych bibliotek. Zamiast tego wystarczy dodać lokalne definicje niejawnych konwersji typów. Przykładem toporności i ograniczeń Javy jest konieczność korzystania z innej składni do operacji na typach &lt;code&gt;BigInteger&lt;/code&gt;. Jeśli początkowo pisaliśmy kod używający zwykłych typów &lt;code&gt;int&lt;/code&gt; to w wypadku kiedy musi on operować na większych liczbach, czeka nas niezła refaktoryzacja kodu a kod mógłby wyglądać mniej więcej tak jak poniższy kod (przykład dotyczy składni Scali w ktorej też można pisać po “javowemu”)&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;                        
import java.math.BigInteger 

def factorial(x: BigInteger): BigInteger = 
 if (x == BigInteger.ZERO) 
   BigInteger.ONE 
 else 
   x.multiply(factorial(x.subtract(BigInteger.ONE)))      
&lt;/pre&gt;           

	&lt;p&gt;Dzięki możliwościom implicit conversion, znacznie wygodniej jest pisać tak:&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
def factorial(x: BigInt): BigInt = 
 if (x == 0) 1 else x * factorial(x - 1) 
&lt;/pre&gt;

	&lt;p&gt;Warto zwrócić uwagę, że to nie jest jakaś dodana nowa składnia do Scali. Wrapper do BigInt jest stworzony w bibliotece. Nie trzeba żadnego przebudowania kodu Scali tak, jak to musi być uczynione w innych językach.&lt;/p&gt;


	&lt;h2&gt;Scala jako język funkcyjny (FP)&lt;/h2&gt;


	&lt;p&gt;Mam wrażenie, że programowanie funkcyjne przeżywa jakiś swój renesans. Od jakiegoś czasu więcej słychać o &lt;a href=&quot;http://erlang.org/&quot;&gt;Erlangu&lt;/a&gt;, &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; (świetny dialekt Lispa w Javie), &lt;a href=&quot;http://www.haskell.org/&quot;&gt;Haskellu&lt;/a&gt; czy &lt;a href=&quot;http://www.infoq.com/news/2009/03/F-Sharp-Don-Syme&quot;&gt;F#&lt;/a&gt;. Zalety programania funkcyjnego w stosunku do programowania imperatywnego są znane. Przede wszystkim, brak zmiennych i brak efektów ubocznych. Odpadają problemy związane z synchronizacją wątków, semaforami i blokowaniem dostępu do wspólnych obszarów pamięci. Kod pisany funkcyjnie znacznie łatwiej jest też testować. Funkcja niczym ma tylko jedno wejście i jedno wyjście. Nic innego ukradkiem nie zmieni. Programowanie funkcyjne jest też prostsze, choć osoby spaczone latami spędzonymi na programowaniu imperatywnym, mogą mieć na początku pewne problemy z przestawieniem sposobu myślenia. Np. w typowo funkcyjnym podejściu nie ma w ogóle pętli w programie. Zastępuje ją rekursja (która nie przepełnia stosu, jest to tzw. &lt;a href=&quot;http://oldfashionedsoftware.com/2008/09/27/tail-recursion-basics-in-scala/&quot;&gt;tail recursion&lt;/a&gt;)&lt;/p&gt;


	&lt;p&gt;Przykład różnic w podejściu imperatywnym oraz funkcyjnego dla Ruby’ego i Scali.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Ruby:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
# Podejście imperatywne:

class Imper
  attr_accessor :x, :y
  def initialize(x,y)
    @x, @y = x, y
  end     
  def move_by(dx, dy)
    @x += dx
    @y += dy
  end
  def show
    puts &quot;x:#{x}, y:#{y}&quot; 
  end
end                                                                

x = Imper.new(1,2)
x.move_by(3,4)
x.show

# To samo funkcyjnie:

class Func
  attr_reader :x, :y
  def initialize(x,y)
    @x, @y = x, y
  end     
  def move_by(dx, dy)
    Func.new(@x+dx, @y+dy)
  end
  def show
    puts &quot;x:#{x}, y:#{y}&quot; 
  end
end

x = Func.new(1,2)
x = x.move_by(3,4)
x.show        

# lub to samo, ale bez tworzenie zmiennych:

Func.new(1,2).move_by(3,4).show
&lt;/pre&gt;

	&lt;p&gt;&lt;strong&gt;Scala:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
// Kod w stylu imperatywnym:

class Imper(x: Int, y: Int) {
  var iks: Int = x
  var igrek: Int = y           
  def move_by(dx: Int, dy: Int) {
    iks += dx
    igrek += dy
  }
  def show {
    println(iks,igrek)
  }
}                 
val p = new Imper(1,2)
p.move_by(3,4)
p.show

// i to samo funkcyjnie:

class Func(x: Int, y: Int) {
  val iks: Int = x
  val igrek: Int = y           
  def move_by(dx: Int, dy: Int) = new Func(iks+dx, igrek+dy)
  def show {
    println(iks,igrek)
  }
}                 
(new Func(1,2)).move_by(3,4).show
&lt;/pre&gt;

	&lt;p&gt;Obiekty deklarowane jako &lt;code&gt;val&lt;/code&gt; są niemutowalne, nie można zmienić ich wartości (odpowiadają javowej deklaracji &lt;code&gt;final&lt;/code&gt;). Z kolei deklaracja &lt;code&gt;var&lt;/code&gt; oznacza zmienne mutowalne, mogące zmienić swoją wartość.&lt;/p&gt;


	&lt;p&gt;Kod pisany funkcyjnie, może być znacznie krótszy, prostszy i tym samym mniej podatny na błędy. Zobaczmy, jak bardzo można zredukować w Scali kod napisany w stylu imperatywnym do funkcyjnego (przykład z książki “Programming in Scala”)&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
def printArgs(args: Array[String]): Unit = { 
  var i = 0 
  while (i &amp;lt; args.length) { 
    println(args(i)) 
    i += 1 
  } 
}
&lt;/pre&gt;

	&lt;p&gt;Pozbywamy się zmiennej var:&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
def printArgs(args: Array[String]): Unit = { 
  for (arg &amp;lt;- args) 
    println(arg) 
} 
&lt;/pre&gt;

	&lt;p&gt;To samo, inaczej wyrażone:&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
def printArgs(args: Array[String]): Unit = { 
  args.foreach(println) 
} 
&lt;/pre&gt;

	&lt;p&gt;Metoda nie jest jeszcze “czysto” funkcyjna bo posiada efekt uboczny w postaci drukowania wartości w funkcji &lt;code&gt;println&lt;/code&gt;. Pozbywamy się więc i jej.&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
def formatArgs(args: Array[String]) = args.mkString(&quot;\n&quot;) 
&lt;/pre&gt;

	&lt;p&gt;Wywołanie:&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
println(formatArgs(args))
&lt;/pre&gt;

	&lt;h3&gt;Warunki zwracające wynik&lt;/h3&gt;


	&lt;p&gt;W Scali &lt;strong&gt;warunki logiczne także zwracają wartość&lt;/strong&gt;. Weźmy na przykład kwestię operatora trynarnego. W wielu językach można spotkać (odziedziczoną po C) następującą składnię:&lt;/p&gt;


&lt;pre class=&quot;brush:cpp&quot;&gt;                          
wynik = warunek ? wyrazenie1 : wyrazenie2
&lt;/pre&gt;

	&lt;p&gt;Przez wiele lat w Pythonie trzeba było pisać w taki sposób:&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;                          
if warunek:
    wynik = wyrazenie1
else:
    wynik = wyrazenie2
&lt;/pre&gt;

	&lt;p&gt;Pod naciskiem społeczności, Guido van Rossum dodał w końcu odpowiednik takiej konstrukcji i teraz można pisać tak:&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;                          
wynik = wyrazenie1 if warunek else wyrazenie2
&lt;/pre&gt;

	&lt;p&gt;Tymczasem w Scali taki problem jest zupełnie sztuczny. Skoro warunek zwraca wynik, to nie trzeba wymyślać żadnej nowej składni naśladującej język C. Wystarczy po prostu napisać:&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
val wynik = if (warunek) wyrazenie1 else wyrazenie2
&lt;/pre&gt;

	&lt;p&gt;Ogólnie, cała Scala promuje podejście funkcyjne, ale nie zmusza do niego. Scala nie stosuje oddzielnych nazw dla wersji mutowalnej i niemutowalnej. Dzięki temu unika się niepotrzebnego refactoringu kodu w wypadku potrzeby zmiany jednej wersji na drugą.&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://blog.zabiello.com/images/articles/scala-lang.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;Domyślnie typy są niemutowalne.&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
scala&amp;gt; val x = Map[Int, String]() 
# =&amp;gt; x: scala.collection.immutable.Map[Int,String] = Map()
&lt;/pre&gt;

	&lt;p&gt;Aby mieć tym mutowalny, trzeba to jawnie wskazać.&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;                          
scala&amp;gt; import scala.collection.mutable.Map
scala&amp;gt; val x = Map[Int, String]()         
# =&amp;gt; x: scala.collection.mutable.Map[Int,String] = Map()
&lt;/pre&gt;

	&lt;h2&gt;Lift – komponentowy framework w Scali&lt;/h2&gt;


	&lt;p&gt;Mówiąc o Scali nie sposób nie wspomnieć o świetnym frameworku webowym jakim jest &lt;a href=&quot;http://liftweb.net/&quot;&gt;Lift&lt;/a&gt;. Framework ten inspirowany jest różnymi frameworkami (głównie &lt;a href=&quot;http://wicket.apache.org/&quot;&gt;Wicket’em&lt;/a&gt; ale też  Django, Rails czy smalltalkowym Seaside). Lift jest przede wszystkim frameworkiem &lt;strong&gt;komponentowym&lt;/strong&gt; (odcina się tu od klasycznego modelu &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; promowanego przez Rails). Podejście komponentowe ma przewagę nad &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt;, dużo lepiej się nadaje do złożonych aplikacji (innym przykładem dobrego podejścia komponentowego jest pythonowy &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; – &lt;a href=&quot;http://plone.org&quot;&gt;Plone&lt;/a&gt;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://github.com/tjweir/liftbook/tree&quot;&gt;Lift Book&lt;/a&gt; – darmowa, dostępna online (najnowsza wersja &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt; jest na dole strony: &lt;a href=&quot;http://groups.google.com/group/the-lift-book&quot;&gt;http://groups.google.com/group/the-lift-book&lt;/a&gt;)&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.apress.com/book/view/1430224215&quot;&gt;Exploring Lift: Scala-based Web Framework&lt;/a&gt; – książka (dostępna jeszcze w wersji roboczej)&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/interviews/Lift-Scala-David-Pollak&quot;&gt;David Pollak On Lift Framework and Scala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2008/02/integrating-flex-blazeds-scala&quot;&gt;Derek Wischusen on Integrating Flex, BlazeDS and Scala/Lift&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Inne frameworki:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/sweetscala/&quot;&gt;SweetScala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt; &lt;a href=&quot;http://github.com/alandipert/step/tree/master&quot;&gt;Step&lt;/a&gt; – wzorowany na &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatrze&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/sweetscala/&quot;&gt;SweetScala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://github.com/pk11/pinky&quot;&gt;Pinky&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/webflavor/&quot;&gt;Webflavor&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Podsumowując.&lt;/h2&gt;


	&lt;p&gt;Scala to nowoczesny język będący hybrydą pure &lt;span class=&quot;caps&quot;&gt;OOP&lt;/span&gt; i FP, statycznie typowany ale z inteligentną inferencją typów, o bardzo elastycznej składni i kompilowana do bytecodu &lt;span class=&quot;caps&quot;&gt;JVM&lt;/span&gt;. Dzięki zaawansowanej inferencji typów i implicit conversions nie odczuwa się narzutu związanego z faktem że Scala jest statycznie typowana (a dostaje zalety ściślejszej kontroli kodu). Scala nie ma operatorów, operatory są zwykłymi metodami definiowanymi w bibliotekach.&lt;/p&gt;


	&lt;p&gt;Jednak tym co jest największym atutem Scali to jej &lt;strong&gt;minimalizm składniowy&lt;/strong&gt;. Scala umożliwia &lt;strong&gt;tworzenie nowych typów i struktur językowych bez konieczności zmian w samej zasadniczej składni języka&lt;/strong&gt;. To oznacza, źe podobnie jak Lisp, Scala nie ma praktycznie żadnych ograniczeń w rozwoju. Tym samym Scala jest w stanie przetrwać różne tendencje i upodobania składniowe i “przeskalować” się do nowych potrzeb.&lt;/p&gt;


	&lt;p&gt;Scalę używa już gdzieś parę banków w UK. Na Scalę &lt;a href=&quot;http://gojko.net/2009/03/16/qcon-london-2009-upgrading-twitter-without-service-disruptions/&quot;&gt;niedawno przeszedł Twitter&lt;/a&gt;, ma wkrótce przejść też &lt;a href=&quot;http://github.com&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;


	&lt;h2&gt;Linki&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt; &lt;a href=&quot;http://www.scala-lang.org/&quot;&gt;&lt;strong&gt;Scala&lt;/strong&gt; – strona domowa&lt;/a&gt;          &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.artima.com/scalazine&quot;&gt;&lt;strong&gt;Scalizine (a magazine for the Scala programming communitty)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.erudis.pl/pl/node/154&quot;&gt;Podstawy język Scala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2008/03/liftweb&quot;&gt;David Pollak on lift and Scala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://stuq.nl/weblog/2008-11-24/scala-basics-what-is-scala&quot;&gt;Scala basics: What is Scala?&lt;/a&gt;  &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://stuq.nl/weblog/2009-02-04/download-the-basic-and-wicket-scala-talk-materials&quot;&gt;Basic and Wicket Scala talk materials&lt;/a&gt;                                                                                                                &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.artima.com/scalazine/articles/steps.html&quot;&gt;First Steps to Scala&lt;/a&gt;         &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://blog.jaoo.dk/2009/03/09/an-introduction-to-the-scala-programming-language-by-bill-venners/&quot;&gt;An introduction to the Scala programming language&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://scala.sygneca.com/&quot;&gt;Scala Wiki&lt;/a&gt;  &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.nabble.com/Scala-Programming-Language-f20934.html&quot; title=&quot;forum&quot;&gt;Scala Programming Language&lt;/a&gt;   &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.codecommit.com/blog/scala/roundup-scala-for-java-refugees&quot;&gt;Scala for Java Refugees&lt;/a&gt; &lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers&quot;&gt;Scala for Java programmers&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://wiki.netbeans.org/Scala&quot;&gt;Scala Plugins for NetBeans&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://blogtrader.net/dcaoyuan/entry/scala_netbeans_maven_and_yes&quot;&gt;Scala, NetBeans, Maven, and yes, Lift now&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.parleys.com/display/PARLEYS/Home#talk=27131945;slide=1;title=The%20Feel%20Of%20Scala&quot;&gt;The Feel of Scala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://scala-blogs.org/&quot;&gt;Agregator blogów o Scali&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/scala-melb/web/videos-and-podcasts-about-scala?pli=1&quot;&gt;Online Books, Videos &amp;amp; Podcasts about Scala&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Kanały &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt;: &lt;a href=&quot;irc://irc.eu.freenode.net/scala&quot;&gt;#scala&lt;/a&gt;, &lt;a href=&quot;irc://irc.eu.freenode.net/scala.pl&quot;&gt;#scala.pl&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;



&lt;br /&gt;&lt;br /&gt;
      &lt;/div&gt;</content>
		<author>
			<name>Jarosław Zabiełło</name>
			<uri>http://blog.zabiello.com</uri>
		</author>
		<source>
			<title type="html">Jarosław Zabiełło - BLOG : Tag python, everything about python</title>
			<subtitle type="html">moje notatki, linki, komentarze</subtitle>
			<link rel="self" href="http://blog.zabiello.com/tag/python.atom"/>
			<id>tag:blog.zabiello.com:tagpython</id>
			<updated>2010-02-10T22:51:36+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python 2.7 alpha 1</title>
		<link href="http://www.python.org.pl/python,27,alpha,1.html"/>
		<id>http://www.python.org.pl/python,27,alpha,1.html</id>
		<updated>2009-12-05T21:55:49+00:00</updated>
		<content type="html">Benjamin Peterson ogłosił na grupie dyskusyjnej python-dev wydanie pierwszej wersji alfa Pythona 2.7. Jest to ostatnia zaplanowana wersja z linii 2.x.  
     
   W wydaniu tym znajdziemy wiele elementów, które ukazały się w Pythonie 3.1, między innymi:  
   - szybszy moduł io  
   - słownik pamiętający kolejność dodawania elementów PEP372  
   - nowa składnia dla zagnieżdżonego with  
     
   Pełna lista zmian jak zwykle znajduje się na stronie &quot;Whats New&quot; w dokumentacji Pythona 2.7.  
     
   Celem wydania Pythona 2.7 poza przeportowaniem ważniejszych zmian z 3.x jest ułatwienie migracji właśnie do Pythona 3.x, ułatwić to ma rozwijany skrypt py2to3, który automatycznie zmienia składnie na zgodną z trójką. Innym elementem jest dodanie kolejnych ostrzeżeń przy uruchamiania pythona z flaga -3, dzięki czemu można pisać kod, który będzie prostszy do portowania.  
     
   Jak zwykle zachęcamy do testowania i zgłaszania błędów na stornie: bugs.python.org  
     
   Pobierz: Python 2.7  
     
   Źródło: python.org</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wdrożenie Django na michaelmoore.com</title>
		<link href="http://www.python.rk.edu.pl/w/p/wdrozenie-django-na-michaelmoorecom/"/>
		<id>http://www.python.rk.edu.pl/w/p/wdrozenie-django-na-michaelmoorecom/</id>
		<updated>2009-11-28T13:10:34+00:00</updated>
		<content type="html">Opis wdrożenia Django i powiązanych technologii na nowej wersji serwisu michaelmoore.com</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Migracja Mozilla Addons na Django</title>
		<link href="http://www.python.rk.edu.pl/w/p/migracja-mozilla-addons-na-django/"/>
		<id>http://www.python.rk.edu.pl/w/p/migracja-mozilla-addons-na-django/</id>
		<updated>2009-11-28T12:46:08+00:00</updated>
		<content type="html">Streszczenie wpisu na blogu All Night Diner zawierającego powody i zalety zastąpienia CakePHP przez Django dla serwisu Mozilla Addons.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Prosta aplikacja Django prezentująca dane z PyEphem</title>
		<link href="http://www.python.rk.edu.pl/w/p/prosta-aplikacja-django-prezentujaca-dane-z-pyephem/"/>
		<id>http://www.python.rk.edu.pl/w/p/prosta-aplikacja-django-prezentujaca-dane-z-pyephem/</id>
		<updated>2009-11-28T11:58:13+00:00</updated>
		<content type="html">Tworzymy prostą aplikację Django wyświetlającą dane generowane przez PyEphem przydatne przy obserwacji planet i Księżyca</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">PyDev 1.5.1</title>
		<link href="http://www.python.org.pl/pydev,151.html"/>
		<id>http://www.python.org.pl/pydev,151.html</id>
		<updated>2009-11-21T12:23:13+00:00</updated>
		<content type="html">Pomimo opóźnień spowodowanych pewnymi zmianami w silniku refaktoryzacji pluginu oraz kilkoma mniejszymi problemami, wydano w końcu nową wersję PyDev - 1.5.1. Przygotowując poprzednią wersję, skupiono się przede wszystkim na zwiększeniu komfortu programisty poprzez m.in.: włączenie kodu PyDev extensions do projektu PyDev czy dodanie wsparcia dla IronPython. W najnowszej wersji natomiast, developerzy, oprócz rutynowego debugowania, udoskonalili rewriter AST oraz silnik refaktoryzacji pluginu.  
     
   Zmiany zaszłe w silniku refaktoryzacji, to m.in.:


 
     rezygnacja z BRM,
 

 
     włączenie kodu najnowszego wydania PEPTIC do projektu,
 

 
     dodanie opcji dodaj po bieżącej metodzie do metody wydobywania,
 

 
     możliwość generowania właściwości przy użyciu stylu programowania zdefiniowanego w preferencjach.
 

Z poprawionych błędów wymienić można:


 
     drobne poprawki edytora,
 

 
     naprawienie prawidłowego wykorzystywania znaku Backspace w trybie blokowym,
 

 
     ustawianie IRONPYTHONPATH podczas korzystania z IronPythona (projekty nie mogą odwoływać się do siebie),
 

 
     używanie funkcji exec w Py3k,
 

 
     usunięcie problemu z importowaniem modułu regexp, który mógł wywołać rekurencję;
 

Fabio Zadrozny oznajmił, że podczas prac nad następnymi wersjami PyDev, developerzy bardziej skupią się na wykrywaniu i naprawianiu błędów oraz stworzeniu sesji profilujących (odpowiedzialnych za prędkość i wykorzystanie pamięci).  
     
   Źródło: PyDev</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Ferie zimowe z Pythonem</title>
		<link href="http://www.python.org.pl/ferie,zimowe,z,pythonem.html"/>
		<id>http://www.python.org.pl/ferie,zimowe,z,pythonem.html</id>
		<updated>2009-11-17T23:46:55+00:00</updated>
		<content type="html">Jeżeli nie macie jeszcze planów na spędzenie noworocznych ferii zimowych, to zachęcam Was do wzięcia udziału w kolejnym bezpłatnym obozie Advanced Scientific Programming In Python. Odbędzie się on w dniach 8-12 lutego 2010, na Wydziale Fizyki Uniwersytetu Warszawskiego. Organizatorami imprezy są G-Node (German Neuroinformatics Node) i FUW.  
     
   Obóz kierowany jest do osób, które na co dzień zajmują się tworzeniem symulacji naukowych oraz analizą danych. W czasie jego trwania zostanie przedstawiony wybór zaawansowanych technik programowania w Pythonie, na podstawie teoretycznych wykładów i ćwiczeń praktycznych.  
     
   Aby wziąć udział w tej imprezie, należy do dnia 6 grudnia zgłosić swój profil, zawierający pełne dane kontaktowe, CV i odpowiedzi do poniższych pytań:


 What is your educational background?


 

 What experience do you have in programming?


 

 Why do you think Advanced Scientific Programming in Python is an appropriate course for your skill profile?


 

Zgłoszenia wysyłamy na: python-winterschool@g-node.org  
     
   W związku z tym, że ilość miejsc jest ograniczona, zostanie przeprowadzona selekcja profili. Status zakwalifikowania będzie znany już 14 grudnia, powiadomienia zostaną rozesłane drogą e-mailową.  
     
   W celu pozyskania większej ilości informacji, typu agenda, dojazd na miejsce czy proponowane zakwaterowanie, zapraszam do odwiedzin strony głównej obozu.</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">PyEphem - obliczenia astronomiczne dla Układu Słonecznego</title>
		<link href="http://www.python.rk.edu.pl/w/p/pyephem-obliczenia-astronomiczne-dla-ukladu-slonecznego/"/>
		<id>http://www.python.rk.edu.pl/w/p/pyephem-obliczenia-astronomiczne-dla-ukladu-slonecznego/</id>
		<updated>2009-11-14T15:32:26+00:00</updated>
		<content type="html">Wyliczamy położenie, konstelację i inne dane obiektów Układu Słonecznego (planety, księżyce) oraz jasnych gwiazd z poziomu Pythona. #python, #astronomia</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Obsługa silnika JavaScript w Pythonie za pomocą python-spidermonkey</title>
		<link href="http://www.python.rk.edu.pl/w/p/obsluga-silnika-javascript-w-pythonie-za-pomoca-python-spidermonkey/"/>
		<id>http://www.python.rk.edu.pl/w/p/obsluga-silnika-javascript-w-pythonie-za-pomoca-python-spidermonkey/</id>
		<updated>2009-11-14T14:39:55+00:00</updated>
		<content type="html">Moduł python-spidermonkey udostępnia API na niezależny silnik JavaScript SpiderMonkey, co umożliwia wykonywanie kodu JavaScript w skryptach Pythona #python, #javascript, #spidermonkey</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">PEP 3003 - Python zamrożony na najbliższe lata</title>
		<link href="http://www.python.org.pl/pep,3003,,python,zamrozony,na,najblizsze,lata.html"/>
		<id>http://www.python.org.pl/pep,3003,,python,zamrozony,na,najblizsze,lata.html</id>
		<updated>2009-11-10T22:00:40+00:00</updated>
		<content type="html">W październiku Guido van Rossum zaproponował ustanowienie moratorium, na dalsze zmiany w syntaktyce i semantyce języka. Za zgodą społeczności, plan udało się wcielić w życie.  
     
   Efektem jest PEP 3003 ogłaszający czasowe zawieszenie wszelkich zmian w języku, na okres przynajmniej dwóch lat od wydania Pythona 3.1. A to znaczy, że objęty tym zostanie jeszcze Python 3.2, a nowe elementy języka będą mogły zostać wprowadzone najwcześniej w wydaniu 3.3. Wg. autorów ww. PEP'a, Bretta Cannona, Jesse'a Nollera, Guido van Rossuma, pozwoli to twórcom alternatywnych implementacji Pythona nadążać za rdzenną implementacją języka oraz ułatwi akceptację serii 3.x i stworzenie &quot;stabilniejszej bazy dla społeczności&quot;.  
     
   Po dłuższej debacie, uznano że wszelkie wprowadzane obecnie zmiany nie znalazłyby uznania wśród użytkowników. Powodem tego jest najczęściej ograniczenie w postaci udostępniania starszej wersji interpretera, nakładana przez dostawców hostingu. Większość dostawców nadal oferuje wydania z gałęzi 2.x, podczas gdy gałąź 3.x jest zazwyczaj uznawana za niestabilną i zbyt młodą, aby używać jej na serwerach. Moratorium nie dotyczy C API, które można nadal modyfikować pod warunkiem nienaruszania spójności standardowej implementacji Pythona (CPython).  
     
   Okres obowiązywania moratorium może zostać przedłużony tylko poprzez nowy PEP.  
     
   Źródło: Python Enhancement Proposal 3003</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wykorzystanie WebKit/PyQt4 do zbierania danych, część 3</title>
		<link href="http://www.python.rk.edu.pl/w/p/wykorzystanie-webkitpyqt4-do-zbierania-danych-czesc-3/"/>
		<id>http://www.python.rk.edu.pl/w/p/wykorzystanie-webkitpyqt4-do-zbierania-danych-czesc-3/</id>
		<updated>2009-11-08T08:25:23+00:00</updated>
		<content type="html">Tworzymy aplikację pobierającą finalne dane o reklamach zapisanych w bazie danych z wykorzystaniem QtWebKit #python, #pyqt, #pyqt4, #reklama</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Obsługa usług Google za pomocą xgoogle</title>
		<link href="http://www.python.rk.edu.pl/w/p/obsluga-uslug-google-za-pomoca-xgoogle/"/>
		<id>http://www.python.rk.edu.pl/w/p/obsluga-uslug-google-za-pomoca-xgoogle/</id>
		<updated>2009-11-06T10:17:46+00:00</updated>
		<content type="html">Moduł xgoogle umożliwia wyszukiwanie dla podanej frazy, w tym także wyszukiwanie linków płatnych. Obsługuje także Google Sets i Google Translator. #python, #google, #translator, #seo</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wykorzystanie WebKit/PyQt4 do zbierania danych, część 2</title>
		<link href="http://www.python.rk.edu.pl/w/p/wykorzystanie-webkitpyqt4-do-zbierania-danych-czesc-2/"/>
		<id>http://www.python.rk.edu.pl/w/p/wykorzystanie-webkitpyqt4-do-zbierania-danych-czesc-2/</id>
		<updated>2009-11-02T17:55:32+00:00</updated>
		<content type="html">Wyciąganie odnośników reklam z kodu stron, zapisywanie danych w bazie za pomocą QtSql #python, #pyqt, #pyqt4, #adtaily</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wykorzystanie WebKit/PyQt4 do zbierania danych, część 1</title>
		<link href="http://www.python.rk.edu.pl/w/p/wykorzystanie-webkitpyqt4-do-zbierania-danych-czesc-1/"/>
		<id>http://www.python.rk.edu.pl/w/p/wykorzystanie-webkitpyqt4-do-zbierania-danych-czesc-1/</id>
		<updated>2009-10-31T09:59:21+00:00</updated>
		<content type="html">Wykorzystanie QtWebKit do stworzenia aplikacji zbierającej dane o reklamach dostępnych na wskazanych serwisach #python, #pyqt, #pyqt4, #reklama</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Pogoda w Pythonie</title>
		<link href="http://www.python.rk.edu.pl/w/p/pogoda-w-pythonie/"/>
		<id>http://www.python.rk.edu.pl/w/p/pogoda-w-pythonie/</id>
		<updated>2009-10-28T15:46:29+00:00</updated>
		<content type="html">Pobieramy prognozy pogody Yahoo i Google z poziomu Pythona za pomocą biblioteki python-weather-api.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python 2.6.4</title>
		<link href="http://www.python.org.pl/python,264.html"/>
		<id>http://www.python.org.pl/python,264.html</id>
		<updated>2009-10-27T13:40:47+00:00</updated>
		<content type="html">Już od dwóch dni, dostępna do pobrania jest finalna wersja Pythona z gałęzi 2.6 - 2.6.4. Jest to wyczekiwany od miesiąca bugfix wersji 2.6.3. Podobnie jak w wydaniach 2.6.4rc1 oraz 2.6.4rc2, nie wprowadzono żadnych znaczących zmian - jedynym celem developerów było naprawienie błędów w pakiecie logowania oraz problemu kompatybilności narzędzi setuptools.  
     
   Gotowe do pobrania paczki aktualnego wydania, znajdziemy w sekcji DOWNLOAD na oficjalnej stronie projektu.  
     
   Źródło: python.org</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Guido van Rossum proponuje moratorium na dalsze zmiany w języku</title>
		<link href="http://www.python.org.pl/guido,van,rossum,proponuje,moratorium,na,dalsze,zmiany,w,jezyku.html"/>
		<id>http://www.python.org.pl/guido,van,rossum,proponuje,moratorium,na,dalsze,zmiany,w,jezyku.html</id>
		<updated>2009-10-23T21:39:10+00:00</updated>
		<content type="html">Przez ostatnie kilkanaście lat Python przeszedł wiele, często znaczących dla dalszego rozwoju projektu, zmian. Niestety, część z nich oprócz udogodnień wprowadziła także zjawisko niekompatybilności wstecznej (mowa tu o Pythonie w wersji 3.x), co dało się we znaki wielu developerom i twórcom alternatywnych implementacji języka. Sprawa została uznana za poważną, gdyż nawet sam twórca języka - GvR - jest za odrzuceniem tych praktyk. W tym celu chce ustanowienia moratorium na dalsze zmiany w syntaktyce i semantyce języka, oraz skupienia się na popularyzacji standardu Python 3000.  
     
   Problem został poruszony na liście mailingowej, a jego słuszność poparta takimi argumentami, jak choćby nie wnoszenie praktycznie żadnych korzyści dla przeciętnych użytkowników, lub utrudnianie pracy twórcom alternatywnych implementacji, takich jak: IronPython, Jython lub PyPy. Dlatego też, BDFL namawia społeczność rozwijającą Pythona aby odpuściła ciągłe wprowadzanie zmian i skupiła się na pracy nad właściwym rozwojem standardu Py3k. Wśród rzeczy do zrobienia, wyróżnić można przeniesienie zewnętrznych bibliotek do wersji 3.x, napisanie narzędzi pomocnych w tym procesie oraz w utrzymaniu wielu wersji kodu aplikacji, czy wreszcie spisanie całego procesu przenoszenia w formie dokumentacji.
   Moratorium na dalsze zmiany dotyczyć ma wyłącznie samego języka i funkcji wbudowanych, bez biblioteki standardowej. Wg. Guido, prace nad rozwojem standardowej biblioteki, mimo że bardzo ważne, nie powinny zakłócać procesu rozwoju alternatywnych implementacji. Dobrym pomysłem jest także ciągłe wprowadzanie zmian w C API a nawet propozycja pozbycia się GIL. Wśród jednej z uwag, było przypomnienie o konieczności wprowadzenia obsługi przetwarzania równoległego i wykonywania wielowątkowego kodu.  
     
   Generalnie, zaobserwować można same pozytywne opinie od strony postaci ze społeczności skupionej wokół rozwoju Pythona, implementacji alternatywnych lub popularnych aplikacji stworzonych w Pythonie.  
     
   Źródło: python-ideas@mail.python.org</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Twisted - wprowadzenie: generatory</title>
		<link href="http://husio.homelinux.com/blog/post/twisted-wprowadzenie-generatory/"/>
		<id>http://husio.homelinux.com/blog/post/twisted-wprowadzenie-generatory/</id>
		<updated>2009-10-19T20:45:05+00:00</updated>
		<content type="html">&lt;p&gt;We wpisie &lt;a href=&quot;http://husio.homelinux.com/blog/post/twisted-wprowadzenie-reactor-i-deferred&quot;&gt;&quot;reactor i
deferred&quot;&lt;/a&gt; przedstawiłem
   koncepcje programowania asynchronicznego z wykorzystaniem obiektu &lt;code&gt;Deferred&lt;/code&gt; w
   którym kolejkowane były zadania. Taki sposób pisania może być jednak bardzo
   niewygodny, jeśli okaże się, że w swoim kodzie mamy wiele miejsc
   oczekujących na dane. Każdorazowe pojawienie się nowych informacji wymaga
   napisania nowej funkcji która je obsłuży. Drugie
   tyle, jeśli chcemy oprogramować możliwe wystąpienia błędów.
&lt;/p&gt;

&lt;h1&gt;Generatory&lt;/h1&gt;
&lt;p&gt;Jaki jest generator, każdy widzi. Najprostszym przykładem może być generowanie
   kolejnych liczb:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;gen_number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;         
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gen_number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jeśli chcesz dowiedzieć się o nich więcej, polecam prezentację &lt;a href=&quot;http://www.dabeaz.com/generators/index.html&quot;&gt;&quot;Generator Tricks for
Systems Programmers&quot;&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Generatory, aż do Pythona 2.5 miały bardzo poważną wadę - były hermetyczne.
   Utworzony obiekt nie przyjmował żadnych danych z zewnątrz i mógł jedynie
   zwracać kolejne wartości. &lt;a href=&quot;http://docs.python.org/whatsnew/2.5.html#pep-342-new-generator-features&quot;&gt;Od wersji
2.5&lt;/a&gt;,
   generatory posiadają metodę &lt;code&gt;send()&lt;/code&gt;, dzięki któremu komunikacja odbywać się
   może w obu kierunkach:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;push_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;power&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;#initialize for future usage&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;power&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;         
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;push_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# initialize generator&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;27&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nieocenioną pomocą w zrozumieniu nowych możliwości generatorów był dla mnie
   wykład &lt;a href=&quot;http://www.dabeaz.com/coroutines/&quot;&gt;&quot;A Curious Course on Coroutines and
Concurrency&quot;&lt;/a&gt;. Kolejno omawiane w nim przykłady to
   implementacja &lt;em&gt;&quot;systemu operacyjnego&quot;&lt;/em&gt;  ze wsparciem dla &lt;a href=&quot;http://pl.wikipedia.org/wiki/Green_thread&quot;&gt;zielonych
wątków&lt;/a&gt;. Końcowy kod rozbudowałem o
   dodatkowe sygnały i &lt;a href=&quot;http://scotdoyle.com/python-epoll-howto.html&quot;&gt;epoll&lt;/a&gt;. W
   efekcie otrzymałem asynchroniczny prawie-framework. Jego główna zaletą jest
   wykorzystanie &lt;code&gt;yield&lt;/code&gt; do oczekiwania na blokujące operacje, dzięki czemu nie muszę pisać &lt;em&gt;callbacków&lt;/em&gt;. &lt;a href=&quot;http://github.com/husio/corrosion/blob/master/src/examples/example_1.py&quot;&gt;Pierwszy z trzech
przykładowych&lt;/a&gt;
   programów to serwer &lt;em&gt;echo&lt;/em&gt;:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# importy...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;handle_request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;''&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;recv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'echo: '&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;raw_socket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Socket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;raw_socket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setsockopt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SOL_SOCKET&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SO_REUSEADDR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'&amp;gt;&amp;gt; waiting for new connection'&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;conn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;c&quot;&gt;# spawn new light-thread task&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calls&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NewTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handle_request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;addr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;raw_socket&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AF_INET&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SOCK_STREAM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;raw_socket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Każda blokująca operacja opakowana jest przez &lt;a href=&quot;http://github.com/husio/corrosion/blob/master/src/corrosion/core/calls.py#L5-13&quot;&gt;sygnał systemowy&lt;/a&gt; , przez co
   możliwe jest użycie &lt;code&gt;yield&lt;/code&gt; i uśpienie podprogramu aż do nadejścia danych. W
   &lt;a href=&quot;http://github.com/husio/corrosion/blob/master/src/examples/example_3.py&quot;&gt;kolejnych
przykładach&lt;/a&gt;
   pokazałem, jak proste jest używanie wyjątków.
&lt;/p&gt;

&lt;h1&gt;Twisted już to ma..&lt;/h1&gt;
&lt;p&gt;Ostatnim przykładem jaki napisałem w twisted był &lt;a href=&quot;http://github.com/husio/tutorials/blob/master/twisted_2/simple_server.tac&quot;&gt;serwer pobierający
strony&lt;/a&gt;.
   W metodzie
   &lt;a href=&quot;http://github.com/husio/tutorials/blob/master/twisted_2/simple_server.tac#L20-22&quot;&gt;lineReceived&lt;/a&gt;
   tworzony był obiekt &lt;code&gt;Deferred&lt;/code&gt; w którym kolejkowane były
   &lt;a href=&quot;http://github.com/husio/tutorials/blob/master/twisted_2/simple_server.tac#L24-26&quot;&gt;send_sucess&lt;/a&gt;
   oraz
   &lt;a href=&quot;http://github.com/husio/tutorials/blob/master/twisted_2/simple_server.tac#L28-30&quot;&gt;send_errback&lt;/a&gt;.
   Przykład wyglądał nie najgorzej, bo wymagał jedynie dwóch callbacków. Co jeśli
   każde żądanie klienta wymagałoby &lt;code&gt;X&lt;/code&gt; blokujących wywołań? Musiałbym napisać co najmniej
   &lt;code&gt;2X&lt;/code&gt; funkcji?
&lt;/p&gt;
&lt;p&gt;W module &lt;code&gt;twisted.internet.defer&lt;/code&gt; znajduje się dekorator &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.internet.defer.html#inlineCallbacks&quot;&gt;inlineCallbacks&lt;/a&gt;, który pozwala na wykorzystanie możliwości generatorów Pythona &lt;code&gt;&amp;gt;=
2.5&lt;/code&gt;. Ten sam przykład może więc wyglądać &lt;a href=&quot;http://github.com/husio/tutorials/blob/master/twisted_3/simple_server_inline.tac#L20-33&quot;&gt;o wiele lepiej&lt;/a&gt;:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;lineReceived&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lineReceived&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@defer.inlineCallbacks&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_lineReceived&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;page&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;ne&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sendLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; \
                &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;', '&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loseConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sendLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content>
		<author>
			<name>Piotr Husiatyński</name>
			<uri>http://husio.homelinux.com/linkpython/</uri>
		</author>
		<source>
			<title type="html">Piotr Husiatynski - Blog - Python</title>
			<subtitle type="html">&lt;h1&gt;Unhandled Exception&lt;/h1&gt;
&lt;p&gt;An unhandled exception was thrown by the application.&lt;/p&gt;</subtitle>
			<link rel="self" href="http://husio.homelinux.com/blog/rss/tag/python/"/>
			<id>http://husio.homelinux.com/blog/rss/tag/python/</id>
			<updated>2010-01-11T10:47:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Udostępnianie Fal na stronach internetowych</title>
		<link href="http://www.python.rk.edu.pl/w/p/udostepnianie-fal-na-stronach-internetowych/"/>
		<id>http://www.python.rk.edu.pl/w/p/udostepnianie-fal-na-stronach-internetowych/</id>
		<updated>2009-10-19T18:08:59+00:00</updated>
		<content type="html">Przepis na publikowanie Fal z Google Wave na zewnętrznych stronach internetowych za pomocą robota embeddy i wklejki JavaScript. #python, #googlewave, #wave</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Tworzenie interfejsów graficznych w QtDesigner dla aplikacji PyQt4</title>
		<link href="http://www.python.rk.edu.pl/w/p/tworzenie-interfejsow-graficznych-w-qtdesigner-dla-aplikacji-pyqt4/"/>
		<id>http://www.python.rk.edu.pl/w/p/tworzenie-interfejsow-graficznych-w-qtdesigner-dla-aplikacji-pyqt4/</id>
		<updated>2009-10-19T14:53:59+00:00</updated>
		<content type="html">Przewodnik przedstawiający możliwości, proces tworzenia i wykańczania interfejsu użytkownika w graficznym edytorze QtDesigner #python, #pyqt, #pyqt4, #gui, #desktop</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">PyconPL 2009</title>
		<link href="http://zgodowie.org/2009/10/19/pyconpl-2009/"/>
		<id>http://zgodowie.org/2009/10/19/pyconpl-2009/</id>
		<updated>2009-10-19T09:02:39+00:00</updated>
		<content type="html">&lt;p&gt;No, byłem. Co do konferencji jako takiej to wolę się nie wypowiadać, ale wnioskuję, że nie byłem jej &lt;em&gt;targetem&lt;/em&gt; &amp;mdash; był może jeden wykład, na którym dowiedziałem się czegoś nowego i jeden, który obejrzałem &lt;em&gt;dla przyjemności&lt;/em&gt;. Aspekt społeczny w pewnym stopniu został zaspokojony przez bratanie się z kolegami z Allegro.pl ...&lt;/p&gt;</content>
		<author>
			<name>Jarosław Zgoda</name>
			<uri>http://zgodowie.org/label/python/</uri>
		</author>
		<source>
			<title type="html">Jarek Zgoda - ostatnie wpisy oznaczone etykietą python</title>
			<subtitle type="html">Ostatnie wpisy w blogu Jarka Zgody oznaczone etykietą python</subtitle>
			<link rel="self" href="http://zgodowie.org/feeds/label/python/"/>
			<id>http://zgodowie.org/label/python/</id>
			<updated>2009-10-25T01:47:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">RkTaggy - przykładowy robot Google Wave</title>
		<link href="http://www.python.rk.edu.pl/w/p/rktaggy-przykladowy-robot-google-wave/"/>
		<id>http://www.python.rk.edu.pl/w/p/rktaggy-przykladowy-robot-google-wave/</id>
		<updated>2009-10-17T17:11:58+00:00</updated>
		<content type="html">Opis i implementacja przykładowego robota w Pythonie dla Google Wave wraz z kodem źródłowym. Wskazówki pomocne przy tworzeniu nowych robotów. #python, #wave, #googlewave, #google, #gae</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Zastosowanie protokołu OAuth w aplikacjach Django/Python</title>
		<link href="http://www.python.rk.edu.pl/w/p/zastosowanie-protokolu-oauth-w-aplikacjach-djangopython/"/>
		<id>http://www.python.rk.edu.pl/w/p/zastosowanie-protokolu-oauth-w-aplikacjach-djangopython/</id>
		<updated>2009-10-17T09:56:19+00:00</updated>
		<content type="html">Opis protokołu OAuth, dostępnych bibliotek oraz przykładowej aplikacji Django django-twitterauth umożliwiającej obsługę Twittera poprzez ten protokół. #python, #oauth</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Czas na Pythonowe screencasty</title>
		<link href="http://www.python.rk.edu.pl/w/p/czas-na-pythonowe-screencasty/"/>
		<id>http://www.python.rk.edu.pl/w/p/czas-na-pythonowe-screencasty/</id>
		<updated>2009-10-16T16:24:17+00:00</updated>
		<content type="html">Planuję stworzenie kilku/nastu screencastów dotyczących m.in. tworzenia GUI w PyQt4/QtDesigner... i innych za pomocą Winka 2.0. Pierwszy &quot;testowy&quot; screencast dostępny jest w artykule &lt;a href=&quot;http://www.python.rk.edu.pl/w/p/python-pod-ms-windows/&quot;&gt;Python pod MS Windows&lt;/a&gt;. Pomysły na screencasty i ogólnie sugestie co do ich zawartości mile widziane :) #python</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wirtualne pythony na Megiteam.pl</title>
		<link href="http://zgodowie.org/2009/10/13/wirtualne-pythony-na-megiteampl/"/>
		<id>http://zgodowie.org/2009/10/13/wirtualne-pythony-na-megiteampl/</id>
		<updated>2009-10-13T21:16:58+00:00</updated>
		<content type="html">&lt;p&gt;Megiteam.pl w swoich &lt;a href=&quot;http://www.megiteam.pl/pomoc/www/python-25-i-26/&quot;&gt;dokumentach pomocy&lt;/a&gt; proponuje jeden sposób na oddzielenie swojego środowiska Pythona od systemowego, a także na ustalenie wersji Pythona, z jaką ma być uruchamiana aplikacja. Metodą prób i błędów doszedłem do innego, jak mi się wydaje także lepszego, sposobu na osiągnięcie tego celu.
&lt;/p&gt;

&lt;h3&gt;Virtualenv na pomoc&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://pypi.python.org/pypi/virtualenv&quot;&gt;Virtualenv ...&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jarosław Zgoda</name>
			<uri>http://zgodowie.org/label/python/</uri>
		</author>
		<source>
			<title type="html">Jarek Zgoda - ostatnie wpisy oznaczone etykietą python</title>
			<subtitle type="html">Ostatnie wpisy w blogu Jarka Zgody oznaczone etykietą python</subtitle>
			<link rel="self" href="http://zgodowie.org/feeds/label/python/"/>
			<id>http://zgodowie.org/label/python/</id>
			<updated>2009-10-25T01:47:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Guardian OpenPlatform</title>
		<link href="http://www.python.rk.edu.pl/w/p/guardian-openplatform/"/>
		<id>http://www.python.rk.edu.pl/w/p/guardian-openplatform/</id>
		<updated>2009-10-12T13:38:37+00:00</updated>
		<content type="html">Dostęp do artykułów i materiałów gazety The Guardian poprzez otwarte RESTowe API #python, #api, #rest, #guardian</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Sieciowy framework zadań Gearman w Pythonowych aplikacjach</title>
		<link href="http://www.python.rk.edu.pl/w/p/sieciowy-framework-zadan-gearman-w-pythonowych-aplikacjach/"/>
		<id>http://www.python.rk.edu.pl/w/p/sieciowy-framework-zadan-gearman-w-pythonowych-aplikacjach/</id>
		<updated>2009-10-10T14:37:20+00:00</updated>
		<content type="html">Opis i wykorzystanie Gearmana - frameworka aplikacyjnego do zdalnego rozproszonego wykonywania zadań w różnych językach programistycznych #python, #gearman, #skalowanie</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GROK 1.0</title>
		<link href="http://www.python.org.pl/grok,10.html"/>
		<id>http://www.python.org.pl/grok,10.html</id>
		<updated>2009-10-09T17:05:02+00:00</updated>
		<content type="html">Zespół odpowiedzialny za rozwój GROK - web-frameworka stworzonego przez społeczność Zope, na bazie Zope Toolkit - ogłosił, po 3 latach od startu projektu, wydanie finalnej wersji sygnowanej numerem 1.0.  
     
   GROK, jak przystało na nowoczesny web-framework, pozwala na wydajną i produktywną pracę zarówno ekspertom jak i początkującym web-developerom. Dzięki możliwościom ponownego wykorzystania technologii GROK, podczas projektowania aplikacji, można łączyć go z Silva CMS oraz Plone CMS, które z powodzeniem współpracują z serwerem aplikacji Zope 2. Oprócz tego, framework jest w pełni kompatybilny z WSGI, co umożliwia na jego pełną integrację z szeroką gamą aktualnie dostępnych rozwiązań obsługujących ww. interfejs.  
     
   Zmiany w finalnej wersji, w stosunku do wersji 1.0b2, to:  


 
     ponowne usunięcie rejestracji karty IReRaiseException dla IUnauthorized, na rzecz używania konfigurowalnej funkcji fabrycznej debug_application_factory z aplikacji WSGI grokcore.startup,
 

 
     przejście na nowsze wersje simplejson oraz pytz;
 

Pomimo osiągnięcia celu, twórcy nie osiedli na laurach. Zespół developerów pracuje cały czas zarówno nad rozwojem frameworka, jak i rozszerzeniem dostępnych informacji zawartych w dokumentacji. Już w najbliższym czasie można spodziewać się znaczących zmian.  
     
   Źródło: grok.zope.org</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wyszukiwanie i agregacja projektów z github, bitbucket czy Google code</title>
		<link href="http://www.python.rk.edu.pl/w/p/wyszukiwanie-i-agregacja-projektow-z-github-bitbucket-czy-google-code/"/>
		<id>http://www.python.rk.edu.pl/w/p/wyszukiwanie-i-agregacja-projektow-z-github-bitbucket-czy-google-code/</id>
		<updated>2009-10-09T10:22:54+00:00</updated>
		<content type="html">Za pomocą prostych skryptów Pythona możemy wyszukiwać i agregować otwartoźródłowe projekty hostowane na serwisach takich jak Bitbucket, Github, czy Google Code #python, #github, #bitbucket, #google</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python 2.6.4rc1</title>
		<link href="http://www.python.org.pl/python,264rc1.html"/>
		<id>http://www.python.org.pl/python,264rc1.html</id>
		<updated>2009-10-07T19:06:14+00:00</updated>
		<content type="html">Niedawno na grupie dyskusyjnej comp.lang.python, Barry Warsaw zamieścił notkę informacyjną o wydaniu Pythona 2.6.4rc1.  
     
   Wersja 2.6.4rc1 to krytyczna łata dla niedawno wydanej 2.6.3, w której tuż po premierze wykryto pewne niedogodności w pakiecie logowania i kompatybilności narzędzi setuptools. Poza tym, nie wprowadzono żadnych znaczących zmian (nie biorąc pod uwagę blisko 100 poprawek znajdujących się w wersji 2.6.3).  
     
   Od teraz, aż do wydania finalnego Pythona 2.6.4 (które jest planowane na 18 października), gałąź 2.6.x pozostanie w trybie &quot;tylko do łatania błędów&quot;, tym samym nie planuje się wprowadzenia żadnych nowości.</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Thrift - framework usług siecowych</title>
		<link href="http://www.python.rk.edu.pl/w/p/thrift-framework-uslug-siecowych/"/>
		<id>http://www.python.rk.edu.pl/w/p/thrift-framework-uslug-siecowych/</id>
		<updated>2009-10-07T16:31:41+00:00</updated>
		<content type="html">Thrift pozwala tworzyć skalowalne i obsługujące wiele języków programistycznych usługi sieciowe na bazie RPC z wykorzystaniem złożonych struktur danych #python, #thrift, #ruby</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Tworzenie Robotów Google Wave w Pythonie</title>
		<link href="http://www.python.rk.edu.pl/w/p/tworzenie-robotow-google-wave-w-pythonie/"/>
		<id>http://www.python.rk.edu.pl/w/p/tworzenie-robotow-google-wave-w-pythonie/</id>
		<updated>2009-10-06T12:56:16+00:00</updated>
		<content type="html">Artykuł wprowadzający do tworzenia robotów Google Wave napisanych w Pythonie i hostowanych na App Engine. #python, #googlewave, #wave, #gae</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">PyGoWave Server - niezależna implementacja serwera i klienta Google Wave</title>
		<link href="http://www.python.rk.edu.pl/w/p/pygowave-server-niezalezna-implementacja-serwera-i-klienta-google-wave/"/>
		<id>http://www.python.rk.edu.pl/w/p/pygowave-server-niezalezna-implementacja-serwera-i-klienta-google-wave/</id>
		<updated>2009-10-04T17:30:16+00:00</updated>
		<content type="html">&lt;p&gt;&lt;b&gt;PyGoWave Server&lt;/b&gt; to jedna z rozwijanych obecnie niezależnych implementacji serwera i klienta Google Wave. Źródła dostępne są na &lt;a href=&quot;http://github.com/p2k/pygowave&quot;&gt;githubie&lt;/a&gt;, a wersja testowa znajduje się na &lt;a href=&quot;http://pygowave.net&quot;&gt;pygowave.net&lt;/a&gt;. Projekt jest w bardzo wczesnym stadium rozwoju i nie oferuje jeszcze pełnej obsługi protokołu Fali.&lt;/p&gt;
&lt;p&gt;
PyGoWave wykorzystuje obecnie Pythona 2.6, Django 1.X, Orbited 0.7.7 (serwer Comet), RabbitMQ 1.6.0, a także PIL, lxml, czy carrot. Ostatnio także wykorzystywany jest Twisted. Opcjonalna zależność to django-rosetta. Od strony interfejsu webowego wykorzystywana jest biblioteka mootools i różne dodatki (&lt;a href=&quot;http://pygowave.net/blog/wp-content/uploads/pygowave03_sneakpeak.png&quot;&gt;zrzut ekranu&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Dla końcowego użytkownika&lt;/b&gt; nie jest to obecnie coś co można używać, natomiast &lt;b&gt;programiści&lt;/b&gt; zainteresowani protokołem Federacji i Google Wave powinni przyjrzeć się temu projektowi i pomóc w jego rozwoju.&lt;/p&gt; #wave, #google, #googlewave, #python, #django</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Tokyo Cabinet - biblioteka baz danych klucz-wartość</title>
		<link href="http://www.python.rk.edu.pl/w/p/tokyo-cabinet-biblioteka-baz-danych-klucz-wartosc/"/>
		<id>http://www.python.rk.edu.pl/w/p/tokyo-cabinet-biblioteka-baz-danych-klucz-wartosc/</id>
		<updated>2009-10-03T18:08:04+00:00</updated>
		<content type="html">Opis bibliotek Tokyo Cabinet, Tyrant i Dystopia oferujących zbiór narzędzi do bardzo wydajnej obsługi baz danych działających na zasadzie klucz-wartość #python, #nosql, #sql, #bazydanych</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python 2.6.3</title>
		<link href="http://www.python.org.pl/python,263.html"/>
		<id>http://www.python.org.pl/python,263.html</id>
		<updated>2009-10-02T23:29:17+00:00</updated>
		<content type="html">Ukazała się trzecia wersja poprawkowa Pythona 2.6, w niej blisko 100 poprawionych błędów! Pełną listę zmian można znaleźć pod tym adresem. Już dzisiaj jest pewne, że ukaże się wersja 2.6.4, w której zostaną poprawione między innymi błędy związane z SSLem (issue5949).  
     
   Przy okazji tego wydania warto wspomnieć, że developerzy Pythona powoli zaczynają pracę nad wersjami 2.7 i 3.2. Wstępne terminy ukazania się tych wersji języka ustalono na lato przyszłego roku.  
     
   Aktualnie na liście dyskusyjnej python-dev trwają burzliwe dyskusje na temat dwóch nowo zaproponowanych modułów: argparse PEP 389 oraz ipaddr PEP 3144.  
     
   Pobierz: Python 2.6.3  
   Źródło: python.org</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Edycja dokumentów biurowych za pomocą Zoho Remote API</title>
		<link href="http://www.python.rk.edu.pl/w/p/edycja-dokumentow-biurowych-za-pomoca-zoho-remote-api/"/>
		<id>http://www.python.rk.edu.pl/w/p/edycja-dokumentow-biurowych-za-pomoca-zoho-remote-api/</id>
		<updated>2009-10-02T17:48:08+00:00</updated>
		<content type="html">Wykorzystujemy Zoho Remote API do edycji dokumentów, arkuszy i prezentacji w webowej aplikacji Django. Dostępny jest kompletny kod aplikacji. #python, #django, #zoho, #api, #saas, #office, #openoffice</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Google Wave rozsyła zaproszenia do wersji testowej</title>
		<link href="http://www.python.rk.edu.pl/w/p/google-wave-rozsyla-zaproszenia-do-wersji-testowej/"/>
		<id>http://www.python.rk.edu.pl/w/p/google-wave-rozsyla-zaproszenia-do-wersji-testowej/</id>
		<updated>2009-09-30T04:17:21+00:00</updated>
		<content type="html">Od dzisiaj Google rozpoczęło rozsyłanie zaproszeń dla programistów i testerów, którzy wcześniej zapisali się na stosowne konto. Dzięki (ciągle rozbudowywanemu) API programiści mogą tworzyć gadżety i roboty poszerzające funkcjonalność Fal, wliczając w to roboty napisane w Pythonie. Oficjalnie Google Wave ma wystartować jeszcze w tym roku. Zainteresowanym polecam &lt;a href=&quot;http://www.python.rk.edu.pl/multimedia/tag/google-wave/&quot;&gt;listę prezentacji&lt;/a&gt; i &lt;a href=&quot;http://www.python.rk.edu.pl/projects/tag/google-wave/&quot;&gt;listę projektów&lt;/a&gt; związanych z Wave. #google, #wave, #python</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Przegląd możliwości Zoho API i Zoho CloudSQL</title>
		<link href="http://www.python.rk.edu.pl/w/p/przeglad-mozliwosci-zoho-api-i-zoho-cloudsql/"/>
		<id>http://www.python.rk.edu.pl/w/p/przeglad-mozliwosci-zoho-api-i-zoho-cloudsql/</id>
		<updated>2009-09-29T17:21:08+00:00</updated>
		<content type="html">API usług Zoho.com pozwala integrować aplikacje z pakietu biurowego Zoho.com we własnych serwisach i narzędziach. Za pomocą Pythona można bez problemu operować na dostępnym API, w tym CloudSQL #zoho, #saas, #python, #sql, #api</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Biblioteka Pythona</title>
			<subtitle type="html">Serwis poświęcony Pythonowi - wszechstronnemu językowi programistycznemu. Podstawy i kurs Pythona, Django, PyQt4.</subtitle>
			<link rel="self" href="http://www.python.rk.edu.pl/w/rss/"/>
			<id>http://www.python.rk.edu.pl/w/rss/</id>
			<updated>2010-02-10T22:51:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Twisted - wprowadzenie: implementacja protokołu</title>
		<link href="http://husio.homelinux.com/blog/post/twisted-wprowadzenie-implementacja-protokolu/"/>
		<id>http://husio.homelinux.com/blog/post/twisted-wprowadzenie-implementacja-protokolu/</id>
		<updated>2009-09-27T10:18:00+00:00</updated>
		<content type="html">&lt;p&gt;W &lt;a href=&quot;http://husio.homelinux.com/blog/post/twisted-wprowadzenie-reactor-i-deferred/&quot;&gt;poprzednim wpisie&lt;/a&gt;
   przedstawiłem obiekt reaktora oraz klasę &lt;code&gt;Deferred&lt;/code&gt;. Kolejnym krokiem będzie
   napisanie serwera, który używając prostego protokołu będzie zwracał kod strony
   której adres został przesłany przez klienta.
&lt;/p&gt;

&lt;h1&gt;Implementacja protokołu&lt;/h1&gt;
&lt;p&gt;Bazową klasą każdego protokołu, implementującą jedynie
   &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.IProtocol.html&quot;&gt;IProtocol&lt;/a&gt;
   jest
   &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.internet.protocol.html&quot;&gt;internet.protocol.Protocol&lt;/a&gt;.
   Podstawową klasą dla wszystkich serwerów jest
   &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.internet.protocol.ClientFactory.html&quot;&gt;internet.protocol.ClientFactory&lt;/a&gt;:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;WebGetProtocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;pass&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;WebGetFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ServerFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WebGetProtocol&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;listenTCP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WebGetFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;&amp;lt;class 'twisted.internet.tcp.Port'&amp;gt; of __main__.WebGetFactory on 9000&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Po utworzeniu instancji fabryki, przekazuję ją wraz z numerem portu jako
   parametr metody &lt;code&gt;listenTCP&lt;/code&gt; obiektu reaktora. Wszelkie dane które pojawią się
   na tym porcie, obsłużone zostaną przez moją fabrykę.
&lt;/p&gt;
&lt;p&gt;Do połączenia z serwerem, można użyć na przykład programu telnet:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;telnet localhost 9000
Trying 127.0.0.1...
Connected to localhost.
Escape character is &lt;span class=&quot;s1&quot;&gt;'^]'&lt;/span&gt;.
http://google.pl
...
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Klasy Protocol i Factory&lt;/h2&gt;
&lt;p&gt;Ponieważ w twisted zastosowano &lt;a href=&quot;http://pl.wikipedia.org/wiki/Fabryka_abstrakcyjna&quot;&gt;wzorzec
fabryki&lt;/a&gt;, przy
   implementacji nowego protokołu zawsze trzeba użyć co najmniej dwóch klas.
   Obiekt fabryki jest właściwym serwerem (lub klientem). Zarządza połączeniami
   i tworzy nowe instancje klasy protokołu, które odpowiedzialne są za obsługę
   konkretnego połączenia.
&lt;/p&gt;

&lt;h1&gt;Logowanie ruchu&lt;/h1&gt;
&lt;p&gt;Pierwszą funkcjonalnością serwera będzie monitorowanie połączeń:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.python&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startLogging&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'/tmp/myserver.log'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'w'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;WebGetProtocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;connectionMade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'new connection'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;connectionLost&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reason&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'connection lost: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reason&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aby zapisywać wszystkie nawiązane i zerwane połączenia, zaimplementowałem
   metody &lt;code&gt;connectionMade&lt;/code&gt; oraz &lt;code&gt;connectionLost&lt;/code&gt;.  Do logowania, zamiast modułu
   &lt;a href=&quot;http://docs.python.org/library/logging.html#module-logging&quot;&gt;logging&lt;/a&gt; użyłem
   &lt;a href=&quot;http://twistedmatrix.com/projects/core/documentation/howto/logging.html&quot;&gt;twisted.python.log&lt;/a&gt;.
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;tail -f /tmp/myserver.log
...
2009-09-28 01:11:21+0200 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;__main__.WebGetFactory&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; new connection
2009-09-28 01:11:24+0200 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;WebGetProtocol,0,127.0.0.1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; connection lost: %s
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Failure instance: Traceback &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;failure with no frames&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;: &amp;lt;class
&lt;span class=&quot;s1&quot;&gt;'twisted.internet.error.ConnectionDone'&lt;/span&gt;&amp;gt;: Connection was closed cleanly.
     &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;Przesyłanie danych&lt;/h1&gt;
&lt;p&gt;Kolejnym krokiem będzie czytanie i wysyłanie danych, które zakończone będą
   znakiem powrotu karetki i nowego wiersza. Pomysł używania &lt;code&gt;\r\n&lt;/code&gt; jest na tyle
   popularny, że w twisted jest już gotowa klasa do wymiany danych w ten sposób.
   &lt;code&gt;LineReceiver&lt;/code&gt; implementuje ten sam interfejs co &lt;code&gt;protocol.Protocol&lt;/code&gt;, więc nie
   trzeba zmieniać napisanego do tej pory kodu.
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.web.client&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getPage&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.protocols.basic&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LineReceiver&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;WebGetProtocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LineReceiver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;lineReceived&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;deferr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;deferr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addErrback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_errback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;send_success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sendLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;send_errback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sendLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Server error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loseConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Po otrzymaniu danych (&lt;code&gt;lineReceived&lt;/code&gt;), pobieram stronę znajdującą się pod
   przesłanym adresem.  Nie wiadomo jednak jak szybko odpowie serwer, dlatego
   zamiast czekać na zakończenie przesyłania danych używam &lt;code&gt;getPage&lt;/code&gt;, a do
   zwróconego obiektu &lt;code&gt;Deferred&lt;/code&gt; dodaję własny &lt;em&gt;callback&lt;/em&gt; i &lt;em&gt;errback&lt;/em&gt; . Reaktor
   nie jest blokowany i czekając na odpowiedź, może uruchomić inne zadania.
&lt;/p&gt;
&lt;p&gt;W przypadku wystąpienia błędu chcę zerwać połączenie z klientem. Potrzebny
   jest do tego obiekt typu &lt;code&gt;WebGetFactory&lt;/code&gt;. Każdy protokół posiada jednak
   referencję do swojej fabryki, która trzymana jest pod atrybutem &lt;code&gt;transport&lt;/code&gt;.
   Ostatnia linia metody &lt;code&gt;send_errback&lt;/code&gt; odpowiada więc za zerwanie połączenia.
&lt;/p&gt;

&lt;h1&gt;Aplikacja Twisted&lt;/h1&gt;
&lt;p&gt;Pisząc program zawsze trzeba dodać sporo powtarzającego się kodu. Demonizacja
   aplikacji, logowanie, uruchamianie i wyłączanie programu to tylko te
   najczęściej występujące funkcjonalności. Twisted zawiera na szczęście
   interfejs który pozwala zaimplementować to wszystko w paru linijkach.
&lt;/p&gt;
&lt;p&gt;Z dotychczas napisanego kodu usunąć można ostatnie linijki. &lt;em&gt;twistd&lt;/em&gt; sam
   zajmie się wyborem odpowiedniego reaktora i jego uruchomieniem. Jedyne co
   trzeba zrobić to utworzyć obiekt o nazwie &lt;code&gt;application&lt;/code&gt;:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.application&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;internet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# ...&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;#reactor.listenTCP(9000, WebGetFactory())&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#reactor.run()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;application&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Application&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;webget&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;webget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;internet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TCPServer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WebGetFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;webget&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setServiceParent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plik zapisać należy z rozszerzeniem &lt;code&gt;.tac&lt;/code&gt;, które informować będzie, że kod
   Pythona znajdujący się w tym pliku zawiera obiekt
   &lt;a href=&quot;http://twistedmatrix.com/documents/8.2.0/api/twisted.application.service.Application.html&quot;&gt;Application&lt;/a&gt;
   i uruchamiać go należy używając
   &lt;a href=&quot;http://twistedmatrix.com/projects/core/documentation/man/twistd-man.html&quot;&gt;twistd&lt;/a&gt;:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;twistd -noy simple_server.tac -l /tmp/myserver.log
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kod użyty jako przykłady pobrać można z
   &lt;a href=&quot;http://github.com/husio/tutorials/tree/master/twisted_2/&quot;&gt;github&lt;/a&gt;
&lt;/p&gt;</content>
		<author>
			<name>Piotr Husiatyński</name>
			<uri>http://husio.homelinux.com/linkpython/</uri>
		</author>
		<source>
			<title type="html">Piotr Husiatynski - Blog - Python</title>
			<subtitle type="html">&lt;h1&gt;Unhandled Exception&lt;/h1&gt;
&lt;p&gt;An unhandled exception was thrown by the application.&lt;/p&gt;</subtitle>
			<link rel="self" href="http://husio.homelinux.com/blog/rss/tag/python/"/>
			<id>http://husio.homelinux.com/blog/rss/tag/python/</id>
			<updated>2010-01-11T10:47:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Jython 2.5.1</title>
		<link href="http://www.python.org.pl/jython,251.html"/>
		<id>http://www.python.org.pl/jython,251.html</id>
		<updated>2009-09-26T20:04:42+00:00</updated>
		<content type="html">Ukazała się pierwsza wersja poprawkowa Jythona 2.5, nie wnosząc co prawda ona żadnych nowości, a poprawiając zgłoszone błędy.  
     
   Najpoważniejszym błędem, mogącym prowadzić do utraty danych, była niepoprawna obsługa plików otwieranych w trybie dopisywania(append). Z pozostałych zmian można wymienić poprawę działania relatywnych importów, które w pewnych przypadkach mogły działać nieprawidłowo, oraz poprawa parsowania coroutines(PEP342), które prowadziło do błędu krytycznego Jythona.  
     
   Szczegółowa lista zmian znajduje się w pliku NEWS w katalogu Jythona.  
     
   Więcej informacji: Jython 2.5.1  
   Źródło: fwierzbicki.blogspot.com</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Byte of Python po polsku</title>
		<link href="http://www.python.org.pl/byte,of,python,po,polsku.html"/>
		<id>http://www.python.org.pl/byte,of,python,po,polsku.html</id>
		<updated>2009-09-26T13:58:23+00:00</updated>
		<content type="html">Dobra wiadomość dla początkujących programistów Pythona! Otóż w polskich materiałach dydaktycznych pojawi się niedługo kolejna, darmowa książka! A to za sprawą Dominika Kozaczko - nauczyciela informatyki V LO w Bielsku-Białej i organizatora konferencji Dni Wolnego Oprogramowania - oraz jego uczniów.  
     
   Byte of Python (autorstwa Swaroopa C H) to znana na całym świecie pozycja - dedykowana środowiskom akademickim - przetłumaczona już na 18 języków. Dostępna dla wersji Pythona 2.x i 3.x w formacie HTML i PDF.  
     
   Jak udało się ustalić, tłumaczenie trwa od marca tego roku i jest już na etapie końcowym. Planowany deadline to koniec września. Z pewnością koledzy będą potrzebowali pomocy przy erracie, dlatego też wszelkie sugestie należy zgłaszać, bądź bezpośrednio modyfikować treść na WIKI, dokonując wcześniej rejestracji.  
     
   Tłumaczenie polskie wybiega trochę poza schemat pozostałych książek, gdyż jest tłumaczeniem hybrydowym Byte of Python v. 1.92, dot. Pythona 3.x oraz starszej wersji 2.x. Jak mówią sami twórcy:  
     
   &quot;Zdecydowaliśmy się na ten krok, ponieważ Python 2.x jest jeszcze najpopularniejszy, za to nowa wersja BoP ma lepsze walory dydaktyczne - czyli uzyskaliśmy jakieś 120% oryginału.&quot;  
     
   Co więcej, planowane też jest wydanie książki w formacie PDF oraz rozszerzenie działalności na wydanie publikacji. W związku z tym na rynku pojawi się w formie drukowanego podręcznika.  
     
   Zachęcam do śledzenia postępów prac nad książką. Przede wszystkim gratuluję pomysłu autorom tego przedsięwzięcia!</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Learning Python - IV Edycja</title>
		<link href="http://www.python.org.pl/learning,python,,iv,edycja.html"/>
		<id>http://www.python.org.pl/learning,python,,iv,edycja.html</id>
		<updated>2009-09-25T23:20:35+00:00</updated>
		<content type="html">Od dziś dostępna jest czwarta edycja książki Learning Python, w Polsce znanej jako Python. Wprowadzenie. Jest to jedna z najbardziej rozpoznawalnych pozycji na międzynarodowym rynku, dla osób chcących nauczyć się programować w Pythonie. Jej autorem jest znana osobistość pythonowej społeczności - Mark Lutz.  
     
   Najnowsza edycja wprowadza kilka zmian, do których można zaliczyć:  


 
     dokładne omówienie składni i elementów Pythona 2.6 i 3.0,
 

 
     uzupełnienie obecnych zagadnień o nowe informacje (np. szczegóły dot. Unicode, bardziej realistyczne i przyjazne przykłady OOP czy tematy opisujące metaklasy),
 

 
     dokładniejszy opis zgromadzonych narzędzi atrybutów oraz deskryptorów,
 

 
     opis specyficznych rozszerzeń językowych dla Pythona 2.6 i 3.0,
 

 
     zmiany w obecnych materiałach polegające na reorganizacji dotychczasowych przykładów lub dodaniu nowych;
 

Anglojęzyczną wersję podręcznika można już zamawiać w księgarni internetowej O'Reilly. Na informacje o realizacji jej polskiego tłumaczenia, dane jest nam jeszcze poczekać.</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Learning Python - IV Edycja</title>
		<link href="http://python.org.pl/learning,python,,iv,edycja.html"/>
		<id>http://python.org.pl/learning,python,,iv,edycja.html</id>
		<updated>2009-09-25T23:20:35+00:00</updated>
		<content type="html">Od dziś dostępna jest czwarta edycja książki Learning Python, w Polsce znanej jako Python. Wprowadzenie. Jest to jedna z najbardziej rozpoznawalnych pozycji na międzynarodowym rynku, dla osób chcących nauczyć się programować w Pythonie. Jej autorem jest znana osobistość pythonowej społeczności - Mark Lutz.  
     
   Najnowsza edycja wprowadza kilka zmian, do których można zaliczyć:  


 
     dokładne omówienie składni i elementów Pythona 2.6 i 3.0,
 

 
     uzupełnienie obecnych zagadnień o nowe informacje (np. szczegóły dot. Unicode, bardziej realistyczne i przyjazne przykłady OOP czy tematy opisujące metaklasy),
 

 
     dokładniejszy opis zgromadzonych narzędzi atrybutów oraz deskryptorów,
 

 
     opis specyficznych rozszerzeń językowych dla Pythona 2.6 i 3.0,
 

 
     zmiany w obecnych materiałach polegające na reorganizacji dotychczasowych przykładów lub dodaniu nowych;
 

Anglojęzyczną wersję podręcznika można już zamawiać w księgarni internetowej O'Reilly. Na informacje o realizacji jej polskiego tłumaczenia, dane jest nam jeszcze poczekać.</content>
		<author>
			<name>Adrian Ryniec</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Twisted - wprowadzenie: reactor i deferred</title>
		<link href="http://husio.homelinux.com/blog/post/twisted-wprowadzenie-reactor-i-deferred/"/>
		<id>http://husio.homelinux.com/blog/post/twisted-wprowadzenie-reactor-i-deferred/</id>
		<updated>2009-09-25T18:39:33+00:00</updated>
		<content type="html">&lt;p&gt;Śledząc portale i blogi o treści programistycznej, trudno nie zauważyć
   wzmożonego ostatnio zainteresowania &lt;em&gt;&quot;nowymi&quot;&lt;/em&gt;
   &lt;a href=&quot;http://www.tornadoweb.org&quot;&gt;asynchronicznymi&lt;/a&gt;
   &lt;a href=&quot;http://shoptalkapp.com/blog/2009/9/23/announcing-diesel&quot;&gt;frameworkami&lt;/a&gt;
   napisanymi w Pythonie. Osobiście staram się jednak nie podniecać każdą
   nowością i aby się przekonać do biblioteki, potrzebuję czegoś więcej niż
   10 linijek kodu, wyświetlających &lt;code&gt;Hello world&lt;/code&gt;. Okazało się, że &lt;a href=&quot;http://glyph.twistedmatrix.com/2009/09/what-i-wish-tornado-were.html&quot;&gt;nie
ja&lt;/a&gt;
   &lt;a href=&quot;http://glyph.twistedmatrix.com/2009/09/diesel-case-study-in-that-thing-i-just_24.html&quot;&gt;jedyny&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Od jakiegoś czasu czytam o &lt;a href=&quot;http://twistedmatrix.com/trac/&quot;&gt;twisted&lt;/a&gt; i w miarę
   możliwości staram się &lt;a href=&quot;http://github.com/husio/python-irc-bot&quot;&gt;napisać trochę&lt;/a&gt;
   &lt;a href=&quot;http://github.com/husio/txChat&quot;&gt;działającego kodu&lt;/a&gt;. Niestety, oprócz
   &lt;a href=&quot;http://twistedmatrix.com/projects/core/documentation/howto/index.html&quot;&gt;tutoriala&lt;/a&gt;
   w którym opisane zostały podstawy, do dyspozycji jest jeszcze tylko
   &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.html&quot;&gt;dokumentacja
API&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Ponieważ sam dużo czasu spędziłem na gromadzeniu informacji, postaram się w miarę
   przystępnie opisać podstawy twisted.
&lt;/p&gt;

&lt;h1&gt;Reaktor&lt;/h1&gt;
&lt;p&gt;Ponieważ twisted jest
   &lt;a href=&quot;http://pl.wikipedia.org/wiki/Programowanie_sterowane_zdarzeniami&quot;&gt;asynchronicznym&lt;/a&gt;
   frameworkiem, posiada własny obiekt odpowiedzialny za zarządzanie główną pętlą
   programu i wywoływanie obsługi zdarzeń:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Oprócz podstawowej wersji, można wybrać spośród &lt;a href=&quot;http://twistedmatrix.com/projects/core/documentation/howto/choosing-reactor.html&quot;&gt;wielu innych
implementacji&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Aby uruchomić reactor, należy wywołać na nim metodę &lt;code&gt;run()&lt;/code&gt;.
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;Deferred&lt;/h1&gt;
&lt;p&gt;Podstawowym &lt;em&gt;&quot;obiektem zadaniowym&quot;&lt;/em&gt; jest w twisted
   &lt;a href=&quot;http://twistedmatrix.com/projects/core/documentation/howto/defer.html&quot;&gt;Deferred&lt;/a&gt;.
   Dzięki niemu można zakolejkować i powiązać w łańcuch dowolną ilość zadań.
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet.defer&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Programując asynchronicznie używamy jednego procesu (przynajmniej na
   początku), który wykonuje kolejne zadania nadsyłane przez reaktor. Każde z
   tych zadań dostaje na swoje wykonanie tyle czasu ile potrzebuje, dlatego długo
   wykonujące się funkcje mogą skutecznie &lt;em&gt;zamrozić&lt;/em&gt; aplikacje. Jeśli jednak
   opóźnienie spowodowane jest oczekiwaniem na jakieś zdarzenie, a nie przez
   czasochłonne obliczenia, problem można rozwiązać tworząc łańcuch małych porcji
   instrukcji.
&lt;/p&gt;

&lt;h2&gt;Callback&lt;/h2&gt;
&lt;p&gt;Callback traktować można jako filtr z efektami ubocznymi. W najprostszym
   przypadku będzie to funkcja zwracająca przyjmowany argument:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transparent_callback&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;arg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;arg&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Filtry&lt;/em&gt; (ze względu na brak lepszej nazwy, tak będę nazywał te obiekty)
   łączyć można w łańcuchy wywołań. Wynik działania każdego z nich przekazywany
   jest jako argument wywołania kolejnego:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet.defer&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...    return x * 2&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...    return x + 1&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x860be4c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x860be4c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Errback&lt;/h2&gt;
&lt;p&gt;Ponieważ działanie filtru może zakończyć się błędem, obiekt typu &lt;code&gt;Deferred&lt;/code&gt;
   pozwala na zdefiniowanie oddzielnej listy instrukcji do ich obsługi: 
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;error_handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...    print error&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...    raise Exception('Fail!')&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; ...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addErrback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error_handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x863bd0c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Failure instance: Traceback: &amp;lt;type 'exceptions.Exception'&amp;gt;: Fail!&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/lib/python2.6/site-packages/IPython/iplib.py:2257:runcode&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;ipython console&amp;gt;:1:&amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/lib/python2.6/site-packages/twisted/internet/defer.py:243:callback&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/lib/python2.6/site-packages/twisted/internet/defer.py:312:_startRunCallbacks&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;--- &amp;lt;exception caught here&amp;gt; ---&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/lib/python2.6/site-packages/twisted/internet/defer.py:328:_runCallbacks&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;ipython console&amp;gt;:2:fail&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;DeferredList&lt;/h1&gt;
&lt;p&gt;Oprócz grupowania filtrów, utworzyć można obiekt czekający na zakończenie
   ustalonego zbioru instancji &lt;code&gt;Deferred&lt;/code&gt;. 
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt; 
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x93efd6c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x93efdcc&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeferredList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;DeferredList at 0x93f468c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[(True, 5), (True, 1)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Przykłady&lt;/h2&gt;
&lt;p&gt;Będąc na tym etapie znajomości twisted zastanawiałem się, jaki sens ma
   używanie &lt;code&gt;Deferred&lt;/code&gt; skoro wystarczy użyć zwykłego &lt;code&gt;time.sleep()&lt;/code&gt; aby
   skutecznie zablokować na jakiś czas aplikację.
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deferred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;start_time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'work time:'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start_time&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sleeper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep_time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep_time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sleep_time&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Deferred&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleeper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleeper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x943c28c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;work time: 4.00436711311&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Gdybym użył procesów i dostosował funkcję &lt;code&gt;check&lt;/code&gt;, zamiast 4 sekund wszystko
   trwałoby niewiele ponad 2. Po co więc programować asynchronicznie? Najlepiej
   wytłumaczę to chyba kolejnym fragmentem kodu z wykorzystaniem funkcji
   &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.web.client.html#getPage&quot;&gt;getPage&lt;/a&gt;:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.web.client&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getPage&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;twisted.internet&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;URLS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'http://distrowatch.com/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'http://www.vim.org/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;pull_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'done'&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;end_work&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deferreds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;URLS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deferreds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pull_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x90c79ec&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;Deferred at 0x90c7c8c&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeferredList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deferreds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end_work&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;DeferredList at 0x90c7fcc&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start_time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reactor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'work time:'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start_time&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;('work time:', 1.927487850189209)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aby pobrać dwie strony, używam &lt;code&gt;getPage&lt;/code&gt; które zwraca obiekt &lt;code&gt;Deferred&lt;/code&gt;. Do
   każdego obiektu z listy &lt;code&gt;deferreds&lt;/code&gt; podpinam własny &lt;em&gt;callback&lt;/em&gt; który wyświetli
   napis &lt;code&gt;done&lt;/code&gt;. Dzięki temu wiem jak szybko pobrana została każda ze stron. Na
   koniec tworzę &lt;code&gt;DeferredList&lt;/code&gt;, który po zakończeniu wszystkich zadań wyłączy
   reaktor.  Czas działania skryptu - 2 sekundy.
&lt;/p&gt;
&lt;p&gt;A co jeśli zwiększę ilości stron do pobrania z 2 do 40? Gdybym napisał to w
   pętli przy użyciu
   &lt;a href=&quot;http://docs.python.org/library/urllib.html#urllib.urlopen&quot;&gt;urllib.urlopen&lt;/a&gt;,
   operacja trwałaby 20 razy dłużej. W przypadku twisted nie jest to takie
   oczywiste:
&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;URLS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;URLS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'work time:'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start_time&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;('work time:', 24.748102903366089)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;24.748102903366089&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.927487850189209&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;12.839563632495389&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</content>
		<author>
			<name>Piotr Husiatyński</name>
			<uri>http://husio.homelinux.com/linkpython/</uri>
		</author>
		<source>
			<title type="html">Piotr Husiatynski - Blog - Python</title>
			<subtitle type="html">&lt;h1&gt;Unhandled Exception&lt;/h1&gt;
&lt;p&gt;An unhandled exception was thrown by the application.&lt;/p&gt;</subtitle>
			<link rel="self" href="http://husio.homelinux.com/blog/rss/tag/python/"/>
			<id>http://husio.homelinux.com/blog/rss/tag/python/</id>
			<updated>2010-01-11T10:47:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">RuPy 2009 - otwarcie rejestracji</title>
		<link href="http://python.org.pl/rupy,2009,,otwarcie,rejestracji.html"/>
		<id>http://python.org.pl/rupy,2009,,otwarcie,rejestracji.html</id>
		<updated>2009-09-22T20:50:03+00:00</updated>
		<content type="html">Zgodnie z ustalonym terminem, rejestracja na trzecią edycję konferencji RuPy 2009 została otwarta, gdzie do samej imprezy pozostał ponad miesiąc. Warto również w tym miejscu zwrócić uwagę na cenę uczestnictwa, która z kolejnymi tygodniami staje się co raz większa. Dlatego też zachęcam do natychmiastowej rejestracji - nie tylko z ekonomicznego punktu widzenia - gdyż ilość miejsc jest ograniczona!  
     
   Uzupełniając wcześniejsze informację, konferencja odbędzie się na Uniwersytecie im. Adama Mickiewicza w Poznaniu, dokładnie w tym samym miejscu co zeszłoroczne edycje imprezy. Będziemy mieli do dyspozycji 2 aule, w związku z czym rozporządzanie wszystkimi prelekcjami (a będzie ich około 20), nie będzie stanowić problemu.  
     
   Zaktualizowaliśmy również dane logistyczne oraz te związane z zakwaterowaniem. Natomiast ostateczną Agendę udostępnimy na początku października.  
     
   Zapraszamy do śledzenia strony konferencji: RuPy 2009</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://www.python.org.pl/feed/atom.atom</uri>
		</author>
		<source>
			<title type="html">Najnowsze wpisy</title>
			<link rel="self" href="http://www.python.org.pl/feed/atom.atom"/>
			<id>http://www.python.org.pl/atom.atom</id>
			<updated>2010-02-10T22:51:29+00:00</updated>
		</source>
	</entry>

</feed>
