Oct 31, 2009
ubuntu に couchdb の trunk をインストール
couchdb をインストールした。
- erlang のインストール
sudo apt-get install erlang
- 依存パッケージ類のインストール
sudo apt-get install gcc libtool automakehelp2man libicu38 libicu-dev libmozjs-dev spidermonkey-bin libcurl4-gnutls-dev
- couchdb の最新版をチェックアウト
svn co http://svn.apache.org/repos/asf/couchdb/trunk couchdb
- couchdb の build とインストール
cd couchdb ./bootstrap ./configure make && sudo make install
- /etc/init.d/ に couchdb のシンボリックリンクをはっておく
sudo ln -s /usr/local/etc/init.d/couchdb /etc/init.d/
- couchdb 系のスクリプトの所有者を couchdb にする
/usr/local/var$ sudo chown -R couchdb /usr/local/var
- couchdb の起動
sudo /etc/init.d/couchdb start
- curl 経由でアクセスを確認してみる
curl http://localhost:5984/
-
{"couchdb":"Welcome","version":"0.11.0b"}と表示されます。
追記: @voluntas 先生より Ubuntu 9.10 なら couchdb 0.10.0 が aptitude で入るよ。 とのことです。ありがとうございました。絶対にこっちが楽ですw
Oct 27, 2009
RTM.vim
PySpa#6 で RTM (Remember The Milk) を vim から操作するためのプラグイン RTM.vim を作成しました。個人的に欲しかったものだったので、3 日間をフル活用させていただきました。RTM でタスク管理している (今から利用される方も) vim 使いの方はぜひ使ってみてください。
インストール
- cURL (SSL は必須ではありません) のインストールと PATH の追加
ダウンロード URL: http://curl.haxx.se/download.html
※ Windows ユーザは curl.exe を vim.exe と同ディレクトリーにいれるか、PATH を追加 - md5.vim (created by Yukihiro Nakadaira) のインストールと plugins への追加
ダウンロード URL: http://www.vim.org/scripts/script.php?script_id=2806 - Remember The Milk API Key の取得
取得 URL: http://www.rememberthemilk.com/services/api/keys.rtm
※ Non-commercial use (非商用利用) で利用可能 - .vimrc へ取得した API Key などをセット
-
- rtm_api_key: 取得した api_key
let rtm_api_key='YOURAPIKEY' - rtm_shared_secret: 取得した shared secret
let rtm_shared_secret='YOURSHAREDSECRET'
- rtm_api_key: 取得した api_key
- RTM.vim のインストールと plugins への追加
ダウンロード URL: http://bitbucket.org/Surgo/rtm.vim/src/
※ "get source" リンクからダウンロード可能 - API 経由でのアクセスをアクティベート
vim を起動し、以下のコマンドを実行し、アクティベート用の URL を取得:RTM -a
取得した URL にアクセス・ログインし、承認 (vim は起動したまま) - Token を取得し、 .vimrc ファイルへセット
以下のコマンドを実行し、Token を取得:RTM -t
.vimrc へ取得した token をセットlet rtm_token='YOURTOKEN'
利用方法
- タスク追加用インタプリタの起動
:RTM
動作: "New Task" というメッセージに続き、タスクを入力、確定する - カレント行をタスクに追加
:C[RTM] -a
動作: コメントを除くカレント行をタスクとして登録
※ 今後、タスクの完了、編集などの機能を実装するため、カレント行の末尾に 'RTM-0000-0000-0000' 形式の ID が付与されます - カレントバッファーをタスクに追加
:B[RTM] -a
動作: コメントを除くカレントバッファーをタスクとして追加 (改行は空白へ置換)
注意事項
- 思いっきり Beta 以前の段階 (二重投稿バグあり・・・) で Tweet してしまい申し訳ありません
- 実用性を (私なりに) 考え、コマンド当も変更しました
- キーマップは現在のところつけていません (私があまりマップしないもので・・・後回し)
- vim プラグイン初心者なのでバグ万歳の可能性がありますので、メール (script に記載)、Issue、@Surgo まで教えてください
- 英語苦手なので、メッセージ系間違ってるかも
TODO
- タスクの完了、変更機能の追加
- "TODO .*" 行すべてをタスクへ登録機能の追加
- スマートアッドへの対応 (UI 試行中)
- キーマップの追加
- その他、要望があった機能
Oct 20, 2009
pyqt4 の widget に マウスなイベントハンドラを追加する
qt では QLineEdit などの QWidget に デフォルトではマウスなイベントハンドラがないらしい。なので、clicked, pressed, released などを connect しても無反応です。もし、デフォルトの QWidget にマウスなイベントハンドラーを追加したい場合は、本家 ML に Widget のサブクラスを作ってフックしろとあった。
from PyQt4 import QtCore, QtGui
class QLineEdit(QtGui.QLineEdit):
def __init__(self, parent=None):
QtGui.QLineEdit.__init__(self, parent)
def mousePressEvent(self, event):
self.emit(QtCore.SIGNAL("pressed()"))
def mouseReleaseEvent(self, event):
self.emit(QtCore.SIGNAL("clicked()"))
self.emit(QtCore.SIGNAL("released()"))
乱暴ですが、上記のコードでデフォルトのイベントをハンドリングできます。 clicked については Press と Release を両方フックする必要があると書いてありましたけど、いつどこで押されて、何秒以内に離されたかとか厳密に制御されたい型は実装しちゃってください(笑
他にも Qt では、デフォルトのイベントで渡ってくる情報が少なかったりするので、サブクラスでフックしちゃってます。
Oct 9, 2009
PyQt4 の qtdemo を PyInstaller で実行ファイル形式にする
- vcredist のインストール (インストーラー)
"C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_*" 配下に "msvcm90.dll", "msvcp90.dll", "msvcr90.dll" という dll が作成されている (フォルダが複数ある場合は最新のやつ) を、python path に複製する。 - pywin32 のインストール (インストーラー)
- PyQt4 のインストール (インストーラー)
- PyInstaller のインストール
これは svn から trunk をチェックアウトし、PATH に追加する
svn co http://svn.pyinstaller.org/trunk/ pyinstaller-trunk - PyInstaller の設定
python Configure.py
- さくっと demo を実行ファイル形式にしてみる (なんでもいい)
cd \path\to\qtdemo\richtext\textobject Makespec.py -F -K -w textobject.pyw Build.py textobject.spec
実行するとメッセージがダーっと流れて、exe ファイルができる
... ... Appending archive to EXE C:\path\to\qtdemo\richtext\textobject\dist\textobject.exe
実行できるよ (textobject を実行するときは files ディレクトリを作成された exe がある dist ディレクトリ配下に複製してください)
Oct 6, 2009
ubuntu で nginx から memcache を利用する
- memcached, python-memcache のインストールと起動
sudo apt-get install memcached python-memcache sudo /etc/init.d/memcached start
初期設定だと 11211 番ポートで起動しています。変えたい場合は /etc/memcached.conf で。
- memcached とお話してみる (telnet 編)
まずは telnet 経由でお話してみる。プロトコルについては official wiki を見ればいいと思います。
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
'foo' という key で フラグ 0、無期限 (0)、 3 byte のデータ 'bar' を格納
set foo 0 0 3 bar STORED
'foo' という key の value を取得する
get foo VALUE foo 0 3
memcached の情報を見てみる
stats items STAT items:1:number 4 STAT items:1:age 56560
- memcached とお話してみる (python-memcache 編)
上記の一連の流れを python-memcache でやってみる。
>>> import memcache >>> cache = memcache.Client(['127.0.0.1:11211']) >>> dir(cache) >>> cache.flush_all() # いったんクリアしといた >>> cache.set('foo', 'bar') True >>> cache.get('foo') 'bar' >>> - nginx に memcached を設定する
nginx は、まず memcache 内を url を key とした value を探しに行く。ない場合にのみ、アプリケーションサーバに問い合わせる。なので、アプリケーション側では、url を key にしたコンテンツを value として set する必要がある。その辺はまた後日。
まずは、nginx の conf から。前提条件として、nginx はロードバランサーとして利用することにします。今回はテストのために、 django の開発用サーバを 自マシーン内に 2 インスタンス起動ししました。# LBする apps サーバ郡だよ upstream apps { server 127.0.0.1:8081; # python test1/manage.py runserver 0.0.0.0:8081 server 127.0.0.1:8082; # python test2/manage.py runserver 0.0.0.0:8082 } server { listen 80; server_name localhost; # 静的コンテンツは nginx が返すよ location /media { root /var/www/nginx-default; access_log off; expires 30d; } # http://127.0.0.1/* の処理 location / { # POST リクエストだったら memcached 見ないで、そのまんま LB しちゃうよ if ($request_method = POST) { proxy_pass http://apps; break; } # POST 以外だったら (GET リクエストだったら) memcached に uri を key にコンテンツを探しに行くよ set $memcached_key "$uri"; memcached_pass 127.0.0.1:11211; default_type "text/html; charset=utf-8"; # memcached になかったら (memcached が 404 だったら /_apps を経由して LB しちゃうよ # error_page で LB してるってのがおもしろいな error_page 404 502 = /_apps$uri; } location /_apps { proxy_pass http://apps; # http://127.0.0.1/_apps へのアクセスはロードバランスする } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/nginx-default; } access_log /var/log/nginx/localhost.access.log; }sudo /etc/init.d/nginx restart
この状態で http://127.0.0.1/ を参照すると、 test1, test2 が交互に切り替わるページが表示される。
- nginx から memcached が呼ばれるかテスト
この状態だと、url を key にした value がないので、ただの LB です。テスト的に、memcached になんか入れて 表示してみる。
>>> import memcache >>> cache = memcache.Client(['127.0.0.1:11211']) >>> cache.flush_all() >>> cache.set('/foo', 'bar') True >>>'/foo' という key で 'bar' を追加してみた。これで http://127.0.0.1/foo にアクセスすると "bar" と表示されますよ。nginx lb いいですよ!
Oct 5, 2009
ubuntu への nginx のインストールと load balancer としての利用
- nginx のインストール
aptitude で リポジトリからインストールしてみる。
sudo aptitude install nginx sudo /etc/init.d/nginx start
- nginx の初期設定
ubuntu では、(apache 同様) サイト毎の conf がモジュール化されており、default のモジュールは /etc/nginx/sites-enabled/default となっている。
sudo vi /etc/nginx/sites-enabled/default
私は apache2 同様、 ./sites-available/* にモジュール化したサイトの conf をつっこんでおき、 ./sites-enabled/* 内にシンボリックリンクを作成するようにしています。 nginx では、いまのところ apache2 のように a2emod などのコマンドがないため、自作しておくと便利かも(指定されたモジュールのシンボリックリンクをはるだけだけど・・・)。
- ロードバランサの設定
テストとして、google のホストをロードバランスしてみる。ubuntu の nginx.conf は ./conf.d/* を include するため、 conf.d 内に loadbalance.conf を作成する。
sudo vi /etc/nginx/conf.d/loadbalance.conf
以下のように書いてみる。
upstream httpdcluster { server www.google.com:80; server www.google.co.jp:80; server www.google.co.uk:80; } server { listen 8080; server_name localhost; location / { proxy_pass http://httpdcluster; } }例では、 httpdcluster と命名したサーバー郡をロードバランシングする。 これにより、 8080 番の /* を httpdcluster 郡に振り分けることができる。
http://localhost:8080/search?q=python などにアクセスし、更新を押し続けると、ロードバランスされます (全部表示が同じだけど、されてるはずw)。