nablaone.net: blog | zdjęcia | nasi-fachowcy.net

Cooluary v2 - Gdańsk

2009-06-29, common-lisp, hack, lifehack

Byłem na Cooluarach i było fajnie :-).

Nie pisałem na tym blogu o sprawach około-pracowych. Czas na zmiany. Być może trzeba będzie zmienić podtytuł bloga, na “mało intymny” :-)

Jakoś tak się stało, że unikam konferencji technologicznych. Nie widzę sensu słuchać prezentacji o kolejnej srebrnej kuli, która to uczyni klienta szczęśliwym, a mnie bogatym. Nie wiem, czy wszystkie konferencje tak wyglądają, ale z tego co się zdążyłem zorientować (patrząc na agendy) to większość tak wygląda. Ot współczesna forma sprzedaży wszystko-leczącego oleju z węży dla ludzi z dużym IQ. Poza tym zawsze miałem wrażenie, że taka forma na praktykowanie społecznego dowodu słuszności. Grupa myśli jak ja, wiec to musi być prawda.

Sceptycyzm swój czasem trzeba weryfikować. Trzeba sprawdzać przesłanki. Się natrafiła okazja. Dyrekcja postanowiła wysłać mnie na Cooluary. Tak konferencja która nie jest konferencją, a raczej zjazdem developerów. Jako, że było to w Gdańsku, a i czasem trzeba wyskoczyć ze “strefy komfortowej” nie oponowałem.

Formuła imprezy była intrygująca. Zamiast wykładów, (jeden się stresuje, reszta ziewa, albo czeka na obiad), były grupy dyskusyjne z moderatorem, czy raczej inicjatorem. Czyli bardziej bezpośrednia “horyzontalna” forma komunikacji. Tematy dyskusji były dowolne, (pomijając dwa narzucone przez sponsora). Uczestnicy mogli zgłaszać swoje tematy, które następnie były grupowane i przypisywane do konkretnego pokoju i godziny. Dyskusje odbywały się w 4 pokojach równocześnie w pięciu sesjach.

Zaproponowałem dwa tematy “Clojure - Lisp dla mas”, i “Java - współczesny Cobol“. Dodatkowo miałem pociągnąć jeden z tematów sponsorskich, trochę to ograniczyło moją możliwość uczestnictwa w innych sesjach, a szkoda, bo było parę ciekawych.

Krótki przegląd sesji:

  1. Git - czyli o rozproszonych systemach wersji. Powiem tyle, widać ruch w korporacjach. Lud zaczyna używać i przy następnych awansach programatorów git ma szansę stać się standardem korporacyjnym. Oczywiście jeśli nie wyprzedzi go w tym Mercurial.
  2. Clojure - widać, że jest zainteresowanie. Nie wiem czy wynika to z bieżącego hype’u na języki dynamiczne. Być może. Lispowców tam nie spotkałem, także o common-lisp/scheme vs clojure nie można było podyskutować. Miło było poznać java-sceptyków.
  3. Przeglądy kodu - ciekawa dyskusja, wcześniej nie przykładałem do tego tematu większej roli. Z pomocą nowego narzędzia Atlasiania, można wspomóc proces przeglądu kodu i to nie tylko w tym krytykanckim-audytorskim aspekcie, ale również jako metodą przekazywania wiedzy. Rzecz ciekawa.
  4. Obsługa sytuacje wyjątkowych - nic ciekawego, zdradziłem kto zabił w ciągu 5 minut. Widać było (po frekwencji), że dyskusja o wydajności była ciekawsza, notabene sam chciałem się tam ewakuować, bo temat ciekawszy, bardziej dynamiczny i wieloaspektowy :-)
  5. “Java - współczesny Cobol” połączone z tematem o śmierci Javy. Zebrali się głównie weterani, sądząc po zmarszczkach :-). Wniosek był pocieszający, nie widać konkurencyjnej rewolucyjnej nowej technologii która miała by się rozlać na biznes.

Dzień drugi był bardziej tradycyjny, wykład + warsztaty. Wykład był o pracy jaką znam, bo prowadził go dyrektor działu w którym pracuje. Nie wiem czy do wszystkich trafi pragmatyczne podejście. Nie wiem na ile ludzie umieją się odciąć od profesjonalnie wyglądających produktów architektów astronautów.

Po wykładzie odbywały się warsztaty. Nie było to warsztaty sensu stricte. Raczej pokaz na żywo pewnych możliwości języków. Mówię języków gdyż na takie wykłady poszedłem. Pokazy narzędzi mniej mnie interesują. Było o zupełnie innych dwóch językach.

Na początku o Groovy’m, który to kiedyś mi się nie spodobał, gdyż pochodzi ze stajni przeinżynierowanych projektów. Obiektywnie patrząc, jest to rozsądne narzędzie dla osób nie Unixowych, które chcą pisać krótkie często jednorazowe skrypty rozwiązujące nie-cierpiące zwłoki zadania.

Potem było o Scali. Dziwny ten język. Takie wymieszanie Javy z językami funkcyjnymi. Nie przypadł mi do gustu. Może dla tego, że nie jestem fanem statycznego typowania.

Reasumując było ciekawie. Dyskusje ogólniejsze (procesowe) wydały mi się ciekawsze. Być może dlatego, że o konkretach (języki, produkty) ciężko się dyskutuje, bez wiedzy. Ciekaw jestem kiedy pojawią pomysł zaproszenia do dyskusji interdyscyplinarnych. Przykładowo “Bauhaus vs Wabi-Sabi w architekturze systemów” mógłby być tematem ciekawym. Myślę, że architekci, developerzy i filozofowie znaleźli by spólny język. Pojęcia piękna, prawdy i dobra występują we wymienionych dziedzinach.

TechAula - darcs vs git

2008-12-16, hack

Dzisiejsza TechAula, po raz kolejny uświadomiła mi podział w świecie infromatyki. Naukowcy vs inżynierowie. Ideowcy vs pragmatycy. Patrz dyskusja panów Tannenbaum i Torvaldsa w kwestii monolitycznego jądra.

Darcs reprezentuje to co w nauce najlepsze, piękne idee i dłuuuuugie oczekiwanie na odpowiedź dążące do nieskończoności. Zaś git to co w inżynierii tj. przyziemna, doczesna i obeślna duct-tape-driven-architecture, za to z odpowiedzią w ciągu sekund.

Wybór między darcs’em i git’em jest prosty. Darcs studiujemy, gita używamy :-).

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…)

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