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)

2018年8月16日木曜日

Emacs 25.3 をMac OSでビルド

Brewとかでインストールすると、日本語パッチがあたっていなくて厳しいので。 https://qiita.com/takaxp/items/e07bb286d80fa9dd8e05 の手順で。goolge IMEの場合はpatchが違うので注意。 大昔の感覚だと、emacsのビルドなんて一晩掛かりそうで嫌だったんだけど、 最近だと大して時間がかからなくてびっくりだ。

2017年12月28日木曜日

iptablesで通信量を測定

クラスタのノード間での通信量を測定するための仕掛けを探していたら、実はiptablesでできることが判明。 こちらのサイトが元ネタ。 要するに、各ノードごとにチェインを用意してやればよい。チェインごとの統計をiptablesで取得できる。 まずクリアしておいて、
sudo iptables -F
sudo iptables -X
対象ノードごとに下記のようにルールを設定する。
sudo iptables -N host
sudo iptables -A OUTPUT -j host
sudo iptables -A INPUT -i eth0 -j host
sudo iptables -A host -d 172.16.96.1/32
sudo iptables -A host -s 172.16.96.1/32
すると、下記のように通信量を取得できる。左端に出ているのがパケット数とバイト数。
> sudo iptables -v -n -L host
Chain host (2 references)
 pkts bytes target     prot opt in     out     source               destination         
   44  7068            all  --  *      *       0.0.0.0/0            172.16.96.1         
   74  5579            all  --  *      *       172.16.96.1          0.0.0.0/0   
これらのカウンタは下記でリセットできる。
 sudo iptables -Z
新しいものを入れる必要が無いので手軽といえば手軽だが、全部のノードに、ノード数分だけルール入れるの面倒くさい。。インターフェイスも2系統あったりするのでさらに。。

2017年10月5日木曜日

booktab


なんかtable を普通に使うとダサいのでbooktab というパッケージを使いましょう、ということに。
  • 縦の線は使わない
  • 横の線も一番上、下、ヘッダとの分離部分にしかつかわない。それぞれhlineではなく、
    \toprule \midrule \bottomrule を使う。
  • 行のまとまりを示す際には 線を入れずに \addlinespace とすればいよい。
  • \cline の代わりに\cmidrule{1-2} を用いる。
縦罫線の代わりに列間のスペースを調整する。
@{\hspace*{2mm}}
をlとかrとかの中に書く。


2017年8月16日水曜日

複数写真の切り出し

復数の写真を一気にスキャンしたものから、自動的に写真を切り出す方法を探していた。Photoshopならできるらしいが、手元にないので除外。
GIMPにスクリプトを入れてやるという方法 も試してみたがイマイチ上手くコントロールできない。

> multicrop -b white SRC.jpg Cropped.jpg
とかやると、Cropped001.jpg, Cropped002.jpg みたいにファイルを作ってくれる。-b で指定しているのは背景色。多分曲がっているのを直してくれたりはしないので、スキャンするときにある程度気を使う必要がある。
これで、手元の写真を整理できるかな。。