<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>restless: Najnowsze wpisy</title><link>http://restlessbeing.pl/blog/</link><description /><language>pl</language><lastBuildDate>Sun, 27 Mar 2011 23:28:35 +0100</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/restless-latest-entries" /><feedburner:info uri="restless-latest-entries" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>JavaScript, Mobile i DevMeetings</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/UUYcEYAfFH4/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;Programowanie aplikacji mobilnych w JavaScript - relacja z DevMettingu w Gliwicach&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;DevMeetings i programowanie aplikacji mobilnych w JavaScript? Bardzo dobrze!&lt;/p&gt;
&lt;h2&gt;Bardzo dobry zbieg okoliczności&lt;/h2&gt;

&lt;p&gt;Pewnego dnia stwierdziłem, że najwyższy czas, aby poważniej zainteresować się developmentem dla urządzeń mobilnych. Z jednym zastrzeżeniem - developmentem softu, który będzie działał na różnych urządzeniach. Kilka chwil później dowiedziałem się, że wkrótce w mojej okolicy odbędzie się niejaki &lt;a href="http://devmeetings.pl/trainings/programowanie-aplikacji-mobilnych-w-javascript"&gt;DevMeeting&lt;/a&gt;, którego tematyka obejmie dokładnie to co mnie interesuje. Przyznaję bez bicia, że nigdy wcześniej o DevMeetings nie słyszałem, ale postanowiłem zaryzykować i po chwili, wraz z Pigletto, moim współdeveloperem, zarejestrowaliśmy się szkolenie.&lt;/p&gt;
&lt;p&gt;Zaskoczyło mnie to, że DevMeetings są darmowe. W tej sytuacji zbyt wiele się po nim nie spodziewałem... no cóż, pomyliłem się. W chwili obecnej stwierdzam, że dzięki brakowi opłat na szkoleniu pojawiają się osoby, które są tematem zainteresowane i które faktycznie chcą tam być, a nie ludzie przymuszeni przez pracodawców.&lt;/p&gt;
&lt;p&gt;DevMeeting, o którym mowa odbył się 25 marca w Gliwicach.&lt;/p&gt;

&lt;h2&gt;Bardzo dobry skład&lt;/h2&gt;

&lt;p&gt;Zarówno prowadzący David de Rosier, organizatorzy, jak i uczestnicy DevMeetingu reprezentowali naprawdę dobry poziom i sprawili, że 12 godzin minęło bardzo szybko w miłej atmosferze.&lt;p&gt;
&lt;p&gt;Prowadzący - duża wiedza poparta doświadczeniem, a przy tym luz i komunikatywność. &lt;/p&gt;&lt;p&gt;Organizatorzy - sprawnie działające wi-fi i repozytorium (problemy z wyjściem na świat wynikały z winy hotelu), ładne notatniki dla uczestników, dobra pizza, kawa, której wystarczyło do samego końca i ogólnie profesjonalne podejście do tematu.&lt;/p&gt;
&lt;p&gt;Uczestnicy - wszystkie zespoły dały radę stworzyć porównywalne aplikacje. Podrzucę tu jeszcze kilka statystyk:
&lt;ul&gt;
&lt;li&gt;Ilość uczestników: około 20 osób&lt;/li&gt;
&lt;li&gt;Kobiety: 2 i co warte podkreślenia obie ładne (jeśli uważasz, że to seksistowskie to pewnie masz rację; jeśli Ci to nie odpowiada to przypominam, że to mój blog)&lt;/li&gt;
&lt;li&gt;Laptopy z jabłuszkiem: około 6 sztuk, w tym przynajmniej jeden wypasiony MacBook Pro (trzymającej kilka długich godzin baterii trzeba zazdrościć)&lt;/li&gt;
&lt;li&gt;Laptopy z Linuksem: 2 sztuki (mój i Pigletta, mogło być więcej, ale nie zauważyłem)&lt;/li&gt;
&lt;li&gt;Profesje uczestników: głównie frontendowcy i web deweloperzy, tu muszę podkreślić, że wraz ze mną i Piglettem było czworo djangowców&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;h2&gt;Bardzo dobra forma szkolenia&lt;/h2&gt;

&lt;p&gt;Szkolenia są nudne. Byłem na niejednym, na którym po teoretycznym wstępie należało wykonać ćwiczenie: 1. kliknij przycisk X, 2. wpisz bla bla bla, 3. kliknij przycisk Y itd. Masakra, ale tu było inaczej!&lt;/p&gt;
&lt;p&gt;Formuła DevMeetings polega na tym, że uczestnicy dzieleni są na grupy. Następnie prowadzący robi mniej lub bardziej krótki wstęp teoretyczny, po czym należy napisać kod, który będzie realizował jakąś funkcjonalność. Nie ma tu żadnej instrukcji krok-po-kroku. Grupa otrzymuje pliki ze strukturą programu, trochę wskazówek i zaczyna myśleć nad rozwiązaniem oraz tworzyć kod.&lt;/p&gt;
&lt;p&gt;Moim zdaniem podział na grupy jest dobrym pomysłem. Przede wszystkim integracja i interakcja są zapewnione. Ponadto przy pracy grupowej każdy wnosi coś od siebie i nie ma przestojów wynikających z "nie wiem jak to zrobić" - zawsze ktoś z grupy wie lub ma jakiś pomysł. Wada jest taka, że właściwie stale powinna pisać osoba siedząca w środku, ewentualnie można się zmieniać przy jej komputerze.&lt;/p&gt;

&lt;h2&gt;Bardzo dobry temat&lt;/h2&gt;

&lt;p&gt;Programowanie aplikacji mobilnych w JavaScript to naprawdę fajna sprawa i w dobie ogromnej popularności coraz to lepszych telefonów bardzo na czasie. Na DevMeetingu można było nabyć sporo wiedzy oraz uporządkować tę już posiadaną. Świetnie było posłuchać porównania PhoneGap z Titanium, poznać wady i zalety JQuery Mobile, czy w końcu dowiedzieć się dlaczego PhoneGap nie jest doskonały.&lt;/p&gt;
&lt;p&gt;Cała ta wiedza została, niczym kofeina w organizmie programisty, przetworzona w kod, który - ależ to była frajda - uruchomił się na rzeczywistym smartfonie z Androidem. Nie dość, że się uruchomił to jeszcze sprawnie wychwytywał zdarzenia płynące z akcelerometra i sterował czołgiem. Tak, mieliśmy łączność z Libią.&lt;/p&gt;

&lt;h2&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Kilka luźnych myśli: Jestem bardzo zadowolony z udziału. 12 godzin to jednak długo i pod koniec chyba wszyscy byli mocno zmęczeni. Teraz już wiem, że JavaScript to taki stary przyjaciel, który wygrał w loterii i chce się ze mną podzielić wygraną. Zamierzam skorzystać.&lt;/p&gt;
&lt;p&gt;Na koniec może zaskoczę, ale udziału w DevMeetings nie polecam. Znacznie lepiej jest usiąść samemu przed monitorem, wyszukać odpowiednie tutoriale i spokojnie je sobie poczytać... a jak już będziecie czytać to ja spokojnie zapiszę się na kolejny DevMeeting nie martwiąc się o to czy wystarczy miejsc :P&lt;/p&gt;&lt;/div&gt;</description><pubDate>Sun, 27 Mar 2011 23:28:35 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2011/03/27/javascript-mobile-i-devmeetings/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2011/03/27/javascript-mobile-i-devmeetings/</feedburner:origLink></item><item><title>Przezroczyste PNG w IE6 - ciąg dalszy</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/QeFU30764SI/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;Rok temu pisałem o przezroczystości png w IE6. Czas na małą aktualizację.&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Zachęcony pytaniem od jednej z czytelniczek mojego ubiegłorocznego &lt;a href="http://restlessbeing.pl/blog/2009/06/30/przezroczystosc-png-w-ie-6/"&gt;artykułu na temat przezroczystości &lt;code&gt;png&lt;/code&gt; w IE6&lt;/a&gt;, sprawdziłem aktualną sytuację w tym temacie. Pomimo, że IE6 (na szczęście) umiera pojawiły się nowe rozwiązania. &lt;/p&gt;
&lt;p&gt;Przede wszystkim zachęcam do zerknięcia na ciekawy wpis na blogu &lt;a href="http://cubicspot.blogspot.com/2010/01/transparent-png8-is-solution-to-ie6.html"&gt;Thomasa Hruski&lt;/a&gt;, w którym podaje on rozwiązanie problemu z wykorzystaniem png8, a na samym końcu artykułu odsyła do jeszcze innego interesującego podejścia.&lt;/p&gt;
&lt;p&gt;Jeśli jednak, tak jak ja, nie lubicie się męczyć z grafiką warto skorzystać z innego, również polecanego przez Thomasa, rozwiązania jakim jest &lt;a href="http://dillerdesign.com/experiment/DD_belatedPNG/"&gt;DD_belatedPNG&lt;/a&gt;. Jest to skrypt JavaScript, który można wykorzystać dodając na stronie:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;
   &amp;lt;!--[if IE 6]&amp;gt;&lt;br&gt;
   &amp;lt;script src="DD_belatedPNG.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;
   &amp;lt;script&amp;gt;
   &amp;nbsp;&amp;nbsp;DD_belatedPNG.fix('.png_bg');
   &amp;lt;/script&amp;gt;
   &amp;lt;![endif]--&amp;gt;
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;gdzie &lt;code&gt;.png_bg&lt;/code&gt; jest na selektorem CSS. Proste i działa świetnie zapewniając obsługę PNGów zarówno użytych w atrybutach &lt;code&gt;src&lt;/code&gt; taga &lt;code&gt;img&lt;/code&gt;, jak i jako własność parametru &lt;code&gt;background-image&lt;/code&gt; w CSS. Co więcej w tym ostatnim przypadku właściwie działają &lt;code&gt;background-position&lt;/code&gt; oraz &lt;code&gt;background-repeat&lt;/code&gt;. &lt;/p&gt;&lt;/div&gt;</description><pubDate>Sun, 12 Dec 2010 22:18:45 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/12/12/przezroczyste-png-w-ie6-ciag-dalszy/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/12/12/przezroczyste-png-w-ie6-ciag-dalszy/</feedburner:origLink></item><item><title>Wszystko dla Django</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/PtUZhs9UB6M/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;Jak mogłem to przegapić? Obowiązkowa strona dla użytkowników Django: http://djangopackages.com&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Dawno dawno temu była sobie całkiem przyjemna strona Django Pluggables, na której można było znaleźć liczne aplikacje do wykorzystania we własnych projektach. Poźniej, jak pamiętam, pojawił się na liście dyskusyjnej Django wątek, w którym dyskutowano o tym, że tych aplikacji jest tak dużo, że nie wiadomo którą wybrać. Jak się wczoraj dowiedziałem na dyskusji się nie skończyło i oto Django Pluggables zamieniło się w &lt;a href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt; to rewelacyjna strona. Po pierwsze znajdziemy na niej nie tylko uniwersalne aplikacje (wolne tłumaczenie angielskiego reusable apps), ale też frameworki, czyli np. CMSy, fora, czy sklepy internetowe, a także gotowe projekty oparte na Django oraz "inne", czyli to co nie łapie się do powyższych kategorii, ale jest przydatne jak np. buildoutowa recepta djangorecipe.&lt;/p&gt;
&lt;p&gt;Po drugie wszystkie zamieszczone na stronie pakiety mają przypisane parametry pozwalające nam na ocenę ich popularności. Wśród parametrów tych znajdziemy: ilość pobrań ze strony pypi, aktywnośc w repozytorium projektu oraz ilość użytkowników.&lt;/p&gt;
&lt;p&gt;Po trzecie &lt;a href="http://djangopackages.com"&gt;Django Packages&lt;/a&gt; to gridy. Absolutnie przydatne zestawienia porównawcze. Co tu dużo pisać to trzeba zobaczyć, oto przykładowy &lt;a href="http://www.djangopackages.com/grids/g/cms/"&gt;grid dla CMSów&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oczywiście każdy odwiedzający, po zarejestrowaniu, może dodać do strony nową aplikację, stworzyć nowy grid, lub zmodyfikować istniejące. Każdy może też kliknąć "I use it" przy aplikacji, z której korzysta, zwiększając tym samym licznik jej użytkowników.&lt;/p&gt;
&lt;p&gt;Dla mnie rewelacja, po raz kolejny cieszę się, że używam Django.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Wed, 10 Nov 2010 21:23:22 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/11/10/wszystko-dla-django/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/11/10/wszystko-dla-django/</feedburner:origLink></item><item><title>Piramidalna zemsta Zope</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/xXepYaw0TXM/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;Zagotowało się w świecie pythonowych frameworków webowych. Pylons, Repoze.BFG i być może TurboGears, nie mogąc sprostać konkurencji ze strony Django, postanowiły połączyć swoje siły.&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Przesadziłem? Ok, z tym sprostaniem konkurencji ze strony Django to taka mała prowokacja. Niemniej jednak połączenie się wspomnianych frameworków jest oficjalnym faktem. Można o tym przeczytać &lt;a href="http://lists.repoze.org/pipermail/repoze-dev/2010-November/003619.html"&gt;na liście dyskusyjnej repoze.bfg&lt;/a&gt;, do czego zachęcam.&lt;/p&gt;
&lt;p&gt;W kilku słowach ujmując zaistniałe zdarzenie, można powiedzieć, że &lt;a href="http://bfg.repoze.org"&gt;repoze.bfg&lt;/a&gt; nie doczeka się wersji 1.4 (wersja 1.3 ukazała się 1 listopada... nomen omen w Święto Zmarłych), albowiem stało się właśnie frameworkiem &lt;a href="http://docs.pylonshq.com/pyramid/dev/"&gt;Pyramid&lt;/a&gt;. Podobnie ma się sprawa z samymi Pylonsami, ktore niedawno doczekały się wersji 1.0 (linia 1.x będzie utrzymywana, według deweloperów, jeszcze przez parę lat), ale to co miało być Pylonsami 2.0 będzie po prostu frameworkiem Pyramid.&lt;/p&gt;
&lt;p&gt;Pyramid rozwijany będzie w ramach projektu &lt;a href="http://docs.pylonshq.com/"&gt;Pylons&lt;/a&gt;, który stanowić będzie zbiór różnych powiazanych technologii.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://turbogears.org/"&gt;TurboGears&lt;/a&gt;, które bazuje na Pylonsach, jeszcze nie zdecydowało, czy również będzie się opierało na Pyramidzie, czy jednak zostanie na Pylons 1.0. Moim zdaniem zdecydują się na Pyramid.&lt;/p&gt;
&lt;p&gt;Jakie są motywy powyższego kroku? Chodzi głównie o zwiększenie siły przebicia frameworku oraz o przezwyciężenie pewnych problemów, które Pylons miał ze swoją achitekturą:&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;(Jeden z twórców Pylons) discovered an architectural design flaw in Pylons [1]. The problem orients around the chosen strategy of implementing individual app&lt;br /&gt;
extensibility by allowing subclassing of the WSGIController&lt;/blockquote&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Sporo na ten temat można znaleźć w tej &lt;a href="http://groups.google.com/group/pylons-discuss/browse_thread/thread/9197756173fd552"&gt;dyskusji&lt;/a&gt;. Obok długich tłumaczeń i wyjaśnień można tam też natrafić na dużą dozę niechęci i strachu ludzi przed &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt;, z którego wywodzi się repoze.bfg. W dużej mierze wynika to jednak z braku wiedzy na temat tego czym jest Zope. Moim zdaniem komponenty wywodzące się z Zope, w tym architektura komponentowa (ang. Zope Component Architecture, ZCA) sprawią, że Pyramid będzie naprawdę elastycznym, dobrym frameworkiem. Warto mieć na niego oko.&lt;/p&gt;
&lt;p&gt;Osobiście cieszę się, bo dobrze będzie mieć w Pythonie takie dwa frameworki jak Django i Pyramid. Cieszę się też, że używam Django, bo gdybym używał Pylonsów czy repoze.bfg to na dziś dzień miałbym przed sobą perspektywę migrowania aplikacji. Niby support ma być przez parę lat, ale zawsze to niefajnie pisać w czymś co ma już swojego lepszego następcę.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Fri, 05 Nov 2010 22:24:33 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/11/05/piramidalna-zemsta-zope/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/11/05/piramidalna-zemsta-zope/</feedburner:origLink></item><item><title>Front-Trends, czyli konferencja o front-endach</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/z4stZT6a2HY/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;Konferencja Front-Trends, odbyła się w październiku w Warszawie i chociaż nie miałem okazji w niej uczestniczyć, to jednak poświęcam krótki wpis temu ciekawemu wydarzeniu.&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Osobiście w Warszawie, w dniach 21-22 października, nie byłem, ale byli inni, w tym &lt;a href="http://notatnik.mekk.waw.pl"&gt;Mekk&lt;/a&gt;, który napisał taką relację z konferencji, ze czuję się jakbym tam był. Szacunek i serdeczne podziękowania.&lt;/p&gt;
&lt;p&gt;Konferencja dotyczyła front-endów, stąd sporo mówiono podczas niej o JavaScripcie (który wcale nie jest tylko front-endowy), HTML 5, CSS 3. Pojawiły się też tematy związane z rozwiązaniami dla urządzeń mobilnych.&lt;/p&gt;
&lt;p&gt;Wszystkich zainteresowanych zachęcam do przeczytania szczegółowych relacji Mekka:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://notatnik.mekk.waw.pl/archives/241-Front-Trends_2010_-_czesc_1.html"&gt;Front-Trends, dzień 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://notatnik.mekk.waw.pl/archives/242-Front-Trends_2010_-_czesc_2.html"&gt;Front-Trends, dzień 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://notatnik.mekk.waw.pl/archives/243-Front-Trends_2010_-_czesc_3.html"&gt;Front-Trends, dzień 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ja czytałem to z wywieszonym jęzorem ;)&lt;/p&gt;&lt;/div&gt;</description><pubDate>Fri, 05 Nov 2010 21:59:34 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/11/05/front-trends-czyli-konferencja-o-front-endach/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/11/05/front-trends-czyli-konferencja-o-front-endach/</feedburner:origLink></item><item><title>Był sobie PyCon</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/mVZ4Xk6GjKA/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;W zeszłym tygodniu odbył się w Ustroniu trzeci polski PyCon. Byłem, widziałem, a oto moje wrażenia.&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Rok temu na PyConie miałem zaszczyt wygłaszać prelekcję na temat Django oraz Pinaxa. Fajne doświadczenie, ale też wymagające sporej ilości czasu. Tego ostatniego w tym roku mi zabrakło, wobec czego pojechałem do Ustronia w charakterze zwykłego uczestnika.&lt;/p&gt;
&lt;h1&gt;Społeczność&lt;/h1&gt;
&lt;p&gt;Jak to ktoś ładnie napisał (&lt;a href="http://tynecki.pl"&gt;Katharsis?&lt;/a&gt;) &lt;a href="http://pl.pycon.org"&gt;PyCon&lt;/a&gt; jest nieoficjalnym zlotem ludzi z kanału IRC #python.pl, a także #django-pl. Wyróżniamy się zwykle koszulkami z ładnymi nadrukami oraz przesiadywaniem w okolicach stołu bilardowego. Miło jest się ponownie spotkać lub zobaczyć po raz pierwszy (bo przecież kanały żyją i się rozrastają i ciągle pojawia się ktoś nowy) i oczywiście podyskutować na okołopythonowe tematy. &lt;/p&gt;
&lt;p&gt;Zainteresowanych tym jak to wszystko naprawdę wyglądało odsyłam do blogów &lt;a href="http://infinitynet.pl"&gt;RMZ&lt;/a&gt; i &lt;a href="http://tynecki.pl"&gt;Katharsisa&lt;/a&gt;, gdzie już są lub wkrótce pojawią się zdjęcia.&lt;/p&gt;
&lt;p&gt;Oczywiście PyCon to też okazja do poznania ciekawych osób spoza IRC. W tym roku poznałem, o zgrozo, speców od Ruby On Rails z firmy &lt;a href="http://selleo.com"&gt;Selleo&lt;/a&gt;. Nie znam RoR, ale mam do niego duży szacunek, tym ciekawiej było porozmawiać na temat różnic i podobieństw między tym frameworkiem a Django, a także ogólnie o Ruby i Pythonie oraz procesach wytwarzania oprogramowania. Tematów było zresztą więcej bo panowie imponowali rozległą wiedzą nie tylko techniczną ale i biznesową.&lt;/p&gt;
&lt;h1&gt;Technikalia&lt;/h1&gt;
&lt;p&gt;Z różnych względów nie byłem na wszystkich wykładach, ale spośród tych, które odwiedziłem najciekawsze były: warsztaty poprowadzone przez Marcina Bardzia na temat "Optymalizacji i profilingu metodami chałupniczymi" oraz prelekcja "Python: Fragmenty" Radomira Dopieralskiego. &lt;/p&gt;
&lt;p&gt;Warsztaty pokazały w jaki sposób podejść do tematu badania wydajności kodu napisanego w Pythonie oraz jakie narzędzia można tu zastosować. Rzecz niewątpliwie przydatna w praktyce. Z kolei The Sheep, czyli Radomir, pokazywał "ciekawe" fragmenty kodu Pythona. Ciekawe czyli takie, które powodowały różne dziwne problemy, pomimo tego, że na pierwszy rzut oka wydawały się zupełnie w porządku. Bardzo pouczające, zachęcam do obejrzenia &lt;a href="http://devel.sheep.art.pl/frags/raw-file/tip/slajdy.htm"&gt;slajdów z tej prezentacji&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bardzo fajna była też prezentacja Bartosza Krajnika na temat wykorzystania Pythona w laboratorium fizycznym. Nie jestem fizykiem, ale miło było zobaczyć jak dobrze sprawdza się Python w tym obszarze, tym bardziej, że wszystko było okraszone dużym entuzjazmem i poczuciem humoru prelegenta. Wykład ten bardzo dobrze uzupełnił wcześniejszą opowieść Mateusza Paprockiego o bibliotece &lt;a href="http://www.sympy.org"&gt;SymPy&lt;/a&gt; podczas, której rosły serca wszystkim używającym Pythona matematykom.&lt;/p&gt;
&lt;p&gt;Warto jeszcze wspomnieć lighting talka wygłoszonego przez reprezentanta &lt;a href="http://megiteam.pl"&gt;MegiTeam&lt;/a&gt;, rozpoczętego słowami: "Jeśli serwujecie swoje serwisy WWW używając Apache to robicie źle". W ciekawy i nieco kontrowersyjny sposób mówca zachęcał do używania &lt;a href="http://nginx.org"&gt;nginxa&lt;/a&gt;, przedstawiając liczne argumenty na poparcie swojej tezy. W skrócie nginx jest szybszy, stabilniejszy ("napisany w starym dobrym radzieckim stylu" i nigdy się nie wysypał) oraz bezpieczniejszy (odporny na DDOSy) niż Apache. No to się zainteresowałem &lt;a href="http://cherokee-project.com"&gt;cherokee&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;Brakowało niestety jakichś talków na tematy związane z web developmentem. Jedynym wyjątkiem była krótka prezentacja o Plone 4, nieźle zrobiona, ale w przyszłym roku chciałbym zostać przekonany do tego, że warto używać Plone. Na dziś dzień wiem, że Plone się rozwija, ale chciałbym się dowiedzieć się jak z tym pracować na codzień, a przede wszystkim jak wygląda obecnie sprawa pisania własnych rozszerzeń. Niestety Zope, na którym Plone bazuje, a którego swego czasu używałem, zawsze miał słabą dokumentację. Znacznie bogatsza dokumentacja samego Plone też nie była rewelacyjna - były to raczej krótkie how-to, które doś szybko się dezaktualizowały. Niestety, ale doskonała &lt;a href="http://docs.djangoproject.com"&gt;dokumentacja Django&lt;/a&gt; rozpieszcza.&lt;/p&gt;
&lt;h1&gt;Podsumowanie&lt;/h1&gt;
&lt;p&gt;Ogólnie było naprawdę fajnie i jestem zadowolony, że tam byłem. Cieszy duża ilość osób, w tym sporej grupy dziewczyn. Niedociągnięć i słabszych talków też by się kilka znalazło, ale właściwie narzekać mogę tylko na brak prelekcji o web developmencie, który mnie najbardziej interesuje. Rok temu był &lt;a href="http://buildout.org"&gt;buildout&lt;/a&gt; &lt;a href="http://dominno.pl"&gt;Dominika Szopy&lt;/a&gt; i legendarny już &lt;a href="http://www.slideshare.net/zgoda/hand-made-wsgi"&gt;talk o obsysaniu&lt;/a&gt; &lt;a href="http://zgodowie.org"&gt;Jarka Zgody&lt;/a&gt;, tym razem praktycznie nic. Nawiasem mówiąc to odniosłem wrażenie, że mało kto pamięta prawdziwy sens tej ostatniej prezentacji. Zachecam do przyjrzenia się &lt;a href="http://www.slideshare.net/zgoda/hand-made-wsgi"&gt;slajdom&lt;/a&gt; i wyczytania między wierszami co tak naprawdę obsysało. To tyle. Do zobaczenia za rok.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 14 Oct 2010 22:24:16 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/10/14/byl-sobie-pycon/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/10/14/byl-sobie-pycon/</feedburner:origLink></item><item><title>Templates in django project</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/KfeHVrSV08M/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;A smart way of placing templates in your django project.&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;So you're starting a new project in Django? One thing you'll obviously want are templates and you'll have to decide where to put them.&lt;/p&gt;
&lt;h2&gt;The Default Way&lt;/h2&gt;
&lt;p&gt;The method I used for a long time is the method described in &lt;a href="http://docs.djangoproject.com/en/1.2/intro/tutorial02/#customize-the-admin-look-and-feel" title="Django Tutorial"&gt;Django Tutorial&lt;/a&gt; and used for example in &lt;a href="http://pinaxproject.com" title="Pinax"&gt;Pinax&lt;/a&gt;. It is based on &lt;code&gt;templates&lt;/code&gt; folder(s) which is placed somewhere in your filesystem, most often directly in your project's root.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apps&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app1&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app2&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;app2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;folders&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To get it working some configuration in settings.py is also required:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Configure Django to first load templates from filesystem&lt;/span&gt;
&lt;span class="c"&gt;# and then from application directories&lt;/span&gt;
&lt;span class="c"&gt;# These are default settings&lt;/span&gt;
&lt;span class="n"&gt;TEMPLATE_LOADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django.template.loaders.filesystem.Loader&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django.template.loaders.app_directories.Loader&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Define where exactly Django should look for templates&lt;/span&gt;
&lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;TEMPLATE_DIRS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROJECT_ROOT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;templates&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can read more about settings used above &lt;a href="http://docs.djangoproject.com/en/1.2/ref/settings/#template-loaders" title="Template loaders"&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;With this simple config you can create a theme for your project. Just start creating templates in &lt;code&gt;templates&lt;/code&gt; directory. It is important to remember that it is prefferable to place templates in &lt;a href="http://docs.djangoproject.com/en/1.2/ref/templates/api/#using-subdirectories"&gt;subdirectories&lt;/a&gt; to keep templates for specific apps separated.&lt;/p&gt;
&lt;p&gt;However there are inconveniences with this configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;First is about templatetags - if you need a tag to render something project specific where should you place it's code? You need to create a dedicated application for this case. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Second is about i18n - to generate locales only for templates in Django &amp;lt; 1.2 it was required to manually move &lt;code&gt;apps&lt;/code&gt; folders out of project directory, then call &lt;code&gt;bin/django makessages -l pl&lt;/code&gt; (or whatever lang you use) and after that move &lt;code&gt;apps&lt;/code&gt; back to project directory. Why? Because makemessages browses all folders under current folder so it would generate locales also for applications from apps. The good news is that Django 1.2 has provided &lt;code&gt;--ignore&lt;/code&gt; option to makemessages that allows exclusion of some directories while generating messagefiles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The LFC Way&lt;/h2&gt;
&lt;p&gt;The method I use now is based on a &lt;a href="http://lfcproject.com" title="Lighting Fast CMS"&gt;LFC&lt;/a&gt;'s way of doing things.  It is very simple and doesn't have inconveniences of previous method.&lt;/p&gt;
&lt;p&gt;The main concept here is an application. Your theme is just an ordinary application, so instead of defining &lt;code&gt;TEMPLATE_DIRS&lt;/code&gt; it is enough to add &lt;code&gt;yourproject_theme&lt;/code&gt; app to &lt;code&gt;INSTALLED_APPS&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Django searches for templates in apps specified in &lt;code&gt;INSTALLED_APPS&lt;/code&gt; browsing them in order of definition so it is important to place &lt;code&gt;yourproject_theme&lt;/code&gt; application before any other applications. For example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;lfc_theme&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django.contrib.admin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;django.contrib.auth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;django.contrib.contenttypes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;django.contrib.sessions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;django.contrib.sites&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django.contrib.flatpages&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django.contrib.sitemaps&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django.contrib.comments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;django_extensions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;lfc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;lfc_blog&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;portlets&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;tagging&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;contact_form&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;pagination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;workflows&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;permissions&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;gunicorn&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Main advantages of having a theme as an application are that you can have locales, templatetags and even static files as well as project specific utility functions in one place - your theme application. &lt;/p&gt;
&lt;p&gt;Curious about example? Look into &lt;a href="http://bitbucket.org/diefenbach/lfc-theme/src" title="LFC Theme sources"&gt;LFC Theme&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Both methods are simple to use but the second has advantages and IMHO results in a cleaner structure of a project.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Wed, 30 Jun 2010 22:05:22 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/06/30/templates-django-project/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/06/30/templates-django-project/</feedburner:origLink></item><item><title>Django-LFC</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/zRx5z77eq_Q/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;New shining star in the world of Django: Lighting Fast CMS - sneak preview&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;h2&gt;Django and CMS projects&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;This post was updated on 2010-07-05&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Django and CMS projects&lt;/h2&gt;
&lt;p&gt;Some time ago I &lt;a href="http://restlessbeing.pl/blog/2009/10/21/django-i-cmsy/"&gt;wrote&lt;/a&gt; about Django powered CMS projects. In particular I described &lt;a href="http://django-cms.org"&gt;django-cms&lt;/a&gt; and also mentioned &lt;a href="http://spinlock.ch/pub/feincms/"&gt;Fein CMS&lt;/a&gt;. Both projects are really good ones (&lt;a href="http://code.djangoproject.com/wiki/CMSAppsComparison"&gt;compare them&lt;/a&gt;) but... their competitor has just arrived (ok, almost because it is still in alpha) - &lt;a href="http://www.lfcproject.com/"&gt;Lighting Fast CMS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_home.png"&gt;&lt;img src="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_home_small.png"  alt="Lighting Fast CMS" title="Lighting Fast CMS" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.lfcproject.com/"&gt;LFC&lt;/a&gt; comes from the author of &lt;a href="http://www.getlfs.com/"&gt;Lighting Fast Shop&lt;/a&gt; and shares some elements with that project so if you used LFS you will be positively surprised.&lt;/p&gt;

&lt;h2&gt;A bite of django-lfc&lt;/h2&gt;

&lt;p&gt;My first impression was: "oh.. it's plonish!". Yup, LFC resembles Plone to me - I really like this kind of clean interface and available options. It's not Django's Admin any more (see django-cms and feincms) but LFC's own management panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_manage.png"&gt;&lt;img src="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_manage_small.png"  alt="Lighting Fast CMS - management panel" title="Lighting Fast CMS - management panel" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LFC is intuitive. I was able to set up a simple site without reading any docs. Of course there are &lt;a href="http://packages.python.org/django-lfc/"&gt;docs&lt;/a&gt;! It is important thing in any serious project and LFC is going to be serious.&lt;/p&gt;

&lt;p&gt;Full list of &lt;a href="http://www.lfcproject.com/product/features"&gt;LFC features&lt;/a&gt; is rather long, so if you are interested just follow the link. I especially like: content types, portlets,&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_portlets.png"&gt;&lt;img src="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_portlets_small.png"  alt="Lighting Fast CMS - portlets" title="Lighting Fast CMS - portlets" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
authorisation based on mapping between roles and permissions&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_permissions.png"&gt;&lt;img src="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_permissions_small.png"  alt="Lighting Fast CMS - permissions" title="Lighting Fast CMS - permissions" /&gt;&lt;/a&gt;

and... workflows.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_workflow.png"&gt;&lt;img src="http://static.restlessbeing.pl/media/blog_images/lfc/lfc_workflow.png"  alt="Lighting Fast CMS - workflows" title="Lighting Fast CMS - workflows" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;There is no rose without a thorn&lt;/h2&gt;

&lt;p&gt;Sadly, LFC is not yet 1.0 final, so nobody can expect it to be bug free and in fact there is some bugs. For example it is quite easy to set up running instance of LFC using buildout, but it quickly turns out that it is limited to work on supplied sqlite database only. There are still some problems that make it hard to run LFC on other database engines like postgres. However, everything is possible so if you're interested in how to set up current (1.0 alpha 8 - "Man o' War") release of LFC to work with postgres please read on.&lt;/p&gt;

&lt;h2&gt;LFC and Postgres&lt;/h2&gt;

&lt;p&gt;You can read about &lt;a href="http://packages.python.org/django-lfc/introduction/installation.html#for-developers"&gt;LFC installation&lt;/a&gt; in the official docs. The important part is to call:

&lt;div class="codehilite"&gt;
&lt;pre&gt;
hg clone http://bitbucket.org/diefenbach/lfc-buildout-development
&lt;/pre&gt;
&lt;/div&gt;

to get a local copy of LFC.
&lt;/p&gt;
&lt;p&gt;However, in my case, before I performed the next step in installation process I had to modify buildout.cfg. Here is mine:

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;PIL&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;
    &lt;span class="n"&gt;lfc&lt;/span&gt;
    &lt;span class="n"&gt;lfc_theme&lt;/span&gt;
    &lt;span class="n"&gt;lfc_blog&lt;/span&gt;
    &lt;span class="n"&gt;tagging&lt;/span&gt;
    &lt;span class="n"&gt;contact&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fcgi&lt;/span&gt;
    &lt;span class="n"&gt;permissions&lt;/span&gt;
    &lt;span class="n"&gt;portlets&lt;/span&gt;
    &lt;span class="n"&gt;workflows&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lfc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;diefenbach&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lfc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lfc_theme&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;diefenbach&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lfc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;theme&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lfc_blog&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;diefenbach&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lfc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;diefenbach&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;portlets&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;diefenbach&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;portlets&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;workflows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;diefenbach&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;workflows&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tagging&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mercurialrecipe&lt;/span&gt;
&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fivethreeo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tagging&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;inheritance&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PIL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recipe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;
&lt;span class="n"&gt;egg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;6&lt;/span&gt;
&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repoze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;contact&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gocept&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;bitbucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ubernostrum&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;contact&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="n"&gt;d3791fa4dfb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt;
&lt;span class="n"&gt;md5sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;8e3&lt;/span&gt;&lt;span class="n"&gt;e257fda807fef5f3abcc6b5beb398&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fcgi&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collective&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recipe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;8000&lt;/span&gt;
&lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;misc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fcgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fcgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;djangorecipe&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;djangoproject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;branches&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;
&lt;span class="n"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;PIL&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;6&lt;/span&gt;
    &lt;span class="n"&gt;psycopg2&lt;/span&gt;
    &lt;span class="n"&gt;feedparser&lt;/span&gt;
    &lt;span class="n"&gt;pysqlite&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pagination&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;extensions&lt;/span&gt;

&lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lfc_project&lt;/span&gt;
&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lfc_project&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;buildout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;workflows&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tagging&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;contact&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lfc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lfc_theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lfc_blog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;workflows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;portlets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lfc_project&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;urls&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;My modifications included:
&lt;ul&gt;
&lt;li&gt;setting a specific version of PIL (PIL == 1.1.6) - otherwise there was an import error&lt;/li&gt;
&lt;li&gt;setting a specific version of Django - to include some patches for bugs that were causing LFC to raise exceptions when used with postgres&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After everything was installed I changed settings.py to configure postgres database there.&lt;/p&gt;

&lt;p&gt;My next step was to comment out last line: &lt;code&gt;post_syncdb.connect(register)&lt;/code&gt; in &lt;code&gt;parts/lfc/models.py&lt;/code&gt;. This line makes &lt;code&gt;register&lt;/code&gt; function to be called on syncdb signal, but there is a problem because &lt;code&gt;register&lt;/code&gt; is called multiple times. This breaks something when register function is trying to add the same objects for the second time (there is an unique index) raising database transaction errors.&lt;/p&gt;
&lt;p&gt;After commenting the line out I ran &lt;code&gt;syncdb&lt;/code&gt; and successfully created database tables and my superuser. Then I uncommented the line and called &lt;code&gt;syncdb&lt;/code&gt; again. This raised an error but in general it worked registering important things like portlets, templates and content types.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Updated content&lt;/em&gt;: The last thing to do is to load some data. There is a helpful script &lt;code&gt;initialize_lfc.py&lt;/code&gt; in scripts directory, so it is enough to start Django's shell (&lt;code&gt;bin/django shell&lt;/code&gt;) and run:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scripts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;initialize_lfc&lt;/span&gt;
&lt;span class="n"&gt;initialize_lfc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;div style="text-decoration:line-through;"&gt;&lt;p&gt;The last thing I had to do was to add a Portal instance. To accomplish this I disabled &lt;code&gt;lfc.context_processors.main&lt;/code&gt; context processor and added &lt;code&gt;django.contrib.admin&lt;/code&gt; to &lt;code&gt;INSTALLED_APPS&lt;/code&gt; in settings.py. I also added &lt;code&gt;(r'^admin/(.*)', admin.site.root),&lt;/code&gt; to urls.py. Then I was able to enter admin panel and add Portal object there. After adding Portal I enabled (uncommented) &lt;code&gt;lfc.context_processors.main&lt;/code&gt; and was able to work with LFC management panel.&lt;/p&gt;
&lt;p&gt;After doing the above I was able to add things through admin panel. For example I got an exception when I tried to enter "Roles" menu. I had to add a role in admin to overcome this.&lt;/p&gt;
&lt;p&gt;Another thing I did was to call &lt;code&gt;bin/django loaddata &lt;somefixture&gt;&lt;/code&gt; to load predefined fixtures from LFS apps (you can find it in &lt;code&gt;parts&lt;/code&gt; directory). I'm not sure why but these fixutres are not loaded automatically.&lt;/p&gt;&lt;/div&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;LFC has some cool features, not so bad docs and good hmm... feeling. I just like it, it's nice, pretty, it has good clean website containing even screencasts (to be honest I don't like screencasts so I didn't watch them :D). I'm going to use LFC in my project soon. It's not yet 1.0 but it already has some live sites. I'm sure it will be a serious competitor to django-cms and feincms, so don't bother to give it a try.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Fri, 07 May 2010 00:12:36 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/05/07/django-lfc/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/05/07/django-lfc/</feedburner:origLink></item><item><title>Django i formularze</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/kR-RWOQ0zL4/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;Formularze są jednym z ważniejszych atutów Django. W tym krótkim wpisie wskazuję dwa artykuły przedstawiające różne ciekawe sposoby pracy z formularzami oraz pewną interesującą aplikację.&lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Zbiegi okoliczności jak najbardziej istnieją. Nie dalej jak wczoraj wgryzałem się w różne ciekawe triki dotyczące wykorzystania formularzy, a w dniu dzisiejszym niejaki Shabda opublikował artykuł na ten właśnie temat. Artykuł na tyle dobry, że skłonił mnie do wrzucenia tu informacji o nim oraz o jeszcze kilku ciekawostkach związanych z formularzami. Zapraszam do zapoznania się z poniższymi materiałami:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://uswaretech.com/blog/2010/01/doing-things-with-django-forms/"&gt;Shabda o tym co można zrobić z formularzami&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.b-list.org/weblog/2008/nov/09/dynamic-forms/"&gt;James Bennet o dynamicznych formularzach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/pydanny/django-uni-form"&gt;django-uni-form&lt;/a&gt; czyli formularze w divach&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><pubDate>Thu, 14 Jan 2010 21:32:05 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2010/01/14/django-i-formularze/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2010/01/14/django-i-formularze/</feedburner:origLink></item><item><title>O Buildoucie i Django</title><link>http://feedproxy.google.com/~r/restless-latest-entries/~3/x0wBuhNbPYg/</link><description>
&lt;div&gt;&lt;b&gt;&lt;p&gt;&lt;a href="http://www.buildout.org/"&gt;Buildout&lt;/a&gt; to stworzony w języku Python system służący do zautomatyzowanego budowania oprogramowania. Oprogramowania zwykle złożonego z wielu różnych części, niekoniecznie opartych na Pythonie. &lt;/p&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;&lt;h2&gt;Buildout?&lt;/h2&gt;
&lt;p&gt;Z Buildoutem zetknąłem się po raz pierwszy wiele lat temu, gdy jeszcze bliżej było mi do Zope niż do Django. Zetknąłem się nie znaczy, że go używałem, ale jak mówi staropolskie powiedzenie "co się odwlecze to nie uciecze" i wygląda na to, że czas Buildouta nastał właśnie teraz. Owo teraz zaczęło się od &lt;a href="http://dominno.pl"&gt;Dominika "Dominno" Szopy&lt;/a&gt; i jego &lt;a href="http://liwo.polsl.pl/pycon-pl/materialy/zastosowanie-buildout-przy-wdrazaniu-projektow-opartych-o-framework-django-prezentacja"&gt;prezentacji na temat Buildouta&lt;/a&gt;, którą wygłosił na konferencji PyConPL. Temat na tyle mnie zainteresował, że postanowiłem zapoznać się z buildoutem bliżej i... jestem pozytywnie zaskoczony. W tym wpisie podzielę się kilkoma spostrzeżeniami na temat wykorzystania Buildouta we własnym projekcie Django.&lt;/p&gt;
&lt;h2&gt;Wprowadzenie do Buildouta&lt;/h2&gt;
&lt;p&gt;Najciekawsze wprowadzenie do Buildouta w języku polskim to artykuł wspomnianego Dominika Szopy z PyConPL. Niestety nie jest on chyba dostępny w Sieci (a przynajmniej nie potrafię go znaleźć), pozostaje więc zapoznanie się z samą tylko prezentacją Dominika oraz anglojęzycznymi materiałami. Poniżej kilka słów wprowadzenia w temat ode mnie, a potem linki do wybranych tutoriali.&lt;/p&gt;
&lt;h3&gt;Buildout z bliska&lt;/h3&gt;
&lt;p&gt;Buildout pozwala na zautomatyzowane instalowanie aplikacji wraz ze wszystkimi zależnościami. Jak można się spodziewać, aby taka zautomatyzowana instalacja zadziałała po pierwsze potrzebny jest Buildout, a po drugie plik konfiguracyjny, w którym znajdą się przepisy wskazujące co ma być zainstalowane. W praktyce oznacza to, że potrzebne są dwa pliki: bootstrap.py oraz buildout.cfg.&lt;/p&gt;
&lt;p&gt;Żeby zainstalować Buildouta wystarczy pobrać i uruchomić skrypt &lt;a href="http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py"&gt;bootstrap.py&lt;/a&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;[ext@sandarcher buildout]$ 
    wget http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py
    (...)
    2009-12-25 23:17:02 (228 KB/s) - zapisano `bootstrap.py&amp;#39; [3807]
[ext@sandarcher buildout]$ touch buildout.cfg
[ext@sandarcher buildout]$ ls
    bootstrap.py buildout.cfg
[ext@sandarcher buildout]$ python bootstrap.py 
    Creating directory &amp;#39;/home/ext/tmp/buildout/bin&amp;#39;.
    Creating directory &amp;#39;/home/ext/tmp/buildout/parts&amp;#39;.
    Creating directory &amp;#39;/home/ext/tmp/buildout/eggs&amp;#39;.
    Creating directory &amp;#39;/home/ext/tmp/buildout/develop-eggs&amp;#39;.
    Generated script &amp;#39;/home/ext/tmp/buildout/bin/buildout&amp;#39;.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Następnie należy wywołać polecenie bin/buildout, co spowoduje, że Buildout zainstaluje to co zostało zdefiniowane w pliku konfiguracyjnym buildout.cfg.&lt;/p&gt;
&lt;p&gt;W skrótcie to tyle, ale warto jeszcze wspomnieć o tym co znajduje się w pliku konfiguracyjnym. Otóż Buildout oparty jest na recipes czyli przepisach. Każdy przepis powoduje wykonanie różnych czynności, takich jak na przykład: zainstalowanie Django, stworzenie skrótu na dysku, czy zainstalowanie pakietu przez configure, make, make install. Tworząc plik konfiguracyjny wpisuje się w nim konkretne przepisy i podaje im parametry.&lt;/p&gt;
&lt;p&gt;Więcej szczegółowych informacji o Buildoucie znaleźć można wśród poniższych materiałów:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://liwo.polsl.pl/pycon-pl/materialy/zastosowanie-buildout-przy-wdrazaniu-projektow-opartych-o-framework-django-prezentacja"&gt;Prezentacja Dominno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stereoplex.com/two-voices/a-django-development-environment-with-zc-buildout"&gt;Projekty Django + Buildout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jacobian.org/writing/more-buildout-notes/"&gt;Aplikacje Django + Buildout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.stereoplex.com/two-voices/installing-geodjango-with-postgresql-and-zc-buildout"&gt;Zaawansowana konfiguracja Buildout dla GeoDjango&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://buildout.org"&gt;Strona domowa Buildouta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Struktura plików i katalogów&lt;/h3&gt;
&lt;p&gt;Tutoriale tutorialami, ale tym co mnie najbardziej interesowało było to jak "zbuildoutować" mój istniejący, lub właśnie tworzony projekt w Django. Jakie stworzyć katalogi, gdzie umieścić konfig Buildouta, itp itd. Z powyższych materiałów niestety nie wynika to wprost dlatego przedstawię tu mój sposób. Jeśli ktoś zna lepszy lub inny to zapraszam do komentowania.&lt;/p&gt;
&lt;p&gt;Jak już wspomniałem Buildout wymaga w zasadzie dwóch plików: konfiguracyjnego buildout.cfg oraz inicjalizującego środowisko bootstrap.py. Ja do tego dokładam jeszcze projekt djangowy i w efekcie moja struktura plików i katalogów wygląda następująco:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;- bootstrap.py
- buildout.cfg
- project/ (katalog z moim projektem)
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To, że mój projekt nazywa się "project" jest zapisane w konfiguracji dla Buildouta - będzie to widoczne w przedstawionym nieco dalej fragmencie buildout.cfg w sekcji [django].&lt;/p&gt;
&lt;p&gt;Powyższe umieszczam w repozytorium, po czym wykonuję np. na innym serwerze checkout (pobranie z repozytorium), odpalam bootstrap.py (instalacja Buildouta) i wywołuję bin/buildout (instalacja projektu i zależności). W efekcie uzyskuję w pełni skonfigurowane środowisko do uruchamiania projektu.&lt;/p&gt;
&lt;h3&gt;Odrobina customizacji&lt;/h3&gt;
&lt;p&gt;Wśród wielu przydatnych opcji Buildouta warto wspomnieć o rozszerzaniu plików konfiguracyjnych. Rozszerzanie pozwala na zdefiniowanie różnych plików konfiguracyjnych np. dla środowiska deweloperskiego czy testowego, które bazując na innym pliku konfiguracyjnym modyfikują niektóre spośród zawartych w nim ustawień. &lt;/p&gt;
&lt;p&gt;Fragment przykładowego pliku buildout.cfg:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[buildout]&lt;/span&gt;
&lt;span class="na"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;PIL django omlette cms-media&lt;/span&gt;

&lt;span class="k"&gt;[PIL]&lt;/span&gt;
&lt;span class="na"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;zc.recipe.egg&lt;/span&gt;
&lt;span class="na"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;PIL==1.1.6&lt;/span&gt;
&lt;span class="na"&gt;find-links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;http://dist.repoze.org&lt;/span&gt;

&lt;span class="k"&gt;[django]&lt;/span&gt;
&lt;span class="na"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;djangorecipe&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;
&lt;span class="na"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
     &lt;span class="s"&gt;PIL == 1.1.6&lt;/span&gt;
     &lt;span class="err"&gt;psycopg2&lt;/span&gt;
     &lt;span class="err"&gt;egenix-mx-base&lt;/span&gt;
     &lt;span class="err"&gt;south&lt;/span&gt;
     &lt;span class="err"&gt;django-reversion&lt;/span&gt;
     &lt;span class="err"&gt;django-tinymce&lt;/span&gt;
     &lt;span class="err"&gt;django-cms&lt;/span&gt;
&lt;span class="na"&gt;wsgi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;extra-paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;${buildout:directory}/project/apps&lt;/span&gt;
&lt;span class="err"&gt;(...)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Powyższa konfiguracja instaluje PIL oraz kilka bibliotek i aplikacji określonych w sekcji eggs. Warto tu także zwrócić uwagę na ciekawe ustawienia w przepisie dla Django, takie jak "wsgi=True", które określa czy ma być generowany skrypt .wsgi pozwalający na uruchamianie projektu spod mod_wsgi oraz "settings=production" wskazujące jaki plik jest plikiem konfiguracyjnym projektu. Wpis "extra-paths" pozwala na określenie ścieżek, które zostaną dodane do PYTHONPATH, w tym przypadku jest to folder "apps" w moim projekcie, w którym to folderze trzymam wykonane na potrzeby projektu aplikacje.&lt;/p&gt;
&lt;p&gt;Przykładowy plik devel.cfg dla środowiska deweloperskiego:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[buildout]&lt;/span&gt;
&lt;span class="na"&gt;extends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;buildout.cfg&lt;/span&gt;

&lt;span class="k"&gt;[django]&lt;/span&gt;
&lt;span class="na"&gt;wsgi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;development&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Plik devel.cfg rozszerza konfigurację zawartą w buildout.cfg poprzez modyfikację ustawień dla sekcji [django]. Sekcja ta to przepis instalujący Django, który zostaje tu ustawiony tak, aby w środowisku deweloperskim nie generował pliku .wsgi oraz aby używał pliku o nazwie development.py jako konfiguracji Django.&lt;/p&gt;
&lt;p&gt;Jak korzystać z takich rozszerzających plików konfiguracyjnych? Bardzo prosto:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;bin/buildout -c devel.cfg
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Uwaga na PIL&lt;/h2&gt;
&lt;p&gt;PIL czyli Python Imaging Library jest bardzo często wykorzystywany przez różne aplikacje Django (mam tu na myśli głównie aplikacje do wielokrotnego wykorzystania (ang. reusable apps)). Niestety biblioteka ta od zawsze sprawiała kłopoty przy instalacji i tak samo było podczas moich eksperymentów z PILem i Buildoutem. Żaden ze sposobów instalacji PIL podany w podlinkowanych wyżej materiałach nie chciał zadziałać. PIL instalował się w złej wersji, albo w dwóch różnych wersjach i Django nie chciało go "zobaczyć". Przyczyną problemu okazało się to, że wydana została nowa wersja PIL, a rozwiązanie polegało na określeniu w pliku konfiguracyjnym w dwóch miejscach dokładnej wersji PIL, co widać w przykładzie poniżej.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[PIL]&lt;/span&gt;
&lt;span class="na"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;zc.recipe.egg&lt;/span&gt;
&lt;span class="na"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;PIL==1.1.6&lt;/span&gt;
&lt;span class="na"&gt;find-links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;http://dist.repoze.org&lt;/span&gt;

&lt;span class="k"&gt;[django]&lt;/span&gt;
&lt;span class="na"&gt;recipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;djangorecipe&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;
&lt;span class="na"&gt;eggs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
     &lt;span class="s"&gt;PIL == 1.1.6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jeśli więc po przeczytaniu tutoriala do Buildouta występują problemy z instalacją PIL sugeruję wypróbować powyższą konfigurację.&lt;/p&gt;
&lt;h2&gt;Dlaczego buildout a nie PIP?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://pypi.python.org/pypi/pip"&gt;PIP&lt;/a&gt; czyli Pip Installs Packages to narzędzie zastępujące easy_install. Tym co czyni PIP podobnym do Buildouta są pliki wymagań (ang. requirements), które pozwalają na zdefiniowanie zestawu pakietów do zainstalowania. Taki plik wymagań ma zwykle bardzo prostą postać np.:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;MyApp
Framework==0.9.4
Library&amp;gt;=0.2
-e svn+http://myrepo/svn/MyApp#egg=MyApp
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pierwsze trzy wpisy określają konkretne biblioteki do zainstalowania (np. z PyPi), ostatnia linia wskazuje, że zainstalowana ma być aplikacja z repozytorium svn.  Jeśli plik wymagań nazywa się requirements.txt to możemy zainstalować zdefiniowane w nim pakiety wydając polecenie:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;pip install -r requirements.txt
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Co bardzo istotne, zadaniem PIPa jest instalowanie pakietów Pythona, które są stworzone zgodnie ze standarowymi sposobami dystrybucji (zdefiniowanymi w distutils). Oznacza to, że każdy instalowany pakiet musi być pakietem pythonowym oraz musi posiadać prawidłowy plik setup.py. &lt;/p&gt;
&lt;p&gt;Chociaż PIP i jego pliki wymagań sprawdzają się w wielu projektach (wiem bo sam korzystam) to jednak PIP ma pewne istotne ograniczenia i tak naprawdę jest narzędziem przeznaczonym do czegoś innego niż Buildout, który ma po prostu znacznie większe możliwości. Najlepszym dowodem na to jest fakt, że istnieje dla Buildouta przepis pozwalający na instalacje pakietów za pomocą PIP.&lt;/p&gt;
&lt;h2&gt;Dlaczego virtualenv i Buildout?&lt;/h2&gt;
&lt;p&gt;Na koniec kilka słów na temat &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt; i Buildouta. Virtualenv to narzędzie do tworzenia wirtualnych wyizolowanych środowisk Pythona. W praktyce Buildout instalując aplikacje i różne pakiety działa nieco podobnie do virtualenva, gdyż umieszcza je w swoich własnych katalogach (wygenerowanych przez bootstrap.py) i nie narusza systemowego Pythona. &lt;/p&gt;
&lt;p&gt;Kiedy więc warto połączyć virtualenv z Buildoutem? Otóż wtedy, gdy chcemy aby tworzone środowisko nie korzystało w ogóle z bibliotek z systemowego Pythona. Wówczas należy wygenerować nowe wirtualne środowisko za uruchamiając polecenie virtualenv z parametrem --no-site-packages i dopiero w nim uruchomić Buildouta.&lt;/p&gt;
&lt;h2&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Buildout jest narzędziem, którym zdecydowanie warto się zainteresować, po to aby... ułatwić sobie życie. Buildout przydaje się zarówno przy umieszczaniu projektu w wielu różnych środowiskach (deweloperskim, testowym, produkcyjnym) jak i przy pracy grupowej, gdy trzeba zainstalować projekt u kilku deweloperów. Ze swojej strony zdecydowanie zachęcem do wypróbowania Buildouta we własnych projektach.&lt;/p&gt;&lt;/div&gt;</description><pubDate>Sun, 27 Dec 2009 00:20:30 +0100</pubDate><guid isPermaLink="false">http://restlessbeing.pl/blog/2009/12/27/o-buildoucie-i-django/</guid><feedburner:origLink>http://restlessbeing.pl/blog/2009/12/27/o-buildoucie-i-django/</feedburner:origLink></item></channel></rss>

