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"
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.
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
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
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:
Aby przystąpić do hackowania/oglądania wykonujemy następujące kroki:
- Przygotowujemy dino do działania (tworzy katalogi, pobiera zależności, kompiluje, etc)
cd dino
./dino prepare
- Uruchamiamy:
./start.sh
-
Przeglądarkę kierujemy na adres http://localhost:4242/. I obserwujemy stronkę domyślnej aplikacji.
-
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ć.
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.
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 :-).