2022-02-12

Emacs: Manage packages specifying version

私は Elisp 管理に長らく SCM を使ってきた。Wanderlust を例にとると、本体と依存パッケージをソースコードごと SCM に登録し、チェックアウトするだけで使えるようにしている。もちろんこの方法だとパッケージのバージョンアップが面倒だし、ビルドが必要なものはチェックアウトするだけという訳にはいかない。それでも、私にはこの運用でうまくいっていた。

package.el (Emacs 24)リリース時、遂に Emacs もそんな時代になったか、と感動したものだ。しかし今となっては、私の中では最も期待外れの機能となってしまった。今時、最新版しかインストールできないものをパッケージマネージャーとは呼べない。そんなものはとうの昔に RubyGems が終わらせたと思っている。今まで package.el の更新を待っていたが、もう見限ろうと思う。さすがに 8 年も待って気が短いとは言わせない。

ということでパッケージ管理の方法を探したところ、私には El-Get が適当だろう、という結論に至った。straight.el の Lockfile は私が欲しかったものだが、肝心のバージョンを指定してインストールする方法がないように見えた。それに私は 10 年後も安心して使い続けられる方法を探している。その意味でも El-Get が安定してそうな気がする。

・・・というのが約 2 年前の話。幸い、今のところ El-Get でうまくいっている。メイン環境は MSYS2 + NTEmacs で、現在の設定は下記のようになっている。

(add-to-list 'load-path
	     (expand-file-name "el-get/el-get" user-emacs-directory))
(setq el-get-verbose t
      el-get-byte-compile nil
      el-get-bundle-byte-compile nil
      el-get-install-info nil)
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.githubusercontent.com/dimitri/el-get/master/el-get-install.el")
    (let ((el-get-install-shallow-clone)
	  (el-get-install-skip-emacswiki-recipes))
      (goto-char (point-max))
      (eval-print-last-sexp))))

;; Ex: install company-mode
(el-get-bundle company-mode/company-mode
  :branch "0.9.13"
  :shallow t
  (global-company-mode))

上記には私の我がままが詰まっている。

  1. リポジトリは shallow clone する。
  2. バイトコンパイルはしない。
  3. info も EmacsWiki レシピも、余計なものは要らない。

(2)について、私は Meadow 時代から Emacs を使っているが、今までバイトコンパイルしないと遅くて使えなかった Elisp は数個しか経験がない。なので基本、バイトコンパイルは不要だと思っている。

(3)は文字通りの意味の他に、MSYS2 に PATH が通った状態だと、MSYS2 の install-info が実行されてエラーになる、という理由もある。

install-info: No such file or directory for /home/user/.emacs.d/el-get/el-get/./el-get.info

リリース用タグが打たれているパッケージについては、以上の方法でとてもうまくいく。ただし、El-Get 自身のバージョンは管理できない(その時の master HEAD になる)。そこまでやろうとすると、El-Get を SCM に入れるしかない気がする。私はそこは妥協した。

後は、master ブランチしかない(リリース用タグがない)ようなパッケージの場合。

(el-get-bundle emacs-jp/japanese-holidays
  :branch "master"
  :checkout "324b6bf"
  ;; package configuration...
  )

この場合、shallow clone が使えない。といってもそれは Git の仕様(clone に commit ID を指定できない)によるもので、El-Get のせいではない。幸い、そのようなパッケージは小規模であることが殆どなので、そこも妥協した。嫌なら SCM に(略)。

以上は、各パッケージが Git リポジトリを持っていることが前提となる。しかし今はそれが問題になることはないだろう。良くも悪くも、Git (というか GitHub)でないプロジェクトは受け入れられない時代になってしまった。

2022-01-30

Zsh: Ctrl key combinations don't work

訳あって Zsh を使うことになり、手持ちの Bash 資産を Zsh に対応させていた時のこと。screen / tmux で訳の分からない挙動にハマった。

screen や tmux で Zsh を使うと、何故か Ctrl + p とか Ctrl + n とか、Ctrl キーを絡めた入力が使えなくなる。Ctrl + p と打っても、「^P」とか出る。ググってもみんなは普通に使えてるっぽいし、探し方が悪かったのかこれといった情報も見つからず、解決に 5 週間かかった。:-/

.zshrc に「bindkey -e」を入れるだけ。orz

しかし何故 screen / tmux だけで発生するのか。普通にターミナルで Zsh を使う分には何も問題ない。

% man zshzle

       <...snip...>

       In addition to these names, either `emacs' or `viins' is also linked to
       the name `main'.  If one of the VISUAL or EDITOR environment  variables
       contain  the  string `vi' when the shell starts up then it will be `vi‐
       ins', otherwise it will be `emacs'.  bindkey's -e and -v  options  pro‐
       vide a convenient way to override this default choice.

環境変数 VISUAL / EDITOR に「vi」という文字列があると、Zsh が気を利かせて viins モードにしてくれるらしい。・・・いやいやいや、Vim 使いでもシェルは普通 emacs モードだと思うけど? ともかく、確かに私は(Emacs 使いだけど) EDITOR=vim としている。これで一応は先の疑問に説明はつく。

  1. Zsh 起動時、EDITOR は未設定なので emacs モードになる。
  2. 起動した Zsh が .zshrc を読み込み、EDITOR=vim になる。
  3. この状態で Zsh の子プロセスが起動すると、EDITOR=vim なので viins モードになる。

説明はつくが、これが適切な仕様だとはとても思えない。これだと EDITOR の値に関係なくログインシェルは常に emacs モードになる。だからこそ、他の人は困ってないっていうね。screen / tmux 使いの内、更にその一部の人だけが困ることになる。これが本当に意図通りの仕様だとしたら、こんな分かりにくい仕様はさっさと捨てた方がいいよ。

しばらく Zsh を使ってみて、Zsh は使い勝手を重視した結果として、驚き最小の法則に反することがあるような気がする。別に Zsh に拘りや思い入れがある訳でもなし、これ以上何かあったら Bash に戻すかも知れない。

2022-01-23

Zsh: local `path' variable causes `command not found'

訳あって Zsh を使うことになり、手持ちの Bash 資産を Zsh に対応させていた時のこと。下記のようなコードでハマった。

test.sh:

my_dirname() {
    local path=$1
    dirname "$path"
}

my_dirname "$@"
% zsh test.sh /path/to/file
my_dirname:2: command not found: dirname

Zsh 使いの人にとって、きっとこれは FAQ なのだろうな。Zsh の path 変数は特殊変数なので、path を書き換えることは PATH を書き換えることに等しい。しかしこれは Zsh 初心者の私にとっては完全に盲点だった。そもそも小文字の変数が特殊変数になるという発想がない。お陰で解決に 3 週間かかった。:-/

他にどういう特殊変数があるかは、man zshparam | grep -F '<S>' すれば分かるっぽい。それにしても path とか status とか、これらの変数名が使えないのは私には窮屈でしょうがない。正直これだけでも、私が Zsh を使いたくない理由になる。

% man zshbuiltins

<...snip...>

       typeset [ {+|-}AHUaghlmrtux ] [ {+|-}EFLRZip [ n ] ]
               [ + ] [ name[=value] ... ]
       typeset -T [ {+|-}Uglrux ] [ {+|-}LRZp [ n ] ]
               [ + | SCALAR[=value] array[=(value ...)] [ sep ] ]
       typeset -f [ {+|-}TUkmtuz ] [ + ] [ name ... ]
              Set or display attributes and values for shell parameters.

              <...snip...>

              -h     Hide:  only  useful  for special parameters (those marked
                     `<S>' in the table in zshparam(1)), and for local parame‐
                     ters  with  the  same name as a special parameter, though
                     harmless for others.  A special parameter with  this  at‐
                     tribute  will not retain its special effect when made lo‐
                     cal.  Thus after `typeset -h PATH', a function containing
                     `typeset  PATH'  will  create an ordinary local parameter
                     without the usual behaviour of PATH.  Alternatively,  the
                     local parameter may itself be given this attribute; hence
                     inside a function `typeset -h PATH' creates  an  ordinary
                     local parameter and the special PATH parameter is not al‐
                     tered in any way.  It is also possible to create a  local
                     parameter  using  `typeset  +h  special', where the local
                     copy of special will retain its  special  properties  re‐
                     gardless  of having the -h attribute.  Global special pa‐
                     rameters loaded from shell modules  (currently  those  in
                     zsh/mapfile  and  zsh/parameter)  are automatically given
                     the -h attribute to avoid name clashes.

どうやら typeset -h を使うと、特殊変数をローカル変数で隠せるようだ。このときエラー出力を捨てれば、Bash にも対応できる。

test2.sh:

my_dirname() {
    typeset -h path 2>/dev/null
    local path=$1
    dirname "$path"
}

my_dirname "$@"
% zsh test2.sh /path/to/file
/path/to

もしスクリプト全体で path を特殊変数として使わないと決められるなら、typeset -h をグローバルに置けば良い。逆に Bash を全く気にしないのであれば、「local -h path=...」と 1 行で書ける。

2022-01-15

Animes in the 4th quarter of 2021

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

第 1 クールでイマイチ感、第 2 クールでの挽回を期待するも、却ってつまらなくなった。仕事の苦悩とか見せられても面白くも何ともないんだけど。そして最後まで良く分からないキジムナー。

幾つか他作品からのエッセンスを色濃く感じるものの、オリジナリティはあると思う。ロボット CG とキャラは特徴的。ただ個人的には主人公の声が合わない。もっと別の配役があった気がする。

見るのが苦にならなかったので最後まで見ることはできたが、正直これといった面白さは感じなかった。強いて言うなら、ヒロインのルビー色の瞳の描写が印象的だったくらいか。

TE 視聴済み。デルタ襲来、ほのぼの学園生活、からの人間同士の紛争という展開が全く同じなんだけど。これはマブラヴの様式美か? 実は訳あっての視聴だったが、訳がなかったら速攻切ってた。

メディアミックス作品らしからぬ、アニメ単体としても十分に通用する出来。世界観も独特だし、何と言ってもムジカートのキャラデザが素晴らしい。最後は終わらせた感が強いが、十分に許せる。

これが名古屋リソースで作られたことに驚く。私が見た CG アニメの中では、一番滑らかかも知れない。とはいえまだセル画も多く、話も普通、中の人の演技もうーんだけど、その心意気は評価する。ところでギャバンは名古屋なの?

第一期は妙に力の入った作品だな、くらいの印象だった。第二期になって何やら風格のようなものが出てきた気がする。ギャグとシリアスのバランスが丁度良い。次期についても心配はなさそう。

丁寧に作られているとは感じる。いつか面白くなるかもという期待で見続けたが、むしろ冒険に出てからの方がつまらなくなるという結果に。次期も決まったらしいが、たぶんもう見ないと思う。

第一期と同様、新キャラが登場して美味しいものを食べて幸せになるという、つくづく平和な作品。これはこれで良いと思うが、流石にキャラが飽和してきた感がある。というか既に覚えられない。

第一期で見るのを止めて、今回「大満開」とあったので視聴。しかし相変わらず不幸が前面に出ていて辛い。そんな思いをするためにアニメを見てる訳じゃない。いい加減それに気付いてくれ。

内容がどうこういうよりも、ただ ED を聞くために見ていた。でもヒロインの似非方言は少しクセになるかも。今回は久保あおいを覚えた。

タイトルと絵柄から想像した通りの内容で、最後までストレスなく見られた。二人が近付き過ぎず程良い距離感のままで終わったのは良かったと思う。むしろサブキャラの二人の方は接近し過ぎ。

特に可もなく不可もなくストレスもなく、という感じで見続けていたが、途中からゴーストがウザ過ぎて一気に無理になった。結局まだ生きてるっぽいし、次期は絶対に見ないと断言できる。

2021-10-23

Animes in the 3rd quarter of 2021

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

変わり映えしないキャラデザでこうも個性的なキャラを生み出す作者の才能には、素直に恐れ入る。話も今のところ掴みは OK。できればこの先、よくあるバトル作品になってしまわないことを願う。

超強い化け物が仲間という以外は、よくある異世界チート物。化け物で良ければハーレムもあるよ。このままだと凡作になってしまうところ、何とか見られるものになっているのは中の人の力か。

絵は綺麗でキャラも立っており、主人公コンビは女子受けが良さそう。その様な人達には神作品になる可能性もある。個人的には主人公がいけ好かないが、ジャンヌが可愛いのは認めざるを得ない。

検索候補に「気持ち悪い」と出てくる辺り、このアニメ化は失敗だったと言わざるを得ない。話も原作を読んだ方が面白いような気がする。正直、お姉さんと兎男が居なかったら早々に切っていた。

前期に引き続き見てしまったが、やはり一向に面白くならない。話やキャラの言動、何もかもが薄っぺらい。最後のクエストは原作では外伝だったようだが、つまりもう次は無いってことでおk?

今期の伏兵。ヒロインを一見して期待してなかったが、結果として今期で一番見るのが楽しみな作品だった。ヒロインの中の人には賞賛を送りたい。他キャラも粒ぞろいだし、ぜひ次回をお願いしたい。

前期より視聴。話の方は言うことはない。ビジュアル的にはアクション描画が凄い。そしてやっぱり、さやかは可愛い。それより、唐突に始まって唐突に終わられるとこっちが困惑するので止めて。

初見 OP で吹いた。原作漫画を尊重した結果だと理解はするが、流石にこの作画はファンに殺されるんじゃ? この話でこの絵だと、もはやファンディスクどころか二次創作というレベル。

キャラはまずまず、設定も今となっては逆に新鮮。問題のシャッフル放送は、結果的にプロモーションとしては大成功だったのでは。事実、それで私も監督の名前を覚えたし。それより原作者がメイドラゴンと同じってマ? それが一番の驚き。

前期が綺麗に纏まっていたので若干の不安はあった。案の定、新キャラで話は多少広がったものの、物足りない感じ。と思ったら次回はまたフラグ回避になるのか。今期は繋ぎ的な作品だった模様。

押井守ということで視聴したが、さっさと切れば良かったと後悔。彼が作りたいものを作ったら、我々が欲しいものとは全く違った、という。これは彼のオ○ニー作品と言っていい。

これもさっさと切れば良かった。微妙な能力を上手く使うのではなく、解釈次第でどのようにも使えるチート能力となった時点で、さっさと見切りをつけるべきだった。

ヒロインの見た目以外はクソつまらないという評価だったところ、最後に伏線は綺麗に回収されていて、そこは感心した。もしかすると作品がつまらないのではなく、アニメ化の失敗だったのかも。

初見での予想は超えた。傍若無人な主人公が調子に乗って最後に痛い目を見るという、古き良き時代の様式美。テンプレだが見ていて心地よい。このまま終わらせてしまうのは惜しい気がする。

前期より視聴。相変わらず絵も綺麗で、隅々まで作品への愛を感じる。でもやっぱり面白いとは思えないんだよなあ。カンナ以外は可愛いと思えるキャラもいない。まあ続く限りは視聴するつもり。

普段は短編作品は見ないのだが、大塚明夫に釣られて視聴。話が面白いとは思わないが、見るのにストレスがないし、大御所声優陣の掛け合いが見られたということで満足。

赤彼女と中の人のシナジーが想定外だった。主人公がウザいのは仕様として我慢するとして、OP/ED に出る割に紫の絡みが遅すぎた感。紫はかなり期待できそうなのだが、果たして次回はあるのか。

世界観が独特で、序盤は面白かった。しかし途中から話が飛んで訳が分からなくなる。これは意図的だろうから、真面目に見ると損をする。制作陣は理解されたら負けとでも思っているのだろうか。

シリーズで真面目に視聴したのは初。ゲッターもインフレを重ねて来たんだなあ、ということは分かった。これが最後のゲッターになるとしても、これまでのシリーズを視聴する気は起きないかな。

SOA からパクってきた主人公と冒頭の NTR 臭に釣られて見てみたが、それ以外は普通の異世界チートハーレム作品だった。それにしても中の人までパクってくるとは、開き直り過ぎなのでは。

突っ込みどころは多いので、それらを受け入れる度量は必要。元々がハートフルストーリーにしかなり得ない物語設定だが、今のところそこまでには至っていない。果たして次回でどうなるか。

ニジガクで脱落したが今回は視聴。アニメーションの進化は感じる。しかしそれ以外は全体的にマンネリ感。ただ可可とすみれのキャラは良かった。それより、いつの間に国公認(NHK)になったん?

2021-07-17

Animes in the 2nd quarter of 2021

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

序盤は面白く視聴できていたが、途中で出てきたラスボスが小者過ぎて、全てが台無しになった。それに比べて葵は実に良いキャラ。折笠富美子の演技もハマっていて、実質ヒロインと言っていい。

かなり独特な世界観を持つ。キャラの魅力にはイマイチ欠けるが、話は中々に興味深い。この先の展開次第で、この作品の評価は大きく変わりそうだ。過度な期待はせずに次回を待ちたいと思う。

初話で「?」となりその後、「負けない」ってそういう意味かよ、と納得。白と黒のヒロインを気に入れば十分に楽しめるはず。とはいえ説明不足な点もあり、特に CM 勝負は見返しても意味不明。

少し陰キャ気質なヒロインさえ受け入れられれば、絵も綺麗で楽しめると思う。しかし本作も他作品の例に漏れず、AI がとても感情豊かに振舞う。AI ならばもっと無機質に振舞って欲しいのだが。

正直、話は面白くない。キャラにもこれといった魅力はない。ただカブを題材にした貴重な作品というだけで、しかしそれだけで一部の人には見る価値がある、そんな作品。私は嫌いじゃないよ。

そのうち面白くなるかもと見ていたが、全くならなかった。期待した妹も最後まで脇役だったし、じゃあ何で ED に出したし。更には現実を追求と言いながら、最後に非現実(裏技)を持ち込む始末。

原作は序盤をチョイ読みした程度。CG を使うことは構わないが、それで動きが硬くなってしまうのは頂けない。しかしそれ以前、初のアニメ化だというのに、何故こんな半端な中盤を選んだのか。

作風が前作と変わってないので、その意味では安心して見られる。しかし話は意味が分からない。最終回を見た後でさえ、分からないことだらけ。なのに登場キャラ達はヤリ切ったいい顔をしてる。

前期より視聴。これまでの期待に対して、最後はやけにあっさりと終わった。中盤以降に増えたキャラも、大して活かされないまま終わったし。何となく、無理やり終わらせたような感じを受ける。

題材もあって、序盤は面白かった。しかし間男が出てくる辺りでチグハグ感が出て、最後は予定調和で終わった。期待しただけに残念。ところで選ぶなら後藤さん一択では。きっとお金も貯めてる。

基本的には話ではなく、ポンコツなキャラを楽しむ作品。私はアスタロトとスノウが気に入ったので問題なかった。むしろ主人公の方が三枚目度が足りない。実はアイキャッチが一番面白い説。

2021-04-21

Animes in the 1st quarter of 2021

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

絵が綺麗で雰囲気も良い、魅力的なキャラも多く、今のところ面白く視聴できている。ただし某 DB っぽいバトル描写は好きになれない。今後インフレバトル作品になってしまわないことを願う。

シリーズ視聴。いきなり雰囲気が変わって驚いたが、予想をことごとく外してくる展開は確かに進撃だった。この先もきっと予想を裏切ってくれるのだろう。最終クールが待ち遠しい。

シリーズ視聴。話は盛り上がっているはずが、各キャラが何を言っているのか分からない。これは私の問題だろうか。そもそも聖域とは何だったのか、もう一度見返しても理解できる自信がない。

シリーズ視聴。本編の方は鏡花たん以外に見る理由を持てないが、これは楽しめた。もう本編は止めてずっとこれでいいよ。それにしてもギャグアニメでも面倒臭いとは、芥川は本当にクソキャラ。

例によって労せず全てを手に入れるハーレム主人公。話はクソつまらないが、ヒロイン達、というかエマの可愛さだけでもっている。正直なところ、エマのおっぱいがなければ早々に切っていた。

リア充への目標管理とか、コミュ障には苦痛でしかない。終盤は突然ヒロインが訳の分からないことを言い出すし、全体的に共感できない部分が多い。次期があれば見るが、この感じだと難しいか。

シリーズ視聴。続編としては無難な作りで、絵が随分とグレードアップした気がする。但し面白いかと言われると微妙。このままキャラを売りにするだけのシリーズにはならないよう願う。

前期より絵がマシになった気もするが、これはもう作品の個性なのだろう。正直なところ本編よりずっと面白いと思うが、今さら 502 部隊なんて思い出せない。見る前に復習できれば良かった。

シリーズ視聴。まさか前作キャラ達と絡むとは思わなかったが、単純にキャラが増えたというだけ。ただ一つ、最後の歌の口(くち)パクアニメーションは評価する。この時のヒメコの表情は秀逸。

  • たとえばラストダンジョン前の村の少年が序盤の街で暮らすような物語 https://lasdan.com/

初話を見て凄く期待したのだが、それがピークだった。もっと面白くなるポテンシャルを持っていたと思うのに、非常にもったいない。次期があっても、これ以上面白くなりそうな気がしない。

見てるだけで制作陣の力の入れ様が伝わってくる。これだけやれば、見飽きた異世界転生であっても、それなりのものになって当然。キャラの魅力は十分なので、これから話が追い付くかどうか。