12/25/2012

Ultra szybki JSON, czyli ujson

Kilkanaście godzin temu natknąłem się na moduł ujson, który jest napisany w czystym C i może pochwalić się niebywałą szybkością :) Mimo, iż na stronie modułu są przedstawione testy z trzema innymi popularnymi modułami, sam również postanowiłem to sprawdzić.

Moduł ujson porównałem ze standardowym modułem w pythonie, czyli json.

Dane testowe

Pierwsze dane to obiekt, z którym możemy się najczęściej spotkać przy codziennej pracy z różnego rodzaju api, natomiast do drugich danych wpisałem po prostu to co przyszło mi do głowy ;)
test_data1 = {'status': True, 'msg': 'Message'}
test_data2 = [{'name': 'tomislater', 'age': 24, 'sex': 'male'}, 8461, True, False, 8923, 7162, 1, 6, 7, None, [[True, False], ['!', '?']], 'yeah']

Serializacja do formatu JSON

Do porównania obu bibliotek stworzyłem cztery funkcję. Po dwie do każdej.
def test_json_data1():
    return json.dumps(test_data1)

def test_ujson_data1():
    return ujson.dumps(test_data1)

def test_json_data2():
    return json.dumps(test_data2)

def test_ujson_data2():
    return ujson.dumps(test_data2)
Do mierzenia czasu skorzystałem z modułu timeit ze standardowej biblioteki pythona. Każda funkcja została wywołana milion razy:
json_data1 = timeit.timeit("test_json_data1()", setup="from __main__ import test_json_data1", number=1000000)

ujson_data1 = timeit.timeit("test_ujson_data1()", setup="from __main__ import test_ujson_data1", number=1000000)

json_data2 = timeit.timeit("test_json_data2()", setup="from __main__ import test_json_data2", number=1000000)

ujson_data2 = timeit.timeit("test_ujson_data2()", setup="from __main__ import test_ujson_data2", number=1000000)

Wyniki testów dla serializacji do formatu JSON:

Jak widać, jeżeli chodzi o serializację obiektów, moduł ujson jest o wiele szybszy od standardowego modułu.

Deserializacja z formatu JSON

Sprawdźmy teraz jak oba modły radzą sobie z deserializacją:
test_data1 = '{"status": true, "msg": "Message"}'
test_data2 = '[{"age": 24, "name": "tomislater", "sex": "male"}, 8461, true, false, 8923, 7162, 1, 6, 7, null, [[true, false], ["!", "?"]], "yeah"]'

def test_json_data1():
    return json.loads(test_data1)

def test_ujson_data1():
    return ujson.loads(test_data1)

def test_json_data2():
    return json.loads(test_data2)

def test_ujson_data2():
    return ujson.loads(test_data2)

json_data1 = timeit.timeit("test_json_data1()", setup="from __main__ import test_json_data1", number=1000000)
ujson_data1 = timeit.timeit("test_ujson_data1()", setup="from __main__ import test_ujson_data1", number=1000000)
json_data2 = timeit.timeit("test_json_data2()", setup="from __main__ import test_json_data2", number=1000000)
ujson_data2 = timeit.timeit("test_ujson_data2()", setup="from __main__ import test_ujson_data2", number=1000000)
Wyniki testów dla deserializacji z formatu JSON:

Jak widać twórcy nie kłamią, moduł ten jest naprawdę szybki! Należy jednak pamiętać, że testy to jedno, a praktyka to drugie, dlatego też w najbliższym czasie skorzystam z ów modułu i postaram się podzielić obserwacjami.

Wesołych świąt!

12/22/2012

Anki nie odtwarza plików wav

Ostatnio wraz ze zmianą laptopa zmieniłem również system operacyjny z Fedory na Ubuntu. Po zainstalowaniu Anki i zaimportowaniu swojego profilu mogłem zacząć naukę. Przeleciałem kilka decków, wszystko fajnie działa, odtwarza pliki mp3, pokazuje obrazki etc. Lecz na jednym z decków za cholerę nie chciał odtworzyć plików wav.

Info przykładowego pliku:
PerfectP(100).wav
Codec: MPEG 1 Audio, Layer 3 (MP3)
Channels: Mono
Sample rate: 44100 Hz
Bitrate: 63 kbps

No dobra, pewnie nie mam potrzebnych kodeków. Poinstalowałem co trzeba, nadal nic... Co ciekawe w każdym programie do odtwarzania muzyki, pliki te działały. Czyli kodeki mam, to nie ich wina.

To spróbuję dowiedzieć się coś o tym pliku przez soxa:
>> soxi PerfectP\ \(100\).wav
soxi FAIL formats: can't open input file `PerfectP (100).wav': WAV file encoding `MP3' is not supported

Acha. Ciekawie się zaczyna. To może uda mi się go odtworzyć, próbuję:
>> play PerfectP\ \(100\).wav
play FAIL formats: can't open input file `PerfectP (100).wav': WAV file encoding `MP3' is not supported

To samo. W sumie to się tego spodziewałem. Czyli co? MP3 is not supperted. Jak nie, jak specjalnie skompilowałem wcześniej soxa, aby wspierał prawie każdy format audio... Coś tutaj jest nie tak. Zabieram się za grzebanie w kodzie Anki. Od razu otworzyłem plik sound.py w katalogu /usr/share/anki/libanki/anki/.

Okej, czyli Anki korzysta z mplayera. To spróbujemy otworzyć plik za pomocą mplayera:
>> mplayer PerfectP\ \(100\).wav 
MPlayer svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing PerfectP (100).wav.
libavformat version 53.21.0 (external)
Mismatching header version 53.19.0
Audio only file format detected.
Load subtitles in ./
==========================================================================
Requested audio codec family [mpg123] (afm=mpg123) not available.
Enable it at compilation.
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
libavcodec version 53.35.0 (external)
Mismatching header version 53.32.2
[mp3float @ 0x7f53bd067380]Header missing
[mp3float @ 0x7f53bd067380]Header missing
Unknown/missing audio format -> no sound
ADecoder init failed :(
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
Unknown/missing audio format -> no sound
ADecoder init failed :(
Requested audio codec family [mad] (afm=libmad) not available.
Enable it at compilation.
Requested audio codec family [mp3acm] (afm=acm) not available.
Enable it at compilation.
Opening audio decoder: [hwmpa] MPEG audio pass-through (fake decoder)
Cannot sync MPA frame: 0
ADecoder init failed :(
ADecoder init failed :(
Opening audio decoder: [spdif] libavformat/spdifenc audio pass-through decoder.
AUDIO: 48000 Hz, 2 ch, mpeg2, 768.0 kbit/50.00% (ratio: 96000->192000)
Selected audio codec: [spdifmpa] afm: spdif (libavformat/spdifenc MPEG AUDIO BC pass-through decoder)
==========================================================================
AO: [pulse] 48000Hz 2ch s16le (2 bytes per sample)
[format] Sample format big-endian MPEG-2 not yet supported 
[libaf] Reinitialization did not work, audio filter 'format' returned error code -2
[libaf] Unable to setup filter system can not meet sound-card demands, please send a bug report. 
Couldn't find matching filter/ao format!
Audio: no sound
Video: no video


Exiting... (End of file)

No tak, czyli o co chodzi w końcu? Zaczęło się szperanie po necie i szukanie rozwiązania. Po przestudiowaniu  man-sox znalazłem coś takiego:
-t, --type file-type 
Gives the type of the audio file. This is useful when the file extension is non-standard or when the type can not be determined by looking at the header of the file. The -t option can also be used to override the type implied by an input filename extension, but if overriding with a type that has a header, SoX will exit with an appropriate error message if such a header is not actually present.

O, to spróbuję tego!
>> play -t mp3 PerfectP\ \(100\).wav 
play WARN mp3-util: MAD lost sync

PerfectP (100).wav:

 File Size: 9.26k     Bit Rate: 64.0k
  Encoding: MPEG audio    
  Channels: 1 @ 16-bit   
Samplerate: 44100Hz      
Replaygain: off         
  Duration: 00:00:01.16  

In:94.7% 00:00:01.10 [00:00:00.06] Out:48.4k [      |      ] Hd:4.4 Clip:0    
Done.

Działa! No dobra, to teraz trzeba zmusić mplayera, aby wymuszał najpierw mp3, a potem całą resztę i powinno zadziałać ;)
>> mplayer -ac mp3 PerfectP\ \(100\).wav 
MPlayer svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing mp3.
File not found: 'mp3'
Failed to open mp3.


Playing PerfectP (100).wav.
libavformat version 53.21.0 (external)
Mismatching header version 53.19.0
Audio only file format detected.
Load subtitles in ./
==========================================================================
Forced audio codec: mp3
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 44100 Hz, 2 ch, s16le, 64.0 kbit/4.54% (ratio: 8000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   0.9 (00.8) of 1.0 (01.0)  0.2% 


Exiting... (End of file)

Yeah! Teraz wystarczy pogrzebać kodzie Anki i dodać komendę -ac mp3. Otwieram plik /usr/share/anki/libanki/anki/sound.py (w najnowszej wersji: /usr/share/anki/anki/sounds.py), przechodzę do linii numer 72 i rozszerzam listę ukrywającą się pod zmienną mplayerCmd o dwa dodatkowe obiekty typu string:
mplayerCmd += ["-really-quiet", "-noautosub", "-ac", "mp3"]

Lub można prościej, edytując pliki konfiguracyjne mplayera. Wystarczy, że do pliku ~/.mplayer/config dodasz linijkę:
ac="mp3"
Zapisuję, odpalam Anki i uczę się dalej ;) Jak ktoś miał podobny problem i rozwiązał go inaczej to zapraszam do dyskusji, co ciekawe bez grzebania w kodzie pod Fedorą wszystko mi działało jak trzeba. Myślałem, że trzeba skompilować mplayera jeszcze raz, ale to też nie pomagało.

Brak flagi xterm_clipboard w vimie pod ubuntu

Jeżeli pod Ubuntu zainstalowałeś vima poprzez sudo apt-get install vim system zainstalował tobie tak naprawdę vim-tiny, który jest lekko okrojony. Np. nie ma ustawionej flagi xterm_clipboard, która bardzo się przydaje przy kopiowaniu. Możesz oczywiście skompilować vima z tą flagą albo wykonać polecenie sudo apt-get install vim-gnome lub vim-gtk, które zainstaluje rozszerzonego vim'a i zapewni ci między innymi ustawioną flagę xterm_clipboard. Nie musisz usuwać vim-tiny.

Krzaki w powerline

Jeżeli używasz powerline-bash czy vim-powerline i w konsoli masz krzaki. Tutaj znajdziesz rozwiązanie ;). Skopiuj czcionkę z której korzystasz do /usr/share/fonts/trutype i to wszystko. Osobiście polecam Source Code Pro lub Droid Sans Mono.

12/05/2012

Kill Spiders 0.2.1

Miałem trochę wolnego czasu więc dodałem kilka rzeczy do repo. Dodałem bonusy polegające na tym, że gracz rzuca nie jedną, a dwiema lub trzema czaszkami jednocześnie. Im silniejszego pająka zabijesz tym większe prawdopodobieństwo, że otrzymasz bonus ;)
Poprawiłem zapisywanie highscore, nie wiedzieć czemu gdy program wychodził z głównej pętli nie wykonywał zapisu do pliku :/
Zwiększyłem liczbę "specjalnych" pająków oraz zmieniłem liczbę czarnych czaszek które gracz otrzymuje za kolejny poziom z jednej na pięć.
Na końcu jak zawsze lekka refaktoryzacja kodu ;)

Chętnych zapraszam tutaj: kill_spiders

Grę odpalasz komendą:
python start_game.py

11/24/2012

Anki - zapamiętuj łatwiej!

Anki to program, oparty trochę na zasadzie fiszek. Czyli przykładowo, masz kartkę na której z jednej strony jest słowo w języku obcym, a z drugiej strony to samo słowo przetłumaczone na Twój ojczysty język.

Idea programu jest łatwa, częściej wyświetlane są słowa, które częściej zapominasz, a rzadziej wyświetlane te, które pamiętasz bardzo dobrze. Oczywiście to Ty decydujesz o tym z jaką częstotliwością program ma Ci przypominać o danej frazie.
Ciekawym dodatkiem jest możliwość umieszczania obrazków, dźwięków, wideo oraz coś jak LaTeX, dzięki czemu o wiele lepiej zapamiętasz dane zagadnienie.

Anki pozwala dodawać więcej niż tylko jedno słowo/zdanie ;) Można używać go do prze najróżniejszych celów. Kogo nie spytałem z osób, które go używają, to prawie każdy używał go jeszcze do kilku innych rzeczy oprócz zapamiętywania słówek, np.
  • nauka komend unixowych
  • nauka komend gita czy mercuriala
  • zapamiętywanie stolic/państw
  • przypominanie wzorów matematycznych :))
  • przypominanie haseł do różnych usług (ale z tym bezpiecznie oczywiście ;))
  • etc.
Anki dostępny jest na Linuxa/Mac OSX oraz Windowsa. Można go również zainstalować na iPhone i Android. Jest jeszcze AnkiWebs.

11/14/2012

tzf.pyramid_routing

Fizyk przygotował paczkę, za pomocą której w wygodny sposób można wczytywać ścieżki we frameworku Pyramid ;).

Instalacja przez pip:
pip install tzf.pyramid_routing

Github:
git clone https://github.com/fizyk/pyramid_routing.git
cd pyramid_routing
python setup.py install

Dodawanie ścieżek

Załóżmy, że tworzysz jakąś prostą appkę, gdzie za pomocą urla, chcesz zobaczyć profil jakiegoś użytkownika, statystyki (ogólne, jak i dla każdego usera z osobna) oraz prosty blog. Link do appki to: http://localhost:6543.

Struktura appki:
/my_app
  lib/
    routing/
      __init__.py
      blog.py
      user.py
  views/
    __init__.py
  __init__.py
development.ini

W pliku __init__.py aplikacji umieszczasz:
config.include('tzf.pyramid_routing')

W pliku konfiguracyjnym np. w development.ini  ustawiasz coś na wzór:
routing_package = my_app.lib.routing
gdzie my_app to nazwa aplikacji, a reszta to ścieżka do katalogu, gdzie będzie cały Twój routing.

W  katalogu routing, tworzysz 3 pliki: __init__.py, blog.py oraz user.py.

__init__.py
routes = [
    dict(name='index', pattern='/'),
    dict(name='statistics', pattern="/statistics"),
]

blog.py
routes = [
    dict(name='blog:index', pattern='/'),
    dict(name='blog:post', pattern="/post/{\d+}"),
]

user.py
routes = [
    dict(name='user:index', pattern='/{name}'),
    dict(name='user:statistics', pattern="/{name}/statistics"),
]

Co to tak właściwie robi? Nazwa modułu mówi o tym jak ma wyglądać pierwszy parametr ścieżki url. Np. dla modułu __init__.py będą to:
  • http://localhost:6543
  • http://localhost:6543/statistics
dla modułu blog.py:
  • http://localhost:6543/blog/
  • http://localhost:6543/blog/post/785
i dla modułu user.py:
  • http://localhost:6543/user/sromek
  • http://localhost:6543/user/sromek/statistics

Zmienna routes w modułach musi wskazywać na listę słowników, takich, która przyjmuje metoda pyramid.config.Configurator.add_route. Dokumentację paczki znajdziesz tutaj.

11/11/2012

RandomWords 0.1.6

Wprowadziłem nową funkcjonalność do paczki RandomWords. Można generować randomowe maile. Przydatne przy wypełnianiu testowej bazy danych ;)

Przykład użycia:
>>> from random_words import RandomEmails
>>> rand_mails = RandomEmails()

>>> rand_mails.randomMail()
'ernest@mail2java.com'

>>> rand_mails.randomMails()
['annmarie@mail2xox.com']

>>> rand_mails.randomMails(15)
['patrice@keko.com.ar', 'conor@mail2atom.com', 'vihan@mail2carolyn.com', 'felicia@looksmart.com.au', 'quinlan@accessgcc.com', 'aimee@china.net.vg', 'kate@mail2christmas.com', 'geoffrey@frommiami.com', 'lillie@comic.com', 'trinity@nagpal.net', 'bennett@webmail.co.za', 'jesse@chaiyomail.com', 'chase@iespana.es', 'mya@ijustdontcare.com', 'ramona@uole.com']

Paczka dostępna na githubie jak i na pypi.

11/09/2012

powerline-bash

(Uwaga, zmieniła się nazwa repo powerline-bash, po więcej zapraszam tutaj)

Używasz vima? A używasz w nim vim-powerline? Jeśli tak, to czemu nie wstawić sobie powerline do konsoli? Używam tego od pewnego czasu i muszę przyznać, że jest bardzo ciekawym dodatkiem.

powerline-bash

W czym mi to tak naprawdę pomaga oprócz tego, że widzę aktualną gałąź na której pracuję? Jeżeli zmienię coś w którymś z plików, zmieni się również kolor gałęzi:


To samo stanie się, jeżeli pójdzie coś nie tak przy wykonywanych operacjach na repo. Jeśli dodasz plik, który nie jest śledzony przez gita pojawi się "+":


Gdy ścieżka do katalogu robi się zbyt długa, powerline zostaje przycięty:


I jedna z ciekawszych rzeczy; jeśli lokalne repo różni się od "zdalnego" (nie wiem jak najodpowiedniej to przetłumaczyć na polski) to zostanę o tym poinformowany:


Co od razu mówi mi, że przy pull'u dostanę 5 commitów :)

Informacje o tym jak podpiąć skrypt pod konsolę znajdziesz tutaj: powerline-bash.
Ze swojej strony mogę dodać jeszcze tyle, że jak masz problem ze znakami to skorzystaj z którejś z tych czcionek albo używaj Source Code Pro, tak jak ja :P

11/08/2012

Pykonik, PyWaw, PyCircle, PySilesia

Tak się zdarzyło, że mieszkam w Szczecinie, gdzie jest mała społeczność Pythonowców, przynajmniej ja tak to widzę. Ale jak to jest z resztą Polski? Im dalej na południe tym lepiej. W Poznaniu działa grupa PyCircle; jeżeli jesteś z Warszawy to może Cię zaciekawić grupa PyWaw. Natomiast koledzy z Krakowa stworzyli Pykonika. Dodatkowo Kraków udostępnia stream swoich spotkań. Jest jeszcze Zabrze, które niedawno wystartowało z grupą PySilesia.

Czy Szczecin będzie miał swojego PyPrykarza? Będę musiał nad tym niedługo pomyśleć. Jak ktoś chciałby pomóc to pisać :)

11/06/2012

Kill Spiders 0.1.9

Wrzuciłem nową wersję kill_spiders. Dodałem menu i highscore. Highscore jest przechowywane w pliku highscore.dat jako int, więc bez problemu sobie go możesz podmienić! :D W menu dodałem możliwość, od którego poziomu chcesz zacząć. Poniżej kilka screenów ;)

Menu

Wybór poziomu

Kill Spiders 0.1.9 - poziom 25

Kill Spiders 0.1.9 - poziom 40


11/05/2012

Programista python

Hej, potrzebujemy do zespołu pythonowca. Czasami coś trzeba będzie również popisać w JavaScript. Nie musisz super ogarniać, my Cię nauczymy :) Po więcej info najlepiej napisać mi na maila. Na start z tego co pamiętam jest zatrudnienie na trzy miesiące (okres próbny), a później dostajesz umowę o pracę, etc. Acha, miejsce Szczecin.

11/04/2012

RandomWords 0.1.5

Jak wspomniałem we wcześniejszym wpisie, zapomniałem dodać generowanie przecinków do lorem ipsum. Dodałem to w tej poprawce i usunąłem możliwość wprowadzania maksymalnej ilości słów w zdaniu. Projekt i dokumentację znajdziesz jak zawsze na githubie lub na pypi.

RandomWords 0.1.4

Wrzuciłem właśnie nową wersję RandomWords. Dodałem generowanie lorem ipsum. Co prawda jest już w sieci moduł do pythona, który generuje lorem ipsum, ale w tym celu musi za każdym razem nawiązywać połączenie ze stroną lipsum, co może być nie wygodne w niektórych przypadkach.

Przykładowy sposób użycia:
>>> from random_words import LoremIpsum
>>> li = LoremIpsum()
>>> li.get_sentence()
'Commodo gubergren fringilla curabitur quam volutpatut.'

>>> li.get_sentence(max_words=22)  # random sample from 3 to 22 ;)
'Voluptua curae; facilisi mi auctormauris neque enim aliquam stet odio sedfusce porttitor magnis ultrices.'

>>> li.get_sentences(max_words=5, sentences=3)
'Tortor mazim nobis ex. Luptatum assum rhoncus labore. Nequeetiam montes nibh.'

>>> li.get_sentences_list(max_words=13, sentences=5)
['Torquent per duo aaenean accumsannulla magnapraesent sollicitudin eirmod duis lobortisetiam minim metusdonec.', 'Possim egestasmauris accumsannulla netus cubilia suspendisse qui facer enimsed nonummy.', 'Congue faucibusvestibulum conubia lectus laoreet dignissim tortorcurabitur natoque voluptua penatibus facilisinam.', 'Ante semper sociis leo.', 'Dignissim arcu sea metus sed ultriciespellentesque malesuadanullam wisi nullamauris.']

Instalujesz standardowo z githuba, albo przez pipa:
pip install RandomWords

Dokumentację znajdziesz tutaj:
P.S. Teraz zauważyłem, że nie dodałem generowania przecinków, ehhh. Później to naprawię :)

11/02/2012

Konwerter Pandoc

Pandoc służy do konwertowania jednego typu dokumentu na drugi. Kiedy jest to przydatne? Na przykład wtedy, gdy piszesz dokumenty w języku Markdown, a potrzebujesz takie pliki komuś przesłać czy wstawić na stronę lub po prostu najzwyczajniej na świecie postanowiłeś przejść na dokumentowanie swojej pracy w innym języku. Nie będziesz przecież teraz tego wszystkiego przerabiał ręcznie ;)
Pierwsze co należy zrobić to zainstalować Pandoc dla swojego systemu.  W fedorze zrobisz to komendą:
sudo yum install pandoc

Konwersja do pliku EPUB (ebook):
pandoc -f markdown -t epub README.md -o docs/readme.epub

Konwersja do pliku HTML:
pandoc README.md -o docs/readme.html

Konwersja do pliku HTML5:
pandoc -S -5 README.md -o docs/readme.html

Konwersja do pliku ODT:
pandoc README.md -o docs/readme.odt

Przy konwersji do pliku PDF trzeba użyć innego polecenia, przynajmniej ja tak musiałem zrobić na Fedorze 16. Próbowałem poprzez pandoc, ale ciągle generował mi plik HTML... Jeśli działa Ci konwersja do PDF przez pandoc to się ciesz :) Jeżeli nie, to musisz dociągnąć markdown2pdf. W fedorze wygląda to tak:
sudo yum install pandoc-markdown2pdf

Konwersja do pliku PDF:
markdown2pdf README.md -o docs/readme.pdf

I to wszystko. Z tego najczęściej korzystam. Dokumentację tych narzędzi znajdziesz tutaj, a więcej przykładów tu.
Mam nadzieję, że przyda Ci się to narzędzie :)

Przykładowe dokumenty: PDF, HTML5.

11/01/2012

RandomWords 0.1.3

Wrzuciłem przed chwilą nową wersję RandomWords. Dodałem generowanie imion. Póki co nie jest ich za wiele bo nie całe 1.8k, ale za jakiś czas pewnie coś dorzucę ;).

Przykład użycia:
>>> from random_words import RandomNicknames
>>> rn = RandomNicknames()

>>> rn.random_nick()
'Fredrick'

>>> rn.random_nick(letter='r', gender='f')
'Rene'

>>> rn.random_nicks(letter='u', gender='f', count=4)
['Una', 'Uma', 'Ursula', 'Ulrica']

>>> rn.random_nicks(count=10)
['Kristy', 'Imani', 'Delbert', 'Brevyn', 'Jasmin', 'Genevieve', 'Clodagh', 'Graham', 'Sondra', 'Ed']

Moduł znajdziesz na githubie i na pypi.

10/29/2012

RandomWords

Ostatnio potrzebne było mi wypełnić bazę testowymi danymi. Byle jakimi. Oczywiście pierwsze co to wszedłem na pierwszą lepszą stronę generującą lorem ipsum i jazda z ctrl+c, ctrl+v. Można, owszem, ale tylko wtedy gdy masz do wypełnienia mało komórek w bazie. Problem jest gdy tych komórek musisz wypełnić 100-1000. Metoda ctrl+c, ctrl+v nie jest wtedy fajna ;)
Oczywiście od razu poszperałem po sieci w celu znalezienia jakiegoś ciekawego generatora słów, zdań, etc. Ale nic co spełniałoby moje oczekiwania nie znalazłem. No trudno, to zrobię swoje narzędzie.

Główne założenia były takie:
  • losowanie słowa z jakiegoś zakresu
  • losowanie słowa zaczynającego się na pewną literę
  • losowanie pewnej ilości słów i zwracanie ich w postaci listy
  • losowanie pewnej ilości słów rozpoczynających się od pewnej litery
Z racji tego, że chcę to wykorzystywać w różnych projektach stworzyłem paczkę oraz udostępniłem to na githubie.

Instalowanie:
pip install RandomWords
lub:
git clone https://github.com/tomislater/RandomWords.git
cd RandomWords
python setup.py install

Przykłady użycia:
>>> from random_words import RandomWords
>>> rw = RandomWords()
>>> word = rw.random_word()
>>> print word
factors

>>> word = rw.random_word('y')
>>> print word
yards

>>> words = rw.random_words(count=10)
>>> print words
['runs', 'experience', 'comments', 'freedom', 'permit', 'honks', 'pins', 'texts', 'grant', 'fathers']

>>> words = rw.random_words(letter='r', count=5)
>>> print words
['raincoat', 'reactance', 'room', 'relocation', 'rudders']

>>> words = rw.random_words(letter=None, count=2)
>>> print words
['tides', 'eights']

Co dalej? Co jest jeszcze do zrobienia?
Oj, bardzo dużo. Pierwsze co dodam w następnej poprawce to generowanie nicków. Później zajmę się generowaniem lorem ipsum i jakimiś prostymi zdaniami. Wszystko po to, aby wygenerowane dane przypominały te, które wprowadzają użytkownicy do baz danych.

Dzięki temu nie dostaniesz oczopląsu od kolejnego rekordu w stylu  "asdhiofuqpfnasduixczvlbzxch" :)

10/24/2012

Kill Spiders 0.1.8

Nie nie, dzisiaj bez żadnych funkcjonalności. Dokonałem tylko refaktoryzacji kodu. W najbliższym czasie pobawię się bibliotekami typu py2exe i zobaczymy jak to działa z pygame i czy serio śmiga pod windowsem ;)

A póki co, grę (a właściwie to prototyp) odpala się za pomocą komendy:
python start_game.py

Repo: kill_spiders 

10/20/2012

Kill Spiders 0.1.7

Pushnąłem właśnie nową wersję. Zmieniłem domyślną broń, którą była kość na białą czaszkę która ma "power 1", czyli pająk dostający taką czaszką straci 1hp. Dodałem dodatkową broń w postaci czarnej czaszki ("power 5", czyli pająk traci 5hp ;)). Na początku każdego poziomu gracz dostaje jedną czarną czaszkę. Czaszki się sumują, oprócz białych, których jest nieskończenie wiele.
Dodałem również sprity dla hitowanych? spiderów. Po prostu lekko tryskają krwią.
Zmieniło się również lekko sterowanie. Rzucanie białymi czaszkami znajduje się pod lewym ctrl, a rzucanie czarnymi czaszkami pod spacją.

TODO:
  • skakanie góra/dół
  • menu
  • highscore
  • jakaś kolejna dodatkowa broń

10/17/2012

Kill Spiders 0.1.6

Pushnąłem właśnie nową wersję Kill Spiders na githuba. Dodałem sprity dla martwych pająków oraz polepszyłem troszkę GAME OVER. Teraz po zabiciu pająka widać, że pająk jest martwy :) Dodatkowo spada w dół, aby oczyścić ekran.
Jeżeli gracz dojdzie do momentu GAME OVER, zostanie zapytany czy chce zacząć grę od nowa czy woli skończyć.
W kolejnych wersjach widziałbym dodatkowe bronie, efekty (tzw. hity spiderów) oraz jakieś proste menu i wybór od którego poziomu gracz chce zacząć ;) Albo zrobię jakiś prosty MD5 z liczb i gracz będzie mógł sobie coś takiego wkleić. Dla mniej ogarniętych zawsze jakieś utrudnienie ;>

KIll Spiders (pygame)

KIll Spiders (pygame)

10/15/2012

Kill Spiders 0.1.5

Wrzuciłem przed chwilą na githuba nową wersję Kill Spiders 0.1.5. Zmieniłem tło, bohatera ;), dodałem trochę pająków, a jednego nawet usunąłem! Dodałem też dźwięki gdy bohater rzuca bronią oraz gdy pająk nią obrywa. Jako BGM posłużył mi ten track.

W kolejnej wersji dodam obrazki dla martwych pająków, jakiś dźwięk podczas umierania i może dodatkowe bronie dla bohatera. Ciekawe kiedy się ogarnę i stworzę menu oraz jakiś sensowniejszy GAME OVER. Ale nie napalam się zbytnio na to, chciałem zrobić prostą gierkę, dzięki której poznam podstawy pygame.

10/11/2012

Kill spiders! (pygame)

Postanowiłem poznać trochę bardziej bibliotekę pygame. Pierwsze efekty można zobaczyć tutaj: kill_spiders. Póki co, nie skupiałem się na rzeczach typu ładne menu, efekty etc. Na dniach powinienem coś dorobić.

P.S. Głos pod czarownicę zaoferowała już moja dziewczyna :)

1/21/2012

Pamięć 0.5

Opublikowałem nową wersję skryptu Pamięć. Dostępna jest nowa metoda "Zakładki alfabetyczne". Dodałem kilkadziesiąt nowych słów oraz przeprowadziłem refaktoryzację kodu. Zapraszam do korzystania.

1/04/2012

Mała poprawka w projekcie Pamiec 0.4.2

Wprawdzie nie musiałem o tym robić jakiegokolwiek wpisu bo nie wprowadziłem, żadnej nowej funkcjonalności (mała poprawka przy odczytywaniu/zapisywaniu pliku ze słowami), lecz od kilku dni studiuję framework Tornado i napisałem prostą aplikację wyświetlająca randomowe liczby o zadanej przez użytkownika długości (to samo jest w projekcie Pamiec) lecz poprzez Google App Engine. Więc nie trzeba nic ściągać. Wystarczy, że wejdziesz na stronę aplikacji i wybierzesz za pomocą formularza to co chcesz uzyskać. Ćwicz pamięć krótkotrwałą!

Link do nowej wersji projektu Pamiec tutaj. A ten link poprowadzi Cię do strony gdzie testuję skrypty we framework'u Tornado. Wybacz za brak jakiejkolwiek oprawy graficznej na stronie, lecz nie mam na to czasu. Najważniejsze, że działa.

1/01/2012

Pamięć 0.4! Na nowy rok.

Dodałem małą aczkolwiek przydatną funkcjonalność do programu. Za pomocą komendy python pamiec.py <liczbaIlosc> <liczbaDlugosc> program generuje podaną ilość liczb o zadanej długości. Przykładowo po wykonaniu komendy python pamiec.py 10 7 program wyświetli 10 liczb z których każda będzie 7 cyfrowa. Ustaliłem, iż zakres cyfr w liczbie będzie wynosił od 3 do 9 cyfr. Tyle najczęściej wystarcza do trenowania pamięci krótkotrwałej. Nowa wersja dostępna oczywiście pod tym adresem. Screen jak to wygląda poniżej: