Ubuntu上のphpでcURLを使う

curlは指定したURLからデータを取ってくるコマンドですが,それをphp5から利用する場合,php5-curlが必要になります.

コマンドライン上で

sudo apt-get install php5-curl

を実行することでphp5のcurlモジュールをインストールすることができ,利用できます.

何に使うかというと…wordpressにSimple Tweetというプラグインを入れたのですが,

Twitter OAuth は PHP5 以降でのみ利用できます。

というエラーメッセージが出て使えなかったからです.
このエラーメッセージはそのサーバのPHPでcurlが使えないときにも出るようです.

ツイートツイート
カテゴリー: 未分類 | タグ: , , | コメントをどうぞ

[shogun 1] shogunを使ってみよう

最近Shogun – A Large Scale Machine Learning Toolbox という機械学習のツールボックスを使い始めたので,shogunについて紹介します.

まず紹介ページの英語を適当に日本語に訳してみます.

SHOGUNは大規模なカーネル法と特にサポートベクタマシン(Support Vector Machine: SVM)[1]に重点を置いている機械学習ツールボックスである.いろいろなSVM実装(OCAS [21], Liblinear [20], LibSVM [2], SVMLight, [3] SVMLin [4] and GPDT [5])に対するインターフェースになる汎用的なSVMオブジェクトを提供する.SVMは様々なカーネルと組み合わせることができる.このツールボクスは線形カーネル,多項式カーネル,ガウシアンカーネル,シグモイドカーネルだけでなく,Locality Improved [6], Fischer [7], TOP [8], Spectrum [9], Weighted Degree Kernel (with shifts) [10] [11] [12]なども提供する.また効率的なLINADD [12]最適化法も実装している.線形SVMに対して,COFFIN framework [22][23]は疎行列,密行列他様々なデータタイプの混合に対してもオンデマンドで処理ができる.さらにSHOGUNは様々なpre-computedなカーネルで動くようになっている.重要なものとしては,サブカーネルの重み付き線形和による結合カーネルがある.この各サブカーネルは必ずしも同じドメインである必要はない.最適なサブカーネルの重みはMultiple Kernel Learning (MKL) [13][14][18][19]で学習できる.現在SVMは,1クラス,2クラス,多クラス分類,回帰問題を扱える.SHOGUNは線形判別分析(Linear Discriminant Analysis: LDA),線形計画マシン(Linear Programming Machine: LPM),パーセプトロン((Kernel) Perceptrons),隠れマルコフモデル(Hidden Markov Model)も実装されている.入力データは様々な型の疎・密行列を利用することができる.平均を引くなどの一連の前処理を各入力データに適用することもできる.
SHOGUNはC++で実装されており,Matlab, R, Octave, Python, Java, Ruby向けのインタフェースが用意されており,機械学習のオープンソースソフトウェアとして公開されている.

長々と書きましたが,重要なのは以下のポイントになります.

  • 様々なSVM実装が利用できる
  • 様々なカーネルを使える
  • SVM以外にもLDAとかHMMとかいろいろ使える
  • C++/Matlab/R/Octave/Python/Ruby/Javaなどで使える
  • オープンソースソフトウェアである

関西CV・PRML勉強会で紹介した時のスライドはこちらにあります.

僕はこのツールボックスを,Pythonから利用しはじめました.スライド中ではapt-getやMacPortsでインストールできると言っていますが,サンプルコードなどを入手したい場合は,gitを使ってソースコードをダウンロードし,コンパイルしてインストールするのがお勧めです.

gitがインストールされているならば

git clone git://github.com/shogun-toolbox/shogun.git
git clone git://github.com/shogun-toolbox/shogun-data.git

のコマンドで,shogunディレクトリとshogun-dataディレクトリができます.shogunディレクトリにはshogunのソースコードとサンプルコードが,shogun-dataディレクトリにはサンプルのデータが入っています.

ソースコードをダウンロードしたら,

cd shogun/src
./configure
make

し,管理者権限で

make install

することでインストールすることができます.
./configureの前に,swigがインストールされていないとpythonなどからの利用ができないので,先にインストールしておく必要があります.これはapt-getやMacPortsなどでインストールすることができます.

サンプルコードを動かすためには,サンプルデータのディレクトリの設定をする必要があります.shogunディレクトリ中で

rmdir data
ln -s ../shogun-data data

としてリンクを張っておく,もしくはshogun-dataの中身をshogun/dataへ移動すると完了です.

次のエントリではPython版のサンプルコードを動かすためのノウハウについて書きます.

ツイートツイート
カテゴリー: 未分類 | タグ: , , , , | コメントをどうぞ

X.orgの設定ファイル xorg.conf を晒してみる

はじめに

LinuxでのウインドウシステムであるX.orgの設定ファイルを晒します.
X.orgの設定ファイルは, /etc/X11/xorg.conf にあり,マウスとキーボードの設定,ディスプレイドライバ,解像度,画面の回転,マルチスクリーンなどの設定を書くようになっています.

マルチスクリーンにして回転させる時はさすがに自前でこのファイルをいじらないと上手く行かなかったので,メモがわりに貼っておこうと思いました.

環境

  • グラフィックボード:NVIDIA Quadro FX 580
  • ディスプレイ:DELLの24inch2枚を90度回転させ,縦にして2枚横に並べています.
  • OS:Ubuntu 11.10 64bit
  • デスクトップマネージャ:Gnome 3

設定ファイル

では晒します.注意:使用している環境によっていろいろ異なる所があるので,このままコピペしても使えるかどうかは微妙です./etc/X11/xorg.confのバックアップをとっておくことをお勧めします.

Section "ServerLayout" # ここは画面配置の設定
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
    Option         "Xinerama" "0"
EndSection

Section "InputDevice" # ここはマウスの設定
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice" # ここはキーボードの設定
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor" # ここはディスプレイの設定
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "DELL 2405FPW"
    HorizSync       30.0 - 81.0
    VertRefresh     56.0 - 76.0
    Option         "DPMS"
EndSection

Section "Device" # ここはグラフィックボードの設定
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "Quadro FX 580"
EndSection

Section "Screen" # ここはスクリーンの設定「どのディスプレイにどのデバイスの映像を出力するか」など.
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "Rotate" "CCW" # これにより,画面を回転
    Option         "NoLogo" "True"
    Option         "TwinView" "1" # これにより,マルチディスプレイを実現
    Option         "TwinViewXineramaInfoOrder" "DFP-0"
    Option         "metamodes" "DFP-0: nvidia-auto-select +0+1200, DFP-1: 1920x1200 +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

おわりに

失敗して分けわからなくなった場合は,
$ sudo nvidia-xconfig
コマンドで自動的にファイルを復元することができます.

ツイートツイート
カテゴリー: 未分類 | コメントをどうぞ

PythonでのORマッパー:SQLAlchemy

Pythonでデータベースを扱うときには,ORマッパーが便利.
ORマッパーとは,Pythonのクラスのインスタンスとデータベースのレコードとを対応付けるもの.
これを使うと,DBアクセスがとても簡単になるし,SQLを書かなくてすむ.

使用例

from sqlalchemy import Table, Column, Integer, String, Date
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime

class User(declarative_base()):
    __tablename__ = 'observation'

    id = Column(Integer, primary_key=True)
    date = Date()
    pos_x = Integer()
    pos_y = Integer()
    def __init__(self, date, x, y):
        self.date = date
        self.pos_x = x
        self.pos_y = y

    def __repr__(self):
return "<Task('%s', '%d', '%d')>" % (self.date, self.pos_x, self.pos_y)

こんな感じで,クラス定義にちょこっと追加するだけで,このクラスに対応したデータベースが作成される.

ツイートツイート
カテゴリー: 未分類 | コメントをどうぞ

Rubyスクリプト中から別のRubyスクリプトを呼び出した時の標準出力

Rubyスクリプトから別のRubyスクリプトを呼び出したい時がある.

そういう場合,

msg=`hoge.rb`

とすると,hoge.rbが標準出力へ出力した文字列すべてを変数msgで受け取ることが出来る.
1行ずつ受け取って処理したい場合は,

IO.popen("hoge.rb") do |pipe|
    pipe.each do | line |
         print line
    end
end

という感じにすれば,1行ずつとって表示することが出来る.

しかし,デフォルトだと,Rubyスクリプトの標準出力はバッファリングされるため,hoge.rbの処理に時間がかかる場合,長い時間立った後に,まとめてhoge.rbの出力をどかっと渡されるようになる.
(受け取ったプログラムは,それを1行ずつ処理することはできるけれど)

これは標準出力がバッファリングされているのが原因なので,バッファリングしないようにすればOK.
つまり,呼び出される側のスクリプトhoge.rbの最初に,

STDOUT.sync = true

と書けば良い.
[Ruby] Rubyの標準出力をバッファしないを参考にしました.)

これで,ばっちり動く.

例(STDOUT.sync=trueの有無での挙動の違いを確認)
呼び出される側:hoge.rb

#!/usr/bin/ruby

STDOUT.sync = true
puts "hoge"
sleep 3 # 長時間かかる処理
puts "hoge"

呼び出す側:main.rb

#!/usr/bin/ruby

puts "start"

IO.popen("test.rb") do |f|
        f.each do |line|
                print line
        end
end

puts "finish"
ツイートツイート
カテゴリー: 未分類 | コメントをどうぞ

SubversionユーザがMercurialを使ってみた

Subversionといえば,かなり有名なバージョン管理システムです.
また,MercurialはPythonで書かれている,最近よくみかける分散リポジトリ型のバージョン管理システムです.
それぞれがどんな物かはここでは触れませんので各自調べてください.

今回は,中央リポジトリとしてSubversionを使い各自のローカルにリポジトリをMercurialで持つ,いいかえれば,Mercurialとしてリポジトリを管理するけどもマスターリポジトリとしてSubversionのリポジトリを利用する方法について説明します.

これをやるには,gitの場合だとgit-svnというのがあるように,HgSubversionというのがあります.
それをeasy_installで入れるだけでOK.

sudo easy_install hgsubversion

これで,hgにsubversionの拡張が入ったはずです.

次に,設定ファイル ~/.hgrc に,hgsubversion…eggをインストールしたパスを指定します.

Macの場合,~/.hgrcに以下を追記します
[extensions]
hgsubversion=/Library/Python/2.7/site-packages/hgsubversion-1.3-py2.7.egg/hgsubversion/

あとは,
hg clone svn+http://hogehoge/fuga .
とか
hg clone svn+ssh://hogehoge//fuga .
とやれば,Subversionのリポジトリからhgのローカルリポジトリを作成できるはず!

ツイートツイート
カテゴリー: 未分類 | コメントをどうぞ

Macでnumpyモジュールのインストール

Pythonのモジュールはeasy_installを使ってインストールしています.

easy_install nose
easy_install numpy

という感じ.

ただし,numpyはインストールする際にCのコード,Fortranのコードのコンパイルが必要です.
ここで詰まったのでメモ.

Cのコードのコンパイル
Cのコードをコンパイルするためには,Python.hが必要です.
Python.hは /usr/include/python2.7/Python.h にありますが,インクルードのパスが通ってないので,Python.hがないと言われます.
なので,
sudo ln -s /usr/include/python2.7/Python.h /usr/include/Python.h
してやります.

Fortranのコードのコンパイル
デフォルトではFortranコンパイラのgfortranが入っていないので,
http://hpc.sourceforge.net/ から,gfortran-lion.tar.gzを取ってきて,
sudo tar zxvf gfortran-lion.tar.gz /
してやります.

この2点を済ませば,numpyがインストールできると思います.

ツイートツイート
カテゴリー: 未分類 | タグ: , | コメントをどうぞ

seq コマンド

seqコマンドという便利なLinuxコマンドがあったのでメモ.ちなみに僕はシェルはzshを使っています.

seqコマンドは基本的には開始と終了を指定すれば,開始から終了までの数列を出力してくれるコマンド.使い方は以下のとおり.

seq -f "%03g" 0 100

これで 000~100までの数値が作れる.ここで -f “%03g” は,C言語等でもおなじみprintfのフォーマットと同じで,3桁になるように0で埋めるという意味です.別にかならず必要というわけではなく,これがないと,0~9,10~99,100という感じに出力されます.実は0で埋めるだけだったら,-wというオプションでもOK.

seq -w 0 100

これで0で整えられた文字列が出力される.ところで,普通にseqコマンドを実行すると指定した数字が改行区切りで出力されるけど,-sオプションを使えば区切り文字も変更できる.

seq -w -s , 5 15

この場合,05,06,07,08,09,10,11,12,13,14,15 という文字列が出力されるはず.

使用例:forループと組み合わせたりして

for x in `seq -f "%03g" 0 100`; echo $x

こんな感じ.でもforループで使うなら,

for x in {000..100}; echo $x

のほうが簡単。まぁでもstepも設定できるのは便利。

for x in `seq -f "%03g" 0 5 100`; echo $x

この場合だと,000から100まで5飛びで000 005 010 015 … 100が出力される.

ツイートツイート
カテゴリー: 未分類 | タグ: , , | コメントをどうぞ

OpenCVでカラーでスカラー場を可視化する場合

何かしらのスカラー場を表現しようとしたときに,各画素に対してグレースケールで値をセットしてやれば一応可視化は出来るのですが,やはりカラーで表現したほうがきれいです.その場合,値の大小に対して,赤←→青で表現すると見やすいです.

そんな時にはRGB色空間ではなめらかに赤←→青の変化をつけるのが難しいので,HSV色空間を使います.処理としては,画像を一旦HSV色空間へ変換し,値をセットした後でRGB色空間へ戻せばOK.実際のコードは次のようになります.

#include <cv.h>
#include <highgui.h>

// h は 0から180までの値で1周なので,120までを使う
const double max_hue=120.0;
unsigned char func(int x, int y, int cols){
	// 今回は,x座標に応じてhの値を設定
	return max_hue*x/cols;
}

int main(){
	// 出力用画像
	cv::Mat img=cv::Mat::zeros(480,640,CV_8UC3);

//// HSV色空間での色表示ここから
	// HSVの画像へ変換
	cv::cvtColor(img,img,CV_BGR2HSV);

	unsigned char h,s,v;
	h=0;   // 値に応じて変化させる
	s=255; // 固定
	v=255; // 固定

	for(int y=0;y<img.rows;y++){
		for(int x=0;x<img.cols;x++){
			h=func(x,y,img.cols); // 適当な関数で値を決める

			// 画像の(y,x)位置に値をセット
			img.at<cv::Vec3b>(y,x)=cv::Vec3b(h,s,v);
		}
	}
	// BGRの画像へもどす
	cv::cvtColor(img,img,CV_HSV2BGR);
//// ここまで

	// 表示
	cv::imshow("Result",img);
	cv::waitKey();
	return 0;
}
ツイートツイート
カテゴリー: 未分類 | コメントをどうぞ

Rubyで多項分布からのサンプリング

多項分布を扱うことがあったので、Rubyでサクッと多項分布からのサンプリングを書いてみた。ただし、何も見ずにカンで書いたので合ってるかどうかはまったく保証しません。

#!/usr/bin/ruby

# 多項分布からのサンプリングを行う関数
# probは、各項の確率(総和は1とする)
def samplingFromMultinomialDistribution(prob)
# 累積確率にする
prev=0.0
accprob=prob.map{|x| prev=prev+x }

# 一様乱数生成
r=rand()

# 要素を選択する
return accprob.index{|v| v > r}
end

# 適当な多項分布
p prob=[0.6,0.2,0.1,0.05,0.04,0.01]

# サンプリングして
index=samplingFromMultinomialDistribution(prob)

# その項を出力する
p index

何回か実行してみたけど、それっぽい結果が出ているのでよしとするか…。今回は厳密さとか全くいらないので。

厳密さが要求されるシーンで多項分布を扱っている方々はどんなふうにサンプリングしているのだろう?

ツイートツイート
カテゴリー: 未分類 | コメントをどうぞ