Ulubione polecenia

2008-08-05, hack

Poddaje się modzie i prezentuje najczęściej używane polecenia:

rafal@delta:~$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' | sort -rn | head
100 cd
96 git
85 ls
22 ssh
13 otp-md5
12 ping
11 pwd
9 less
8 ssh-add
8 ./client

Zrób to sam - biurko - mnml-1

2008-07-09, hack



Zrobiłem sam, bo nie mogłem znaleźć odpowiedniego. W Ikei nie było wymiaru, a w Bo Concept było za drogo.

Różne pendrive’y w Ubuntu

2008-06-28, hack

Ubuntu w swej zajefajności montuje dyski USB w katalogu /media/disc. Punkt montowania, można zmienić nadając systemowi plików etykietę. Dla ext3 robi się to poleceniem tune2fs. A przypadku VFAT’a, popularnego na pendrive’ach, poleceniem mlabel, np. tak:

mtools -i /dev/sdb1  ::firmowy

Różne punty montowań dla różnych urządzeń ułatwiają pisanie skryptów, bakupu, czy montowania zaszyfrowanego systemu plików.

Nowe Ubuntu, nowy błąd

2008-06-12, common-lisp, hack

Czasem koduję wieczorami w Common Lispie. Od jakiegoś czasu zauważyłem spadek sprawności używania Emacs’a. A, to jakaś funkcja się nie uruchomiła, albo uruchomiło się coś innego. Myślę, może zmęczenie, albo starość :-). Okazało się, że jest zwykły błąd w Ubuntu 8.4.

W miejsce Capslocka mam Control. Jest to bardzo wygodnie. CapsLocka prawie nie używam, a Control pod Emacsem to podstawowy klawisz skrótu. Konfiguracji tej używam od jakiegoś czasu, pewnie od paru lat.

Po aktualizacji systemu wykryłem, że naciśniecie CapsLocka działa czasem jak kombinacja CapsLock + Control. Czasem, to znaczy jedynie pod Emacsem. Innym programom widać jest to obojętne.

Rozwiązanie jest prymitywne. Dodajemy następujące linie do skryptu uruchamianego podczas logowanie się:

xmodmap -e "remove Lock = Caps_Lock"
xmodmap -e "add control = Caps_Lock"

backup-disk - kopie zapasowe dla leniwych

2008-03-13, hack

Na swoim blogu sławny JZW opisał metodę robienia backupów: Jamie Zawinski: backups. Metoda nie jest za bardzo wyrafinowana. Polega na kopiowaniu danych na drugi dysk przy użyciu rsync’a. JZW zaleca dodać stosowne wywołanie rsynca do cron’a i mieć backup z głowy.

Nie utrzymuję komputera włączonego non-stop, a i dysk z backupem jest podłączany tylko czasami. Zatem, zrobiłem trochę inaczej :-).

W ubuntu, jak się podłączy dysk przez USB, to jest on automatycznie montowany w katalogu /media/jakaśnazwa. Gdzie “jakaśnazwa” to etykieta, którą można zmienić:

tune2fs /dev/sdb1 -L dysk-na-bakup

Napisałem skrypt, który to sprawdza czy pojawił się taki dysk. Jeśli się pojawił to kopiuje na niego ważne dane. Jak się kopiowanie skończy to go wyłącza (sdparm). Wiadomo, kiedy można odpiąć dysk i odstawić na półkę. Żadnych progress-barów, czy komunikatów via xmessage :-)

Skrypt jest tu: backup-disk. Jak będą chętni to napiszę README :-)

blipbot - na początek feed2blip

2008-03-08, hack

Na blip.pl jest user blipbot który czyta feedy i zapodaje najnowszy wpis w swoim statusie. Na razie czyta myslalemze.pl, na prośbę kolegi S. Potem może będzie czytał inne :-).

Wielce zaawansowana treść skryptu jest tu feed2blip.git.

Muzyczka

2008-03-02, hack

Jako, że muzyczka deepmix.ru w niektórych miejscach nie jest dostępna, bo nadają na porcie 8040. Postanowiłem przepuścić muzyczkę przez mój serwerek i wystawić po standardowym porcie 80 :-). Wszystko przy użyciu lighttpd.

Oto konfiguracja:

$HTTP["host"] =~ "deepmix.ru.mp3.nablaone.net" {
        proxy.server = ( "" => (("host" => "85.21.79.5",
                                "port" => 8040)))

}

Nie zadziałało. Postanowiłem, zając się tym na drugi dzień.

I się nie doczekałem, serwer zdechł. Lighttpd próbował wciągnąć cały strumień do pamięci. Wystąpił OOM i jąderko pozabijało losowo procesy. Grrr. A taki był ładny uptime. Ponad 150 dni.

SLIME - konsola do aplikacji produkcyjnej

2008-02-19, common-lisp, hack

Utrzymuję na serwerze mała aplikację dino-demo. Wchodzi ona w skład dino, trudno to nazwać frameworkiem, raczej jest zlepkiem różnych bibliotek. Ma to służyć mi do robienia aplikacji w Common Lispie :-). Może zrobię stronę i instrukcję instalacji.

Od czasu do czasu aplikacja się psuje. Ot taka spontaniczna korozja. Spontaniczna, bo wpływu użytkowników nie widać :-). Jak się okazuje, pozostawienie w miarę skomplikowanego sprzętu (sbcl + hunchentoot + swank) samego sobie może spowodować jego degradację. Hmmm.

Dziś popsuła się pula połączeń. Popsuła się w następujący sposób: popsute połączenie nie zostało usunięte z puli. Być może jest błąd w bibliotece Postmodern, być może błędne jest moje użycie. Nie wiem. W każdym bądź razie postanowiłem to naprawić i to nie przez restart lispa.

Do zabawy z Common Lispem używam Emacs’a z SLIME’em. SLIME ma taką miłą cechę, że gada do uruchomionego lispa przy pomocy TCP/IP :-). Zatem mając działającego swanka (lispowa część SLIME’a) na serwerze można się połączym Emacsem do aplikacji produkcyjnej. I to nie przez sendmaila jak to w filmie było, a przez tunel SSH:

ssh -L 4005:localhost4005 nasz.serwer.pl

Następnie w Emacsie łączymy się poprzez

M-x slime-connect

I naprawiamy szkodę:

; SLIME 2008-02-17
CL-USER> (postmodern:clear-connection-pool)
; Evaluation aborted.
CL-USER> postmodern::*connection-pools*
#<HASH-TABLE :TEST EQUAL :COUNT 1 {9444241}>
CL-USER> (setf  postmodern::*connection-pools* (make-hash-table :test ‘equal))
#<HASH-TABLE :TEST EQUAL :COUNT 0 {C2B04F9}>
CL-USER> 

Dostępna jest introspekcja, debugger, modyfikacja danych jak i kodu. Słowem hacking online. Zróbcie to w Javie :-)

Bieda-magnetowid

2008-01-22, hack, lifehack — Tagi:, , ,

Na antypodach dobywa się AustralianOpen. Z racji nowych obowiązków około-korporacyjnych luba nie może oglądać meczy na żywo. Wyszło na to (sam się wkopałem), że te będę nagrywał je na komputerze. Co nie jest rzeczą przyjemną, bo konfiguracja video w Linuxie nie należy do prostych i ciekawych zadań (PixelView PlayTV Pro a Ubuntu).

Na pierwszy rzut poszedł mytvtv. Jest to kombajn robiący z komputera pod Linuxem cyfrowy magnetowid (TIVO). Soft jest niemiłosiernie rozbudowany i co za tym idzie rozwiązywanie problemów jest na podobnym poziomie złożoności. Po paru godzinach walki, przyszedł czas na apt-get remove i po mythtv.

W drugim podejściu postanowiłem poszukać czegoś uruchamianego z linii komend. I znalazłem to How to record tv from command line (without mythtv). Jak trwoga to do mplayera :-)

Oto moja wersja skrytpu:

#!/bin/sh
# record.sh
SEQ=9
DURATION=3600
CHANNEL=23
video="-ovc xvid -xvidencopts bitrate=800"
audio="-oac lavc  "
video="-ovc lavc -lavcopts vcodec=msmpeg4:vbitrate=1800:vhq:keyint=250"
tv="driver=v4l2:device=/dev/video0:channel=$CHANNEL:forceaudio:norm=PAL:chanlist=europe-west:alsa:adevice=hw.0,0:immediatemode=0" 

for i in `seq $SEQ` ; do
    FILE=out/`date +%F_%T`.avi
    mencoder -quiet tv:// -tv $tv $video $audio -endpos $DURATION -sws 1 -o $FILE
done

Uruchamiam go za pomocą polecania at:

rafal@delta:~/work/movie$ at 03:00
warning: commands will be executed using /bin/sh
at> ./record.sh
at> 
job 8 at Wed Jan 23 03:00:00 2008

Teraz pozostaje wymyślić jak zautomatyzować przekazywanie filmów żonie kolegi, która ma podobny problem. Ehh gigabitowy internet by się przydał.

badip - pomysł antyspamowy

2008-01-03, common-lisp, hack

Jakoś ostatnio, tematyka wolnościowa zawładnęła tym blogiem. Co niektórzy mają mi za złe :-). Czas wrócić do geekowskich rozważań i zmniejszyć liczbę czytaczy ;-)

Przeczytałem kiedyś na Code Kata o filtrze Blooma. W skrócie to taka sprytna struktura danych pozwalająca zaimplementować słownik ortograficzny mając do dyspozycji dosłownie kilkadziesiąt kilobajtów pamięci. Postanowiłem, zaimplementować taki filtr i użyć go do składowania listy złych adresów IP (badip). W założeniu plik zawierający złe adresy byłby dostępny publicznie, każdy mógłby go sobie pobrać i zachować na swoim serwerze. Dzięki temu weryfikacja adresu byłaby odporna na problemy sieciowe z moim hostingiem. Nie mówiąc o tym, że dużo szybsza :-). Złe adresy IP byłyby pobierane z różnych źródeł, np. denyhosts.net, listy anonimowych serwerów proxy etc.

Zaimplementowałem filtr Blooma, używając jako funkcji hashujących wyniku funkcji skrótu MD5. Założyłem ustaloną liczbę kluczy (7). Poziom błędu fałszywych pozytywów można regulować tylko za pomocą wielkości wektora bitów.Im mniej stopni swobody tym lepiej. Implementacja jest dostępna md5bloom.

Zacząłem robić infrastrukturę do pobierania list IPików i generowanie w/w pliku badip.bin. Się okazało, że implementacja filtra w PHP nie działa poprawnie, bo operacje matematyczne są wrażliwe na typ numeryczny (w tym przypadku zakresy liczb). Baterie mi wysiadły. Moje przyzwyczajenia z Common Lispa znów okazały się szkodliwe, tam się typy same zmieniają stosownie do potrzeb. Ehhh, człowiek do luksusu działania szybko się przyzwyczaja :-). Teraz rozumiem dlaczego ludzie eksperymentują z algorytmami w językach lispowatych (CL, Scheme), a później piszą translator na docelowy język przemysłowy (vide implementacja GC w C#).

Aha. Usługa będzie dostępna pod adresem http://nablaone.net/badip/. Na początek zrobię prosty plugin do “czegokolwiek” w PHP, oraz dedykowany do Wordpressa. Nie ukrywam, chęci poznania trzewi tego popularnego produktu blogowego.

BTW.
Minął rok jak używam GTD . Dla mnie działa. następna akcja -> poprawić implementacje w PHP :-)

lighttpd i WebDav

2007-12-09, hack

galerie.nablaone.net to nowy blogasek kolegi Adama. Kolega ma się zajmować szeroko pojętą ezoteryczną sztuką seo. Nie wiem czy dobrze na tym wyjdę. Może PR i zysk z Adsense nie spadnie. :-)

Przy stawianiu tego blogaska, pojawił się problem. Rzeczony użytkownik zażyczył sobie dostępu do serwisu po FTP. Odmówiłem. No to chciał po SSH. Cfaniak!. Hmmm. Mój VPS jest bardzo private i kontami się nie dziele :-). Ustaliliśmy, że spróbujemy WebDava. Jest to rozszerzenie HTTP i działa po standardowych portach 80 i 443, przez co są małe szanse, że jakiś administrator zablokuje ruch.

Skonfigurowanie lighttpd okazało sie proste. Trzeba było załadować moduł "mod_webdav". Konfiguracja serwisu jest zrobiona zgodnie z tym przykładem:

$HTTP["host"] == "example.net" {

  server.document-root = "/www/example.net/"
  accesslog.filename     = "/var/log/lighttpd/example.net/access.log"
  server.errorlog           = "/var/log/lighttpd/example.net/error.log"
}

$HTTP["host"] == "dav.example.net" {

  server.document-root = "/www/example.net/"
  accesslog.filename     = "/var/log/lighttpd/example.net/access.log"
  server.errorlog           = "/var/log/lighttpd/example.net/error.log"

  webdav.activate = "enable"
  webdav.is-readonly = "disable"

# wylaczamy wykonywanie skryptow CGI
  cgi.assign = ()

  auth.backend = "htdigest"
  auth.backend.htdigest.userfile = "/etc/lighttpd/htdigest.user"
  auth.require = ( "/" =>
                           ( "method"  => "digest",
                              "realm"   => "example",
                              "require" => "valid-user"))
}

Niestety lighty nie umożliwia ograniczenia dostępu dla poszczególnych metod (tu PROPFIND) i nie można było zrobić jednej wspólnej domeny dla obu usług (publiczne HTTP i WebDav). Stosowna zmienna $HOST['request-method'] ma się pojawić w wersji 1.5.x.

Z dostępem do WebDava nie ma problemu. W Windowsach XP jest ponoć natywne wsparcie, trzeba tylko je włączyć. W przypadku Ubuntu działa z palca, zarówno bez SSL jak i z nim.

Mapa Warszawy z rozkładu jazdy ZTM

2007-11-18, hack



Ciekawy byłem, czy na podstawie rozkładu jazdy komunikacji miejskiej w Warszawie da się wyrysować mapę miasta. Tak w sposób automagiczny. Czyli przy pomocy skryptu :-).

Ze strony ztm.waw.pl można pobrać rozkład jazdy autobusów. Rozkład jest w formie plików HTML o regularnym nazewnictwie. Zawartość plików też jest regularna i nie zawiera “tłuszczu”. Chwali się takie podejście do sprawy. Do generacji mapy użyłem graphiza, który to z pliku tekstowego, zawierającego definicję grafu, potrafi wyrysować obrazek. Sprzęt jest ciekawy i warty poznania. Do przetworzenia rozkładu jazdy na plik a.dot (definicja grafu) służy ten oto skrypt Perlowy gen-ztm-waw-map.pl.

Uzyskana mapa nie jest za bardzo podobna do konwencjonalnych map, ale tak na prawdę to zabawa graphizem była celem tego ćwiczenia :-)

A jakby ktoś chciał zobaczyć więcej szczegółów to tu jest pełnowymiarowy obrazek (~2MB).

Publikacja repozytorium gita

2007-10-28, hack

Pojawił się nowy film z gatunku geek-pr0n Git by Randal Schwartz. Polecam obejrzeć, szczególnie tym co widzieli film z Linusem w roli głównej.

Kolega zarzucił mi, że na blogasku daję tylko linki do linków. Że nie przedstawiam swoich wynaturzeń. Hmmm ma rację. Zatem napiszę coś.

(więcej…)

Nowy Mac OS X

2007-10-21, hack

Ma ciekawy pomysł na robienie backupu i jego odtwarzanie. Szczegóły w prezentacji.

dino - zestaw do robienia aplikacji w lispie - wersja alfa

2007-08-28, common-lisp, hack

Mam wersję alfa zestawu do robienia aplikacji w common-lispie. Nazywa się to ‘dino’. Jest takim “kodem klejem” łączącym następujące elementy w całość:

Dino można pobrać na następujące sposoby:

  • same dino (bez bibliotek i lispa) + proste aplikacje (dla obeznanych z lispem )
    hg clone http://nablaone.net/repo/hg/dino
    
  • dino wraz ze wszystkimi zależnościami, w tym implementacją lisp (dla nowych i/lub leniwych)
    wget http://nablaone.net/repo/dist/dino-2007-08-27.tar.bz2
    tar jxf dino-2007-08-27.tar.bz2
    

Aby przystąpić do hackowania/oglądania wykonujemy następujące kroki:

  1. Przygotowujemy dino do działania (tworzy katalogi, pobiera zależności, kompiluje, etc)
    cd dino
    ./dino prepare
    
  2. Uruchamiamy:
    ./start.sh
    
  3. Przeglądarkę kierujemy na adres http://localhost:4242/. I obserwujemy stronkę domyślnej aplikacji.
  4. Emacsem podłączamy się slimem M-x slime-connect i możemy hackować!

Ludzie mówią, że lisp to taki skomplikowany i trudny jest. A tu proszę 3 kroki i możemy działać. ;-)

A teraz niespodzianka. W zestawie jest również aplikacja demo, taki klon plotkuj.net :-). Aplikacja ta używa bazy danych. Instalacja jest trochę bardziej skomplikowana i jej tu nie zamieszam. Jakby komuś zależało na niej to proszę dać znać.

Następne »
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2008 nablaone.net | powered by WordPress with Barecity