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"