2019年10月29日火曜日

docker の中の jupyter

macのdocker内でjupyterを使うときに注意すべきこと

ポートフォワード

コンテナを作るときにポートのフォワードを設定する
docker run -p 8000:8888 --name xxx ubuntu 
とかしておくと、なかの8888で起動したものがそとで8000で使える。

バインドアドレス

jupyter 起動時にデフォルトだと127.0.0.1にバインドに行くが、これをやるとエラーが出る。
  File "/home/xxxx/anaconda3/lib/python3.7/site-packages/tornado/netutil.py", line 174, in bind_sockets
    sock.bind(sockaddr)
OSError: [Errno 99] Cannot assign requested address
これを回避するには --ip をつけて起動する。
jupyter notebook --ip 0.0.0.0
これも面倒なので、config ファイルに書く。
jupyter notebook --generate-config
とやると ~/.jupyter/jupyter_notebook_config.py というファイルができるので、 この中のc.NotebookApp.io を下記のように設定する。
c.NotebookApp.ip = '0.0.0.0'

パスワード

外からつなぐときにトークンをいちいちうつのが面倒なので、 パスワード認証にする。
jupyter notebook password
とやると聞いてくるので、適当に指定する。

2019年10月25日金曜日

karabiner element で'{'で英数モードに切り替える。

ASCIIDOCで、文字置き換えを多用していたら、 { で英数モードに自動的に切り替わってほしくなった。 Karabiner Elementで入力モードに依存したキーコード発生ができるということなので、やってみた。

設定方法

~/.config/karabiner/assets/complex_modifications 以下に設定したJSONファイルを置くと、それがcomplex modifications のなかに出てくるようになる。 このJSONファイルの、trailing comma の扱いが妙にシビアで
["a","b",] 
みたいな物があると、パースに失敗するらしくリストに出てこない。logにもでないので、理由がわかるまでに時間を浪費した。

設定ファイル

こんな感じ。日本語入力モードだったら、cmd-spaceでモードを切り替えてから'{'を入力する。 とりあえず快適。
{
  "title": "for vscode asciidoc",
  "rules": [
    {
      "description": "turn off IME with rbrace",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "open_bracket",
            "modifiers": {
              "mandatory": [
                "left_shift"
              ]
            }
          },
          "to": [
            {
              "key_code": "spacebar",
              "modifiers": [
                "command"
              ]
            },
            {
              "key_code": "open_bracket",
              "modifiers": [
                "shift"
              ]
            }
          ],
          "conditions": [
            {
              "type": "input_source_if",
              "input_sources": [
                {
                  "language": "ja"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

2019年10月14日月曜日

Python traitlet

JupyterのWidget に使われている Traitletについてしらべてみた。 ここにある。 要するに、比較的高機能なプロパティをクラスインスタンスに与えるためのパッケージ。高機能というのは
  • 型を制約。別の型の値を代入するとエラーになる。
  • デフォルト値を動的に計算可能にする。
  • 代入時に強制型変換をおこなったり、バリデーションチェックをおこなったりする。
  • 値が変更された際にcallback関数を呼び出す。
  • コンフィギュレーションファイルから値を読み込む。
どうも最後のことがやりたくて作ったんじゃないかという気がする。 使い方のサンプルはこんな感じ。
from traitlets import HasTraits, Integer, observe

class TraitletsExample(HasTraits):
    num = Integer(5, help="a number").tag(config=True)

    @observe('num')
    def _num_changed(self, change):
        print("{name} changed from {old} to {new}".format(**change))
widgetではobserveをあとから呼び出しているが、通常はこうやって関数を登録するようだ。 便利そうだが、おそそうでもある。

jupyter widgetsでコールバック

Jupyter のWidgetはポーリングすれば値がとりだせる。今どきのGUIだと常時更新し続けるのが常らしいので、それだけでもこまらないようなのだけど、それだとあまりにバカっぽい。コールバックができる仕掛けを調べてみた。 ここに書いてある。
slider = widgets.IntSlider()
slider.observe(lambda change: print(change), names='value')

display(slider)
のようにobserveでコールバック関数を登録すればいい。 スライドをいじると下のようなイベントがたくさん飛んでくるのが見える。
{'name': 'value', 'old': 0, 'new': 1, 'owner': IntSlider(value=1), 'type': 'change'}
observenames引数がよくわからないが、これを指定しないと _property_lockというnameのチェンジイベントもたくさん飛んでくるようになる。
{'name': '_property_lock', 'old': {'value': 1}, 'new': {}, 'owner': IntSlider(value=1), 'type': 'change'}
なのでつけておいたほうがいいのだろう。 ドキュメントによるとIPython traitlets というものがイベント周りをなんとかしているようなのだけど、どこをみたら書いてあるんだろう。。ここにあった。。

2019年10月13日日曜日

vscode でターミナルとエディタ間のトグル

vscode ではターミナルが統合されていて便利なのだけど、そことの行き来にマウスを使うのが面倒。ぐぐってみたら こんな記事を発見。すばらしい。 キーボードショートカットとして下のように登録するとCtrl-`で行き来できる。便利だ。
// Toggle between terminal and editor focus
{ "key": "ctrl+`", "command": "workbench.action.terminal.focus"},
{ "key": "ctrl+`", "command": "workbench.action.focusActiveEditorGroup", "when": "terminalFocus"}