hsimyu's diary

ゲームなどをします。

4/23 げろげろ〜

4/23 (火)

月曜日ではない日。今やってるメインタスクはまだまだ終わらない大きいやつなので、育休前に小さいのを全部片付けておくことにした。無心でリファクタリングしてたら一日が終わった。

娘は昨日よりご機嫌。二回目の予防接種も、少しだけの泣きで乗り切ったようだ。今回は五つ(肺炎球菌・B型肝炎・四種混合・ヒブ・ロタ)だ!すご〜い

夜は少しご機嫌ななめ。寝付いたと思ったら起きてゲロゲロ。

UE4 アセットマネージャー

http://api.unrealengine.com/JPN/Engine/Basics/AssetsAndPackages/AssetManagement/

プライマリアセット: アセットマネージャーに登録されたアセット

  • プライマリアセットは Primary Asset ID が割り振られ、アセットマネージャーから(プログラム / ブループリントで) 操作可能。
  • デフォルトだと UWorld アセットのみがプライマリで、参照された他のアセットはセカンダリアセットになる。
  • アセットマネージャーの GUI 画面ではプライマリアセット配列を直接いじるような感じ。プライマリアセットはベースアセットタイプを指定する必要がある。

セカンダリアセット: プライマリアセットが参照しているアセットのうち、プライマリアセットでないもの

  • セカンダリアセットは操作できず、プライマリアセットに参照された / 使用される際にエンジンによって自動的にロードされる。

アセットバンドル: セカンダリアセットをどうまとめるか、のリスト。

UE4 プロファイラー

https://www.slideshare.net/EpicGamesJapan/cedec2017-ue4

  • ユーザーが明示的に計測区間を指定するような口はない?
  • ランタイムのプロファイラーの表示はかなりプリミティブな感じ
  • プロファイルするにはコンソールを叩く必要がある
  • 実機版だと可視化表示はされない(テキストログとして出力される)

4.22 から入った Tracing Profiler は Chrome の tracing 画面を可視化ツールとして使うようだ。面白い。

http://unrealengine.hatenablog.com/entry/2018/09/24/194712

ごはん

朝: オールブランではないもの

昼: マボードウフ

夜: カレーうどん

4/20-22 機嫌悪し

4/20 (土)

体が動かなくて昼まで寝たり起きたり。

昼飯はマクドナルド。ギガビッグマック、失敗だった。

夜は豆腐ハンバーグを作る。タネがでかすぎて割れた。

RICOH Handy Printer

プリンター

ヨドバシ.com - リコー RICOH RICOH Handy Printer White [モノクロハンディープリンター ホワイト] 通販【全品無料配達】

これめっちゃほしいな!と思ってたけど、5万円か〜〜〜。家庭用で考えると、ちょっと手が出ないな……。

ごはん

朝: オールブラン

昼: ギガビッグマック

夜: 豆腐ハンバーグトマトソース煮込み

4/21 (日)

めっちゃ月曜日感を感じながら起きたので、間違えて出社しかけた。

電車に乗ってベビザらスへお出かけ。だいぶ機嫌がよくて、寝てる間にドーナツ屋さんでお昼食べたりした。あとは妻がユザワヤで買い物してるのを待ってたり。帰りの電車ではだいぶ泣いたが、降りたらケロッとしていた。

参照渡し (call by reference) と共有渡し (call by sharing)

参照渡し: 仮引数が実引数の参照となる。参照は一つだけ生成される。

共有渡し: 実引数の参照をコピーして仮引数の参照とする。参照は二つ生成される。参照の値渡し(call by value where value is the reference copy)とも。

https://qiita.com/makotoo2/items/50c6ee98c18f35688b17

https://qiita.com/raccy/items/d4c5e7995a8fc90109ee

最近ずっと C++ 書いてる視点から JavaScript の関数定義見ると、この言語でもう絶対に大きなアプリケーション書きたくね〜〜〜と思う。次に Web アプリ書く時は TypeScript にしよう。

ごはん

朝: オールブラン

昼: ドーナツ

夜: カツ丼

4/22 (月)

本当の月曜日。月曜日だぜ〜という気持ちで仕事をした。

娘は風呂後だいぶグズグズ。2.5 時間くらいで寝てくれた。おなかパンパンだったし、母乳飲みすぎて気持ち悪かったのかもしれない。

ラムダと ownership と unique_ptr とライムタイム

std::unique_ptr<int> a = std::make_unique<int>(1);

auto f = [b = std::move(a)]() {};
// b は f のライフタイムが切れる時、同時に破棄される。

ここから Rust になるわけですね。

ジェネリックラムダはパラメーターパックも書ける

auto f = [](auto... args){};

知らんかった。可変長テンプレート関数書き放題じゃん。

std::shared_mutex

「複数ユーザーによる読み取りと、単一ユーザーによる書き込み」ができる共有ミューテックス(Readers-Writer Lock というらしい)。

lock() / unlock() : 書き込み用ロックを取得/解放する

lock_shared() / unlock_shared(): 読み込み用ロックを取得/解放する

この mutex クラスは自身のロック状態を認識してデストラクタで自動的にロック解放という機能をもっておらず、下記の lock 用クラスを使ってロックをハンドリングする。

排他(書き込み用)ロック: std::unique_lock, std::lock_guard

共有(読み込み用)ロック: std::shared_lock

std::lock_guard は非常に機能がシンプル (RAII でロック取得/解放する) で、オーバーヘッドがほぼゼロ。高度なミューテックス操作が必要な時は std::unique_lock を使う。

ごはん

朝: オールブラン、ドーナツ

昼: つけ麺

夜: とりチーズ焼き、混ぜご飯

4/19 かみちぎり

4/19 (金)

今日も7時間→4時間くらい寝たようだ。すごい眠るなきみは。

仕事は引き続き新機能のサンプルの実装。あとは先週試作した API をもっと欲張った形にしてみて、どのくらいオーバーヘッドが出るか計測していた。std::unordered_map の find はほとんど問題にならないなあ。さすがハッシュテーブルだぜ。キーを std::string にしてしまった時のコンストラクトのが遅い。この辺は C++20 で入る「std::hash::transparent_key_equal」が定義されていると、一時的なコンストラクトが走らないようになるので差がなくなるのかな。

https://cpprefjp.github.io/reference/functional/hash.html

あと、先々週くらいに、実用上問題は出ないはずだが安全のためにやっていた処理が微妙に重いのを発見して、直していた。スタック上でのメモリ確保にかかる時間も、16.6 ms が上限の世界で考えると馬鹿にならないなあ……。そう考えると Unity が基本的に C# の上で(ヒープメモリ使いまくりで)動いてるの、すげーな(そして最適化クソ大変だろうな)と思う。

娘の鼻が詰まっていたので予め買ってあった EDISON の鼻吸い機を初めて使ったのだが、少し目を話した隙にみかんにゴム製ノズルを噛みちぎられてしまった。1回しか使ってないのに!!!幸いノズルだけで売っていたので注文したが、本体 6000 円に対してノズルだけで1000円するの、ちょっとどうかと思います。

YUNO リメイク

とりあえず初めて1ルート終わりそう、ってところで扉が開かなくて、宝玉も使い切ってたのでマップ開けなくて、詰んだ。宝玉使い切ったら戻れないの、悪意しかないデザインだな。合計8時間くらいプレイしてるっぽいが、これクリアに 60 時間くらいかかるゲームですか?

ごはん

朝: オールブラン

昼: パスタ

夜: とんかつ

4/17-18 8時間睡眠

4/17 (水)

勉強を終えて実装を読んだりしていた。あとはデバッグ屋さん。

記憶があいまい。

YU-NO を結構進めた。

ごはん

朝: オールブラン

昼: わすれた

夜: 冷やし中華

4/18 (木)

娘が 8 時間寝る。最長記録だ。妻が娘より先に起きて、めっちゃ元気そうにしていた。

仕事は引き続き動作チェック。今回はだいぶ不具合少ない気がする。いいですね。サクッと終わったので実装を書く。Visual Studio の IntelliSense が度々死んで困る。

娘はなんか全体的に機嫌が良い。なんとおれの顔に手を伸ばした。単なる偶然ではなく、なんと4回くらい繰り返したのです。随意運動だ〜〜〜〜〜〜〜〜

Undefined Behavior ランキング

C++標準化委員会は踏み抜きやすいUndefined Behavior TOP100のようなものを公式に出すべきではないか - Qiita

ほしいなあ。

ごはん

朝: オールブラン

昼: チキン

夜: ラザニア

4/16 Networking

4/16 (火)

仕事は CI 用のスクリプト直したり、ネットワークの勉強をしていたり。明日も勉強しよう。

娘はいつもどおり。お風呂前後で少し機嫌悪め。

Unity 計測 API

UnityEngine.Profiling を使う。

簡易計測する場合、Profiler.BeginSample(string) / Profiler.EndSample() でサンプル区間を追加できる。

https://docs.unity3d.com/ja/current/ScriptReference/Profiling.Profiler.BeginSample.html

CustomSampler をメンバとして持って、Begin / End で使うこともできる。

https://docs.unity3d.com/ja/current/ScriptReference/Profiling.CustomSampler.html

CustomSampler は BeginSample() に比べてオーバーヘッドが「very low」である。また、後述する Recorder からも使える。

スレッドのプロファイルは別の API を使う。Profiler.BeginThreadProfiling(string, string) / Profiler.EndThreadProfiling().

計測した結果は Recorder で Get しないといけない。

BeginSample はサポートされてない。マジか。

プロファイラーウィンドウはこんな感じ。

https://docs.unity3d.com/ja/current/Manual/Profiler.html

メモリグラフと CPU 負荷グラフを並べて見られるのはだいぶ良さそう。

ごはん

朝: オールブラン

昼: 鶏肉

夜: ささみのしそチーズフライ

4/14-15 katakori

4/14 (日)

昼ごはんはトマトソースパスタ。意外と高得点だが、レシピ通りだと味が足りない雰囲気。マッシュルームとコンソメとかで味を整えると良さそう?

娘、こまめに寝るもあまり長時間は寝ず。久しぶりにミルクあげてみたら哺乳瓶を拒否してしまって、全然飲まなかった。違う乳首買ったほうがいいのかしらん。

Two-Phase Name Lookup について

C++ - Two phase name lookup という言語仕様はなぜ必要なのでしょうか|teratail

いい回答だった。two-phase name lookup しない (= テンプレートの実体化まで名前解決を遅らせる)と、テンプレートの挙動が文脈依存で曖昧になってしまう。

two-phase name lookup は

  1. テンプレート定義時に名前解決する。ただし、テンプレート引数が確定しないと解決できるかどうか分からない箇所については実体化時まで名前解決を遅らせる
  2. 実体化時に 1. で解決しきれなかった箇所の名前解決を行う

という動作。1. で名前解決を遅らせるのは、基本的に T に依存する箇所のみ。したがって、上記質問者が書いたようなケースでは member を解決しようとして名前解決に失敗する。this→member や T::member_ (static なら) であれば実体化時の解決になり、コンパイルできる。

ごはん

朝: ドーナツ、オールブラン

昼: トマトソースパスタ

夜: 魚、チヂミ

4/15 (月)

普通に出勤。先週までやっていた作業は一区切りついて、明日がコードフリーズなので、急ぎではなさそうなものの試作などをしていた。あとはドキュメント書き。

娘はいつもどおり。少しクーイングが多かった気がする。

ごはん

朝: オールブラン

昼: ハンバーグ

夜: じゃがいもと肉

4/12-13 documentation

4/12 (金)

あんまり記憶なし。ちょっと遅めに出社して、不具合調査。

再現条件不明だし謎の不具合だな〜〜と思ってたら結局 OSS の不具合だった。更新したら直った。午前中が溶けてしまった。

午後はドキュメント書き。育休に向けて現状の内部実装をまとめたり設計思想を残したりしておく。自分向けでもある。

娘はだいぶグズグズ。

ごはん

朝: オールブラン

昼: たけのこご飯

夜: すし

4/13 (土)

9時ごろ起きる。マンションの消防訓練に参加する。出欠取ったりしてる訳ではなかったので、来年からは出席しなくて良さそう。

その後少しお散歩。イオンで買い物。お昼寝。ぼーっとした感じの一日だった。

娘、縦抱きで左右に揺れつつ控えめに背中トントンしてると眠りやすいような気がしている。泣いて寝ない時の最強の武器はやっぱり母乳なのだが、母乳が出せないおれには母乳が出せないなりの戦い方がある。

Enter the Gungeon をプレイし始めた。

ごはん

朝: オールブラン

昼: ハンバーグ

夜: とりにくのたまねぎ焼き

4/9-10 くび座りはじめ

4/9 (火)

なんか5時ごろ目が覚めてしまったのでかなり早く出勤。泥臭い最適化を頑張っていた。単機能の高速化じゃなくて全体の無駄を削る作業をやっているので、意図せずして全体の把握が進んできたのは大分嬉しい誤算。高速化のネタはなくなりつつある。

娘は、首が座ってきた。両腕だけで持ち上げても頭がついてくる。完全に安定するにはもう少しかな。

調べ物

コアアフィニティ: スレッドが走るコアの指定、的なこと。アフィニティは親和性

バスク風: "フランス・スペイン国境にあるバスク地方の様式のものである様子。特にフランス料理で、バスク地方のスタイルの料理である様子。"

ローソンのバスク風チーズケーキを妻が買ってきたのだが、まあチーズケーキだね!って感じで、大きな感動はなかった。インスタ映え

ごはん

朝: オールブラン

昼: ハンバーグ

夜: うどん

4/10 (水)

昨日見つけた不具合を直したり、新しい API を書いたりしていた。

高速化は、優先的でない処理を off-the-main-thread 的に逃がしていかないとこれ以上どうしようもなさそう、ということが分かってきた。ところで、ゲーム(フレームワーク)開発と Web フロントエンド開発って割りとマインドが似ている気がする。ユーザー入力と直接お付き合いする層だからかな。(必要なスキルセットは大きく違うけど)割りとすんなり慣れたのってフロントエンド開発に慣れていたからかもしれない。

みかん

ごはん

朝: オールブラン

昼: 混ぜそば

夜: からあげ、トマトのマリネ

4/8 ハンドリガード

4/8 (月)

なんか寝不足で7時半まで寝ていた。妻の喉がちょっと痛むということで午前休を取って娘を見ていることにする。

妻がでかけて30分くらいで寝かしつけに成功。寝る直前に、自分の腕を持ち上げて見つめる仕草をしていたが、ハンドリガードというらしい。

https://h-navi.jp/column/article/35026173

追視と随意運動!

みかんがそろそろ2歳なのと、今の爪とぎがヘタレてきたのでこれを買ってみた。

午前中に届いて設置したのだが、割りと気に入ってガリガリしてくれた様子。

昼ごはんは昨日に引き続きパスタ。えびのトマトクリームパスタに挑戦した。50 点くらいの出来。うーむ。改善の余地あり。

昼に出勤して高速化の続きをする。データ構造からまるっと置き換えて二重ループを省かないと……みたいなところが多くて悩む。

とりあえず無駄な処理を省いて 150μs くらいの削減に成功。

ごはん

朝: オールブラン

昼: トマト感なさすぎえびのトマトクリームパスタ

夜: 青椒肉絲

4/7 げろ〜

4/7 (日)

8時頃起床。娘は今日もご機嫌。

昼前に買い物へ。前買ってあったパスタ本を読んでカルボナーラを作ったのだが、茹でる麺の量が多すぎて失敗した。デブはいつも多めに麺を茹でようとする。

夕方に妻が娘に抗生剤飲ませてたら大量にゲロ。薬だけじゃなくて胃の中から全部出したような感じ。

その後は元気だったので良かった。苦かったのかな。味覚はどのくらい育っているんだろう。生まれてから母乳とミルク以外で最初に口にするのが練った抗生剤なの、ちょっと可哀想。

お風呂入った後は普通。最近おれが抱っこするとめっちゃ泣かれる確率が高い。母親と父親を識別できているのかな。すごいぜ。

ごはん

朝: オールブラン

昼: 麺の量多すぎカルボナーラ

夜: しゃけとごはんとサラダと冷凍からあげ