Setup of Lem

Raspberry Pi 4の「特定の解像度でWi-Fiが不安定になる」問題を実際に検証

ふむ、特定の設定でspam電波の発振器になるんか。オイラーのHPのタイトルは、Ham es Spamなんだった事を思い出した。

Hamは食べるハムじゃなくてHam Radioの方ね。esは電信用語でandって意味。そしてSpamは、スパムメールから借りて来たもの。迷惑電波とか毒電波ね。 当初予定してた無線の事を主体にする積りが、方向違いのソフトの方に向いちゃった。まあいいか。

無線屋としては、そんな毒電波発生器よりも、 Wi-Spy DBx 2.4 and 5 GHz bandsの方に興味が有るぞ。

帯域が2.4/5Ghzしかない特定用途品にしては随分高価だな。TV電波受信用のドングルだと、ずっと安い製品が有ったはず。住む世界が違うと、高価格でも売れるって事だねと、無銭家が言っております。

scheme slime

chaton/Gauche を久しぶりに見ていたら、不穏な語句を目にした。r7rs-swank ですって。これはひょっとして、slime系でr7rsを動かしちゃえって試み? しかもこの話題がgaucheの掲示板に載るって事は、gaucheでslimeしちゃえって事だろうね。

この語句で聞き込みしてみると、

Gauche:Lemエディタ

なにやら、lemって言う新種のeditorが有るって事らしい。そして、そのeditor用に、各種schemeが参加出来るようだ。

Swank server for r7rs Schemes

なる程ねぇ、前回やったgeiserよりも統一理論が幅を利かせる世の中になってるのね。

lem

どうやらlemってやつは、commonlispで書かれた、emacs似のeditorとな。わざわざこんな物を発明するって、能力の無駄使いじゃと思ったよ。

いや、emacsの遅さに辟易したlisperが、新理論に基づて開発したとな。commonLispなら、コンパイルすれば速くなるでしょ。更にコンパイルした環境をcore dump しとけば、次回の起動時には、そのcoreをメモリーに展開するだけで良くなる。結果、キビキビと動くとな。

これぞCLのキラーアプリじゃなかろうか。あれ? もうmaximaを忘れているよ。

なら入れてやろう。としたんだけど、CL用のパッケージマネージャーからしか、入れられないみたい。rosとか言うコマンドを叩くらしい。そしてそのマネージャの名前がroswellさんとか。

roswellを使って環境構築

roswell install

Roswell - Common Lisp environment setup Utility.

CLもパッケージマネージャーは流行り廃りがあったけど、これが決定打ですかね。 で、i386なマシンに(debian 10.2)roswellを入れたよ。

Lem is the editor/IDE well-tuned for Common Lisp.

そしてお目当てのlemも入った。

export PATH=$PATH:~/.roswell/bin
lem hoge.lisp

こんな風に使うとな。起動すると、初回はごにょごにょやって、下記案内が出てきた。

Swank server running on sbcl 1.5.9

2回目からはすんなり起動するけど、M-x slimeではちと待たされる。

debian:tmp$ ps a | grep sbcl
11738 pts/2    Sl+    0:00 /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/bin/sbcl --core /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/dump/lem-ncurses.core --noinform --no-sysinit --no-userinit --disable-debugger --eval (progn #-ros.init(cl:load "/usr/local/etc/roswell/init.lisp")) --eval (ros:run '((:eval"(ros:quicklisp)")(:script "/home/sakae/.roswell/bin/lem-ncurses""har.lisp")(:quit ())))
11830 pts/2    Sl     0:01 /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/bin/sbcl --core /home/sakae/.roswell/impls/x86/linux/sbcl-bin/1.5.9/lib/sbcl/sbcl.core --noinform --no-sysinit --no-userinit --eval (progn #-ros.init(cl:load "/usr/local/etc/roswell/init.lisp")) --eval (ros:run '((:eval"(ros:quicklisp)")(:system "swank")))

やっぱり、coreを呼び戻している。pid 11738がクライアントで、pid 11830がサーバーになってる。

debian:tmp$ lsof -p 11738
  :
sbcl    11738 sakae    0u   CHR  136,2      0t0        5 /dev/pts/2
sbcl    11738 sakae    1u   CHR  136,2      0t0        5 /dev/pts/2
sbcl    11738 sakae    2u   CHR  136,2      0t0        5 /dev/pts/2
sbcl    11738 sakae    3u   CHR    5,0      0t0     7457 /dev/tty
sbcl    11738 sakae    4r   REG    8,1      662  8399863 /home/sakae/.roswell/bin/lem-ncurses
sbcl    11738 sakae    5r  FIFO   0,12      0t0    82127 pipe
sbcl    11738 sakae    6u  IPv4  81587      0t0      TCP localhost:53124->localhost:57328 (ESTABLISHED)
sbcl    11738 sakae    7u  IPv4  81589      0t0      TCP localhost:57328->localhost:53124 (ESTABLISHED)
sbcl    11738 sakae    8w  FIFO   0,12      0t0    82127 pipe
sbcl    11738 sakae    9u  IPv4  82166      0t0      TCP localhost:39182->localhost:4005 (ESTABLISHED)

TCPの相互接続は分かるんだけど、サーバーの4005へ向けた接続って、昔々のslimeの名残なんかな? 以前に培った、盗聴技術を駆使してスパイしてみるかな。

C-x C-b

%-         har.lisp      /home/sakae/har.lisp
%%         *Buffer Menu* NIL
%-         *lisp-repl*   NIL
--         *tmp*         NIL
%-         *Messages*    NIL

NILって、やる気がNILなんかな? ああ、違ったFileにbindされていないだけだった。とんだ早とちり。

一つ、気にいらない事が有る。Windows10側からputtyな端末でloginしてるんだけど、lemのstatus行と言うかmode行に背景色が付かないんだ。勿論、debianのDesktop上で使う端末では、色が付く。灰色ぽい背景色。

常用はputtyなんで、何とかしたい。その前に他のOSでも使えるかだな。debianしか使えなかったなんて事だと、そんなの棄てるしかないからね。

lem on CentOS

と言う事で、CentOSで試してみます。roswellがちゃんとインストール出来るかが鍵と思うよ。

Building from Source(On Debian/Ubuntu, in a nutshell)とかの解説しか無い。それ以外のlinux使いはlemなんて言うとんがった奴は使わんで宜しいって事なんだな。

sudo apt-get -y install git build-essential automake libcurl4-openssl-dev

これをCentOS用に読み替えればいいんだな。automake libcurl-devel が新規っぽいので入れた。また、先人の話では、ncursesのv5とv6が有るんだけど、v6はトラブルの元になるんで避けるようにとの事。調べたら両方入ってた。でも、いじわる対策で、 ncurses-develも先回りして入れた。これで準備万端。

すんなりインストール出来て、lemも無事に動いた。

で、問題のモードラインの背景抜けは、当然の事ながら発生する。ぐぐったら、 lemの設定についてメモ書き なんてのが出て来た。~/.lemrc に、設定をごにょごにょと書いて行くらしい。

カラーのテーマとな。どうやらデフォのemacs-darkってのが有って、それを継承するとな。 でも、モードラインの場合は? 言及されていないって事は、オイラーみたいな使い方をしてないって事だな。emacs-darkを手掛かりに、ソースを探れ。どうせCL語で書いてあるっしょ。

/home/sakae/.roswell/local-projects/cxxxr/lem/lib/core/color-theme.lisp

(define-color-theme "emacs-light" ()
  (display-background-mode :light)
  ;; (foreground "#000000")
  ;; (background "#FFFFFF")
  (minibuffer-prompt-attribute :foreground "blue" :bold-p t)
  (region :foreground nil :background "#eedc82")
  (modeline :background "#666666" :foreground "white")
    :
(define-color-theme "emacs-dark" ("emacs-light")
  (display-background-mode :dark)
    :

modelineは、emacs-light側にしか設定が無い。しかも背景は直値の設定になってる。 M-x load-themeでテーマを切り替えられるんだけど、どちらを選んでも、同じ設定が採用される。多分、puttyは直値の表現を受け付けられないので、無視しちゃうんだろうね。

color.lispにXorg公認の色名が有ったから、それを使えば間違い無いだろう。

で、そんな設定を書いたんだけど、さっぱり反映されない。何処かで間違っている? 疑心暗鬼。M-x lisp-load-file で、強引に読み込んであげると、ちゃんと色が付く。

さて、initファイルの読み込みに優先順位が有るのでは? そんな細かい事はソース嫁だろうね。

lem/lib/core/init.lisp

(in-package :lem)

(defun load-init-file ()
  (flet ((test (path)
           (when (probe-file path)
             (load path)
             (message "Load file: ~a" path)
             t)))
    (let ((home (user-homedir-pathname))
          (*package* (find-package :lem-user)))
      (or (test (merge-pathnames "init.lisp" (lem-home)))
          (test (merge-pathnames ".lemrc" home))))))

ふむ、init.lispが有ったらそちらを優先して、満足しちゃう設定なのね。r7rs系を、~/.lem/init.lispに書いていたんで、効果が.lemrcまで届かなかった訳だね。

(base) [sakae@c8 ~]$ cat ~/.lem/init.lisp
;;(setf (variable-value 'lem.line-numbers:line-numbers :global) t)

(define-color-theme "my-theme" ("emacs-dark")
  (modeline :background "dark gray" :foreground "black"))

(load-theme "my-theme")

(setf lem-scheme-mode:*scheme-swank-server-run-command*
      '("gosh" "-A/home/sakae/.lem/r7rs-swank-Gauche-custom"
         "-e(begin (import (gauche-swank)) (start-swank ,port))"))

今後の事も有るんで、設定は全て init.lisp にまとめる事にした。その方が混乱無いよね。

思い出した、以前 TeraTermを使った時、やはりmodelineの背景が抜けていた。上記の設定を施すようにしたら、ちゃんと背景が出てきた。TeraTermってMetaキーが初期設定ではOFFになってるのね。設定のキーボードの所でONにしておこう。これでputtyの代わりを務められるな。

所でlemの作者さんは、cxxxr とlisp屋さんらしい名前で出てる。xxxの所に何を入れるのがお好み? 聞いてみたい。caddr ? cdadr ?

https://g000001.cddddr.org/ さんなら知ってる? gsym1番とは()いいな。ああ、勿論()は、かっこいいと呼びます。決して、カッコ、コッカと発音しないで下さい。

I want dired in lem

lemにemacsのdired(みたいなの)が無いのかなあ。オイラーの場合、emacsを使ってる時間の95%はdiredのお世話になってるからね。dirを辿って行ってファイルの閲覧。putty上でこれをやるには、diredに限る。

contribにfbarってやつが登録されてた。残念ながら非常に使いづらい。期待したrosから探してみようとしたが、rosはそんな方向に向いていない。オイラー的にはpythonで言うpipと思っていたんだけどね。どうやら、penvって方向みたいだ。

んな訳で、何でも有るpythonで言うanacondaの役割をlemに求めた訳だ。emacsは正に文字文化のanacondaだからね。(最近は、イメージも処理出来ますとか、道を踏み外してる気がしないでもないけど)

で、世に問うてみた。lem用のファイルブラウザーは無いかと。 そしたら、噂をすれば影じゃないけど、

Lem使ってみた

重鎮に出会ってしまったぞ。この記事、面白いんで、ふむふむと頷きながら読んでますよ。(これも、道を踏み外していると言うか、道草してると言うか。。)

それにしてもlemの開発者って、人のソースには目もくれず、ガシガシとコードを書く人の集まりなんだな。

素人の要望も聞いてよね。素人ついでに、lemの由来を想像してみる。 これはもう、Lisp EMacs から取ったに違いない。

まて、emacsもelispから出来ているぞ。でも、elispには裏表が有るんよ。肝心な部分はC語崩れのlisp風に書かれた暗号(みたいなもの)だからね。

その点、lemには裏表が無いぞ。全部commonlispで書いてあるからね。読む苦労は雲泥の差になって現れます。

だったら、欲しい機能を自分で作れ。ごもっともです。fbarを土台にminiDiredを書けよ。

directory-mode

幾らなんでも、dirを巡ってファイルを見るなんて、基本中の基本だ。気を取り直してソースをぐぐってみた。

lem/lib/core/directory-mode.lisp

(define-key *directory-mode-keymap* "q" 'quit-window)
(define-key *directory-mode-keymap* "g" 'directory-mode-update-buffer)
(define-key *directory-mode-keymap* "^" 'directory-mode-up-directory)
(define-key *directory-mode-keymap* "Return" 'directory-mode-find-file)
(define-key *directory-mode-keymap* "Space" 'directory-mode-read-file)
(define-key *directory-mode-keymap* "o" 'directory-mode-find-file-other-window)
(define-key *directory-mode-keymap* "n" 'directory-mode-next-line)
(define-key *directory-mode-keymap* "p" 'directory-mode-previous-line)
(define-key *directory-mode-keymap* "m" 'directory-mode-mark-and-next-line)
(define-key *directory-mode-keymap* "u" 'directory-mode-unmark-and-next-line)
  :

慣れるまで大変そう。

etc

Gaucheでの文字列の作り方のメモ