Goのfsパッケージを使って,ディレクトリ内のファイルを列挙したい場合,ReadDirFileとReadDirFSインターフェイスにReadDir()があるけど,ReadDirFSの方はファイルの個数を指定できないので全ファイル一度に読む必要があって,大量のファイルがあると困る.
特にfs.WalkDir()もReadDirFSを先にチェックする実装になっているので,アクセスに時間がかかる場所に大量のファイルがあると,読み込み中にコールバックが呼びだされなくて微妙...
かといって,ReadDirFileを優先して使うWalkDirを作ってしてしまうと,今度はReadDirFileが実装されてるかOpenするまで不明なので,ReadDirFileを実装してないファイルシステムで無駄なOpenが発生して,これも微妙な動作になる..OpenDirFSみたいなインターフェイス作ってほしかった...
休みが終わってしまった...
Go の fs.FS
を実装したコードのテストを書いてて気づいたけど fs.ReadFile()
って実際のファイルサイズより常に1バイト多く読もうとするのか.実際は無害なのだけどファイルの範囲外にアクセスしようとするのがバグに見えて何か計算間違っているかと思ってしまった.効率的にEOFをチェックするために見えるけど,内部でStat()が呼び出されてるので,サイズが分かるときはそのサイズ分だけRead()してほしいような気が.
今日まで休み.
特に何もせずだらだらプログラム書いたり本読んだりして過ごす日.
眠い...
https://github.com/binzume/rtcfs
昨日,空港と飛行機の中で WebRTC 上でファイルを共有するやつをGoで書いていた.とりあえず,Ayameでシグナリングして以前作った WebXR 用のリモートデスクトップ環境からファイルを見れるところまで.
https://github.com/pion/webrtc を使ってるのだけどたまにChromeのWebRTCとの接続に失敗する.なんでだろ(と思ったけど,ice candidateが一方向にしか送れてなかった)
手を洗った時に日焼け止めが落ちたせいか,手の甲が日焼けして痛い.東京に戻る.

泊まったホテル,あちこちにUSBで充電するタイプの機器が置いてあるのだけど,充電大変そう..

タコライス.お腹いっぱいになってしまった.

分かりにくいけどミナミスナガニ.砂浜にたくさんいる.白い.

お昼食べたあと,涼しい場所を求めて早めに空港に.帰りの飛行機は下地島空港から(の予定だった).
待ってたら乗る予定の便が台風の影響で欠航に...代わりの飛行機が明日の神戸経由茨城空港行きという微妙なやつしか無いと言われてしまったので,SKY便をキャンセルしてJALで今夜の便を取り直す.キャンセルしたやつの倍以上の値段...予定外の出費(ついでに一度今日帰るの諦めてホテルも取ったりしてたので,完全に無駄なキャンセル料が)
もう一泊しても良かったのだけど,茨城空港の場所が不便そうだった...
宮古空港に着いたら羽田行きは行き先が変更になるかもとアナウンスされて不穏な感じが...夜は台風過ぎてるだろうし大丈夫そうに思ったのだけど,無難に明日の便にしておけば良かった気がする.そして,宮古空港のWiFiつながりにくい.
少し遅れたけど羽田に到着.ギリギリ今日中に帰れるかと思ったけど,家についたら日付変わっていた.
* IPv6...
飛行機の中から繋がらないホストと繋がるホストがあったので何が違うのか見ていたら,IPv4で接続できないホストだった…….自分しか使わない環境はもうIPv4いらないと思って設定してなかったの完全に忘れていた.
自分の周りはIPv6に対応したのは2003年頃だったけど,19年経っても繋がらない環境があるのは,なんでこうなってしまったんだろ.もう完全に移行に失敗してる気がする.グローバルアドレスの数とかNAT設定とか忘れられるので嬉しいのだけど.
エアコンの効いた部屋に引きこもる誘惑に負けそうだけど,宮古島まで来たので今日は外に出る.
自転車借りに行って,暑さに負けて気づいたら原付スクーター借りていた.
伊良部大橋を渡りたかったので伊良部島に.

フナウサギバナタ展望台?思ってた場所と違うような気がしたので調べたら鳥のオブジェは取り壊されてしまったのか.
せっかくなので下地島まで行って,宮古そば食べた.(ソーキそばとの違いはよく分かってない)

通り池.下地島空港のすぐ近く.

これ,いっぱい生えてて美味しそうに見えてググったけど,アダンという木の実だった.デイリーポータルZ情報によると美味しくないらしい.実はパイナップルに似てるけど全く違う植物.

空港の進入灯.

反対は滑走路.飛行機が飛ぶとこ見たい気がしたけど,暑すぎて熱中症になりそうなので帰る.
眠い.とりあえず準備して出かける.
https://github.com/binzume/adbproto
GoでAndroidのADBにつなぐやつを独立したパッケージにしておく.SYNCパケットでのファイル転送とかは気が向いたら実装する.
JALの機内WiFi,SSHが繋がるホストと繋がらないホストがあるのだけど何でだろ.電波が出る機器は使っては駄目という注意事項の直後にWiFiの案内するの,もう内容変える気ないんだろうか...
座席のディスプレイの再起動中に色々見えていたのが気になった.

さすがに接続できなかったけど,MACアドレス調べるとThales Avionics In-Flight Systems LLCの機器っぽい.
このモニタ,Video Inputとして黄色のRCA端子があるのだけど,2022年にそんな映像出力ができる機器を持ち歩く人いない気がする.

旧宮古島市役所.ホテルの地図見たらすぐ近くが市役所だったので,市役所前までタクシーで行こうとしたら一度違う場所に行ってしまった...だいぶ前に移転したらしい.見た地図が古かった.
うなぎ食べた.

水回りとかエアコンとかの掃除してたら半日使ってしまった…….
休みに家にいると睡眠時間がだんだん伸びていくので,過ごすのに良さそうな場所を探す.
基本的には引きこもるのでどこでも良い気がするけど,ゴールデンウイークは北に行ったので今度は南にする.とりあえず,明日の飛行機のチケットを予約.
明日から,15日まで休みにしたので10連休.
Go1.19でGenericsのパフォーマンス改善されたみたいだし,そろそろ色々なものをGenerics使った実装に置き換えてたのだけど,なんだかとても実行が遅い...
気になったのでコンパイル結果を眺めてみたけど,
type SimpleComparator[T comparable] struct{}
func (c SimpleComparator[T]) Equal(a, b T) bool {
return a == b
}
func main() {
var c SimpleComparator[int]
fmt.Println(c.Equal(42, 42))
}
こういう単純な例でも,インライン化されていない.
type IntComparator struct{}
func (c IntComparator) Equal(a, b int) bool {
return a == b
}
こっちは,もちろんインライン化される.基本的にGenerics型のメソッドはインライン化されないみたい.
実際には,Comparatorを型引数として色々な処理に渡していて, 空のstructならインライン展開されていれば実行時のコストは全くかからないと思ったのだけど,毎回レシーバを指定したメソッド呼び出しになってしまっていた.これならstructではなく関数を値として取り回した方が少し良さそう.
一応,main.SimpleComparator[go.shape.int_0]
みたいな型が生成されて使われてるので,将来改善されそうだし,ほとんどの場合は気にならないけど.
そういえば,Goが出力するアセンブリ,引数が全部スタックに積まれてた時代はCPUアーキテクチャほとんど意識せず読めたのが,1.17からレジスタベースのABIになってアーキテクチャごとのレジスタの用途を知らないと読みにくくなってしまった.