pepponの日記 このページをアンテナに追加 RSSフィード

2009-12-18

Apacheのapachectlの結果がperlからとれないの

/usr/local/httpd2/bin/apachectl configtest

なconfigtestな結果をperl

単純に``でくくるとかパイプかませてみたりしてもSyntax OKとかを取得できなかった。

/usr/local/httpd2/bin/httpd -tでも童謡だ。

なのでServer::Control::Apacheを入れてみた。

    use Server::Control::Apache;

    my $apache = Server::Control::Apache->new(
        server_root  => '/my/apache/dir'
       # OR    
        conf_file => '/my/apache/dir/conf/httpd.conf'
    );
    if ( !$apache->is_running() ) {
        $apache->start();
    }

プラグインも簡単につくれるよう

For example, here is a role that sends an email whenever a server is successfully started or stopped:


   package Server::Control::Plugin::EmailOnStatusChange;
   use Moose::Role;
   
   has 'email_status_to' => ( is => 'ro', isa => 'Str', required => 1 );
   
   after 'successful_start' => sub {
       shift->send_email("server started");
   };
   after 'successful_stop' => sub {
       shift->send_email("server stopped");
   };
   
   __PACKAGE__->meta->make_immutable();
   
   sub send_email {
       my ( $self, $subject ) = @_;
   
       ...;
   }
   
   1;

2009-11-20

Naive Bayesしたい

はてなブックマークでも使われてるComplement Naive Bayesを解説するよ

http://d.hatena.ne.jp/tkng/20081217/1229475900

俺もこれやってみたいのだ。

CPAN調べてみたらAI::Categorizerってのがあるし、Lingua::JA::Categorizeはまさに日本語ドキュメントをカテゴライズするものっぽい。

http://d.hatena.ne.jp/download_takeshi/20081124/1227539934

Algorithm::NaiveBayesというモジュールがありまして…実際に手作業でこれらの単語の収集作業をやっていくのは、さすがにダルビッシュなわけです。

だそうでさすがにダルビッシュなのはつらいなということで。 やってみた。

コンピュータ用語 http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%94%A8%E8%AA%9E%E4%B8%80%E8%A6%A7

コンピュータゲーム http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E4%B8%80%E8%A6%A7

アニメ作品一覧 http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%8B%E3%83%A1%E4%BD%9C%E5%93%81%E4%B8%80%E8%A6%A7

スポーツ http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%E7%AB%B6%E6%8A%80%E4%B8%80%E8%A6%A7

http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%E9%81%B8%E6%89%8B%E4%B8%80%E8%A6%A7%E3%81%AE%E4%B8%80%E8%A6%A7

http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%E3%81%AE%E3%83%97%E3%83%AD%E3%83%AA%E3%83%BC%E3%82%B0%E4%B8%80%E8%A6%A7

学問一覧 http://ja.wikipedia.org/wiki/%E5%AD%A6%E5%95%8F%E3%81%AE%E4%B8%80%E8%A6%A7

こういうところを探してカテゴリーっぽいキーワードを集めた。

Complement naive Bayesでcpan検索してもでてこない。 Native bayesでやって、「属さない確率」をもとめればいいのかな?かな

とりあえずメモ

とかネットでいろいろ調べてみて思ったけど、オライリー集合知プログラミングって本もってたので、まさにそういう本なのでちゃんと読んでみる。

2009-10-20

Perlでroot権限で動作させる場合の注意点

root権限で動作させたい常駐プログラムを作って動作させてみたものの、うまくいく場合とうまくいかない場合があって、かなりはまってしまった。

シェル上でrootユーザでperlプログラムを実行した場合と、なんらかのトリガー(メールや、xmlrpcとかでコマンドを受け取って)を経て自動で実行させるときの違いを調べてみた。

perlsec - Perl のセキュリティ

http://perldoc.jp/docs/perl/5.6.1/perlsec.pod

Perl は、そのプログラムが異なる実ユーザー ID、実効ユーザー ID、実グループ ID、実効グループ ID を使って実行されることを検出したときに、自動的に 汚染モード (taint mode) と呼ばれる特別なセキュリティチェックのセットを有効にします。 UNIX パーミッションにおける setuid ビットはモード 04000 で、 setgid ビットはモード 02000 です。これらは重複してセットすることもできます。汚染モードは、コマンドラインフラグ -T を使って陽に有効にすることもできます。このフラグはサーバープログラムであるとか、 CGI スクリプトのような、他の誰かにすりかわって実行されるプログラムに使うことを 強く 勧めます。

おそらくroot権限で動作しない場合には汚染モードになってパスだとか、いろいろなチェックに引っかかっているんだろうと予想。

自分のプログラムの外側から来たデータをプログラムの外の何かに影響を及ぼすために使うことは、少なくともアクシデントででもなければ、できません。すべてのコマンドライン引数、環境変数、ロケール情報(perllocale を参照)、幾つかのシステムコールの結果(readdir(), readlink(), shmread() の変数、 msgrcv() が返したメッセージ、パスワード、getpwxxx() 呼び出しが返した gecos フィールドとシェルフィールド)、すべてのファイル入力といったものは “汚染された”(tainted) と目印が付けられます。汚染されたデータは直接、間接を問わずサブシェルを起動するコマンドに使うことも、ファイルやディレクトリ、プロセスに変更を加えるようなコマンドに使うこともできません。但し 以下の例外 があります。

  • system あるいは exec に対する引数リストの要素として渡した場合には、その要素に対する汚染検査は 行われません。(``も含む)
  • print と syswrite の引数に対する汚染検査は 行われません。

例を示します:


    $arg = shift;		# $arg は汚染された
    $hid = $arg, 'bar';		# $hid も汚染された
    $line = <>;			# 汚染された
    $line = <STDIN>;		# これも汚染された
    open FOO, "/home/me/bar" or die $!;
    $line = <FOO>;		# まだ汚染されている
    $path = $ENV{'PATH'};	# 汚染されているが、下記を参照のこと
    $data = 'abc';		# 汚染されていない

    system "echo $arg";		# 安全ではない
    system "/bin/echo", $arg;	# 安全 (shを使いません)
    system "echo $hid";		# 安全ではない
    system "echo $data";	# PATHを設定するまでは安全ではない

    $path = $ENV{'PATH'};	# $path が汚染された

    $ENV{'PATH'} = '/bin:/usr/bin';
    delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

    $path = $ENV{'PATH'};	# $path は汚染されていない
    system "echo $data";	# これで安全!

    open(FOO, "< $arg");	# OK - 読み込みのみのファイル
    open(FOO, "> $arg"); 	# Not OK - 書き込みしようとしている

    open(FOO,"echo $arg|");	# Not OK, but...
    open(FOO,"-|")
	or exec 'echo', $arg;	# OK

    $shout = `echo $arg`;	# 安全でない。$shoutは汚染された。

    unlink $data, $arg;		# 安全でない
    umask $arg;			# 安全でない

    exec "echo $arg";		# 安全でない
    exec "echo", $arg;		# 安全 (シェルを使いません)
    exec "sh", '-c', $arg;	# 安全と解釈される。ああ!

    @files = <*.c>;		# 安全でない (readdir() のようなものを使う)
    @files = glob('*.c');	# 安全でない (reっsaddir() のようなものを使う)

どう汚染されているかを調べるには


(汚染されたデータの検出と洗浄)

ある変数が汚染されたデータを保持しているかどうかを検査するため、そして、 "Insecure dependency" メッセージの引き金になる可能性があるかどうかを検査するために、あなたの最も身近にある CPAN のミラーサイトで Taint.pm モジュールを探してみてください。これは 1997 年の 11 月に入手できるようになるでしょう。あるいは、以下のような関数 is_tainted() を使うことができます。


    sub is_tainted {
	return ! eval {
	    join('',@_), kill 0;
	    1;
	};
    }

コマンド実行は注意して書くのは当たり前なんだけど、はまった部分はファイル上書き、追加などのファイル操作でした。

というか単にIO::Allでファイルを追加していたんだけど、これではだめっぽい(少なくとも汚染モードでは)。

で普通にopenする訳なんだけど、いろいろ調べてみた。

参考になったサイト

perl - open my $fh, "comand |"; # はモダンじゃない

http://blog.livedoor.jp/dankogai/archives/51176081.html

モダンPerl入門にある記述で

open(my $fh, '| cat -v');

上記の部分なんだけど、下記のように書く

open my $fh, '|-', qw/cat -v/ or die $!;
http://www.bioinfo.jp/tips.html#setuid

上記はとてもわかりやすく書いてくれています。 引数

以下はperlsecにある例で、

    exec "echo $arg";		# 安全でない
    exec "echo", $arg;		# 安全 (シェルを使いません)

systemやopenなんかを使うときは引数で与えるのがポイント。 セキュリティ的にも安心だし、モダンだぜ!って事のようだ。

余談(perlsecは5.6の時のものみたいだけど、だいぶ前からモダンな(なんだろう?)書き方はちゃんと示されていたわけだ)

http://www.ipa.go.jp/security/awareness/vendor/programmingv1/a04_03.html

にもperlsecのソースが書いてあります。

汚染除去

$ENV{'PATH'} = '/bin:/usr/bin';                  ← PATH 環境変数を設定
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; ← IFS,CDPATH,ENV,BASH_ENV環境
                                                       変数を空にする

この汚染チェックについて調べた理由はファイルの追加がうまくいかなかった事。

具体的にはperlでテストプログラムを書いてシェル上でperl test_01.tなんかを実行した場合にはうまくいくんだけど、xmlrpcサーバとかにコマンドを投げてプログラムを実行しようとしたら、なぜかうまくいかない・・・ なんでだーとだいぶ悩みました。

うまくいかなかったのはPerlさんが気を利かせて汚染モードチェックをしてくれていたから。 危険な状態だったからうまく実行できなくしてくれていたわけかな。 汚染モード自体については何となく知ってはいたものの、ちゃんと調べるとよくわかっていなかったわけで。 環境変数の事とか、モダンなopenな書き方とかって、意味があるんだなあと言うのがわかった。 前から思っていたモダンって何?の意味が少しではあるけど身についた気がする。

あとperlのドキュメントはとてもいい文章だなと思ったのと、日本語訳してくれてる人たちには再度感謝ですわー

2009-07-30

vmwareでBundle::CPANしたらCompress::Zlib::gzopenが無いみたいな

なんかUndefined subroutine &Compress::Zlib::gzopen calledみたいにいわれちゃうんだけど

Scalar::Utilでこけた

ぐぐって

この辺がみてみたんだけど

http://d.hatena.ne.jp/lopnor/20071120/1195522440

http://d.hatena.ne.jp/holidays-l/20060906/p1

ーxsすればいい感じなのでgcc系足りないのかなとyum install gcc*でいれたら

うまくいったというメモ

セットアップしたてっていろいろ面倒ね

2009-07-10

Imlib2はgifアニメに対応していないのか

Image::Imlib2 save error: Unknown error at test.pl line 6.

みたいに怒られるんだけどなんでかなとしらべてみたらgifアニメに未対応とか。

Image::Infoで調べる

my $image_info = image_info( $imagefile );
print 'GIF ANIME' if($image_info->{GIF_Loop} eq 'forever');

Both GIF87a and GIF89a are supported and the version number is found as GIF_Version for the first image. GIF files can contain multiple images, and information for all images will be returned if image_info() is called in list context. The Netscape-2.0 extention to loop animation sequences is represented by the GIF_Loop key for the first image. The value is either "forever" or a number indicating loop count.

2009-06-05

moxyをインストール

だいぶ前にためしたっきりだったけど用事ができたのでMoxyをいれてみた。

svn co http://svn.coderepos.org/share/lang/perl/Moxy/trunk/ moxy

moxy最新版ゲット

svnでチェックアウトしただけだとconfig.yamlも生成されないので微妙にはまります。

ブログなんかにあるmoxyインストールブログはだいぶ古くて、Moxy自体だいぶそれからもバージョンアップしているっぽい。

最新のCPANモジュールゲットすればいいのかなといろいろためしてみたけど・・

./bin/moxysetup.sh ってのがあってこれ実行するとcoderepos.orgからmoxy推奨?のモジュールと引っ張ってきてインストールしてくれる。moxystart.shも作ってくれる。(基本これを実行すればいいのかも)READMEにはperl Makefile.PL;make;make installすればいいみたいに書いてあったけどどっちがいいのかな。

ただ自分の環境ではmoxystart.shでは

Any::Moose::is_moose_loaded is deprecated. Please use Any::Moose::moose_is_preferred instead at ../HTTP-Engine/lib/HTTP/Engine/Interface.pm line 39

などとでるので作られたmoxyディレクトリの中にできたMoxyの中にあるやつでやった

./moxy.pl -c ../config.yaml

さらにさらにNDMBがはいってないのでconfig.yamlをいじって

        dbm_class: DB_File

dbm_classがNDBM_FileをDB_Fileに変更したらとりあえずローカルのw3mからは実行できたっぽい たぶんインストール自体はなんとかうまくいったっぽ。

で自分のPCのfirefoxとかアクセスするとアクセスできなかった。 赤文字のログもでないので接続できてすらいないのかも? また明日にでも弄ってみてみる。

2009-04-03

CPANモジュール使って値のチェック

Data::Validate::Domain

http://search.cpan.org/~neely/Data-Validate-Domain-0.09/

ドメイン名、ホスト名が正しいかチェック

Data::Validate::IP

http://search.cpan.org/~neely/Data-Validate-IP-0.08/

IPアドレスが正しいかチェック

Email::Valid

http://search.cpan.org/~rjbs/Email-Valid-0.181/

メールアドレスのチェック、MXのチェックもする

Number::Phone

http://search.cpan.org/~dcantrell/Number-Phone-1.7001/

電話番号チェック

Data::Validate::URI

http://search.cpan.org/~sonnen/Data-Validate-URI-0.05/

URIチェック

Business::CreditCard

http://search.cpan.org/~ivan/Business-CreditCard-0.30/

クレジットカード

Net::Ping

http://search.cpan.org/~andyd/perl5.003_07/lib/Net/Ping.pm

ネットワーク疎通チェック

Data::Validate::Japanese

http://search.cpan.org/~dmaki/Data-Validate-Japanese-0.01001/lib/Data/Validate/Japanese.pm

ひらがな、かたかな

Date::Simple

http://search.cpan.org/~izut/Date-Simple-3.03/lib/Date/Simple.pm

日付チェック

Data::Password::Check

http://search.cpan.org/~chisel/Data-Password-Check-0.08/

パスワードの妥当性チェック

Algorithm::CheckDigits

http://search.cpan.org/~mamawe/Algorithm-CheckDigits-0.50/

チェックデジット

Lingua::JA::Romaji::Valid

http://search.cpan.org/~ishigaki/Lingua-JA-Romaji-Valid-0.02/lib/Lingua/JA/Romaji/Valid.pm

ローマ字チェック

2009-03-30

forとforeach

http://blog.livedoor.jp/dankogai/archives/51193858.html

http://d.hatena.ne.jp/yappo/20090330/1238360153

自分的にはあんまCスタイル使うこと無いので、あまり気にすることないなぁー

弾さんの記事をみて、foreachをいつもforって書いてる自分は、あれforとforeachって名前違うだけで同じものだよね?

と思っていたので、まjすかとおもった。 いつもforeachって鬱のがめんどいのでforと打っていたからだ

でもよく見るとc-styleの場合なので、ああなるほどとおもいました。 うっかりさんの人は要注意ですね

2009-02-14

perlのテストprove

モダンPerl入門買った

で、大変勉強になったわけだけど、テストとかいろいろやってみてprove便利だなーとおもって

catalystディレクトリでproveしたらエラーになる。 perl Makefile.PL;make testはいけるけど、 単にパスが見つからないだけで、

use FindBin;
use lib "$FindBin::Bin/../lib";

すればいいだけなんだけど、そういうものなのかなーと思った。

テストにuse lib付けないのはなんか理由があるのかなあと思いメモ

追記

id:charsbar makeするのが面倒ならprove -l t/でもいい。こうやってテスト対象のlibがかわりうるのでテストではふつうuse lib '../lib'しない

id:lestrrat それやるなら、perl Makefile.PL; make; prove -b t/; makeしないとblibにpmが配置されない。proveするときに-bつけないとblibが発見されない。

コメントいただけるとは思ってなかったので汗

http://mt.endeworks.jp/d-6/2009/02/post-98.html

今のところ「わからない」という意見が出てない

なんか第1号になりそう、、ありがとうございます。

Test::Harness

http://search.cpan.org/dist/Test-Harness/

prove

http://search.cpan.org/~andya/Test-Harness-3.14/bin/prove

とりあえずテストの経験値が絶対的に不足してるので、いろいろとやってはいますが、テストってはまりますね。 1個でもエラーでると先に進めないし、もういいかなとおもってたやつにテスト欠けると見事にこけたり。

2008-12-12

mod_perllite

mod_perlliteなるものはてぶで知りました。

これまさにいまのmod_phpみたいに楽に高速に使えるソリューションかもしれぬ!

そしてこれはまさにPerlがサンデープログラマーと、フリーウェブアプリケーションの王座をPHPから奪回するものだ! SixApart++++とかおもったりしたのですが、これ2007からいじってないんですかね。 persistentperlとかspeedycgiみたいにならないことをいのりつつ とりあえず試してつつ、開発が進むのをお祈りしてみる。