Map na procesach (0)

Z braku lepszego zajęcia, napisałem funkcję map działającą na procesach

import time
import itertools

# python 2.4
from processing import Queue, Process

def procmap(target, args, proc_nr):
    """Processes powered map function

    Acts like build-in `map` function, but result is in random order.
    """
    def _sub_procmap(target, args, resultbox):
        resultbox.put(map(target, args))
    step = len(args) / proc_nr
    q = Queue()
    processes = []
    for i in xrange(proc_nr):
        arg = itertools.islice(args, i * step, i * step + step)
        p = Process(target=_sub_procmap, args=[target, arg, q])
        processes.append(p)
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    result = []
    while not q.empty():
        result.extend(q.get())
    return result

def _test():
    _test1()
    _test2()
    _test3()

def _test1():
    def double(value):
        return value * 2 ...
Vim Recipes (0)

Kolejna książka o Vim - Vim Recipes. Dostępna między innymi jako PDF i HTML. Źródła przeglądać można na github.

Całej jeszcze nie przejrzałem, ale wygląda obiecująco.

Galeria zdjęć w ruby (0)

Pół dnia szukania, pisania, testowania i poprawiania, aż w końcu napisałem coś takiego: http://github.com/husio/sinatra-datamapper-erb-FUCK-. Posklejałem parę komponentów - między innymi sinatra, datamapper, erb - i powstała prosta galeria zdjęć.

Nie ma w tym kodzie nic wartego uwagi, możliwości jakie daje też lepiej przemilczeć. Ale działa i z tego jestem dumny, bo zajęło mi to o wiele więcej niż powinno.

Jeśli chodzi o ruby, moje umiejętności wyszukiwania dokumentacji, dobrych przykładów użycia bibliotek i pisania kodu bliskie są zera. Na szczęście nie zanosi się na to żebym w najbliższym czasie ponownie musiał się tym martwić.

virtualevn i hg vs git (6)

Virtualenv

Ponieważ lubię testować różne, często mało popularne Pythonowe biblioteki, zazwyczaj zamiast domyślnego menadżera pakietów używam easy_install lub pip. Nie zawsze pamiętam o usuwaniu niepotrzebnych pakietów, do tego dochodzą zależności i powoli robi się w systemie syf. Sytuację ratuje jednak virtualenv, który pozwala szybko zbudować piaskownicę.

Ponieważ na zaliczenie mam napisać grę sieciową, jako główny język wybrałem Pythona. Z racji tego, że na docelowym komputerze nie ma ani twisted ani pyglet, zbudowałem własne środowisko w którym rozwijam projekt.

piotrek@archbook# mkdir pysandbox
piotrek@archbook# cd pysandbox
piotrek@archbook# virtualenv .
New python executable in ./bin/python
Installing setuptools............done.
piotrek@archbook# source bin/activate
(pysandbox)piotrek@archbook# easy_install twisted
...
(pysandbox)piotrek@archbook# easy_install pyglet
...

Hg vs Git

Jakiś czas temu google ...

GitHub Issue Tracker (1)

Miesiąc temu poszukiwałem bugtrackera, co dziś rano oficjalnie dobiegło końca. Jak przystało na serwis który dba o swoich użytkowników, github dodał do swoich usług system ticketów. Hurra!

memoize (0)

Mijające właśnie parę dni wolnego pierwotnie postanowiłem wykorzystać na naukę nowego języka programowania. Zawsze intrygował mnie erlang mimo to wybrałem OCaml. Ciągle jednak myślałem o czymś całkiem innym i dlatego ostatecznie wróciłem do problemu który cały czas staram się rozwiązać.

Dużo czasu poświęciłem na wymyślenie jak napisać łatwy w użyciu dekorator działający jako memoize. Dekorator był początkowo bardzo prymitywny, a skończyło się na odbudowywaniu listy argumentów z jakimi wywoływana jest pierwotna funkcja. Problem wydaje się prosty, a w rzeczywistości nie udało mi się go rozwiązać bez sięgania w język głębiej niż chyba powinno się to robić.

Aby efektywnie wykorzystywać zapamiętane wartości, trzeba znać wynik wywołania funkcji bez jej wywoływania. Zakładając, że dla tego samego zestawu argumentów zwracany jest zawsze ten ...

Funkcje boolowskie w Pythonie (1)

Czytając kod trafiłem dziś na dość ciekawą konstrukcję. Efektem było utworzenie słownika, którego wartości zależne były od paru zmiennych

>>> a = 5
>>> b = False
>>> c = "Hello world!"
>>> { "key": a or b and c }
{'key': 5}
>>> { "key": a and b or c }
{'key': 'Hello world!'}
>>> data = [
... "hello world" and True and "first",
... [] and False and "second",
... False or "third"]
>>> data
['first', [], 'third']
>>> True and "bla" and "something"
'something'
>>> "something" and [] and "something more"
[]
>>> False and [] and "something more"
False
>>> () and [] and "something more"
()
>>> "foo" and "bar"
'bar'
>>> "foo" or "bar"
'foo'

Niby proste operacje boolowskie, ale pozwalają zaoszczędzić wielu linijek z if/else

Debugowanie w Pythonie (1)

Każdy o tym wie, wszyscy o tym mówią, ale nikt tego nie robi. Testy, należy pisać testy. Fajnie, jeśli program dodatkowo zapisuje gdzieś ważne w późniejszej analizie działania dane.

Ponieważ ostatnie tygodnie spędzam głównie na debugowaniu dużej aplikacji napisanej w Django, odkryłem lub dopiero doceniłem narzędzia które chyba każdy powinien znać:

  • ipython czyli 'interaktywniejsza' powłoka Pythona

  • pdb i ipdb, czyli interaktywne debugowanie kodu.

  • nose testy i nose-django

  • Grepowanie wszystkich plików w drzewie katalogów: find . -name "*" | xargs grep -i bla, lub jeszcze wygodniej - plugin do Vim

  • Vim NERD tree

  • Odpowiednio skonfigurowane Z Shell to sposób na jeszcze efektywniejszą pracę w konsoli.

  • mpd i ncmpc ;)

Na koniec link - debugowanie kodu w Django - stary, ale wciąż aktualny opis narzędzi przydatnych przy debugowaniu aplikacji ...

Menadżer sesji Vim (0)

Vim używam od ładnych paru lat, ale dopiero od niedawna zacząłem używać go jak IDE. Mnóstwo otwartych zakładek, większość z nich dodatkowo podzielona. W pogotowiu czeka NERDTree i taglist. Krótko mówiąc całe mnóstwo otwartych buforów. Przychodzi jednak koniec dnia, albo Vim umrze w niewyjaśnionych okolicznościach i na nowo muszę wszystko otwierać. Na szczęście istnieją sesje i dzięki :mksession w prosty sposób można zrzucić to wszystko do pliku. Żeby było jeszcze fajniej, napisałem plugin udostępniający prosty interfejs. Instalacja jest banalna - wystarczy zapisać plik w ~/.vim/plugins/, utworzyć katalog ~/.vim_sessions/. Do ~/.vimrc najlepiej dodać skrót:

nmap <F12>  :call SessionManagerToggle()<CR>

A to któtki pokaz możliwości:

:!mkdir testdir
:cd testdir
--> wprowadź jakiś tekst
:w foo1
C^w s
C^w C^w
:e ...
Wstęp do web.py III - przechowywanie danych (0)

W poprzednich wpisach - wstęp do web.py oraz wstęp do web.py II - szablony - pokazałem parę przykładów jak napisać prostą stronę w Pythonie z wykorzystaniem bibliotek webpy oraz jinja2. Tym razem postaram się przybliżyć temat składowania danych, ponieważ jest to integralna część prawie każdej strony internetowej.

Rozbicie aplikacji na pliki

Ponieważ aplikacja jest już dość spora, postanowiłem ją podzielić (powraca temat MVC) i umieściłem na github. Tutaj wklejał będę jedynie najważniejsze fragmenty kodu.

Większość aplikacji www jakie pisałem powstały w Django, dlatego na pewno da się zauważyć podobieństwo chociażby nazw plików.

Przepisałem ostatni przykład z poprzedniego wpisu i teraz układ plików wygląda następująco:

.
    server.py       # python server.py aby uruchomić aplikacje
    settings.py     # wszystkie globalne ustawienia aplikacji
    templates       # katalog szablonow ...
Wstęp do web.py II - szablony (1)

W poprzednim wpisie - wstęp do web.py - opisałem najprostsze przykłady dynamicznie generowanej strony www z wykorzystaniem biblioteki web.py. W tym wpisie postaram się przybliżyć jeden z wielu sposobów generowania treści, czyli szablony oraz bibliotekę jinja 2.

Instalacja

Pakiet powinien być dostępny w większości dystrybucji Linuksa, w przypadku Arch Linuksa znaleźć go można w AUR:

$ aursh Ss jinja
1  python-jinja 
2  python-jinja2

Choć nie jest to mój ulubiony sposób instalacji, użyć można easy_install:

$ easy_install Jinja2

Więcej o instalacji przeczytać można w dokumentacji projektu

Szablony

Zastanawiać się możesz, dlaczego w ogóle używać szablonów? Przecież w przypadku generowania dokumentów HTML można podobnie jak na przykład w PHP łączyć kod Pythona z tagami HTML, więc po co? Odpowiedź jest bardzo prosta: dlatego, że ...

Vala 0.5.7 (1)

Kiedyś przy okazji pisania prostej aplikacji wspominałem już czym jest Vala. 20 lutego wyszła kolejna wersja kompilatora tego języka oznaczona numerem 0.5.7. Najważniejsze jest jednak to, że zgodnie z planami, wersja 1.0 powinna się pojawić w najbliższych miesiącach.

Dlaczego wersja 1.0 jest taka ważna? Ponieważ gdy zostanie wydana, prawdopodobnie większa niż do tej pory ilość programistów zacznie pisać nowe aplikacje w Vala zamiast w C. Oczywiście nie jest to obecnie takie proste, bo ilość bibliotek jest jeszcze bardzo niewielka. Mam jednak nadzieję, że z czasem wszystko się zmieni i pojawi się między innymi binding do GNet. Trzeba tylko poczekać na większe zainteresowanie językiem i osoby chętne do pisania bindingów popularnych bibliotek.

Dlaczego zamiast czekać na kompilator ...

« 3 2 /7 1 »