2025年12月3日水曜日

karabiner element でcmd-key tapでIMEを切り替える

キーボード側でタップ時のイベントを改変したりしていたのだけど、karabiner elementだけでできる。 とりあえず快適に動いている。様子を見よう。もっと早くやるべきだった。
  {
    "description": "Send the cmd-space when the left cmd key is tapped",
    "manipulators": [
        {
            "type": "basic",
            "from": {
                "key_code": "left_command",
                "modifiers": { "optional": ["any"] }
            },
            "to": [
                {
                    "key_code": "left_command"
                }
            ],
            "to_if_alone": [{  
                    "key_code": "spacebar",
                    "modifiers": ["left_command"]
	    }],		    
	    "parameters": { "basic.to_if_alone_timeout_milliseconds": 200 }
        }
    ]
}
2026年5月28日追記 OSのバージョンアップのせいなのかよくわからないが、かなり高い確率でトグルに失敗する ようになってしまった。Karabinerの問題ではなく、OSの側でイベントを 2重に受け取っているっぽい.以前から時々失敗することはあったのだが、30%ぐらいの 確率で失敗するようになったので、使い物にならなくなってしまった。 そこで、キーボードの左下にある地球儀マークのキーでもトグルになるようなので、 こちらのキーを生成するようにしてみた。失敗することがほとんどなくなり、非常に快適。。すばらしい。
{
    "description": "Send globe key code when the left cmd key is tapped",
    "manipulators": [
        {
            "from": {
                "key_code": "left_command",
                "modifiers": { "optional": ["any"] }
            },
            "parameters": { "basic.to_if_alone_timeout_milliseconds": 200 },
            "to": [{ "key_code": "left_command" }],
            "to_if_alone": [{ "apple_vendor_top_case_key_code": "keyboard_fn" }],
            "type": "basic"
        }
    ]
}

2024年6月7日金曜日

Pythonでunicodeで変なエラーがでたとき

UnicodeEncodeError: 'ascii' codec can't encode character '\u2026' in position 45: ordinal not in range(128)
が出たときに下のように書いたら治った。
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

2024年2月11日日曜日

marp をvs code で使う

marpはmarkdownでスライドを作るツール。
  • plugin Map for VS Code をいれる
  • Cmd + , で呼び出すセッティングから、プラグインの設定。 Enable HTML とThemes beamer.css などを加える。

2023年12月11日月曜日

pdf を1枚ずつpngにする

popplerのpdftoppm を使う。 poppler は > brew install poppler でいれる。
> pdftoppm -png inputfile output_prefix
ouput_prefix_01, output_prefix_02 のようなファイルができる。

mac のコマンドラインでpdfからsvgへ変換

調べると、inkscape を使う方法や、imagemagick のconvert を使う方法が出てくるのだが、今ひとつうまくいかない。popplerのpdftocairoを使ったらうまくいった。
> pdftocairo -svg file.pdf file.svg
なぜcairoなのかよくわからない。。 ちなみに、ディレクトリにあるpdfを一括で変換するには
> foreach f in *.pdf ; do pdftocairo -svg  $f $f:r.svg ; done
とすればいい。

2023年11月14日火曜日

docker のコンテナからホストのssh-agentを使う

docker を開発環境として使う場合、内部からsshにアクセスしたくなるが .ssh をbindマウントしたり、コピーしたりするのも面倒。 どうするのが正解なのかと思っていたら普通にホストのssh-agentを使う機能が用意されていた。すごいな。
version: '3'
services:
  ubuntu:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ubuntu-test
    stdin_open: true # docker run -i
    tty: true        # docker run -t
    platform: linux/amd64 
    entrypoint: bin/bash
    volumes:
      - "/run/host-services/ssh-auth.sock:/tmp/ssh-agent.sock"
    environment:
      SSH_AUTH_SOCK: "/tmp/ssh-agent.sock"
最後のvolumeとenvironment がポイント。これはmacでのやり方なので、 linuxだとまた違うようだ。

2023年4月19日水曜日

seleniumでasciidocファイルをPDFに変換

これには
  • selenium に asciidoctor extension を入れる
  • PDFを指定して印刷する
の2つが必要。

Selenium に extensionを入れる

これには、
  • extensionのcrxファイルを入手する
  • crxファイルを指定してドライバをつくる
の2つが必要。

crxファイルの入手

crxファイルを入手する方法は このブログ に書かれている。ダウンロードをやってくれるサイトがあるらしいのだが、ドメインが切れたらしく 怪しいことになっていたので、再パッケージする方法を使う。 基本的には、chromeのextension のページで、pack extension ボタンで、導入されているextensionのパスを指定すれば いいのだが、そのパスがわからない。そんなときは、 chrome://version のProfilePathを見ればわかる。この下のExtensions以下にIDのディレクトリがある。 ディレクトリ名はIDだが、個々のExtensionのIDはchromeのextensionsのページ chrome://extensions/ を見ればわかる。 manifest.jsonにも アプリ名が入っているはずなのだが、メッセージファイルを参照している場合もあるようで、grepしてもわからない。

ドライバをつくる

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options=Options()
options.add_extension(pathToExtension)
driver = webdriver.Chrome("./chromedriver", options=options)

PDFを指定して印刷

こちらのサイトに書いてある。 しかしこれどうやって調べたんだろう。どこに書いてあるのかなあ。。

注意点としては、savefile.default_directory の指定はどうも絶対パスでないといけないようなので、 Pathを使って作ってやる必要がある。


pathToExtension="2.7.0_0.crx"

def optionsSetUp():
    #印刷としてPDF保存する設定
    options=Options()
    appState = {
        "recentDestinations": [
            {
                "id": "Save as PDF",
                "origin": "local",
                "account":""
            }
        ],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "isLandscapeEnabled": False, #印刷の向きを指定 tureで横向き、falseで縦向き。
        "pageSize": 'A4', #用紙タイプ(A3、A4、A5、Legal、 Letter、Tabloidなど)
        "isHeaderFooterEnabled": False, #ヘッダーとフッター
        "isCssBackgroundEnabled": True, #背景のグラフィック
        "isCollateEnabled": True #部単位で印刷
    }
    
    prefs = {'printing.print_preview_sticky_settings.appState':
             json.dumps(appState),
             "savefile.default_directory": str(Path('../rendered').resolve())
             } #appState --> pref
    options.add_experimental_option('prefs', prefs)

    options.add_argument('--kiosk-printing')
    options.add_extension(pathToExtension)
    return options
    
    
driver = webdriver.Chrome("./chromedriver", options=options)
driver.get(URL)
time.sleep(2)  # ページが確実にレンダリングされるのを待つ
driver.execute_script('window.print();')   

2023年2月11日土曜日

chrome extention vimium

chrome をキーボード操作したい、という欲求が定期的に出てくる。いろいろ試して、だいたいなんか予想外の挙動が起きてはずしているのだけど、今度はvimiumというものを試してみる。ちょっと試した感じではGmailではキーイベントを取られてしまって動かないっぽい。 こちら にある。 チートシート を転載しておこう。なんかありすぎて わからないが、とりあえずFでリンクが出るのと、 HL でヒストリ移動、JKでタブ移動だけでも、便利。エスケープでモードから抜ける。
?       show the help dialog for a list of all available keys
h       scroll left
j       scroll down
k       scroll up
l       scroll right
gg      scroll to top of the page
G       scroll to bottom of the page
d       scroll down half a page
u       scroll up half a page
f       open a link in the current tab
F       open a link in a new tab
r       reload
gs      view source
i       enter insert mode -- all commands will be ignored until you hit Esc to exit
yy      copy the current url to the clipboard
yf      copy a link url to the clipboard
gf      cycle forward to the next frame
gF      focus the main/top frame


newpage
o       Open URL, bookmark, or history entry
O       Open URL, bookmark, history entry in a new tab
b       Open bookmark
B       Open bookmark in a new tab


find系
/       enter find mode
          -- type your search query and hit enter to search, or Esc to cancel
n       cycle forward to the next find match
N       cycle backward to the previous find match

history
H       go back in history
L       go forward in history

tab
J, gT   go one tab left
K, gt   go one tab right
g0      go to the first tab. Use ng0 to go to n-th tab
g$      go to the last tab
^       visit the previously-visited tab
t       create tab
yt      duplicate current tab
x       close current tab
X       restore closed tab (i.e. unwind the 'x' command)
T       search through your open tabs
W       move current tab to new window
   pin/unpin current tab

2023年1月28日土曜日

visual studio の単語区切り

visual studio には単語単位のforward backward 等があるが、 日本語の編集中にはあんまりうまく機能しない。 藤井大洋先生が、形態素解析を行うランゲージサーバでいれてなにかされている ようだがそれは後で試すとして、とりあえず、単語区切りに「を」とか「が」とか「、」「。」あたりを入れるとちょっとましになる。ちょっとだけど。 こちら を参考に。

2023年1月15日日曜日

SVGファイルの周りを削除

http://alexlenail.me/NN-SVG/LeNet.html で作った画像はSVGになるのだけど、大きい紙の真ん中に書かれている形になるので、 取り込むと周囲に空白ができて困る。bounding box で crop する方法を調べたら あっさり stack overflow にあった。便利だ。。
inkscape -o cropped.svg -D source.svg

2023年1月7日土曜日

jupyter nbconvert でベクタ図入りのノートブックを変換する

nbconvertはpdfやらsvgやらが入ったノートブックを変換すると、inkscapeを使用するらしく、こんなエラーがでる。
FileNotFoundError: [Errno 2] No such file or directory: 'inkscape'
なので、inkscape をインストールして、下のようにしてpathを通す。inkscapeは、app storeからは インストールできないみたいなので、webページからダウンロードした。
ln -s /Applications/Inkscape.app/Contents/MacOS/inkscape \
      /usr/local/bin/inkscape

nbconvert の日本語対応

こちらの記事に まとまっている。 テンプレートファイル index.tex.j2 というファイルを見つけて
\documentclass[11pt]{article}
となっているところを、
\documentclass[xelatex,ja=standard]{bxjsarticle}
と直せばいいのだけど、このindex.tex.j2がどこにあるのかわからない。 こちらにあるように、
$ jupyter nbconvert --to pdf    filename.ipynb --debug
のようにdebugオプションをつけると、templateを探しに行くパスが表示されるのでそこを見ていけばいい。のだが、めちゃめちゃ数が多くてたいへんだった。

2023年1月5日木曜日

jupyter nbconvert でセルの出力を抑制

jupyter のノートブックからHTMLやPDFを nbconvert で生成することができる。 しかし、多くの場合はすべてのセルを表示したいわけではないので、セル単位で 出力を抑制する必要がある。これにはいくつか方法がある nbconvert には preprocessor という概念がある。 この内の、TagRemovePreprocessorを使うと、特定のタグがついたセルの出力を抑制できる。そもそも「タグ」というのは何なのか知らなかったのだけど、セルごとに任意の属性を付加する事ができる仕掛けで、普通のJupyter notebookでもできるし、vscodeでもつけることができる。ただし結構使いづらい。 これを使うと、
jupyter nbconvert --to html --TagRemovePreprocessor.remove_input_tags='{"hide"}' test.ipynb
のようにして、入力セルだけを抑制できる。ここで hide としているのは任意のタグなので、適当に変更することができる。なんで波括弧が要るのか、よくわからない。 remove_input_tags を remove_cell_tags 、 remove_output_tags にすると、それぞれ入出力両方、出力セルのみの出力を抑制できる。

タグは柔軟で素晴らしいのだけど、タグを付けるのが結構面倒だし、ついているのかエディタ上で目視で確認する事ができない。 RegexRemovePreprocessor というものがあり、これはセルの内容に対して、正規表現で検索を行って、マッチしたら出力を抑制してくれる。

jupyter nbconvert --RegexRemovePreprocessor.patterns="['^# hide']" test.ipynb
素晴らしい、がこれはまるごと抑制してしまうので、入力だけ抑制することはできない。 ソースコードはsite-packages/nbconvert/preprocessors にあるのだけど、 全く対応していない。ほんのちょっといじればできそうなんだけどなあ。。 ということで、やってみたらできたので、 こちらにまとめた。

2022年12月30日金曜日

backquote でIME OFF

MDなどでは、backquoteで等幅フォントを出すので、IMEが切れてくれるとありがたい、ということで設定。私はcmd-spaceでIMEのON/OFFをしているので、それを出している。デフォルトだとctl-spaceだとおもう。
  • .config/karabinar/assets/complex_modifications/xxxx.json に下記を登録
    {
      "title": "for vscode md",
      "rules": [
        {
          "description": "turn off IME with backslash",
          "manipulators": [
            {
              "type": "basic",
              "from": {
                "key_code": "grave_accent_and_tilde"
              },
              "to": [
                {
                  "key_code": "spacebar",
                  "modifiers": [
                    "command"
                  ]
                },
                {
                  "key_code": "grave_accent_and_tilde"
                }
              ],
              "conditions": [
                {
                  "type": "input_source_if",
                  "input_sources": [
                    {
                      "language": "ja"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
    
  • karabinar-element のcomplex modificationで選択してインストール

2022年12月14日水曜日

vscode でawsome emacsを入れたら cmd-c でコピーできなくなる問題

なんか知らんが、title-case というキャピタライズするコマンドにマップされている。 コピーしようとすると微妙にキャピタライズされていてコンパイル通らなくなったりして 発狂しそうなので、対策 keyboard shortcut でMCX-Emacs: MCX-Emacs: Transform to title case の cmd-C の欄を削除すればいい。 自動的に上書きが消えるのか、デフォルトのコピー動作が復活するようだ。

2022年12月6日火曜日

matplotlibで適当なプロットを書く

  • tick_params で軸上の値を消す
  • PathPatch で線を引く
  • text で任意の場所に字を書く
    # モデルの複雑さと精度
    import matplotlib.pyplot as plt
    from matplotlib.path import Path
    import matplotlib.patches as patches
    
    plt.rcParams["font.family"] = "Hiragino Sans"
    plt.rcParams["font.size"] = 24
    
    train = [ (0., 0.),  (0.2, 1.),  (0.8, 1.0),  (1, 1.0),]
    test = [ (0., 0.),  (0.2, 0.95),  (0.8, 0.8),  (1, 0.5),]
    codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, ]
    
    fig, ax = plt.subplots()
    fig.set_size_inches(12, 8, forward=True)
    
    ax.add_patch(patches.PathPatch(Path(train, codes), facecolor='none', lw=3, edgecolor="red"))
    ax.add_patch(patches.PathPatch(Path(test,  codes), facecolor='none', lw=3, edgecolor="blue", ls="--"))
    
    ax.set_ylabel("精度")
    ax.set_xlabel("小 <---- モデルの複雑度 ----> 大")
    ax.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False) 
    ax.tick_params(axis='y', which='both', left=False, right=False, labelleft=False) 
    ax.set_xlim(-0.05, 1.05)
    ax.set_ylim(-0.05, 1.05)
    ax.text(0.4, 0.9, '訓練')
    ax.text(0.7, 0.6, 'テスト')
    None
    
  • 2022年12月5日月曜日

    matplotlibで日本語フォント

    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    fp = FontProperties(fname=r'/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc', size=16)
    
    plt.plot([1], [2], '^')
    plt.xlabel("test日本語", fontproperties=fp)
    
    とかやればいいようだ。 jupyter notebookでもいける。 フォントのパスを設定しなければならないのが面倒だが、
    from matplotlib.font_manager import findfont
    
    fp = FontProperties(fname=findfont('Osaka'), size=16)
    
    のようにすることもできるようだ。ただ、うまく見つけてくれない場合もあるようで、 よくわからない。Osakaは見つかるがヒラギノはこの方法だとうまく行かない。わからん。。
    fp = FontProperties(fname=findfont('Hiragino Sans'), size=16)
    
    でヒラギノ角ゴシックはいけるが、ヒラギノ丸ゴシックはうまく設定できなかった。なにがちがうのか。。

    逐一設定しなければならないのは面倒。 デフォルトのfontproperties を設定する方法はないのだろうか。 こちらによれば、下のようにすればいちいち設定しなくて済む。 しかし、ラベル以外に日本語フォントを使うのはあんまり良くないかもしれない。見栄えが悪い。

    plt.rcParams["font.family"] = "Hiragino Sans"
    plt.rcParams["font.size"] = 16
    
    plt.plot([1], [2], '^')
    plt.xlabel("test日本語")
    plt.ylabel("test日本語")  
    

    2022年9月2日金曜日

    M1 macbook Air でPytorch

    M1 chip内臓のGPUを使ってニューラルネットをアクセラレートするものが使えるようになったということで、 こちらの記事 のとおりに、インストールしてプログラムもダウンロードして実行。

    pyenv で普通に導入したpython 3.10だとlzmaが足りないということでエラーがでる。 ので、anacondaを導入してそちらを使ったらあっさり動いた。すばらしい。

    MPSを使うとこんなかんじ。

    Epoch 1 / 5: time = 95.05[s], loss = 170.33
    Epoch 2 / 5: time = 183.52[s], loss = 138.28
    Epoch 3 / 5: time = 270.67[s], loss = 124.85
    Epoch 4 / 5: time = 356.84[s], loss = 114.28
    Epoch 5 / 5: time = 458.32[s], loss = 106.25
    Train time on mps: 458.32[s] (Train loss = 106.25)
    
    Test time on mps: 52.92[s](Test loss = 21.62)
    
    CPUだとこんなかんじ。
    Epoch 1 / 5: time = 446.72[s], loss = 169.79
    Epoch 2 / 5: time = 899.81[s], loss = 136.01
    Epoch 3 / 5: time = 1379.53[s], loss = 122.38
    Epoch 4 / 5: time = 1818.74[s], loss = 112.07
    Epoch 5 / 5: time = 2305.36[s], loss = 105.47
    Train time on cpu: 2305.36[s] (Train loss = 105.47)
    
    Test time on cpu: 102.65[s](Test loss = 20.72)
    
    元記事とCPU性能は変わらないけどMPS性能は半分ぐらい、というかんじか。 元記事はMacbook ProでM1 MAX、こちらは Air なのでこんなものだろう。 CPUとMPSの差はざっくり5倍という程度。テストには使えそうなのでうれしい。

    しかし、負荷かけるとコア温度が76度ぐらいまでいくな。M1 Airではみたこともないような値。 ファンついてないんだけど大丈夫なんだろうか。

    2022年8月26日金曜日

    linux で sleep が失敗する

    同じラップトップでLinuxでも同じ症状だったので、こちらも対応。

    やはりsleep直後にwakeupしているようだ。 こことか こことか ここを 参考にいろいろ試してみた。

    > cat /sys/bus/usb/devices/*/power/wakeup
    
    とやったところ1−2がenableになっていることを発見。 これを強制的にdisableに書き換えたところ、安定してsleepするようになったようだ。 めでたい。

    ただ、電源ボタンがどうもIME ON/OFFに割り当てられているっぽいんだよな。そんなことできるの?

    windows でsleepが失敗する

     Windowsのノートでいつからかsleepがうまく行かなくなっていた。厳密にはsleepすると同時にsleepが解除されて起きてしまう、という症状。

    いろいろ調べてみた結果、どうもタッチパッドやキーボードからの入力を拾ってsleepが解除されていたようだ。デバイスマネージャのタッチパッドとキーボードのペインの「電源管理」タブで「このデバイスでスリープを解除する」を無効にしたら治ったようだ。