log.randomly

技術的なあれこれ

独自ドメインに移転しました

さくらの VPS を契約したので、ブログを移転して独自ドメインで運用することにしました。

新 URL は http://blog.4shs.org/ です。お手数ですがブックマーク等の変更をお願いします。

GitHub を使ったブログは結構快適でした。Tinkerer と GitHub ではじめる Sphinx blog は今でもオススメです。

さくらの VPS は国内サーバだけあってネットワーク遅延が少なく、ページの読み込みは早いですね。でも体感だと大差ないかもしれません。

さくらの VPS を契約してからこのブログを構築するまでの過程を、近いうちに記事にしたいと思います。

pyfluent 0.2.0 をリリースしました

fluentd に python からアクセスする pyfluent を作成しています。このたび 0.2.0 をリリースしましたので、簡単に紹介したいと思います。

ソースコードは github にあります。まだまだ完成には遠いので、API が将来のバージョンで変わるかもしれないのはご了承ください。

インストール

pip でインストールしています。python 2.5 - 3.2 に対応しています。

$ pip install pyfluent

クライアントになる

python から fluentd へのメッセージの送信は非常に簡単です。

from pyfluent.client import FluentSender
fluent = FluentSender()
fluent.send('Hello pyfluent!')

デフォルトで localhost:24224 に接続に行きます。また、tag は空文字です。これらの挙動は初期化時に引数を与えることで変更できます。

fluent = FluentSender('fluent.example.com', 10000, 'pyfluent')
fluent.send('Hello pyfluent!')

send に文字列を渡すと、送信前に message をキーにした dict を自動的に作成します。dict を直接渡すことも可能です。

fluent.send({'hello': 'fluent'})

また、送信する時に tag や timestamp を変更することもできます。

import time
fluent.send({'hello': 'fluent'}, 'pyfluent.info', time.time() - 60)

logging handler として使う

python の logging モジュールと一緒に使える logging handler も提供しています。以下のようにセットアップします。

import logging
from pyfluent.logging import SafeFluentHandler
handler = SafeFluentHandler('localhost', 24224, 'pyfluent')
handler.setLevel(logging.INFO)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(handler)

後は普通に使うだけです。

logger.info('hello pyfluent!')

SafeFluentHandler の引数は省略することができ、その場合は FluentSender と同じになります。

また、簡単に情報を集められるように FluentFormatter を提供しています。これを使うと、LogRecord のほとんどの情報を自動的に送信できます。

from pyfluent.logging import FluentFormatter
formatter = FluentFormatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.info('get more information')

FluentFormatter は LogRecord から FluentFormatter.exclude で指定されたものを除外し、それ以外を送信します。この list を変更することで、含める情報を変更できます。

formatter.exclude += ['threadName', 'module', 'filename', 'process',
'processName', 'pathname', 'lineno', 'funcName']
logger.info('suppress unnecessary information')

pyfluent を使えば、python から簡単に fluentd にメッセージを投げることができます。是非試してみてください。

Homebrew 0.9 で複数バージョンの python をインストール

homebrew 0.9 では formula リポジトリを追加できるようになったようです。これに伴い LibraryAlt から versions が削除されたので、これからは新しいやり方でインストールする必要があります。

最初に homebrew/versions リポジトリが使えるようにします。

$ brew tap homebrew/versions

あとはいつも通りにインストールできます。

$ brew install python25 python26 python31

homebrew では複数バージョンの python を同時にアクティブにすることはできません。unlink した後、手動で symlink を作成します。

$ brew unlink python25
$ brew unlink python26
$ brew unlink python31
$ ln -s /usr/local/Cellar/python25/*/bin/python /usr/local/bin/python2.5
$ ln -s /usr/local/Cellar/python26/*/bin/python /usr/local/bin/python2.6
$ ln -s /usr/local/Cellar/python31/*/bin/python3 /usr/local/bin/python3.1

旧バージョンをインストールしたことでリンクが破壊された可能性があるので、張り直しておきます。

$ brew unlink python
$ brew link python
$ brew unlink python3
$ brew link python3

これで複数バージョンのインストールが完了しました。

余談ですが、python 3.0 は formula が提供されていないので、自作したものを gist にあげておきました。以下のコマンドでインストールできますが、python 3.0 をサポートする必要はないでしょう。

$ brew install https://gist.github.com/raw/1930137/65bfbd8663cc15cd804166dc4246407afdad4857/python30.rb

SEIL のポリシールーティング機能で Source Routing をする

SEIL のポリシールーティング機能は、様々な条件を元にパケットを転送する機能です。この機能を使うと Source Routing を実現できます。

src addr が pppoe1 に割り当てられた IP アドレスの時は pppoe1 からパケットを転送するのは以下の設定を入れます。

filter add route0 action forward pppoe1 direction out src pppoe1

この設定を入れると、pppoe1 に来た SEIL 宛ての通信は pppoe1 から応答するようになります。2 つの ISP 契約をしていて default gateway が pppoe0 に向いているときでも、往復の経路を一致させることができます。

pppoe0 の ISP が Source Address Validation をやっていて、pppoe1 の IP アドレスと通信ができない時に入れるといいでしょう。[1]

脚注

[1]pppoe1 と L2TP/IPSec が張れなくなって原因がわからなかったんだけど、そういえば pppoe0 の ISP を nifty から emobile に変えたな〜、というのが発端。

Tinkerer と GitHub ではじめる Sphinx blog

sphinx を使い始めてブログも sphinx で書けたらいいのになと思っていたところに tinkerer がリリースされました。このブログも tinkerer で作成されています。

今回は tinkerer でブログを作成して github で公開する方法を紹介します。

参考: Tinkererを使ってbitbucketでblogはじめました - そこはかとなく書くよ。

セットアップ

インストールはいつものように pip で。

$ pip install tinkerer

Note

0.2.1b 以下のバージョンは日本語を扱えないので新しいバージョンを入れましょう。pull request を出したら採用してもらえました :)

ブログを書くためのディレクトリを作成して、環境を作ります。

$ mkdir -p ~/blog/sources
$ cd ~/blog/sources
$ tinker --setup

conf.py という設定ファイルの雛形が作成されるので、適宜変更してやります。日本語は u'' を使って unicode で書かないとビルドできないので注意しましょう。

project = u'<ブログ名>'
tagline = u'<サブタイトル>'
author = u'<名前>'
copyright = u'2012, ' + author
website = u'http://<account>.github.com/blog/'

ブログを書く

それでは実際にブログエントリを作成しましょう。

以下のコマンドを実行して新しいエントリを追加します。

$ tinker -p 'first post'
New post created as '/Users/.../blog/2012/02/21/first_post.rst'

-p オプションにはタイトルを指定しますが、日本語を入れると嬉しくないことが起きます。この名前がそのまま url になるのでファイル名を入れるイメージがちょうどいいです。

作成されたファイルのパスが表示されるので、これをエディタで開いて編集しましょう。

$ vim 2012/02/21/first_post.rst

編集したらビルドして確認しましょう。

$ tinker -b
$ open index.html

公開する

blog を静的に作成できるようになったので後は github で公開するだけです。

github で公開するに当たって、ソースごと全て公開するか生成後の HTML だけ公開するかを選択する必要があります。今回は、生成後の HTML だけ公開することにします。

tinkerer はビルド時に出力先を削除して作り直すため、blog/html に git リポジトリを作成しても意味がありません。そのため、公開用のリポジトリを別に作成し、そこにコピーするようにします。

ブラウザで github にアクセスして blog リポジトリを作成してください。

公開用の git リポジトリを作成します。

$ mkdir ~/blog/publish
$ cd ~/blog/publish
$ git init
$ git checkout -b gh-pages
$ git remote add origin git@github.com:<account>/blog.git

標準では Jekyll サポートのため _ (underscore) から始まるディレクトリを使用できません。このままだと困るので Jekyll サポートを無効化するためのファイルを作成します。

$ touch .nojekyll

ビルド済みの html をコピーします。

$ rsync -av ~/blog/sources/blog/html/ .

追加、コミットし、github にプッシュします。

$ git add .
$ git commit -m 'first post'
$ git push -u origin gh-pages

反映されるまで 10 分程かかるようなので、しばらくしてから確認しましょう。

これで http://<account>.github.com/blog/ という url でブログができるようになりました。

追記

2012/04/14
公開用リポジトリで使用するブランチを master から gh-pages に変更しました。

移転しました

今まではてなダイアリーでやっていましたが、いつまでたってもはてな記法を覚えられないのと、細かい不満があったので移転しました。

いろいろ公開していければなーと思っていますので、よろしくお願いします。