Marek Wywiał

python software developer

fuse ftp mount - curlftpfs

by Marek Wywiał

sprawdź najnowszą wersję ftpmount

Do pracy z hostingiem gdzie mamy tylko '''ftp''' przydaje się montowanie dysku poprzez właśnie ftp. Służy do tego program '''curlftpfs''' (np apt-get install curlftpfs).

Odpalamy go jako:


curlftpfs ftp://user:[email protected]/ ./mountpoint

Do tego potrzebujemy uprawnienia grupy '''fuse''' więć jako ''root'' musimy sobie ją dodać od naszego użytkownika.

Jeżeli mamy dużo połączeń do zarządzania przyda się mały skrypt: * ftpmount

sterowany konfiguracją w pliku '''config.ini''':


[hostone.pl]

host=ftp.hostone.pl

user=userone

pass=passone # jak nie podamy tego wpisu, program się zapyta o hasło

mountpoint=hostone.pl



[hosttwo.pl]

host=ftp.hosttwo.pl

user=usertwo

mountpoint=hosttwo.pl

Wtedy wystarczy nam: * ./ftpmount hostone.pl # montujemy połączenie * ./ftpmount -u hostone.pl #odmontowywujemy połączenie * ./ftpmount -l # lista dostępnych konfiguracji połączeń

mutt & firefox (by urlview)

by Marek Wywiał

w ubuntu wystarczyło:

apt-get install urlview

w ~/.muttrc dodane makro


macro pager \\cb <pipe-entry>urlview<enter> 'Follow links with urlview'

orac plik ~/.urlview:


REGEXP ((http|https|ftp|gopher):(//)?[^ <>"\\t]*|www\\.[-a-z0-9.]+)[^ .,;\\t<">\\):]

COMMAND /usr/bin/nohup firefox -remote "openURL("%s", new-tab)" >/dev/null 2>&1 &

teraz ctrl+b zbiera linki z treści wiadomości, które otwieramy w wybranej przeglądarce ;)

google apps (gmail) i mutt

by Marek Wywiał

Znalezione na sieci i przystosowane do google apps:

set imap_user = "[email protected]"

set imap_pass = "password"

set smtp_url = "smtp://users\@[email protected]:587/"

set smtp_pass = "password"

set from = "[email protected]"

set realname = "My ql user"

set folder = "imaps://imap.gmail.com:993"

set spoolfile = "+INBOX"

set postponed="+[Google Mail]/Drafts"

set header_cache=~/.mutt/cache/headers

set message_cachedir=~/.mutt/cache/bodies

set certificate_file=~/.mutt/certificates

set move = no

porządki na dysku, czyli mv, ln, mount i bind

by Marek Wywiał
    More posts about:  
  • linux

Robiąc ostatnio trochę miejsca pomiędzy partycjami przeniosłem /usr/lib do /opt/usr/lib i zrobiłem symlink ln -s /opt/usr/lib /usr/lib. Problemem okazało się np /usr/lib/cups/filter/foomatic-rip, który jest linkiem relatywnym do ../../../bin/foomatic-rip i w ten sposób pozbyłem się możliwości drukowania.

Nie mam miejsca by zrobić/użyć partycji, którą bym zamontował pod /usr/lib ale chwila w necie pozoliła znaleść mi rozwiązanie odpowiednie dla mnie :)

mount --bind /opt/usr/lib /usr/lib

lub w /etc/fstab

/opt/usr/lib /usr/lib none bind

i teraz jest ok :)

git pre-commit hook - symfony / php

by Marek Wywiał

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

by Marek Wywiał

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)

1
2
3
4
5
6
7
8
9
 #!/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 ...

do pobrania

Dokładam paczkę z plikami do testu:

$ unzip py.zip

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

Dodatkowe moje narzędzia

git, svn i puste katalogi

by Marek Wywiał

Importując repozytorium svn'a poprzez git-svn tracimy puste katalogi, co czasem nie jest przyjemne. W dodatku to przecież nasze katalogi i chcemy je mieć ;)

Dziś mnie trochę to przycisnęło więc, pogadałem chwilę z google i znalazłem użyteczny skrypt git-me-up.

Wystarczy pobrać sam plik git-me-up, nadać mu prawa wykonywania i wykonać:

git-me-up http://svn.somerepo.com/path/to/project ./project

a skrypt sam stworzy repozytorium git, zaimportuje wszystkoz repozytorium svn, utworzy brakujące puste katalogi i stworzy w razie potrzeby plik .gitignore na podstawie svn:ignore.

i już...

mud Astral Dominion

by Marek Wywiał

W 1999 roku było kilka popularnych gier typu mud i wraz ze znajomymi ze studiów także prowadziliśmy jednen o nazwie Astral Dominion.

Jakiś czas temu odzyskałem kod mud'a i kilka dni temu uruchomiłem go online.

Jak znajdą się chętni do gry (starzy gracze, których pełny backup także posiadam :) ) to zapraszam:

telnet direct.onjin.net 4000

git cheatsheet

by Marek Wywiał

Kontynuując serię, kolejny cheatsheet tym razem do systemu kontroli wersji git.

I jest git ... :)

lekkie gnome, openbox zamiast metacity

by Marek Wywiał

Lubię gnome, choć niektóre rzeczy mogły by być lepsze np:

  • szybszy start/działania
  • i brakuje mi kombinacji ALT+prawy klawisz myszy do zmiany rozmiarów okien (naleciałość od używania przez lata windowmakera)

Oba problemy rozwiązał mi openbox, który świetnie działa zarówno z Gnome jak i z KDE (oraz samodzielnie :) ).


apt-get install openbox obconf

i gotowe. Teraz można się wylogować i zalogować przy pomocy sesji Gnome/obenbox. Obconf ustawia kilka rzeczy, ale brakuje mu skrótów klawiszowych. Skróty te możemy ustawić w pliku


~/.config/openbox/rc.xml

Można zmienić domyślne przejścia pomiędzy pulpitami z ctrl+F1-x na alt+f1-x (moje ulubione). Trzeba tylko pamiętać by usunąć istniejące już powiązania A-F4 do zamykania okien. Inaczej zostaniemy przeniesieni na pulpit 4, jednak aktywne okno z bieżącego pulpitu zostanie zamknięte ( miałem kilka zdziwionych min ).

Nie udało mi się ustalić kiedy pojawia się plik rc.xml. Czy po użyciu obconf, czy po zamknięciu pierwszej sesji z Gnome/openbox. Jeżeli masz podobny problem to pomoże ci mój plik konfiguracyjny :)

Wystarczy umieścić go w ~/config/opebox/ i zalogować się do Gnome/openbox.
Uwaga: jeżeli włączycie efekty pulpitu, wtedy openbox zostanie zamieniony na powrót na Metacity (don't do it)

-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/IT dx s: a C+++$ U>$ P+ L++$ !E-(+) W++$ N+ !o K--? !w !O !M !V PS PE !Y PGP !t !5 X++ R tv+ b+++ DI D G e+++(++++) h--- r y+++
------END GEEK CODE BLOCK------