新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

Polyphony と Jupyter

Polyphony 用に Jupyter の環境を用意しました。 binder で起動できます。

sinby.page.link

では Google Colaboratory ではどうでしょう? Fifefox では upload できないという Issue があるみたいですが、、、

おーうまくできました。Python のコードからコンパイルして Verilog を生成しました。 f:id:ryos36:20190314004343p:plain

Ningle つかってみる

blog.8arrow.org とりあえずはこれでできるらしいぞ。

f:id:ryos36:20190310001554p:plain

おーできたできた。一部、改変が必要だったけど。

  • cl-project が使えなかった。まぁいいや
  • templates ディレクトリ以下に、、、ソースは entries.html になっていたので修正。
  • getf 、、、getf の形式(プロパティ?) でなかったので assoc に置き換えた。

もちろん 20 分じゃできない。でも 2H はかからないかな。そのあと fcgi と連携させるというところまでできた。

clisp で cl-smtp が使えない、sbcl で ironclad がコンパイルできない

cl-smtp

どういうわけか clisp で test がコンパイルできない。 define-cl-smtp-test というマクロが実行できない。正確にはその中で rfc2045-q-encode-string-to-stream が使えない。これは export こそされていないが cl-smtp 内の関数。たぶん、clisp の package が順序悪く?でもなっているのだろう。ほかのパッケージは大抵 test を別パッケージにしているからね。そうすべきなんだと思う。 ってことでコメントアウト

format がおかしい

clisp の format がおかしい。(format t "X-Mailer:~a" (format nil "~a~%~a" (lisp-implementation-type) (lisp-implementation-version)))みたいにすると余計な改行を入れる。sbcl では起きない

X-Mailer:
CLISP
2.49.60+ (2017-06-25) (built on lgw01-amd64-012.buildd [127.0.1.1])
NIL

このおかげでヘッダーが壊れてしまう。適当に修正。postfix 経由でメール発信できたから良し(ベネ)とする。sbcl ではきれいに動くから良しとする。

sbcl で ironclad がコンパイルできない

理由は不明。sbcl の内部の問題と思われる。1.4.10 まではうまくコンパイルできる。現時点の、最新の 1.5.0 でもだめだね。も~。

そうか lack を使うのか、、、

clack をつかっていて clack は単なる引き渡しルーチン(アダプタ?)であることが分かった。lack の builder というのをつかうのね。middleware というものが定義されていて、実用的な?ものがそろってそう。名前からの憶測だけど。誰も語っていないのでソースを読んだ人しかわからないだろうな。

  • Lack.Middleware.Accesslog
  • Lack.Middleware.Auth.Basic
  • Lack.Middleware.Backtrace
  • Lack.Middleware.Csrf
  • Lack.Middleware.Mount
  • Lack.Middleware.Session
  • Lack.Middleware.Static

ここが比較的わかりやすかった。深堀を(私が)読みこなせてない。 diary.wshito.com

common lisp で venv 的なことを

ASDL で出来るのだろうなと思い調べてみるとありますね。

diary.wshito.com

この通りにやるとできます。ASDF の Ver3 に移行したので、すでに .config/common-lisp/source-registry.conf.d をつかってます(てのはすでにブログに書いた) asdf を久々に使う - 新千葉 ガーベージ・コレクション

さて、あとは動的に出来るはず。禁じ手的な asdf:central-registry を書き換える(これは Ver2. の手法なのでおすすめされていない) がありますが(通常の registry より後方互換のために先に読まれる模様)

asdf:initialize-source-registry で設定すれば動的に出来ます。はい。その際に DSL (S 式だけどこの ASDF アプリローカルな記述ね) を使えば、あとからロードパスを設定出来てそれは優先順位的に先に設定されるもよう。引数には :inherit-configuration か :ignore-inherited-configuration を設定する。前者は既にある設定を引き継ぐ(つまりいま設定しようとしている値を足す)、後者は既にある設定を無視して新たに設定しなおす。

DSL の詳細はこちら ASDF マニュアル

あと asdf.conf というファイルを置いておくと自動的に読み込まれるみたいね(試してない。既出の wshito さんのページ 参照の事)

ということで、ローカルにプロジェクトをダウンロードして自分でディレクトリ設定してそこにバージョン違いのものを入れておけば、複数の違うバージョンのものがインストール可能。

ついでに書くと asdf:user-cache を上書きすると、普段は ~/.cache/.... の下にコンパイルされたオブジェクトが置かれるけど、それを変えることが出来る。

(setf asdf:*user-cache* #P"/home/user/Works/my-cache/")

こんなかんじ。 あ~これ便利だわ。

docker のイメージをつくる

sbcl 用と clack + fcgi の docker イメージを作りました。hub.docker.com に登録しました。どちらも日本語対応しているつもり。

あれ?でも外から見えないような。あ~みえたみえた。

perl の locale failed

なんかしらんが ubuntu ( Linux subsystem だったりするが ubuntu 全般だろう) で perl を使うと failed とか言われる。

> perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

.cshrc には (bash じゃない!!) には LANG の設定しているがどうやらシステムでちゃんと設定しないとだめらしい。最初 /etc/locale.gen を”直接"編集しようと思ったがいくらなんでもこれじゃだめだろう。さがせば答えがあるね。

qiita.com

> sudo apt-get install language-pack-ja
> sudo update-locale LANG=ja_JP.UTF-8

これでどうよ?

> perl -v
This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux-gnu-thread-multi
(with 67 registered patches, see perl -V for more detail)

Copyright 1987-2017, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

おー大丈夫になった。

とりあえず hunchentoot ふたたび

ubuntu で試す

sudo apt install cl-hunchentoot でいけます。 インストールしただけだと何も使えません。悪いことに ubuntu のパッケージからは test が削られてます。まずは”素”の hunchentoot を動かします。

acceptor で動かす(ほとんど素)

#-:asdf (load "/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
(require :hunchentoot)
(require :cl-who)
(setq hunchentoot:*hunchentoot-default-external-format*
     (flex:make-external-format :utf-8 :eol-style :lf))
(setq hunchentoot:*default-content-type* "text/html; charset=utf-8")

(hunchentoot:start
      (make-instance 'hunchentoot:acceptor :port 4242))

これで動きます。 localhost:4242 にアクセスして welcome のページが見れればまずは OK です。 f:id:ryos36:20190228152021p:plain

さて、これどこを見ているかというと、default の root というのが”コンパイル時"に決まるようになっていて、ubuntu で標準にいれれは /usr/share/common-lisp/source/hunchentoot/www です。 参考までに書くと make-instance 時に :document-root を指定すればそこが標準の root になります。

  (make-instance 'hunchentoot:acceptor :port 4242 :document-root "/home/WWW")

easy-acceptor で動かす

cgi 的なことが簡単にできます。easy と書いてありますが、あまり細かい設定をする必要がない場合、というかたいていの場合ではこちらを使うことになるかと思います。素の acceptor は本当に素で(機能的に分離したようだ)、dispatch-table 的なものすらありません(たぶん)。なので、acceptor を単純に使おうとすると、”恐らく"自分で handler を書き直さないといけなくて、その場合は acceptor を継承した class を作る必要がありそうです。 以前の hunchentoot は dispatch-table を自分で頑張って書いていた印象がありますが(うろおぼえ)、easy-acceptor を使えば handler を定義するだけで OK です。

#-:asdf (load "/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
(require :hunchentoot)
(require :cl-who)
(setq hunchentoot:*hunchentoot-default-external-format*
     (flex:make-external-format :utf-8 :eol-style :lf))
(setq hunchentoot:*default-content-type* "text/html; charset=utf-8")

(hunchentoot:start
      (make-instance 'hunchentoot:easy-acceptor :port 4242))

(hunchentoot:define-easy-handler (say-yo :uri "/yo") (name)
  (setf (hunchentoot:content-type*) "text/plain")
  (format nil "Hey~@[ ~A~]!" name))

はい clisp でも sbcl でも ubuntu 上で動きました(追記: clisp 不安定。sbcl がおすすめです)。localhost:4242/yo にアクセスできれば OK です。localhost:4242/yo?name=yoyo などとラッパーの掛け合いよろしく遊んでください。 上のソースは実験的に start を先にしていますが、通常は逆でしょうね(start が後)。

古い情報に注意しましょう

この blog は 2019/2/28 に書いてますが、私はその情報で右往左往しました。 たぶん hunchentoot のバージョンが上がったことによる差異でしょう。今後は hunchentoot を使う時はパッケージ作って、バージョンチェックしないとダメかも。

まずは hunchentoot:start-server を使っているもの。相当古いので使えません。(私が知っていたのはこのあたり) 2008 年頃の blog に見ることが出来ます。 2011 年頃は、情報が途中ですね。acceptor だとたぶんほとんどと何もできません。サーバが立ち上がるので間違ってはないのですが。いくつかのサイトは acceptor をつかっています。easy-acceptor じゃないと動きませんでした。たぶん、いまや easy-acceptor でないと動かないと思います。

いろいろ調べる羽目に

動かすためにいろいろ調べる羽目になってしまいました。まずは asdf の設定を変えました。keen さん?とかを参考に ~/.config/common-lisp/source-registry.conf.d/ をつくり、10-systems.conf に (:tree "/usr/share/common-lisp/source/") と書いてます。そこで 00-debug.conf とかつくって (:tree (:home "Lisp/")) として、そのディレクトリに git から hunchentoot と usocket を持ってきました。usocket を持ってきた理由は、新しいバージョンの hunchentoot が新しいバージョンの usocket に依存していたためです。(めんどくさ~~い) これで最初は log-message* 関数を使ってログを出し(エラー出力に表示される)、最後はソース読んで改変して動きを確かめました。一苦労でした。