1/12/2014

How you can use watchdog to improve your productivity.

Watchdog is a python API and shell utilities to monitor file system events.

I am using it for tasks like build sphinx docs or run tests after changes in file/directory. It's very easy to use.

For instance, you are writing documentation and after each saving file you have to run command like "make html". So, why you don't this automatically?
 
Simple command:
watchmedo shell-command --command="make html" --wait source
What does it? Watchdog began to watch source directory. If something in this directory will be changed, then watchdog will run your command (make html). Simply, right?

If you use Firefox you can install Auto Reload add-on. Auto Reload automatically reloads matching tabs when selected local files change. So, after saving file, your documentation will build automatically and Firefox automatically will refresh tab with documentation in browser, brilliant!

You can also use patterns. For example, you want to run tests after saving file:
watchmedo shell-command --wait --patterns="*.py" \
--command='py.test "${watch_src_path}"' \
--recursive your_project/tests/

# or shorter version
watchmedo shell-command --w -p="*.py" \
-c='py.test "${watch_src_path}"' -R your_project/tests/ 
You will find documentation here. I hope this post will be useful ;)

Hello everyone!

From today I am going to write blog in English and also I will write more posts.

10/06/2013

Rzadko wykorzystywane typy danych

Wstęp

Przy codziennej pracy z pythonem często korzystasz z takich typów danych jak słownik, lista, krotka czy zbiór. Ale warto pamiętać, że istnieją również inne typy danych, które często mogą Ci się przydać, a o których niekoniecznie słyszałeś. Przedstawię kilka z nich, które moim zdaniem są warte uwagi.

Counter

Typ ten przydaje się wtedy gdy chcesz np. sprawdzić ile razy występuje dany obiekt w zbiorze i dodatkowo chcesz to trzymać jako słownik. Przykład:


deque

Obiekt deque idealnie nadaje się do stosu lub kolejki. Dodawanie oraz pobieranie elementu jest zbliżone do O(1); nie ważne czy pobierasz z końca czy z początku. Jeżeli jednak chcesz dostać się do elementów po indeksach lepiej jest skorzystać z listy, która jest do tego przystosowana, więc siłą rzeczy jest szybsza. Poniżej, krótkie porównanie:


defaultdict

defaultdict przydaje się tam, gdzie chcesz stworzyć słownik w którym przy dostępie ma już mieć zdefiniowaną domyślną wartość. Zamiast martwić się sprawdzaniem czy czasem dany klucz ma zdefiniowaną wartość, sam ustawiasz jaki to ma być typ.


namedtuple

Ten typ danych jest często wykorzystywany przy pobieraniu danych z bazy lub np. z pliku csv. Ja napisałem prosty przykład jak szybko przemienić otrzymanego JSON'a w namedtuple i mieć dostęp do wartości nie po kluczu, a po atrybucie.

heapq

heapq przyda się wtedy, gdy chcesz stworzyć kopiec (kolejka priorytetowa). Przykład użycia:


bisect

Wykorzystanie modułu bisect nadaje się wtedy, gdy masz wystarczająco dużą listę, w której sortowanie jej za każdym razem nie wchodzi w grę, ale w jakiś sposób chcesz otrzymać wartość, która znajdowała by się pod indeksem 42, gdyby lista była posortowana. Prosty przykład wraz z porównaniem:

9/28/2013

Pylibmc, ultramemcache i python-memcached

Wstęp

W ubiegłym roku pisałem o ultrajsonie, który wypadł bardzo dobrze. Przedwczoraj natrafiłem na bibliotekę ultramemcache, którą również postanowiłem przetestować i sprawdzić czy jest ultra.

Do porównania wykorzystam biblioteki python-memcached oraz pylibmc. Pierwszy test odbył się standardowo poprzez odpalenie jednego procesu. Drugi natomiast z wykorzystaniem czterech procesów co znacznie przyspieszyło działanie.

Jeden proces:


python-memcached


ultramemcache


pylibmc


Cztery procesy:


python-memcached


ultramemcache


pylibmc


Wyniki

Testy wykonałem kilka razy dla każdego ze skryptów i wybrałem najlepsze wyniki dla danej biblioteki.

Był to bardzo prosty test, ale da się zauważyć spore różnice w szybkości działania tych bibliotek. W przypadku jednego procesu ultramemcache poradził sobie najlepiej, chociaż pylibmc jest tuż tuż... Jeżeli chodzi o cztery procesy to pylibmc jest zdecydowanym zwycięzcą.

Zachęcam do robienia swoich testów. Do sporządzenia wykresu skorzystałem z infogr.am. Jedno z lepszych narzędzi do sporządzania infografik z jakich korzystałem.

Update: dodałem testy dla pylibmc.

8/14/2013

Dodiff

Ostatnio często muszę robić diffy w gicie i zapisywać je do plików. Przykładowa nazwa pliku z diffem wygląda tak: {branch}-{branch/commit}.diff

Diffy pomiędzy poszczególnymi commitami nie są mi potrzebne. Aby otrzymać takiego diffa można wykonać komendę git diff {branch/commit} > ~/diffs/{branch}-{branch/commit}.diff.
Przykłady:
git diff develop > ~/diffs/develop-master.diff
git diff 66666 > ~/diffs/66666-develop.diff
git diff 18361 > ~/diffs/18361-develop.diff
git diff 47529 > ~/diffs/47529-0dbf4fa.diff
Jak widać jest trochę pisania.
  •  po co za każdym razem wpisywać katalog w którym ma zostać stworzony plik
  • po co podawać nazwę brancha na której właśnie jesteś (i to dwa razy!) ;)
  • pracuj na gałęziach, których nazwy składają się wyłącznie z cyfr to oczopląsu dostaniesz po kilkunastu takich komendach
Dlatego też postanowiłem napisać do tego prostą funkcję w bashu. Założenie było proste, mam podać nazwę funkcji i jako pierwszy parametr przekazać nazwę brancha/commita między którym chcę zobaczyć różnice.

Skrypt ma sam sprawdzić czy jest już katalog diffs w moim katalogu użytkownika, jak nie ma, to niech go tworzy i dodatkowo, niech sam pobiera informację na temat nazwy brancha na którym aktualnie jestem.

Tak powstała funkcja dodiff (ja ją wrzuciłem standardowo do ~/.bash_aliases):
dodiff() {
    if [ ! -d ~/diffs ]; then
        mkdir -p ~/diffs
    fi

    branch=`git rev-parse --abbrev-ref HEAD`
    git diff $1 > ~/diffs/$branch-$1.diff
}
Przykład użycia: showterm.

8/04/2013

bumpversion

bumpversion to ciekawa paczka do automatycznego podbijania wersji twojej paczki ;).

(screencast)

 Jedną komendą jesteś w stanie podbić wersję w swojej paczce w kilku miejscach (oczywiście, najlepiej informację o wersji trzymać w jednym miejscu, ale czasami jesteś zmuszony, aby zrobić to w kilku plikach).

Przykładowo, twoja aktualna wersja to 0.1.10, zrobiłeś małego fixa i chcesz podbić wersję do 0.1.11. Dodatkowo informacje na temat wersji trzymasz w pliku setup.py oraz w random_words/__init__.py. Zapomniałem dodać; jak chcesz to zajrzyj do paczki RandomWords, bo to na niej jest przykład.

Teraz wystarczy odpalić:
bumpversion --current-version 0.1.10 patch setup.py random_words/__init__.py
i gotowe. Skrypt podbił wersję w pliku setup.py oraz w random_words/__init__.py


Dokumentację i więcej przykładów użycia znajdziesz na githubie.

P.S. Screena musiałem zrobić lokówką bo ubuntu odmówiło przed chwilą posłuszeństwa, a nie chce mi się resetować systemu.

5/25/2013

Travis CI oraz PyPI badges

Jeżeli korzystasz z Travis-CI do testowania swojego repozytorium na githubie oraz trzymasz paczkę na pypi, możesz w łatwy i prosty sposób dodać informacje na temat statusu do pliku README. Dzięki temu userzy będą widzieć czy wszystkie testy przeszły pomyślnie, jaka jest aktualna wersja paczki oraz jaka jest ilość ściągnięć. U mnie dla repo RandomWords wygląda to tak:

Travis-CI

W dokumentacji travis-ci znajdziesz informacje o tym co musisz umiejscowić w odpowiednim pliku.

PyPI

Osobiście korzystam z dwóch formatów. Markdown dla github oraz reStructuredText dla PyPI.

Markdown:
[![PyPi version](https://pypip.in/v/$REPO-NAME/badge.png)](https://crate.io/packages/$REPO-NAME/)
[![PyPi downloads](https://pypip.in/d/$REPO-NAME/badge.png)](https://crate.io/packages/$REPO-NAME/)
reStructuredText:
.. image:: https://pypip.in/v/$REPO-NAME/badge.png
    :target: https://crate.io/packages/$REPO-NAME/
    :alt: Latest PyPI version

.. image:: https://pypip.in/d/$REPO-NAME/badge.png
    :target: https://crate.io/packages/$REPO-NAME/
    :alt: Number of PyPI downloads
Przykład dla markdown znajdziesz tutaj, a dla reStructuredText tutaj. Zachęcam do używania.