5/17/2013

TFDPronunciation nowa wersja (progressbar)

Dodałem dzisiaj do skryptu TFDProunciation progressbar. Czasami strasznie mi muli net i fajnie mniej więcej wiedzieć kiedy skrypt skończy się wykonywać.



bpython i dzielenie się kodem

Przy codziennej pracy z pythonem moimi ulubionymi konsolami są bpython (szybkość) i IPython (kombajn). Dzisiaj będzie krótko na temat jednej z funkcji jaką oferuje bpython, a chodzi tutaj o wrzucenie kodu z konsoli do internetu ;)

bpaste

Aby wysłać kod z konsoli bpython wystarczy wcisnąć F8 i potwierdzić to klawiszem y. Domyślnie kod jest wysyłany na bpaste i z poziomu konsoli wygląda to mniej więcej tak:
http://bpaste.net/show/cVuvrhTrBZB8ZSM9DVxP/
I to tyle jeśli chodzi o wrzucanie na bpaste.

gist

Ale co jeśli, chcę szybko umieścić kod na gist? Oczywiście da się, lecz trzeba poczynić kilka kroków. Pierwsze co musisz zrobić to stworzyć plik konfiguracyjny dla bpythona w którym zamieścisz informację, jakiego skryptu ma używać do wypychania kodu. Jeśli nie masz pliku ~/.config/bpython/config to go stwórz i dodaj w sekcji general linijkę: pastebin_helper = do_gist_json. Przykładowo u mnie wygląda to tak:
Nazwa do_gist_json to oczywiście nazwa skryptu, który będzie miał się wykonać po wciśnięciu F8 (domyślnie jest to pastebinit, dlatego też leci na bpaste). Czas na napisanie skryptu. Zaraz! Jak pisać?! Spokojnie, poniżej zamieszczam kod; musisz tylko podmienić dane user i pass na swoje jeśli chcesz, aby kod wrzucał się na twoje konto. Jeśli nie chcesz, możesz usunąć argument auth:
#!/usr/bin/env python

import sys
import json
import requests


def do_gist_json(s):
    gist_url = 'https://api.github.com/gists'

    data = {'description': "Gist from BPython",
            'public': True,
            'files': {
                'sample.py': {'content': None}
            }}
    data['files']['sample.py']['content'] = s

    res = requests.post(gist_url,
                        data=json.dumps(data),
                        auth=("user", "pass"))

    return res.json()["html_url"]

if __name__ == "__main__":
    s = sys.stdin.read()
    print do_gist_json(s)
Domyślnie wysyłany kod jest publiczny, jeśli tego nie chcesz to już pewnie zauważyłeś, którą linijkę musisz zmienić :). Plik do pobrania jest tutaj. Ściągnij/skopiuj gdzieś na dysk i nazwij go tak jak podałeś w pliku ~/.config/bpython/config. Następnie musisz nadać skryptowi prawa do wykonywania, czyli wpisujesz w konsoli:
chmod +x do_gist_json
i kopiujesz do /usr/bin/
sudo cp do_gist_json /usr/bin/
I już, teraz po odpaleniu bpythona i wciśnięciu klawisza F8 program będzie wiedział, że kod ma wysłać na gist, a nie na bpaste.
https://gist.github.com/tomislater/5595417
EDIT:
Skrypt korzysta z biblioteki requests, więc musisz ją mieć u siebie (sudo pip install requests).

4/28/2013

i3 i nowe aliasy

Jakiś czas temu jeden z moich znajomych zaproponował mi wypróbowanie xmonad do pracy. Pobawiłem się nim jakieś półtora dnia i nie przypadł mi bardzo mocno do gustu. Może inaczej, był fajny, ale myślałem, że będzie lepszy ;) (chociaż, na początku byłem pod wielkim wrażeniem). Postanowiłem więc poszukać alternatywy dla xmonad i znalazłem i3. Spędziłem trochę czasu na konfiguracji środowiska i jestem z niego bardzo zadowolony. Postanowiłem póki co wykorzystywać go do codziennej pracy, jak nie będzie mnie zbytnio irytował to zacznę go używać w pracy.

Przy okazji uaktualniania repo dotfiles, dodałem trzy nowe aliasy. Zamieszczam je poniżej:

Bezpieczny rm:
alias rm='rm -I'

Największy plik/katalog w danym katalogu
alias ds='du -ks *|sort -n'

Aktualna pogoda dla miasta Szczecin (ICM)
alias szczecin='display "http://www.meteo.pl/um/metco/mgram_pict.php?ntype=0u&row=370&col=142&lang=pl"'

4/21/2013

Python test framework - splinter

Trafiłem dzisiaj na framework splinter, który służy do testowania webowych aplikacji. Po przeczytaniu dokumentacji i przejrzeniu krótkiego tutoriala postanowiłem sprawdzić czy może mi się przydać. Framework poznałem u siebie lokalnie, wykonując testy na jednej z moich appek do testów, ale tutaj przedstawię to na istniejącej witrynie w sieci. Na początek garść informacji.

Możliwości

  • wykonywanie skryptów javascript
  • bardzo proste api
  • multi webdrivers (chrome, firefox, phantomjs, zopetestbrowser, remote)
  • wsparcie dla xpath i css
  • działające iframe i alerty
  • działający ajax oraz asynchroniczny javascript

 

 Instalacja

pip install splinter
Po jakże trudnej instalacji możesz wziąć się za testowanie web aplikacji.

Poniżej znajduje się lista, które przetestuję na stronie sonyvegas:
  • skorzystanie z wyszukiwarki
  • próba skorzystania z kalendarza
  • próba zalogowania na nieistniejące konto
Pierwsze co musisz zrobić to stworzyć instancję przeglądarki, a robisz to tak:
from splinter import Browser
browser = Browser('firefox')
Następnie należy podać adres pod jaki zamierzasz się udać. Jak wyżej zaznaczyłem zacznę od testowania wyszukiwarki:
browser.visit('http://sonyvegas.info/search.php')

input = browser.find_by_xpath(
    '//td[@class="trow1"]/table/tbody/tr/td/input[@class="textbox"]')
input.first.fill("rendering")

button = browser.find_by_name("submit")
button.first.click()

assert browser.is_text_present("Wyniki") is True
assert len(browser.find_by_xpath('//a[@class=" subject_old"]')) == 20
Co wykonał ten test? Wszedł pod wskazany adres. Wyszukał inputa (za pomocą xpath) w którego wprowadził wyrażenie "rendering", następnie odszukał przycisk służący do zaakceptowania szukania i kliknął go. Po tej akcji sprawdził czy na stronie znalazł się tekst "Wyniki" oraz czy na stronie jest 20 linków z wynikami.

Teraz sprawdzę czy user na pewno nie ma dostępu do kalendarza:
browser.visit("http://sonyvegas.info/calendar.php")
assert browser.is_text_present(
    u"Kalendarz został wyłączony przez administratora.")
Jak widać test jest bardzo prosty. Udaje się pod wskazany internetowy adres :) i sprawdza czy wyświetla nam się odpowiedni komunikat na stronie.

Ostatnim testem będzie próba zalogowania się na nieistniejące konto:
browser.visit("http://sonyvegas.info/member.php?action=login")
browser.fill("username", "testuser")
browser.fill("password", "userpassword")
browser.check("remember")
browser.find_by_name("submit").first.click()
assert browser.is_text_present(
    u"Wprowadzono nieprawidłowy login i/lub hasło.")
Jak widzisz tutaj też nie ma zbyt dużo filozofii. Udajesz się pod adres logowania, wprowadzasz username, password oraz zaznaczasz, że chcesz być zapamiętanym i klikasz w submit, tyle. Następnie sprawdzasz, czy user się nie zalogował.

Użyłem tutaj bardzo prostych przykładów, lecz nie powinieneś mieć problemów z używaniem splintera. Framework ma naprawdę dobrą dokumentację, naprawdę mi się spodobał.

Zapomniałbym! Na koniec oczywiście zamknij przeglądarkę ;)
browser.quit()

4/14/2013

Nowa wersja TFDPronunciation

Dodałem małą poprawkę do repo TFDPronunciation. Informacje o tym czy plik został znaleziony czy też nie są wyświetlane w kolorze. Dzięki temu szybciej wiesz co się stało. Poniżej przykładowy screen:


P.S. Kilka dni temu powróciłem do Sublime Text po zmianie komputera na lepszy i muszę powiedzieć, że jest całkiem spoko, tylko nie mogę poprawnie skonfigurować SublimeCodeIntel. Linux x64, Ubuntu 12.04. Jak ktoś by rozwiązał ten problem to niech da mi znać :) Dokładnie chodzi o to, że po pewnym czasie pracy (mniej niż minuta?) plugin zaczyna zżerać 100% procka....

3/23/2013

Vim tagbar

Tagbar pomaga wtedy gdy w module masz dużo kodu i jest ci trudno ogarnąć, co gdzie jest (np. po wcześniejszej osobie, która pisała kod).

Jeżeli korzystasz z pathogen to instalacja jak się domyślasz jest banalna:
cd ~/.vim/bundle
git clone https://github.com/majutsushi/tagbar.git
Dodatkowo musisz mieć w systemie Exuberant Ctags. Szybka instalacja pod Ubuntu:
sudo apt-get install ctags
W pliku .vimrc możesz jeszcze dodać:
nmap <F8> :TagbarToggle<CR>
Umożliwi ci to na szybki dostęp do Tagbar wciskając F8.

Tak to wygląda dla kodu pythona:
Tagbar vim
 Kilka przydatnych skrótów klawiszowych:
  • enter/double click - przenosi Cię do taga, na który wskazałeś kursorem (na screenie widać, że przeniosło mnie do metody route)
  • s - sortowanie tagów według kolejności występowania lub według nazwy (domyślnie jest według kolejności występowania)
  • p - przenosi do danego tagu, lecz kursor pozostaje w tagbarze
  • -/+ - zwija/rozwija tagi, np. importy czy klasy
  • =/* - zwija/rozwija wszystkie tagi
  • ctrl+n/ctrl+p - skakanie po top-level tagach (następny, poprzedni)
  • F8 ;)

3/09/2013

Vim i gitgutter

Kilka dni temu trafiłem na plugin vim-gitgutter i postanowiłem go wypróbować. W wielkim skrócie plugin odpowiada za pokazywanie w którym miejscu w pliku dokonałeś zmian, coś jak git diff.


Korzystam z pathogen, więc aby zainstalować plugin wklepałem:
cd ~/.vim/bundle
git clone git://github.com/airblade/vim-gitgutter.git
I już można się bawić. Posiedziałem nad nim chwilę i naprawdę mi się spodobał, lecz musiałem wprowadzić kilka swoich poprawek :)

Po pierwsze, wyłączyłem domyślne pokazywanie różnic, a zbindowałem sobie komendę GitGutterToggle pod <leader>gr. Dzięki temu jak chcę zobaczyć różnicę to wciskam ,gr (klawisz <leader> mam zbindowany pod ","), a jak chcę wyłączyć to wciskam znów to samo. Dodatkowo zbindowałem sobie komendy GitGutterNextHunk i GitGutterPrevHunk odpowiednio pod <leader>d oraz <leader>s. Mogę przez to w łatwy i szybki sposób poruszać się po pliku skacząc z jednej zmiany na drugą.

Tak to wygląda w pliku .vimrc:
let g:gitgutter_enabled = 0
nmap <leader>gr :GitGutterToggle<CR>
nmap <leader>s :GitGutterPrevHunk<CR>
nmap <leader>d :GitGutterNextHunk<CR>
Plugin oferuje jeszcze kilka innych ciekawych rozwiązań takich jak np. podświetlanie danej linii ze zmianami, ale mi osobiście to bardziej przeszkadza niż pomaga. Jak zawsze zapraszam do repo dotfiles. Jak masz coś fajnego, też się podziel :)