ウィンドウにしるしをつけようと思ったけどできなかった

OBS Studioのウィンドウキャプチャがウィンドウを見つける方法は、

  • タイトル
  • 実行ファイル名
  • なるべく一致 (??)

ということで、複数のChromeウィンドウがあったときに配信用と定めたものにキャプチャを限定できないか考えてみた。

タイトルは、ウィンドウタイトルのことだと思われる。windows api の setWindowTextで書いてしまえばいいと思った。しかしChromeの場合、アクティブなタブが変わる度にそのタブのdocument.Title + "- Google Chrome"になってしまうのでダメだった。

実行ファイル名は、ハードリンクで別名のexeを作ってそれから起動したらいけるんじゃないかと思ったけどchrome.exeのままだった。ダメだった。どういう仕組みかはわからなかった。

ということであきらめた。

https://www.reddit.com/r/PowerShell/comments/6lg1tm/possible_to_override_application_window_title/

twitchでスクリーンキャストストリーミングをはじめた

OBS Studio を使ってる。

配信用に設定したChromeを用意した。「ハードウェアアクセラレーションが使用可能な場合は使用する」がONになっているとOBSでウィンドウキャプチャができなかった。ユーザーディレクトリごと別に分けてしまって、"設定"画面で、ハードウェアアクセラレーションをOFFにした。それと配信に映ってしまわないように、google アカウントで同期するものを絞っておいた。--user-data-dir=pathのオプションを追加したショートカットファイルを作った。Windowsのタスクバーに追加した。ショートカットファイルのオプション違いはスタートメニューやタスクバーでまとめられてしまうけど、Chromeの --user-data-dir や、--profile 違いのショートカットキーはまとめられない。

Twitchのコミュニティガイドラインに目を通した。

Twitchユーザーの多様な年齢層や国際的なコミュニティの文化的背景を考慮

外出時またはショッピングモールおよびレストランに出かける時のような服装の着用が適切です

御意。

Vue.js v-for template の v-bind:key

virtual dom の nodeには一意のキーが必要 componentはnamespaceを作るけど、templateは作らない。 なので、例えば一つの.vueファイルの中で、<template v-for=が2つあったらそのtemplateの子要素にはその.vueファイルでuniqueになるようにkeyを与えなきゃならない。v-bind:key="'list1-' + index" v-bind:key="'list2-" + indexみたいに。 templateが2つじゃなくても、templateの子が2つ以上だったりしても同じ。だと思う。

と理解した。

forum.vuejs.org

JavaScriptの時刻

moment.jsを使っとけばいいのだけれど、JavaScriptのDateがどういうものか調べた。

Dateオブジェクトは、UNIX epochからのミリ秒をデータとして持つ。 UNIX epoch = 1970 1/1 00:00:00 (UTC)

引数なしコンストラクタcallのときは現在時(UTC)。

ホストシステムのタイムゾーン = 現在のタイムゾーン Intl.DateTimeFormat().resolvedOptions().timeZone1

Date.parseは、ISO8601の書式以外ではブラウザの実装依存の結果になる。moment.jsを使っとけばいい。

memolog.org

JavaScript の Jupyter Notebook を Google Cloud Shell の Docker で 動かす

いつも通り、Google Cloud Shell での作業。 JavaScript で Firestore を使うのにあれこれ書いて試したかった。


Google Cloud Shell で Jupyter Notebook を Dockerコンテナとして動かす

Jupyter プロジェクト公式のイメージが Docker Hub に置いてある。

jupyter-docker-stacks.readthedocs.io

今回は、jupyter/base-notebook を使う。 ここの Dockerイメージは、jovyan1というユーザーで Jupyter が起動するようにセットアップしてある。

docker run -p 8080:8888 jupyter/base-notebook

Google Cloud Shell のプレビュー機能でアクセスできるけど、新しいノートブック作ったりできない。リクエストのホスト名チェックではじかれてしまう。

こんなエラーメッセージ Blocking Cross Origin API request for /api/contents.

これは Jupyter の起動オプション2で待ち受けホスト名を指定すればいい。あとついでに、token 認証も無効にする。Google Cloud Shell のプレビューだと認証済みのリクエストしか通ってこないから Jupyter の認証を無効にしてもよい。起動オプションを指定するときは、起動スクリプトも指定する必要がある。

docker run 
    -p 8080:8888 
    jupyter/base-notebook 
    start-notebook.sh --NotebookApp.allow_origin="*" --NotebookApp.token=""

jupyter/base-notebook からカスタムイメージを作る

同じことは Dockerfile でもできるが、今回はコンテナにアタッチして手動で設定した。

IJavascript をイントールする

IJavascript のコードリポジトリにある Dockerfile3 を参考にした。ついでに firebase の Web SDK も追加しておく。

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/conda/bin"
npm install -g ijavascript firebase
ijsinstall

実際コードで require するときには node のグローバルモジュールのパスも追加する必要がある。それは後で Dockerイメージに ENV で書き込む。モジュールがインストールされるパスは npm root -g で表示できる。

Jupyter Notebook を設定する

Notebook をアップデートする

いま(2019/11/21)の latest イメージだと、Notebook の keyboard shortcut エディターが使えないなどの不具合がある。

サーバー側ではこんなエラーメッセージ 404 GET /static/components/react/react-dom.production.min.js

notebook のバージョンを最新では解決されてる。コンテナの中で conda コマンドを使ってアップデートする。

conda install notebook

Notebook の起動オプションを設定する

起動オプションを設定ファイルで設定する。/home/jovyan/.jupyter/juypter_notebook_config.pyに書く。

c.NotebookApp.allow_origin='*'
c.NotebookApp.token=''

Notebook のショートカットキーを設定する

Cell の編集モードで Shift-Enter を押したときに Cell が実行されるのを無効にしたい。チャットツールとかで改行が Shift-Enter だから反対の癖がつくとやっかいだから。それと、ctrl - [で編集モードから抜けるショートカットキーを追加したい。

Keyboard Shortcut Customization — Jupyter Notebook 6.0.2 documentation

/home/jovyan/.jupyter/custom/custom.jsに書く。書く内容は notebook の cell に マジックコマンド%%javascript を使うか、ブラウザの デベロッパーツールのコンソールで実行して確認できる。4

Cell の編集モードは CodeMirror でできている。Jupyter が管理するショートカットキーよりも CodeMirror の持つキー設定が勝つ。ctrl - [は、CodeMirror ではインデント解除に割り当てられているのでそれを削除する。

Jupyter.keyboard_manager.edit_shortcuts.remove_shortcut('Shift-Enter');
Jupyter.keyboard_manager.edit_shortcuts.add_shortcut("ctrl-[", "jupyter-notebook:enter-command-mode")
delete CodeMirror.keyMap.default["Ctrl-["]

編集した Dockerイメージを保存する

上でいじったコンテナをもとに Dockerイメージを作る。ついでに、環境変数と起動オプションを設定する。

docker commit 
    -c "ENV NODE_PATH /opt/conda/lib/node_modules" 
    -c 'CMD ["start-notebook.sh"]' 
    <ここにコンテナid>
    <ここに作成するイメージ名>

Docker Hub にアカウントがあってdocker loginコマンドでログインしてあれば docker pushで自分のイメージをDocker Hub に置ける。

Firestore local emulator に Firebase JavaScript SDK (Web) で接続する

admin SDK ではなくて、Webブラウザで使う firebase-js-sdk で firestore ローカルエミュレーターに接続する方法。

const db = firebase.firestore();
db.settings({
    host: "172.18.0.1:18080",
    ssl: false
});

Connect your app and start prototyping  |  Firebase

他の SDK では環境変数 FIRESTORE_EMULATOR_HOST で設定できるが、Web SDK環境変数を読まない。

Can't connect to local Firestore emulator · Issue #1721 · firebase/firebase-js-sdk · GitHub