hsimyu's diary

ゲームなどをします。

10/15 This is

10/15 (月)

ごはん

朝: オールブラン

昼: 豆乳担々麺

夜: まぐろ漬け丼、ししゃもフライ、焼き厚揚げ、ナスの味噌汁

仕事

いい感じ。worktree リポジトリ生やしまくったので小さい課題をパイプライン処理する時の効率が激上がりした。4リポジトリくらいあると大きい作業2個小さい作業2個くらいでいい感じっぽい。たまにビルドするリポジトリ間違えたりするけど、そのうち慣れるだろう。そろそろ来月末向けの作業を始めたいので、その前準備とか。

Emscripten

C/C++LLVM フロントエンド → LLVM-IR→ EmscriptenJavascript

という変換をする OSS プロジェクト。OpenGLWebGL に変換したりもする。性能とかどうなんだろ?というか「Webで動かしたい」が目的だと思うので、バックエンドで出力するならむしろ WebAssembly の方が良さそう。

qiita.com

この辺とか?

GL言語間の変換だけの層と、LLVM → 「Web で動くコードの出力」という二層に分けた方がむしろ汎用性高いのではと思う。もちろん Emscripten が既にそうなっている可能性もありそう。

ReSharper

jetbrains が出してる C# (というか .NET) で開発してる時に使える Visual Studio 用の便利ユーティリティ。リファクタ、コード解析、コーディング規約チェック、InteliSense 拡張とか?

https://www.jetbrains.com/resharper/

有料らしい。

std::intptr_t とか

てっきり int* を汎用的に表すみたいな型かと思ってたが、違った。ポインタ値を int 型で持つ、が正しい。

    int value = 42;
    std::intptr_t pointer_value = reinterpret_cast<std::intptr_t>(&value);
    std::cout << std::hex << "0x" << pointer_value << std::endl;

std::uint16_t とかもある。

何に使うの?

  1. ポインタ値を一意な ID として利用する
    • 変数アドレスはそのままユニークな ID として使える。(もちろん同じメモリ上限定)
  2. コールバック関数に渡す引数として、任意のオブジェクトを設定する

    つまり以下のような「整数型ひとつをコールバック関数の引数として渡せる API 」を書ける。

        void callback_api(
            std::function<void(std::intptr_t)> callback, std::intptr_t arg)
        {
            callback(arg);
        }

これができると何が嬉しいか?

あるオブジェクトへのポインタを一度 intptr_t に変換して、コールバック関数に渡す。コールバック関数は任意のオブジェクトを受け取れる。

テンプレートだとこれは無理?と思って適当に書いてみたら動いたので無理ではないっぽい。が、下記のような感じで「 X* という型を静的に知らないと無理」になる。

        struct X {};
        
        void callback_api(
            std::function<void(std::intptr_t)> callback, std::intptr_t arg)
        {
            callback(arg);
        }
        
        void on_call(std::intptr_t arg)
        {
            // do hoge
        }
        
        template<typename T>
        void callback_api_template(
            std::function<void(T)> callback, T arg)
        {
            callback(arg);
        }
        
        template<typename T>
        void on_call_template(T arg)
        {
            // do hoge
        }
        
        int main()
        {
            X* x = new X();
            callback_api(on_call, reinterpret_cast<std::intptr_t>(x));
            // => 呼べる
            callback_api_template(on_call_template<X*>, x);
            // => 呼べる
            callback_api_template<X*>(on_call_template, x);
            // => 呼べない (on_call<T> が実体化しない)
            callback_api_template<X*>(on_call_template<X*>, x);
            // => 呼べる
            ...
        }

wandbox: https://wandbox.org/permlink/azLEp3c2mScKwI0s

実行時に何が送られてくるか分からないような状況でのポインタ型として使うと便利?でも結局オブジェクト型に戻すなら何かしらの方法 (タグ送るとか) で識別して reinterpret_cast しなきゃいけないんだから void* でいいのでは?という気持ちになってしまう。もう少し応用例を調べた方が良さそうだ。仕事には特に関係ありません。

エアロバイク

折りたたみタイプも結構ある?最低価格3万円から、くらいの感覚でいたけど、2~2.5万出せば良さそう。ジムに1回800円(で1時間くらい)かけるよりは長期的に効率いいよな~という気がしてきた。あと、1F 住みなので下への音とか気にしなくていいのもマッチしてる。もう少し検討する。

その他

ダクソリマスタードのめちゃくちゃ丁寧な説明、なぜか面白さを感じてしまう。Switch で新しいユーザー層狙ってるのかな。

www.youtube.com

猫えさ、あごニキビが改善しないかな~というのを狙って新しいのを買ってみた。 明日届く予定。今の食べ終わったら変えてみる。