kubo39's blog

ただの雑記です。

zshを自前でビルドして使う

zshにパッチあてて使ってるんだけど、ビルド方法とか一応メモしておく。

zshのビルドは楽にできる、まあ今回の作業では必要なかったのだけれど。

$ apt install -y yodl # 依存ライブラリ, あとPerlとかも必要
$ ./Util/preconfig
$ ./configure
$ make

パッチ自体は特にとりあげるほどの内容ではないので割愛。

補完にパッチをあてた場合は、fpathを上書きしてそっちを優先的にみるようにする必要がある。 設定ファイルは邪魔なので読み込まないようにした。

$ zsh -d -f # no-rcs && no-global_rcs
$ fpath=("$(pwd)"/Completion/Unix/Command "${fpath[@]}")
$ autoload -Uz compinit
$ compinit -C
$ nm --demangle= # 補完で `dlang' が出てくるパッチの確認

一応パッチ自体はPR出した。マージされるかわからないけど, わりとすんなり修正できるのでみなさんもzshにパッチ投げてみるといいかもしれません。 (そのあとちゃんとマージされたのでコントリビュッタです)

jailingをD言語にポーティング、やってみた!

kazuho/jailingD言語に置き換えてみました。

これです。

目的

実用的にはLinuxであればどの環境でもPerl5が入っていることは期待できるし外部依存もないので特に意義はないです。 あくまで学習目的というやつです。コードサイズも小さいし、いいかなって。

jailing

説明はここを読んで。

もう少しカスタムできるツールだとfirejailだとかnsjailとかあるけど、このくらいの分量だと学習しやすくてありがたいです。 というかこれだけで立派なchroot+jailになるのいいですね。

D言語

Q: なんでD言語なの?
A: 言わせんな恥ずかしい

書いてみての雑感。

  • わりと標準ライブラリでなんとかなるところがよい?でもけっきょく executeShell ばっかりになるもんなあという気もしないではない。
  • あとはなんか std.path.buildPath なんかはきっちり書きたい感出せる気がする。
  • あ、FFIextern (C) だけすればなんとかなるのでだいぶよい。

D言語で書けばバイナリを配るだけ作戦が使える、のだけど元がPerlPythonスクリプトの場合だと書き換え自体がメリットになりにくい。 jailingのようなツールだとそんなに速度とかいらなさそうだし、どうせプロセス起動が遅いのでさほど変わらんだろう。 Rubyとかだったらスクリプトと別に処理系入れるの面倒じゃない?みたいなところに対してメリットが言えそうなんだけど。 なおこの作戦はGoやRustでも別によいという話もある。

jl

だいたい似たような動機のプロジェクトで yoshitsugu/jl というRustのやつがありました。

Rustだと caps とか libmount とかライブラリがあったりして外部コマンドを使わないで実装できるのはいい感じがします。実行時のメモリフットプリントとかにうれしい。 あと clap みたいなコマンドラインパーサがあるとCLI書くとき便利。 ここでは使われていないけど他にもstructoptとかも便利系のやつです。

ところでjlはコマンド実行も外部プロセスにしてしまってるけどここは CommandExtexec 関数を使うべきでは。

ベイルート・ロンドン・リバプール旅行記

3/25~4/2でベイルート(レバノン)、ロンドン・リバプール(イギリス)旅行に行っていたので雑に記録を残しておく

ベイルート

  • 直行便がないのでフランクフルト経由。フランクフルトのラウンジで食べたパン・ソーセージとビールがこの旅で一番うまかった可能性がある。
  • 到着後もろもろの事情で国防軍の出迎え&謎の力ですんなり滞在ビザを取得できてしまった。
    • 滞在ビザは長蛇の列で質問も結構長くやってたぽいので助かった。
  • ホテルはめっちゃいいホテル
    • やたらおいしいチョコレートが置いてあった
    • ベイルート市内からちょっと離れてるけど景色も綺麗だった
  • 近辺を散策していると生々しい銃痕の痕が。現在でも緊迫した状況を感じる。
  • ホテルで朝食をとっているとどんどんアラブ料理を勝手に運んできてくれてとてもよかった。ヨーグルトやフルーツジュースがめちゃ美味しい。
  • 市内散策ツアー
    • 前後を長銃もった兵士に囲まれるバスツアー
    • ベイルート国立博物館にいったけどローマ時代の遺跡はみられず延々鉱石をみることになった
    • アラブ料理のレストラン。なかなか美味しかったけどホテルのほうがおいしかった。ここでもチョコレートケーキ、そして美味しい。
  • 出国はけっこうたいへんで、3回は危険物チェックゲートを通ったとおもう。

ロンドン

  • ヒースローでかすぎ
  • むこうだとビートルズピンク・フロイドは別格らしい
  • ロンドンはそこかしこで中国語や日本語がきける
  • ホテルはそこそこ
  • イカー・ストリートでホームズ博物館へ。とくになにかあるわけでもないが雰囲気が味わえるのでけっこうよかった。
  • 本場のパブでフィッシュ&チップスとビール、まあこんなもんか
  • コベント・ガーデンでめちゃくちゃ歌うまいおっさんが歌っててよかった
  • 夕飯はチャイナタウンで中華
    • 普通の中華料理だけどイギリスじゃ別格にうまいってわけw
  • 本場ピカデリー・サーカスレ・ミゼラブルをみた
    • ジャベール役の人がめちゃくちゃよかった、多くの人が最後の登場のところでスタンディング・オベーションしていた
    • ソロで特によかったのは star, on my own, bring him home かな

リバプール

  • ホテルは建物すごかったけど設備とかつらかった
    • 朝食がびっくりするほどまずかった。あいつらこれうまいとおもってるんすか・・
    • リバプールはどこで食ってもイマイチだったけど
  • ビートルズゆかりの地を訪ねるツアーに参加
  • 中心部はけっこうオシャレタウン
    • 変なおっさんが火の輪くぐりのパフォーマンスしてた、日本じゃできないだろうな
  • 郊外は労働者の街といった感じ
    • 治安もあまりよくなさげ
  • アンフィールドでliverpool vs spurs観戦
    • 住宅地に突然あらわれるスタジアム
    • 肖像画ダルグリッシュ、ファウラー、ジェラード!など
    • あまりうまくないバンドが「wish you were here」や「Don't look back in anger」を歌ってた。ビートルズは逆に歌いにくい?
    • 生You'll never walk aloneに白熱した試合展開に泣きそうになる

けものフレンズ2を総括する

人にはそれぞれの感想がある、これは自分のために整理するくらいの意味合い

よかったところ

  • ゴマちゃんことゴマすりクソバードがいいキャラだった
  • フレンズのキャラデザがよかった
  • ごまちゃんやチーターの声優演技がよかった
  • 次回予告
    • かわいい
  • ペパプライブの映像クオリティ
    • ここは一期よりもよかったと思えるところ
  • キュルル ロシアのスパイ説

だめだめだったところ

  • 尾崎のサーバル演技がほんとうにひどい
    • 一期の演技が好きだったのでこれはわりと苦痛だった
    • かなりいらいらするレベル
  • サーバルbot感、自我を持っていないような感じ
    • すっごーいbotになっていた
    • 一期サーバルはかばんちゃんのために怒ったりツッコミ役やったり、しっかりキャラクターがあったのに
  • 違和感しか感じないかばんさん
    • サーバルちゃんやラッキーさんをいきなり呼び捨てにしているところ
    • それ自体が悪いというより背景がまったくないので違和感しかない
  • 全体的に脚本がひどすぎる
    • 話として単純におもしろくない
    • 前後のつながりに意味がなさすぎる
  • 設定のガバ
  • キュルルの叡智パート全体的にいらなかったし意味わからなかった
    • 7話でリレーにするのまじで意味がわからなかった
  • フレンズ型セルリアン弱すぎて話盛り上がる要素がない
    • 「緊迫感がまったくない」って言われてたけどほんとうにそのとおりとしかいいようがない
  • まじでいらなかったフウチョウコンビ、というかあれなんだったの?
    • メインの話にもぜんぜん絡まないし単体としてもなんも影響がない
    • 歌も演技も微妙なのでゴリ押しだったんだろうな

おきもち

  • だめなところがとことんだめだった
  • もっとひどいアニメ(例をあげるならいくらでもあるが魔法戦争とか)があるがそれがこの作品を許す理由にはならない
  • 制作陣のSNS対応もけっこうひどいなとおもった
    • アンチにあれだけ絡まれると精神的にもつらいだろうけどそれ抜きでも邪悪だよな
  • けフ2好きな人がいてもいいとおもうしそこを叩くのはよくない
    • ただけフ2好きな人はアニメ作品としての出来ではなくてけものフレンズプロジェクト自体が好きなんだろうなとはおもう
    • で、この人たちは現行の「けものフレンズプロジェクト」のやり方を(消極的かもしれないにしろ)認めているわけで、やっぱりわかりあえないんだろうな、と
  • キュルル叩かれすぎでは
    • 人間の子供としてはあんなものじゃないかなあ、そんなに悪人的な描写なかったとおもうんだけど

argc = 0 でプロセスを動かす

DMDのコード内ではargcが0な環境を想定してコードが書かれているが、そういう環境は存在するのだろうか。

調べてみるとわりとすぐにstackoverflowがみつかった。

c - executing a process with argc=0 - Stack Overflow

posix_spawnを使えばできるようなので、実際に試してみる。

#include <spawn.h>
#include <stdlib.h>

int main(int argc, char** argv, char** envp)
{
    pid_t pid;
    char* zero_argv[] = {NULL};
    posix_spawn(&pid, "/home/kubo39/dlang/dmd-2.085.0/linux/bin64/dmd", NULL, NULL, zero_argv, envp);
    int status;
    waitpid(&pid, &status, NULL);
    return 0;
}

たしかにargcが0のときの処理が実行されているようだ。

$ ./a.out
Error: missing or null command line arguments                                                                                                                               
$ echo $?
0

ちなみにrustcの場合は Error: couldn't determine self executable name と表示され、goでは panic: runtime error: index out of range になった。

Isabelleちょっとやってます、という近況報告?

ここ最近Isabelleを触っている。 Coqと比べると日本語の資料が少ないのでつらい。

とりあえずいろいろわからないことが出てきたので並べてみる。

2以上の自然数を扱うと簡約できない

例としてmap関数を定義する。

fun map :: "('a \<Rightarrow> 'b) \<Rightarrow> 'a list \<Rightarrow> 'b list" where
  "map _ [] = []"
| "map f (x # xs) = (f x) # (map f xs)"

value "map (plus 3) (1 # 2 # [])"

そのまま自然数の3や5を命題に含めると解くことができない。

lemma test_map1: "map (\<lambda> x. plus 3 x) ((Suc 1) # 0 # (Suc 1) # []) = (5 # 3 # 5 # [])"
  sorry

(Suc (Suc 1)) みたいにすると解ける。

lemma test_map2: "map oddb (Suc 1 # 1 # Suc 1 # (Suc (Suc (Suc (Suc 1)))) # []) = (False # True # False # True # [])"
  apply (simp)
  done

もちろんこれを続けるのは限界があるので、なんか方法を見つけないといけない。

命題にforallの有無がどう影響を与えるかわかっていない

別の命題を解いてしまっているのではないかという懸念がある。 goalだけみると同じにみえるけどよくわかってない。

forallがないとうまくいかない場合

以下は Failed to apply proof method と怒られる。

lemma mult_eq_0: "n * m = 0 \<longrightarrow> n = 0 \<or> m = 0"
  apply (simp)
  done

\<forall> n m::nat. を命題に足すと No subgoals までできる。

lemma mult_eq_0: "\<forall> n m::nat. n * m = 0 \<longrightarrow> n = 0 \<or> m = 0"
  apply (simp)
  done

forallがあるとうまくいかない場合

以下は Cannot determine type b. と怒られる。

theorem not_true_is_false: "\<forall> b::bool. b \<noteq> True \<longrightarrow> b = False"
  apply (case_tac b)
   apply (simp_all)
  done

\<forall> b::bool. を命題から消すと No subgoals! までできる。

theorem not_true_is_false: "b \<noteq> True \<longrightarrow> b = False"
  apply (case_tac b)
   apply (simp_all)
  done

小ネタ: safe functionとcast function of null

おなじみ(?), safe functionを考えてみようの会です.

突然ですが, 以下のコードは合法でしょうか?

void main() @safe
{
    (cast(void function() @safe) null)();
}

結果はおおかた予想がつくとは思いますが、Segmentation Faultになります。

(dmd-2.084.0)$ rdmd safecastnull.d
zsh: segmentation fault (core dumped)  rdmd safecastnull.d

さて、合法かどうかですが, まず safe functionの定義 から照らし合わせてみると

  • No casting from a pointer type to any type other than void*.
  • No casting from any non-pointer type to a pointer type.
  • No pointer arithmetic (including pointer indexing).
  • Cannot access unions that have pointers or references overlapping with other types.
  • Calling any system functions.
  • No catching of exceptions that are not derived from class Exception.
  • No inline assembler.
  • No explicit casting of mutable objects to immutable.
  • No explicit casting of immutable objects to mutable.
  • No explicit casting of thread local objects to shared.
  • No explicit casting of shared objects to thread local.
  • No taking the address of a local variable or function parameter.
  • Cannot access __gshared variables.
  • Cannot use void initializers for pointers.
  • Cannot use void initializers for class or interface references.

一個目と二個目が怪しいですね.

nullの定義 もみてみましょう. 最初の文はnullはポインタやら動的配列やらを表すことができる値と解釈できます.

次ですが, なんと, "it is an exact conversion to convert it to the null value for pointers, pointers to functions, delegates, etc." という文言が確認できます. 正しい変換であるとはどういうことなんなんでしょうか. 必ずsafe? また直前のnullは別の型にキャストされる前だとtypeof(null)という型が与えられるそうですが, これはpointer typeなのでしょうか, それともnon-pointer typeなのでしょうか. 少なくとも現在の仕様の状態から判別することは難しいと思います…

というわけで最初の問題の結論は, 「現時点(2019.02.07)での仕様ではどちらともとれる」でした(これはひどい)