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年も前。
 なんだ、そういうことか。