ubuntu に couchdb の trunk をインストール

couchdb をインストールした。

  1. erlang のインストール
    sudo apt-get install erlang
    
  2. 依存パッケージ類のインストール
    sudo apt-get install gcc libtool automakehelp2man libicu38 libicu-dev libmozjs-dev spidermonkey-bin libcurl4-gnutls-dev
    
  3. couchdb の最新版をチェックアウト
    svn co http://svn.apache.org/repos/asf/couchdb/trunk couchdb
    
  4. couchdb の build とインストール
    cd couchdb
    ./bootstrap
    ./configure
    make && sudo make install
    
  5. /etc/init.d/ に couchdb のシンボリックリンクをはっておく
    sudo ln -s /usr/local/etc/init.d/couchdb /etc/init.d/
    
  6. couchdb 系のスクリプトの所有者を couchdb にする
    /usr/local/var$ sudo chown -R couchdb /usr/local/var
    
  7. couchdb の起動
    sudo /etc/init.d/couchdb start
    
  8. curl 経由でアクセスを確認してみる
    curl http://localhost:5984/
    
  9. {"couchdb":"Welcome","version":"0.11.0b"}
    
    と表示されます。

追記: @voluntas 先生より Ubuntu 9.10 なら couchdb 0.10.0 が aptitude で入るよ。 とのことです。ありがとうございました。絶対にこっちが楽ですw

RTM.vim

PySpa#6 で RTM (Remember The Milk) を vim から操作するためのプラグイン RTM.vim を作成しました。個人的に欲しかったものだったので、3 日間をフル活用させていただきました。RTM でタスク管理している (今から利用される方も) vim 使いの方はぜひ使ってみてください。

インストール

  1. cURL (SSL は必須ではありません) のインストールと PATH の追加
    ダウンロード URL: http://curl.haxx.se/download.html
    ※ Windows ユーザは curl.exe を vim.exe と同ディレクトリーにいれるか、PATH を追加
  2. md5.vim (created by Yukihiro Nakadaira) のインストールと plugins への追加
    ダウンロード URL: http://www.vim.org/scripts/script.php?script_id=2806
  3. Remember The Milk API Key の取得
    取得 URL: http://www.rememberthemilk.com/services/api/keys.rtm
    ※ Non-commercial use (非商用利用) で利用可能
  4. .vimrc へ取得した API Key などをセット
    • rtm_api_key: 取得した api_key
      let rtm_api_key='YOURAPIKEY'
    • rtm_shared_secret: 取得した shared secret
      let rtm_shared_secret='YOURSHAREDSECRET'
  5. RTM.vim のインストールと plugins への追加
    ダウンロード URL: http://bitbucket.org/Surgo/rtm.vim/src/
    ※ "get source" リンクからダウンロード可能
  6. API 経由でのアクセスをアクティベート
    vim を起動し、以下のコマンドを実行し、アクティベート用の URL を取得
    :RTM -a
    取得した URL にアクセス・ログインし、承認 (vim は起動したまま)
  7. 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
    動作: コメントを除くカレントバッファーをタスクとして追加 (改行は空白へ置換)
※C[RTM] は他のコマンドと競合しないかぎり :C や :CR、:CRT、:CRTM で動作します。

注意事項

  • 思いっきり Beta 以前の段階 (二重投稿バグあり・・・) で Tweet してしまい申し訳ありません
  • 実用性を (私なりに) 考え、コマンド当も変更しました
  • キーマップは現在のところつけていません (私があまりマップしないもので・・・後回し)
  • vim プラグイン初心者なのでバグ万歳の可能性がありますので、メール (script に記載)、Issue@Surgo まで教えてください
  • 英語苦手なので、メッセージ系間違ってるかも

TODO

  • タスクの完了、変更機能の追加
  • "TODO .*" 行すべてをタスクへ登録機能の追加
  • スマートアッドへの対応 (UI 試行中)
  • キーマップの追加
  • その他、要望があった機能
最後に、pyspa 運営者の皆様ありがとうございました。参加者の皆様もお疲れ様でしたー!

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 では、デフォルトのイベントで渡ってくる情報が少なかったりするので、サブクラスでフックしちゃってます。

PyQt4 の qtdemo を PyInstaller で実行ファイル形式にする

  1. vcredist のインストール (インストーラー)
    "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_*" 配下に "msvcm90.dll", "msvcp90.dll", "msvcr90.dll" という dll が作成されている (フォルダが複数ある場合は最新のやつ) を、python path に複製する。
  2. pywin32 のインストール (インストーラー)
  3. PyQt4 のインストール (インストーラー)
  4. PyInstaller のインストール
    これは svn から trunk をチェックアウトし、PATH に追加する
    svn co http://svn.pyinstaller.org/trunk/ pyinstaller-trunk
  5. PyInstaller の設定
    python Configure.py
    
  6. さくっと 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 ディレクトリ配下に複製してください)

ubuntu で nginx から memcache を利用する

  1. memcached, python-memcache のインストールと起動
    sudo apt-get install memcached python-memcache
    sudo /etc/init.d/memcached start
    

    初期設定だと 11211 番ポートで起動しています。変えたい場合は /etc/memcached.conf で。

  2. 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
    
  3. 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'
    >>>
    
  4. 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 が交互に切り替わるページが表示される。

  5. 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 いいですよ!

ubuntu への nginx のインストールと load balancer としての利用

  1. nginx のインストール

    aptitude で リポジトリからインストールしてみる。

    sudo aptitude install nginx
    sudo /etc/init.d/nginx start
    
  2. 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 などのコマンドがないため、自作しておくと便利かも(指定されたモジュールのシンボリックリンクをはるだけだけど・・・)。

  3. ロードバランサの設定

    テストとして、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)。