<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>FLLOG</title> <atom:link href="http://michalklich.com/feed/" rel="self" type="application/rss+xml" /><link>http://michalklich.com</link> <description>question authority</description> <lastBuildDate>Wed, 04 Apr 2012 20:31:04 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>rolling distro</title><link>http://michalklich.com/2012/03/31/rolling-distro/</link> <comments>http://michalklich.com/2012/03/31/rolling-distro/#comments</comments> <pubDate>Sat, 31 Mar 2012 10:00:57 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[linux]]></category> <category><![CDATA[rolling distro]]></category> <category><![CDATA[sabayon]]></category><guid
isPermaLink="false">http://michalklich.com/?p=1213</guid> <description><![CDATA[Czy ktoś jeszcze używa dystrybucji o standardowym modelu wydań? Tak, mnóstwo nieświadomych ludzi. Jeśli ktoś ma czasu w nadmiarze i lubi co pół roku powalczyć z systemem to niech oszczędzi czasu i nie czyta a ten zachowany czas wykorzysta na stawianie Xów po aktualizacji wersji dystrybucji. Nie pamiętam już jak dawno temu przesiadłem się na [...]<p><a
href="http://michalklich.com/2012/03/31/rolling-distro/">rolling distro</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Czy ktoś jeszcze używa dystrybucji o standardowym modelu wydań?<br
/> Tak, mnóstwo nieświadomych ludzi.<br
/> Jeśli ktoś ma czasu w nadmiarze i lubi co pół roku powalczyć z systemem to niech oszczędzi czasu i nie czyta a ten zachowany czas wykorzysta na stawianie Xów po aktualizacji wersji dystrybucji.<br
/> <span
id="more-1213"></span><br
/> Nie pamiętam już jak dawno temu przesiadłem się na <a
href="http://sabayon.org/">Sabayona</a>. Może to i linuks dla ludzi, którzy nie umieją postawić <a
href="http://www.gentoo.org/">Gentoo</a> ale na laptopie (który, jest jedynym komputerem w domu) nie widzę sensu posiadać Gentoo. No więc dla tych zainteresowanych polecam jakiekolwiek <a
href="https://en.wikipedia.org/wiki/Rolling_release">rolling distro</a>. Od czasu mojej instalacji nie zepsuło się nic! Porównując z Fedorą, której wcześniej używałem i gdzie regularnie coś padało między wydaniami, Sabayon wygrywa w cuglach. Muszę jednak przyznać, że w ostatnich wydaniach Fedory (może i innych dystrybucji) błędy były mniej uciążliwe.<br
/> Na czym polega rolling distro? Brak wydań i ciągła aktualizacja pakietów, oczywiście nie oznacza to, że system ma non stop wersje bleeding edge oprogramowania, opiekunowie poszczególnych pakietów dbają aby były one w rozsądnej wersji. Brak wydań oznacza brak bolesnych aktualizacji między wersjami, brak problemów z przenoszeniem konfiguracji, etc. Dopisz sobie swoje własne problemy. Nie zapomnę tego słynnego z za małą partycją /boot.<br
/> Jeśli ktoś jest zainteresowany to gorąco zachęcam do zmiany, jedna instalacja a potem plaża, palmy i drinki z parasolkami. <a
href="https://en.wikipedia.org/wiki/Rolling_release#List_of_rolling_release_software_distributions">Lista dostępnych dystrybucji rolling</a> jest dostępna na Wikipedii. Ze swojej strony mogę polecić <a
href="http://sabayon.org/download">Sabayon</a>, pakiety binarne, emerge/eix i piękne sloty z Gentoo.</p><p><a
href="http://michalklich.com/2012/03/31/rolling-distro/">rolling distro</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2012/03/31/rolling-distro/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>*args, args i pdb</title><link>http://michalklich.com/2012/03/29/args-args-i-pdb/</link> <comments>http://michalklich.com/2012/03/29/args-args-i-pdb/#comments</comments> <pubDate>Thu, 29 Mar 2012 19:51:41 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[debug]]></category> <category><![CDATA[pdb]]></category><guid
isPermaLink="false">http://michalklich.com/?p=1201</guid> <description><![CDATA[Ludziom którym się to przydarzyło w moment uchwycą o co chodzi czytając tytuł. Pdb ma duże możliwości, tak wiem, że zmusza ludzi do nadmiernego klepania ale jest bardzo uniwersalny. Nie wiem dlaczego jedna z wewnętrznych komend pdb to &#8222;args&#8221;, trochę to może skomplikować sprawę jeśli nie zdajesz sobie z tego sprawy. Oto co dostaniesz jeśli [...]<p><a
href="http://michalklich.com/2012/03/29/args-args-i-pdb/">*args, args i pdb</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Ludziom którym się to przydarzyło w moment uchwycą o co chodzi czytając tytuł. <em><a
href="http://docs.python.org/library/pdb.html" title="Pdb">Pdb</a></em> ma duże możliwości, tak wiem, że zmusza ludzi do nadmiernego klepania ale jest bardzo uniwersalny. Nie wiem dlaczego jedna z wewnętrznych komend <em>pdb</em> to &#8222;args&#8221;, trochę to może skomplikować sprawę jeśli nie zdajesz sobie z tego sprawy. Oto co dostaniesz jeśli wpiszesz &#8222;args&#8221; w <em>pdb</em>.</p><pre class="brush: python; title: ; notranslate">
def foo(*args, **kwargs):
    import pdb; pdb.set_trace()
    print args

if __name__ == &quot;__main__&quot;:
    foo('argument 1', 'argument 2', 'argument 3')

(Pdb) args
args = ('argument 1', 'argument 2', 'argument 3')
kwargs = {}
(Pdb) p args
('argument 1', 'argument 2', 'argument 3')
</pre><p>Ja spodziewałem się czegoś innego a mianowicie tylko i wyłącznie krotki (tuple) z argumentami. Dopiero po pewnym czasie kiedy w trójkę gapiliśmy się na to kumpel zrozumiał gdzie jest problem. Wystarczy w <em>pdb</em> wpisać &#8222;h&#8221; i zerknąć na listę komend, gdzie znajdzie się args. <em>Pdb</em> najzwyczajniej w świecie wywołuje swoją wewnętrzną komendę zamiast wyświetlić to co znajduje się w args. Dlaczego to zostało tak zrobione? Właściwie powinienem zadać pytanie, dlaczego *args jest tak lansowane? Co prawda takie zachowanie będzie zagadką tylko raz ale komuś może zająć dużo czasu odkrycie, że to nie jest błąd.<br
/> Aby tego uniknąć można zamiast *args użyć innej nazwy ale tak już się przyjęło i gdzie nie spojrzę na kod to widzę *args a nie *params. Dobrze też uważać i nie tworzyć sobie w pdb zmiennych, które nazywają się tak jak komendy debuggera. Należy wystrzegać się zwłaszcza &#8222;c&#8221; lub &#8222;q&#8221;, ale to też jednorazowe pomyłki.<br
/> A tak w ogóle to:<br
/> <strong><br
/> :W0142: *Used * or ** magic*<br
/> Used when a function or method is called using `*args` or `**kwargs` to dispatch arguments.<br
/> This doesn&#8217;t improve readability and should be used with care.</strong></p><p><a
href="http://michalklich.com/2012/03/29/args-args-i-pdb/">*args, args i pdb</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2012/03/29/args-args-i-pdb/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Szybkie stringi 2</title><link>http://michalklich.com/2012/03/28/szybkie-stringi-2/</link> <comments>http://michalklich.com/2012/03/28/szybkie-stringi-2/#comments</comments> <pubDate>Wed, 28 Mar 2012 20:24:09 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[python]]></category> <category><![CDATA[pypy]]></category> <category><![CDATA[pypy1.7]]></category> <category><![CDATA[pypy1.8]]></category> <category><![CDATA[python2]]></category> <category><![CDATA[python3]]></category><guid
isPermaLink="false">http://michalklich.com/?p=1188</guid> <description><![CDATA[Po lekkim szoku wywołanym odkryciem jak się zachowuje Python przy składaniu stringów postanowiłem sprawdzić jak inne wersje Pythona sobie radzą. Przetestowałem Pythona 3.2 oraz PyPy 1.7-r2 i 1.8-r1. Kod pozostał ten sam jak w pierwszej części (oprócz instrukcji print, którą musiałem dostosować do Pythona 3.2), do Pythona 3.2 dołożyłem składanie stringów przy użyciu format(). Wyniki [...]<p><a
href="http://michalklich.com/2012/03/28/szybkie-stringi-2/">Szybkie stringi 2</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Po lekkim szoku wywołanym odkryciem jak się zachowuje Python przy składaniu stringów postanowiłem sprawdzić<br
/> jak inne wersje Pythona sobie radzą. Przetestowałem Pythona 3.2 oraz PyPy 1.7-r2 i 1.8-r1. Kod pozostał ten sam jak w pierwszej części (oprócz instrukcji print, którą musiałem dostosować do Pythona 3.2), do Pythona 3.2 dołożyłem składanie stringów przy użyciu format().<br
/> <span
id="more-1188"></span><br
/> Wyniki mnie nie zaskoczyły bo spodziewałem się wszystkiego a przede wszystkim, że pypy zmiecie pythona. A oto one, Python 2.7 został umieszczony tylko dla porównania jak się zmieniają czasy dla poszczególnych wersji.</p><pre class="brush: bash; title: ; notranslate">
$ python2.7 timeit_string_format.py
+ , [1.085777997970581, 1.028688907623291, 1.0265541076660156]
% , [1.659928798675537, 1.6647131443023682, 1.6848421096801758]

$ python3.2 timeit_string_format.py
+ ,  [1.2642889022827148, 1.3161091804504395, 1.2756080627441406]
% ,  [1.154999017715454, 1.201200008392334, 1.1763830184936523]
format ,  [2.1013739109039307, 1.9700350761413574, 1.9505469799041748]

$ pypy-c1.7 timeit_string_format.py
+ , [0.008589029312133789, 0.0017871856689453125, 0.0018048286437988281]
% , [0.14042305946350098, 0.13074803352355957, 0.1352391242980957]

$ pypy-c1.8 timeit_string_format.py
+ , [0.01731586456298828, 0.004745960235595703, 0.0049970149993896484]
% , [0.15033602714538574, 0.12151813507080078, 0.13396596908569336]
</pre><p>Wersja 3.2 przyspieszyła przy składaniu stringów używając % ale znowu łączenie + zwolniło. No a pypy po prostu śmiga. Wyniki ładnie dosyć obrazują &#8222;rozgrzewanie&#8221; maszyny wirtualnej, pierwszy wynik dla obu wersji pypy odstaje dosyć wyraźnie od pozostałych. Dziwi mnie spadek wydajności wersji 1.8, nie wiem czy powinienem to zgłosić. Programiści podczas prezentacji na PyConie mówili, że jeśli coś jest wolniej to jest to błąd.<br
/> To tylko ciekawostka bo tak naprawdę liczy się przede wszystkim czytelność i tylko jeśli to naprawdę jest wąskie gardło aplikacji to można się zastanawiać nad optymalizacją.</p><p><a
href="http://michalklich.com/2012/03/28/szybkie-stringi-2/">Szybkie stringi 2</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2012/03/28/szybkie-stringi-2/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>PyCon US 2012</title><link>http://michalklich.com/2012/03/15/pycon-us-2012/</link> <comments>http://michalklich.com/2012/03/15/pycon-us-2012/#comments</comments> <pubDate>Thu, 15 Mar 2012 19:32:47 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[PyCon]]></category> <category><![CDATA[python]]></category> <category><![CDATA[pycon 2012]]></category> <category><![CDATA[pycon us]]></category><guid
isPermaLink="false">http://michalklich.com/?p=1181</guid> <description><![CDATA[Tegoroczny PyCon US 2012 dobiega końca. Wykłady już się zakończyły, obecnie piszą kod. Ale nie o tym chciałem wspomnieć. Do tej pory nie pojawił się jakiś oficjalny kanał, nie ma również wzmianki o nagraniach konferencji na stronie PyCon`u. Ale ktoś jednak publikował cały czas na youtube, wystarczy kliknąć aby zobaczyć listę nagrań. Najlepiej jednak zerknąć [...]<p><a
href="http://michalklich.com/2012/03/15/pycon-us-2012/">PyCon US 2012</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Tegoroczny PyCon US 2012 dobiega końca. Wykłady już się zakończyły, obecnie piszą kod. Ale nie o tym chciałem wspomnieć. Do tej pory nie pojawił się jakiś oficjalny kanał, nie ma również wzmianki o nagraniach konferencji na stronie PyCon`u. Ale ktoś jednak publikował cały czas na youtube, wystarczy kliknąć aby zobaczyć <a
href="http://www.youtube.com/results?search_query=python+pycon+pycon2012&#038;search=tag" title="listę nagrań">listę nagrań</a>. Najlepiej jednak zerknąć na <a
href="https://us.pycon.org/2012/schedule/">agendę konferencji</a> a potem przeszukać <a
href="http://www.youtube.com/user/NextDayVideo/videos">kanał</a> użytkownika <a
href="http://www.youtube.com/user/NextDayVideo">NextDayVideo</a>, wygląda jakby mieli wszystko.<br
/> Tytuł mógłby sugerować, że byłem na konferencji ale niestety nie.</p><p><a
href="http://michalklich.com/2012/03/15/pycon-us-2012/">PyCon US 2012</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2012/03/15/pycon-us-2012/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>O szybkich stringach w pythonie</title><link>http://michalklich.com/2012/03/12/o-szybkich-stringach-w-pythonie/</link> <comments>http://michalklich.com/2012/03/12/o-szybkich-stringach-w-pythonie/#comments</comments> <pubDate>Mon, 12 Mar 2012 22:05:48 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[python]]></category> <category><![CDATA[python2]]></category><guid
isPermaLink="false">http://michalklich.com/?p=1131</guid> <description><![CDATA[Pewnego dnia patrząc na kod zacząłem się zastanawiać naleciałości jakiego języka wyglądają tak: Dosyć nieczytelne w wypadku długich łańcuchów i wolniejsze wg. mnie niż Nie wiem, skąd u mnie takie przeświadczenie bo po sprawdzeniu okazało się, że druga konstrukcja (ta bardziej pro) jest wolniejsza i to znacznie. Jeśli chcesz wiedzieć dlaczego to czytaj dalej. Różnica [...]<p><a
href="http://michalklich.com/2012/03/12/o-szybkich-stringach-w-pythonie/">O szybkich stringach w pythonie</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Pewnego dnia patrząc na kod zacząłem się zastanawiać naleciałości jakiego języka wyglądają tak:</p><pre class="brush: python; title: ; notranslate">
text_var_one = 'I am text'
int_var_two = 100
str_variable = 'Some text is written ' + text_var_one + \
               ', next some number is ' + str(int_var_two)
</pre><p>Dosyć nieczytelne w wypadku długich łańcuchów i wolniejsze wg. mnie niż</p><pre class="brush: python; title: ; notranslate">
text_var_one = 'I am text'
int_var_two = 100
str_variable = 'Some text is written %s, next some number is %d' % \
               (text_var_one, int_var_two)
</pre><p>Nie wiem, skąd u mnie takie przeświadczenie bo po sprawdzeniu okazało się, że druga konstrukcja (ta bardziej pro) jest wolniejsza i to znacznie. Jeśli chcesz wiedzieć dlaczego to czytaj dalej.<br
/> <span
id="more-1131"></span><br
/> Różnica prędkości obu sposobów jest ponad dwukrotna. Trzeba to czymś podeprzeć więc pokazuję kod którym to testowałem. Do testów przydaje się moduł <a
href="http://docs.python.org/library/timeit.html" title="timeit" target="_blank">timeit</a>.</p><pre class="brush: python; title: ; notranslate">
def method_one():
    for i in xrange(100000):
        'This is: ' + 'var1' + ', this is: ' + str(2)

def method_two():
    for i in xrange(100000):
        'This is: %s, this is: %d' % ('var1', 2)

if __name__ == '__main__':
    import timeit
    print timeit.repeat(stmt='method_one()',
                        setup='from __main__ import method_one',
                        number=100)
    print timeit.repeat(stmt='method_two()',
                        setup='from __main__ import method_two',
                        number=100)
</pre><p>Każda funkcja zostanie zawołana 100 razy w 3 próbach, obie same wykonają pętlę 100000.</p><pre class="brush: bash; title: ; notranslate">
$ python timeit_string_format.py
[6.49452805519104, 6.4961841106414795, 6.490808963775635]
[13.923700094223022, 13.944485902786255, 13.96959900856018]
</pre><p>Wyniki mówią same za siebie ale dlaczego tak jest. Aby to sprawdzić trzeba użyć modułu <a
href="http://docs.python.org/library/dis.html" title="dis" target="_blank">dis</a> ze standardowej biblioteki Pythona. Jeśli masz jakiekolwiek wątpliwości z jakiego powodu coś jest szybsze od innego cośa to odpal <em>dis.dis()</em>. Ten moduł zabiera trochę magii z programowania ale przecież dobrze wiemy, że ani magii ani jednorożców nie ma, bo liczą się liczby i fakty.</p><pre class="brush: python; title: ; notranslate">
import dis

def dis_method_one():
    'This is: ' + 'var1' + ', this is: ' + str(2)

def dis_method_two():
    'This is: %s, this is: %d' % ('var1', 2)

dis.dis(dis_method_one)
dis.dis(dis_method_two)
</pre><p>Specjalnie pominąłem instrukcję <em>for</em> bo tylko zaciemniłaby obraz. Oto wyniki <em>dis.dis()</em>.</p><pre class="brush: plain; title: ; notranslate">
12            0 LOAD_CONST               5 ('This is: var1')
              3 LOAD_CONST               3 (', this is: ')
              6 BINARY_ADD
              7 LOAD_GLOBAL              0 (str)
             10 LOAD_CONST               4 (2)
             13 CALL_FUNCTION            1
             16 BINARY_ADD
             17 POP_TOP
             18 LOAD_CONST               0 (None)
             21 RETURN_VALUE 

16           0 LOAD_CONST               1 ('This is: %s, this is: %d')
             3 LOAD_CONST               4 (('var1', 2))
             6 BINARY_MODULO
             7 POP_TOP
             8 LOAD_CONST               0 (None)
            11 RETURN_VALUE
</pre><p>Co z miejsca rzuca się w oczy, pierwsza funkcja (ta szybsza) ma o wiele więcej instrukcji więc wygląda, że powinna być wolniejsza lecz nie jest. Konieczne jest dokładniejsze przeanalizowanie tego przypadku. Łatwo zauważyć, że oba listingi dzielą się na trzy części, dwie z nich są wspólne dla obu funkcji więc można założyć, że to nie tutaj jest pies pogrzebany. Pierwsza część to dwie instrukcje <em>LOAD_CONST</em>, co prawda różnią się ilością parametrów ale na korzyść (przynajmniej jeśli chodzi o ich ilość) szybszej funkcji.<br
/> Niektórzy mogą zauważyć, że Python sprytnie sobie dodał dwa stringi w pierwszej instrukcji <em>LOAD_CONST</em>. Zamiana stringa i inta miejscami dodaje nam jeszcze jedną operację <em>BINARY_ADD</em> ale nadal jest to szybsze. Taka zmiana jest niepożądana z prostego faktu, rezultat końcowy obu funkcji będzie się różnił.<br
/> Druga część wspólna to końcówka czyli instrukcje od <em>POP_TOP</em>. Mięso jest pomiędzy tymi dwoma częściami oraz w źródłach Pythona. Niestety trzeba tam zajrzeć bo więcej się już nie dowiemy. Na warsztat bierzemy plik Python/ceval.c, ze źródeł (w moim wypadku była to wersja 2.7.2), gdzie znajdują się <em>BINARY_ADD</em> oraz <em>BINARY_MODULO</em>. Celowo pomijam <em>LOAD_GLOBAL</em>, <em>LOAD_CONST</em> i <em>CALL_FUNCTION</em> z szybszej funkcji ponieważ jest ona szybsza i mnie to nie interesuje (przynajmniej do czasu sprawdzenia czy wywołanie funkcji w Pythonie naprawdę jest takie kosztowne). Poniżej kod odpowiadający za obie funkcje i jak się przekonacie również nie odpowie na pytanie dlaczego brzydsze jest szybsze.</p><pre class="brush: cpp; title: ; notranslate">
case BINARY_MODULO:
            w = POP();
            v = TOP();
            if (PyString_CheckExact(v))
                x = PyString_Format(v, w);
            else
                x = PyNumber_Remainder(v, w);
            Py_DECREF(v);
            Py_DECREF(w);
            SET_TOP(x);
            if (x != NULL) continue;
            break;

case BINARY_ADD:
            w = POP();
            v = TOP();
            if (PyInt_CheckExact(v) &amp;&amp; PyInt_CheckExact(w)) {
                /* INLINE: int + int */
                register long a, b, i;
                a = PyInt_AS_LONG(v);
                b = PyInt_AS_LONG(w);
                /* cast to avoid undefined behaviour
                   on overflow */
                i = (long)((unsigned long)a + b);
                if ((i^a) &lt; 0 &amp;&amp; (i^b) &lt; 0)
                    goto slow_add;
                x = PyInt_FromLong(i);
            }
            else if (PyString_CheckExact(v) &amp;&amp;
                     PyString_CheckExact(w)) {
                x = string_concatenate(v, w, f, next_instr);
                /* string_concatenate consumed the ref to v */
                goto skip_decref_vx;
            }
            else {
              slow_add:
                x = PyNumber_Add(v, w);
            }
            Py_DECREF(v);
          skip_decref_vx:
            Py_DECREF(w);
            SET_TOP(x);
            if (x != NULL) continue;
            break;
</pre><p>Znowu szybsza jest funkcja, która na taką nie wygląda. We have to go deeper! Przeanalizuję teraz pierwszy przypadek szybszej funkcji. Na pierwszy ogień idą dwa stringi &#8216;This is: var1&#8242; oraz &#8216;, this is: &#8216; więc instrukcja <em>PyString_CheckExact()</em> zwróci True dla obu więc zawołane zostanie string_concatenate(). Za drugim razem również zostanie zawołane <em>string_concatenate()</em> gdyż <em>str(2)</em> tworzy string, w innym wypadku nie można by było ich połączyć. Reasumując, pierwsza funkcja wykonuje jedynie łączenie stringów bez ich analizy.<br
/> Teraz druga funkcja, która woła jedynie <em>BINARY_MODULO</em> przekazując string oraz krotkę (tuple). Krotka zostanie przypisana do zmiennej <em>w</em> a string do zmiennej <em>v</em> gdyż w takiej kolejności zostały włożone na stos. <em>PyString_CheckExact()</em> dla zmiennej <em>v</em>, które nota bene jest makrem, zwraca <em>True</em> i zmienne zostają przekazane do funkcji <em>PyString_Format()</em> z pliku Objects/stringobject.c. Tej funkcji nie będę załączał z powodu jej rozmiaru, trzeba zerknąć samemu. W tym miejscu string jest skanowany na obecność odpowiednich znaczników formatowania, robione są testy na poprawność wywołania, testy zgodności parametrów z formatowaniem itd. itp. Nie podjąłem się dokładniejszej analizy tego kodu ale dobrze widać gdzie jest ten nieszczęsny pies. Sama ta funkcja <em>PyString_Format()</em> waży ok. 500 linii kodu.<br
/> Konkluzja jest prosta jeśli zależy nam na szybkości a nie interesuje nas czytelność można postawić na &#8222;+&#8221; i tak łączyć stringi. Natomiast gdy stawiamy na czytelność a na drugim miejscu jest wydajność to bierzemy &#8222;%&#8221;. Oczywiście argument dotyczący czytelności jest subiektywny i to tylko moje zdanie.<br
/> Sprawa wygląda trochę inaczej przy łączeniu długich stringów, w takim przypadku operator &#8222;+&#8221; nadal jest szybszy ale różnica trochę topnieje.<br
/> P.S.<br
/> Dzisiaj po wielu miesiącach udało mi się przenieść blog na <a
href="http://rootnode.net" title="rootnode.net" target="_blank">rootnode.net</a>. Pojawią się zmiany wyglądu bo ten przestał mi się już podobać.</p><p><a
href="http://michalklich.com/2012/03/12/o-szybkich-stringach-w-pythonie/">O szybkich stringach w pythonie</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2012/03/12/o-szybkich-stringach-w-pythonie/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Py4A czyli piszemy aplikację na androida.</title><link>http://michalklich.com/2011/06/01/py4a-czyli-piszemy-aplikacje-na-androida/</link> <comments>http://michalklich.com/2011/06/01/py4a-czyli-piszemy-aplikacje-na-androida/#comments</comments> <pubDate>Wed, 01 Jun 2011 18:40:17 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[android]]></category> <category><![CDATA[python]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1075</guid> <description><![CDATA[Jak obiecałem jest to krótki opis w jaki sposób zmajstrować aplikację z prostym GUI napisaną w pythonie na androida. Py4A ma wiele funkcji ale niestety brakuje mu dostępu do podstawowych funkcji do tworzenia interfejsów dla androida. Konieczne jest posiłkowanie się WebView czyli htmlem oraz javascriptem. Jeśli nadal jesteś chętny to czytaj dalej. Muszę zaznaczyć na [...]<p><a
href="http://michalklich.com/2011/06/01/py4a-czyli-piszemy-aplikacje-na-androida/">Py4A czyli piszemy aplikację na androida.</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Jak obiecałem jest to krótki opis w jaki sposób zmajstrować aplikację z prostym GUI napisaną w pythonie na androida. Py4A ma wiele funkcji ale niestety brakuje mu dostępu do podstawowych funkcji do tworzenia interfejsów dla androida. Konieczne jest posiłkowanie się WebView czyli htmlem oraz javascriptem. Jeśli nadal jesteś chętny to czytaj dalej.<br
/> <span
id="more-1075"></span><br
/> Muszę zaznaczyć na samym początku artykułu, że kod nie jest doskonały a sam przykład nie jest może do końca przemyślany. Należy to traktować jako wstęp do swoich aplikacji i drogowskaz. Jeśli ktoś ma uwagi odnośnie kodu to proszę bardzo jednak dużo bardziej jestem zainteresowany innymi sposobami użycia pythona na androidzie. Kod sam w sobie nie wykonuje żadnych skomplikowanych operacji na sprzęcie, pomimo że API to umożliwia, jak już pisałem przykład nie jest do końca przemyślany a moim celem było tylko pokazanie, że aplikacje mogą posiadać interfejs a nie być po prostu skryptami. Koniec biadolenia, przechodzimy do mięska.<br
/> Najskromniejsza z aplikacji to tak naprawdę dwa pliki. Py który zawiera kod, mechanikę, funkcje itd. oraz html czyli interfejs. Python zaakceptuje wszystko pod warunkiem oczywiście, że są odpowiednie moduły. Html natomiast przyjmie js oraz css więc daje duże możliwości.<br
/> Oto plik .py, opiszę poszczególne fragmenty.</p><pre class="brush: python; title: ; notranslate">
import android

droid = android.Android()
droid.webViewShow('file:///sdcard/sl4a/scripts/gasoline_ui.html')
while True:
    dist = droid.eventWaitFor('dist').result['data']
    gas = droid.eventWaitFor('gas').result['data']
    res = float(gas) / float(dist) * 100
    droid.dialogCreateAlert('Wynik kalkulacji', 'Spalanie: %s' % res)
    droid.dialogSetNeutralButtonText(&quot;Ok&quot;)
    droid.dialogShow()
    result = droid.dialogGetResponse().result
    droid.dialogDismiss()
</pre><p>Początek jest na tyle prosty, że nie ma co pisać. W pętli dzieje się cała mechanika, python czeka w niej na zdarzenia uruchamiane przez użytkownika w wymienionym wcześniej pliku html (o nim później). Wartości przypisywane są do odpowiednich zmiennych a potem wynik jest wypluwany w formie okna dialogowego. Żadnych trudności, wszystko proste i przyjemne.<br
/> A teraz plik html.</p><pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
  &lt;head&gt;
    &lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;/test.css&quot;&gt;
    &lt;title&gt;Kalkulator spalania&lt;/title&gt;
    &lt;script&gt;
      var droid = new Android();

      var calc = function() {
      var dist = document.getElementById('dist').value;
      var gas = document.getElementById('gas').value;
      droid.eventPost(&quot;dist&quot;, dist);
      droid.eventPost(&quot;gas&quot;, gas);
      };
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;form onsubmit=&quot;calc(); return false;&quot;&gt;
      &lt;label for=&quot;dist&quot;&gt;Ile przejechałeś?&lt;/label&gt;
      &lt;input type=&quot;text&quot; id=&quot;dist&quot; /&gt;
      &lt;br /&gt;
      &lt;label for=&quot;gas&quot;&gt;Ile zatankowałeś?&lt;/label&gt;
      &lt;input type=&quot;text&quot; id=&quot;gas&quot; /&gt;
      &lt;input type=&quot;submit&quot; value=&quot;Calc&quot; /&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre><p>Najważniejszą częścią tego pliku jest javascript, który również tworzy obiekt API i poprzez jego metody komunikuje się z pythonem, odpowiedzialna jest za to funkcja eventPost(). Nie jest to zbyt skomplkowane. Jak już ma oba pliki to najlepiej je popchnąć na urządzenie używając adb (rozważam opisanie instalacji i konfiguracji w osobnym poście) poleceniem</p><pre class="brush: bash; title: ; notranslate">
adb push plik.py /sdcard/sl4a/scripts/
adb push plik.html /sdcard/sl4a/scripts/
</pre><p>Po tej operacji SL4A umożliwi odpalenie programu z listy skryptów.<br
/> <a
href="http://mlklich.rootnode.net/wordpress/wp-content/uploads/2011/05/screenshot_12.png"><img
src="http://mlklich.rootnode.net/wordpress/wp-content/uploads/2011/05/screenshot_12.png" alt="" title="Główny ekran" width="320" height="480" class="aligncenter size-full wp-image-1092" /></a><br
/> <a
href="http://mlklich.rootnode.net/wordpress/wp-content/uploads/2011/05/screenshot_10.png"><img
src="http://mlklich.rootnode.net/wordpress/wp-content/uploads/2011/05/screenshot_10.png" alt="" title="Wynik kalkulacji" width="320" height="480" class="aligncenter size-full wp-image-1089" border="1" /></a><br
/> Nie jest to piękne rozwiązanie ale umożliwia to zabawę pythonem, do czasu aż API nie będzie wspierać natywnych okienek lub nie pojawi się PyQT lub PyGTK trzeba będzie tak pisać lub przerzucić się na javę.</p><p><a
href="http://michalklich.com/2011/06/01/py4a-czyli-piszemy-aplikacje-na-androida/">Py4A czyli piszemy aplikację na androida.</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2011/06/01/py4a-czyli-piszemy-aplikacje-na-androida/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Py4A &#8211; Python w Androidzie</title><link>http://michalklich.com/2011/05/25/py4a-python-w-androidzie/</link> <comments>http://michalklich.com/2011/05/25/py4a-python-w-androidzie/#comments</comments> <pubDate>Wed, 25 May 2011 19:04:28 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[android]]></category> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[py4a]]></category> <category><![CDATA[sl4a]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1061</guid> <description><![CDATA[A więc kupiłeś telefon z androidem. Pierwsze dni byłeś ostrożny, tylko instalacja aplikacji i ustawianie telefonu. A potem rootujesz telefon i pierwsze mody. Po paru modach zaczyna się robić nudno trochę bo ile można brać a nic nie dawać w zamian. Znasz pythona i postanawiasz stworzyć coś swojego na telefon. I w tym miejscu przydaje [...]<p><a
href="http://michalklich.com/2011/05/25/py4a-python-w-androidzie/">Py4A &#8211; Python w Androidzie</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>A więc kupiłeś telefon z androidem. Pierwsze dni byłeś ostrożny, tylko instalacja aplikacji i ustawianie telefonu. A potem rootujesz telefon i pierwsze mody. Po paru modach zaczyna się robić nudno trochę bo ile można brać a nic nie dawać w zamian. Znasz pythona i postanawiasz stworzyć coś swojego na telefon. I w tym miejscu przydaje się ten krótki artykuł.<br
/> <span
id="more-1061"></span><br
/> Opiszę tutaj w jaki sposób zainstalować niezbędne programy na telefonie aby można było pisać aplikacje w pythonie. Sprawa jest banalnie prosta. Jedyne co potrzeba to telefon z androidem oraz dostęp do internetu na telefonie (najlepiej poprzez wifi, chyba że masz duże limity u operatora komórkowego) lub komputerze. Wygodniej jest użyć telefonu do pobrania aplikacji, oszczędzisz sobie kopiowania plików poprzez kabel lub bluetooth. Ok, masz wszystko? Zaczynamy.<br
/> <strong>Zanim zaczniesz instalować soft przejdź do ustawień w telefonie, do części odpowiedzialnej za aplikacje i włącz instalację programów z nieznanych źródeł.</strong><br
/> Pierwsze co jest potrzebne to SL4A (Scripting Layer for Android) czyli program który umożliwi odpalanie programów napisanych w pythonie (i nie tylko. Perl, JRuby, Lua, BeanShell, JavaScript, Tcl, oraz shelle. Autorzy planują dodać inne języki.). Otwórz <a
href="http://code.google.com/p/android-scripting/">http://code.google.com/p/android-scripting/</a> w telefonie i kliknij w w kod QR, jest duży i łatwiejszy do trafienia niż linki po lewej stronie. Plik który instalujesz to <em>sl4a_r4.apk</em>. Po instalacji w menu pojawi się SL4A ale po uruchomieniu jest pusty.<br
/> Następny krok to instalacja pythona czyli Py4A (Python for Android). Są dwie możliwości: instalacja ze strony SL4A lub ze strony Py4A gdzie umieszczona jest nowsza wersja. Jeśli wybrałeś pierwszą opcję to po lewej stronie w menu Downloads kliknij na <em>PythonForAndroid_r4.apk</em> i zainstaluj. W drugim wypadku przejdź na <a
href="http://code.google.com/p/python-for-android/">http://code.google.com/p/python-for-android/</a> i analogicznie w sekcji Downloads kliknij na <em>PythonForAndroid_r5.apk</em>.<br
/> Następny krok jest taki sam, niezależnie od wybranej wersji. W menu telefonu znajdź i odpal Python For Android, z pewnością poznasz ikonkę. Na ekranie zobaczysz wersje pythona oraz dodatków które masz zainstalowane. W tej chwili nie powinieneś mieć żadnych numerów więc trzeba wcisnąć Install i poczekać aż aplikacja pobierze i rozpakuje wszystko. Po tej operacji w SL4A w menu Scripts będą widoczne przykładowe skrypty pythonowe. Polecam odpalić parę, klikając na wybranym i wybierając ikonę terminala a następnie obejrzeć kod wybierając ikonę ołówka.<br
/> To wszystko, w następnych artykułach postaram opisać jak napisać aplikację a także jak zbudować paczkę apk. Dla niecierpliwych parę stron lektury: <a
href="http://code.google.com/p/android-scripting/wiki/AndroidFacadeAPI">opis API</a> oraz <a
href="http://code.google.com/p/android-scripting/wiki/ApiReference">lista metod API</a>.</p><p><a
href="http://michalklich.com/2011/05/25/py4a-python-w-androidzie/">Py4A &#8211; Python w Androidzie</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2011/05/25/py4a-python-w-androidzie/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Fedora 15</title><link>http://michalklich.com/2011/05/24/fedora-15/</link> <comments>http://michalklich.com/2011/05/24/fedora-15/#comments</comments> <pubDate>Tue, 24 May 2011 18:00:25 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[fedora]]></category> <category><![CDATA[f15]]></category> <category><![CDATA[fedora 15]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1057</guid> <description><![CDATA[Dzisiaj premiera wydania numer 15 o nazwie Lovelock. Niecierpliwi (w tym ja) mają już zainstalowany system od paru tygodni. Poniżej lista niektórych rzeczy uwzględnionych w nowej wersji: Gnome 3 rpm 4.9 systemd gdb 7.3 gcc 4.6 Fedorą można pobrać stąd, mam taką nadzieję, że link nadal będzie działał pomimo iż publikuję go przed wydaniem to [...]<p><a
href="http://michalklich.com/2011/05/24/fedora-15/">Fedora 15</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Dzisiaj premiera wydania numer 15 o nazwie Lovelock. Niecierpliwi (w tym ja) mają już zainstalowany system od paru tygodni. Poniżej lista niektórych rzeczy uwzględnionych w nowej wersji:</p><ul><li>Gnome 3</li><li>rpm 4.9</li><li>systemd</li><li>gdb 7.3</li><li>gcc 4.6</li></ul><p>Fedorą można pobrać <a
href="http://fedoraproject.org/pl/get-fedora-options">stąd</a>, mam taką nadzieję, że link nadal będzie działał pomimo iż publikuję go przed wydaniem to nie powinien się zmienić.</p><p><a
href="http://michalklich.com/2011/05/24/fedora-15/">Fedora 15</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2011/05/24/fedora-15/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Przedszkole w edytorze</title><link>http://michalklich.com/2011/05/02/przedszkole-w-edytorze/</link> <comments>http://michalklich.com/2011/05/02/przedszkole-w-edytorze/#comments</comments> <pubDate>Mon, 02 May 2011 09:16:39 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[formatowanie]]></category> <category><![CDATA[pep8]]></category> <category><![CDATA[pylint]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1030</guid> <description><![CDATA[Formatowanie kodu jest ważne. To jest fakt. Ostatnio zetknąłem się z ciekawymi próbami sprawienia aby kod był bardziej czytelny, niestety nie udało mi się opisać tego przed moim znajomym. Polecam lekturę pod którą podpisuję się obiema rękami. Ze swojej strony pragnę dodać tylko bardzo &#8222;ciekawy&#8221; sposób definiowania zmiennych albo słowników. Za pewne można użyć go [...]<p><a
href="http://michalklich.com/2011/05/02/przedszkole-w-edytorze/">Przedszkole w edytorze</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Formatowanie kodu jest ważne. To jest fakt. Ostatnio zetknąłem się z ciekawymi próbami sprawienia aby kod był bardziej czytelny, niestety nie udało mi się opisać tego przed <a
href="http://rdobosz.blogspot.com/2011/04/dlaczego-ludzie-formatuja-kod.html">moim znajomym</a>. Polecam lekturę pod którą podpisuję się obiema rękami. Ze swojej strony pragnę dodać tylko bardzo &#8222;ciekawy&#8221; sposób definiowania zmiennych albo słowników. Za pewne można użyć go w innych przypadkach ale nie mam zamiaru marnować czasu na wymyślanie takich bzdur.<br
/> <span
id="more-1031"></span><br
/> Jeśli piszesz w taki sposób to robisz to źle.</p><pre class="brush: python; title: ; notranslate">
pierwsza_zmienna_od_długiej_nazwie                = 1
druga                                             = 2
trzecia_zmienna                                   = 3
czwarta_zmienna_o_długiej_nazwie_i_jeszcze_trochę = 4
</pre><p>Piękne, prawda? Ostatnią dodałem specjalnie najdłuższą aby pokazać bzdurność takiej konstrukcji. Po jej dodaniu musiałem przesunąć inne znaki przypisania w zmiennych wpisanych wcześniej!! Cóż za prostota rozwiązania.</p><pre class="brush: python; title: ; notranslate">
dict = {
'pierwsza'                                          : 1,
'druga'                                             : 2,
'trzecia_zmienna'                                   : 3,
'czwarta_zmienna_o_długiej_nazwie_i_jeszcze_trochę' : 4
}
</pre><p>Kolejny cudowny przykład.<br
/> Uważam to za błąd w każdym języku ponieważ to zaciemnia tylko kod i wymusza liczenie spacji a potem przerabianie całej konstrukcji w wypadku gdy dodaje się zmienną o dłuższej nazwie. Taka metoda musi być popularna wśród szachistów gdzie ruchy należy planować odpowiednio przed.<br
/> Proszę nie piszcie tak. Szachiści również.</p><p><a
href="http://michalklich.com/2011/05/02/przedszkole-w-edytorze/">Przedszkole w edytorze</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2011/05/02/przedszkole-w-edytorze/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>devs y u no pep8 in Emacs</title><link>http://michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/</link> <comments>http://michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/#comments</comments> <pubDate>Wed, 16 Feb 2011 20:19:15 +0000</pubDate> <dc:creator>Michał Klich</dc:creator> <category><![CDATA[emacs]]></category> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[pep8]]></category> <category><![CDATA[pyflakes]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1004</guid> <description><![CDATA[Tytuł dosyć niezrozumiały ale w luźnym tłumaczeniu jest to pytanie &#8222;dlaczego nie używasz pep8 w Emacsie?&#8221;. Czym jest pep8? Jest to lista zaleceń odnośnie stylu kodowania. Tak, zgadza się, są to zalecenia więc nie są przymusowe ale na tyle logiczne oraz przemyślane, że warto je stosować. W końcu standaryzacja to nie jest nic złego jeśli [...]<p><a
href="http://michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/">devs y u no pep8 in Emacs</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></description> <content:encoded><![CDATA[<p>Tytuł dosyć niezrozumiały ale w luźnym tłumaczeniu jest to pytanie &#8222;dlaczego nie używasz pep8 w Emacsie?&#8221;. Czym jest pep8? Jest to <a
href="http://www.python.org/dev/peps/pep-0008/">lista zaleceń</a> odnośnie stylu kodowania. Tak, zgadza się, są to zalecenia więc nie są przymusowe ale na tyle logiczne oraz przemyślane, że warto je stosować. W końcu standaryzacja to nie jest nic złego jeśli jest stosowana z umiarem oraz w odpowiednim miejscu. Jeśli interesuje Cię implementacja sprawdzania składni pod kątem pep8 w locie w Emacsie to czytaj dalej.<span
id="more-1004"></span><br
/> Wpis ten nie powstałby gdybym nie zmobilizował się lub nie został zmobilizowany do ustawienia sobie emacsa pod pep8. Aby ułatwić innym (oraz sobie bo mam tendencję do zapominania, potem sięgam do swojego bloga i voila) opiszę co trzeba zrobić aby cieszyć się pięknym kodem. Dla ludzi którzy wolą jednak nabywać wiedzę w tradycyjny sposób i reguły stosować klasycznie polecam <a
href="wwd.ca/stuff/pep8_cheat.pdf">ściągawkę</a> do wydrukowania. Przejdę do rzeczy. Potrzebujesz Emacsa a do niego pep8, pyflakes oraz flymake-cursor (to modyfikacja aby informacja o błędzie pojawiała się w minibuforze). Narzędzia pep8 oraz pyflakes łatwo zainstalować przy użyciu pipy.</p><pre class="brush: bash; title: ; notranslate">pip install pep8 pyflakes</pre><p>Natomiast <a
href="http://richardriley.net/projects/emacs/dotprogramming#sec-1.5.4">flymake-cursor</a> już trzeba ręcznie skopiować i zapisać jako flymake-cursor.el na ścieżce z plikami el. Ja zapisałem w /usr/share/emacs/site-lisp. Kolejny krok to modyfikacja pliku konfiguracyjnego .emacs. Należy dokleić do niego poniższy kod.</p><pre class="brush: plain; title: ; notranslate">(add-hook 'find-file-hook 'flymake-find-file-hook)
(when (load &quot;flymake&quot; t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
               'flymake-create-temp-inplace))
       (local-file (file-relative-name
            temp-file
            (file-name-directory buffer-file-name))))
      (list &quot;pycheckers&quot;  (list local-file))))
   (add-to-list 'flymake-allowed-file-name-masks
             '(&quot;\.py\'&quot; flymake-pyflakes-init)))
(load-library &quot;flymake-cursor&quot;)
(global-set-key [f10] 'flymake-goto-prev-error)
(global-set-key [f11] 'flymake-goto-next-error)</pre><p>Ostatni krok to stworzyć plik o nazwie pycheckers gdzieś w PATH oraz ustawić go jako wykonywalny. W tym miejscu można skonfigurować sobie pep8, przydatne gdy wcięcia kodu nie są wielokrotnością 4.</p><pre class="brush: bash; title: ; notranslate">#!/bin/bash

pyflakes &quot;$1&quot;
pep8 --ignore=E221,E701,E202 --repeat &quot;$1&quot;
true</pre><p>Tyle wystarczy, pozostaje restart Emacsa lub M-x eval-buffer w otwartym buforze z plikiem .emacs i już można korzystać.<br
/> Całość to właściwie opis ze strony <a
href="http://www.saltycrane.com/blog/2010/05/my-emacs-python-environment/">http://www.saltycrane.com/blog/2010/05/my-emacs-python-environment/</a> i polecam zajrzeć do źródła gdzie można znaleźć parę innych smaczków do emacsa.</p><p><a
href="http://michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/">devs y u no pep8 in Emacs</a> is a post from: <a
href="http://michalklich.com">FLLOG</a></p> ]]></content:encoded> <wfw:commentRss>http://michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
<!-- Served from: michalklich.com @ 2012-05-19 07:28:42 by W3 Total Cache -->
