Yakulo – automatyzacja otwierania sesji w Yakuake

Consuetude altera natura est (Przyzwyczajenie jest drugą naturą człowieka).

Jest kilka programów bez których nie wyobrażam sobie używania komputera. Wiele z nich działa w trybie tekstowym a więc by mieć do nich dostęp potrzebny jest emulator konsoli. Moim ulubionym jest Yakuake. Można o nim przeczytać w jakilinux oraz ubucentrum więc nie nie muszę go osobiście zachwalać.

Lubię mieć porządek w środowisku pracy. Dlatego zawsze otwierałem kilka sesji w tej samej kolejności. Na pierwszej logowałem się na konto roota, na drugiej uruchamiałem IPython… W sumie zdażało mi się dojść do kilkunastu kart (w chwili gdy piszę te słowa mam ich otwarte 15). W efekcie po starcie systemu poświęcałem na to całkiem sporo czasu.

Jako, że jestem leniwy (a lenistwo jest cnotą) postanowiłem coś z tym zrobić. W efekcie powstał skrypt yakulo automatyzujący tą pracę.

Instalacja

Skrypt działa zarówno z wersjami Yakuake przeznaczonymi dla KDE 3 oraz KDE 4.

Instalacja sprowadza się do wykonania następujących poleceń:

git clone git://github.com/kosqx/yakulo.git
sudo cp yakulo/yakulo /usr/bin

Jeśli nie masz w systemie gita możesz pobrać skrypt z https://github.com/kosqx/yakulo/raw/master/yakulo i zainstalować go ręcznie.

Szybki start

Yakulo potrzebuje do pracy plików konfiguracyjnych zawierających informacje jak nazwać nowo tworzone sesje i jakie polecenia w nich uruchomić. Pliki te należy twożyć w katalogu ~/.yakulo/

Przykładowy plik ~/.yakulo/foo może mieć zawartość:

# To jest komentarz
:tab Nazwa pierwszej karty
  uname -a
  ls
:tab Nazwa drugiej karty
  echo druga karta

Teraz można już uruchomić skrypt poleceniem:

yakulo foo

Jeśli stworzy się więcej plików konfiguracyjnych (przykładowo ~/.yakulo/base, ~/.yakulo/project_a oraz ~/.yakulo/project_b)
to można załadować wszystkie zawarte w nich karty jednym poleceniem:

yakulo base project_a project_b

Podsumowanie

Teraz wyrobiłem sobie nowy nawyk. Zaraz po starcie KDE naciskam kolejno F12 (wyświetla Yakuake), y (wpisuje w konsoli literę y), PageUp (w Zsh mam to zmapowane do history-beginning-search-backward czyli wyszykiwania w historii), Enter (uruchamia polecenie). Potem czekam kilka sekund i voilà!

Curing Python’s Neglect – polemika

Wczoraj Zed Shaw na swoim blogu napisał artykuł Curing Python’s Neglect. Jak można się domyślić z tytułu ma on na celu pokazanie niedbałości w języku. Z niektórymi uwagami muszę się zgodzić, lecz spora ich część jest nieprawdziwa lub nieaktualna.

Operacje na listach

Pierwszy z przykładów omawia operowanie na listach:

mystuff.append(mything) 
mystuff.remove(mything) 
# to ponoć jest nielogiczne
del mystuff[4]

Absolutnie nie mogę się zgodzić z tym zarzutem. Metody append(), remove(), index() jako parametr dostają wartość, która ma być (odpowiednio) dołączona, usunięta lub znaleziona w liście.

Natomiast jeśli mamy zamiar korzystać z indeksu elementu w liście należy użyć nawiasów kwadratowych i to nie zależnie czy chcemy pobrać, ustawić czy usunąć element o danym numerze.

foo = ['ala', 'ma']
# wszystkie poniższe metody mają parametr będący wartością
foo.append('kota') 
foo.remove('ala') 
foo.index('ma')
foo.extend(('i', 'kota'))
foo.count('kota')

# natomiast tak natomiast pracuje się z indeksami
a = foo[3]
foo[3] = 'psa'
del foo[1]

Obsługa argumentów linii poleceń

Podobnie nie rozumiem narzekań w sprawie modułu optparse. Zasadniczo Python udostępnia dwie standardowe metody obsłużenia argumentów.

Pierwszym z nich jest moduł getopt, który jest wzorowany na Unixowej funkcji getopt(), jest też dostępny w Bashu czy Perlu. Dzięki temu programiści znający te języki mają o wiele łatwiej przenieść się do Pythona. Dodatkowo jest on bardzo prosty w użyciu.

Istnieje też moduł optparse optparse, udostępniający większe możliwości kosztem większej złożoności.

Obsługa daty

Rzeczywiście, obsługa dat nie należy do najprzyjemniejszych rzeczy jakie może mieć programista do zrobienia. Lecz nie widzę aby cokolwiek miało czynić ją trudniejszą w Pythonie – wręcz przeciwnie, biblioteka standardowa bardzo ułatwia sprawę. Moduł odpowiadający za nią nazywa się datetime

Autor narzekał brak możliwości parsowania daty dziewięć la temu. Teraz jest to trywialnie proste, dla przykładu:

from datetime import datetime

a = datetime.strptime('2009-05-31', '%Y-%m-%d')
print a   # 2009-05-31 00:00:00

b = datetime.strptime('05/31/2009 22:08:23', '%m/%d/%Y %H:%M:%S')
print b   # 2009-05-31 22:08:23

Podsumowanie

Nie ma idealnego języka programowania więc i w Pythonie znajdą się niedociągnięcia i błędy projektowe. Lecz niestery Zed Shaw powołuje się na język taki jakim był on w roku 2000, a to cała epoka do tyłu. Popełnia też standardowy błąd człowieka dopiero poznającego dany język, czyli: ja bym to zrobił lepiej, na przykład tak jak jest w moim ulubionym języku.

Co do sugestii o tym, że część języka i biblotek wymaga poważnych zmian – zostały one już dawno zauważone. Efektem tego jest powstanie wersji 3.0 języka, która nie jest zgodna wstecznie, ale za to naprawia wiele błędów projektowych.