Reddit albo zdrowie (psychiczne)

Po dłuższym czasie używania reddit.com postanowiłem zarejstrować się w tym serwisie. Po to by móc w łatwy sposób oglądać wiadomości z kilku grup (jak choćby programming, compsci, coding czy python). Niestety samo dodawanie z użytecznością (usability) nie ma za wiele wspólnego.

Zamiast zastosować klasyczne checkboxy czy ich proste odpowiedniki użyto czegoś takiego:

Intuicja podpowiada, że zielony kolor oraz znak plus oznacza „dodane” a czerwone z minusem oznacza „usunięte”. Sugestia na stronie nic nie pomaga (głosi ona: click the +frontpage or -frontpage buttons to choose which reddits appear on your front page.).

Okazuje się, że jest odwrotnie. Zamiast „dodane” zielone oznacza „dodaj” a czerwone nie „usunięte” ale „usuń”. Jest to bardzo mylące a w efekcie frustrujące.

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à!

Programowania funkcyjnego z Pythonem spotkania

Jacek Laskowski opublikował wczoraj na swoim blogu ciekawą notkę Programowania funkcyjnego z Clojure początki niełatwe (szczególnie mentalnie). Myśli o programowaniu funkcyjnym siedzą mi w głowie od ponad roku, więc przeczytałem ją z zainteresowaniem. Na końcu zamieścił małe wyzwanie: by przepisać podanego przez niego jednolinijkowca do Javy.

(doseq [linia (map (fn [[h s]] (str h " (" s ")")) (partition 2 [1 2 3 4 5 6 7 8 9 0]))] (println linia))

Java to nie jest mój ulubiony język, więc postanowiłem sprawdzić jak by dało się to zrobić w Pythonie (który posiada lekkie wsparcie tego paradygmatu funkcyjnego).

Do dzieła

Na początek mały problem – Python nie posiada wbudowanej funkcji partition. Trzeba ją samemu napisać. Na przykład tak:

def partition(size, seq):
    result = []
    for i in seq:
        result.append(i)
        if len(result) == size:
            yield tuple(result)
            result = []

Uwaga: to jest odpowiednik clojure.core/partition(n coll). Nie obsługuje ani step ani pad.

Potem już idzie z górki:

print "\n".join(map(lambda t: "%i (%i)" % t, partition(2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0])))

Można to napisać nawet bardziej w stylu Pythona (poprzez zastąpienie funkcji map i lambda przez listę składaną):

print "\n".join(["%i (%i)" % t for t in partition(2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0])])

Programowanie funkcyjne?

Kod, który w Clojure zajmował 106 znaków dało się skrócić do odpowiednio 92 i 87 znaków.

Co więcej udało się z niego usunąć efekty uboczne i sekwencyjność wprowadzoną przez doseq. Cały napis jest budowany w pamięci a dopiero następnie wyświetlany – co jest bardziej funkcyjne.

W Clojure dało by się to zrobić za pomocą kodu:

(println (apply str (interpose "\n" (map (fn [[h s]] (str h " (" s ")")) (partition 2 [1 2 3 4 5 6 7 8 9 0])))))

Przy okazji: to jest prawdopodobnie pierwsza linijka mojego kodu w tym języku więc mogła by być lepsza.