2019年4月22日月曜日

docker exec ctrl-p 二度押し問題

dockerでlinuxのテスト環境を作成したのだけど、どうもshellのctrl-pの動作がおかしい。 ぐぐってみたら おなじことに ハマっているひとを見つけた。
問題は、ctrl-pがデタッチのキーシーケンスのプリフィックスだかららしい。なので、 .docker/config.json に、
  "Detachkeys": "ctrl-[,q"
を追加すると解決。すばらしい。

2019年4月14日日曜日

vscodeでtabをctrl-Iで入力する

vscodeでなぜかctrl-I がtabにならないので。 keybindings.jsonに記述。しかし、なんでUIでできないの??別にいいけど。
[
    {
        "key": "ctrl-I",
        "command": "tab",
        "when": "editorTextFocus && !editorReadonly && !editorTabMovesFocus"
    },
]

vscodeで line space調整

vscodeではfontサイズは設定のUIで変えられるが、行間が調整できない。 Settingsを開いて右上の"{}"アイコンをクリックするとJSONで直接編集できるようになる。
"editor.lineHeight": 15,
を追記すれば良い。 便利。

Siera以降でkeyrepeatをより小さく

Mac OS Siera以降で標準UIよりもキーリピートを小さくする。以前はKarabinerでできていたのだけど、できなくなったとのこと。 こちら より。
defaults write -g InitialKeyRepeat -int 10 # normal minimum is 15 (225 ms)
defaults write -g KeyRepeat -int 1 # normal minimum is 2 (30 ms)
要再起動。面倒。。

2019年3月20日水曜日

pycairo で テキスト画像作成

CairoというライブラリのPython バインドでテキストの画像を作る。 サンプルが少なくてわかりにくかった。。 テキストの描画時のサイズをScaledFontを用いてextentsとしてうけとり、 それを使って位置決めしている。
> python test.py TEXT FONTSIZE
のように使う。
import cairo
import sys

WIDTH, HEIGHT = 256, 64
text = sys.argv[1]
fontsize = int(sys.argv[2])

surface = cairo.ImageSurface(cairo.FORMAT_RGB24, WIDTH, HEIGHT)
ctx = cairo.Context(surface)

ctx.set_source_rgb(1, 1, 1)  # White
ctx.rectangle(0, 0, WIDTH, HEIGHT) # clear background
ctx.fill()

ctx.set_source_rgb(0,0,0) # Black 
ctx.set_font_size(fontsize)

sf = ctx.get_scaled_font()
extents = sf.text_extents(text)
ctx.move_to(WIDTH / 2 - extents.width /2, HEIGHT /2 + extents.height / 2)
ctx.show_text(text)

surface.write_to_png("example.png")

2019年3月1日金曜日

django のテンプレートだけ使う

文献リストのHTML生成を以前からdjangoのテンプレートだけ使ってでやっていたのだけど、 Python2 系から 3系にあげて、djangoのバージョンを上げたら動かなくなってしまったので、 再調査して実現。こういうのを技術的負債というのだろう。

普通djangoはWebフレームワークとして初期化されるのだけど、 テンプレートエンジンだけ使おうとすると、本来通るべき初期化の部分を通らないので、 いろいろ自前でやらなければならない、ということ。

基本的には、

  • 設定ファイルをpythonコードとして書き
  • それを環境変数 DJANGO_SETTING_MODULE に指定してpythonを起動
すればいい。

設定ファイルはこんな感じ。SECRET_KEYは適当に設定しないと文句を言われる。。

import django
SECRET_KEY = '01234567890123456789012345678901234567890123456789'
django.setup()

DEBUG = True

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
    },
]

2018年12月19日水曜日

pythonで__getattr__を定義したオブジェクトのpickle

Pythonでは__getattr__を定義すると属性が定義できる。が、これを定義すると、pickleしたときに、__getstate__が呼ばれてkeyerror で落ちる。よくわからないが、こんなふうにしたら落ちなくなった。正しい回避方法はわからない。。
import pickle

class conf(object):
    def __init__(self, dic):
        self._dic = dic
    def __getattr__(self, key):
        return self._dic[key]
    def __str__(self):
        return self._dic.__str__()
    def __getstate__(self):
        return pickle.dumps(self._dic)
    def __setstate__(self, d):
        self._dic = pickle.loads(d)


if __name__ == "__main__":

    c = conf({'a':1})
    d = pickle.loads(pickle.dumps(c))

    print(c.a)
    print(d.a)