10:35:29 # Life カウントダウンタイマーの使い方についてビデオを作成してみたが、使い方の説明が必要なほど複雑ではなかったかも。 カウントダウンタイマーサーバだけが動いているNodejsのDockerイメージを作成してそれをCloud Runで1インスタンスで動かすという仕組みにしてみました。 サーバとしては/にリクエストがきたらユニークっぽいIDを作成して「部屋」のIDとしその部屋単位でタイマーを管理。 Adminページにいくと管理者としてタイマーの時間をいつでも再設定できるように。 ブラウザがクライアントでブラウザ側では時間管理を全くせずに毎秒サーバにリクエストを送るようにしてみました。 こうするとリクエストの数が毎秒クライアント数になるうえに最大一秒のズレが発生するんだけどまぁ実用上は問題ないかな。 複数インスタンスの調整とか実装してなくて1インスタンス同時リクエスト数の上限が80なので、1リクエストで100ms以内ということを考えるとこのモデルで800クライアントくらいまではうごくかな。 もっと使えるクライアントの数を増やすには複数インスタンスへの調整とか、リクエストの頻度を減らしてクライアントサイドでもっと処理するとかすれば良いと思う。
15:29:21 # Life canvas.toDataURLでハマった。 image/jpgを指定するとpngができて、image/jpegだとjpegができた。何じゃそりゃ。 そこをなおしたら先日のでもがまともな値になった。webp, png, jpegの差がそれっぽい。
webp: image/webp 72583 png: image/png 393406 jpeg: image/jpeg 163763
09:44:31 # Life スクリーンショットのサイズ。 canvas.toDataURLで生成されるスクリーンショットのサイズを適当に(60fpsで)計測してみるコードを書いてみた。 出力はたとえばwebp: 19087 png: 115818 jpg: 115818。webpがすごいんだけどそれはchromeだからかな。
17:56:16 # Life ひさびさにDockerをインストールしてみた。 docker buildでRUNしようとしたところで「failed to create endpoint on network bridge: failed to add the host」と出るのでなんじゃこりゃとおもったが、カーネルがモジュールのロードに失敗していたようだ。再起動したらなおった。アップデートした結果期待しているカーネルバージョン用のモジュールがなかったらしい。 これはハマる。 しかし自宅のネットワークでDockerを動かすと一瞬でダウンロードが終わらないので新鮮。
11:16:40 # Life ビデオ録画ツールに手元のカメラで制御できるっぽいパラメータを制御できるようにスライダーを追加した。Chromeにべったりなので他のブラウザでは動かないと思うけど。 ここ。 Saturation, sharpness, contrast, brightnessあたりが操作できれば良いんじゃないか。 今日の学びとしては気づいたらJSのkeyに変数を入れやすくなっている。 {constKey: value}だったのが{[variableKey]: value} として指定できるようになった。 ES2015(ES6)ということは結構まえから?
08:52:09 # Life ext4のcommitパラメーターについて調べたのでメモ。デフォルトはJBD2_DEFAULT_MAX_COMMIT_AGEで5秒。 s_commit_intervalがJiffiesで数えているのでINT_MAX/HZ以下じゃないといかんのだがINT_MAX/HZ秒っていったい何秒だろうと思って調べてたらHZ=1024で3年くらい?3年コミットしないジャーナルは流石にやばかろう。
17:39:29 # Life またビルドシステムを書き直した。 手元のプロジェクトで使ってたNodejsで書いたビルドシステムがあったんだけどそれをC++で書き直してみた。Nodejsである必要ないよなぁとおもって。C++のプロジェクトだったらC++でビルドシステム書くべきな気がしたので。 BUILDみたいな形式になると面白いかなとかいろいろ考えたんだけど結局は素直にC++のコードっぽい書き方にした。 コードとしては情報を提供したwら必要なNinjaのルールを生成するというもの。 もうちょっとKey/Valueなかんじにしたいかなと思ったらc++20が必要になりそうだったのでInitializer_listで我慢。
int main() { NinjaBuilderConfig config; NinjaBuilder n(config); n.CompileLinkRunTest("gitlstree_test", {"basename", "cached_file", "concurrency_limit", "directory_container", "get_current_dir", "git_cat_file", "gitlstree", "gitlstree_test", "scoped_timer", "stats_holder", "strutil"}, {"out/fetch_test_repo.sh.result"}); }
08:31:32 # Life nodejsでwriteでエラーがおきたときのエラーメッセージ。 どのwriteでエラーが発生したのかを教えてくれないでerror eventがハンドリング去れていませんというエラーメッセージだけが出るのが辛い。
events.js:174 throw er; // Unhandled 'error' event ^ Error: write EPIPE
07:49:21 # Life 複数のChromebookを使ってて気づいたんだけどChromebook Pixelで動かしているCrostiniが特にプチフリーズみたいな挙動が多い。 なんかXの動きが変なのかも。なんでだろ。
09:02:17 # Life emacsがログインシェルの人あまりいないなぁとおもってみてる。 ssh-agent使いたいなぁとおもって調べたのだけどsystemd使って試行錯誤している人とかいろいろ。 とりあえずelispで環境変数を設定する方向で試してみようかな?
(defun ssh-agent () "Run ssh-agent and set necessary environment variable." (interactive) (let* ((ssh-agent-output (shell-command-to-string "ssh-agent"))) (string-match "SSH_AUTH_SOCK=\\([^;]*\\); " ssh-agent-output) (let* ((ssh-auth-sock (match-string 1 ssh-agent-output))) (setenv "SSH_AUTH_SOCK" ssh-auth-sock))))
ssh-agentのマニュアルを見た感じだと-a -Dを指定してEmacs側に管理去せてもいいかもしれない。 一時的なUNIX domain socketの名前をssh-agent側に生成させる価値はないし、 ログインシェルがemacsだったらssh-agentのプロセスの管理はemacsに任せれば良い。 systemd serviceにする場合でもそれは同じことのような気がする。
09:59:21 # Life クラウドのインスタンスつけっぱなしにするなら。 価格体系をながめてみるとVPSのほうが安い。たとえばGCEとsakura vps。SakuraのVPSとSakuraのクラウドを比較すると価格設定は大体倍くらいになってるのかな。 僕のワークロードは使用率1%以下なのでその都度インスタンスを確保するほうがよいのだが。 なんでこんなことを調べようかと思ったのはまぁつけっぱなしにしてわすれてたから。
15:54:17 # Life webrecordアプリにマイナーアップデート。カスタマイズもうちょっとしないとなぁ。とりあえず720p決め打ちにしてみた。何も指定しないともっと解像度低いもしくは別のアプリの指定した解像度になるっぽい。これ
16:29:55 # Life 東京エリアDebian勉強会のCI作業メモ。今日はSalsaのCIについて勉強した。 SalsaではGitlabのCIが使えるんだけど、全体で共有の「Shared」 環境というのがあるんだがなかなかビルドの順番が回ってこない。 その状況を回避するためには東京エリアDebian勉強会というグループでCIの実行環境(Runner)を用意することができる。 Gitlab CIの実行環境の設定についての説明はGitlabのドキュメントに書いてあって、CIの実行環境となるシステムからgitlab-runnerを実行して登録するとそこで実行できるようになると。 Dockerの環境の構築で住むはずのインストール作業を毎回いちからやりなおしているのもったいなぁとおもったけど Imageを指定する方法はあるけど、Dockerfileを指定する方法とかないのかな。 多分、cloud build でイメージを作成してgcr.ioから参照するということはできると思うんだけど、そのイメージの更新の仕組みをどうするか。 東京エリアDebian勉強会のCIは意外と個人の運用しているインスタンスに依存してビルドしているということがわかった。
18:08:02 # Life crontabでrebootで起動していたジョブ。気に入らないのでsystemdから起動してみることにした。 ハマるところはいくつかあるけど、まずserviceファイルの書き方、置く場所(.config/systemd/user/)、そしてuser権限でうごかすかシステム権限で動かすか。user権限で動かすんだったらserviceファイルの中にユーザを指定したら失敗。 user権限で動かす場合にその該当ユーザがログインしている間だけ動かすんじゃなくてシステム起動時に動かしたいのならloginctlでenable-lingerと指定することでログアウト状態でもジョブがうごくようにしないといけないところ。
10:34:14 # Life sshfsのslaveモードについて思い出せないのでマニュアルにpull requestをしてみた。取り込まれたみたい。 名前をpassiveモードにしてみたけどどちらにしても思い出せない。
08:17:52 # Life ハックカフェでやりたかったことメモ。どれかはやる。 ストリーミングのデバッグ、起動時にうごくはずの某ジョブがこけていること。Debian勉強会の資料。 Windowのキャストの方法
09:07:58 # Life 最近結構ゲームしている。 SplatoonとRing Fit AdventureとFit BoxingとNieR Automataをプレイするので毎日が忙しい。