2009/11/08

ブログ移行しました

せっかく自宅サーバがあるので自宅サーバに移行しました。

hiroki.kanaの日常
http://blog.hirokikana.com/

これからはこのブログにこちらではなく、新しいブログに書いていこうかと思います。
今後ともよろしくお願いします。

2009/10/04

Catalystアプリと設定ファイルを共通化

作ろうとしているやつがちょうどCatalystで作り直そうかと思っていたのでひとまず、設定ファイルをCatalystから切り離して、Catalyst以外のアプリからも読み込めるようにしました。

まず、作成するアプリは下記のようなライブラリ構成です。

  • MyApp::API   アプリケーションのロジック部です

  • MyApp::Web   Catalyst関連のものです

  • MyApp::Utils  ユーティリティ。Catalystから切り離す。

  • MyApp::Config  設定ファイルに関するクラス

  • MyApp::Log   ログを出力するクラス



ともあれ、catalyst.plでひな形を作ります。
$ catalyst.pl MyApp::Web


まずlib/MyApp/Config.pmを下記のように作成します。
package MyApp::Config;

use strict;
use warnings;
use Config::Multi;
use MyApp::Utils;
use base 'Class::Singleton';

our $FILES ;
sub _new_instance {
my $cm = Config::Multi->new(
{
dir => MyApp::Utils::path_to('conf')->stringify ,
app_name => 'myapp' ,
extension => 'yml'
});
my $config = $cm->load();
$FILES = $cm->files;
return $config;
}
sub files {
return $FILES;
}

1;

参考サイトのコピペです。すいませんすいません。
ここで設定したapp_nameとextensionが設定ファイル名に使用されます。
上記設定だとmyapp_web.ymlになります。

次にMyApp::Utils。
package MyApp::Utils;

use warnings;
use strict;
use Path::Class::Dir;
use Path::Class::File;
use FindBin;

sub home {
return $ENV{MYAPP_HOME} || Path::Class::Dir->new( $FindBin::Bin, './../' );
}

sub path_to {
my ( @path ) = @_;
my $path = Path::Class::Dir->new( &home , @path );
warn $path;
if ( -d $path ) { return $path }
else { return Path::Class::File->new( &home, @path ) }
}

1;

これも参考サイトのコピペです。すいませんすいません。
このメソッド、ログのところでも少し使ったので今後もたぶん使う&拡張することになるかと思います。

つぎに、Config用のCatalystプラグインです。
MyApp/Pluginディレクトリを作成して、Config.pmファイルをつくります。
Catalyst 5.8でやったのでNEXTじゃないやつ(名前なんだっけ?)を使いました。
package MyApp::Plugin::Config;

use strict;
use warnings;
use MyApp::Config;
use MRO::Compat;

our $VERSION ='0.01';

sub setup {
my $c = shift;
my $config = MyApp::Config->instance();

if( $c->debug ) {
my $files = MyApp::Config->files();
for my $file ( @{$files} ) {
$c->log->debug( 'Load Config ' . $file );
}
}

$c->config( $config ) ;
$c->next::method( @_ );
}

1;


そしてCatalystアプリ本体のlib/MyApp/Web.pmに下記を追加します。
our $VERSION = '0.01';
use Catalyst qw/+MyApp::Plugin::Config/;


設定ファイルをconf/myapp_web.ymlに作成します。
---
test: hogehoge


これでCatalystから設定ファイルの内容が拾えればOKです。
lib/MyApp/Web/Controller/Root.pmを下記のように修正して、テストサーバーを上げて画面にhogehogeと表示されれば成功です。
sub index :Path :Args(0) {
my ( $self, $c ) = @_;

# Hello World
$c->response->body($c->config->{test});
}

sub default :Path {
my ( $self, $c ) = @_;
$c->response->body( 'Page not found' );
$c->response->status(404);
}


Catalyst以外からも下記のように利用する事ができます。
ちなみにbin/test.plのような名前で作成しました。
#!/usr/bin/perl
use strict;
use warnings;
use FindBin;

use lib($FindBin::Bin . '/../lib');

use MyApp::Log;

my $config = NaNaCa::Config->instance();
print "$config->{test}\n";


これでひとまずConfigをCatalystから分離することができました。
理解しきれていないこと(特に初めて使ったクラス群)が多いので、ほとんど参考サイトをコピペさせてもらいました。

ログもLog4perlで出力しつつ、Catalystから切り離そうとしたんですがやっぱり同じようにSingletonにした方が良いもんなんでしょうか。
特に多くを望んでいないので、Catalyst::Log::Log4perlという便利なものを使い、同じ設定ファイルを読ませてアプリの方はLog4perlを使うって方法はどうだろうと思っています。
次回はLogについて書きたいと思います。

参考サイト

2009/08/13

MacでOpenCVプログラムをコンパイル

前回、と言ってもだいぶ前にMacにMacPortsを使ってOpenCVをインストールする記事を書きました。
それからだいぶ経ちますが、今回は実際にソースを書いてコンパイルして動かすところまでをやってみたいと思います。

まず、てきとうな場所に下記のようなファイルを作成します。
今回はopencv_test.cというファイル名にしました。
ちなみに、このプログラムは指定した画像を表示するだけのプログラムです。
#include "cv.h"
#include "highgui.h"

int main(int argc, char* argv[]) {
IplImage* img; //画像ファイルポインタ
char imgfile[] = "test.jpg"; //ファイル名

//画像読み込み
img = cvLoadImage(imgfile, CV_LOAD_IMAGE_COLOR);

//画像の表示
cvNamedWindow ("test OpenCV", CV_WINDOW_AUTOSIZE);
cvShowImage ("test OpenCV", img);
cvWaitKey (0);
cvDestroyWindow ("test OpenCV");

//画像の解放
cvReleaseImage(&img);

return 0;
}

次にコンパイルします。
コンパイルする際にインクルードパスとライブラリパスをgccに直接指定します。
OpenCVに必要なヘッダファイルは/opt/local/include/opencvに、ライブラリは/opt/local/lib以下に存在します。
$ gcc -L/opt/local/lib/ -lcxcore -lcv -lhighgui -lml -I/opt/local/include/opencv/ opencv_test.c -o opencv_test
$ ./opencv_test

コンパイルが正常に終了したら出来上がったプログラムを実行すると指定した画像が表示されます。
何かのキーを押すとプログラムが終了します。

OpenCVに関する書籍やWebの例ではWindows上のVisual Studio環境が多いのですが、このようにすることでMacでもOpenCVの開発ができるようになります。
今回はIDEを使わない方法でしたが、XCodeやEclipseでも同じことができると思います。


参考サイト

2009/06/14

Cactiインストール

今回は各種統計情報を表示するCactiをインストールします。

一時的にEPELリポジトリを有効にしてyumでインストールを行いました。
# yum --enablerepo=epel install cacti


インストールが完了したらMySQLにCacti用のデータベースとユーザを作成します。
データベース名はcacti、ユーザ名はcactiuser、パスワードはpasswordに設定した例です。
# mysqladmin -u root create cacti
# mysql -u root cacti < /usr/share/doc/cacti-0.8.7d/cacti.sql
# mysql -u root mysql
mysql> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'password';
mysql> flush privileges;


次にCactiとApacheの設定ファイルを編集します。
/etc/cacti/db.phpに設定したMySQLのユーザ名とパスワードを記述します。
その他、データベースの設定がある場合はここに記述します。
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "password";
$database_port = "3306";

Apacheの設定ファイルは/etc/httpd/conf.d/cacti.confに記述します。
デフォルトでは127.0.0.1からしかアクセスすることができない設定になっているので、下記のように編集し同じネットワークからアクセスできるようにします。
編集が終わったらApacheを再起動します。
#
# Cacti: An rrd based graphing tool
#
Alias /cacti /usr/share/cacti

<Directory /usr/share/cacti/>
Order Deny,Allow
Deny from all
Allow from 192.168.100.0/24
</Directory>


設定後http://<ホスト名>/cacti/にアクセスすると、初期設定ウィザードが表示されます。
インストールタイプを聞かれるので、"New Install"を選択します。
次の画面でCactiが使用するユーティリティのパスが表示されますが、その際にNOT FOUNDがある場合は該当のツールをインストールしてください。
私の場合はnet-snmp-utilsを追加でインストールしました。

Finishを押すとCactiのログイン画面が表示されるのでユーザ名admin、パスワードadminでログインします。


次にSNMPの設定をします。
今回は特にほとんど設定ファイルをいじらずにほぼデフォルトのままにします。
表に置くサーバーなどはコミュニティを切るなどの配慮が必要になるかと思います。

/etc/nsmp/snmpd.confの下記部分に一番上の一行を追加します。
これによってすべてのSNMPのデータを取得できるようになります。
view    systemview    included   .1
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1


snmpdを再起動し、snmpwalkを使い正しく取得できるかどうか確認します。
snmpwalkで情報が取得できれば正しく動作しています。
# service snmpd restart
# snmpwalk -v 2c -c public localhost



次にCactiで監視ホストの登録とグラフの登録を行います。
ConsoleタブのDevicesをクリックするとlocalhostがあります。
これが監視ホストで、追加する場合はここに追加します。
次に設定で、Host Templateをucd/net SNMP Hostにし、SNMP VersionをVersion 2に設定します。
Saveボタンを押し、これらの設定を反映させます。

グラフの追加にはConsoleタブのDevicesを開いたときに表示されるCreate Graphs for this Hostをクリックするとグラフを追加することができます。
追加したいグラフをチェックし、createボタンを押すことでグラフが追加されます。
グラフの一覧はGraphタブ内から見ることができます

2009/04/19

ffmpegのインストール(メモ)

動画録画サーバーに入れてあるffmpegを最新版にしました。
iPhone用の動画を作る際に最新版だと-f ipodを渡すだけでできるとのことだったので、アップデートしました。

そのときの方法をメモ的ですがのせておきます。
ソースから導入するので、現状の環境を汚さないように/usr/local/ffmpeg以下にすべてが導入されるようにしました。

まず、faacとfaadのインストール。
$ wget http://jaist.dl.sourceforge.net/sourceforge/faac/faac-1.28.tar.gz
$ tar xzvf faac-1.28
$ ./bootstrap
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


$ wget http://jaist.dl.sourceforge.net/sourceforge/faac/faad2-2.7.tar.gz
$ cd faad2-2.7
$ chmod 755 bootstrap
$ ./bootstrap
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


次に、x264で使用するyasmのインストール。
前まではrpmforgeのやつを使ってたんですが、ソースから簡単に導入できたので入れました。
$ wget http://www.tortall.net/projects/yasm/releases/yasm-0.7.2.tar.gz
$ tar xzvf yasm-0.7.2.tar.gz
$ cd yasm-0.7.2
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


次に、x264のインストール。
$ wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20090412-2245.tar.bz2
$ tar xjvf x264-snapshot-20090412-2245.tar.bz2
$ cd x264-snapshot-20090412-2245
$ export PATH=/usr/local/ffmpeg/bin:$PATH
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


最後にffmpegのインストール。
$ svn co svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
$ cd ffmpeg
$ ./configure --enable-libx264 --enable-libfaad --enable-libfaac --enable-pthreads --extra-ldflags="-L/usr/local/ffmpeg/lib" --extra-cflags="-I/usr/local/ffmpeg/include" --enable-gpl --prefix=/usr/local/ffmpeg
$ make
$ make install


これでひとまず完了です。
iPhone用にしか考えていないので、対応コーデックは最低限にしました。

2009/04/13

XSからlibcのputs関数を呼び出す

前回はCのコードをxsコードに書いて、それを実行するということをやりました。
今回は外部のCライブラリを呼び出してみたいと思います。
一番簡単そうな例として、libcのputs関数を呼び出してみます。

まずはXSライブラリのひな形を作成します。
$ h2xs -A -n libcXS
perl Makefile.PL


次にXSソース(libcXS.xs)を編集します。
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include "stdlib.h"

MODULE = libcXS PACKAGE = libcXS

void
puts(value)
char * value

追記したのは、include部にstdlib.hを追加したのと前回も追加した関数の戻り値などの定義部分です。
前回のようCODEセクションを定義してコードを書かなくても、既存のライブラリ呼び出しの場合は定義だけでOKです。

最後にmakeして完了です。

実際にこのモジュールを使ったPerlコードを使った例が次のものです。
標準出力にhogehogeと表示されるはずです。
#!/usr/bin/perl

use strict;
use ExtUtils::testlib;
use libcXS;

libcXS::puts("hogehoge");


だんだんわかってきたような気がしてきていますが、きちんと理解するためにはもう少し時間がかかりそうです。
ひとまず、perldoc perlxsとモダンPerl入門を改めて読んでみます。

----
追記:
なぜか、#include "stdlib.h"を消しても動きます…
前段階でincludeされてるのかなぁ、それとも別の原因…?
今度は違うライブラリでやってみたいと思います。

2009/04/11

インストールマニアックス2009に応募

http://www.thinkit.co.jp/maniax/2009/

インストールマニアックス2009に応募しました。
サーバー1台とWindows Web Server 2008を無償提供してもらえ、それに期間中にどれだけたくさんのOSSをインストールできるか競うというイベントです。

前回のには参加しそびれてしまったので、今回は応募できました。
当たれば今月末にでも機材が届くのかもしれないです。

機材を無償提供してもらえるのはうれしいですが、1年間動かし続けなきゃいけないのがちょっと痛いですが…電気代的な意味で。