2020年6月29日月曜日

超音波洗浄機

 「決してマネしないでください。」を読んでいたらワインに醤油を少量たらし、超音波洗浄機で攪拌すると、味に深みがでるという話がでてきた。おおっ、たしかに超音波洗浄機は攪拌機として使えるんだな、と思って欲しくなった。酒は飲まないひとなのだけど。
 調べてみると、買えない値段じゃない。

 思ったより小さい。
 眼鏡を洗って次にコーヒーカップを洗浄してみた。

 たしかにきれいになっているような気がする。
 眼鏡など、煙のようなものがでているし——これが人の脂とかの汚れなんだろうな。

 ほかにいろんなものを洗浄しようと手ぐすねをひいていたのだけれど 1、洗浄しているときの音にうちの娘——猫がビビって超警戒モードにはいる。たぶん人間の耳には聞こえない音が響いているのだろう。
 しかもおれ自身も気分が悪くなってくる。頭痛がする。
 これはだめだ。

 ——返品した。

Footnotes:

1

野菜とか。

2020年6月25日木曜日

眼鏡

 起きると、何もかもがぼんやりとしている。
 眼鏡をかけていないからだけど、ここで問題がある。眼鏡を探すためには眼鏡をかける必要がある。
 なのでいつも手探りだ。置いたあたりを見当つけて。
 しかも今は眼鏡は三種類、使いわけている。
 読書用、パソコン用と運転用。
 これが困る。
 探すのにとても手間取る。
 特定の場所に置いておくのが吉。というわけつらつら考えた。
 ここならどうだろう?

 ディスプレイの上端。

2020年6月24日水曜日

余命

 余命は次の年になれば、1年未満、減少するはずだ。
 つまり余命からもとまる死ぬ年は年を経るごとにすこしずつ、延びる。
 これは別に不思議でもなんでもなく、死んでしまった人間は算入されないからだ。
 いわゆる生存者バイアスというやつ。
 表のように、60歳の余命は23.84歳なので、83.84歳までだけど、85歳まで生き延びてしまったら、91.35歳までが余命となる。

 何が問題か。
 死ぬ歳を85と、設定するわけにはいかない、ということだ。
 ただ、年齢間の差分は縮まっているので、まぁ、90歳前後には死ぬだろう。というか、死んで欲しい。苦しまずに。

年齢 余命 差分
90 4.33 2.02
85 6.35 2.71
80 9.06 3.23
75 12.29 3.55
70 15.84 3.86
65 19.70 4.14
60 23.84 4.37
55 28.21 4.53
50 32.74  

2020年6月22日月曜日

鼻毛カッター

鼻毛カッターが動かなくなったと思っていたら、中で鼻水が固まっていた。

2020年6月17日水曜日

リタイヤ後の費用

  リタイア後の年間にかかるお金を250万と見積っているのは根拠のないことじゃない。
 というのも今までの人生の中で何度も働いていない時期があってそのとき、そのくらいかかっていたのだ。つまり経験則。ちなみに競馬の負けはふくまれていない。あれは費用ではなく、収益に計上していた。
 内訳はこんな感じだった 1

家賃 37.09%
自動車 20.70%
食費 12.95%
税金 11.40%
生活費 4.25%
電話 3.32%
その他 10.30%

 働いていないのなら自動車を持つなよ、という話だな。今さらながら反省だ。もっと若いころに反省しておけよ、ということもふくめて。
 税金があるのは無収入でも地方税とか、国民健康保険がかかるからだ。

 やはり家賃が大きい。
 別に身分不相応なところに住んでいたわけじゃないからこんなもんだろう。
 これを減らすのがリタイア後の当面の目標になるか……。

Footnotes:

1

GnuCashでなら簡単に円グラフを出力したりできる。

2020年6月16日火曜日

scrapbox

 Safariのbookmarkを整理していたら、scrapboxへのlinkがでてきた。
 scrapbox自体は昔から知っていてたぶん使ってみようか、とアカウントをつくってそのままになっていたのだろう。いつのまにか、有償版ができている。
 とりあえず、 新しいプロジェクトをつくる。
 さて。

2020年6月10日水曜日

適当に生きてきたツケを適当に払う

 老後のことを今さら、考えてもしかたないのだけれど。
 そもそもこの年まで生きるとは思ってなかった。十代のころには二十前に、死ぬと信じていたし、二十代にはまさか、三十まで生きることはないだろう、と。
 なので適当に生きていたら、四十もこえて、いまや六十目前じゃないか。
 しまった。
 もしかしたらおれは死なないんじゃないか?

 なーんも考えてないぞ。

 とりあえず、あと何年ある?
 厚生労働省の平均余命の 資料を見ると、きっちりした区切りにはいないが、だいたい24、5年というところ。
 25年。——予想以上に長い。
 仮に年間の生活費が250万すると、6250万円……。
 あるかっ、そんな金。

 だいたい、25年も何をするというんだ。好奇心も体力も脳みそも衰えたこの状態で。
 ひたすら茫漠とした無為の日々になるだろう——いや、待てよ。それも悪くないかも。
 今までも無為な日々だったわけだし。

 結局、どんな死に方をするのか、わからないのが問題なんだよなぁ。
 痛みと苦しみのない死に方を望んだとしてもそうなるとはかぎらないし。
 そうなると、今までどおり、いきあたりばったり。
 適当。
 そうなる。

2020年6月8日月曜日

強制換気

 夏場、帰宅すると、もわっとする。
 温室効果というやつか。窓をすこし開けていってもほとんど、かわらず。なんとか、ならんものか。
 要は強制的に換気してやれば、いいわけだ。

 ソーラーパネルにUSBファンの組み合わせ。
 どうだ。
 これなら陽射しが強くなれば、なるほど、換気される——はず。

2020年6月4日木曜日

ミルク泡立て器、ミルクフォーマーあるいはクリーマー

  デイヴ・アスプリー「シリコンバレー式 自分を変える最強の食事」にバターコーヒーをつくるときにはブレンダーを使えとある。クリーミーになる、と。
 面倒なので、水筒にいれて振って代替としていたのだけれど、ふと世間を見回してみると、ミルクフォーマーなる泡立て器があることを知った。クリーマーともいうらしい。
 購入した。

 使った。
 うおおっ、すげー、泡立つ。
 なるほど、クリーミーだ。
 ただ油断するとあたりにバターコーヒーを撒き散らしてしまう。

2020年6月3日水曜日

還暦

  Wikipediaによると

還暦(かんれき)とは干支(十干十二支)が一巡し誕生年の干支に還ること。

 だそうだ。
 つまり、12と10の最小公倍数ということか。

(lcm 12 10)
60

 うん。あってるみたいだ。

2020年5月22日金曜日

笠井潔「新版 テロルの現象学――観念批判論序説」(3)

 「補論 68年ラディカリズムの運命——『テロルの現象学』以後三十年」を読んでこれは「例外社会」だな、ということはわかったのだけれど、すぐにもしかしたら自分は「例外社会」を誤読しているんじゃないか、と不安になった。これは「例外社会」を読み直すしか、ないなぁ。
 とくに「コントロール社会」については。
 これは新しい世界の局面——ジョージ・オーウェル「1984年」の監視社会とはちがう世界の到来ではないか、と思っていたのだけど、本論の「新版 テロルの現象学――観念批判論序説」を読んだあと、待てよ、と思い直した。笠井潔は明確に述べていない(と思う)けれど、もしかしたら「コントール社会」というのは「共同観念」と把えることもできるんじゃないか、と。
 そうすると、外部を隠蔽しつづけ、累積しつづける「自己観念」は——。

 そもそも「科学」もまた、外部を隠蔽する「自己観念」にすぎないのではないか 1
 不思議として体験される外部が法則化され、内化される。それで外部はコントロール可能なものと認識されることになる——ただ、科学自体はそのことに自覚的なのかもしれない。カール・ポパーの哲学のように。

Footnotes:

1

いや「共同観念」なのか?

2020年5月21日木曜日

笠井潔「新版 テロルの現象学――観念批判論序説」(2)

 今回、読み返して一番、驚いたのは——どうでもいいことなのだが——、浅田彰の「構造と力」からの引用があったことだった。えっ、まさか、書き加えたの? と思って1984年版をひっぱりだして確認してしまった。
 頭の中で次のような時系列になっていたらしい。

  1. 笠井潔「テロルの現象学」出版
  2. 浅田彰「構造と力」出版
  3. 笠井潔「《戯れ》という制度」出版

 「《戯れ》という制度」の中でポストモダン——浅田彰を批判していた(と思う 1)ので、なんとなく、「テロルの現象学」が上梓されたあとに、「構造と力」がきっかけで日本のポストモダンの隆盛が起きた、と思っていたのだ。考えてみると、「テロルの現象学」は1984年の出版なのだから80年代に起きたポストモダンとは充分に同時期だったんだ…… 2
 そもそも赤塚不二夫がたしか「 赤塚不二夫のキャスター」で浅田彰の「構造と力」をパロったときはまだ、「テロルの現象学」を読んでなかったんだよな 3。まったく浅田彰を認識していなかったんだろうけど(今もだけど)。だいたい浅田彰を認識したのは笠井潔の評論を経由してあのときのはあれはあれか、と気づいただけだしなぁ。

Footnotes:

1

本を所有してないので確認できないけれど。

2

調べたら浅田彰の「構造と力」は1983年に出版されていた……。

3

読んだのは1990年。

2020年5月20日水曜日

笠井潔「新版 テロルの現象学――観念批判論序説」(1)

 たしか、出版されてすぐに購入したはずだからもう7年 1になる。
 どんだけ積読んだよ、という話だけど、ひとつには新版じゃない「テロルの現象学」は読了済みだったということもある。同じ作品社からでていた本——真っ赤な本だ。新版だからといって内容が変わったわけでもないし——あとがきには文章を多少、読み易くしただけ、とある——、なぜ、購入したか、というと、書き下ろしの補論が読みたくてだったのだけれど、そちらも途中で挫折してすっかり積読してしまった。
 ようやく読了できた。

 実は一度読んだ本を読み返すことはほとんど、しない人なのだけれど、これだけはいつか読み返そうと思っていた。なぜか、というと、よく理解できなかったから。読み終えたときに、今、理解していることはたぶんこの本のごく一部で、しかも正しく理解していないかもな、と。
 それから笠井潔の評論本を読みつづけてようやくくりかえされるさまざまな断片からなんとなく、「テロルの現象学」の内容がうすぼんやりとわかったような気になっていた。今回、再読してそれがすべてひっくり返されるということはさすがになかったけれど、やはり理解不足を痛感した。
 今だにまだ、ちゃんと理解し切れてないような予感はあるけれど。

 いつか、再々読できれば、いいな。
 すくなくともドストエフスキィの「カラマーゾフの兄弟」を読んでから。

Footnotes:

1

奥付には2013年とある。

2020年5月19日火曜日

if文に隠蔽される処理

 たとえば、変数の値によって関数の呼び出しをかえるような処理は、普通のプログラミング言語だと

 if(変数A == 999){
    処理関数(1);
}  else {
    処理関数(2);
}

 みたいな書き方をする。
 もちろん、Lisp系でも同じような書き方ができるけれど

( if (= 変数A 999)
    (処理関数 1)
    (処理関数 2))

 こんな書き方もできる。

(処理関数 ( if (= 変数A 999)
              1
              2))

 後者の方が見易いような気がする。というのも

(処理A)
( if (条件)
    (処理B 1)
    (処理B 2))
(処理C)

 となっていると、if文の中に処理がほんのわずかに隠されて処理の流れが見づらなるような。

(処理A)
(処理B ( if (条件)
           1
           2))
(処理C)

 ね?

2020年5月18日月曜日

mapcarとloop

 elispを独習しはじめたころ、おおっ、と感動したのは「mapcar」の存在だった。
 何を感動したのか、というと、それがループ処理だった、ということ。よくあるバグにループの脱出条件のミスって永久ループしてしまう、というのがあるけれど、これならかならず、終了するじゃないか。なので最初のころ書いたコードは「mapcar」だらけになってしまった。
 ところがある日、そのコードを読み返していて気づいた。
 ——読みづらい。
 「mapcar」の引数は

(mapcar 処理 リストを生成する処理)

 となっているので、処理の順番という意味ではうしろから読み解かなくていけないのだ。
 それが脳みそに余計な負荷をかけている。
 もちろんすぐにloopマクロの存在に気づいて、今ではloopマクロを使いまくりなのだけど。

( loop for x in リストを生成する処理
      collect 処理)

 こちらの方が「リストを生成する処理」「処理」と読んでいけるのでものすごく楽。
 今や「mapcar」はワンラインで書けるサイズでないと、書く気がしない、という。

2020年5月1日金曜日

or

 ぱらぱらとEmacsのライブラリの中身を眺めていたら次のようなコードをぶち当たった。

(goto-char ( or point1 point2))

 もちろんこのままじゃないけれど。
 わかるよ。point1か、point2が設定されているところへカーソルを移動する。うん。
 あんまりあっさり書けてしまっていたのでひっくり返ってしまった。

2020年4月30日木曜日

二画面分割を左右分割から上下分割へ切り替える

  Dell 27 MonitorになってからEmacsを左右二画面分割して使うことが多くなった。
 横長だからだけど、それでも時々、上下二分割にしたいことがある。しかも左右二分割した画面を、上下に切り替えたい。そんなコマンドはないものか、と探してみたけれど、見つけることができなかった。いちいちCtrl+x,1で全画面化して二分割して……ああ、面倒臭い。

 つくる。
 適当に配置をrotateさせるのでたぶん、4回、呼び出すと、元の位置に戻るはず。
 それにしてもダサいな、このコード……。

2020年4月22日水曜日

MacBook AirとHDMI接続とUSB-C Digital AV Multiportアダプタ

  MacBook Air (Retina, 13-inch, 2019)を購入したのが、今年のはじめだからもう四ヶ月になる。
 ずっと苦しんでいた。
 何がって?
  Dell 27 MonitorとのHDMI接続してあるモニタの表示である。
 よく瞬断するのだ。画面がブラックアウトする。とくに立ち上げ時はひどく、何度もくりかえした末、ブラックアウトしたままになってしまう。 USB-C Digital AV Multiportアダプタをつついたり、HDMIのケーブルのかるく揺さぶったりすると、治る——治るというか、治るまでくりかしているだけなのだが——。
 これがものすごいストレスだ。
 VGA接続に換えようか、と思ったけれど、Amazon Primeビデオとか、視聴するにはHDMI接続は必須なのだ。
 まいった。だいたい、VGA接続にしてもアダプタが原因の予感があるので同じ事象が起きるような気がする。

 ケーブルを換えてもだめだし、他の機器では起きない。MacBook AirとUSB-C Digital AV Multiportアダプタの組み合わせのときのみ起きる。モニタのスリープ設定とか、スクリーンセイバーが影響しているか、とすべてオフにしてもだめだった。

 事象がはっきりしないし、ググっても同じような事象が見つからなかったので 1——Appleに苦情を伝える方法もわからず——、我慢していたのだけれど。

 実は電波干渉をずっと疑っていた。
 というのも近くをバイクが走り抜けたときや、隣の部屋で電灯を切ったときによく発生していたからだ。
 USB-C Digital AV Multiportアダプタには何か、電子回路が内蔵されているらしく、使っていると熱をもってくる——それが、ノイズでリセットが発生しているのではないか? 2
 立ち上げ時によく起きるのはDell 27 Monitorが発している電波 3と干渉しているのではないか?

 そこでアルミホイルで覆ってみた。

 がっつり発生頻度が減った。
 ただ、それでもまだ、起きる。もしかしたらケーブルがノイズをひろっているのかも。
 でもケーブルを換えても症状はかわらなかったんだよなぁ。
 ふとAppleTVのケーブルに交換してみることを思いつく。このケーブルはけっこう、高級らしく、端子が金色に輝いている。

 で、交換したらまったく起きなくなった。
 ありゃあ、なんてことだ。原因はケーブルか。
 そういえば、使っていたケーブルはRaspberry Piのキットに付属してきたものでいかにも安っぽかったのだった。
 まぁ、念のためにアルミホイルに覆ったままだけど。

Footnotes:

1

今、ググったらあった。

2

bluetoothの影響も受けているような感じもある。

3

スリープモードのモニタが復帰したとき、強く電波をだすのではなかろうか。

2020年4月20日月曜日

COVID-19 CORONAVIRUS PANDEMIC

 パンデミック宣言されるすこし前ぐらいに、致死率は武漢の情報から2%ぐらいだという記事を見た記憶があるのだけど。

 WHOのテドロス・アダノム・ゲブレイェスス(Tedros Adhanom Ghebreyesus)事務局長はスイス・ジュネーブでインターネットを通じ行った記者会見で、「われわれは新型コロナウイルス感染症(COVID-19)が急速に拡大すること、致死率が2009年のインフルエンザのパンデミックよりも10倍高いことを把握している」と述べた。

新型コロナの致死率「H1N1の10倍」 終息にはワクチン必要とWHO

 具体的にどれくらいなのか、さっぱりわからん。
 なので こちらからデータをひろってみる。「April 19, 2020 04:01」のデータ。

感染者数 死者数 率(%)
World 2,289,508 157,539 6.9
中国 82,719 4,632 5.6
イタリア 175,925 23,227 13.2
日本 9,795 154 1.6
韓国 10,653 232 2.2
アメリカ 716,883 37,659 5.3
英国 114,217 15,464 13.5

死者数 ÷ 感染者数 × 100 で計算(小数点第2位で四捨五入)

 5〜8%、という感じなのかなぁ。英国の13.5%は意外だった。イアリアの13.2%は医療崩壊寸前までいったはずだから納得なのだけど。
 というか、日本と韓国が低すぎてちょっと不安になる。これから死者数が増えるのか、たんに感染者数が偽陽性か、なにかで多くカウントされてしまっているのか……。きっと前者なんだろうな……。

 追記:これは案外、逆で韓国の数値が一番、実体に近いのかも、という気がしてきた。重篤患者を優先的に検査をしていれば、当然、致死率は大きくなるだろうから。

2020年4月12日日曜日

Emacsでscheme(Script-Fu)を

 いちおう、schemeとしてGaucheをインストールしてあるのだけど、elispやslimeが使えるCommonLispにくらべていまいち、使っていなかった。schemeでしか、できないことが見当たらなくて。call/ccぐらいかなぁ。じゃ、いいや、という。

 待てよ。
 Gimpがあるじゃないか 1
 Emacsから使えるならおもしろいんじゃないか。

  Gimp modeに載っているgimpmodeや、gimp-shell.elを試してみたのだけれど。
 ところが気づいてしまった。
 MacのGimpは Split Viewが使えない。

 こんな感じの使い方を想定していたのに。

+-------------+------------+
|             |            |
|             |            |
| Gimp        |  Emacs     |
|             |            |
|             |            |
|             |            |
+-------------+------------+

 一気に冷めてしまった。

Footnotes:

1

GimpのScript-Fuはscheme。

2020年4月1日水曜日

「Magic Keyboard」とWindows10

 「Magic Keyboard」をWindows10にbluetooth接続して使っていたら何か、おかしい。
 アンダースコアが入力されていない。バックスラッシュと縦棒も。

 どうやらこの二つのキーが効かないらしい。
 何がなんやら——よくわからない。たぶん、Windows10で認識しているキーボードがおかしいのだろう。アンダースコアはいいけれど、バックスラッシュと縦棒はきつい。うーん……。
 ふと思いついてUSB接続にしたら入力できた。
 なんだかなぁ。

2020年3月10日火曜日

数独プログラム

 「 あらゆる数独パズルを解く」はPeter Norvigなのに、Pythonで書かれている。
 じゃあというわけでelispで書いてみた。

(2) ある値に対し、ユニットの中で置ける場所が1つしかないなら、その値をそこに置く。

 は、うまく動かなかったのでコメントアウトしているけど。
 それでも「 あらゆる数独パズルを解く」のページの問題はいちおう解けたからだいじょうぶだと思うけど。
 まぁ、よいか。

( defun  test ()
  ( progn (sudoku-init)
(sudoku-set  "
 . . 5 |3 . . |. . . 
 8 . . |. . . |. 2 . 
 . 7 . |. 1 . |5 . . 
 ------+------+------
 4 . . |. . 5 |3 . . 
 . 1 . |. 7 . |. . 6 
 . . 3 |2 . . |. 8 . 
 ------+------+------
 . 6 . |5 . . |. . 9 
 . . 4 |. . . |. 3 . 
 . . . |. . 9 |7 . . 
 ")
       (sudoku-solve)
       (sudoku-print)))

(benchmark 1 '(test))
| 1 4 5 | 3 2 7 | 6 9 8 |
| 8 3 9 | 6 5 4 | 1 2 7 |
| 6 7 2 | 9 1 8 | 5 4 3 |
|-------+-------+-------|
| 4 9 6 | 1 8 5 | 3 7 2 |
| 2 1 8 | 4 7 3 | 9 5 6 |
| 7 5 3 | 2 9 6 | 4 8 1 |
|-------+-------+-------|
| 3 6 7 | 5 4 2 | 8 1 9 |
| 9 8 4 | 7 6 1 | 2 3 5 |
| 5 2 1 | 8 3 9 | 7 6 4 |
 "Elapsed time: 0.179490s (0.093774s in 1 GCs)"

 ベンチマークもそこそこ。

2020年3月6日金曜日

dash.el(2)

 たとえば、(1 2 3)と(4 5 6)を組み合わせたい。

((1 . 4) (2 . 4) (3 . 4) (1 . 5) (2 . 5) (3 . 5) (1 . 6) (2 . 6) (3 . 6))

 みたいな感じに。
 そこで

( defun  y-combination-of-list (list1 list2)
   "list1の要素とlist2の要素を組み合わせた結果をconsして出力する。"
  ( loop for x in list1
        collect ( loop for y in list2
                      collect (cons x y))))

 というのをでっちあげた。でもこれだと結果は

(((1 . 4) (1 . 5) (1 . 6)) ((2 . 4) (2 . 5) (2 . 6)) ((3 . 4) (3 . 5) (3 . 6)))

 という風になってしまう。
 これを入れ子のリストではなく、フラットなリストにしたい。
 それで「 dash.el」の「-flatten」が必要だったのだけど。

(-flatten '(((1 . 4) (1 . 5) (1 . 6)) ((2 . 4) (2 . 5) (2 . 6)) ((3 . 4) (3 . 5) (3 . 6))))
((1 . 4) (1 . 5) (1 . 6) (2 . 4) (2 . 5) (2 . 6) (3 . 4) (3 . 5) (3 . 6))

 よくよく考えたら「dash.el」に、そもそもそんな関数があるんじゃないか? つらつら「 https://github.com/magnars/dash.el#functions」を見ていたら。

(-table-flat 'cons '(1 2 3) '(4 5 6))
((1 . 4) (2 . 4) (3 . 4) (1 . 5) (2 . 5) (3 . 5) (1 . 6) (2 . 6) (3 . 6))

 あった。

2020年3月5日木曜日

dash.el

 どのパッケージがきっかけでインストールされたのか、わからないけれど、「dash.el」がインストールされている。

;;; dash.el --- A modern list library for Emacs

 だそうだ。
 「-flatten」というのがあってお気に入り。

(-flatten '((1 2 3)(4 5 6)))
(1 2 3 4 5 6)

 で、素の ABCLを使っていて「flatten」が必要になった。
 「alexandria」をインストールすれば、いいんだろうが、諸事情というものがある。
 「dash.el」の「-flatten」が使えないもんだろうか。
 「–map」「–mapcat」「-mapcat」「-flatten」を喰わせてみたところ。

(-flatten '((1 2 3)(4 5 6)))
(1 2 3 4 5 6)

 動いた。

2020年3月3日火曜日

async.el

 helmをインストールすると、もれなくasync.elがついてくる。
 Emacsの非同期ライブラリである。
 バックグラウンドでEmacsをもうひとつ、立ち上げてそちらで処理させる、というもの。

( setq wrk (async-start
           ( lambda ()
             222)))
-- 割愛 --

(async-get wrk)
222

 システムモニタを立ち上げておくと、Emacsがもうひとつ、起動されるのがわかる。
 100個とか、無理だろうけど 1

( setq wrk ( loop for x from 1 to 10
                collect (async-start
                         `( lambda ()
                            ,x))))
-- 割愛 --

( loop for x in wrk
      collect (async-get x))
(1 2 3 4 5 6 7 8 9 10)

 カンマを使えば、変数の中身を展開できるけど、さすがにクロージャーでデータを渡すのは無理だろうなぁ。別プロセスだもんなぁ。スレッドならできるのだろうけど。
 ——と思ったけれど、やってみたらできた。
 驚いた。

( setq lexical-binding t)
t

( defun  wrk (x)
  ( lambda()
    x))
wrk

( setq wrk ( loop for x from 1 to 10
                collect (async-start (wrk x))))
-- 割愛 --

( loop for x in wrk
      collect (async-get x))
(1 2 3 4 5 6 7 8 9 10)

 なんで?

(wrk 1)
(closure ((x . 1) t) nil x)

 ああ、クロージャーはリストに展開されるんだ。
 なるほど。それならpipe渡しでも可能だ。あれ? ということはelispだからできるってこと?
 ほえぇ。elispはあなどれない。

Footnotes:

1

Emacs for Windowsでは10個でエラーになった。

2020年2月28日金曜日

slime-transpose-lists

 たとえば

((1 2 3)
 (4 5 6)
 (7 8 9))

 を

((1 4 7)
 (2 5 8)
 (3 6 9))

 という風に縦横を変換したい。
 パッと考えて二重ループで……とごちゃごちゃ考えたのだけれど、面倒臭い。きっとどこかにありそうだ。elisp、CommonLisp関連でググってもなかなか、見つからず、きっと名前に「tranpose」が入っているにちがいない、と考えてEmacsの「describe-function」で見つけた。

(slime-transpose-lists LIST-OF-LISTS)

Not documented.

 まさにこれ。ソースを見たら

( defun  slime-transpose-lists (list-of-lists)
  ( let ((ncols (length (car list-of-lists))))
    ( cl-loop for col-index below ncols
             collect ( cl-loop for row in list-of-lists
                              collect (elt row col-index)))))

 やはり二重ループ。
 それでもLispだとたったこれだけの行数で書ける。
 というか、簡単に書けてしまうから標準でなかったのかも。

2020年2月27日木曜日

(file-expand-wildcards "**/*.*")

 ああ、知らなかっただよ。

(file-expand-wildcards  "**/*.*")

 で、カレントディレクトリの下のファイルが全部、取得できるとは。
 eshellの「**/*.*」はこれは使っているんだろうなぁ。
 今さら気づくおれ。

2020年2月24日月曜日

2020年2月22日(土):検見川浜:晴れ

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

-No- 時刻 時間 帆走距離 最高速 平均時速 P%
1 11:49-11:57 8分 1.1km 29.59km/h 8.23km/h 25.62
2 12:28-12:36 8分 1.0km 34.76km/h 7.73km/h 14.77
3 12:46-12:56 9分 1.1km 16.94km/h 6.84km/h 0.56
4 13:22-13:35 13分 1.3km 22.09km/h 5.73km/h 3.24

total 39分 4.5km 6.9km/h

 夜中のうちにきちんとカメラの充電をしておいたのにハウジングを忘れてしまった。
 何をやっておるのか。
 海ほたる16m/sなのに、検見川は思ったよりも風が入っていない。沖合いに白波が見えるのだが。これでは最大サイズのセイルをだしても走らなそうだ。ここはやはり南総まで下るべきだったのだろうか。
 しかし、午後には風があがるだろうし、昨年に引き続き、いきなり4.7コンディションかぁ。
 とりあえず、目の前のコンディションにあわせて最大サイズのセイルをチョイスした。5.7である。
 体力がない自覚はあるのでかなり緊張して海へ出た。死なないように、と。
 毎年、体力の心配をしているけれど、今年は今までで一番、体力がない——三ヶ月絶対安静で入院していたときよりもない。あのときは退院して1週間ぐらいにそれなりに体力は回復した。今年はだめだ。
 案の定、一往復しただけで突っ伏して喉が痛くなるほど、ゼーハーしてしまった。
 たまたま、風に当たったらしく、プレーニングしたけれど。
 大休止して二本目。
 これもプレーニングできた。沈したけれど。
 三本目はほとんど、走らず。沖で沈して溺れかける。水面に浮かんでいる状態で深呼吸できず、酸欠になりかける。気を失なうか、と思った。去年も同じだったなぁ。
 ふたたび、風が上がってきたような気がしたけれど、出艇してみると、そんなことはなく、ふたたび、溺れかける。いかんじゃないか。
 なんか、午前中よりも風がない。
 夕方、吹き上がるパターンかな?
 でもまぁ、今日は終わりでいいか。

2020年2月12日水曜日

城平京/片瀬茶柴「虚構推理」(1)〜(6)

 読みはじめたらきっと一気に読んでしまうんだろうな。
 案の定で、ひと区切りの6巻まで買い進めながら読了してしまった。

2020年2月10日月曜日

elispでqueueもどき

 もしかしたら。
 threadとmutexの組み合わせたらキューっぽいことができるんじゃないだろうか?

( let ((lexical-binding t)
      (w (make-mutex)))
  (mutex-lock w)
  ( loop for x from 1 to  10
        collect
        (make-thread
         ( let ((y x))
           ( lambda()
             ( with-mutex w
               (insert (number-to-string y) " \n"))))))
    (mutex-unlock w))
nil
3 
4 
5 
6 
7 
8 
9 
10 
1 
2 

 処理順序は保証されていないけど、キューっぽいよな、これ。
 うん。

2020年2月4日火曜日

Ubuntuでの「ssh -Y」

  正月にUbuntuをいじっているときに気づいたのだけれど。

ssh -Y

 が使えた。
 きっとUbuntu Serverだからだろう、と思っていたのだけど、「Ubuntu 18.04.3 LTS」で試してみたら使えるようになっていた。以前、使えなかったのは何だったんだろう。
 とても助かるけれど、それなら 机の上にBeelinkS1をもってくることはなかったなぁ。

2020年1月31日金曜日

CD/DVD

 終活、というわけではないのだけど、CD/DVDを処分しはじめた。
 かつてハードディスクにはいり切らなくなったデータをCD/DVDへ焼きだしていたのである。当時のハードディスクは1Gとか、2Gとかそんなものでいい気になって保存していた。二十枚近くある。
 それでもこれだけのデータが今の——一世代前のだけど——、ハードディスクに納まってしまう。いったいあの日々はなんだったんだろう。
 しかも今はそもそもハードディスクに保存すること自体、なくなった。
 ネットがあるから。

 考えてみれば、かつてはフロッピィディスクが山ほどあったんだよな。処分してしまったけれど。DOS時代の遺物だ。データをフロッピィディスクへ吐き出していた。ハードディスクの容量が20Mで、むちゃくちゃ、大容量だと思っていた時代。

 そういえば、山ほどあったカセットテープも捨ててしまった。
 引っ越しで捨てざろう得なかったのだけど。
 かつてレンタルレコード店というものがあったのだ。まだ、CDもなく、ビデオテープも存在しなかったころ。ウォークマンが時代をつくった時代。
 そのあとに買い集めたビデオテープもすでに手元にはない。音楽CDもそうだ。iPhoneにいれてしまったので手元にもっておく意味がなくなってしまった……。

 思えば、あの日々はなんだったんだろう。
 それぞれの日々ではそれなりに一生懸命だったはずなのに。
 いろんなものを手元に残そうとしていたのに。
 今や何も残っていない。

2020年1月30日木曜日

128Gがふっ飛んで右往左往

 不安はもろもろあったのだけれど、BeelinkS1の 内蔵ディスクを128Gにした
 それでようやく重い腰をあげて 本格的に使おうか、と26Gもあるファイルをscpでコピーしていたら突然、動かなくなった。sudoも効かない。何? 何? 何が起きたの?
 何が起きているのか、さっぱりわからず、いろいろやってみていたら——あれ? ホームディレクトリが空っぽになっている。
 ZFSがまた、ぶっ壊れた。

 ところが翌日になると、うまく動いた。
 また、熱ダレだったか、と思って使っていると、ふたたび、おかしくなった。
 やはりだめだ。
 とりあえずBeelinkS1はWindows10として使うか。
 でもhome editionなのでRDPが使えない。
 クライアントとして使うしかない。しかたないのでマシン本体を机の上にもってきた。これがほんとのデスクトップ。なんちゃって。でももしかしたら使えるかもしれないので、FreeBSDをいれていたSSDにフォーマットをかけた。
 20GのDドライブができた。
 ——?
 128Gじゃない。
 何度、見直してみても20G。やりなおしても20G。ほんとうに壊れてしまっていたらしい。
 しかたがない。

 問題はWindows10とMacのやりとりだ。
 もちろんネット的にはつながる。けれど、26Gなんて馬鹿でかいファイルの転送はさすがに時間がかかりすぎるので外部記憶装置が必要だ。
 昔、使っていたお立ち台をひっぱりだす。
 160Gのハードディスクを突っ込んでNTFSでフォーマット。
 これでMacとWindows10でやりとりできるはずだ。
 Macにつなげて試した——ところがreadonlyだった。書きこめない。昔、読み書きができたように思っていたのだけど。どうやらかんちがいだったらしい。うーん、これはこまった。これじゃ、Windows10からMacへの一方通行しかできないじゃないか。今、やりたいのは逆方向のMacからWindows10なのだが。
 なのでexFATでフォーマットしなおした。
 これなら両方で読み書きできる。

 FreeBSDのSSDを納めていたスロットにはもうひとつ余っている128GのSSDをいれた。
 これはNTFSでフォーマットしてDドライブとして使うことにした。
 ほか、いろいろと設定をしているうちに、Macから操作ができないことに嫌になって、思わず、以前いれた Ubuntuをインストールしてしまった。128GのSSDに。
  UbuntuならVNCでMac上に表示できるからMacから操作できる。
 いちいちディスプレイをスイッチする必要がなくなる。
 いい考えだと思ったのだけれど、UbuntuはexFATを認識してくれなかった…… 1
 それで頭に来てお立ち台のハードディスクをNTFSでフォーマットしなおしてしまった。
 UbuntuはNTFSを読み書きできるけど、Macはreadonlyなんだから、元の黙阿弥ではないか。
 ——なんでおれは後戻りのできない性格なんだろう……。
 でも勝算はなくもなかった。
 Windows10はできないけれど、UbuntuはHFS+を読めるのである。readonlyだとしても。
 当然、MacはHFS+を読み書きできる。
 実はお立ち台はもう一台あってそれは現役でMac用に使用中。フォーマットはHFS+。
 2台あるお立ち台はいずれもMac、Ubuntu間では一方通行だけど、互い違いなのでデータの往復が可能なのである。
 ちょっと面倒ではあるけれど。

Footnotes:

1

きっと方法はあるのだろうけど、FreeBSDなら一生懸命探すのにUbuntuだと、見当らない、というだけであきらめてしまう。よくない傾向だ。

2020年1月29日水曜日

めも VirtualBox

 BeelinkS1のFreeBSDにVirtualBoxを「pkg install」した。
 installしたときに、設定方法が表示されたのでその通りにやれば、よかったのだけど、ゲストOSにメモリが1Gしか、割り当てることができなくて死んだ。

Message from virtualbox-ose-5.2.34:


VirtualBox was installed.

You need to load the vboxdrv kernel module via /boot/loader.conf:

vboxdrv_load="YES"

You also have to add all users to your vboxusers group in order to use vbox.

% pw groupmod vboxusers -m jerry

Reboot the machine to load the needed kernel modules.

Bridging Support:
===============

For bridged networking please add the following line to your /etc/rc.conf:

vboxnet_enable="YES"

USB Support:
==========

For USB support your user needs to be in the operator group and needs read
and write permissions to the USB device.

% pw groupmod operator -m jerry

Add the following to /etc/devfs.rules (create if it doesn't exist):

[system=10]
add path 'usb/*' mode 0660 group operator

To load these new rule add the following to /etc/rc.conf:

devfs_system_ruleset="system"

Then restart devfs to load the new rules:

% /etc/rc.d/devfs restart

Troubleshooting:
==============

Running VirtualBox as non-root user may fail with a fatal error
NS_ERROR_FACTORY_NOT_REGISTERED. In this case delete tmp.vbox-*-ipc file.

If you experience "Network: write Failed: Cannot allocate memory" errors
try to increase net.graph.maxdata in /boot/loader.conf

If you are using AIO, then increase these limits (PR#168298):
vfs.aio.max_buf_aio=8192
vfs.aio.max_aio_queue_per_proc=65536
vfs.aio.max_aio_per_proc=8192
vfs.aio.max_aio_queue=65536
To check if AIO is used use: kldstat -v | grep aio

Check wiki page for known issues and troubleshooting:
http://wiki.freebsd.org/VirtualBox

Please report any problems to emulation@. Thanks!
$

2020年1月28日火曜日

flet(2)

 cl-fletがあれば、レキシカルスコープとあわせてコードを分離できるじゃないか。「use」できないけれど、簡単なパッケージみたいなもんだよなぁ。よろこんで多用していたら——。
 あれ? 再帰呼び出しができない。ふうん、「cl-labels」を使え、ということらしいな。

FUNC is defined only within FORM, not BODY, so you can’t write
recursive function definitions. Use ‘cl-labels’ for that. See
info node ‘(cl) Function Bindings’ for details.

 ふむ。

2020年1月27日月曜日

Org-mode:(org-element-context)

 Org-modeでカレント行のTAGを取得したいことがあって自前でいろいろやっていたんだけれど。

(org-element-context)

 で取得できることに気づいた。
 こりゃあ、いい。

2020年1月24日金曜日

Org-mode:(org-edit-special)

 Org-modeは高機能だということは知っていたけど——だから知らない機能がけっこうあって。
 たとえば、よくソースの断片をメモしているのだけれど。

#+BEGIN_SRC elisp
(messge "ERROR")
#+END_SRC

 Org-modeの中だと、メジャーモードの機能が使えないので、別のところで修正してカット&ペーストでもってきたりしていた。
 ところが「Ctrl+'」とやると、別バッファで開いてくれる。そのうえ、指定したモードにしてくれる。上の例だと「elisp-mode」 1になる。

 これの何がいいのか、というと、SRCで指定しているモードは、Emacsのメジャーモードならなんでもいいはずなので、picture-modeとか、指定できるのだ。SRCの外だと、書いたpictureは勝手に整形されてしまうからこれは重宝する。
 SRCの中に置いておいて修正するときは「Ctrl+'」とやるわけ。

#+BEGIN_SRC picture
  -------+
         |
   <=====+
#+END_SRC

 もちろん、Org-modeも指定できるわけで無意味だけど、それはそれでおもしろい。

Footnotes:

1

正確には(emacs-lisp-mode)。

2020年1月23日木曜日

helm (2)

  helmが好きだ。
 これがあるだけでEmacsから離れられない。最近は自前のものまでカスタマイズする始末。

 たとえば、業務系のプログラム開発の現場だと、設計書はExcelで書かれていたりする。ファイル名にプログラムIDと機能名をつけたりしてね。プログラムIDは8桁のコードだったりして、けっこう泣ける。
 今時? とか、思うのだけれど、下っ端がいってもかわるものではなく——。
 プログラムIDがでてくるたびに一覧を探し出して、検索して機能名を調べたりするわけだ。
 ——めんどくさっ。
 なのでhelmにぶち込んだ。

 Emacsを立ち上げるときに設計書のフォルダを検索して生成したファイル一覧をhelmの「:sources」にする。ファイル一覧をプログラムIDと機能名の一覧にするわけだ。それをhelm検索する。
 これでプログラムIDをいれるだけで(中途半端でも可) 1、機能名がわかる。逆に機能名からプログラムIDも引ける。
 それをプロジェクトごとにつくってやると、なんと簡単な自前のデータベースができあがった。
 一覧をメンテナンスする必要がないところが、これのいいところ。
 「:preselect」でExcelで表示するようにしておけば、必要なときに設計書の参照もできる 2

 そうやってつくった複数の 3helmのデータベースをひとつのhelmのコマンドにまとめておけば、横断的に検索することもできる 4。すばらしい。

 でもおかげでプログラムIDを全然、覚え切れない。

Footnotes:

1

カーソルのある位置の単語でまず、絞りこむこともできる。

2

「:select」だと、つねにExcelが立ち上がるので。それはそれでわずらわしい。

3

テーブル一覧とか。これは裏でjava——正確には ABCL——をつかってExcelから抽出した。

4

複数のsourceは「Ctrl-o」で渡り歩くことができる。

2020年1月22日水曜日

loopマクロ

 たとえば、あるlistの中から奇数だけを抽出したい、というとき。

wrk
(1 2 3 4 5 6 7 8 9 10)
(loop for x in wrk
      collect
      (when (oddp x)
        x))
(1 nil 3 nil 5 nil 7 nil 9 nil)

 こうやると、nilがまじってしまう。このケースだと、remove-ifを使えば、いいのだけの話なのだけど——loopマクロでこんな風にしていた。

(loop for x in wrk
      append
      (when (oddp x)
        (list x)))
(1 3 5 7 9)

 なんかいまいちだなぁ。
 なんとこうできるのだった。

(loop for x in wrk
      when (oddp x)
        collect x)
(1 3 5 7 9)

 すげえな、loopマクロ。

2020年1月21日火曜日

format

 listのデータをformatで整形するの面倒臭いなぁ。carとnthとか、使うのはなんか、ちがうような気がする。
  CommonLispのformatのように簡単にできないものか。

 ん〜、もしかしたらapplyでいけるかも。

(apply #'format  "%s %s %s" '( "A"  "B"  "C"))
 "A B C"

 いけた。すばらしい。

2020年1月20日月曜日

2020年1月17日金曜日

GNU Screen

  1. sshでリモートサーバに入る。
  2. 作業する。
  3. sshを切る。

 このあと、ふたたび、リモートサーバに入って、2.に接続して作業を続けたい 1
 それには「 emacs –daemon」を使っていたのだけど、RaspberryPiでrebuildしていたらメモリ不足でemacsごと、落ちてしまった。バッファをずっと溜め込んでいるだろうからなぁ……。たしか、 GNU Screenで同じことができたはず。
 RaspberryPiにインストールした。

  1. sshでリモートサーバに入る。
  2. screenを立ち上げる。
  3. 作業する。
  4. Ctrl-a dでscreenからデタッチ。
  5. sshを切る。

 このあと、

  1. sshでリモートサーバに入る。
  2. screen -r

 これで前回デタッチされたscreenにアタッチされる。

 ただ、キーアサインがCtrl-aなのがなぁ…… 2

Footnotes:

1

コンパイルを流しっぱなしにしてそこへ戻る、というような。

2

行の先頭に移動するためによく使うのでこのキーアサインはきびしい。
設定ファイルをいじれば、いいんだろうけど。GNUなのにどうしてEmacs風じゃないんだろう……。

2020年1月16日木曜日

RaspberryPiのFreeBSDをrebuild

  RaspberryPiのFreeBSDはバイナリアップデートがサポートされていない
 パッチが公開されたとき、ソースからビルドしなおすことになるのだけど、今までやってみたことがないので試してみることにした。
 いわゆるmake world。
 「 ソースを用いた FreeBSD のアップデート」にあるとおりにやっていく。

 まずはソースをもってくる。これだけでも大変だった。でもsvnで管理されているから次からは差分アップデートになるはず。
 次は「make -j4 buildworld」——。
 延々、コンパイルが走ったあと、落ちる 1
 何度も試しあと、ようやく原因がわかる。メモリ不足だった。out of swapとか、なんとか。
 swapファイルを3Gにしてもだめだったのでそこであきらめた。
 最終的に「-j」指定なしでなんとか、終了した。

 次に「make buildkernel」——。
 落ちる。なんで? 「-j」なしなのに。ディスク容量をチェックしてみたら今までに見たことのない「-1G」という表示。なんじゃ、それ。いずれにしても32GのSDカードではリビルドするのに足りないらしい。「/usr/obj」の下が18Gもあった。
 無理か。
 色々、考えてUSDで外付けのハードディスクをマウントする。「/mnt」——そこへ中身を移動して「/usr/src」と「/usr/obj」のシンボリックリンクを張る。ところが、「make buildkernel」は継続できたのに「make installworld」に失敗してしまった。
 しかたなく、「make buildworld」からリトライ。
 成功。
 「make buildkernel」成功。
 「make installworld」成功。

 今にしても思えば、「/mnt」にマウントするのではなく、「/usr/obj」にマウントしてもよかった。
 「/usr/src」は差分アップデート用に残しておきたいので。

 まぁ、リビルトができることはわかっただけでも収穫。
 日単位で時間はかかったけど。

Footnotes:

1

最初、「-j」なしでやっていたのだけど、あまりにも時間がかかるので「-j4」でやっていた。

2020年1月15日水曜日

押井守監督「スカイ・クロラ」

 公開された当時、「また、いつもの押井守」という映画評を見かけた。「空中戦だけはいい」ともあった。だれがそう書いていたのか、まったく覚えていない。
 けれど原作者の森博嗣の「押井作品の中で最高傑作かもしれない」というのを読んでちょっと観る気になった。
 で、観た。
 ——森博嗣に一票。

2020年1月11日土曜日

USB-C Digital AV Multiportアダプタ

  MacBook Air 13にはUSB-Cのポートがふたつしか、ついていない。
 片方を電源コネクタにつなぐと、残りのポートはひとつだけ。HDMIをつないで クラムシェルモードにしたらほかのUSB機器はどうすればいいんだ?
 というわけで「USB-C Digital AV Multiportアダプタ」なるものを購入した。


        +- USB-C(メス)
        |       
USB-C --+- HDMI 
(オス)  |      
        +- USB

 となっている。これでUSB-Cを電源につないでしまって残り一個になっても安心だ。USBポートがあるし、アダプタのUSB-Cにつないでデイジーチェーンにすれば、さらに拡張できるだろう。Apple、いい商売しているな。

 と……。
 あれ?
 ちょっと待て。
 もしかしたらアダプタのUSB-Cに電源をつなげることができるんじゃないか?
 充電できるんじゃないか?

 試してみたらできた。
 つまりアダプタ一個で、充電しながらHDMIが使えるということだ。消費するのはMacのUSB-Cひとつだけ。それでクラムシェルモードにできるということ。

2020年1月9日木曜日

RaspberryPiをUbuntu Server(元旦からあかんかった)

  FreeBSDが動くので、RaspberryPiをサーバにできるな、と思っていたのだけれど、どうもPostgreSQLがへんだ。普通に動いているように見えて配列のカラムを全部、NULLにしようとすると、エラーになる。BeelinkS1で動かしているFreeBSDではだいじょうぶなのだが——。Google先生でもヒットしないし、PostgreSQLのバージョンのちがいせいでもなさそうだ。 Raspbianでもちゃんと動くし。
 うーん、配列のカラムを全部、NULLにしなければ、問題なさそうなのだけれど、するんだよなぁ。今あるやつ。
 しかたないのでUbuntu Serverにでもするか、と元旦からインストールしていた。
 Ubuntu Serverには——。

・SBCLもあるし。
・オンボードのwifiも使えるし。
・ssh -Yも使えたし。
・64bitだし。

 よくわからんからたどたどと試行錯誤しながらインストールしていったのだけど。
 ところが、なぜか、使っている途中でネットワーク——wifiが切れる。
 どうも ここの事象と同じっぽい気がするのだけれど、解決しない。切れる。
 あかんわー。
 あきらめだわー。
 元旦が一日、無駄になったわー。

2020年1月8日水曜日

ノートパソコン・ヒストリー

 今までどんなノートブックパソコン——昔はラップトップといっていたよね——を使ってきたんだっけ。
 そもそもSun Microsystemsの20万もしたラップトップ・ワークステーション 1が欲しかったんだよねぇ。ただし、あれはキャリーバックがなければ、運べない代物だったし、何に使えば、いいんだ、という話で、結局、購入しなかった。

購入日付 名前 備考
l990-05-12 OASYS/ラップトップ ワープロ
1993-02-24 dynabook SS001 フロッピィディスクが二台使えると画期的だった
1995-01-09 HP200LX いわずと知れた名機
1997-08-18 Libretto30  
2001-01-21 ThinkPad iSersies1124  
2006-11-24 ThinkPad X60  
2014-12-06 MacBook Air (11-inch, Early 2014)  
2020-01-05 MacBook Air (Retina, 13-inch, 2019)  

 OASYSとHP200LXはノートブックパソコンとはいえないけれど、それらをのぞくとだいたい5年周期で買い替えている。 ThinkPad X60は例外だけれど。だとすると、今回の MacBook Airの買い換えはそういう時期だったんだなぁ。
 実は1990年ごろにもらいもののPowerBook 5300CSを所有していたけれど、まったく使えない代物で、しかも2kgごえ。PCカードをアウンマウントできない、という個人的には最低のマシンだった。 40Gのハードディスクはその遺物だ。
 こうやってみると、この30年間の変遷が感じられて感慨深い。

Footnotes:

1

よく覚えていないけど、 これかなぁ

2020年1月7日火曜日

MacBook Air (Retina, 13-inch, 2019)

 「 とても後悔している」わりに、モノが到着すると、現金なもので。
 思ったよりも筐体の大きさは先代とあまりかわらず。重さは——やはり重かったけれど。スペック値で300gほど。
 ただ、五年も使っていると、けっこう傷ついていることに気づく。
 さすがに新品と比べると一目瞭然。
 これなら買い替えてよかったかな、という気になった。内蔵ディスプレイもRetinaなのでクリアなことだし。外付けのDELLのディスプレイよりも。

 到着直後、すぐに移行アシスタントと使って環境を移行したのだけれど、うっかりソフトウェアアップデートをかけてしまった。OSがCatelinaに。元々、Catelinaだったのかもしれないのだが。それに気づかないほど、うっかりとアップデートしてしまった。
 結果、Emacs、VirtualBoxが動かなくなる。
 なんかDocumentsフォルダの下を読みこめないのだ。
 Emacsにフルアクセス権を与えてもだめで、なぜ? ——謎。
 何度か、移行をくりかえしたけれど、だめ。
 しかたないので先代のフルバックアップからごっそりMacBookAir13にインストール。OSはデグレートしてMojaveに——まぁ、中身まんま、先代なのだからこれなら動くわけだ。

 基本的には買い替えてよかったな、なのだけれど、二点ほど違和感が。
 ひとつ、蓋が開けづらい。MacBookAirがデビューしたときには指一本で蓋が開くことが売りだったのに——むずい。ふたつ、キーボードの打鍵が硬くて浅い。馴れなのかもしれないが。指の腹でなでるようにしないといけないんだろうな、これは。

 ただ11インチがMacのノートパソコンのラインナップから消えたのはわかるような気がした。実物に触れると。サイズ的にはほとんどかわらないのに、ディスプレイは広いし、きれい、となると。

2020年1月5日日曜日

MacBook Air 13インチを購入

 MacBook Air 13インチを買ってしまった。
 まだまだ、手持ちの MacBook Airは使えるというのに。外付け ディスプレイをつないで映画も観れるし、全然、現役だ。バッテリーがすこしへたりはじめているけど、最近は電源で使用することが多いので問題はない。
 なのに。
 なのにどーしてー。
 不満は買った当時から失敗したと思っていた内蔵ディスクの容量不足だけだったのに。

 それなのにMacBook Air 13インチには次のデメリットがある。

  1. 重い。1kgを越える 1
  2. USB端子がない 2
  3. お金がかかる 3

 また、Windowsのノートブックへ戻すことも考えていたのだけれど、今は完全にAppleのエコシステムにからめとられてしまっているので、しばらくはむずかしい。とくにトラックパッドの動きはMacに軍配が上がりすぎる。

 購入金額から考えていっそ、MacBook Airではなく、上位互換のMacBook Proという線も考えたのだけれど、Touch Barがなぁ、あれ、何に使うの? クラムモードではそもそも不要じゃないか。
 というわけでMacBook Air 13インチを購入した。

 とても後悔している。ただしこれはいつものこと。

Footnotes:

1

11インチがなくなってしまったのだよ。MacBookもラインナップからなくなってしまったし。

2

拡張ケーブルを買うにしてもポートが二個しかなく、一個は電源用に使われてしまう。

3

なんだかんだと拡張して付属品をプラスすると、大台を越えてしまうじゃないか!

2020年1月3日金曜日

2019年決算

 本:48冊
漫画:440冊
映画:12本
WIND:6日/24km
TVアニメ/TVドラマ:358話

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 /dev/ada0p4

 でもだめで、

$ 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 /dev/ada0p4
$ 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"