2011年01月25日

ocraでrubyに引数渡して実行

rubyスクリプトを簡単にWindowsのExeファイルに変換できるocraですが、実行時にどうしてもrubyに「-E utf-8」引数を渡して実行させたくて、どうにかならないかと調べてみました。

で、ソースを覗いたところ以下のような改変で可能な事がわかったので忘備録として載せておきます。

ocraの本体のrubyスクリプト(RubyInstaller for Windowsの1.92を標準インストールで利用して、「gem install ocra」していた場合はC:\ruby192\lib\ruby\gems\1.9.1\gems\ocra-1.2.0\bin\ocra)を開いて、484行目の

"#{rubyexe} \"\xff\\" + Ocra.dospath(target_script) + "\"#{extra_arg}")
の行を
"#{rubyexe} -E utf-8 \"\xff\\" + Ocra.dospath(target_script) + "\"#{extra_arg}")
のように書き換えれば作成されるExeファイルでもrubyの引数付きで実行出来るようです。

続きを読む...

Posted by Takuchan at 00:30 | コメント (0) | トラックバック(0)

2011年01月05日

RubyからFastHash.dllを使う

昨年前半にRubyで重複排除機能付きのアプリケーションを作成する際に、なるべく早くハッシュの計算を行うために作成したRubyのモジュールです。

ハッシュの計算にFastHash.dllを用いることでRuby標準よりは早く計算できると思います。
(複数ハッシュの同時計算を行うのが目的だったので、単純計算での速度差は計っていませんが・・・)

まぁ、RubyからDLLを使うための習作半分ですので、そんなのでよろしければご利用ください。

マニュアルや使い方はこちら→ fasthash.rbのドキュメント

2011/01/08 0.2.1

Ruby 1.9系では「require 'Win32API'」が無いとエラーになっていたため修正しました。

2011/01/13 0.2.2

一部関数の戻り値が文字列のはずが配列となっていたのを修正

続きを読む...

Posted by Takuchan at 22:28 | コメント (0) | トラックバック(0)

2008年12月28日

DBICでNOT LIKE

下記のようにすればいいっぽいです。
my $hit = $schema->resultset('テーブル名')->search({
  列名 => {'NOT LIKE', '%' . $target . '%'}
});
にしても、DBICとかましてやCatalystとかになると情報が少なくて結構辛いです。

Web系の開発をメインでやっている訳ではないので、たまに使おうとするとフレームワークの更新追いかけるだけで一苦労。

でも、各種脆弱性への対応を考えるよりは面倒なところはフレームワーク任せにした方が楽だと思いますし、学習コストととの兼ね合いが難しい限りです。

Posted by Takuchan at 05:58 | コメント (0) | トラックバック(0)

2006年11月26日

stashとconfig

Catalystでの話。

$c->configには普通ConfigLoaderなどで初期値のみを入れて読み出しのみでしか使いませんが、実はこの値、上書き可能だったりします。

そうすると、$c->stashの様にグローバル値として使えるのですが、注意しないといけないのが、この値はstashと異なり、呼び出し単位で初期化されないと言うことです。

まぁ、Catalystのアプリのどこかに

die ++$c->stash->{'test'};
die ++$c->config->{'test'};
のそれぞれを埋め込んで動作を確認して頂ければ解ると思いますが、stashが呼び出しごとに初期化されて必ず1が返るのに対して、configの方ではどんどん数字が増えていきます。
(ただし、サーバ側でアプリが常駐しない仕様になっているとこちらも1になるかと思います)

なら、ちゃんとstashとconfigを使い分ければいいじゃないという話になるのですが、YAMLに記載されたconfig値を読み込んでから加工して戻したいと言った用途の際に困ります。
(たとえばURLリストにベースパスを付加して戻したいと言った用途の場合)

まぁ、戻すときにconfig出はなくstashに戻してそちらを用いる手や使うところで毎回ベースパスを追加すると言う手もあるのですが、せっかく一度読み込んだらその後常駐終了まで保持してくれる値を何度も計算したくないので、こういう場合は自作のPulginを作成してそれのsetupメソッドにconfigの値を操作させれば一度しか呼び出されないので楽です。

あと、自作プラグインはlib/MyApp以下に置くと自動認識されてしまってちゃんと動作しないので、ライブラリのサーチパスのどこかに置いて頭に「+」をつけてモジュール名で指定すると良いみたいです。

と言うか、ここら辺の仕掛けは↓のリンク先を読むのが手っ取り早いです。

Catalystでちゃんとしたアプリ作るのならこれを読んでおいた方が良いと思います。

Posted by Takuchan at 22:17 | コメント (0) | トラックバック(0)

2006年10月11日

FormValidator::Simple::Auto

こちらでもかかれていますがには問題があってパスワードなどの確認入力と同一かどうか調べる'DUPLICATION'チェックを表現できません。

これは、

では「DUPLICATION」チェックの際にキー自体をハッシュ値で指定しなければならないと言うSimple形式にそろえるために複雑になると言う非常に不思議な仕様になっているのと、YAMLの仕様でキーになる部分が複数値になることを許さないというのが見事に相反している為です。

最初、この問題に気が付かずハマリ、次にこの問題を何とか回避できないかとはまって結果的にかなりの時間を浪費してしまいました。

結論から言うと私はCatalyst::Plugin::FormValidator::Simple::Autoを使うのをすっぱりあきらめました。
(この問題だけ別に記述などして回避したとしても余計ソースが混乱するだけですし)

と言うか、色々やってみてYAMLに記載すべきなのは日本語メッセージなどローカライズに必要なものと、せいぜい簡単なconfig値までにとどめておくべきだと思いました。

何でもYAMLでやりたい人も居るかも知れませんが、一通り使ってみて正規表現の記述の煩雑さやタブが使えないなど微妙な点が多いマイナーなマークアップランゲージを覚えてまで全ての設定を記述すべき必要性は無いかと思います。
(むしろ何かあったら教えてください)

Posted by Takuchan at 22:20 | コメント (0) | トラックバック(0)

2006年09月30日

YAML::Syckの罠

YAML::SyckがインストールされているとCatalyst::Plugin::ConfigLoaderで正規表現が展開できません。

たとえばYAMLでPerlの正規表現を書く場合

foo: !perl/regexp:
 REGEXP: '^hoge$'
なんていう風に書きますが、YAML::Syckが入って居ると
'foo' => bless( {
 'REGEXP' => '^hoge$'
  }, 'regexp:' )
 },
なんていう風に展開されます。

ちなみにYAML::Syckなしの場合

'foo' => qr/(?-xism:(?:^hoge$))/
と正常に展開されます。

続きを読む...

Posted by Takuchan at 22:51 | コメント (0) | トラックバック(0)

2006年09月28日

Catalyst始めました

久々にPerlでアプリ一つ作ることになりました。

一人開発でそんなに大きいモノではない&クローズドな用途なのでいつも通り適当にフルスクラッチで拵えようかと思ったのですが、体調崩して気が付いたらだいぶ尺が無くなりました。

小物とはいえ、その状態からフルスクラッチ+仕様変更が入ると死ねそうだったのと、Ruby on Railsを知ってからフレームワークでの作成が気になっていた事もあり、一発逆転を狙ってCatalystを導入(笑)

で、この手のフレームワークはPHPのを使うのが相場らしいですが、PHPよりは圧倒的にPerlの方が好きと言うことがあり、あえてPerlのフレームワークを使うことにしました。
(でも、ここが茨の道のスタートライン(笑))

他にもPerlのフレームワークには

なんて言うのも有るようですが、こちらはさすがに若すぎて趣味の小物以外にはまだ使えない感じ

で、Catalystのセットアップ方法は各所のサイトを参考にして貰うと言うことで、個人的に困った点だけ。

まずは、インストールがめちゃくちゃ大変。

必要なパッケージがめちゃくちゃ多いのでディストリビューターの方でパッケージを準備していない場合は、RPMインストールはほとんど無理っぽい感じです。

(素のCatalystまでだったらCPAN2RPMなんかを駆使することで何とか入れられそうですが、実際使うためにCatalystのPlug-inを入れようと思うと、それこそのべ100ぐらいのPerlモジュールが必要そうな感じです)

今度こそRPMで全てを管理したかったんですが、結局今回もPerl周りはCPANに依存してしまいました。

続きを読む...

Posted by Takuchan at 01:48 | コメント (0) | トラックバック(0)

2004年08月24日

Text::Iconv

Text::IconvをPerl5.6環境にインストールしようといつも通り
Perl -MCPAN -e shell
cpan> install Text::Iconv
したところ下記のようなエラーに遭遇
In string, @DEFINE now must be written as \@DEFINE at Makefile.PL line 89, near "@DEFINE"
Execution of Makefile.PL aborted due to compilation errors.
何がいけないんだろうと思ってとりあえずエラーになった
~/.cpan/build/Text-Iconv-1.4/Makefile.PL
を見てみると、
WriteMakefile(
    'NAME'              => 'Text::Iconv',
    'VERSION_FROM'      => 'Iconv.pm', # finds $VERSION
    'PREREQ_PM'         => {}, # e.g., Module::Name => 1.1
    ($] >= 5.005 ?    ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM => 'Iconv.pm', # retrieve abstract from module
       AUTHOR        => 'Michael Piotrowski <mxp@dynalabs.de>') : ()),
    'LIBS'              => $config{LIBS},
    'DEFINE'            => "@DEFINE",
    'INC'               => $config{INC},
    'dist'              => {COMPRESS => 'gzip', SUFFIX => 'gz'},
);
なるほど、"@DEFINE"っていう書式が悪いらしい。

とりあえず、定数で代入してやればmake出来そうだったのでPerl5.8.0環境でCPANをかけてインストールしてみたところ@DEFINEの中身はNULLで良いようだったので

'DEFINE' => "",
と書き換えて今度は手動でmake・・・成功( ̄▽ ̄)ノ

make testも成功したのでmake installでさっくりインストールしました。

続きを読む...

Posted by Takuchan at 10:34 | コメント (0) | トラックバック(0)

2004年05月19日

配列の比較の時に

Perlで配列Aに含まれて居て配列Bに無いものを抽出しようとして
foreach (@arrA){
 unless(grep(/^$_$/,@arrB)){
  push(@newarr,$_)
 }
}
というのを書いたんですが、これがうまく動かない。

どうも調べて見ると配列Bが一件も無い場合は良いのですが、配列Bに1件でも要素があると配列Aの要素が全て配列Bにあると判断される模様。

まぁ、世の中には

とか便利なモジュールがあるのでそれに頼っても良いんですが、上記で動くはずなのに動かないのはどうにも癪なので、調べてみたところ
  • 注意: $_ は配列値への参照となっているので、配列要素を変更するのに用いることができる。これは便利である一方、 LIST が名前のついた配列でない場合には、ちょっと変な結果を返すことがある。
これか_| ̄|○

確かに同時に書き換えられたら便利な時もあるけど、かなりハマる仕様だなぁ(苦笑)

というわけで

foreach my $var (@arrA){
 unless(grep(/^$var$/,@arrB)){
  push(@newarr,$var)
 }
}
としたらちゃんと動作するようになりました( ̄▽ ̄)ノ

Posted by Takuchan at 14:52 | コメント (0) | トラックバック(0)

2004年05月18日

7Wiki

たった7行でこれだけのものが動いちゃうんですねぇ。っていうスレがあることは知ってましたが、Wikiまで動くことには正直感動しました。

時間があるときにスレ全部読んでみようっと。

Posted by Takuchan at 12:47 | コメント (0) | トラックバック(0)

その他のエントリ
CGIのデバッグ 2004年04月10日 23:59

PerlでCGIの作成をしているときに手元じゃちゃんと動くのにサーバに上げると500 サーバーエラーがでてしまうときがあります。 こういうときはWEBサーバのエラーログにどのようなエラーが出たか書いてありますが、サーバによってはエラーログのファイルがユーザには見えないようにしてあることも多々あります。
そうい

GetOptions(2) 2004年03月12日 14:23

(1)の続き 前回、各foo、barそれぞれのオプションの引数を文字でとか数値でとかという風に書きましたが、実際は「オプション名=1文字」という書式で1文字の部分(記述子といいます)でどう処理するか決めています。
記述子の対応は以下のようになってます。
s文字列 i整数値(負の数を含む) f実数値(負の数を含む) <

GetOptions(1) 2004年03月07日 00:48

GetOptionsに関するわかりやすい説明が見つからなかったのでちょっとやってみます。 まず、もっとも単純な構造は以下の通り use Getopt::Long; $ret = GetOptions("foo","bar"); print "$ret:$opt_foo/$opt_bar"; 上記の例ではオプション「foo」「bar」があるかどうかを確認出来ますので以下のように perl test.pl -foo -ba

処理中に経過実時間の取得 2004年03月06日 00:58

成功しても失敗しても全く同じ結果を返してくれるへっぽこ装置操作コマンドを何とかしなければいけなくなりました。
ただ、幸いにも失敗の場合は5秒未満、成功の場合は15秒前後でプログラムが停止してくれるので、実行実時間を見れば成功したか失敗したかどうか判別するWrapparが書けそうです。 他との整合性の都合

ソートの高速化 2004年02月20日 09:41

Perlで作っていたプログラムのCSVデータソートがあまりにも重い・・・
1万件ぐらいのソートをさせるとCPU全部喰らったあげく3秒ぐらい掛かります(苦笑) プログラムは下記のような感じでsort条件を関数化することで切り出してたのですが、さすがに限界を感じて別の方法を模索しました。 @sortedcsv = sort {&sortsplt(3

CPANのサーバー追加 2003年11月07日 09:55

CPANを使ってperlのモジュールを追加しようと思ったのですがftp://ftp.kddlabs.co.jp/CPAN/につながらない模様。
っていうか、リトライしても全部同じところにつなぎに行っているっていうことは、kddlabs.co.jpしかCPANのURLリストに入ってないじゃん・・・_| ̄|○ なので、さっくりリストを追加してみました。 手

perlでループ 2003年09月22日 23:30

ちょっと特殊なデータを展開するために2000万ループほどするperlのプログラムを書いてみました。 実行したらP4 2.8GHzのマシンでおおよそ30秒・・・
この程度の速度ならいいんですが、そのプログラムを今後実行させるロートルなSunのマシンで走らせたら・・・630秒_| ̄|○ Cで書き直す決意をしました(笑) ちなみ

perlで関数の戻り値のリスト形式を配列として扱う 2003年09月17日 17:08

しょっちゅう忘れるのでメモ たとえば今日の元旦からの通算日をコマンドラインでぱっと求めるならこんな感じ
perl -e 'print "${[localtime(time)]}[7]\n"' 読み出したcsv形式の行をソートしてから配列に入れるならこんな感じ
$line = sort @{[split(/,/,$CSVline)]}

DynDNSへの自動登録スクリプト 2003年07月31日 14:34

Dynamic DNSでDynDNSさんを用いていますが、こちら35日間更新がないとホスト名消されてしまうのがちょっと不便です。 そういうときWindowsだとDiCEなんかを使って自動更新しますが、私はLinuxから自動更新したかったので使ってません。 そこで、普通はddclientなんていうものを使うみたいですが、私の使い方とはこれともち