さくらの VPS を契約したので、ブログを移転して独自ドメインで運用することにしました。
新 URL は http://blog.4shs.org/ です。お手数ですがブックマーク等の変更をお願いします。
GitHub を使ったブログは結構快適でした。Tinkerer と GitHub ではじめる Sphinx blog は今でもオススメです。
さくらの VPS は国内サーバだけあってネットワーク遅延が少なく、ページの読み込みは早いですね。でも体感だと大差ないかもしれません。
さくらの VPS を契約してからこのブログを構築するまでの過程を、近いうちに記事にしたいと思います。
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)
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 では 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 を実現できます。
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 に変えたな〜、というのが発端。 |
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 でブログができるようになりました。