2019年5月9日木曜日

HyperSpecをFreeBSDで

 そういえば 「HyperSpec」もpkgにあったので。

sudo pkg install clisp-hyperspec-7.0

 で、インストール。
 インストール先は

pkg list clisp-hyperspec-7.0

 で、確認してemacsのinit.elに定義した。

(setq common-lisp-hyperspec-root "file:/usr/local/share/doc/clisp-hyperspec/HyperSpec/")

 ふむ。だじょうぶそうだ。

2019年5月8日水曜日

Raspberry Pi 3 Model B+の設定

 RaspberryPi B+にはFreeBSD12をいれるつもりだった。
 しかし、動かない。
 bootすらしない(後日、全然、動くことが判明した1)。
 あかんわー。Ubuntuもあったけど、ちょっとかったるそうだ。というわけで、先代と同じくRaspbianをインストールした。しまった。区別がつかない。せめてケースのカラーリングぐらい別にすべきだった。
 あたりまえのように動く。あたりまえだけど。
 それにしてもこの軽いOS、RaspberryPi以外でもけっこういいかもしれない。
 と、思ったらちゃんと「Raspberry Pi Desktop」というのがあった。

 インストール後、パッケージをコツコツといれていく。
 Debianのパッケージシステム。apt。
 Emacs、postgres——SBCLもあった。1.3.7-1。EmacsのライブラリはRaspbianのパッケージからではなく、Emacs自身のパッケージシステムから。
 SBCLの環境はFreeBSDと同様、quicklispからいれる。
 ちょっととした気の迷いでaptからASDFをいれたのだけど、何かうまく動かせず——というか、SBCLには1.5.1のときのようにASDFが同梱されてなかった——、削除してまず、quicklispをいれたらいっしょについてきた。あ、そうなんだ。
 「~/.sbclrc」に(require :asdf)を追加した以外はほぼ、FreeBSDのときと同じ。
 ところが、このSBCL、threadをサポートしてなくて「make-thread」で落ちる。
 くそおっ。
 SBCLのgithubからソースをもってきてビルドする。
 手順はほぼ、INSTALLというファイルに書いていた通り。ソースからビルドする場合はあらかじめ、CommonLispが必要だという。おもしろい。ところがINSTALLを読んでいたら不吉な一文が。

Native threads. Enabled by default on x86[-64] Linux only, also
available on x86[-64] Max OS X, x86[-64] FreeBSD, x86 Solaris,
and PPC Linux.

 あかんかも。
 何度か試してみたけれど、結局、Threadをサポートした状態にできず。
 自前のプログラムはthread前提じゃなかったっけ。マルチに動かすために。
 しまった、だめじゃないか2

Footnotes:

1

これはこちらのミスで後日、動くことを確認した——けれど、オンボードのwifiを認識してくれず。

2

javaがあるみたいだからABCLならthreeadがサポートされるかもしれない。

2019年5月7日火曜日

CPU割り当て

 不思議なのだけど、Ubuntuだと、バックグランドで動いているpostgresはひとつのプロセスにひとつのCPUが割り当てられているようだった。実際、threadひとつのときは、システムモニタで見ると、ひとつのCPUだけががっつり使われていた——なのに、FreeBSDだとそれが、分散されているように見える。全体的にCPUが使用されている。
 topコマンドで見ても時々、使うCPUが他のものに切り替わっていた。
 これはLinuxとFreeBSDのちがいなのか、それとも用意されているバイナリのposrgresのコンパイルオプションのちがいなのか——。

2019年5月6日月曜日

Threadプログラミングはむずかしい

 Threadごとにconnectionを管理できるようにしたからだいじょうだと思っていた。たしかにThread二つまでは何ともなかった。それを四つにしたらおかしくなった。
 いきなりPREPAREがすでに使われている、とエラーになる。
 ——?
 どうして二つで動いていたものが、四つだと動かなくなる?
 しかもすぐに起きることもあれば、しばらくたってから起きることもある。同じ処理をくりかえしているにもかかわらず。
 三日、考えこんだ。
 使っているライブラリも疑った。
 どうデバックすれば、いいかも思いつかない。タイミングで発生しているのはあきらかで——それを補足するのはどうすれば、いいのだろう。ソース百遍。
 三日目にしてようやく気づいた。
 threadごとに管理しているconnectionはハッシュテーブルを使っている。
 同時にこのハッシュテーブルにアクセスされたらどうなるんだろう?
 あっ、まずいかもしれない。
 ハッシュテーブルがthreadセーフなら別だが——。
 どうやれば、それがわかるのか、わからなかったのでとりあえず対処した。
 「with-lock-held」で処理を排他1
 それでエラーはいちおう起きなくなったように見えた。が、それは頻度が極端に減っただけで起きるときには起きる。あれ?
 これがわからない。謎だ。
 同じPREPAREがすでに使われているというエラーなのだが——たぶんthreadセーフじゃないところがまだ、どこかに残っているのだろう。あるいは使っているライブラリかもしれない。むずかしい。
 これを避ける方法にはsqlを発行しているところをハッシュテーブルのときのように排他処理をかければ、いいのだが……それだと並列処理の意味がなくなってしまう。
 threadひとつだけの場合とかわらないからだ。
 まったくthreadで動くようにしたらthreadにした意味自体がなくなってしまう、という……。
 なんて厄介な2

Footnotes:

1

中身はMUTEXを使っていた。

2

最終的にはエラーが起きているPREPAREを生成している関数だけを「with-lock-held」で整流化してなんとかなった。今のところ、エラーは起きていない。ただしそこで待ちがはいるため、CPUの使用率は全体として80%をこえなくなった。それでもthread一個並みになるより全然ましだけど。

2019年5月5日日曜日

Raspberry Pi 3 Model B+

 また、RaspberryPiを買ってしまった。
 別に現役のRaspberryPiがお亡くなりになったわけじゃないのだけど。
 Beelink S1が熱くなっているのでRaspberryPiの方がましかもしれない、と思ったのだ。CISCよりRISCチップの方が発熱しないという話をどこかで読んだことがある。なので。
 ところがAmazonで同じ値段だったので「Raspberry Pi 3 Model B」ではなく、「Raspberry Pi 3 Model B+」を注文してしまった。そのあと、調べてみると、「Raspberry Pi 3 Model B+」の方が消費電力は大きく——もちろんそれで発熱も大きくなるだろうし——、そもそも電源はちゃんと対応しているものが必要……。
 えっ?
 iPhoneのは使えないの?

 頭を抱えていたらもともと「B」でもiPhone用のではアンペア不足らしい。使えるのは使えるらしいが。ということは「B」のときにいっしょに買った電源はどうなんだ? 調べてみたら3Aあって「B+」に使えることが判明した。
 使ってなかったのでこれ幸い。
 ほっとした。

 それにしてもmicroSDカード、安くなったなぁ。
 へたなハードディスクよりお得かもしれない。
 よくよく考えたらBeelink S1をMaicroSDカードから使えば、よかったんじゃね……RaspberryPiなんて必要なかったんじゃね……。

2019年5月4日土曜日

ASDF on FreeBSD

 SBCLは使えるようになったのだけど、立ち上げるときにWarningがでているのが気になってしかったなかった。しかもどうもASDFがらみ。
 英語なのでわかりませ〜ん。
 とばかりいってもいられないのでGoogle翻訳の片言日本語で読んでみた。

 なんか、ASDFがインストールされているけど、そっちは使わないよ、古かったりするからね、管理者権限があるなら削除した方がいいよ、ちなみに「~/.config/common-lisp/source-registry.conf 」は使えないよ……。

 って書いているような気がする。
 なんか、状況は一致するな。
 でもそもそもASDFを入れた覚えはないんだけど?
 ところが、調べてみたらインストールされていた。どうやらSBCLをインストールしたとき、いっしょに入ったらしい。その証拠に「pkg-delete」しようとしたら「SBCL」までいっしょに削除しようとする。
 おいおい。

 まぁ、実害はなさそうだ。
 いちおうpkgで入ったASDFをいじって見えなくしたらWarningはでなくなったし。解釈はまちがいなさそうだ。Warningは無視する方向にしよう。

 もしかしたらSBCLは独自のPATH構成にしているのかもしれない。それでSBCL対応のパッケージがいちいち、pkgに用意されているのかも。

2019年5月3日金曜日

FreeBSDでCommonLisp

 果たしてroswellにたよらずにやっていけるだろうか。
 なにはともあれ今まで何度も読み返していた「require, ASDF, quicklispを正しく使う」をふたたび、読み返す。いまいち、理解していないんだよなぁ、このあたりの話。roswellにたよってしまっていたのでなおのこと。
 とりあえず、FreeBSD環境にSBCLをインストールした。

sudo pkg install sbcl

 pkgにはほかにも「alexandria」とか、「asdf」とか、もろもろの他、SBCLのパッチがあたっているとおぼしき、バージョンもある。これを使うべきか?
 迷いつつ、SBCLをslimeで使えるように設定して。

(setq inferior-lisp-program "/usr/local/bin/sbcl --noinform")

 立ち上げてみたら「asdf」なんたらの文字が見えた。
 そうか。SBCLの中にasdfが内蔵されているのか。そういえば、ABCLもそうだった。それならpkgでASDFをインストールすることもないか。
 ところがいくらやってみても「~/.config/common-lisp/source-registry.conf 」に定義した内容がcommonlispに反映されない。試行錯誤すること数時間。
 あかんわー。
 自分のミスとは思えない。もしかしたらSBCL内蔵のASDFは「~/.config/common-lisp/source-registry.conf 」は無効になっているのかもしれない。じゃ、どうやって設定すれば、いいんだ?
 「quicklisp1」でもってきたライブラリの場所を認識させたいんだけど2
 つらつら考えて「~/.sbclrc」に設定した。

(asdf::initialize-source-registry
        '(:source-registry
          (:tree "~/quicklisp/dists/") :INHERIT-CONFIGURATION))

 「asdf:find-system」で設定が有効になっていることを確認。
 よし。
 でもREPLで「ql:quickload」が使えないのは不便なので「~/.sbclrc」にさらに設定を追加した。

(load #P"~/quicklisp/setup.lisp")

 あれ、これでroswellからのREPLとほぼ、同じになったんじゃね?
 すくなくともぼくが使うかぎりにおいて。

Footnotes:

1

「quicklisp」はpkgになかったのでhttps://www.quicklisp.org/beta/からもってきて自前でインストール。

2

「~/common-lisp」の下は認識されているから自前のLispはここへ置けば、いいんだけど。

2019年5月2日木曜日

熱暴走

 CPUをぶんぶん回していると、当たり前だけど、熱くなる。
 簡単に水冷化したけれど、これは効果がなかったようで。

 もしかしたらUbuntuがおかしくなったのはそのせいかもしれない。
 昔はそんな経験はあまりしなかったような?
 そういえば、SSD換装をするようになってからのような気がする。
 ありうることだ。
 昔はハードディスクのアクセスがボトルネックになってCPUの発熱が自然と抑えられていた。そういうことかもしれない。今は抑えがなくなってCPUがまじで熱くなっているもかもしれない。
 それならやばいんじゃないか。
 普通のノートパソコンやミニパソコンでぶんぶんCPUを回すというのは。

 Beelink S1はハードディスクにすべきだろうか。
 さて。

2019年5月1日水曜日

XQuartz後日談

 XQuartzにアプリケーションを登録すると、MacBook AirからBeelink S1の「emacs -damon」を起動できる。
 これはよかった。「emacs -daemon」はXQuartzを終了させてもBeelink S1で立ち上がりつづけるからだ。Emacsが一種のサーバになる。これに接続するには「emacsclient」を使うのだけれど、「ssh -Y ほげほげ emacsclient -c」でこれはOK。XQuartzにEmacsが表示される。
 実体は「emacs -daemon」なのでそれまで編集していたバッファとかがそのまま、残されている——なのだけれど、どうやらXサーバに接続する「-c」オプションはemacsclientを終わらせてもXサーバに接続されたままらしい。Xサーバ(XQuartz)を終了させると、「emacs -daemon」がcoreを吐いて落ちてしまう1
 これがターミナル上に表示される「-nw」オプションだと、emacsclientを終了させてもdaemonは動きつづけているし(ここまでは「-c」オプションのときと同じ)、ターミナルを終了させてもだいじょうだ(ここがちがう)。もちろんMacBook Airを終了させてもOKだ。
 ふむ。
 しかたないのでワンクッションいれることにした。
 「ssh -Y ほげほげ」でBeelink S1からターミナル2を立ち上げ、その中で「emacsclient -nw」を立ち上げる。これでEmacs自体はXに接続していないのでdaemonごとお亡くなりにならないだろう。Beelink S1のターミナルならcommandキーをmetaキーと認識できる。ただしクリップボードの共有はできないけれど。
 まぁ、これはしかたないか。
 アプリケーションには次のように登録した。

ssh -Y ほげほげ lxterminal -e emacsclient -nw

 これでemacsclientまで一気に起動される。当たり前だが、起動はやたら速い。

Footnotes:

1

coreを吐いているということはBUGかもしれない。emacs26。

2

最終的にLXTerminalを使うことにした。

2019年4月29日月曜日

roswell

 FreeBSDのpkgにroswellが登録されてなかった。
 portにも見当たらず、しかたなく、githubから直接、もってきてコンパイルする。

sudo make install

 そこまではよかったのだけれど。

ros install

 roswellからのSBCLのインストールに失敗。
 これはGNU Makeが入ってなかったからだけど、そのとき、もってきていたのはSBCLの1.2.7だった。FreeBSDのpkgにはSBCLの1.5.1があるというのに1
 それで考えてしまった。
 roswellスクリプトを使わないのならroswellなしの環境を構築するのもありかもしれない、と。
 でもできるだろうか。
 可能なことはわかっているけれど。

Footnotes:

1

というか、これは誤解だったらしく、roswellはSBCLのサイトのサポート状況を見て使うバージョンを決めているっぽい。

2019年4月27日土曜日

XQuartz

 「ssh -Y」でBeelink S1のemacsをMacBook Air上で使えるようになったのはいいけれど、いちいちターミナルから「ssh -Y ほげほげ」と打つのが面倒だ。historyがあるからそんなに手間ではないといえば、ないんだけど。
 そこでコマンドをXQuartzのアプリケーションに登録した

 おおっ、これは便利じゃないか。
 しかもemacsをdaemonで起動することもできるし。Beelink S1のpoweroffも可能。
 だが、ひとつだけ問題があった。
 それについては以下、後日

2019年4月25日木曜日

ssh -Y ほげほげ emacs

 Beelink S1やRaspberry PiへはMacのターミナルからsshで接続している。
 フォントも好みのものにしているし、基本的には満足なのだけど、二点ほど気に入らないところがある。commandキーをmetaキーに割り当てられないのだ1。AquaEmacsではcommandキーをmetaキーにしているし、キーの配置的にやはりmetaキーはcommandキーのところであって欲しい。
 なのでひんぱんに使うmeta + pを押すたび、印刷のダイヤログが立ち上がってしまう。何をやっておるのか。
 もうひとつはクリップボードの共有ができないということ。
 そこで「ssh -Y」
 Beelink S1で動かしたEmacsをMacBook AirのXQuartz2に表示して使おうというのだ。
 Ubuntuのときはこの手が使えなかった。なぜか、「ssh -Y」が効かなかった。しかし、FreeBSDではできたはず——なのに、どうしてか、「ssh -Y ほげほげ emacs」でエラーになる。xauthがなんとかかんとか。
 うーむ。

 manをあさったり、ググったり。
 不思議なことにFreeBSDならいろいろいじる気になる。なぜだろう。Ubuntuではそこまでやる気になれなかった。調べた結果——わからない。ちゃんと設定しているように見える。
 ふと、/etc/sshd.confのmanを見ていてXauthの設定があることに気づいた。
 そういえば、エラーメッセージにもxauthなんとか、とでていたな。
 そもそもxauthはインストールされているのか?
 されてなかった。
 そういうオチかい!

sudo pkg install xauth

 そういうオチだった。
 いれたら動くようになった。

 これでクリップボードも共有できるし、commandキーをmetaキーとしても使える。なんだ、xauthをいれてやれば、よかったのか。Ubuntuもそうだったのかな? Ubuntuは今や動かないけれど、RaspberryPiを調べてみると——あれ? xauthは入っている。
 しかも昔、RaspberryPiは「ssh -Y」が使えていた
 それなのに今は使えない。
 xauthのエラーメッセージがでる。
 うーむ、謎だ。

Footnotes:

1

optionキーにしか、割り当てられない模様。

2

MacOSで動くXサーバ。

2019年4月23日火曜日

2019年4月20日(土):本栖湖FUNビーチ:晴れ

* Sail:CORE 5.7(NEIL PRYDE) Board:NG ACP 260 Fin:9.5inch

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 14:24-14:30 5分 0.9km 34.54km/h 9.80km/h 35.07
2 14:37-14:58 20分 3.7km 35.42km/h 10.81km/h 39.03
3 15:29-15:50 20分 1.5km 35.82km/h 4.29km/h 22.62

total 46分 6.1km 7.8km/h

 リハビリにはやはり本栖湖だな。
 そう思って山梨へ向かう土曜日。道志みちから山中湖へ下るところで正面にあらわれた富士山を見てビビった。びっしりと雪が残っているのだ。ゴールデンウィークまであと一週間というのに、こんなに残っているのははじめて見た。
 雪解け水が流れこむ本栖湖の水の冷たさを思うと顔がひきつってくる。

 FUNビーチに到着したのは午後二時すこし前だった。
 本栖湖入口ではまだ吹き出していないように見えたけれど、吹いていた。白波も見える。
 いつものセットで出艇。
 ブームの高さとか、ハーネスの位置とか、水の冷たさとか——いろいろあったけれど、とりあえずプレーニングした。何年ぶりのことか(大げさな)。
 ブローがきつく、ダウンをむちゃ引きしたら逆に乗りづらくなってしまった。
 リハビリにはあまりのハードコンディションに涙目になる。ひさしぶりの5.7のセイルでハエ叩きにあうほどだった。しかも寒い。
 ビーチにあがると、歯が鳴って胴震いが止まらない。
 真冬の菊川かよ。防寒対策にライフジャケットを身につけてすこしましになった。けれど、四時前には根性が尽きた。
 全然、楽しくない——楽しむにはやはり体力がいる。
 ボーナスタイムも吹き吹きだったけれど、大部分の人は撤収。
 ぼくもそれにならう。二、三艇だけがやたら走り回っている。これが二十代のころならクタクタになるまでやっているところだけど。クタクタになるのにも体力がいる。

2019年4月21日日曜日

FreeBSD12をインストール

 アップデートしたらUbuntuが動かなくなってしまった。
 一行だけメッセージを表示したまま、ディスプレイのオンオフをくりかえす。なんじゃ? こりゃ? 電源ボタンには反応するので裏では動いていると思うのだが。
 もしかしたら時間がかかっているだけか、と思って半日そのままにしていたけれど、状況は変わらず。レスキューモードでfsckをかけようとしたりしたけれど、できなかった。状況は改善しない。
 ——これだからUbuntuは……。
 もちろんこれは筋違いな腹立たしさだ。今にして思えば、おそらくSSDがお亡くなりになったのだろう1。readonlyでしか、mountできなくなってしまった。そういうことだろう。でもこの半日のあいだに考えた。くそっ、FreeBSDをいれちゃる。もうひとつ持っているSSDに。

 もともとFreeBSDをいれることに乗り気でなかったのは内蔵のWifiを認識しないだろうな、と思っていたからだった。ところがよくよく考えたらThinkPadで使っていたBUFFALO WLI-UC-GN2使えるじゃないか。あれはFreeBSDで使っていたのだから。そう思ったのだが、どういうわけか、それが見当たらない。
 もしかしたらThinkPadを処分したときにいっしょに処分してしまったのかもしれない——ない。

 しかたないな。とりあえず、インストールしてみよう。
 メモリスティックにbootイメージをコピーしながら、ふと気づいた。あれ? 以前はどうしてそうしなかったんだろう?
 あのときは直接、SSDにインストールしたのだけれど。今やっているような手順だったらインストールできたんじゃないか?
 しかも今、FreeBSD11.2をいれるつもりだったのにうっかりFreeBSD12のインストールメディアをつくっている。
 何をやっているんだ、おれは……。

 どうせだめだろうけど、面倒なのでそのまま、FreeBSD12のインストールイメージを使うことにした。BIOSの設定を変更して起動。ブートメニューがあらわれた。しかもインストールの設定画面を進んでいっていくと、オンボードのWifiを認識している! おおっ、BUFFALO WLI-UC-GN2不要じゃないか。それなら真面目に11.2を入れなおそうと、インストールメディアをつくりなおした。
 ところが11.2ではWifiを認識してくれなかった。
 何をやっているんだ、おれは……。

 いやいや。
 12をインストールしようとしなければ、オンボードのWifiが使えることに気づかなかった——そう考えると、不幸中の幸いだったのかもしれない。

 いずれにしてもBeelink S1でFreeBSDが動く!2
 ひさしぶりのFreeBSDだ!
 まだ、sshでLANから入るくらいしか、できないけれど。

Footnotes:

1

後日、FreeBSD12をいれてみたらインストールできたので完全にお亡くなりになったわけじゃなかったらしい。

2

ただしBeelink S1のeMMCを認識できないらしく、何度もリトライしてはtimeoutするのでbootは遅い。

2019年4月19日金曜日

ジョブキューもどき

 Threadごとにconnectionが張れるようになったのだからマルチプロセスでキューイングしたやつをマルチスレッド化してみよう。mailboxというライブラリを使おうとしたのだけど、キューが空だったとき、readで待ってくれない。nilが返ってくる。
 自分でsleepするの1
 ABCLのmailboxは待ってくれるのだが。
 ほかのライブラリはないか、と探してみると、lparallelのqueueなら待ってくれることがわかった。ちょこちょこと組んでみたらあっさりできあがって驚いた。
 これで立ち上げたworker-jobの数分だけ並列でキューが処理される——はず。

Footnotes:

1

mutexを使えば、sleepは必要ないだろうけど。

2019年4月17日水曜日

2019年4月14日(日):検見川浜:曇り

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 15:37.33-15:55.21 17分 1.0km 13.56km/h 3.27km/h 0.00

total 17分 1.0km 3.3km/h

 日本海側に低気圧が入り、日曜はどん吹きの予想だった。
 乗れるだろうか。その心配ばかりしていたら前日には肩透かしの予報になっていた。昼の1時から2時間ぐらいしか、吹かなそう。
 今の自分には2時間ぐらいでのきついくらいだ。
 とりあえず、昼前に検見川の駐車場入り。
 まだ、吹いていないので運転席でケータイをチェックしていたらいきなりゴンと大きな音がした。どうやらすぐそばでセイルをセッティングしていたセイラーがセイルを運ぶときにぶつけたらしい。
 あれだけ大きな音がしたのに完全に無視してそのセイラーはいなくなってしまった。どう反応したらいいか、わからず、呆然としていたので苦情をいう時機を逸っしてしまった。
 車をチェックしてみると、見事に傷がついていた。

 嫌な気分になり、そのまま、帰ってしまおうか、と思った。

 1時になっても風は吹き上がらない。
 2時すぎにすこし風は上がってきたけれど、乗れるほどではなかった。しばらく海を見つめていたけれど、風は上がらない。セッティングしてビーチへだしていたボードを回収して車に納める。
 そのあと、トイレに行ってもどってくると、ハーバーの旗がさっきよりも激しくはためいていた。
 見なかったことにして帰ろうか。
 ビーチで確認すると、白波が沖のほうから入ってきていた。ああ、これはでるしかないなぁ。ボードをふたたび、セッティングしてビーチへ運ぶと——あれ? 白波はどこに?
 しばし呆然としてしまった。
 海ほたるをチェックすると、風速14m。それなら吹くんじゃね?
 そのうち、風が入ってくることを期待してセイルもセッティングし、セミドライに着替えて海へ。海を眺めること、10分以上。だめか。
 あきらめて海に入って半往復してあがった。
 それなのにセミドライを脱ぐとき、足が攣った。

2019年4月15日月曜日

when-let(2)

 when-letは生のCommonnLispにはないけれど、当たり前のようにalexandria1の中にある。swankの中にもあってほかのCommonLispでも見たことがあったような。
 ぼくが思いつくくらいなのだからだれでも思いつくのだろう。
 でもunless-letってないよな。
 どうしてだろう、と考えてすぐに気づいた——そりゃそうだ。

(unless-let (x date)
         body)

 のxってnil一択じゃん。

Footnotes:

1

CommonLispの定番ライブラリ

2019年4月13日土曜日

Threadごとにconnection

 マルチプロセスで並列化したのは、実はThreadごとにDBとのconnectionを張る方法がわからなかったからだ。単純にThreadの中で最初にmake-connectionしていたら落っこちた1
 そうか、*connection*は別空間にならないのか。
 でもどうやれば、いいんだろう。たぶんパッケージもThreadごとになるわけじゃないだろうし。そもそもThreadごとに変数をもてるのか?
 Emacsのバッファローカル変数のように。
 うーん、*connection*をクロージャー化すれば、いけるような気もするけれど、方向性を誤っているような予感がする。で、結局、そのあたりのあれやこれやが解決しないと、マルチスレッドでの並列化は無理だった。
 別にマルチプロセスで問題はないのだけど。
 いや問題はあるのか。ループでプロセスを四個ずつ立ち上げるようにしているので、途中で終了することができない。Ctrl-Cで中断するしかなく、なんか、これが気持ち悪い。
 ググってもわからず、悩んでいるとき、cl-dbiのソースをのぞいたらまさにそういうコードがあった。別に明確にサポートしているわけではなく、それ関係がエクスポートされているわけでもないのだけど、考え方は了解した。
 なるほど、ハッシュテーブルを用意してThread自身をキーにしてconnectionを管理すれば、いいのか。じゃ、こうか。

 *connection*を(conn)に変更すれば、OK——そのはず2

Footnotes:

1

selectしたときに。

2

cl-dbiとbordeaux-threadsを使用。BUGがあった。(conn)をthread safeにする必要があって対応した。

2019年4月10日水曜日

Unitテスト

 やはりUnitテストは書いておくべきだなぁ。
 そう痛感した今日この頃。ある程度の規模になると、ふとした修正が原因で動かなくなったことに気づかないことがある。なのでUnitテストは書いておいた方がいいんだけど、重いUnitテストだと、それを毎回、動かすのがかったるくなって動かさなくなってしまう。
 本末転倒だ。
 で、重いテストを一時的にコメントアウトしたりするのだけど——。
 ——もっといい方法はありませんかね?
 何か手があるような気がするのだけど。
 C言語の「#ifdef」のようなやり方。たしかCommonLispにもシステムごとにコードを切り替える方法があったことは覚えているんだけど、どうすれば、いいか、見つけ切れなかった。たしかリーダーマクロを使ったやり方なんだけど——どうやるんだっけ?
 とりあえず「when」で囲ってその場しのぎをしていたのだけれど。

 SWANKのソースをたまたま、のぞいたときにそれを発見した。
 ——#+nil

#+nil
(defimplementation disassemble-frame (index)
  (disassemble (debugger:frame-function (nth-frame index))))

 おおっ、これだよ、求めていたのは。
 しかもソースコードも色もちゃんとコメントアウトされたようにかわるじゃないか。

2019年4月8日月曜日

並列化、水冷化

 ループで処理をぶんぶん回す、というのはマルチコアのご時世ではあまり意味がないらしい。
 たとえば、Beelink S1はクアッドコアなのだけれど、システムモニターで見ていると、ぶんぶん、動いてくれていない。どうもひとつのCPUだけが酷使されているだけで全体としてはのんびりとしたものになるらしい。閉店ガラガラ。まぁ、当たり前かもしらんけど。
 しかし、ぼくはぶんぶんふり回したい。

 うーむ。それには処理を並列化するしかないかぁ。
 面倒だ。
 とりあえず、マルチプロセスで対応することにした。つまりプログラムを複数、動かして処理を並列化しよう、というわけ。そうすれば、CPUが閉店ガラガラなんてことにはならないだろう。たぶん。
 というわけではじめてrosスクリプトに取り組む。
 シェルスクリプトの感覚で途中までいじってふと、ああ、これはCommonLispなんだ、と気づく。
 なるほど。

 当たり前だけど、一気に10個とか、20個とか、プログラムを起動したらマシンがパンクする。
 ぶんぶんふり回すには同時に動かす数を制御する必要がある
 すると、処理のキューイングと起動したプログラムの死活監視がいる。うーん。そもそもどうやってプログラムが終わったことを検知すれば、いい? 昔、シェルプログラムで似たことをやったときには終了したときにファイルをつくるように仕込んだけど。
 それはそれで面倒なのでプログラムの起動部分をマルチスレッド化することにした。
 プログラムを同期起動してやれば、「プログラムの終了=スレッドの終了」になるはずなので、スレッドの状態を調べれば、なんとかなるのでは?
 ——なんとか、なった。

 軒並、90%ごえ。でも熱暴走しそうなのでとりあえず、Beelink S1を水冷化することにした。

2019年3月31日日曜日

destructuring-bind

 cl-dbiでtime型のcolumnは

((:HOURS 10) (:MINUTES 5) (:SECONDS 0) (:MICROSECONDS 0))

 の形式で返却されてきていた。
 どうしたものか。:HOURSをassocしてsecond? とか、考えて面倒だな、と。
 そういえば、「destructuring-bind」とか、いうものがあるんだっけ。

CL-USER> (destructuring-bind ((- hours)(- minutes)(- -)(- -))
             '((:HOURS 10) (:MINUTES 5) (:SECONDS 0) (:MICROSECONDS 0))
           (cons hours minutes))
(10 . 5)
CL-USER> 

 すばらしい。

2019年3月27日水曜日

format

 cl-dbiから返却されてきたplistapplyを使ってクラスに流しこめることはわかったのだけど、逆はどうすれば、いいんだろう……わからなくてシコシコ自分で変換する関数を書いたりしていたのだけれど。
 たとえば。

CL-USER> (setf wrk '(:|place| "A7" :|count| 3 :|day| 7))
(:|place| "A7" :|count| 3 :|day| 7)

 このplistを要素の間に「=」とかを挿入しながら「"place='A7' and count='3' and day='7'"」に変換する簡単な方法はないものか。
 調べているうちになんか、formatでできそうな気がしてきた。
 これでどうだ。

CL-USER> (format nil "~{~A='~A'~^ and ~}" wrk)
"place='A7' and count='3' and day='7'"
CL-USER> 

 うわっ、あっさりできた。
 すごすぎ。

2019年3月17日日曜日

CommonとE

 ステップ数/時間で考えると、CommonLispはあまり、高い数字ではないかもしれない。三時間ぐらいうんうん唸ってできあがったのが五行ぐらいの関数だったりする。これはぼくの能力に問題があるのかもしれないが、じゃ、それでCommonLispは効率的ではないか、というとそうでもない。
 同じロジックを別の言語——たとえば、javaとか、Cで組むと、あっという間にふくれあがることはまちがいないからだ。
 で、今回、驚いたのはひとつの関数をいろいろいじっていたらいつの間にか、汎用性のあるユーティリティになってしまったことだ。もしかしたらこれ、alexandriaにあるんじゃないか、と不安になるほど。別に業務ではなく、個人的にやっていたプログラムなのだけど1

 こんな経験はじめてだったのでしばし唖然としてしまった2
 プログラミングしているうちにユーティリティができあがってしまったというのは——ここのロジックは共通化できるな、とか気づいてくくりだしたりはよくあることだけど3
 同じLisp族のelispででも経験したことがない。

 どうしてだろう。elisp的には

(require 'cl)

 があるので言語的な差はそれほどないはずなのだけど。
 たまたまなのか、もしかすると——。

 elispだと、関数名などシンボル名のコンフリクトを避けるため、接頭語をつけることが習わしになっている。「org-」とか。CommonLispだとdefpackageで名前空間を分離できるので平気で「select」とか、「check」とかにできる。コンフリクトが起きてしまったときは総称関数化で対応できる可能性も高いし。ユーティリティになってしまったらパッケージの位置を変えるのも容易だ。
 そうやって考えると、案外、defpackageの有無の差は大きくて、固有名になっていないということで心理的に、抽象化が進むのかもしれない。

 ——最終的に。
 そうやってできあがったユーティリティ自体が溶けてなくなってしまったことだけれど4

Footnotes:

1

なので関数の中の変数名とか、汎用性のないumaのままだ(listに変えた方がいいんだろうな)。

2

しばらく気づいてなかった。

3

組みながら考えるのでとくに。

4

CommonLispの関数の直呼び出しで充分じゃんって気づいた。

2019年3月15日金曜日

どーでもいい日々

 Beelink S1のBIOSの設定メニューの出し方がわからなくなった。
 ThinkPadとかは電源をいれてF1キーだったか、F2キーだったけれど、Beelink S1はちがっていた。そのことだけは記憶に残っている。けれど、どうすれば、いいかまでは思い出せなかった。
 ググるしかないかぁ……。情報がネットに残っていれば、いいが。日が経つと、なくなってしまうこともよくある話で。サイトごと消えていたりする。
 待てよ。ブログに書かなかったっけ?
 ——あった

 Emacsの設定とか、ブログに書いていたおかげでよく助かる。
 たいがいうすらぼんやりとしか、覚えていないから。
 そんなこと、メモっておけよ、という話だけれど、ブログにあげると考えなければ、そもそも言語化しないわけで。
 そういうわけで世間的にはどーでもいいお目汚しはつづく。

2019年3月13日水曜日

「Magic TrackPad2」と「Magic Keyboard」はUSB接続でWindowsやUbuntuで使えるか

 BeelinkS1にはWindows10とUbuntuがはいっている。
 なので「Magic TrackPad2」と「Magic Keyboard」が使えるのなら助かる。bluetoothでなくてもいい。USB接続でもいい。むしろその方がいいくらいだ。
 デフォルトで繋がるのはMacBook Airであって欲しいから。
 試してみてみたところ、うまくいった。
 すばらしい。
 さすがにTrackPadのジェスチャアは無理だったけれど。
 意外だったのはタップがクリックと認識されないこと。板を押しこまなくてはならなかった。——まぁ、これはMacBook Airもタップを有効にするまで1そうだったのでそういうものなんだろう。

Footnotes:

1

今はその設定自体がなくなっている模様。

2019年3月11日月曜日

Gnusのnnvirtualで画像が表示されない……

 あいかわらず、RSSをGnusで読んでいるだけど、さすがに多少、グループ化したい、と思ってnnvirtualにいくつかをまとめたところ、なぜか、画像が表示されなくなった。——あれ?
 nnrssのグループから直接、開くと表示されるのだが?
 なんでだ。よくわからん。
 とりあえず、それだと不便なのでGnusのinfoを見たり、ググったりして見当をつけた。gnus-blocked-imagesという変数に設定されているgnus-block-private-groupsという関数があやしい。

(setq gnus-blocked-images nil)

 と、やってみたところ、画像が表示されるようになった。
 たぶん、きちんと設定するべきなのはほかの個所なのだろう。今の状態だと何もかも表示されるだろうから。でもまぁ、今はこれでいいか。読むのはRSSぐらいだし。

2019年3月9日土曜日

windowを表示する場所

 Emacs 26にしてから妙にwindow1の挙動が変だ。
 表示される場所が25のときとちがう。
 どうもwindowまわりの関数が刷新されたようにも見えるのだけれど、よくわからない。固定で特定のバッファを分割表示するようにしている関数がうまく動いてくれなくてストレスだ。調整しようとしてもなぜか、うまくできない。
 うーん。
 ふと「popwin」を無効にしたらうまくいった。
 コンフリクトでもおこしていたんだろうか。

Footnotes:

1

Emacsにおけるwindow

2019年3月7日木曜日

&optional

 たとえば

(defun wrk (x y)
  (* x y))

 という関数があって「y」をoptionalにして(wrk 123)のときは(* x x)を返却するように変更しようとしたとする。

(defun wrk (x &optional y)
  (let ((w (if y
               y
               x)))
    (* x w)))

 としたところでふと気づいた。

(defun wrk (x &optional (y x))
  (* x y))

 これでいいんじゃね?

CL-USER> (wrk 2)
4
CL-USER> 

 なんともあっさり。
 んー?
 としたらこうもできるのか。

(defun wrk (x &optional (x1 (nth 0 x))(x2 (nth 1 x))(x3 (nth 2 x)))
  (+ x1 x2 x3))

CL-USER> (wrk '(1 2 3))
6
CL-USER> (wrk '(4 5 6))
15
CL-USER> 

 ……わけがわからん。

2019年3月5日火曜日

さよならThinkPad X60

 ついに処分。

日付   OS
<2006-11-23 Thu> ThinkPad X60 購入 Windows XP
<2008-06-14 Sat> 拡張ライフ・バッテリー購入 Windows XP
<2010-11-13 Sat> SSD換装 Windows XP
<2010-11-19 Fri> バッテリー購入 Windows XP
<2012-12-28 Fri> SSD死亡 Windows XP
<2013-01-02 Wed> HD換装 FreeBSD 8.3
<2013-10-30 Wed> SSD換装 FreeBSD 9.2
<2013-12-10 Tue> バッテリー購入 FreeBSD 9.2
<2014-04-04 Fri> OSのアップグレード FreeBSD 10.0
<2014-11-21 Fri> OSのアップグレード FreeBSD 10.1
<2017-03-29 Wed> 外付けHDのストライピング化 FreeBSD 10.1
<2017-07-19 Wed> OSのアップグレード FreeBSD 10.3
<2018-01-05 Fri> ディスプレイ死亡 FreeBSD 10.3
<2019-03-02 Sat> リサイクル  

2019年3月3日日曜日

アルバート・ラズロ・バラバシ「新ネットワーク思考——世界のしくみを読み解く」

 見返しにある著者紹介に「1967年トランシルバニア生まれ」「気鋭の若手研究者」とある。
 「1967年」で「若手研究者」かぁ、と思っていたらCopyrightによると、2002年の本だった。
 つまり17年も前。
 なんだ、そういうことか。

2019年2月25日月曜日

3TBふっ飛んだ

 ブレイカーが落ちた。
 3TBの外付けHDにモロ、アクセスしているときにだ。
 ジャーナル付きのファイルシステムだからだいじょうぶだろうと思っていたらだいじょうぶじゃなかった。
 マウントしない。
 色々やってみたけれど、だめ。ぎゃあ。動画や自炊したPDFはここにしか、ないのだが。
 でもなぜか、ずっとアクセスランプが点きっぱなし。アクティビティモニタをチェックしてみたらfsck-hfsとやらが動いている。
 もしかしたら復旧するのか、と一晩、放っておいた。
 朝、起きたらマウントされていた——けれど、早くバックアップしろとメッセージがでている。
 バックアップするための3TBのハードディスクなわけで、それをどこかにバックアップしろとはなんと、ご無体な……。あちらこちらの隙間にファイルをコピーする。さすがに全部は無理で、大部分の動画と写真はあきらめた。
 もしかしたらAPFSに変換したら復旧するかもと甘い期待を抱いたけれど、甘かった。エラーがでた。
 なんとか部分的には元に戻したけど、なんか絶対、いるファイルを消してしまったような予感がする。

2019年2月23日土曜日

thread

 Emacs26から追加されたthreadを試してみる。

(thread-join (make-thread (lambda()"123")))
nil

 あれ? nil?
 ABCLだと

CL-USER> (THREADS:thread-join (THREADS:make-thread (lambda()"123")))
"123"
T
CL-USER> 

 lambdaの返却値を返すのに。多値だけど。
 SBCLもそうだ。こっちは多値じゃないけど。

CL-USER> (SB-THREAD:JOIN-THREAD (SB-THREAD:MAKE-THREAD (lambda() "123")))
"123"
CL-USER> 

 ふむ。

2019年2月21日木曜日

やはり「Magic TrackPad2」もUSBトラックパッドとして使えるのだった

 「Magic Keyboard」がUSBキーボードとして使えることを知って当然、こうも考えた。「Magic TrackPad2」も同じじゃね? バッテリーが一桁台になるまでまで待って試してみたところ、やはり使えた。bluetoothに接続されてないのに操作できた。MacBook Airに繋いでだけど。
 なんてことだ。
 このことを知っていれば、とりあえずキーボードを買ったりマウスを買ったりしなかっただろうに。まっすぐ「Magic Keyboard」と「Magic TrackPad2」を買っていたんじゃないか? わからないけど。
 USBキーボードやマウスはとりもなおさず、「Beelink S1」の起動時、GRUBでOSを選ぶ必要があったからだ1。普段はUbuntuをデフォルトにしているからいいのだけど、Windowsが必要なときもある。そう思っていたのに。
 そうか。「Magic Keyboard」が使えたのか。orz
 ——無駄は嫌いじゃない(負け惜しみ)。

Footnotes:

1

起動時にはbluetoothは使えないから。

2019年2月19日火曜日

デヴィッド・クローネンバーグ監督「スキャナーズ」

 はじめて観たときはラストがあまりに衝撃的だったのでもう一度、観たいな、と思っていたのだ。けっこうシーンに見覚えはあったのだけれど、根本的な設定をかんちがいしていた。いつまでたっても主人公とヒロインが大学で治験を受けるシーンがでてこない。
 見終ってもでてこなかった。
 ——あれ?
 この記憶はなんだろう?
 もしかしたら他の映画のシーン? と考えこんでしまった。
 あ、これはスティーブン・キングの「ファイヤースターター」1だ。

Footnotes:

1

邦題はたしか「炎の少女チャーリー」

2019年2月17日日曜日

たどり読み

 巻末によく参考文献が載っている。
 中にはおもしろそうなタイトルのものもある。
 これをたどって読んでいったらおもしろいんじゃないか?
 以前からそう思っていたのだ。それで今年に入ってちょっと試してみようか、という気になったのではじめた。
 ナシーム・ニコラス・タレブ「反脆弱性――不確実な世界を生き延びる唯一の考え方」からエリック・エイブラハムソン/ディヴィット・H・フリードマン「だらしない人ほどうまくいく」へ。それらの参考図書1のリストをつくっていてふと気づく。あれ、このままだと収束しないんじゃないか?
 どんどん候補の本が2増えていくだけじゃないのか?
 さすがに幾何級数的増加ということはないだろうけど。
 そもそもナシーム・ニコラス・タレブ「反脆弱性――不確実な世界を生き延びる唯一の考え方」の参考図書って83冊もあるんだよねぇ。
 うーん。もうすでに飽きてきている。
 それにこれだと、延々、過去にのびていくだけなんだな。

Footnotes:

1

もちろん邦訳されたもの、日本語のもののみだけど。

2

候補の本を選ぶために、y-goto-randam-lineをつくったのだった。

2019年2月15日金曜日

Emacs 26にバージョンアップ

 あれ?
 MacBook AirからEmacsが消えてしまった。
 なぜだ。あっ、26は残っている。そうか。うっかり「brew upgrade」してしまったからかぁ。cleanされてしまった。
 わざわざ、Emacs 25にダウングレードして使っていたのに。
 元に戻すのが面倒なのでEmacs26をそのまま、使いはじめただけれど、自前のツールが「insert-string」がない、と動かない。そういえば、25のとき、なんか、ワーニングがでてたっけ。「insert」に置換しなきゃ、と。
 バッファの開き方が変わったみたいで、普段はあまりチェックしない「GNU Emacs NEWS」をながめてみたら「thread」という文字が……。
 ついにサポートするんだ。

2019年2月13日水曜日

ランダムな行に移動する

 Emacsのひらいているバッファで適当な行へジャンプするものをつくった。

 引数は飛び先の行を判定する条件をコントロールするもの。

(y-goto-randam-line 'oddp)

 これで奇数行だけにジャンプする(はず)。

 ——これが何の役に立つのか?
 立たないかもしれない。

2019年2月11日月曜日

もしかしたらMagic KeyboardはUSBキーボードとして使えるんじゃね?

 重量を調べるためにMagic Keyboardの技術仕様をながめていたら気になる項目を見つけた。
 「接続と拡張性」にLightningポートがはいっている……。
 充電用のポートだから「接続」ということだよね……。
 あれ、もしかしたらUSBキーボードとして使える、という意味?

 => MAGIC KEYBOARD は普通にUSB接続でも使える

 なんと!
 某国産キーボードのブルートゥース版とは大違いだ……。
 やってみたらほんとに使えた。

2019年2月9日土曜日

Magic KeyboardをつないだらiPadはMacBook Airのかわりになるか

 手持ちのiPad ProMagic Keyboardをペアリングをしてみたところ、さすがにキー入力はキーボードが楽。
 それならMacBook Airのかわりになるんじゃね?
 重量的にも半分ぐらいになるし。
 いいね。いいね。ひとり悦に入っていたけれど、障害がひとつ。ぼくはEmacsのキーバインドに毒されている。もう元の身体にはもどれない。iPadで動くEmacsがあれば、いいけど、ない——Vimはあるのに。
 「Not Emacs」は日本語入力ができなかった。

 じゃ、RaspberryPiにVNCか、sshで接続してそちらのEmacsを使えば、いいんじゃね?
 RaspberryPiなら携帯バッテリーで動かせるだろうし、ホストにしてWifiでLANを構成できるはずだ。いいんじゃね?
 ちょっと部品が多いのが難だけれど、重量的にはどうなんだろう。

iPad Pro 437g
Magic Keyboard 231g
携帯バッテリー 180g
RaspberryPi 100g?

 合計したら948g……。
 あれ、MacBook Airとかわらん。
 バラバラになっている分、いまいちかも……。

 そもそもiPadのエディタがEmacsのキーバインドをサポートしてくれていれば、問題ないのだよな。

 => iPadでもemacsのキーバインドの一部を使うことができます

 そうなのか。
 知らんかった。
 でもやはり、MacBook Airのかわりは無理かな。MacBook Airのかわりというか、Emacsのかわりなんだけど。

2019年2月7日木曜日

grep in the eshell

 知らないということは怖ろしいもので。
 「Emacs for Windowsでfind-grepっぽいことをする」とかよりもっと簡単な方法があった——単純にeshell上でgrepを使えば、よかったのだ。eshellだと。

**/*

 で、カレントディレクトリの下を再帰的に展開してくれるので

grep hogehoge **/*

 で、ごっそりgrepがかけることができるのだった。

2019年2月5日火曜日

なーんも覚えてない

 ナシーム・ニコラス・タレブ「まぐれ—投資家はなぜ、運を実力と勘違いするのか」を再読しているときにふとブクログを見返した。基本的に読み終えた本はブクログに登録しているのだけれど——忘れることもある——、表紙の一覧をつらつら眺めていて思ったのは。
 なーんも思い出せん、ということだった。
 覚えていない。
 もちろん断片的な記憶はあったりするのだけれど、「まぐれ」のようにすっかり、記憶ちがいをしているようなこともあるわけで。
 読んだこと自体、忘れていたりもして。
 すべては無駄だったのか?
 そんな気分にさせられてしまった。
 別に人生を前進させるために読んでいるわけではないのでいいのだけど。
 かつては——中学のころ——読んだ百冊近い本のタイトルをすべて書き出すことができたのになぁ。

2019年2月3日日曜日

ナシーム・ニコラス・タレブ「まぐれ—投資家はなぜ、運を実力と勘違いするのか」を再読

 めずらしく、ナシーム・ニコラス・タレブの「まぐれ—投資家はなぜ、運を実力と勘違いするのか」を再読した。「めずらしく」は本のタイトルにではなく、「再読」にかかっている。ぼくはほとんど読んだ本を読み返さないからだ。
 理由はなんとなくで、世の中には本がたくさんあるからかもしれない。
 ただでさえ、読書スピードはおそいのに。
 いや、本を読まなれば、いけない、ということはないのだからそんなこと、気にしなくてもいいのだけど。

 初読は2009年9月30日のことだった。
 この本が端緒になって「確率」や「偶然」をモチーフにした本を読むようになった記憶がある。「まぐれ」のあとにレナード・ムロディナウの「たまたま」や、マイケル・カプラン/ エレン・カプランの「確率の科学史」を読んでいるのだからたぶん、そうなのだろう。
 元々は行動ファイナンス関係の本が先駆けだったかもしれないけれど。

 そもそも——。
 再読しようと考えたのは年始に同じ著者の「反脆弱性」を読んだからだ。「まぐれ」のころから考え方は一貫している、というような記述があって1、たしかにベストセラーになった「ブラック・スワン」は「反脆弱性」と通底しているけれど、「まぐれ」はそうだったっけ、と思ったのだ。
 ところがそうだった。
 というか、「まぐれ」にも「黒い白鳥問題」がでてきているじゃないか。
 そして、ポパーを読むきっかけにもなったことを思い出した。に触れるようになったのもそうだ。

 内容はすっかり思い出せなくなっていたのだけれど、「癌の告知」と「偽陽性」のことはどういうわけか、覚えていた。ところがそのふたつをつなげてひとつのエピソードとして覚えていて、それは偽の記憶だった。
 本の中ではたしかに「癌の告知」を受けた***がその確率を調べて安心する、というシーンがある。けれど、その確率は生存率のことで、偽陽性の確率ではなかったのだ。偽陽性の確率を知って医者のいっていることをまちがいだと***が思ったという風に話がすりかえられてしまっていた。
 なんとまぁ。
 なんというポンコツな頭なことか。

Footnotes:

1

ほんとうにあったのかな?

2019年2月1日金曜日

searchでひっかかった文字列を取得したい

 searchでひっかかった文字列を取得したい。
 文章にしてみて矛盾していることに気づいた。検索する文字は最初からわかっているのだからわざわざ、バッファから取得する必要はないじゃないか。
 もちろんそうじゃない。
 検索文字列に正規表現を使うこともあるからだ。
 というわけで。
 「search-forward-regexp」で検索して「thing-at-point 'line」で一行、選択してそこから……とツールをつくっていてなんかかったるいなぁ、と思っていてふと、自分の馬鹿さ加減に気づいた。

 昔からちょっと疑問だったのだ。
 「search-forward*」系は見つかった文字のうしろにポイントが位置づけられる。「search-backward*」系は逆に前に位置づけられる1。どうしてどちらかにそろってないんだろう……。馬鹿だった。

 というのも

(setq end (search-forward-regexp x))
(setq start (search-forward-regexp x)))

 で、見つかった文字列の前後の位置が簡単にわかるのだから「buffer-substring-no-properties」を使って文字列を取得できるじゃないか。

(buffer-substring-no-properties start end)

 ああ、なんという……。

Footnotes:

1

よくよく考えたらそれで自然なのだけれど。

2019年1月30日水曜日

必勝法

>> モンテカルロシミュレーション

 当該ページで倍増法を必勝法みたいにいっているけど、ほんとうなのかなぁ。
 単純に考えて

  1. ゲームのルールを決めることができるハウスがゲストの必勝法(ハウスにとって必敗法)があるゲームを採用するはずがない。
  2. クラップスというゲーム自体、長いこと、存在する。
  3. ということは必勝法が存在しない、すくなくとも今だ、見つけられていない。

 ということになるんじゃないか。

 いちおう自分でもモンテカルロしてみる。

 1000回試行

 あれ?
 なんか、いけそうに見える。
 540回ぐらいの大きな負けを超えることができれば、あとは順調に勝ちが積み上がっていくような……。

 10000回試行

 100000回試行

 1000000回試行

 10000000回試行

 ——なんなんだ、これは。フラクタルかよ!
 どこまでいっても大負けになる瞬間がある。10000000回試行では瞬間的に1200000000円——12億……。どんなに勝ちを積んでもフッ飛んでしまうことがあるのか。おそろしい。

2019年1月28日月曜日

クラップス

 まず、クラップスのルールを説明します。クラップスは2個のサイコロを用いておこないます。2個の目の合計は2から12までの値をとりま す。(3.5節で示したとおり、7の出る確率が最も大きい。)は2個のサイコロを振って、その和が7または、11の時(これをナチュラルといいま す)は勝ちで,2は12の時(これをクラップスといいます)は負けです。もしそれ以外のとき、すなわち、4、5、6、は、10がでた ときは、その値をポイントといい、ひきつづき同じポイントまたは7が出るまで、サイコます。そして同じポイントがでれば、プレーヤの勝ち、それ以 前に7が出れば、負けとなります。もしプレーヤが勝てば、自分の賭け金の2倍の払い戻しを受けます。
 このゲームは、たいへんよくできて、ごく僅かな確率の差で、胴元が勝つようにできています。

モンテカルロシミュレーション

 確率を計算してみる。
 まず、合計値の分布は次のようになる。

合計値 回数
2 1
3 2
4 3
5 4
6 5
7 6
8 5
9 4
10 3
11 2
12 1

 次に合計値ごとの確率を求めてみる。

合計値 回数 勝ち 負け
2 1 0 1 / 36
3 2 0 2 / 36
4 3 (3 / 36) * (3 / (3 + 6)) (3 / 36) * (6 / (3 + 6))
5 4 (4 / 36) * (4 / (4 + 6)) (4 / 36) * (6 / (4 + 6))
6 5 (5 / 36) * (5 / (5 + 6)) (5 / 36) * (6 / (5 + 6))
7 6 6 / 36 0
8 5 (5 / 36) * (5 / (5 + 6)) (5 / 36) * (6 / (5 + 6))
9 4 (4 / 36) * (4 / (4 + 6)) (4 / 36) * (6 / (4 + 6))
10 3 (3 / 36) * (3 / (3 + 6)) (3 / 36) * (6 / (3 + 6))
11 2 2 / 36 0
12 1 0 1 / 36
総計 36 244/495 251/495

 検算:244/495 + 251/495 => 1

 これは毎回1円ずつ、495回、賭けたら7円のマイナスになるということだから、回収率は(495 - 7)/495*100で、約98.58585858585859%ということになる。

 競馬よりもむちゃくちゃましだけど、いずれにしても負ける。

2019年1月20日日曜日

RaspberryPiをバックアップ

 毎週、動かしているRaspberryPiだけれど、バックアップしてない。
 SDカードがいきなり壊れたらどうしよう。
 やはりバックアップしておくべきか。SDカードを丸ごと「dd」でコピーしてやれば、いいんだけど、MacBook AirにUSB接続してやるのはなんか、面倒だ。せっかくRaspberryPiは壁にはりつけてあるのに。
 ならsshで標準入出力を使ってデータを別マシンに流してやれば、いいんじゃね?
 それならリモートから作業できる。
 自画自賛。

sudo dd if=/dev/mmcblk0 | ssh ホスト名 dd of=RaspberryPi.img

 sudoを使う必要があるからRaspberryPiに入ってそこから作業した。
 終わるまで4時間もかかった1

Footnotes:

1

SDカードは32G

2019年1月13日日曜日

helm

 helmの前身ともいえるanythingを使ったとき、目から鱗だった。すぐに手離せなくなってしまったほど。ほとんど次のふたつしか、使わないのだけれど。

(global-set-key "\M-x" 'helm-M-x)
(global-set-key "\C-xb" 'helm-for-files)

 とくに「helm-M-x」——。
 自前でつくったツールをどうやって呼び出すか。
 Emacsだと、特定のキーにアサインするか、M-xでcommand指定して動かすか、なのだけれど、さすがにあまっているキーはなく——頻繁に使うわけでもないのならなおのこと。
 command指定の場合はtabキーでEmacsデフォルトの補完機能で探しだせるのだけど、tabキーの分がちょっとかったるかい。それが「helm-M-x」ならcommand名を部分的に覚えていてもすぐに探しだせる。
 たとえば、「y-file-open」を動かそうと思ったら「M-x open file」と一気に打鍵すると、commandリストが表示されるのでその中から対象のcommandを選べば、いい。もちろん、「M-x op fi」でもいいし、「M-x op」の途中でも表示されたリストから選択してもいい。

 ああ、これって。
 iPhoneなんかの日本語入力の予測変換と同じじゃないか、と気づいたのはつい最近のこと。

 そうこうしているうちに指が打鍵のパターンを覚えるのでまるで特定のキーにアサインしたように使えるようになる。
 おかげでEmacsからもますます離れられない。

2019年1月11日金曜日

ソードアート・オンライン オルタナティブ ガンゲイル・オンライン

 さすがに「魔法少女まどか☆マギカ」に匹敵するアニメとそう簡単には出会えないだろう、と思っていたら「キルラキル」に出会ってしまった。
 この二作より好みの作品には出会えないだろう、と思っていたらあっさり出会ってしまった。
 ——「ソードアート・オンライン オルタナティブ ガンゲイル・オンライン」

 放映されたときから存在は知っていたのだけれど、観ようか、迷って結局、観なかった。というのもタイトルから「ソードアート・オンライン」のシリーズだというのは瞭然だったからだ1。「ソードアート・オンライン」は人気のアニメで何度か、観ようとしたのだけれど、いつも途中で挫折してしていたのだ2

 いやぁ、まさか「キルラキル」以上に嵌るとは思わなかった。

Footnotes:

1

正確にはスピンアウト作品らしい。今度は「銃の世界」で一儲けかい、とか思ってしまったんだよね。

2

「ガンゲイル・オンライン」に嵌ったあと、もしかたら「剣の世界」というのがだめなのかもと思って「ソードアート・オンラインII」の「銃の世界」の部分を見た(「ガンゲイル・オンライン」の元ネタ)。それでわかったのはやはり「ソードアート・オンライン」は苦手ということだった。作品自体はおもしろいのだけど、苦手だ。

2019年1月2日水曜日

「Magic TrackPad2」と「Magic Keyboard」

 年末、DELLモニタにMacBook Airをつないで使っていたらやはり、MacBook Airのディスプレイが邪魔だな、と——で、衝動的に「Magic TrackPad2」と「Magic Keyboard」を購入してしまった1
 クラムシェルモードなるものがあることを知ったのも大きい。

 こうすると、MacBook Airのスピーカから音楽が流せる上、「Magic Keyboard」からiTuneをコントロールできるのだった。次の曲に進めるとか、ボリュームコントロールとか。MacBook Airを使っているときはiTuneを使ってなかったのでまったく埒外だった。そっか。これ、いいじゃん。
 ちょっとKeyboardのタッチ感が好みじゃないのだけれど2

 完全にAppleのエコシステムにからめとられている。

Footnotes:

1

バッテリーが充電式だったということある。ひとつ前のバージョンでは電池式だったので、どうも買う気になれなかったのだ。

2

キーの縦幅がMacBook Airよりも小さいというのも違和感だ。そのうち、なれるだろうけど。

2018年12月31日月曜日

2018年決算

 本:41冊
映画:29本
WIND:6日/57.9km
TVアニメ/TVドラマ:526話(36本)/141話(10本)

2018年12月29日土曜日

アーロンチェア

 アーロンチェアが到着したのは2018年9月1日のことだった。
 以前から欲しいとは思っていたのだけれど、ほとんど使わないだろうし——パソコンを使うときはマクドナルドとか、スタバとか、ファミレスとかに出かけていたので——、値段を考えると、買うこともないだろう、と。
 それがどういうわけか、衝動的に購入してしまった。
 到着したアーロンチェアが玄関を通らなかったりしてけっこう、往生してしまったが1

 それ以来、外へでかけることがめっきり減ってしまった。
 元々、土日は部屋にこもっていることが多いのだけれど、ちょっと出かけるということもしなくなってしまった。何をやっているのか、というと。
 アーロンチェアに座っているのである。
 ぼーぜんとしているのである。
 ぼんやりしているのである。
 パソコンを使うとき、外へ出かけていたのは今まで使っていた椅子がよくなかったからだったらしい。それもあってモニタを新調する気にもなったのだけれど。

Footnotes:

1

最終的には外で梱包を解いて椅子単体を部屋に入れた。

2018年12月27日木曜日

Beelink S1メインマシン化計画:頓挫

 直接、MacBook Airのアプリを使うことはあきらめて。
 Ubuntuから使う方針でUbuntuの環境をいじりはじめる。
 GnuCashはOK。MacBook Airのデータを読みこんで更新できた。
 Emacsのフォントが汚なかったので新しいフォントをインストールした。Emacsの環境に頭を悩ませているうちに疲れてきて布団に入る。
 とたん思いつく。——そもそも。
 どうしてUbuntuをメインマシンにしようとしているんだっけ?
 普通に使えるから。
 だから使おうとしたわけなんだけど1、よくよく考えたらMacBook AirをDELLモニタに繋げば、いいわけで。どうしてそうしないんだったんだっけ?

 しばし沈思黙考。

 ああ、そうか。
 MacBook Airはモニタがフラットになるまで開かない。
 だからDELLのモニタと画面がかぶるので、それが嫌だったのだ。それに目一杯開いたMacBook Airのモニタが電灯の光を反射してしまうから。しかし、それならMacBook Airにキーボートとトラックパッド2をつなげてしまう、という手もあるじゃないか3
 つまりMacBook AirをiMac miniのように使うのだ。
 で、試しにbluetoothのMac用のキーボードとトラックパッドを借りてきた。
 でも使ってみるといまいち。
 あれ。どうしてだろう? DELLモニタに違和感があるのはまだ、馴れてないからだろうけど、キーボードが妙に使いづらい4……Apple純正なんだが。
 それならbluetoothのHHKを購入するか……。
 MacBook Airのキーボードは馴れていることもあってだいじょうぶなのだから、直接、DELLのモニタにつなぐのがやはりいいようだ。トラックパッドもそのまま使えるし。
 ところでMacは外付けモニタをメインモニタにできるんだろうか。
 Windowsならできる。
 ミラー、拡張、外付けのみと選べる。
 MacBook Airには外付けのみ、の選択肢がなかった。
 あれ、もしかしたら外付けをメインにできないの? でも拡張にしてメインモニタにすることはできるんだよな。モニタに火は点ったままだけど。Windowsだと外付けメインを選択して消すことができる。
 たしかにモニタの輝度を最低にすれば、いいだけなんだけど。どうせMacBook Airのモニタは電灯の写り込み防止でハンカチをかぶせてしまうけど。ただ、拡張モードだと立ち上げたウィンドウやカーソルがそっちにいったときにいちいちこまってしまう——そっか、ミラーモードにすれば、いいんだ。それで普通に使えた。
 でもWindowsだとそうしないな、どうしてだろう。そういえば、たしかWindowsだとミラーモードにすると、画面密度が小さい方に合わせられて外付けを大画面にしても無駄だったはず。だから外付けメインにするしかなかった。
 ところがMacBook Airはそうじゃないぞ。
 外付けの方のサイズに合わせられているみたいだ5。ああ、それで外付けメインという選択肢がなくても問題ないんだ、Macは。

 ということは。
 結局、メインマシンは今までどおり、MacBook Airということじゃないか。
 買ったマウスはどうすれば、いいんだ6

Footnotes:

1

個人的にはWindowsより使えると思えるから。

2

ジェスチャーがあるのでマウスという選択肢はないのだった。

3

実際にはキーボードとマウスをつないで、クラムシェルモードとしてMacBook Airを閉じても使える。使ってみてちょっと感動した。Mac、すげえ。

4

どうやら大きさが微妙に馴れているMacBook Airのキーボードよりも小さかったようだ。打鍵感もなじめなかった。

5

その分、MacBook Airの画面が小さくなっている。

6

ちなみにインターネットラジオはVLSを使えば、MacBook Airから視聴できることがわかった。しかも今まで使っていなかったMacBook Airのスピーカが使える、というおまけつき。

2018年12月25日火曜日

Beelink S1メインマシン化計画:試行錯誤

 ただUbuntuをメインにすると、MacBook Airとのデータのやりとりが厄介だ。
 やりとりすること自体はだいじょうぶなのだけれど1、問題はデータが二重管理になることだ。よくある問題で、昔からこの手のことには頭を悩ませてきた。
 ここはやはり、DELLのデスクトップマシンとThinkPadを使っていたころの解決策を使うべきだろう。デスクトップで使うときはノート側を外部ディスクにしてしまうのである。さいわいsshでUbuntuからMacBook Airをmountできる2
 画面共有という手もあるけれど、これは体感速度的に許容できなかった。

 あとは、UbuntuのEmacsからどうやってMacBook Airのファイルを使うか3

 待てよ。

ssh -Y ホスト名 emacs

 で、いけるんじゃね?
 これでMacBook AirのEmacsをUbuntuに表示できるんじゃね? そうしたら万事解決じゃね? GnuCashだって表示できるかもしれない。
 そうした。
 そうしてみた。
 MacBook AirのEmacsは起動できた。
 ところがUbuntuに表示されない。MacBook AirのXサーバに表示されてしまう。いろいろやってみた結果、どうやらCocoaが原因らしい4——と判断。
 というのも起動すると一瞬、Macに表示されるのだ。
 そのあと、Xサーバに表示されなおす。
 ということはCocoaではなく、X11をバインドしたEmacsならうまくいくんじゃないだろうか。それだとMacBook Airで使うときにこまる予感がするけど5

 うーむ、だめか。

Footnotes:

1

ssh、NFS——基本、なんでもありだ。

2

Emacsならssh経由でリモートのファイルをローカルと同じようにあつかえる。

3

pathがちがうのでbookmark機能とか、orgのagendaとか、ちょっと面倒。

4

MacBook AirのEmacsはCocoaを使用している。

5

ほとんどEmacsの世界にひきこもっているので問題ないかもしれない。

2018年12月23日日曜日

Beelink S1メインマシン化計画:端緒

 なんだかんだ使い道がねぇなぁ、と思っていたBeelink S1——Ubuntuだったけど、気に入ったアプリがひとつだけあった。——「Rhythmbox」。いわゆるインターネットラジオなんだろうけど、中にバンドルされているambientのラジオ1が気に入った。
 それを聞きながらつらつらと、Ubuntuのショートカットキーの定義とかをながめていたらけっこう、マウスなしでいろいろと操作できるようになっていることに気づいた。
 とくに、ウィンドウをディスプレイの右とか、左に半分だけ置く機能。
 Windowsでディスプレイの端にぶつけるようにウィンドウを移動すると、なるやつだ。同じことができる上、キーボードで操作。これはいい——というか、MacとWindowsをくらべたとき、この操作だけはWindowsの勝ちと思っている。
 Macでもディスプレイの左右に別々のウィンドウを並べることはできるけれど、操作がやや煩雑なのだ。左右の割合を調整するのはMacの方が簡単だけど。
 そもそもUbuntuはけっこう使える。
 いや、というよりも普通に使えるのだ。
 必要なソフトは基本的にあるし、日本語のフォントもWindowsより全然、きれいだし2。HFS+のディスクもmountできるし。
 なんだ。いいことずくめじゃないか。
 これはDELLのモニタにつないでUbuntu——Beelink S1をメインマシンにするべきじゃないだろうか。

 そう思ってAmazonでマウスを買った。

Footnotes:

1

Ubuntuが提供している?

2

VirtualBoxのフォントの汚なさにWindows版は使う気が失せた。

2018年12月21日金曜日

えっ、うそ。VirtualBoxでMacOSが動くの。

 ひさしぶりにFreeBSDをいじってみようか、とtrueOS1をあまったハードディスクにいれた。VirtualBoxでインストーラーを動かしてお立ち台に接続したハードディスクへインストールするいつものやり方だ。
 もしかしたらこれでBeelink S1で動くかも、というわけだ。以前はうまく動かせなかったけれど。
 その過程でふと気づく。
 新規につくる仮想マシンのOSのタイプにMacOSという選択肢が増えている。えっ、うそ。
 あわててググってみたらなんと、WindowsのVirtualBoxでMacOSを動かした、というページにぶつかった。たしかに、ずいぶん前にMacOSは無料になっているけれど……待てよ。それならBeelink S1でMacOSが動かせるかもしれない。
 と思ったのだけど、よくよく考えると、Beelink S1でVirtualBoxのゲストOSにまわせるメモリは2Gしかない。さすがに無理か……。

 ちなみにBeelink S1へもっていったtrueOSは起動した。しかし起動はしたのだけれど、trueOSのロゴがでたところで固まってしまう。いつまでもそのままだった。あかん。だめだ。
 ちなみにMacBook Airでは動いたんだけどなぁ。

Footnotes:

1

FreeBSDから派生したPC-BSDの後継

2018年12月19日水曜日

from HFS+ to APFS

 「macOS Mojave」へアップデートしたとき、APFSはLinuxで使えると知って1、外部ディスクとして使っている3TBをAPFSにしたいな、と思っていた2。それでうだうだ、考えた。余っているハードディスクにcopyして——でも3TBも入らないよな——別々にばらさなきゃ、いかんし——どうしよう。
 で、ふと気づいた。
 OSのアップデートのとき、HFS+から変換してくれたんだから直接、変換できるんじゃね?
 ググったらでてきた。
 なるほど、ディスクユーティリティを使えば、いいのか。
 ところが。
 ところがである。
 3TBではAPFS変換が選べない。

 なんでよ、なんで。ググっても対応方法は見つからず。
 調べてみるうちにLinuxからHFS+をmountできることを知る(そもそもAPFSへ変換する意味がなくなった)。FreeBSDからはうまくいかなかった記憶があるのでだめだ、と思いこんでいた。
 それならAPFSにしなくていいか。
 そうなったら手を思いつくもので。
 commandレベルからならできるんじゃね? APFS変換。
 「man diskutil」を見てみると、できるっぽい。しかもdryrunが可能。
 試してみる。

bash-3.2$ diskutil APFS convert /dev/disk4s2 -dryrun
Rehearsing the conversion of the volume on disk4s2 to an APFS Volume on an APFS Container
Started APFS operation on disk4s2 3TB
Dry run of HFS Volume conversion to an APFS Container with a single APFS Volume
The target is the Journaled HFS+ volume "3TB" backed by the GPT partition disk4s2
The target is a data disk; it is not a macOS system disk
Found APFS EFI driver /usr/standalone/i386/apfs.efi to install into the APFS Container
The target is not encrypted
Unmounting disk4s2
Starting dry run test of conversion from HFS to APFS
Performing apfs_hfs_convert --dry-run --watchdog=1800 -x --verbose=0x400 /dev/disk4s2
Reporting pre-conversion statistics
Reporting post-conversion statistics
Successfully finished dry run of conversion from HFS to APFS
Dry run mode so will not touch type
Not mounting APFS Volume
Exiting conversion operations with error code 0
Finished APFS operation on disk4s2 3TB
bash-3.2$

 おっ、できそうだ。

Footnotes:

1

wikiにも書かれていた。

2

何か、あったとき、Beelink S1のUbuntu経由でレスキューできる。

2018年12月17日月曜日

Dell 27 Monitor(2)

 Apple TVをDellのモニタにつないで音声を別にだすには次の二つの手が考えられる。

  1. Apple TVのoptical audioを利用して出力する。
  2. HDMIの音声分離機を使用する。

 どちらにしても追加投資が必要だ。
 いろいろ調べていたら面倒臭くなってしまった。
 そもそもネット配信されているものが観れれば、それでいいのだ。それならパソコンのブラウザを使えば、いいだけじゃん。イヤホン端子もついているし。しかもBeelink S1はHDMI出力できる。
 ただ、MacBook Airではうまく再生されなかった。
 Beelink S1を試してみる。
 Firefoxはだめだった。Chromeはいけた。
 あれ、待てよ。MacBook AirがだめだったのはSafariだったからかも。案の定でChromeだとうまくいった。
 「ソードアート・オンライン オルタナティブ ガンゲイル・オンライン」のアクションシーンを観比べてみたところ、軍配はMacBook Airにあがった1。あれ、そうすると、新しいモニタを買った意味がなくね?
 まぁ、MacBook AirをDELLモニタにVGA接続すれば、いいだけなんだけどさ……。

 結局、Beelink S1の使い道はなく、それだと悲しいのでいちおうHDMIにつないでおくことにした2。マウスとキーボードなしの状態なので何もできないけど3, 4
 ショックなのは直販で購入したDELLモニタよりもAmazonで買った方が安かったことだ……。しばらくうだうだしそうだ。

Footnotes:

1

接続方法の差か、OSの差なのか、マシンの差なのかは不明。

2

プリインストールされているWindowsをUpdateしたら5時間たっても終わらなかった……。

3

VNCでMacBook Airにつないでみたけれど、遅すぎて使いものにならなかった。

4

synergyを使う手もあるけれど——昔、Mac miniを使っていたころ、使っていた——、いつのまにか、有料になっていてBeelink S1を使う頻度と値段を考慮した結果、今回は見送り。

2018年12月14日金曜日

Dell 27 Monitor - SE2719H - Dell Sシリーズ SE2719H 27インチワイドモニター

 27inchのモニタを使う機会があり、最初は画面の大きさに目がびっくりしていたけれど、馴れると、いいな、と思うようになってしまった。調べてみたら値段的に手頃だったので買うことにした。実は最近のモニタにはHDMIがついているのでApple TVをつなげてやれば、テレビのかわりになるのではないか、とさもしいことを考えたのだ。
 視聴はネット配信が中心だし。
 このあいだ、買ったBlue-rayの再生専用機も使えるだろうし。
 まぁ、オーディオ出力についてはあとで考えよう。
 どうせいつもはイヤホンなのだし。
 それにもしかしたら買っただけのBeelink S1にも何かいい使い道ができるかもしれん1

 買ってすぐにApple TVをつけてみる。
 うん、いいんじゃね?
 音はでないけど。

Footnotes:

1

モニタは邪魔なので押し入れにいれっぱなしなのだった。

2018年12月12日水曜日

ABCL

 あれ、CL-DBIはOrcleに対応してないのか1
 探せば、どこかにあるかもしれないけど、つらつら考えてそういや、ABCLってjava上で動くCommonLispなんだよな。それならjavaを使って(ojdbc.jarを使って)Oracleにアクセスできるんじゃね?
 「Class.forName("oracle.jdbc.driver.OracleDriver");」をやっただけではうまくいかなくて、けっこう苦労したけれど、いちおう、動いたような気がする。ざっくり。
 錯覚かもしれないが。

(in-package :cl-user)

(defpackage y-dbi
  (:use :cl :java))

(in-package :y-dbi)

(add-to-classpath "ここにojdbc.jarを指定")

(defvar oracle (jnew "oracle.jdbc.driver.OracleDriver")
  "oracleのドライバをロード")

(defun connect(&key server database user password)
  (let ((connect
  (concatenate 'string "jdbc:oracle:thin:@" server ":1521:" database))
 (properits (jnew "java.util.Properties")))
    (jcall "put" properits "user" user)
    (jcall "put" properits "password" password)
    (jcall "connect" oracle connect properits)))

(defun disconnect(conn)
  (jcall "close" conn))

(defun execute(conn sql)
  "ResultSetを返却する"
  (let ((stmt (jcall "createStatement" conn)))
    (jcall "executeQuery" stmt sql)))

(defun fetch(rs)
  (jcall "next" rs)
  (when (not (jcall "isAfterLast" rs))
    (let ((rsmd (jcall "getMetaData" rs)))
      (loop for i from 1 to (jcall "getColumnCount" rsmd)
  append
    (list (intern (jcall "getColumnName" rsmd i) 'keyword)
   (jcall "getString" rs i))))))

(defun select(conn sql &optional limit)
  (let ((rs (execute conn sql)))
    (if limit
 (loop for i from 0 to (- limit 1)
    collect (fetch rs))
 (loop for row = (fetch rs)
    while row
    collect row))))

(defun column(list)
  (loop for x in list
     for i from 0
       append (when (evenp i) (list x))))
CL-USER> (in-package :y-dbi)
#<PACKAGE Y-DBI>
Y-DBI> (select (connect :server "XXXX"
   :database "YYYY"
   :user "ZZZZ"
   :password "PASS") "select * from dual")
((:DUMMY "X"))
Y-DBI>

Footnotes:

1

商用なのである意味、当たり前か。

2018年12月10日月曜日

ユークリッドの互除法

 一松信の「暗号の数理」を読んでいたら「ユークリッドの互除法」というものがでてきた。二つの正の整数m、nの最大公約数を求めるアルゴリズムである。下記のような手順だ。

  1. mとnを比較し、必要なら入れかえてm≧nとせよ。
  2. mをnで割り、商をq、余りをrとせよ。
  3. 余りrが0(割り切れた)なら、そのときの除数nが最大公約数である。これで完了。
  4. 余りrが0でなければ、除数nと余りrとをm、n,と置き直して、2.へ戻れ、

    この操作を反復すれば、いつか必ず3.に逹っして、完了するであろう。

     ——一松信「暗号の数理」より

 で、なんで、これで最大公約数が求まるのだろう……。
 ピンとこなくて考えこんでしまった。
 うーむ。
 n自身が最大公約数のとき、求まるのはわかる。では2周目はどうだろう。一回目のrが最大公約数の場合。もちろんそのときはrでnが割り切れるはずだ。もちろん、mも割り切れる(mはnとrに分解できるのだから)。
 あ、なるほど。そういうことか。
 あとは以下同文。

(defun Euclid(m n)
  "ユークリッドの互除法。m、nの最大公約数を求める。"
  (if (< m n)
      (Euclid n m)
    (progn
      (let ((q (/ m n))
     (r (mod m n)))
 (if (= r 0)
     n
   (Euclid n r))))))
(Euclid 25 5)
5
(Euclid 7 5)
1

2018年11月30日金曜日

新房昭之監督「続・終物語」

 テレビ放映で「終物語」を観て——原作の上中巻分——。
 iPhoneのアプリで「暦物語」を観て。
 劇場版の「傷物語」を観て。
 「終物語」の続きを楽しみにしていたら——「続・終物語」の予告編がYutubeにあがっていた。劇場版である。一瞬、「終物語」の続きを劇場版でやるのか、と思った。「傷物語」のように。
 しかし、どうみてもこの予告編はちがう。
 えっ、もしかしたら「終物語」の続きはもう放映されていたの?

 あわててwikipediaをチェックしたらやはり放映されたあとだった。一年以上も前に二夜連続二時間スペシャルという形で。
 しかもAmazonとかではまだ、配信もされていない。「憑物語」までだ。
 これはもう、DVDを買うしか、ないか、と頭を抱えながら<物語>シリーズのポータルサイトを確認したら「終物語」の後半も配信されるという。
 それで配信系にユーザー登録して観た。「終物語」の後半。
 そうしたら「続・終物語」を観たくなった。

 というわけで観てきた。

2018年11月27日火曜日

macOS Mojave

 「macOS Mojave」にしたら色々と動かなくなってしまった。

  1. VirtualBox

    最新版(5.2.22)をインストール

  2. GnuCash

    最新版(3.3)をインストール

  3. Git

    Git本体ではなく、xcodeのcommandLine toolがなくなっていたためらしい1。「xcode-select –install」で再インストール。

  4. TimeCapsuleのネットワークドライブがmountできなくなった。

    AFP(Apple Filing Protocol)が使えなくなったかららしい。おかげでTimeCapsuleのネットワークドライブがmountできない。ここの中にiTuneの音楽データをいれていたのに!
    頭を抱えてしまったが、「サーバへの接続」からならmountできた2のでとりあえずデータをレスキューしておく。
    いっそ音楽データはApple Musicへいれてしまうか。

  5. Time machine

    TimeCapsuleへのバックアップが遅くなったような気がする。

Footnotes:

1

そういえば、以前のメジャーアップデートのときも起きた。svnが動かなくなったのだった。

2

よくよく考えたらTimeCapsuleにはまだ、バックアップできるのだからAFP自体がなくなっているわけではなかったらしい。いつか、なくなってしまうだろうけど(TImeCapsuleは製品としてなくなってしまったので)。今はまだ、というところだろうか。

2018年11月21日水曜日

UbuntuのIPv6を抑止

 なんか、Ubuntuからうまくメール送信できない。
 へんだなぁ。MacBook Airからではできるのに。両方ともEmacsからのメール送信。試しにpingを打ってみて原因が判明する。
 DNSで返ってきてるの、IPv6じゃん。
 そういや、以前、macOSでも対応した
 というわけで、LinuxのIPv6を抑止する方法をググる。

 => Ubuntu Server 16.04 LTS でipv6を無効化したときの作業メモ

 たぶん、こうか。
 /etc/sysctl.confに下記を追加。

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

2018年11月19日月曜日

アップデート

 新しいMacBook Airが発表された。
 13inchだけだけど、物欲が刺激されてしまった。欲しい。でも高い。前回の轍を踏まないように、次はフルスペックにするつもりだった。けれど、そうすると、けっこうな額になる。二の足を踏む。
 それでほかのものを目がいってしまった。
 ——「GPD Pocket
 いかんいかん。
 完全に物欲が昂進してしまっている。やばい。ポチってしまいそうだ。家には使っていないパソコンがあるというのに。

 そんなとき、寝起きの寝惚けた頭で衝動的にMacBook AirのOSをアップデートしてしまった。「macOS Mojave」にへ、である。正確にはしようとした。ディスク容量が足りなくて失敗した。
 ラッキーである。
 動いているアプリが動かなくなることがあるのでなるべく、メジャーアップデートは避けていたのだ。「macOS High Sierra」ときも見送った。
 なのに。
 カッとなってファイルをガシガシ消している自分がいた。何をやっておるのか。まぁ、バックアップはあるので元には戻せる、とは思っていたけれど。——「macOS Mojave」をインストールしてしまった。

 なんか、インストールに時間がかかるなぁ、と思っていたらどうやらファイルシステムを変換していたらしい。HFS+からAPFSへ。ためしに「df -h」してびっくりした。何だよ、このifreeが「9223372036853272673」って。
 inodeが64bitに拡張されていたのである。

 ま。いずれにしてもOSが刷新されたので、気分もかわってなんとか、物欲もおさまった。これでしばらく戦える(だれと?)

2018年11月12日月曜日

directory-files-recursively

 findのない環境でEmacsを使うとき、(find-lisp-find-dired DIR REGEXP)を使用していたのだけれど、この関数はヒットしたファイルの、diredのバッファを作成してくれるだけで、listを返してくれない。
 しかたないのでファイルのlistを返却するようにラッパー関数をつくった。
 けっこう遅いけれど。でもこれで(eshell-poor-mans-grep ARGS)を簡単に呼び出せるぜ、と思ったら。
 (directory-files-recursively DIR REGEXP &optional INCLUDE-DIRECTORIES)という関数を見つける。ラッパーをつくった直後に。Infoで。これならヒットしたファイルのlistを返してくれる。
 昔、探したときには見つけることができなかったんだなぁ。
 見落としていただけなんだろうか?
 それにしてもあいかわらずの間の悪さよ。

2018年11月9日金曜日

アンドレイ・タルコフスキー監督「惑星ソラリス」

 AmazonのPrime Videoで「カプリコン・1」を検索してブルーレイがあることを知ったことをきっかけにふと、過去に感銘を受けた映画を見直したくなった。時々、そういうことをしていたのだけど、好みが偏っているのか、大概、見つからなくてあきらめていた——まぁ、見つかることもあったけれど。「狼は天使の匂い」とか。
 で、どんな映画があったっけ、と思って思い出したのが、アンドレイ・タルコフスキー監督「惑星ソラリス」だった。ハリウッドのリメイク版ではなく。あれは途中で観るのをやめてしまった。
 なんと中古だが、DVDがあった1
 当時2、ラストシーンには最初の「猿の惑星」と同じくらいあっと息を飲んだものだった。今回、見直して傑作の感をあらたにしたけれど、でもなんでそんなに驚いたのだろう。ラストシーンの前でちゃんとラストをふっていて気づいてもおかしくなかったのだが。

Footnotes:

1

さっそく注文して届いたのは円盤だけだった。あれ、箱は? と思った。まぁ、いいけど。

2

観たのはさいわい上京前だったので、未来都市のシーンに(首都高の映像が使われている)違和感はなかった。

2018年11月7日水曜日

orとreturn

 どうもLispは関数型だという意識がありすぎて、returnがどうしてあるんだろう、と思っていたらたとえば、returnがあれば、次のようなコードはあっさり書ける。

(block nil
  (when-let(w (処理1))
     (return w))

  (when-let(w (処理2))
     (return w)))

 実際に書いたのはelispのclでだけど。
 処理1が成功したらその返却値を返し、失敗したときは処理2を行なってその返却値を——というパターン。便利。というか、C言語とかではわりと使っていた記憶が……。さらにラップするマクロを書いてもいいんじゃないか、と思ったのだけれど、よくよく考えたらorで書けるんだった…orz。

(or (処理1)
    (処理2))

ただ、あとからソースを見直しとき、前者の方が見易いかもしれない。

2018年11月5日月曜日

ピーター・ハイアムズ監督「カプリコン・1」

 スティーヴン・キング「死の舞踏」によると、「カプリコン・1」は駄作らしい。えー、そんなことはないだろう。すくなくとも個人的には映画館で五回は見直しているし。
 公開当時、手塚治虫が書いていた小説(マンガではなく)のネタが「カプリコン・1」とかぶってボツにしたと悔しがっていたし、清原なつのの「花岡ちゃんの夏休み」の中の一編で——たぶん「早春物語」かな——背景の本棚のシーンで、「カプリコン・1」のセリフが落書きされていた。
 ——エリザベス、水がない。
 とか。
 ちなみに映画館で観たものとは訳が微妙にかわっていて——「エリザベス、水がない」はなくなっていた——ちょっと違和感だった。それにしてもエリオット・グールド演じる記者の尺はけっこうあったんだなぁ。というか、中心だった。すっかり忘れていたけれど。カーアクションのところなど、当時、「フレンチコネクション」のカーアクションみたいだ、と思ったことを思い出す始末だった。

2018年11月3日土曜日

&optional

 elispで関数の引数を&optionalにして、指定されていないときのデフォルトをいちいち「unless」で処理を書くとか、面倒だ。commonlispなら簡単なのに。
 そういえば、「cl-defun」とか、あったっけ……。

(cl-defun foo(&optional (x 123))
  x)
foo
(foo)
123
(foo 777)
777

 おっ、いけるじゃん。