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"

Spotkanie Lispowe w Warszawie

2008-05-07, common-lisp

Rysiek Szopa organizuje spotkanie lispowców w Warszawie. Mam zamiar wziąć udział. Będzie ciekawie. Ciekawe czy przerodzi się to w cykliczną imprezę.

W odpowiedzi anons na grupie comp.lang.lisp, odpowiedział niejaki A.L., znany “troll” amerykanista z grupy pl.regionalne.warszawa. Świat jest mały :-). A wydawało by się, że Lisp to mniejszość mniejszości.

BTW.
Nadal próbuje zrobić swój własny framework/środowisko do tworzenie webaplikacji. Demonstracyjne aplikacje są/będą dostępne pod adresem nablaone.net/wdk/, a źródła wdk. Instrukcji instalacji i uruchomienia brak.

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

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

Bombardowanie Lispem

2007-09-20, common-lisp

Przyłączam się akcji. Bomba: Common Lisp tutorial

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ć.

dino - zestaw do robienia aplikacji w lispie

2007-08-21, common-lisp, hack, web

Od jakiegoś czasu poszukuję i testuję różne biblioteki dla Common Lispa, które to mogły by posłużyć do zrobienia czegoś w rodzaju frameworku webowego. Nie chcę robić nowego frameworku opartego na jakimś tam wydumanym paradygmacie, chcę mieć prosty zestaw narzędzi do robienia mikro i makro aplikacji. Na stronie wiki dino jest lista bibliotek-kandydatów. Selekcja trwa.

Dziś napisałem pierwszą prymitywną aplikacyjkę dino-demo. Taki klon plotkuj.net ;-)

Powiem tak, developowanie w CL (SBCL+SLIME) mam obcykane, szybko, sprawnie mi idzie. Problemem okazał się deployment w szczególności kwestie około konfiugracyjne (połączenie do bazy danych i konfiguracja serwera HTTP). To musi być jakoś sprytnie zrobione.

Ha. Teraz się zastanawiam, czy by tak nie udokumentować procesu developmentu i deploymentu aplikacji ? Taki mini-tutorial.

Mój pierwszy klient blipa

2007-06-25, common-lisp, hack, web

Czekając na wieści od weta, się ważyło czy zwierz będzie 3 czy 4 kopytny, postanowiłem utworzyć prostego klienta blipa. Takiego aby można było dodawać opis. Pierwsze podejście leniwe bash+openssl+nc nie powiodło się z nieznanego mi powodu?? Nie da sie blipa oglądać telnetem/netcatem. Jak tak można ;-). Chyba jakieś zabezpieczenie mają, albo lewą konfigurację. Nie wiem.

Drugie podejście miej leniwe: lisp + drakma. Przeżyłem ręczne pobieranie zależności. Już wiem, o co dodam w następnym kroku do clget’a :-). To podejście się udało. Kod znajduje się tu: blip.lisp.

Teraz mogę dodawać statusy maszynowo, tylko nie wiem o jakiej treści i po co :-). Może ma ktoś pomysł.

A zwierz, pozostanie 4-kopytny :-).

Pożytki ze zrzucenia własnego rdzenia

2007-06-16, common-lisp, hack

Uwaga, wpis bardzo ezoteryczny. Proszę się nie popadać w samodeprecjacje :-)

Jakiś czas temu, jak przymierzałem się do zakupu VPS z ograniczoną jak na współczesne warunki pamięcią operacyjna 128MB, testowałem zajętość pamięci różnych rzeczy. Tak aby zobaczyć, ile kosztuje MB przyjemności :-). Pamiętam, że SBCL + zajmował jakieś 20MB RSS/ 90MB VSZ. Wartość ta była akceptowalna.

Wczoraj skopiowałem tajny projekt dino na mojego VPSa. Uruchamiam i patrze a tu 50MB zjedzone. Co jest? Czyżbym się znów pomylił, jak to było z kursem dolara kanadyjskiego? Otóż nie. Do testów użyłem dino, co operowało na zrzuconym rdzeniu (ang: core dump). A wczoraj ładował biblioteki przy starcie do standardowego rdzenia. Zatem mogę polecić uruchamianie common-lispa z własnego rdzenia. Dwie zalety:

  1. obiekty które są ładowane z rdzenia, są w przestrzeni read-only, po której to garbaty (ang. garbage collector) nie biega, przez co oszczędza sobie pracy
  2. strony rdzenia ładowane są tylko w przypadku gdy są używane, zatem nieużywane fragmenty bibliotek nie zalegają w stercie (ang heap) ani w przestrzeni wymiany (ang. swap)

A teraz krótka instrukcja jak zrzucić rdzeń i potem go użyć.

  1. Tworzymy plik dump-core.lisp z listą ulubionych bibliotek
    (require :asdf)
    (require :sb-posix)
    
    (asdf:oos 'asdf:load-op :swank)
    (asdf:oos 'asdf:load-op :clark) ;; to też tajny projekt ;-)
    (asdf:oos 'asdf:load-op :hunchentoot)
    
    (sb-ext:save-lisp-and-die "my-core.core")
     
  2. Zrzucamy rdzeń:
    sbcl --disable-debugger --noprint --no-userinit --load dump-core.lisp
    
  3. Tworzymy plik startowy start.lisp:
    (clark::start-server)
    (swank:create-server :port 4005 :dont-close t :external-format :utf-8-unix)
    (hunchentoot:start-server :port 4242)
    
  4. Teraz uruchamiany nasz rdzeń z włączonym Hunchentootem i Slimem gotowym do hackowania kolejnego killer-app’a:
    sbcl --core my-core.core --disable-debugger --noprint --no-userinit --load start.lisp
    
  5. Przeglądarkę kierujemy na adres localhost:4242 a w Emacsie
    uruchamiamy M-x slime-connect.
  6. Hack, hack, hack
  7. Zysk :-)

Wyżej wymieniona instrukcja stanie się niepotrzebna, gdy w końcu zrobię wydanie dino. Na razie jeden z komponentów jest już wersji alfa clget :-).

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