2011年4月10日日曜日

Mac でプレゼンするときに気をつけること

毎回あれやこれやと忘れるので、備忘録として。

  • VGAアダプタを忘れないこと
  • Growlを切っておくこと
  • LimeChatのNotifyを切っておくこと
  • デスクトップは片付けておくこと
  • Keynoteを使うのであれば、事前に接続してディスプレイ設定を確認すること
  • Terminal/iTerm で実演するのであれば、白背景/黒文字にしておくこと
  • シンタックスハイライトは切っておくこと

2011年4月3日日曜日

IRCクライアントの無用なnotifyをmecabで判別する

Twitter 環境として TIG + tiarra + LimeChat を使ってるわけですが、最近よくあるのが「リプライを使わずに名前を呼ぶ」ってパターン。

で、それに対応するために LimeChat や TIG の単語マッチ機能を使うわけですが、そうすると今度は不要な(意味的にマッチしない)ツイートまで拾ってくることが多々有ります。

そこで、 mecab で形態素解析することで精度を上げられないか?とのアイデアをいただきまして、ちょろっとだけ試してみました。

今回は「ともちゃん」と呼ばれてる友人のケースで試してみました。

例文は以下の二つ。
  • それともちゃんとやったほうがいいよ →マッチしてほしい
  • 福島第2は温度が4つともちゃんと出てるんだな。第1は温度が出てない。 →マッチしてほしくない
単純に mecab で解析してみるとこういう結果になります。
% mecab
それともちゃんとやったほうがいいよ
それとも 接続詞,*,*,*,*,*,それとも,ソレトモ,ソレトモ
ちゃんと 副詞,一般,*,*,*,*,ちゃんと,チャント,チャント
やっ 動詞,自立,*,*,五段・ラ行,連用タ接続,やる,ヤッ,ヤッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
ほう 名詞,非自立,一般,*,*,*,ほう,ホウ,ホー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
EOS
福島第2は温度が4つともちゃんと出てるんだな。第1は温度が出てない。
福島 名詞,固有名詞,地域,一般,*,*,福島,フクシマ,フクシマ
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
2 名詞,数,*,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
温度 名詞,一般,*,*,*,*,温度,オンド,オンド
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
4つ 名詞,一般,*,*,*,*,4つ,ヨッツ,ヨッツ
とも 助詞,副助詞,*,*,*,*,とも,トモ,トモ
ちゃんと 副詞,一般,*,*,*,*,ちゃんと,チャント,チャント
出 動詞,自立,*,*,一段,連用形,出る,デ,デ
てる 動詞,非自立,*,*,一段,基本形,てる,テル,テル
ん 名詞,非自立,一般,*,*,*,ん,ン,ン
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
な 助詞,終助詞,*,*,*,*,な,ナ,ナ
。 記号,句点,*,*,*,*,。,。,。
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
1 名詞,数,*,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
温度 名詞,一般,*,*,*,*,温度,オンド,オンド
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
出 動詞,自立,*,*,一段,連用形,出る,デ,デ
て 動詞,非自立,*,*,一段,未然形,てる,テ,テ
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
。 記号,句点,*,*,*,*,。,。,。
EOS
どちらも単語として「ともちゃん」は抽出できませんでした。 そこで、ユーザ辞書を作成してみます。 公式ページを参考に CSV ファイルを作成し、.dic ファイルを生成します。

% cat tomochan.csv
ともちゃん,1223,1223,0,名詞,固有名詞,人名,名,*,*,ともちゃん,トモチャン,トモチャン
% /opt/local/libexec/mecab/mecab-dict-index -d/opt/local/lib/mecab/dic/ipadic -u tomochan.dic -f utf-8 -t utf-8 tomochan.csv

作成したユーザ辞書を使用する設定を mecabrc に記述します。

% cat /opt/local/etc/mecabrc     
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  /opt/local/lib/mecab/dic/ipadic

; userdic = /home/foo/bar/user.dic
; 以下の行を追加
userdic = /Users/yono/tomochan.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

もう一度 mecab で解析してみます。
% mecab
それともちゃんとやったほうがいいよ
それとも 接続詞,*,*,*,*,*,それとも,ソレトモ,ソレトモ
ちゃんと 副詞,一般,*,*,*,*,ちゃんと,チャント,チャント
やっ 動詞,自立,*,*,五段・ラ行,連用タ接続,やる,ヤッ,ヤッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
ほう 名詞,非自立,一般,*,*,*,ほう,ホウ,ホー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
いい 形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
EOS
福島第2は温度が4つともちゃんと出てるんだな。第1は温度が出てない。
福島 名詞,固有名詞,地域,一般,*,*,福島,フクシマ,フクシマ
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
2 名詞,数,*,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
温度 名詞,一般,*,*,*,*,温度,オンド,オンド
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
4つ 名詞,一般,*,*,*,*,4つ,ヨッツ,ヨッツ
ともちゃん 名詞,固有名詞,人名,名,*,*,ともちゃん,トモチャン,トモチャン
と 助詞,格助詞,引用,*,*,*,と,ト,ト
出 動詞,自立,*,*,一段,連用形,出る,デ,デ
てる 動詞,非自立,*,*,一段,基本形,てる,テル,テル
ん 名詞,非自立,一般,*,*,*,ん,ン,ン
だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
な 助詞,終助詞,*,*,*,*,な,ナ,ナ
。 記号,句点,*,*,*,*,。,。,。
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
1 名詞,数,*,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
温度 名詞,一般,*,*,*,*,温度,オンド,オンド
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
出 動詞,自立,*,*,一段,連用形,出る,デ,デ
て 動詞,非自立,*,*,一段,未然形,てる,テ,テ
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
。 記号,句点,*,*,*,*,。,。,。
EOS

期待してたのとは真逆の結果に……。

とりあえずこのへんで一旦終了。

2011年4月1日金曜日

vmkfstools で vmdk をコピーするときの注意点

hoge-flat.vmdk をコピー対象にはできない。
hoge.vmdk をコピーすると自動的に hoge-flat.vmdk もコピーされる。


$ vmkfstools -i hoge-flat.vmdk /vmfs/volumes/dist/hoge-flat.vmdk


は駄目で、


$ vmkfstools -i hoge.vmdk /vmfs/volumes/dist/hoge.vmdk


は OK。

2011年2月13日日曜日

eXtream HAGO LT 大会 2011 Winter に参加してきました!!

もう一週間近く立ちましたが、eXtream HAGO LT 大会 2011 Winter に参加してきたのでその報告を。

そもそも eXtream HAGO とは何かと言うと、おそらく周りには理解されないだろうしお金儲けにもつながらないであろう自己満足な技術を発表する場を設けよう!というかなりアホな(褒めてます)イベントです。

もともとは身内だけで進めようとしていたイベントが、いつのまにやら沖縄県内の勉強会やらコミュニティを巻き込んで大規模なイベントになってしまいました。

テーマは自由ということもあって、Web デザインから組み込み系まで非常にバラエティに富んだ内容となりました。

詳細書きたいのですが、ust で配信されたりされなかったり資料も公開だったり非公開だったりとばらばらなので、支障が出ない範囲で箇条書きします。

  • 結論からいうと IRC にひきこもりたい
  • 普通の内容かと思いきや途中から急に変態じみてくる自称初心者
  • つくばだからしょうがない
  • あくまでインスパイアです
  • あくまでインスパイアですよ
  • 人は切羽詰るとおもしろいツイートを投稿する
  • 一気に物理層まで下りていったせいか誰もついてこれない
  • 基板にかわいいという形容詞が
  • ピンクのおじさんはえらいひとです
  • ありがとうございました
  • grep 2.5 使ってる奴はもぐり
  • コードにありがとうと声をかけるときれいなコードになります
  • バイナリを読む勉強会
  • 神速で気付く
  • Vim がアレだって話なのに screen に食いつく変態たち
  • 肉体言語
  • ライブ elisp コーディング
何がなんやらって感じですが、概ね間違ってはないかなーと思います。
そういう内容でした。次回以降も続いていくと思われるので、そのときを楽しみにネタを用意しておこうと思います。関係者の方々お疲れ様でした!

2010年11月21日日曜日

Python 環境構築 At Debian Squeeze



最近 Python 周りの記事を漁ってたら、pip やら virtualenv やら pythonbrew やら素敵ツールの存在を知ったのでその辺りを使った Python 環境構築の手順をまとめてみます。OS は Debian Squeeze です。


今回使うツール一覧



  • pythonbrew


複数バージョンの Python 環境を管理するツールです。HOME 以下にインストールできるので、レンタルサーバなど root 権限が取得できない場合でも問題なく使えます



  • pip


easy_install の代替を目指して開発されているライブラリマネージャです。perl で言うところの cpan, ruby で言うところの gem に当たります。



  • virtualenv


Python の仮想環境を作成するツールです。これを使うことで、あるライブラリを複数バージョンで使い分けたり、他のライブラリとの依存関係を壊すことなく最新バージョンのライブラリを試したり、といったことができるようになります



  • virtualenvwrapper


virtualenv を手軽に使うためのツールです。


OS インストール


最小構成でインストールします。


通常は一般ユーザ作成してそちらで作業しますが、今回はめんどくさかったのでそのまま root で作業してます。


必要なライブラリをインストール



# aptitude install build-essential ssh python curl zlib1g-dev


pythonbrew をインストール



# wget http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install --no-check-certificate
# chmod +x pythonbrew-install
# ./pythonbrew-install
# echo "source /root/.pythonbrew/etc/bashrc" >> ~/.bashrc
# source ~/.bashrc


最後の二行では、シェルの設定ファイルに



source /root/.pythonbrew/etc/bashrc


という一行を書きこんでます。zsh など bash 以外のシェルを使っている場合は適宜変更する必要があります。


pythonbrew で Python をインストールしてみる


今回は Python 2.6.6 をインストールしてみます。



# pythonbrew install 2.6.6 --force


インストールした環境を使用するために以下のコマンドを入力します。



# pythonbrew switch 2.6.6


異なるバージョンに切り替える場合も同様です。


virtualenv, virtualenvwrapper をインストールする



# pip install virtualenv virtualenvwrapper
# echo "source /root/.pythonbrew/pythons/Python-2.6.6/bin/virtualenvwrapper.sh" >> ~/.bashrc
# mkdir ~/.virtualenvs


これで、virtualenv による仮想環境を扱えるようになりました。


実際に仮想環境を作成してみます。



# mkvirtualenv 2.6.6


コマンドを入力すると、プロンプトの前に (2.6.6) と表示されるようになったと思います。


これが現在使用している仮想環境です。


使用をやめる場合は deactivate 、仮想環境を使用する場合は workon <仮想環境名> と入力します。


また、仮想環境を削除する場合は rmvirtualenv <仮想環境名> です。



# deactivate
# workon 2.6.6
# deactivate
# rmvirtualenv 2.6.6


とりあえず使い方がわかったのでここまでで終了。実際に使い込んでないのでいろいろ問題がある可能性がありますが……。


みんなのPython 改訂版
みんなのPython 改訂版
posted with amazlet at 10.09.23
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 75071


初めてのPython 第3版
初めてのPython 第3版
posted with amazlet at 10.09.23
Mark Lutz
オライリージャパン
売り上げランキング: 57132





2010年9月27日月曜日

gunicorn で web.py 製のアプリケーションを動かす



gunicorn とは Ruby の unicorn を元に開発された Python 用の HTTP サーバです。この gunicorn を使って web.py 製のアプリケーションを動かすことができたのでその備忘録。


後々 nginx と連携させて自作の Web アプリをデプロイしたいなーとか思ってます。


今回構築した環境は



  • OS: Mac OS X Snow Leopard

  • Python: 2.6.6 (MacPortsより)

  • web.py: 0.33 (easy_install にて)

  • gunicorn: 0.8.1 (easy_install にて)


web.py と gunicorn はそれぞれ



$ sudo easy_install-2.6 web.py
$ sudo easy_install-2.6 gunicorn


でインストールしました。


また、MacPorts からインストールした easy_install を使った場合、gunicorn は /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin にインストールされます。PATH が通ってない場合はあらかじめ設定しておく必要があります。


今回使ったソースは web.py の公式でも紹介されている 'Hello World!' アプリです。


app.py



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

app = web.application(urls, globals())

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()


このソースを一行書き換えれば gunicorn (というか WSGI)への対応完了です。


app.py



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

app = web.application(urls, globals()).wsgifunc() # <- .wsgifunc() を追加!

class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()


次に、gunicorn での起動方法です。app.py が置いてあるディレクトリで以下のコマンドを実行します。



$ gunicorn app:app
2010-09-26 22:23:50 [93920] [INFO] Arbiter booted
2010-09-26 22:23:50 [93920] [INFO] Listening at: http://127.0.0.1:8000
2010-09-26 22:23:50 [93922] [INFO] Worker spawned (pid: 93922)


これで起動完了です。 gunicorn に渡す引数は、(モジュール名):(変数名) です。今回の場合は app.py でモジュール名が app、wsgifunc()の返り値を代入してる変数名が app なので、app:app となります。


ファイルの変更が動的に反映されるので、開発時にはかなり便利ですね。


次は nginx と連携して動作させる設定を行なってみようと思います。


みんなのPython 改訂版
みんなのPython 改訂版
posted with amazlet at 10.09.23
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 75071


初めてのPython 第3版
初めてのPython 第3版
posted with amazlet at 10.09.23
Mark Lutz
オライリージャパン
売り上げランキング: 57132





2010年9月25日土曜日

nose を複数バージョンの Python で使う



nose とは Python 用のテストフレームワークです。Python には他にも unittest や doctest などがありますが、使いやすいという理由でこれを使ってます。


python_select で Python のバージョンを切り替えながら nose を使っていると、どうやら python_select による変更が反映されてないのではないか?ということに気づきました。


easy_install によってインストールされた nosetests は /usr/local/bin 以下に設置されていたので、中身を見てみます。



#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'nose==0.11.4','console_scripts','nosetests'
__requires__ = 'nose==0.11.4'
import sys
from pkg_resources import load_entry_point

sys.exit(
load_entry_point('nose==0.11.4', 'console_scripts', 'nosetests')()
)


一行目を見る限り、どうやらデフォルトでインストールされている Python を利用しているようです。


そこで、以下のように修正しました。



#!/usr/bin/env python
# EASY-INSTALL-ENTRY-SCRIPT: 'nose==0.11.4','console_scripts','nosetests'
__requires__ = 'nose==0.11.4'
import sys
from pkg_resources import load_entry_point

sys.exit(
load_entry_point('nose==0.11.4', 'console_scripts', 'nosetests')()
)


これで、python_select による変更が反映されるようになりました。


ただし、nose を新しいバージョンにアップデートするたびに修正が必要になるのが面倒ですね。


nose や unittest などのテストフレームワークについては


エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス
売り上げランキング: 8790


に詳しく載ってます。今読んでますが難しい……。