2019年12月31日火曜日

bootしなくなった

  内蔵ディスクをSSDに換装してすぐにbootしなくなった。
 あれ?
 どうやら内蔵ディスクをbootディスクと認識していないようだ。おかしいなぁ。もしかしたらパーティションの拡張をしたときになんか、やっちゃったのかなぁ 1
 とりあえず、bootコードをぶちこむ。

gpart bootcode -p /boot/boot1.efifat -i 1 ada0

 

Footnotes:

1

やっちゃったのかもしれない。「gpart show ada0」の表示が へんだ。「CORRUPT」って——調べてみたら破損って意味じゃん。

2019年12月30日月曜日

40G=>128Gへ

 Beelink S1のディスクは いろいろあってハードディスクにしていたのだけれど、容量が40Gしかない。やはり128Gある、SSDに交換しよう。どうすれば、いいかな……。
 FreeBSDのインストールUSBからBeelink S1を立ち上げて、ddコマンドで40Gの中身を丸ごとコピーすることにした。内蔵ディスクの40Gから 「ORICO USB3.0 HDDスタンド」へ接続した128Gへ。

dd  if=/dev/ada0  of=/dev/da0  bs=1m

 内蔵ディスクをSSDに取り替えてboot。
 立ち上がった。ZFSは勝手に空きを使ってくれるんだよね……と思っていたらあれ?

$ df -h
df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default     26G    7.0G     19G    27%    /
devfs                 1.0K    1.0K      0B   100%    /dev
zroot/var/mail         19G    200K     19G     0%    /var/mail
zroot/var/audit        19G     88K     19G     0%    /var/audit
zroot/usr/ports        20G    696M     19G     3%    /usr/ports
zroot/usr/home         20G    318M     19G     2%    /usr/home
zroot/usr/src          19G     88K     19G     0%    /usr/src
zroot/tmp              19G    6.4M     19G     0%    /tmp
zroot                  19G     88K     19G     0%    /zroot
zroot/var/crash        20G    614M     19G     3%    /var/crash
zroot/var/log          19G    700K     19G     0%    /var/log
zroot/var/tmp          19G     88K     19G     0%    /var/tmp
$

 40Gしか認識してねえ。

zpool online -e zroot

 でもだめで、

$ zfs list
zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot               14.7G  19.2G    88K  /zroot
zroot/ROOT          11.5G  19.2G    88K  none
zroot/ROOT/default  11.5G  19.2G  6.95G  /
zroot/tmp           10.3M  19.2G  6.39M  /tmp
zroot/usr           2.47G  19.2G    88K  /usr
zroot/usr/home      1.78G  19.2G   318M  /usr/home
zroot/usr/ports      706M  19.2G   696M  /usr/ports
zroot/usr/src        144K  19.2G    88K  /usr/src
zroot/var            624M  19.2G    88K  /var
zroot/var/audit      144K  19.2G    88K  /var/audit
zroot/var/crash      615M  19.2G   614M  /var/crash
zroot/var/log       6.36M  19.2G   700K  /var/log
zroot/var/mail      2.18M  19.2G   200K  /var/mail
zroot/var/tmp        496K  19.2G    88K  /var/tmp
$

 認識してくれない。うーむ。

$ gpart show ada0
gpart show ada0
=>      40  78140080  ada0  GPT  (119G)
        40    409600     1  efi  (200M)
    409640      1024     2  freebsd-boot  (512K)
    410664       984        - free -  (492K)
    411648   4194304     3  freebsd-swap  (2.0G)
   4605952  73533440     4  freebsd-zfs  (35G)
  78139392       728        - free -  (364K)

 gpartで見てみると、なるほど。ada0は119Gあるのに、zfsの領域を35Gしか、認識していない。これか。調べてみると、gpartにはresizeというサブコマンドがある。こうか?

$ sudo gpart resize -i 4 ada0
sudo gpart resize -i 4 ada0
ada0p4 resized
$ gpart show ada0
gpart show ada0
=>       40  250069600  ada0  GPT  (119G)
         40     409600     1  efi  (200M)
     409640       1024     2  freebsd-boot  (512K)
     410664        984        - free -  (492K)
     411648    4194304     3  freebsd-swap  (2.0G)
    4605952  245463688     4  freebsd-zfs  (117G)

 うまくいった。
 けれど、これだけではまだ、足りなくてZFSの方で認識してくれてなかった。なのであらためて。

zpool online -e zroot
$ zfs list
zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot               14.6G  98.7G    88K  /zroot
zroot/ROOT          11.5G  98.7G    88K  none
zroot/ROOT/default  11.5G  98.7G  6.96G  /
zroot/tmp           10.4M  98.7G  6.39M  /tmp
zroot/usr           2.46G  98.7G    88K  /usr
zroot/usr/home      1.77G  98.7G   315M  /usr/home
zroot/usr/ports      706M  98.7G   696M  /usr/ports
zroot/usr/src        144K  98.7G    88K  /usr/src
zroot/var            624M  98.7G    88K  /var
zroot/var/audit      144K  98.7G    88K  /var/audit
zroot/var/crash      615M  98.7G   614M  /var/crash
zroot/var/log       6.39M  98.7G   720K  /var/log
zroot/var/mail      2.09M  98.7G   200K  /var/mail
zroot/var/tmp        504K  98.7G    88K  /var/tmp
$

 いきましたね。よかったよかった 1

Footnotes:

1

実はいつか、わからないけどbootコードを壊してしまっていたのだった。

2019年12月14日土曜日

(org-table-transpose-table-at-point)

 org-modeの「org-table-convert-region」で表に変換するとき、よく縦横変換したいことがある。自前で状況に特化した簡単なコードを書いていたんだけど、org-table.elにそんなfunctionがないはずがない。本気で探してみたらあった。

(org-table-transpose-table-at-point)

 まんまの*Help*がでてきた。

org-table-transpose-table-at-point is an interactive compiled Lisp
function in ‘org-table.el’.

(org-table-transpose-table-at-point)

Transpose Org table at point and eliminate hlines.
So a table like

| 1 | 2 | 4 | 5 |
|---+---+---+---|
| a | b | c | d |
| e | f | g | h |

will be transposed as

| 1 | a | e |
| 2 | b | f |
| 4 | c | g |
| 5 | d | h |

Note that horizontal lines disappear.

[back]

2019年12月7日土曜日

if-let

 helmでfunctionを検索していたら「if-let」があることに気づいた。
 「when-let」ならけっこう使うだろうけど、「if-let」はどうだろう。
 疑問に思っていたら案外、使うのだった。

2019年11月9日土曜日

データ取り込み

 読了した本の作者とタイトルを日記にメモしている。
 で、最近までこうしていた。

  1. ブクログのアプリで、本のバーコードから本を検索、ブクログへ登録
  2. ブクログの本棚からEmacsへコピー&ペースト
  3. ペーストした文字列を手作業で整形

 いちいち手入力していたかつてにくらべれば、はるかに楽なのだけれど。
 3. が面倒だ。自動化しよう。Emacsならクリップボードの内容を取り込めるわけで……と考えていたところ、そもそもコピー操作すら不要にできんじゃね?

  1. ブラウザでhtmlをダウンロード
  2. dom.elで作者名とタイトルを取得
  3. 整形した内容をクリップボードにいれる
  4. 貼り付け

 とくに3. で整形するとき、ベタテキストよりもデータが構造化されているので楽だ。しかもブラウザのダウンロード先は決まっているので、そのフォルダの最新のファイルを対象にすれば、いい。
 むっちゃ楽になるんじゃね?

 それだけじゃない。
 ブラウザでひらいたデータはそうやって取り込めるじゃないか。
 Amazonの注文履歴とか、もろもろ。

2019年11月7日木曜日

FreeBSD 12.1-RELEASE

 UPDATEした。Rasberry PiBeelink S1
 めずらしく、今回のリリースは心待ちにしていたのだ。
 RaspBerry Piで内蔵のwifiが使えるようになっているんじゃないか、と。
 まぁ、根拠はなかったのだけど。
 リリースノートにもそのようなことは書かれてないし、しかもRaspberry Pi用はバイナリアップデートがサポートされてなかった。面倒だ。でもセキュリティがらみのパッチを取り込むためにもやった方がいいんだろうなぁ1。外からさわれるようなところには置いてないけど——うーん。
 そういえば、BUFFALO WLI-UC-GN2がなくなったのは絶対、うちのやんちゃ娘のせいだよな……。
 で、本箱がわりにしていたダンボール箱をどかしてみると——そこに落ちていた、BUFFALO WLI-UC-GN2

 あれ? 期せずしてRaspberry Piが無線LANに繋げるようになってしまった。

 元々、Beelink S1経由で無線LANには繋げることはできたのだけれど、Raspberry Piを使うためだけに、Beelink S1の電源をいれるのに抵抗があったのだ。なんか、負けみたいな気がして——それが解決してしまった。

 とりあえず、アップデートの前にBUFFALO WLI-UC-GN2を使って無線LANに繋がることを確認したあと、別のSDカードに12.1をインストール。Emacsとか、PostgreSQLとか、パッケージをいれてから、/etcの下の各種設定、ホームディレクトリの下、postgresqlのデータをごっそりコピー。
 動かないところを調整して——ユーザのclass定義とか、localtimeの設定とか——、動作確認。

 あとはBeelink S1をUPDATE。こちらはバイナリアップデートができるので、ここのとおりに

Footnotes:

1

もしかすると、ソースを展開してコンパイルからやれば、できたのかもしれない、アップデート。

2019年11月6日水曜日

fletってすげえ

 fletの使い所がいまいち、わからなかった。

 たとえば、dom.elを使ってhtml——tableを生成してみる。

(setq wrk (dom-node 'table nil
                    (dom-node 'tr
                              nil
                              (dom-node 'td
                                        nil
                                        "123"))))
(table nil (tr nil (td nil "123")))

(svg-print wrk)
<table> <tr> <td> 123</td></tr></table>nil

 こんな感じになるけど、なんか、わかりづらい。
 構造はhtmlと同じになっているけど、dom-nodeを呼び出しているせいで視認性が悪くなっている。htmlを書くようにコードを書けるのがいいんだろうけど……あれ、じゃ、fletでこうできるんじゃね?

(flet ((table (&optional attributes &rest children)
              (apply 'dom-node 'table attributes children))
       (tr (&optional attributes &rest children)
           (apply 'dom-node 'tbody attributes children))
       (td (&optional attributes &rest children)
           (apply 'dom-node 'tbody attributes children)))
  (table nil
         (tr nil
             (td nil "123"))))

(table nil (tbody nil (tbody nil "123")))

 ああ、そうか。
 fletの定義をマクロで隠蔽したらほとんど、htmlを書いているようになるんだ。
 なんだ、これ。
 すげえ。

2019年11月3日日曜日

mapconcat

 csvファイルからデータを取り込むとき、カンマ区切りで文字列をスプリットするけれど。

(split-string "1,2,3" ",")
("1" "2" "3")

 逆がないなぁ。
 そう思って昔、小物ツールをでっちあげた。

(defun list-concate(list &optional separators)
 "listの要素にseparatorsを挿入した文字列を生成する"
 (car (split-string
       (apply 'concat (mapcar (lambda(x)(concat x separators)) list))
       (concat separators "$"))))

(list-concate '("1" "2" "3") ",")
"1,2,3"

 けっこうダサイ。
 最後のseparatorsを削るためにわざわざsplit-stringを使っているとか。

 ふと気づくと、mapconcatというのが、elispのbuilt-in functionに追加されていた。

(mapconcat 'concat '("1" "2" "3") ",")
"1,2,3"

2019年10月30日水曜日

imaxmiaの表示を一時的にmaximaに変更する

display2d:maxima;

変数display2dの値をmaximaに変更する。

display2d:imaxima;

戻し。

2019年10月26日土曜日

アップグレード

 MacをCatalinaへアップグレードした。
 そうしたらMacBook Airの挙動がおかしくなった。
 Documentsフォルダに権限がなくてアクセスできないなんてありえないだろ。
 あわててバックアップから戻そうとしたらローカルバックアップがうまく取れてなくて1週間前の状態にもどす羽目に——しかもネットワークにあるバックアップにアクセスできなくなるし。すったもんだでなんとか、元にもどしてゼーハー。
 それでカッとなって「brew upgrade」をしてしまった1
 で、気づくと、maximaが動かない。
 maximaはアップグレードされてないのに、SBCLがアップグレートされたためだ2
 うーん、としばらく考えて。

brew reinstall --build-from-source maxima

 buildしなおす。
 ところが今度はimaximaがおかしい。Ghostscriptが問題のようなメッセージがでた。ghostscriptはちゃんとインストールされているんだけどなぁ。古いバージョンでないと、動かないのかなぁ。いろいろやっていてふと気づく。
 あれ?

gs -h

 で表示されるバージョンと、

brew info Ghostscript

 で表示されるバージョンがちがう。
 見ると、「/usr/local/bin/gs」はbrewとはちがうものだった。
 どこでどうやってまぎれこんだのか、さっぱり覚えがない。rootでインストールされているから「basictex」をインストールしたときがあやしいが、完全に置きかえてしまうのは不安だ。
 なのでimaximaが使う「gs」を直接、変更した。

(setq imaxima-gs-program "/usr/local/Cellar/ghostscript/9.50/bin/gs")

 うん、動くようになった。

Footnotes:

1

まったく意味不明な衝動的な行動。

2019年10月9日水曜日

kindle

 きっかけはガルパンだった。
 Wikipediaを見ていたらスピンオフしたコミック——「リボンの武者」を読んでみたくなったのだ。でもなぁ、東日本大震災以来、あまり本を所有したくない。命にかかわる。
 けれど電子書籍には抵抗がまだ、ある。
 自炊しているけど、まったくといっていいほど、読んでいない。あれは本を持たないようにするための方便だ。
 買いにいくにしてもこのところ、リアル書店へ行ったことがない。
 結局、Amazonの電子書籍を購入することにした。
 あっという間に既刊十数冊すべてと、ほかのコミカライズ作品も買いまくってしまった。さらにノベライズまで。一気読んだ。目が痛くなる。馴れなのかもしれないけれど、iPadでの長時間の読書はやはりきびしい。目がかすむ。
 kindleの端末ならだいじょうぶかもしれない、とちょっと調べてみたけれど、どうやらマンガには向いていないらしい。
 ガルパンの手に入るだけの作品を手に入れると——ドラマCDも買った——、しばらくのあいだはおとなしくしていた。時々、期間限定と銘打って無料提供されているコミックを読んだりする程度だった。
 ふと思い出したのは、3巻まで追いかけていた、ひじかた憂峰/たなか亜希夫「リバースエッジ大川端探偵社」のこと。あれ、どうなったんだろう。チェックしてみたら10巻まででていた。えっ、そうなの。それを読み出したのが運の尽き——数巻、購入したところで、「リバースエッジ」はKindle Unlimitedになっていることに気づいた。
 脊髄反射で登録してしまった。
 あとは読みまくる。ひたすら読みまくる。子どものころに読んでいたマンガも、押川雲太朗の麻雀マンガも、読んでなかった「進撃の巨人」の25巻から29巻を買い、期間限定で読んではまった「美女で野獣」「デストロ256」、「謎の彼女X」を最終巻まで、「ハナカク」「科学的に存在しうるクリーチャー娘の観察日誌」を最新巻まで……。
 何をやっておるのか。
 やばい。えらい出費だ。
 けれど子どものころに読んでまた、読んでみたいと思っていた桑田次郎の諸作品や、真崎守「ホモ・ウォラント」とも出会えた。新しいバージョンの「青の6号」も読めたし。ま、いっか。

2019年10月4日金曜日

svg.el

 dom.elがあるならもしかしてsvg.elも……、と思ったら。

(require 'svg)
svg

 ——あった。
 というか、Emacsでsvgを表示できるとは。知らなかった。ビルドのオプション次第らしいけれど。

 しかもshr.elの

shr-insert-document is an autoloaded Lisp function in ‘shr.el’.

(shr-insert-document DOM)

Render the parsed document DOM into the current buffer.
DOM should be a parse tree as generated by
‘libxml-parse-html-region’ or similar.

 を使ってバッファに流しこめるじゃないか。image-modeを使って表示するだけではなく。

 そのうえ、昔は「libxml-parse-html-region」「libxml-parse-xml-region」でlistにしたものを元にhtmlやxmlに戻す関数は見当たらなかったのだけど。
 svg.elの中にまさにそのような関数があった。

svg-print is a compiled Lisp function in ‘svg.el’.

(svg-print DOM)

Convert DOM into a string containing the xml representation.

 いや、Emacs最高。

2019年10月3日木曜日

dom.el

 GPXのファイルのデータをいじったり、競馬のデータを取りこむために、「libxml-parse-html-region」や「libxml-parse-xml-region」を使っているのだけれど、さすがにlistに変換してくれるとはいえ、それを舐めて必要なデータに取り出すのは少々、面倒くさい。
 手間だ。
 domとか、あれば、いいのに。

(require 'dom)
dom

 ってあるじゃん。(dom-by-id DOM MATCH)とか、(dom-by-class DOM MATCH)とか。ここで引数でわたすDOMは「libxml-parse-xml-region」で変換したlistだと見当をつけて試してみたところ、ビンゴだった。

 ああ、今までつくったツールをこれに置き換えたい。

2019年9月25日水曜日

2019年9月23日(月):検見川浜:晴れ

Sail:ZONE 4.7(NEIL PRYDE) Board:NG ACP 255

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 11:58-12:07 8分 1.0km 29.98km/h 6.53km/h 20.90

total 8分 1.0km 6.5km/h

 吹きすぎる予感はあったのだけれど、それでも4.7 + 255ならなんとか、なるだろう、とたかをくくっていたらそんなことはなかった。
 しかもトップバテンが折れていたことをすっかり忘れていたし。
 渋々、ブーム長があってないのであまり張りたくない4.2をセッティングした。
 ところがさらに風はあがって二時間近く呆然と砂浜にたたずむしか、できなかった。。
 ——撤収。

2019年9月23日月曜日

CommonLispでファイル検索

 たとえば、ホームディレクトリの下の「.txt」ファイル。

(UIOP:DIRECTORY-FILES (UIOP/PATHNAME:WILDEN "~/") "*.txt")

2019年9月4日水曜日

予定取引

 知っているのにわかってなかった、というのをあらわす言葉はなんていうんだろう……。

 お金の管理にはGnuCashを使っているのだけど、毎回、入力するのがやはり面倒で、こういうのは小まめに入力するのが吉——というわけで毎日、入力している。そうすると、同じ項目の入力がくりかえされていることに気づく。
 ある日、取引をコピーすれば、いいことに気づいてそれでずいぶんと入力が楽になった。
 それでも月いちとかに発生する取引——家賃とか、生活費とか、駐車場の支払いとかの入力するのがなぁ……表をたどってコピー元になる取引を探さなければならないのでやはり面倒くさい。
 うーん……。
 ——これって予定取引を定義すれば、いいんじゃね?
 おくればせながらようやくそのことに気づいた。予定取引の存在は知っていたのに。
 そういうことに使うということにまったく気づいてなかった……。

 やはりこういうものをあらわす言葉は——愚かもの?

2019年8月31日土曜日

2019年8月28日(水):検見川浜:小雨

Sail:ZONE 4.7(NEIL PRYDE) Board:NG ACP 260 Fin:9.5inch

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 10:21-10:29 7分 0.7km 38.14km/h 5.88km/h 14.44
2 12:07-12:10 3分 0.2km 7.14km/h 2.72km/h 0.00
3 12:19-12:34 15分 1.9km 33.97km/h 7.27km/h 17.77

total 26分 2.8km 6.3km/h

 雨が激しく降った翌日の東京湾の水質は悪くなるそうで。
 そんなことを思い出したせいで気分が憂鬱になってしまった。ひさしぶりの海だということもある。
 検見川浜ではすでに五艇ほどが出艇していた。小さめのセイル。風は湿っていて重い。
 いずれにしても今日は5.3を使うつもりでいた。前回の経験で4.7+260という組み合わせはいまいちだと感じていたので——それでも5.3はオーバーだよなぁ。思ったより風はないけれど。
 セイルをセッティングしていてブームの長さは4.7用のままだったことに気づいた。
 それで面倒になった。
 4.7をセッティングした。途中でトップバテンが音をたてて折れた。そのままにしておく。
 雨が降りはじめた。
 風はあがり、4.7ですらオーバーになっていた。
 1本でてみてめげた。これは死ぬ。無理。
 海上保安庁のサイトをチェックすると、海ほたるで20m/sオーバーだった。
 気持ちが前向きになるか、雨があがるか、風がすこし落ちるか、待つ。
 正午前ににすこし風が落ちた。
 出艇して波打ち際で沈したら何かがおかしくなった。——あれ?
 マストは折れてない。セイルも破れてない。でもなんか、おかしい。ジョイントのラバーが切れていた。
 はあ……。バテンといい、ジョイントといい、自分自身といい、急に何もかも老化が進んでしまった感じだ。
 ジョイントを交換して再出艇。
 ところが——元々、ちょうど真ん中ぐらいの波が立つあたりでは風が落ち気味になるのだけれど、そこでウォーターすらままならなくなって嵌まる。体力と反射神経がなくなっていたということもある。水につかっているだけで、息が上がるほどだった。呼吸すらままならない。視界が暗くなった。しかも浜まで流されたらブロックだ。これは死ぬ。
 ラッキーが重なってなんとか、帰着できたけれど、出艇した場所よりだいぶん風下だった。
 このまま、風はなくなるのかなぁ。5.3にするべきかなぁ、と一休みしていたらまた、風が上がってしまった。
 呆然と三時間を過ごしたのち、家に帰った。すごすごと。

 それにしてもここまで体力がなくなったのは、三ヶ月入院したとき以来かもしれない。あのときは海に入ることはなかったけれど。

2019年8月23日金曜日

 気づいてみれば、当たり前なのだけど。
 たとえば、「y=x+5」は次のようなグラフになる。

 これを積分すると。

integrate(x+5,x);

 となる。
 いつもならグラフを描くのに、わざわざ「x2/2+5*x」と、式を手打ちしていたのだけれど、よくよく考えたら直接、呼び出せばいいんじゃね? と気づいた。

plot2d(integrate(x+5,x),[x,0,100])$

 うぐぐぐ……。

2019年7月29日月曜日

『ガールズ&パンツァー 最終章』第2話

観てきた。いいわー。劇場のスクリーンいいわー。きれいだわー。
二回戦の聖グロリアーナとアンツィオの戦いもやってくれんかなー。観たいわー。聖グロいちの俊足との戦い。

2019年7月27日土曜日

drawパッケージ

 どうやらmaximaにはplotパッケージのほかにdrawパッケージというのもあるらしい。
12.1 Introduction to Plotting」にこうある。

追加パッケージ drawはこの節で記述した関数にいくつかの機能を追加した関数を提供します。

 plotとdraw。
 なんとなく、名前のちがいから立ち位置のちがいがわかるような。
 たとえば、plotではあきらめてしまった二直線のあいだを塗り潰すなんてことができるみたいだ。

set_draw_defaults(terminal = 'qt)$

draw2d(user_preamble="set view equal xy",xrange = [0,10],yrange = [0,10],grid=[10,10],filled_func=x-1,explicit(x+1,x,0,10))$

2019年7月25日木曜日

平面図が正方形で、正面図が円で、右側面図も円(3)

 首尾よく「平面図が正方形で、正面図が円で、右側面図も円」が描けたので気をよくした。
 よし。次は「平面図が正方形で、正面図が円で、右側面図は正方形」を描いてみようじゃないか。
 うーん……っていうか、それってただの円柱じゃね……orz。

2019年7月24日水曜日

平面図が正方形で、正面図が円で、右側面図も円(2)

 「はじめての数式処理ソフト―Maximaで楽しむ数式計算と物理グラフィック」のgnuplotのプログラムをつらつら読むと、どうやら正方形をZ軸に沿って積み上げているらしい。
 ということはまず、正方形を描けないといけないな。
 けれど単純に描くと、discreteを使ってこんな感じになってしまう。

plot2d([discrete,[[-1,-1],[-1,1],[1,1],[1,-1],[-1,-1]]],[x,-2,2],[y,-2,2],same_xy)$

 立体にするから三角関数で描く形にした方がよいのだけど

plot2d([discrete,[[cos(0),sin(0)],[cos(0.5*%pi),sin(0.5*%pi)],[cos(%pi),sin(%pi)],[cos(1.5*%pi),sin(1.5*%pi)],[cos(0),sin(0)]]],same_xy)$

 これでは、軌跡を描いているわけではないからだめだ。
 parametric指定で三角関数で正方形を描くには……うーん、こうか?

plot2d([[parametric,1,sin(t),[t,0,2*%pi]],
        [parametric,-1,sin(t),[t,0,2*%pi]],
        [parametric,cos(t),1,[t,0,2*%pi]],
        [parametric,cos(t),-1,[t,0,2*%pi]]],
       [x,-2,2],[y,-2,2],same_xy)$

 1辺を二回ずつ、描いているところがちょっと嫌だけど、まぁ、いいや。
 これを円柱のときのように立体化。

plot3d([[1,sin(t),h],[t,0,2*%pi],[h,-1,1],
        [-1,sin(t),h],[t,0,2*%pi],[h,-1,1],
        [cos(t),1,h],[t,0,2*%pi],[h,-1,1],
        [cos(t),-1,h],[t,0,2*%pi],[h,-1,1]],
       [x,-2,2],[y,-2,2],[z,-2,2],same_xyz)$

 Z軸の位置によってかわる正方形の一辺の長さは三平方の定理からわかるから

半径 = 1
長さ = 2*sqrt(1-z^2)

 その分、X,Y座標を調整してやれば、たぶん……。

plot3d([[sqrt(1-h^2),sin(t)*sqrt(1-h^2),h],[t,0,2*%pi],[h,-1,1],
        [-sqrt(1-h^2),sin(t)*sqrt(1-h^2),h],[t,0,2*%pi],[h,-1,1],
        [cos(t)*sqrt(1-h^2),sqrt(1-h^2),h],[t,0,2*%pi],[h,-1,1],
        [cos(t)*sqrt(1-h^2),-sqrt(1-h^2),h],[t,0,2*%pi],[h,-1,1]],same_xyz)$

 おっ、できた。

 平面図

 正面図

 右側面図

 すばらしい。

 そして、45度からの側面

 実はこの角度から見たとき、楕円じゃないか、と思ってたしかめたかったのだ。
 きっとこれは長軸、正方形の対角線、短軸、正方形の一辺(=円の直径)の楕円だよね。ほー。

2019年7月23日火曜日

平面図が正方形で、正面図が円で、右側面図も円(1)

 竹内薫「はじめての数式処理ソフト―Maximaで楽しむ数式計算と物理グラフィック」の中の、平面図が正方形で、正面図が円で、右側面図も円の立体に関する問題。
 そこに「Maximaでは複数の3次元グラフを重ねられない」とある。
 ——ほんと?
 と思ったのも、本の中ではgnuplotで図を描いているのだけど、それって変じゃね? と思ったからだ。Maximaもgnuplotで描いているんだから描けそうな気がする。どうなんだろ?

 「平面図が正方形で、正面図が円で、右側面図も円」ということは横から見ると、正方形の円柱を寝転がして二個、90度ちがいで重ねれば、よいような……でもそもそも円柱ってどうやれば、いいんだろ?
 まずは円か。
 これはいちおう、描ける

plot2d([parametric,cos(t),sin(t),[t,0,2*%pi]],same_xy)$

 で、これに高さを与えれば、いいんだから……こうですかね?

plot3d([cos(t),sin(t),h],[t,0,2*%pi],[h,-1,1],same_xy)$

 で、これを転がす、と。

plot3d([h,cos(t),sin(t)],[t,0,2*%pi],[h,-1,1],same_xy)$

 さらにこれを90度、ずらして二個、描くと。

plot3d([[h,cos(t),sin(t)],[t,0,2*%pi],[h,-1,1],[cos(t),h,sin(t)],[t,0,2*%pi],[h,-1,1]],same_xy)$

 ——えっ?
 やっぱ、3次元グラフを重ねて描けるじゃないか。
 まぁ、10年前の本だから当時は描けなかったのかもしれないけれど。

 平面図

 正面図
 ——このはみ出ているところを削ることができれば、答えなんだけどなぁ。これはどうすれば、いいんだろう? まぁ、とりあえず、3次元グラフを重ねられるのなら「はじめての数式処理ソフト―Maximaで楽しむ数式計算と物理グラフィック」のgnuplotのプログラムもmaximaできっと書けるんじゃね?
 こうかな?

f(z,t):=t*sqrt(1.0-z^2);

plot3d([[f(-0.9,u),f(-0.9,v),-0.9],[u,-1,1],[v,-1,1],
        [f(-0.8,u),f(-0.8,v),-0.8],[u,-1,1],[v,-1,1],
        [f(-0.7,u),f(-0.7,v),-0.7],[u,-1,1],[v,-1,1],
        [f(-0.6,u),f(-0.6,v),-0.6],[u,-1,1],[v,-1,1],
        [f(-0.5,u),f(-0.5,v),-0.5],[u,-1,1],[v,-1,1],
        [f(-0.4,u),f(-0.4,v),-0.4],[u,-1,1],[v,-1,1],
        [f(-0.3,u),f(-0.3,v),-0.3],[u,-1,1],[v,-1,1],
        [f(-0.2,u),f(-0.2,v),-0.2],[u,-1,1],[v,-1,1],
        [f(-0.1,u),f(-0.1,v),-0.1],[u,-1,1],[v,-1,1],
        [f(-0.0,u),f(-0.0,v),-0.0],[u,-1,1],[v,-1,1],
        [f(0.9,u),f(0.9,v),0.9],[u,-1,1],[v,-1,1],
        [f(0.8,u),f(0.8,v),0.8],[u,-1,1],[v,-1,1],
        [f(0.7,u),f(0.7,v),0.7],[u,-1,1],[v,-1,1],
        [f(0.6,u),f(0.6,v),0.6],[u,-1,1],[v,-1,1],
        [f(0.5,u),f(0.5,v),0.5],[u,-1,1],[v,-1,1],
        [f(0.4,u),f(0.4,v),0.4],[u,-1,1],[v,-1,1],
        [f(0.3,u),f(0.3,v),0.3],[u,-1,1],[v,-1,1],
        [f(0.2,u),f(0.2,v),0.2],[u,-1,1],[v,-1,1],
        [f(0.1,u),f(0.1,v),0.1],[u,-1,1],[v,-1,1],
        [f(0.0,u),f(0.0,v),0.0],[u,-1,1],[v,-1,1],
        [f(u,1),f(u,1),u],[u,-1,1],[v,-1,1],
        [f(u,1),f(u,-1),u],[u,-1,1],[v,-1,1],
        [f(v,-1),f(v,1),v],[u,-1,1],[v,-1,1],
        [f(v,-1),f(v,-1),v],[u,-1,1],[v,-1,1]])$

 あかん、むっちゃ、重い。

2019年7月22日月曜日

 今だにGrapherではできた

1 > abs(x - y)

 のグラフは描けないけれど、そもそも円はどうやって描くのだろう。
 Grapherなら

 であっさり描けた。円。
 ところがgnuplot的にも簡単ではないのか、三角関数を使う方法しか、見当たらない。ちなみに

plot2d(sqrt(2^2-x^2),[x,-5,5],[y,-5,5],same_xy)$

 では半円になってしまった。

 いろいろ調べてみたらparametricを使えば、いいらしい。三角関数を使うやり方だけど。
 で、最終的にinfoに書かれていたのを発見して脱力する。それを元に描く。

plot2d([[parametric, cos(t), sin(t), [t,0,2*%pi]]],same_xy)$

 ここからおれが得るべき教訓は、まずinfoを見ろ、だな。

 三角関数を使わないのなら……半円にはなるわけだから……。
 solve()してみる。

(%i56) solve(1=sqrt(x2+y2),y);

 ということは

plot2d([sqrt(2^2-x^2),-sqrt(2^2-x^2)],[x,-5,5],[y,-5,5],same_xy)$

 で、どうよ。

 まぁ、こんなもんか。

 と思っていたのだけど、implicit_plotというパッケージを使えば、いちおう描けるみたいだ。

(%i102) load(implicit_plot)$

(%i103) implicit_plot(sqrt(x^2 + y^2) = 2, [x, -5, 5], [y, -5, 5],same_xy)$

(%i104) 

2019年7月20日土曜日

Maximaに裏から入る

 MaximaからLispのREPLへ移ることはできるけれど

(%i68) to_lisp();

Type (to-maxima) to restart, ($quit) to quit Maxima.

MAXIMA> 

 これだと、モードは「Inferior Maxima mode」のままなのでかなり不自由。
 やはりLispならslimeからだよね。
 というわけでMaximaでswankを動かす。

:lisp (load "パス名/swank-loader.lisp" :verbose t)
:lisp (swank-loader:init)
:lisp (swank::create-server :port 14005 :style :spawn :dont-close t)

 あとはポート14005番に「slime-connect」で接続すれば、Maximaを動かしつつ、裏からLispでいじることができる。

(%i7) wrk:444;
(%o7)                                 444

 なんてやって

MAXIMA> $wrk
444
MAXIMA> (setq $wrk 678)
678
MAXIMA> 

 見て変更して

(%i8) wrk;
(%o8)                                 678

 なんてことができる。だからどうした、という話だけれど。
 でもきっとこれで、ここ(Lisp)からgnuplotを使えるようになるんだよなぁ。

2019年7月18日木曜日

imaxima

 FreeBSDでimaximaが動いているせいでアスキーアートのmaximaに我慢できなくなった。
 MacBook AirにTeXをいれることにする。
 今度は用心深く最低限のTeX。

brew install basictex

 latexが見えないというのでパスを設定、そのほか。

;; imaxima
(setq exec-path (cons "/usr/local/texlive/2019basic/bin/x86_64-darwin" exec-path))
(autoload 'imaxima "imaxima" "Image support for Maxima." t)
(autoload 'imath-mode "imath" "Interactive Math minor mode." t)

(setq imaxima-fnt-size "large")
(setq imaxima-use-maxima-mode-flag t)

 やっと数式がきれいになった。グラフのインライン表示もできるようになった。

 ただ、Grapherではできた

1 > abs(x - y)

 のグラフはどうやったら描けるんだろう? できないのかな?

2019年7月16日火曜日

Maxima on Emacs

 同梱されているmaxima.elだと、数式はアスキーアートになる。

(%i3) expand ((x + y)^6);
           6        5       2  4       3  3       4  2      5      6
(%o3)     y  + 6 x y  + 15 x  y  + 20 x  y  + 15 x  y  + 6 x  y + x

 それをTeXで

 という風に、きれいに表示するimaxima.elもあるので、TeXをインストールした。そうしたらひどい目にあった。
 MacTeXをいれたのだが、ディスクが満杯になってしまったのだ。MacBook Airの動きがおかしくなる。いや、もしかしたらMacTeXのせいではなく、タイミングわるく別の何かがあったのかもしれないのだが——。
 結局、MacTeXインストール以前の過去にもどることにした。
 TimeCapsuleを使って。
 ——24時間以上かかった。24時間前にもどるのに24時間以上かかるとは。
 はあ。

 wxMaximaではなぜか、gnuplotがうまく動かないし。突然、ロシア語になるし。
 しかたないのでアスキーアートで使うか、といじっていたらdescribe()が効かないことに気づいた。

(%i33) describe(sum);
No exact match found for topic `sum'.
Try `?? sum' (inexact match) instead.

(%o33) false

 ——はい?
 試しにFreeBSDへいれてみたMaximaはちゃんと動く。imaximaもちゃんと動く。数式もきれいだ。もうFreeBSDでいいじゃないか、と思ったけれど、CPUパワーがちがいすぎるし、ネットごしだし、オフラインだと使えない。
 SBCLが見えるところにないことが原因か、と

brew install sbcl

 したり、

brew install --build-bottle maxima

 buildしなおしたりしたけれど、解決せず。
 FreeBSDでは出力されていないので原因は起動直後にでるこのwarningらしいのだが。

warning: ignoring an empty documentation index in /usr/local/Cellar/maxima/5.43.0/share/info/./

 わからん。なぜだ。
 Maximaでswankを動かしてslimeで裏から入って調べてみたりして——ソースを見てみるか、とbuildしたときにもってきたソースをのぞいたらinfoディレクトリの下にあるmaxima-index.lispのサイズが妙にちがう。いかにもな名前だし、このlispが動くことによってdescribe()のデータベースができるのだ、と当たりはつけていたのだけど。
 中身をコピーしてみた。
 立ち上げなおした。
 ——動いた。

(%i1) describe(sum);


 -- Function: sum (<expr>, <i>, <i_0>, <i_1>)

     Represents a summation of the values of <expr> as the index <i>
     varies from <i_0> to <i_1>.  The noun form ''sum' is displayed as
     an uppercase letter sigma.

【中略】

(%o1) true

 くそお。

2019年7月14日日曜日

Maxima

 Maximaを入れた。

brew install maxima

 中身はCommonLispで書かれている、と聞いて興味を引かれたからだ1。元々、Mathematicaがバンドルされていることを知ってRaspberry Piを買うくらいには数学に憧れている文系だ。当然、インストールする。それがCommonLispでできているとなればなおのこと。数学は全然、わからないけれど。

Maxima 5.43.0 http://maxima.sourceforge.net
using Lisp SBCL 1.5.3
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bugreport() provides bug reporting information.

 installしていてあれ? と思った。
 SBCLがインストールされなかった2。必要なんじゃねーの?

brew info maxima

 してみると、

==> Dependencies
Build: sbcl ✘
Required: gettext ✔, gnuplot ✔, rlwrap ✔

 となっている。あ、requireではなく、SBCLでbuildされているのか。本体はコアダンプだから必要ないというわけか。

Footnotes:

1

Emacsから使えるということも一因。

2

roswellには入っているけれど、brew的には入っていない。

2019年7月12日金曜日

Grapher

 奥の方にしまいこまれるようにMacBook Airには「Grapher」というアプリケーションがある。数式を指定するとグラフを描いてくれる。

y=x

 とか。

 じゃ、こんなんは?

1 > abs(x - y)

 描けた。しかも範囲も認識している。
 当然、3Dも描ける。Exampleにはこんなんまである。

 しかもマウスでぐりぐり動く。
 すげー。数式の意味はさっぱりだけど。

2019年7月1日月曜日

brewでinstallしたらEmacsがうまく動かなくなった……。

 いろいろupgradeしたのでついでにEmacsもupgradeした。
 ——動かなくなった。
 あれ? なんで?
 コード系の文句をいわれている。
 しかもterminal onlyのようにも見える。
 コンパイルオプションはどうなっておるのだ。でも「brew info」では表示されなくなっている。すったもんだしていたらbottoleの中身を見る方法を見つけた。——「brew cat」

bash-3.2$ brew cat emacs
brew cat emacs
class Emacs < Formula
  desc "GNU Emacs text editor"
  homepage "https://www.gnu.org/software/emacs/"
  url "https://ftp.gnu.org/gnu/emacs/emacs-26.2.tar.xz"
  mirror "https://ftpmirror.gnu.org/emacs/emacs-26.2.tar.xz"
  sha256 "151ce69dbe5b809d4492ffae4a4b153b2778459de6deb26f35691e1281a9c58e"

  bottle do
    sha256 "dc49de7034346e692662d10ebacd75ea257d61ebba6f57699b855f158e4a7eda" => :mojave
    sha256 "de836e0766066201968c2dd0ef25ff4458ee532a61dc4ed9d7d8fb284b395b8d" => :high_sierra
    sha256 "6b07616447d66a8066c08591400dc8fed75d44bf51f81de2e1208635e03204c6" => :sierra
  end

  head do
    url "https://github.com/emacs-mirror/emacs.git"

    depends_on "autoconf" => :build
    depends_on "gnu-sed" => :build
    depends_on "texinfo" => :build
  end

  depends_on "pkg-config" => :build
  depends_on "gnutls"

  def install
    args = %W[
      --disable-dependency-tracking
      --disable-silent-rules
      --enable-locallisppath=#{HOMEBREW_PREFIX}/share/emacs/site-lisp
      --infodir=#{info}/emacs
      --prefix=#{prefix}
      --with-gnutls
      --without-x
      --with-xml2
      --without-dbus
      --with-modules
      --without-ns
      --without-imagemagick
    ]

    if build.head?
      ENV.prepend_path "PATH", Formula["gnu-sed"].opt_libexec/"gnubin"
      system "./autogen.sh"
    end

    system "./configure", *args
    system "make"
    system "make", "install"

    # Follow MacPorts and don't install ctags from Emacs. This allows Vim
    # and Emacs and ctags to play together without violence.
    (bin/"ctags").unlink
    (man1/"ctags.1.gz").unlink
  end

  plist_options :manual => "emacs"

  def plist; <<~EOS
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>KeepAlive</key>
      <true/>
      <key>Label</key>
      <string>#{plist_name}</string>
      <key>ProgramArguments</key>
      <array>
        <string>#{opt_bin}/emacs</string>
        <string>--fg-daemon</string>
      </array>
      <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
  EOS
  end

  test do
    assert_equal "4", shell_output("#{bin}/emacs --batch --eval=\"(print (+ 2 2))\"").strip
  end
end
bash-3.2$ 

 ——で?
 なんでMacなのに「–without-ns」になっているんだろう?
 もうHomeBrewはMac用のパッケージ管理システムではないんだなぁ……。
 しかたないのでCASKからインストールした。

2019年6月29日土曜日

SBCLをバージョンアップ

 roswellを使ってMacBook AirのSBCLをバージョンアップした。

ros install sbcl/1.5.3
CL-USER> (lisp-implementation-type)
"SBCL"
CL-USER> (lisp-implementation-version)
"1.5.3"

 しなくてもいいかな、と思っていたのだけど、関数へjumpする「slime-edit-definition」で微妙にソースの場所がずれる——最新版にすれば、だいじょうぶじゃね?
 正解だった。

2019年6月27日木曜日

AquaTermが使えない……。

 gnuplotをupgradeしたらグラフが表示されなくなってしまった。
 調べてみると、AquaTermって何? っていっている。
 ああ、これはbrewでインストールしたバイナリが「–without-aquaterm」されているんだな。というわけで、brew installで「–with-aquaterm」オプションをつけようとしたら——あれ?
 できない。
 brew 2.0で仕様が変更されてできなくなってしまったらしい。
 なんてことだ。
 しかたないのでソースをもってきて——ライブラリがupgradeされてしまっていてgnuplotを元にもどしても動かなくなってしまったのだ——「–with-aquaterm」でconfigureしたのだけど……。
 有効にならない。
 どうやらAquaTermは未サポートになってしまったらしい。
 かわりにgnuplot_qtなるものが提供されるようになっていたのだけれど。
 ところがこれだと、線分の端が丸まってしまう。
 なんじゃあ?
 いろいろいじってなんとか、gnuplot_qtのターミナルの設定の中に線分の端を丸めるか、どうかのオプションを見つけた。

追記:いつのまにか、 --build-bottleというオプションができていた。これでコンパイルできるのかも。

2019年6月25日火曜日

ZFS

 ZFSはたしか、圧縮して実際に使用するディスク量を減らすことができたはず。
 その設定をしようか、と思って今の状態を調べてみると。

zfs get compression

 おや、どのデータセットも圧縮する設定になっている。
 どのくらい圧縮されているんだろう?

$ zfs get used,logicalused zroot
zfs get used,logicalused zroot
NAME   PROPERTY     VALUE  SOURCE
zroot  used         7.05G  -
zroot  logicalused  13.0G  -
$

 半分ぐらいになっていた。
 そうか。それでリストアを試してみたとき、10Gを超えていたのか。

 というか、これだとディスク容量を節約するために不要なファイルを圧縮しても意味がないんだな。
 ふむ。

2019年6月23日日曜日

2019年3月17日(日):館山北条海岸:晴れ

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

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 13:40-13:59 19分 2.1km 34.74km/h 6.70km/h 28.63
2 14:03-14:13 10分 1.4km 31.73km/h 8.08km/h 16.50
3 14:27-14:55 28分 1.5km 23.91km/h 3.19km/h 0.61

total 57分 5.0km 5.2km/h

2019年6月21日金曜日

Excel-grep

 まぁ、やはり一番、よく使うのはgrepなわけですよ。
 テキストファイルならそれでいいんだけど、Excelファイルががっつりあったりすると泣けてくる。
 Windowsのエクスプローラーから検索できるんだけど、なんか使い方がよくわからないのでストレス。だったらjavaのPOIでExcelの中身を見れるんだから——ABCLで取りこめばいいんじゃね?
 で、つくってみる。

 あとはslime経由でEmacsにデータを取りこんでごにょごにょする、と。

 ちょっと「jinput-stream」をcloseしてないのが気になるけど、ま、いいか。

2019年6月18日火曜日

2019年6月16日(日):検見川浜:晴れ

* Sail:ZONE 4.7(NEIL PRYDE) Board:NG ACP 260 Fin:9.5inch

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 10:25-10:41 15分 1.2km 20.47km/h 4.67km/h 1.22
2 11:15-11:41 26分 2.3km 26.60km/h 5.14km/h 2.82
3 12:48-13:00 12分 1.3km 28.72km/h 6.21km/h 2.68
4 13:04-13:12 8分 1.2km 31.90km/h 8.91km/h 29.27
5 13:20-13:29 8分 1.2km 33.85km/h 8.62km/h 15.96
6 14:01-14:11 10分 0.2km 7.95km/h 1.09km/h 0.00
7 14:36-14:45 9分 0.9km 19.62km/h 5.72km/h 3.90

total 90分 8.2km 5.5km/h

 朝起きて行くのをやめようか、と思った。
 ひさしぶりすぎてなんかストレスを感じる。それでもしぶしぶ、検見川浜へ向かう。心配は青潮だった。急に暖かくなったので発生していたらどうしよう。あれはとても臭い。富津より南下すれば、だいじょうぶなことはわかっているけれど、そこまで行く根性がない。
 検見川浜の海岸通りからのぞむ海は真っ白だった。
 カイトが舞っている。
 朝いちから海にでているセイルは二十艇近く。浜に置かれているセイルは四点台前半。途中、5.3のセイルを抱えて駐車場へもどるセイラーとすれちがう。小さいサイズにチェンジするのだろう。
 うわー、どうしよう。やはり来るんじゃなかった。
 4.7をセレクトして板は浮力のない255を選んだ——ところがセッティングして浜へ道具を運ぶころには風は落ち、さすがに255では無理だった。浮力のある260をあらためて持ち出したけれど、それでも風は足りなかった。
 満ち潮になったらまた、風が上がる。
 駐車場のあちらこちらから聞こえてくる声を聞きながら待つ。セイルをセッティングしなおすのも面倒だったのでサイズはそのまま。朝いちから出撃して満足して帰路につく人もちらほら。
 一度、上がってすぐに落ちた。出艇してはまる。あやうくブロックに流されるところだった。
 沖は真っ白なんだがなぁ。
 5.3でも足りない風。なら5.7か。セイルを換えたとたん、吹き出して裏目を引く予感がする。そのままでも裏目を引く予感がするけれど。
 12時になってようやく風が入りだした。
 みんな、走り出した。
 だけどぼくは走らない。何度か、プレーニングしたけれど、ウォーターできなくてはまりかけることもしばしば。だめだ〜。身体も動かないし、セイルにパワーがなくてスカる。そもそも4.7+260の組み合わせはあかん、ということを思い出した。
 そこで255をひっぱりだしたのだけど、板は海底まで沈んだ。
 3時をまわったところで完全に息があがってしまった。撤退。
 まぁ、思いつきでリペアした4.7は使えそうだ、ということはわかっただけでもよしとすべきか。
 ただ使う機会がない、ということも判明してしまったけれど。