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の引数付きで実行出来るようです。 続きを読む...
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
一部関数の戻り値が文字列のはずが配列となっていたのを修正
続きを読む...2008年12月28日
DBICでNOT LIKE
下記のようにすればいいっぽいです。にしても、DBICとかましてやCatalystとかになると情報が少なくて結構辛いです。my $hit = $schema->resultset('テーブル名')->search({ 列名 => {'NOT LIKE', '%' . $target . '%'} });
Web系の開発をメインでやっている訳ではないので、たまに使おうとするとフレームワークの更新追いかけるだけで一苦労。
でも、各種脆弱性への対応を考えるよりは面倒なところはフレームワーク任せにした方が楽だと思いますし、学習コストととの兼ね合いが難しい限りです。
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以下に置くと自動認識されてしまってちゃんと動作しないので、ライブラリのサーチパスのどこかに置いて頭に「+」をつけてモジュール名で指定すると良いみたいです。
と言うか、ここら辺の仕掛けは↓のリンク先を読むのが手っ取り早いです。
2006年10月11日
FormValidator::Simple::Auto
これは、
最初、この問題に気が付かずハマリ、次にこの問題を何とか回避できないかとはまって結果的にかなりの時間を浪費してしまいました。
結論から言うと私はCatalyst::Plugin::FormValidator::Simple::Autoを使うのをすっぱりあきらめました。
(この問題だけ別に記述などして回避したとしても余計ソースが混乱するだけですし)
と言うか、色々やってみてYAMLに記載すべきなのは日本語メッセージなどローカライズに必要なものと、せいぜい簡単なconfig値までにとどめておくべきだと思いました。
何でもYAMLでやりたい人も居るかも知れませんが、一通り使ってみて正規表現の記述の煩雑さやタブが使えないなど微妙な点が多いマイナーなマークアップランゲージを覚えてまで全ての設定を記述すべき必要性は無いかと思います。
(むしろ何かあったら教えてください)
2006年09月30日
YAML::Syckの罠
YAML::SyckがインストールされているとCatalyst::Plugin::ConfigLoaderで正規表現が展開できません。たとえばYAMLでPerlの正規表現を書く場合
なんていう風に書きますが、YAML::Syckが入って居るとfoo: !perl/regexp: REGEXP: '^hoge$'
なんていう風に展開されます。'foo' => bless( { 'REGEXP' => '^hoge$' }, 'regexp:' ) },
ちなみにYAML::Syckなしの場合
と正常に展開されます。'foo' => qr/(?-xism:(?:^hoge$))/
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に依存してしまいました。
続きを読む...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を見てみると、
なるほど、"@DEFINE"っていう書式が悪いらしい。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'}, );
とりあえず、定数で代入してやればmake出来そうだったのでPerl5.8.0環境でCPANをかけてインストールしてみたところ@DEFINEの中身はNULLで良いようだったので
'DEFINE' => "",と書き換えて今度は手動でmake・・・成功( ̄▽ ̄)ノ
make testも成功したのでmake installでさっくりインストールしました。
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) } }
2004年05月18日
PerlでCGIの作成をしているときに手元じゃちゃんと動くのにサーバに上げると500 サーバーエラーがでてしまうときがあります。 こういうときはWEBサーバのエラーログにどのようなエラーが出たか書いてありますが、サーバによってはエラーログのファイルがユーザには見えないようにしてあることも多々あります。
そうい
(1)の続き 前回、各foo、barそれぞれのオプションの引数を文字でとか数値でとかという風に書きましたが、実際は「オプション名=1文字」という書式で1文字の部分(記述子といいます)でどう処理するか決めています。
記述子の対応は以下のようになってます。
s文字列 i整数値(負の数を含む) f実数値(負の数を含む) <
GetOptionsに関するわかりやすい説明が見つからなかったのでちょっとやってみます。 まず、もっとも単純な構造は以下の通り use Getopt::Long; $ret = GetOptions("foo","bar"); print "$ret:$opt_foo/$opt_bar"; 上記の例ではオプション「foo」「bar」があるかどうかを確認出来ますので以下のように perl test.pl -foo -ba
成功しても失敗しても全く同じ結果を返してくれるへっぽこ装置操作コマンドを何とかしなければいけなくなりました。
ただ、幸いにも失敗の場合は5秒未満、成功の場合は15秒前後でプログラムが停止してくれるので、実行実時間を見れば成功したか失敗したかどうか判別するWrapparが書けそうです。 他との整合性の都合
Perlで作っていたプログラムのCSVデータソートがあまりにも重い・・・
1万件ぐらいのソートをさせるとCPU全部喰らったあげく3秒ぐらい掛かります(苦笑) プログラムは下記のような感じでsort条件を関数化することで切り出してたのですが、さすがに限界を感じて別の方法を模索しました。 @sortedcsv = sort {&sortsplt(3
CPANを使ってperlのモジュールを追加しようと思ったのですがftp://ftp.kddlabs.co.jp/CPAN/につながらない模様。
っていうか、リトライしても全部同じところにつなぎに行っているっていうことは、kddlabs.co.jpしかCPANのURLリストに入ってないじゃん・・・_| ̄|○ なので、さっくりリストを追加してみました。 手
ちょっと特殊なデータを展開するために2000万ループほどするperlのプログラムを書いてみました。 実行したらP4 2.8GHzのマシンでおおよそ30秒・・・
この程度の速度ならいいんですが、そのプログラムを今後実行させるロートルなSunのマシンで走らせたら・・・630秒_| ̄|○ Cで書き直す決意をしました(笑) ちなみ
しょっちゅう忘れるのでメモ たとえば今日の元旦からの通算日をコマンドラインでぱっと求めるならこんな感じ
perl -e 'print "${[localtime(time)]}[7]\n"' 読み出したcsv形式の行をソートしてから配列に入れるならこんな感じ
$line = sort @{[split(/,/,$CSVline)]}
Dynamic DNSでDynDNSさんを用いていますが、こちら35日間更新がないとホスト名消されてしまうのがちょっと不便です。 そういうときWindowsだとDiCEなんかを使って自動更新しますが、私はLinuxから自動更新したかったので使ってません。 そこで、普通はddclientなんていうものを使うみたいですが、私の使い方とはこれともち