Archiwum kategorii: python

vim + vundle plugin manager + programming

Kilku znajomych chciało zacząć używać vim’a. Ale konfigurowanie go na starcie, dobieranie pluginów, instalowanie ich, gdy się jeszcze nic nie wie tylko chce się spróbować zazwyczaj powodowało przełożenie tej próby na ‘kiedy indziej’.

Niedawno poznałem i zacząłem używać plugin manager’a vundle i sam potrzebowałem szybko przenieść konfigurację na drugi komputer i na laptopa. Zazwyczaj używałem dropbox’a i podlinkowanego pliku .vimrc oraz całego katalogu .vim ze wszystkimi pluginami.

Jednak używając plugin managera, którego konfiguracja znajduje się w .vimrc pozwala teraz posługiwać się jedynie plikiem .vimrc. Zgodnie z programistyczną zasadą ‘jak masz coś zrobić więcej niż 2 razy, napisz program’ powstał mały skrypt + podstawowy .vimrc pozwalający szybko uruchomić vim’a skonfigurowanego pod programowanie w ciągu kilku minut.

https://github.com/onjin/vim-startup

Jak na razie przydało się mi i kilku innym osobom :) . Plik .vimrc jest oczywiście przykładowy i jak już sobie poużywasz vim’a i zdecydujesz się go poznać lepiej wtedy po kolei skonfigurujesz go pod siebie.

Grooveshark currentSong.txt + gajim status

Przy okazji szukania API do grooveshark’a odkryłem plik currentSong.txt, który jest tworzony przez Grooveshark Desktop.

Kilka minut z vim’em i mamy skrypt napisany w python’ie, który odczytuje w/w plik i wrzuca informację o aktualnie odtwarzanym utworze jako status wybranego konta w gajim’a.

Skrypt umożliwia także uruchomienie go w trybie monitorowania w/w pliku (wymana pyinotify). Wtedy nasz status będzie zmieniany w chwili (chwilę potem :) ) zmiany utworu w Grooveshark Desktop.

Całość można dowolnie używać/modyfikować, a pobrać można z serwiu github.com:

Do działania wystarczy nam plik grov2gajim.py. Umieszczamy go gdzieś na dysku i możemy używać.

thc/marijuana detox kits.

best vim plugins

Dziś robiłem porządki w ~/.vim/ . Aktualizacje do nowych wersji pluginów, wyrzucanie nieużywanych, porządki w ~/.vimrc. W trakcie tej pracy powstała lista pluginów, dzięki którym miło mi się pracuje

vimball

Plugin zajmujący się pluginami dostarczanymi w paczkach .vba i pozwalający też takie paczki tworzyć, w praktyce potrzeby mi by instalować paczki .vba

 » vimball

snippetsEmu

Emuluje zachowanie snippetów z TextMate. Na przykład w pliku sometest.py wpisujesz ‘for<tab>’, uzupełniasz brakujące miejsca poruszając się klawiszem <tab> i otrzymujesz pełną pętle. Inne użyteczne snippety dla pythona to: prop – property, get – def get_.., set – def set_.., def – def .., cm – classmethod, cl – class .. oraz ifn, ifmain, sb, sbu, sbl1, trye, tryf, tryef, unittest.

Domyślnie dostarczone są 32 zestawy snippetów dla wielu języków programowania, opisu oraz frameworków (django, rails, symfony).

 » snippetsEmu

neocomplcache

System tzw ‘dopełniania’ (podpowiadania) i to właśnie robi. Dopełnia nazwy metod, funkcji, atrybuty html, nazwy plików, itp. Trzeba po prostu zobaczyć i używać.

 » neocomplcache

project

Bardzo prosty i skuteczny system pozwalający w bocznym oknie przeglądać wybrane lub wszystkie pliki z jednego lub wielu projektów. Każdy projekt ma zdefiniowany katalog, dzięki czemu otwarcie pliku z projektu (wciskamy ‘enter’ bedąc ‘nad’ plikiem) nastąpi równocześnie z przejściem do katalogu projektu. W ten sposób pliki projektu jak np ‘tags’ (ctags) zostaną poprawnie wczytane.

 » project

simple pairs

Proste dopełnianie dla „, ‘, {, (, [ . Wpisanie znaku otwierającego powoduje automatyczne dopisanie znaku zamykającego. W przypadku {, (, [ gdy sami wpiszemy znak zamykający, nie zostanie on zdublowany. Kursor po prostu przesunie się dalej. Dla „, ‘ zostanie jednak stworzona kolejna para. Krótkie i skuteczne.

 » simple pairs

vcscommand

Plugin pozwalający wykonywać komendy dla CVS, SVN, SVK, git, bzr, and hg przy pomocy vim’a. Jeden zestaw komend bez względy na system kontroli wersji.

 » vcscommand

Niewiele tego, ale te pluginy, git (post/pre hooki), bash + zestaw skryptów wystarcza mi do pracy :)

ftpmount v1.2.0

sprawdź najnowszą wersję ftpmount

Kilka poprawek do ftpmount:

  • poprawiony przykładowy .ftpmountrc – w .ini komentrze to ‘;’ a nie ‘#’ :)
  • tryb ‘verbose’ (-v) pokazuje teraz jakie parametry zostały przekazane do curlftpfs
  • do README dodałem informację, że ‘curlftpfs’ jest potrzebny do działania skryptu

Wersje do pobrania.

git pre-commit hook – symfony / php

Mam jeszcze tą nieprzyjemnośc pracy z PHP (w tym przypadku z symfony framework) i aby była przyjemniejsza dodałem sobie hook na pre-commit do git’a.
* http://dl.getdropbox.com/u/185133/git/pre-commit

by zadziałało przerywanie commit’a gdy ‘symfony unit-test‘ się nie udadzą, potrzebna jest łatka na symfony (przynajmniej na moją wersję 1.0.17)
* http://dl.getdropbox.com/u/185133/git/symfony_return_code.diff

Hook zakłada, że commit jest robiony w katalogu projektu (tak mam najczęsciej) i znajduje sie w nim plik ‘symfony’

btw: hook wymaga pythona.

home.pl & django – pierwsza potyczka

home.pl obsługuje pythona jako cgi (pliki .py) więc tego będziemy się trzymać. Instalację wykonamy w katalogu /py

instalacja django

hardcoded ale działa ;) wrzucamy to do /py i ruchamiamy poprzez www (plik install.py)

#!/usr/bin/env python
import os

os.system("wget http://www.djangoproject.com/download/1.0.2/tarball/")
os.system("tar zxf Django-1.0.2-final.tar.gz")
os.system("rm Django-1.0.2-final.tar.gz")
os.system("mv Django-1.0.2-final tmp")
os.system("mv tmp/django django")

nasz projekt

Lokalnie wołamy

django-admin.py startproject pytest

i wrzucamy katalog pytest przez ftp na home do katalogu /py .

dispatch.py

#!/usr/bin/env python

import os, sys
import django.core.handlers.wsgi

def run_with_cgi(application):

    environ                      = dict(os.environ.items())
    environ['wsgi.input']        = sys.stdin
    environ['wsgi.errors']       = sys.stderr
    environ['wsgi.version']      = (1,0)
    environ['wsgi.multithread']  = False
    environ['wsgi.multiprocess'] = True
    environ['wsgi.run_once']     = True

    if environ.get('HTTPS','off') in ('on','1'):
        environ['wsgi.url_scheme'] = 'https'
    else:
        environ['wsgi.url_scheme'] = 'http'

    headers_set  = []
    headers_sent = []

    def write(data):
        if not headers_set:
             raise AssertionError("write() before start_response()")

        elif not headers_sent:
             # Before the first output, send the stored headers
             status, response_headers = headers_sent[:] = headers_set
             sys.stdout.write('Status: %s\\r\\n' % status)
             for header in response_headers:
                 sys.stdout.write('%s: %s\\r\\n' % header)
             sys.stdout.write('\\r\\n')

        sys.stdout.write(data)
        sys.stdout.flush()

    def start_response(status,response_headers,exc_info=None):
        if exc_info:
            try:
                if headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None     # avoid dangling circular ref
        elif headers_set:
            raise AssertionError("Headers already set!")

        headers_set[:] = [status,response_headers]
        return write

    result = application(environ, start_response)
    try:
        for data in result:
            if data:    # don't send headers until body appears
                write(data)
        if not headers_sent:
            write('')   # send headers now if body was empty
    finally:
        if hasattr(result,'close'):
            result.close()

# Change this to the directory above your site code.
sys.path.append("/py")
# Change mysite to the name of your site package
os.environ['DJANGO_SETTINGS_MODULE'] = 'pytest.settings'

run_with_cgi(django.core.handlers.wsgi.WSGIHandler())

i odpalamy to by www :D na razie tyle …

Dokładam paczkę z plikami do testu:

unzip py.zip; ftp na home.pl; open http://server.home.pl/py/dispatch.py/admin


MegiTeam - mówimy Twoim językiem