<?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>2009-07-03T01:47:38+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="pl">
		<title type="html">Problem z ofertami pracy w sieci</title>
		<link href="http://www.python.rk.edu.pl/w/p/problem-z-ofertami-pracy-w-sieci/"/>
		<id>http://www.python.rk.edu.pl/w/p/problem-z-ofertami-pracy-w-sieci/</id>
		<updated>2009-07-02T14:08:18+00:00</updated>
		<content type="html">&lt;p&gt;Bazując m.in. na swoich doświadczeniach - jest masa serwisów oferujących oferty pracy. Jedne bardziej renomowane, inne &quot;darmowe&quot; i zawierające wiele słabych ofert. Są też &quot;franczyzy&quot; - oferty pracy z jednego serwisu udostępniane w drugim, czy też dodawanie tej samej oferty przez firmę na wielu stronach. Nie ma też chyba konkretnego użytecznego serwisu (poza Google) z prawdziwego zdarzenia będącego wyszukiwarką ofert z większości/wszystkich liczących się serwisów ofertowych. Generalnie zamieszczanie ofert jest płatne, więc jeżeli szukamy dobrych ofert - musimy przejrzeć wszystkie fajne serwisy żeby mieć pewność że sprawdziliśmy wszystkie fajne oferty.&lt;/p&gt;
&lt;p&gt;Od strony &lt;b&gt;Django&lt;/b&gt; jakby taki serwis, zbieracz ofert pracy mógł wyglądać? Najprostsze rozwiązanie to pełnotekstowa wyszukiwarka indeksująca oferty pracy. Konkurencja dla Google, lecz jeżeli zaoferuje trafniejsze wyszukiwanie (np. z filtrowaniem po branży, województwie czy mieście) to będzie poręczniejszy. Xapian, Whoosh, czy może na całego i Solr? Druga opcja to pobieranie (indeksowanie) ofert pracy, wyciąganie ich treści, dodatkowych danych i zapis we własnej bazie danych. W efekcie otrzymamy serwis podobny do innych ofertowych serwisów, lecz oferujący przegląd ofert z wielu źródeł. Kwestia to napisanie parserów dla każdego serwisu - listę najnowszych ofert zazwyczaj otrzymamy z RSS, do tego trochę regexów do wyciągnięcia treści ogłoszenia z gotowej strony, jak i dla każdego źródła będzie pewnie konieczne trochę poprawek różnego typu (CSS, w parserze), żeby treść importowała się w miarę poprawnie - chyba że i treść ogłoszenia rozbijemy na poszczególne składowe pozbywając się formatowania HTML źródła.&lt;/p&gt;
&lt;p&gt;Dla przykładu dość prosty parser:
&lt;div class=&quot;box&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;datetime&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;os&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;environ&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;urllib2&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;re&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;findall&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;environ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'DJANGO_SETTINGS_MODULE'&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;s&quot;&gt;'settings'&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;feedparser&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;settings&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;django.contrib.sessions.models&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# proof-of-concept app&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;diamandas.jobmaster.models&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;############&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;## Jobexpress&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;############&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;JobSource&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Jobexpress'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;## IT&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;feedparser&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'http://www.jobexpress.pl/recent,it,84.html'&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;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'entries'&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;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elem&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;s&quot;&gt;'entries'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'summary_detail'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;published&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'value'&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;split&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;mf&quot;&gt;0&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;strip&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;split&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;n&quot;&gt;published&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;published&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;published&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;published&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;company&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'value'&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;split&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;mf&quot;&gt;1&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;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		
		&lt;span class=&quot;n&quot;&gt;opener&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;urllib2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;build_opener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;opener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addheaders&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;'user-agent'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'referer'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'http://www.jobexpress.pl/recent,it,84.html'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;opener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'link'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;findall&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;r'(?xs)&amp;lt;ul\s*class=&amp;quot;oferta_pracy&amp;quot;&amp;gt;(.*?)&amp;lt;!--\s*eof:\s*oferta'''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;of&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;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;# cleaning&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'&amp;lt;ul&amp;gt;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&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;'href=&amp;quot;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'href=&amp;quot;http://www.jobexpress.pl/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&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;'src=&amp;quot;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'src=&amp;quot;http://www.jobexpress.pl/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
			
			&lt;span class=&quot;n&quot;&gt;city&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;findall&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;r'(?xs)&amp;lt;span\s*class=&amp;quot;cv_label&amp;quot;&amp;gt;Miejsce\s*pracy:\s*&amp;lt;/span&amp;gt;(.*?)&amp;lt;/li&amp;gt;'''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&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;city&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0&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;strip&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;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;city&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;c&quot;&gt;# TODO&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;region&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Na bazie miasta'&lt;/span&gt;
			
			&lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Informatyka/Programowanie'&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;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;JobOffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'title'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;company&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;company&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;city&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;p&quot;&gt;:&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;JobOffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'title'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;company&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;company&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&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;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'link'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;indexed_at&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;updated_at&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
						&lt;span class=&quot;n&quot;&gt;published_on_source&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;published&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;offer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save&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;u'ZAPISANO: &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;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'title'&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;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;updated_at&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;offer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;
				&lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save&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;u'ZAKTUALIZOWANO: &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;n&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'title'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
			
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
A modele mogą wyglądać np. tak:
&lt;div class=&quot;box&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JobSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;sd&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt;	Keeps a &amp;quot;list&amp;quot; of sites with job offers that are parsed by the application.&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt;	Just for ease of data manipulation&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt;	&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Tytuł'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&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;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'URL Strony głównej'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;css&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TextField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Style CSS'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&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;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Serwis z ofertami'&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;verbose_name_plural&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Serwisy z ofertami'&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__str__&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;k&quot;&gt;return&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;title&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__unicode__&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;k&quot;&gt;return&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;title&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JobOffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;sd&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt;	Indexed job offers from various sites&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt;	&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;position&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Stanowisko'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;company&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Firma'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ForeignKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;JobSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Źródło'&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;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'URL oferty'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;indexed_at&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DateTimeField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Data zaindeksowania oferty'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;updated_at&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DateTimeField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&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;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&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;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Data ostatniej aktualizacji'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;published_on_source&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DateTimeField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&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;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&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;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Data publikacji na stronie-źródle'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;is_inactive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BooleanField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&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;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Oferta nieaktywna'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;city&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Miasto'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;region&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Województwo'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CharField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Branża'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;offer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TextField&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Treść oferty'&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;Meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;verbose_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Oferta'&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;verbose_name_plural&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'Oferty'&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__str__&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;k&quot;&gt;return&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;position&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__unicode__&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;k&quot;&gt;return&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;position&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
Powyższy przykład jest dość prosty i sporo można rozbudować ten pomysł (jak i wyciągać rozbite dane, a nie zbitą treść oferty). Ale w efekcie można wyświetlić ogłoszenie u siebie (choć aplikowanie zazwyczaj wymaga przejścia na źródłowy serwis):
&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/jobmaster.png&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/thumb_jobmaster.png&quot; alt=&quot;jobmaster.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Normalny serwis z dobrą marką zarabia na publikacji ogłoszeń, a tego typu serwis mógłby zarabiać np. poprzez dodatkowe usługi sprzedawane indeksowanym serwisom (np. własny szablon, wyróżnianie ofert), jak i też standardowo na reklamach kontekstowych. Ważne żeby indeks był kompletny i łatwo dostępny. Czy jest miejsce dla dobrze napisanego serwisu tego typu? Myślę że tak... jakieś komentarze? :)
&lt;/p&gt;.c { color: #408080; font-style: italic } /* Comment */
.err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666666 } /* Operator */
.cm { color: #408080; font-style: italic } /* Comment.Multiline */
.cp { color: #BC7A00 } /* Comment.Preproc */
.c1 { color: #408080; font-style: italic } /* Comment.Single */
.cs { color: #408080; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #FF0000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #00A000 } /* Generic.Inserted */
.go { color: #808080 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #0040D0 } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #7D9029 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #880000 } /* Name.Constant */
.nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #999999; font-weight: bold } /* Name.Entity */
.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.nf { color: #0000FF } /* Name.Function */
.nl { color: #A0A000 } /* Name.Label */
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666666 } /* Literal.Number.Oct */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #BB6688 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.il { color: #666666 } /* Literal.Number.Integer.Long */</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Zapraszam na PyconPL 2009</title>
		<link href="http://zgodowie.org/2009/07/01/zapraszam-na-pyconpl-2009/"/>
		<id>http://zgodowie.org/2009/07/01/zapraszam-na-pyconpl-2009/</id>
		<updated>2009-07-01T10:52:55+00:00</updated>
		<content type="html">&lt;p&gt;Jeżeli ktoś jeszcze się zastanawia, czy wybrać się na &lt;a href=&quot;http://liwo.polsl.pl/pycon-pl/o-pycon-pl&quot;&gt;PyconPL do Ustronia w październiku&lt;/a&gt;, to może przekonam go tym, że będę tam trzymał &lt;em&gt;spicz&lt;/em&gt; na temat przygód Adama Słodowego w krainie ramówek webowych &amp;mdash; rozłożę na czynniki pierwsze jakąś ramówkę (pewnie będzie to najbliższe mi &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;) i spróbuję złożyć coś podobnego ...&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-07-01T11:47:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Profilowanie kodu Pythona za pomocą Pympler</title>
		<link href="http://www.python.rk.edu.pl/w/p/profilowanie-kodu-pythona-za-pomoca-pympler/"/>
		<id>http://www.python.rk.edu.pl/w/p/profilowanie-kodu-pythona-za-pomoca-pympler/</id>
		<updated>2009-06-30T12:12:59+00:00</updated>
		<content type="html">&lt;a href=&quot;http://code.google.com/p/pympler/&quot;&gt;Pympler&lt;/a&gt; to zestaw narzędzi dla Pythona pozwalający mierzyć, monitorować i analizować wykorzystanie pamięci przez kod Pythona. Narzędzia te są dość dobrze &lt;a href=&quot;http://packages.python.org/Pympler/index.html&quot;&gt;udokumentowane&lt;/a&gt; i działają na wszystkich bieżących wydaniach Pythona.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">PyBonjour</title>
		<link href="http://www.python.rk.edu.pl/w/p/pybonjour/"/>
		<id>http://www.python.rk.edu.pl/w/p/pybonjour/</id>
		<updated>2009-06-30T11:25:10+00:00</updated>
		<content type="html">Pythonowe API na usługę Bonjour do wykrywania urządzeń w sieci i usług jakie oferują.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Treść w Plone3</title>
		<link href="http://www.python.rk.edu.pl/w/p/tresc-w-plone3/"/>
		<id>http://www.python.rk.edu.pl/w/p/tresc-w-plone3/</id>
		<updated>2009-06-29T16:34:00+00:00</updated>
		<content type="html">Przegląd dostępnych w Plone typów treści.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Atak na zabezpieczenia protected/private Javy/Scali i PHP5</title>
		<link href="http://blog.zabiello.com/2009/06/21/zabezpieczenia-protected-private-java-scala-php5"/>
		<id>tag:blog.zabiello.com:Article1391</id>
		<updated>2009-06-29T07:45:24+00:00</updated>
		<content type="html">&lt;div&gt;
&lt;p&gt;Być może jednym z argumentów, dla których Ruby znajduje więcej zainteresowania ze strony programistów Javy niż Python, jest podobny mechanizm zabezpieczenia dostępu do atrybutów klasy za pomocą słów kluczowych &lt;em&gt;private&lt;/em&gt; i &lt;em&gt;protected&lt;/em&gt;. W języku &lt;span class=&quot;caps&quot;&gt;PHP 5&lt;/span&gt; wprowadzono podobny mechanizm. Ci jednak, którzy myślą, że te kwalifikatory zakresu dostępu stanowią jakiekolwiek poważne zabezpieczenie, są w głębokim błędzie. W banalny sposób można to obejść zarówno w w &lt;span class=&quot;caps&quot;&gt;PHP 5&lt;/span&gt;, jak i w Javie. Przy czym o ile, w Javie wynika to raczej z celowego projektu w mechanizmie refleksji, w &lt;span class=&quot;caps&quot;&gt;PHP 5&lt;/span&gt; wygląda to na dziurę bezpieczeństwa…&lt;/p&gt;


	&lt;p&gt;Aby przełamać zabezpieczenia dostępu do atrybutów &lt;em&gt;private&lt;/em&gt; i &lt;em&gt;protected&lt;/em&gt; w wypadku Javy wystarczy użyć refleksji. W związku z tym, że Scala korzysta z tego samego mechanizmu refleksji co Java, problem ten dotyczy tak samo Scali. Poniższy kod wyświetla wartości atrybutów &lt;em&gt;private&lt;/em&gt; i &lt;em&gt;protected&lt;/em&gt;.&lt;/p&gt;


&lt;pre class=&quot;brush:scala&quot;&gt;   
import java.lang.reflect.{Field}

class SecureData  {
  private val priv = &quot;my-private-value&quot; 
  protected val prot = &quot;my-protected-value&quot; 
}

object Main {
  def main(args:Array[String]) {
    val obj = new SecureData()
    for(f &amp;lt;- obj.getClass.getDeclaredFields) {
      f.setAccessible(true)
      println(f.getName+&quot;=&quot;+f.get(obj))
    }
  }
}
&lt;/pre&gt;

	&lt;p&gt;Powyższy kod nie jest jakimś hackerskim zabiegiem. Jest zwykłym użyciem tego co daje refleksja. Tzn. domyślnie metoda &lt;code&gt;setAccessible&lt;/code&gt; pozwala zmienić dostęp do tych atrybutów (można to samo zrobić z metodami), o ile nie podejmiemy specjalnych działań zapobiegawczych poprzez użycie np. SecurityManagera.&lt;/p&gt;


	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;W PHP 5&lt;/span&gt; użycie refleksji nic nie pomoże, bo nie ma tam metody &lt;code&gt;setAccessible&lt;/code&gt;. Jednakże, na skutek błędów w implementacji &lt;span class=&quot;caps&quot;&gt;PHP 5&lt;/span&gt; (sprawdzane włącznie z najnowszym, wydanym 2 dni temu, &lt;span class=&quot;caps&quot;&gt;PHP 5&lt;/span&gt;.3 &lt;span class=&quot;caps&quot;&gt;RC4&lt;/span&gt;) złamanie zabezpieczeń tego języka jest też bardzo łatwe. Poniższa funkcja &lt;code&gt;expose&lt;/code&gt; wyświetli każdy atrybut danej instancji klasy, bez względu na to czy atrybut ten jest chroniony kwalifikatorem &lt;em&gt;protected&lt;/em&gt; czy &lt;em&gt;private&lt;/em&gt;.&lt;/p&gt;


&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php
class SecureData {
  private $priv=&quot;my-private-value&quot;;
  protected $prot=&quot;my-protected-value&quot;;
}

function expose($obj, $attr_name) {
  $a = (array)$obj;
  $r = new ReflectionProperty($obj, $attr_name);
  if ($r-&amp;gt;isPrivate())
    return $a[&quot;\0&quot;.get_class($obj).&quot;\0&quot;.$attr_name];
  elseif ($r-&amp;gt;isProtected()) 
    return $a[&quot;\0*\0&quot;.$attr_name];
  else 
    return $obj-&amp;gt;$attr_name;
}

$c = new SecureData;
echo expose($c, 'priv'); # =&amp;gt; my-private-value
echo expose($c, 'prot'); # =&amp;gt; my-protected-value
?&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;Można też iść “na całość” i zmodyfikować treści udostępnianie przez te atrybuty, co może być trochę katastrofalne w skutkach. Wystarczy zamiast rzutowania do array’a użyć metody &lt;code&gt;settype&lt;/code&gt;. Jedyną wadą jest to, że po użyciu &lt;code&gt;settype&lt;/code&gt; zniszczona została cała informacja o klasie i interfejsie obiektu.&lt;/p&gt;


&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php
function hack(&amp;amp;$obj, $attr_name, $value) {
  $r = new ReflectionProperty($obj, $attr_name);
  $class = get_class($obj);
  settype($obj, 'array');
  if ($r-&amp;gt;isPrivate())
    $obj[&quot;\0$class\0&quot;.$attr_name] = $value;
  elseif ($r-&amp;gt;isProtected()) 
    $obj[&quot;\0*\0&quot;.$attr_name] = $value;
} 

$c = new SecureData;
hack($c, 'priv', 'my-hacked-private-value'); 
var_dump($c);
/*
array(2) {
  [&quot;Cpriv&quot;]=&amp;gt;
  string(23) &quot;my-hacked-private-value&quot; 
  [&quot;*prot&quot;]=&amp;gt;
  string(18) &quot;my-protected-value&quot; 
} 
*/
?&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;Na tym tle stanowisko Pythona nie brzmi wcale aż tak źle. W Pythonie wszystkie metody i atrybuty są &lt;em&gt;publiczne&lt;/em&gt;. Jeśli programista chce to ma dostęp do wszystkiego. I tak przecież będzie miał taki dostęp jak się uprze, więc po co mu utrudniać życie, prawda? Wg filozofii Pythona, jedyną zaletą posiadani takich kwalifikatorów dostępu byłoby to, aby uniknąć &lt;strong&gt;pomyłki&lt;/strong&gt; a nie, aby bić programistę po łapach. W Pythonie  rozwiązano to za pomocą tzw. “manglingu”  nazw. Otóż metody (i atrybuty) których nazwy zaczynają się od dwóch znaków podkreślenia (ale równocześnie nie mogą się kończyć takimi znakami) są traktowane specjalnie przy próbie uzyskania do nich dostępu. Tzn. formalnie nadal są public (tak jak wszystko inne), trzeba jednak użyć trochę innej, lekko zamotanej, składni. I to jest wystarczające, aby programista się nie pomylił.&lt;/p&gt;


&lt;pre class=&quot;brush:python&quot;&gt;                   
class SecureData(object):
  __priv = &quot;my-private=value&quot; 
  _prot = &quot;my-protected-value&quot; 

try: 
  print SecureData.__priv
except AttributeError:
  print &quot;Wrong syntax, you lame!&quot; 

print SecureData._SecureData__priv 
# =&amp;gt; my-private=value  
&lt;/pre&gt;  

	&lt;p&gt;Zobacz też&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://javabeans.asia/2008/10/13/hack_any_java_class_using_reflection_attack.html&quot;&gt;Hack any Java class using reflection attack&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://javabeans.asia/2008/10/12/how_to_set_securitymanager_and_java_security_policy_programmatically.html&quot;&gt;How to set SecurityManager and Java security policy programmatically&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&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>2009-06-29T07:47:32+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Python 3.1</title>
		<link href="http://python.org.pl/python,31.html"/>
		<id>http://python.org.pl/python,31.html</id>
		<updated>2009-06-28T15:57:52+00:00</updated>
		<content type="html">Benjamin Peterson (Release Manager) ogłosił wydanie wersji 3.1 z nowej gałęzi Pythona 3.x.  
   Wydanie to przynosi wiele zmian zarówno w bibliotece standardowej jak i w samym języku. Poniżej przedstawiamy najważniejsze zmiany:    
     
   Nowe moduły:   
   - collections.OrderedDict  
   - collections.Counter  
   - tkinter.ttk  
   - importlib  
   - moduł itertools wzbogacił się o dwie nowe funkcje: combinations_with_replacement() i itertools.compress()  
     
   Warto wymienić jeszcze 2 istotne zmiany:  
   W funkcjach format() i str.format(), można użyć separatora do oddzielenia grup trzycyfrowych(Thousands Separator).  
   Składnia konstrukcji with pozwala teraz na stworzenie kilku Contex Manager-ów w jednej instrukcji.  
     
   Python 3.1 to nie tylko nowości, ale również optymalizacje.  
   Przy wydaniu wersji 3.0 pojawiło się wiele narzekań na bardzo słabą wydajność modułu io z tego powodu został on przepisany w języku C i jest on teraz od 2 do 20 razy szybszy.  
   Podczas konfiguracji można użyć flagi --with-computed-gotos dzięki której można zanotować przyśpieszenie nawet o 20% (issue4753)  
     
   Szczegółowy opis wszystkich zmian standardowo znajdziemy w dokumencie What's new w dokumentacji Pythona 3.1.  
     
   Wydanie to nie obyło się jednak bez zgrzytów. Przed wydaniem wersji rc1 do biblioteki standardowej dodano bibliotekę do manipulacji adresami IP autorstwa kilku pracowników Google o nazwie ipaddr. W tym momencie rozgorzała ostra dyskusja na temat użyteczności tej biblioteki i sposobu jej działania. W trakcie dyskusji pojawiły się propozycje zastosowania innych bibliotek, które miałyby lepiej sprawować swoją funkcję.  
   W końcu, wbrew polityce wydań wersji Release Candidate, przed wydaniem rc2 biblioteka ipaddr została usunięta. Cała sprawa była na tyle głośna, że doczekała się artykułu w magazynie lwn.net.  
     
   Źródło: python.org</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://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://python.org.pl/atom.atom</id>
			<updated>2009-07-01T13:47:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Instalacja nowych skórek w Plone</title>
		<link href="http://www.python.rk.edu.pl/w/p/instalacja-nowych-skorek-w-plone/"/>
		<id>http://www.python.rk.edu.pl/w/p/instalacja-nowych-skorek-w-plone/</id>
		<updated>2009-06-28T10:16:53+00:00</updated>
		<content type="html">Prosty przewodnik opisujący instalację nowych skórek za pomocą buildout</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wprowadzenie do Plone</title>
		<link href="http://www.python.rk.edu.pl/w/p/wprowadzenie-do-plone/"/>
		<id>http://www.python.rk.edu.pl/w/p/wprowadzenie-do-plone/</id>
		<updated>2009-06-28T08:44:10+00:00</updated>
		<content type="html">Podstawowe informacje, oraz lokalna instalacja Plone/Zope</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Wyspa Mrozu, gra cRPG w Django - zrzut kodu dostępny</title>
		<link href="http://www.python.rk.edu.pl/w/p/wyspa-mrozu-gra-crpg-w-django-zrzut-kodu-dostepny/"/>
		<id>http://www.python.rk.edu.pl/w/p/wyspa-mrozu-gra-crpg-w-django-zrzut-kodu-dostepny/</id>
		<updated>2009-06-25T13:29:35+00:00</updated>
		<content type="html">&lt;p&gt;Postanowiłem wydać paczkę z obecnym kodem bardzo-rozwojowym Wyspy Mrozu, przeglądarkowej gry cRPG napisanej w Django. Paczka jest w wersji anglojęzycznej (częściowo wprowadzone i18n), ale spokojnie można się tym pobawić, przejrzeć kod i podzielić się wrażeniami. Gra jest daleka od ukończenia, jeszcze wiele szczegółów trzeba zaimplementować itd. Paczka dostępna jest na licencji Creative Commons BY NC SA i dalszy publiczny rozwój uzależniony jest od odzewu innych programistów :) Polskie demon dostępne jest w &lt;a href=&quot;http://www.crpg.rk.edu.pl/ice/&quot;&gt;Bibliotece cRPG&lt;/a&gt; - wystarczy się zalogować i gotowe. Pakiet zawiera ikony Legendora, grafiki z dreamweavedworlds.com, a także z Baldurs Gate, Icewind Dale (używane tymczasowo w obecnej fazie rozwoju), które mają własne licencje.&lt;/p&gt;
&lt;p&gt;
&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/ice1.png&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/thumb_ice1.png&quot; alt=&quot;ice1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/ice2.jpg&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/thumb_ice2.jpg&quot; alt=&quot;ice2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/ice3.jpg&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/thumb_ice3.jpg&quot; alt=&quot;ice3.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/ice4.jpg&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/rkblog.rk.edu.pl/images/thumb_ice4.jpg&quot; alt=&quot;ice4.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;a href=&quot;http://www.rk.edu.pl/ice.zip&quot;&gt;&lt;b&gt;Wyspa Mrozu ZIP&lt;/b&gt;&lt;/a&gt;</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Python okiem programisty PHP - kompletne porównanie</title>
		<link href="http://blog.zeromski.com.pl/2009/06/python-okiem-programisty-php-kompletne-porownanie/"/>
		<id>http://blog.zeromski.com.pl/2009/06/python-okiem-programisty-php-kompletne-porownanie/</id>
		<updated>2009-06-22T19:47:31+00:00</updated>
		<content type="html">Moja przygoda z pytonem zaczęła się w lutym 2008 i zakończyła się w czerwcu 2008. Szkic tego artykułu powstał pół roku temu, dziś mam nadzieję go ukończę i opublikuję. Zainteresowałem się tą technologią (python) z nadzieją, iż moje aplikacje będą o kilka poziomów lepsze. Aktualna praca pozwalała mi na małe R&amp;#38;D, więc po uzgodnieniu z [...]</content>
		<author>
			<name>Mateusz Zeromski</name>
			<uri>http://blog.zeromski.com.pl</uri>
		</author>
		<source>
			<title type="html">Mateusz Żeromski - Blog programisty » python</title>
			<subtitle type="html">IT z innej strony :)</subtitle>
			<link rel="self" href="http://blog.zeromski.com.pl/tag/python/rss"/>
			<id>http://blog.zeromski.com.pl/tag/python/rss</id>
			<updated>2009-06-22T19:47:31+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-06-22T09:04:48+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 = warunek if wyrazenie1 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;. Zobacz też &lt;a href=&quot;http://code.google.com/p/sweetscala/&quot;&gt;SweetScala&lt;/a&gt; – konkurencyjny framework w Scali)&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;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>2009-06-29T07:47:32+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Nowe tutoriale dla Pylonsa</title>
		<link href="http://www.python.rk.edu.pl/w/p/nowe-tutoriale-dla-pylonsa/"/>
		<id>http://www.python.rk.edu.pl/w/p/nowe-tutoriale-dla-pylonsa/</id>
		<updated>2009-06-21T09:50:20+00:00</updated>
		<content type="html">Ostatnio pojawiły się w sieci dwa tutoriale dotyczące frameworka Pylons z wykorzystaniem &quot;nowych&quot; technologii. Pierwszy z nich: &lt;a href=&quot;http://www.commandprompt.com/blogs/lacey_powers/2009/06/pylons_postgresql_and_simpycity_in_60_minutes_or_less/&quot;&gt;Pylons, PostgreSQL, and Simpycity in 60 Minutes or Less&lt;/a&gt; dość szczegółowo opisuje wykorzystanie Simpycity przy tworzeniu serwisu www. Simpycity to biblioteka Pythona mapująca zapytania i procedury PostgreSQL do prostych wywołań w Pythonie. Druga publikacja, a właściwie &lt;a href=&quot;http://bitbucket.org/bbangert/minger/src/&quot;&gt;kod źródłowy&lt;/a&gt; to prosty &quot;blog&quot; w MongoDB :) Jest to nierelacyjna baza danych dokumentów podobna do CouchDB, lecz napisana w C++.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Google App Engine Python SDK 1.2.3 z obsługą Django 1.0</title>
		<link href="http://www.python.rk.edu.pl/w/p/google-app-engine-python-sdk-123-z-obsluga-django-10/"/>
		<id>http://www.python.rk.edu.pl/w/p/google-app-engine-python-sdk-123-z-obsluga-django-10/</id>
		<updated>2009-06-21T09:23:26+00:00</updated>
		<content type="html">W piątek wydano kolejną wersję GAE SDK dla Pythona dodając obsługę Django 1.0 (nie trzeba go już przesyłać wraz z projektem), a także eksperymentalne kolejkowanie i wykonywanie w tle zadań (&lt;a href=&quot;http://code.google.com/intl/pl/appengine/docs/python/taskqueue/&quot;&gt;Task Queue&lt;/a&gt;). Także zgodnie z planem jutro powinny zostać &lt;a href=&quot;http://code.google.com/intl/pl/appengine/docs/quotas.html#Free_Changes&quot;&gt;zmniejszone limity dla &quot;darmowych&quot; kont&lt;/a&gt; do 6,5 godziny czasu procesora dziennie i 1 GB danych wysłanych i odebranych przez aplikację.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Jak Pownce skalowało aplikacje Django</title>
		<link href="http://www.python.rk.edu.pl/w/p/jak-pownce-skalowalo-aplikacje-django/"/>
		<id>http://www.python.rk.edu.pl/w/p/jak-pownce-skalowalo-aplikacje-django/</id>
		<updated>2009-06-21T09:09:34+00:00</updated>
		<content type="html">Mike Malone w prezentacji opisuje różne &lt;a href=&quot;http://immike.net/files/scaling_django.pdf&quot;&gt;metody skalowania aplikacji Django&lt;/a&gt;, jakie były stosowane w pownce.com, webowym komunikatorze zbudowanym z wykorzystaniem technologii Adobe AIR jak i Django.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">&amp;amp;quot;Django, Ćwiczenia&amp;amp;quot; już niebawem...</title>
		<link href="http://www.python.rk.edu.pl/w/p/django-cwiczenia-juz-niebawem/"/>
		<id>http://www.python.rk.edu.pl/w/p/django-cwiczenia-juz-niebawem/</id>
		<updated>2009-06-19T14:19:01+00:00</updated>
		<content type="html">&quot;&lt;a href=&quot;http://helion.pl/ksiazki/cwdjan.htm&quot;&gt;Django, ćwiczenia&lt;/a&gt;&quot;, książka mojego autorstwa powinna niebawem trafić do sklepów (przynajmniej mam taką nadzieję :)). 88 stron to wprowadzenie do Django na bazie prostej aplikacji, rozbudowywanej krok po kroku prezentując kolejne elementy frameworka. Oprócz Django znajdzie się też trochę o GAE i Django + GAE.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Biblioteka standardowa Pythona w Native Client</title>
		<link href="http://www.python.rk.edu.pl/w/p/biblioteka-standardowa-pythona-w-native-client/"/>
		<id>http://www.python.rk.edu.pl/w/p/biblioteka-standardowa-pythona-w-native-client/</id>
		<updated>2009-06-18T15:22:21+00:00</updated>
		<content type="html">Mark Seaborn donosi na &lt;a href=&quot;http://lackingrhoticity.blogspot.com/2009/06/python-standard-library-in-native.html&quot;&gt;swoim blogu&lt;/a&gt; o udanym wykorzystaniu biblioteki standardowej wewnątrz przeglądarki za pomocą Native Client. Jest to jak na razie rozwiązanie mocno &quot;deweloperskie&quot;, ale z czasem może dać ciekawe możliwości przy konstruowaniu aplikacji webowych.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Jython 2.5</title>
		<link href="http://python.org.pl/jython,25.html"/>
		<id>http://python.org.pl/jython,25.html</id>
		<updated>2009-06-16T22:11:31+00:00</updated>
		<content type="html">16 Czerwca 2009 roku Frank Wierzbicki, główny developer Jythona, ogłosił na swoim blogu wydanie stabilnej wersji Jythona 2.5.  
   Tym samym Jython stał się czwartą dostępną implementacją Pythona 2.5, pozostałe to: CPython, IronPython oraz PyPY.  
     
   Przed pojawieniem się stabilnego wydania ukazały się aż 4 wersje Release Candidate, przy czym w dwóch ostatnich skupiono się głównie na poprawie stabilności działania w systemach z rodziny Windows.  
     
   Pobierz: Jython 2.5  
     
   Więcej informacji: Frank Wierzbicki Blog, Jython</content>
		<author>
			<name>Łukasz Oleś</name>
			<uri>http://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://python.org.pl/atom.atom</id>
			<updated>2009-07-01T13:47:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">QYolk - menedżer pakietów Pythona v 0.2</title>
		<link href="http://www.python.rk.edu.pl/w/p/qyolk-menedzer-pakietow-pythona-v-01/"/>
		<id>http://www.python.rk.edu.pl/w/p/qyolk-menedzer-pakietow-pythona-v-01/</id>
		<updated>2009-06-15T07:20:00+00:00</updated>
		<content type="html">Yolk to aplikacja do zarządzania pakietami (eggami) Pythona poprzez setuptools. Swego czasu w tutorialach PyQt4 zrobiłem prostą nakładkę dla tej aplikacji, lecz nie działa ona z obecną wersją Yolka. Mając chwilę czasu zaprojektowałem zupełnie nową aplikację GUI w PyQt4 wykorzystującą Yolk i setuptools - &lt;b&gt;QYolk&lt;/b&gt;. Wersja 0.2 posiada:
&lt;ul&gt;
&lt;li&gt;Listowanie pakietów Pythona, filtrowanie aktywny/nieaktywny&lt;/li&gt;
&lt;li&gt;Wyświetlanie informacji o danym pakiecie&lt;/li&gt;
&lt;li&gt;Sprawdzanie i aktualizowanie danego pakietu&lt;/li&gt;
&lt;li&gt;Sprawdzanie aktualizacji dla wszystkich pakietów z obecnej listy&lt;/li&gt;
&lt;li&gt;Wielojęzyczny interfejs (Polski, Angielski obecnie)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/qyolk_new1.png&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/thumb_qyolk_new1.png&quot; alt=&quot;qyolk_new1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/qyolk_new2.png&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/thumb_qyolk_new2.png&quot; alt=&quot;qyolk_new2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Do uruchomienia (&quot;python run.py&quot;) QYolk potrzeba PyQt4, setuptools, yolk i opcjonalnie docutils.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/download/qyolk-0.2.tar.gz&quot;&gt;&lt;b&gt;qyolk-0.2.tar.gz&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/download/qyolk-0.2a-osx.zip&quot;&gt;&lt;b&gt;Mac OS X gotowa aplikacja (intel)&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">PyObjC i Cocoa kontra PyQt4</title>
		<link href="http://www.python.rk.edu.pl/w/p/pyobjc-i-cocoa-kontra-pyqt4/"/>
		<id>http://www.python.rk.edu.pl/w/p/pyobjc-i-cocoa-kontra-pyqt4/</id>
		<updated>2009-06-14T06:27:43+00:00</updated>
		<content type="html">Mając chwilę czasu na zabawę z Pythonem pod Mac OS X postanowiłem się przyjrzeć bardziej natywnej formie tworzenia aplikacji napisanych w Pythonie pod tą platformę. Leopard i wydane wraz z nim (i nowsze) wersje XCode posiadają prosto z pudełka wsparcie dla PyObjC - mostu pomiędzy Objective-C a Pythonem. Za pomocą IDE (XCode) możemy utworzyć projekt Cocoa-Python, graficznie zbudować interfejs, graficznie łączyć elementy interfejsu z naszymi kontrolerami w kodzie... niby fajnie, ale jest parę &quot;ale&quot;.
&lt;div class=&quot;thumb&quot;&gt;&lt;a href=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/pyxcode.png&quot; rel=&quot;thumbnail&quot;&gt;&lt;img src=&quot;http://www.python.rk.edu.pl/site_media/resources/python.rk.edu.pl/images/thumb_pyxcode.png&quot; alt=&quot;pyxcode.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Brak dobrej i czytelnej dokumentacji dla PyObjC, brak prostego tutoriala wprowadzającego w tworzenie prostej aplikacji z GUI i obsługę dostępnych narzędzi. Istnieje wprawdzie tutorial &lt;a href=&quot;http://lethain.com/entry/2008/aug/22/an-epic-introduction-to-pyobjc-and-cocoa/&quot;&gt;An Epic Introduction to PyObjC and Cocoa&lt;/a&gt;, ale to praktycznie jedyny aktualny tutorial, którego autor zakłada że znamy mniej lub bardziej biblioteki i narzędzia Leoparda. Generalnie trzeba siedzieć z dokumentacją do Objective-C i &quot;przekładać&quot; to na Pythona samemu.&lt;/li&gt;
&lt;li&gt;Jak sam projekt się określa, PyObjC to &quot;most&quot; pomiędzy Objective-C a Pythonem, przez co kod w Pythonie wygląda czasami dziwnie. Np. wywołania metod Objective-C z Pythona:
&lt;div class=&quot;box&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dragImageForRowsWithIndexes_tableColumns_event_offset_&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;dragRows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tableColumns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dragEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dragImageOffset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Stworzona aplikacja będzie działać tylko na jednej platformie.&lt;/li&gt;
&lt;li&gt;Bazując na swoich odczuciach i opiniach z różnych blogów - PyObjC jest &quot;zrozumiały i przyjemny&quot; dla programistów znających architekturę i biblioteki OS X. Nie potrafią przyswoić generalnie tworzenia GUI w stylu PyQt4/PyGTK+. Programiści przychodzący z zewnątrz mają na odwrót - nie mogą ogarnąć PyObjC :)&lt;/li&gt;
&lt;/ul&gt;
Można spokojnie tworzyć aplikacje np. w PyQt4, które będą działały na wszystkich obsługiwanych przez tą bibliotekę systemach operacyjnych, jednakże trzeba stworzoną aplikację przetestować i dość często dopasować pod dany system operacyjny..c { color: #408080; font-style: italic } /* Comment */
.err { border: 1px solid #FF0000 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666666 } /* Operator */
.cm { color: #408080; font-style: italic } /* Comment.Multiline */
.cp { color: #BC7A00 } /* Comment.Preproc */
.c1 { color: #408080; font-style: italic } /* Comment.Single */
.cs { color: #408080; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.gr { color: #FF0000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #00A000 } /* Generic.Inserted */
.go { color: #808080 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #0040D0 } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #7D9029 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
.no { color: #880000 } /* Name.Constant */
.nd { color: #AA22FF } /* Name.Decorator */
.ni { color: #999999; font-weight: bold } /* Name.Entity */
.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.nf { color: #0000FF } /* Name.Function */
.nl { color: #A0A000 } /* Name.Label */
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.w { color: #bbbbbb } /* Text.Whitespace */
.mf { color: #666666 } /* Literal.Number.Float */
.mh { color: #666666 } /* Literal.Number.Hex */
.mi { color: #666666 } /* Literal.Number.Integer */
.mo { color: #666666 } /* Literal.Number.Oct */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #BB6688 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.il { color: #666666 } /* Literal.Number.Integer.Long */</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Android Scripting Environment z Pythonem</title>
		<link href="http://www.python.rk.edu.pl/w/p/android-scripting-environment-z-pythonem/"/>
		<id>http://www.python.rk.edu.pl/w/p/android-scripting-environment-z-pythonem/</id>
		<updated>2009-06-14T06:06:13+00:00</updated>
		<content type="html">&lt;a href=&quot;http://code.google.com/p/android-scripting/&quot;&gt;ASE&lt;/a&gt; to narzędzie/framework dla Androida umożliwiający pisanie skryptów mających dostęp do API Androida. Obecnie obsługiwane są trzy języki: Python, Lua i BeanShell. Za pomocą ASE w prosty sposób, bez konieczności użycia Javy można tworzyć proste i funkcjonalne skrypty i aplikacje. Kilka przykładów podanych jest &lt;a href=&quot;http://code.google.com/p/android-scripting/wiki/PythonAndroidAPI&quot;&gt;w dokumentacji API Pythona&lt;/a&gt;.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Cscope</title>
		<link href="http://husio.homelinux.com/blog/post/cscope"/>
		<id>http://husio.homelinux.com/blog/post/cscope</id>
		<updated>2009-06-12T22:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Czytając kod który napisał ktoś inny, największym problemem jest podążanie za
   kolejnymi wywołaniami funkcji. Zdarza się też tak, że znam nazwę lub jej
   fragment i chcę znaleźć wszystkie odwołania. Jak sobie z tym poradzić? Do tej
   pory używałem &lt;a href=&quot;http://husio.homelinux.com/blog/post/debugowanie-w-pythonie/&quot;&gt;grepa&lt;/a&gt; uruchamianego przez
   odpowiedni Vimowy plugin. Rozwiązanie sprawdza się dla projektów z niewielką
   ilością kodu. Gorzej jeśli na wynik trzeba czekać parę sekund, bo architektura
   Vima nie pozwala w tym czasie robić cokolwiek innego.
&lt;/p&gt;
&lt;p&gt;Konkurencyjnym rozwiązaniem jest &lt;a href=&quot;http://ctags.sourceforge.net/&quot;&gt;ctags&lt;/a&gt;, który
   jakoś nie przypadł mi do gustu. Trafiłem jednak na narzędzie o nazwie
   &lt;a href=&quot;http://cscope.sourceforge.net/&quot;&gt;cscope&lt;/a&gt;, które ponoć potrafi jeszcze więcej.
&lt;/p&gt;

&lt;h1&gt;Instalacja&lt;/h1&gt;
&lt;p&gt;Miłą niespodzianką jest fakt, że aby Vim był w stanie korzystać z cscope,
   wystarczy skompilować go z flagą &lt;code&gt;--enable-cscope&lt;/code&gt;. 
&lt;/p&gt;

&lt;h1&gt;Przygotowanie bazy&lt;/h1&gt;
&lt;p&gt;Aby móc skorzystać z cscope, podobnie jak w przypadku programu ctags, trzeba
   najpierw przygotować odpowiedni plik z danymi. Ponieważ cscope napisany został
   jako pomoc dla programistów C, w przypadku innych języków trzeba samodzielnie
   określić pliki które mają być skanowane. 
&lt;/p&gt;
&lt;p&gt;Aby utworzyć bazę dla mojego projektu który piszę w Pythonie, wpisuję kolejno
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd moj_projekt
$ find src -iname &quot;*.py&quot; &amp;gt; python_scope.files
$ cscope -bi python_scope.files
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Utworzony zostanie plik bazy o nazwie &lt;strong&gt;cscope.out&lt;/strong&gt; .
&lt;/p&gt;

&lt;h1&gt;Cscope w Vim&lt;/h1&gt;
&lt;p&gt;Cscope posiada własny, bardzo wygodny interfejs napisany w curses. Aby jednak
   nie trzeba było przełączać się między terminalami, równie dobrze można
   wykorzystać zaimplementowany w Vimie parser. Komenda &lt;code&gt;:cs&lt;/code&gt; wyświetli wszystkie
   możliwe polecenia. Pierwsze co należy sprawdzić, to czy do edytora podłączona
   jest jakakolwiek baza:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:cs show
brak połączeń z cscope

:cs add cscope.out
:cs show
 # pid   nazwa bazy danych               przedsionek tropu
 0 926    cscope.out                          &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Gotowe. Po utworzeniu połączenia z wcześniej przygotowanym ''cscope.out'', można
   zacząć przeszukiwane.
&lt;/p&gt;

&lt;h1&gt;Linki&lt;/h1&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href=&quot;http://cscope.sourceforge.net/&quot;&gt;cscope&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://www.vim.org/htmldoc/if_cscop.html#Cscope&quot;&gt;:h cscope&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href=&quot;http://www.manpagez.com/man/1/cscope/&quot;&gt;man cscope&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Piotr Husiatyński</name>
			<uri>http://husio.homelinux.com/linkpython/</uri>
		</author>
		<source>
			<title type="html">Piotr Husiatynski - Blog - RSS dla Python</title>
			<subtitle type="html">Ostatnie posty działu Python</subtitle>
			<link rel="self" href="http://husio.homelinux.com/blog/rss/tag/python/"/>
			<id>http://husio.homelinux.com/blog/rss/tag/python/</id>
			<updated>2009-06-28T22:47:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Riklaunim szuka pracy ;)</title>
		<link href="http://www.python.rk.edu.pl/w/p/riklaunim-szuka-pracy/"/>
		<id>http://www.python.rk.edu.pl/w/p/riklaunim-szuka-pracy/</id>
		<updated>2009-06-10T07:12:21+00:00</updated>
		<content type="html">Jak w temacie - poszukuję pracy jako programista Python (czy też ewentualnie Python/PHP) na umowę (prowadzę działalność gospodarczą), z czasem możliwa też umowa o pracę. Pełen etat. Więcej informacji przy kontakcie - &lt;a href=&quot;mailto:riklaunim@gmail.com&quot;&gt;riklaunim@gmail.com&lt;/a&gt;. Poniżej fragment CV:
&lt;blockquote&gt;
&lt;b&gt;Umiejętności programistyczne&lt;/b&gt;:
&lt;ul&gt;
&lt;li&gt;Bardzo dobra znajomość Pythona, frameworka Django oraz biblioteki PyQt4&lt;/li&gt;
&lt;li&gt;Bardzo dobra znajomość systemów Linuksowych (głównie Gentoo i Archlinux)&lt;/li&gt;
&lt;li&gt;Dobra znajomość PHP i frameworka CodeIgniter&lt;/li&gt;
&lt;li&gt;Dobra znajomość XHTML, CSS, podstawy jQuery i JavaScript&lt;/li&gt;
&lt;li&gt;Dobra znajomość relacyjnych baz danych (SQLite, MySQL i PostgreSQL)&lt;/li&gt;
&lt;li&gt;Znajomość podstaw systemów wbudowanych (Android, Maemo, iPhone OS)&lt;/li&gt;
&lt;li&gt;Znajomość zasad tworzenia przyjaznych wyszukiwarkom stron www (SEO)&lt;/li&gt;
&lt;li&gt;Znajomość systemów MS Windows XP, Mac OS X 10.5 Leopard oraz pakietów biurowych i innych aplikacji codziennego użytku.&lt;/li&gt;
&lt;/ul&gt;

&lt;b&gt;Doświadczenia zawodowe&lt;/b&gt;:
&lt;ul&gt;
&lt;li&gt;2009: Książka „Django. Ćwiczenia Praktyczne” dla wydawnictwa Helion&lt;/li&gt;
&lt;li&gt;2008.01 – 2009.07: Programista Python/Django w Goldenline.pl&lt;/li&gt;
&lt;li&gt;2007: Współpraca z redakcją „phpSolutions”&lt;/li&gt;
&lt;li&gt;2006: Współpraca z firmą TiGroup&lt;/li&gt;
&lt;li&gt;2005: Współpraca z redakcją „Magazyn Internet”&lt;/li&gt;
&lt;li&gt;2005: Współpraca z redakcją „Komputer Świat Ekspert”&lt;/li&gt;
&lt;/ul&gt;

&lt;b&gt;Własne projekty&lt;/b&gt;:
&lt;ul&gt;
&lt;li&gt;Biblioteka Riklaunima: zbiór serwisów poświęconych programowaniu, systemom operacyjnym, czy też grom cRPG. Zawierają one materiały stworzone przeze mnie, często niepowtarzalne na polskim rynku. Serwisy oparte są na autorskiej aplikacji napisanej w Django.&lt;/li&gt;
&lt;li&gt;Diamanda: zbiór aplikacji Django na otwartej licencji GPL, na których oparta jest Biblioteka Riklaunima&lt;/li&gt;
&lt;li&gt;Zbrojownia Albionu: aplikacja desktopowa przeznaczona dla graczy Areny Albionu. Program pozwala przymierzyć różne zestawy uzbrojenia wyliczając zarazem parametry rycerza (atak, obronę itd.). Aplikacja napisana w PyQt4 i działa pod MS Windows, OS X, jak i Linux/Unix.&lt;/li&gt;
&lt;li&gt;PyQt ExtraWidgets: zbiór dodatkowych widżetów do PyQt4 stworzony za pomocą SIP, na bazie widżetów napisanych w C++ dla Qt.&lt;/li&gt;
&lt;li&gt;PyDingo: aplikacja desktopowa w fazie rozwoju będąca w założeniu menedżerem plików złożonym z wielu dokowalnych okien. Program tworzony jest z wykorzystaniem PyQt4 i innych bibliotek Pythona.&lt;/li&gt;
&lt;li&gt;jl-punBB: wtyczka dla Wordpressa integrująca z tym skryptem system użytkowników forum punBB/fluxBB.&lt;/li&gt;
&lt;li&gt;punFramework: prosty framework stosujący wzorzec MVC służący do tworzenia dodatkowych komponentów wbudowanych w forum punBB/fluxBB&lt;/li&gt;
&lt;li&gt;QYolk: aplikacja PyQt4 będąca nakładką na setuptools i yolk – narzędzia do zarządzania pakietami (EGG) Pythona zainstalowanymi z cheeseshop.&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Budowanie binarnych aplikacji Mac OS X za pomocą py2app</title>
		<link href="http://www.python.rk.edu.pl/w/p/budowanie-binarnych-aplikacji-mac-os-x-za-pomoca-py2app/"/>
		<id>http://www.python.rk.edu.pl/w/p/budowanie-binarnych-aplikacji-mac-os-x-za-pomoca-py2app/</id>
		<updated>2009-06-10T02:49:11+00:00</updated>
		<content type="html">Opis narzędzia py2app do tworzenia gotowych binarnych aplikacji Mac OS X ze skryptów Pythona.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Generowanie i czytanie plików Excela w Pythonie</title>
		<link href="http://www.python.rk.edu.pl/w/p/generowanie-i-czytanie-plikow-excela-w-pythonie/"/>
		<id>http://www.python.rk.edu.pl/w/p/generowanie-i-czytanie-plikow-excela-w-pythonie/</id>
		<updated>2009-06-03T13:37:34+00:00</updated>
		<content type="html">opis bibliotek xlrd i xlwt służących do operowania na plikach MS Excel.</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Elita przybędzie na RuPy 2009</title>
		<link href="http://python.org.pl/elita,przybedzie,na,rupy,2009.html"/>
		<id>http://python.org.pl/elita,przybedzie,na,rupy,2009.html</id>
		<updated>2009-06-03T01:19:53+00:00</updated>
		<content type="html">Dotychczas byli dla nas znani z autorskich książek, blogów czy grup dyskusyjnych. Od lat aktywnie udzielając się na światowej scenie Open Source, budują &quot;nowe okno&quot; na świat. Mowa o ludziach, którzy zaangażowali się w rozwój i popularyzację technologii: Python, Ruby i Groovy. Twórcy Jython, IronPython, RoR, JRuby oraz innych znanych implementacji i framworków prawdopodobnie pojawią się na tegorocznej konferencji RuPy 2009!  
     
   Z listy osób zaproszonych, swoją obecność potwierdził już Obie Fernandez. Niezależny konsultant, związany z Ruby On Rails od 2005 roku, autor znakomitej pozycji &quot;The Rails Way&quot;. Specjalizuje się w wytwarzaniu wysoce skalowalnych aplikacji webowych. Jest założyciel firmy Hashrocket.  
     
   Jesteśmy pełni nadziei, że na konferencji nie zabraknie również gwizd ze strony Pythona.  
     
   Kolejne informacje, już wkrótce!</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://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://python.org.pl/atom.atom</id>
			<updated>2009-07-01T13:47:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">PyCon PL 2009 - Call for Papers</title>
		<link href="http://python.org.pl/pycon,pl,2009,,call,for,papers.html"/>
		<id>http://python.org.pl/pycon,pl,2009,,call,for,papers.html</id>
		<updated>2009-06-01T21:39:04+00:00</updated>
		<content type="html">PyCon PL jest jedyną polską konferencją w całości poświęconą nowoczesnemu i popularnemu językowi Python. Po ubiegłorocznym sukcesie pierwszej edycji, sympatycy tego języka spotkają się po raz kolejny, już nie w Rybniku, ale w Ustroniu, w samym sercu Beskidu Śląskiego. W tym roku na uczestników konferencji czeka sporo nowości, można wręcz stwierdzić, że jedynie jesienny termin imprezy pozostał bez zmian.  
     
   Konferencja rozpocznie się piątkowym popołudniem 16 października, a zakończy w niedzielę 18-ego. Poza zmianą miejsca konferencji, wszyscy uczestnicy będą zakwaterowani w jednym ośrodku, co z pewnością wpłynie na pogłębioną integrację. Kolejną innowacją w tym roku jest też zróżnicowanie agendy: Poza typowymi wykładami, organizatorzy wprowadzili możliwość wygłaszania krótkich, 5-minutowych wystąpień (popularne &quot;lightning talks&quot;), oraz warsztatów typu &quot;przynieś własny laptop&quot; (tzw. BYOL - Bring Your Own Laptop). Z kolei na sobotni wieczór tradycyjnie zaplanowano luźniejsze punkty programu.  
     
   W chwili obecnej rozpoczął się okres przyjmowania propozycji do agendy konferencji, czyli Call for Papers. Potrwa on do 26 czerwca, a więc już teraz można (a wręcz należy! :)) zgłaszać swoje tematy prelekcji, warsztatów, bądź krótkich wystąpień na tegorocznego PyCona PL. Lista przyjętych propozycji zostanie ogłoszona z początkiem lipca.  
     
   Więcej informacji na ten temat, wraz ze wszystkimi szczegółami, można znaleźć na nowej stronie konferencji pod adresem: Call-for-papers  
     
   Serdecznie wszystkich zapraszamy!  
     
   Źródło: pl.pycon.org</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://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://python.org.pl/atom.atom</id>
			<updated>2009-07-01T13:47:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">DmTEC wspiera PPCG</title>
		<link href="http://python.org.pl/dmtec,wspiera,ppcg.html"/>
		<id>http://python.org.pl/dmtec,wspiera,ppcg.html</id>
		<updated>2009-05-28T12:05:40+00:00</updated>
		<content type="html">Z radością mogę oficjalnie przekazać całej społeczności informację, że projekt PPCG zyskał nowego partnera. Został nim Digital Media Technology Spółka z o.o. z Krakowa.  
     
     

Z powodu dynamicznie rozwijającego się projektu PPCG i wzrastających wymagań technicznych, postanowiliśmy znaleźć rozwiązanie, które będzie w pełni przystosowane do potrzeb społeczności. Nasza wcześniejsza maszyna było dość często psotna i nieposłuszna, czego efektem były regularne upadki mod_pythona, które wpływały niekorzystnie na komfort naszej pracy. Dlatego też, firma DmTEC, podarowała nam wysokiej jakości serwer, na którym to stanie cała platforma projektu PPCG. Dzięki temu jesteśmy w stanie bez żadnych ograniczeń i obaw realizować kolejne pomysły.  
     
   Proces migracji platformy jeszcze trwa, ale prace zostaną ukończone już na początku czerwca. Dlatego prosimy o uzbrojenie się w cierpliwość.</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://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://python.org.pl/atom.atom</id>
			<updated>2009-07-01T13:47:25+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Kwietniowy LM już do pobrania</title>
		<link href="http://python.org.pl/kwietniowy,lm,juz,do,pobrania.html"/>
		<id>http://python.org.pl/kwietniowy,lm,juz,do,pobrania.html</id>
		<updated>2009-05-22T21:33:59+00:00</updated>
		<content type="html">Zgodnie z zapowiedzią, już dziś mamy możliwość pobrania kolejnego artykułu o Pythonie z czasopisma Linux Magazine.  
     
   Steganografia - bo przede wszystkim o tym będzie mowa - to sposób na ukrywanie informacji przed osobami trzecimi. Technik tego procesu jest na prawdę sporo. My natomiast poznamy jedną z nich, czyli ukrywanie informacji w komputerowym zapisie obrazu (LSB). Aby tego dokonać warto zapoznać się z biblioteką OpenCV, która udostępnia swój interfejs również dla Pythona. Zapraszam do &quot;Zabawy ze steganografią&quot;.  
     
   Natomiast dla osób, które interesują się projektem PPCG oraz chciałyby poznać sposób w jaki działa i do czego dąży to przedsięwzięcie, polecam jeden z majowych artykułów, &quot;Wszystko w rękach Pythonistas&quot;.</content>
		<author>
			<name>Piotr Tynecki</name>
			<uri>http://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://python.org.pl/atom.atom</id>
			<updated>2009-07-01T13:47:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Skalowanie aplikacji napisanych w Django</title>
		<link href="http://web-dev.pl/skalowanie-aplikacji-napisanych-w-django"/>
		<id>http://web-dev.pl/70 at http://web-dev.pl</id>
		<updated>2009-05-18T05:40:01+00:00</updated>
		<content type="html">&lt;p&gt;Jeśli stoisz przed wyzwaniem napisania / zaprojektowania aplikacji Django obsługującej setki żądań / tranzakcji na sekundę powinieneś/naś koniecznie zapoznać się z dwoma pozycjami:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://highscalability.com/links/goto/673/496/links_weblink&quot;&gt;artykułem Mike'a Malone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://highscalability.com/scaling-django-web-apps-mike-malone&quot;&gt;streszczeniem powyższego na serwisie High Scalability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Osobiście nie zgadzam się z kilkoma teza które tam padało - dla przykładu, iż korzystanie z CouchDB lub innych nie releacyjnych baz jest trudne w Django, niemniej lektura obowiązkowa.&lt;/p&gt;
&lt;p&gt;Miłego czytania :)&lt;/p&gt;</content>
		<author>
			<name>Web-Dev</name>
			<uri>http://web-dev.pl/taxonomy/term/25/0</uri>
		</author>
		<source>
			<title type="html">Web-Dev.pl - python</title>
			<link rel="self" href="http://web-dev.pl/index.php?q=taxonomy/term/25/0/feed"/>
			<id>http://web-dev.pl/index.php?q=taxonomy/term/25/0/feed</id>
			<updated>2009-07-03T01:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Logika mapek w grze cRPG Django/Python</title>
		<link href="http://www.python.rk.edu.pl/w/p/logika-mapek-w-grze-crpg-djangopython/"/>
		<id>http://www.python.rk.edu.pl/w/p/logika-mapek-w-grze-crpg-djangopython/</id>
		<updated>2009-05-15T08:25:18+00:00</updated>
		<content type="html">Prace nad &quot;Wyspą Mrozu&quot; posuwają się do przodu. Obecnie implementuję poszczególne elementy mapy, po której porusza się postać. System zakłada wykorzystanie mini-map podzielonych na kwadratowe klocki (tile) we współrzędnych x,y...</content>
		<author>
			<name>Riklaunim</name>
			<uri>http://www.python.rk.edu.pl/</uri>
		</author>
		<source>
			<title type="html">Riklaunim</title>
			<subtitle type="html">Serwis poświęcony językowi programistycznemu o nazwie Python, w tym także frameworkowi Django i 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>2009-07-03T01:47:37+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="pl">
		<title type="html">Piszemy własny serwer proxy w pythonie - cześć 1</title>
		<link href="http://web-dev.pl/piszemy-wlasny-serwer-proxy-w-pythonie-czesc-1"/>
		<id>http://web-dev.pl/67 at http://web-dev.pl</id>
		<updated>2009-05-14T20:27:21+00:00</updated>
		<content type="html">&lt;p&gt;Pisząc sceniaruszy testów obciążeniowych serwisów www często punktem wyjścia jest przygotowanie &quot;tranzakcji&quot; (używając tsungowej nomenklatury&quot;), czyli listy plików dociąganych wraz z głównym dokumentem xhtml/html.&lt;/p&gt;
&lt;p&gt;Na szczęście nowoczesne frameworki (między innymi Grinder, Tsung) dostarczają własne proxy umożliwiające przygotowanie takowej listy, często od razu w formacie używanym poprzez to narzędzie.&lt;/p&gt;
&lt;p&gt;Co jednak zrobić w przypadku, kiedy potrzebujemy taką listę przygotować we własnym formacie, lub odrobinę zmodyfikowanym?&lt;/p&gt;
&lt;p&gt;Wyjść mamy kilka, pierwszym najprostszym jest zainstalowanie dowolnego serwera proxy, między innymi squid lub tinyproxy. Squida nie polecam do tego celu - jest zdecydowanie zbyt potężny. Tinyproxy jest wygodny, małe i szybkie. Obydwa narzędzia przygotują piękną listę w formacie NCSA common log, który możemy łatwo sparsować... &lt;/p&gt;
&lt;p