perlモジュール



2013年 5月 28

MySQL – SELECT … WHERE id IN (..) – correct order – Stack Overflow

という事で、MySQLでこんなSQLが使えるとの事。

SELECT * FROM table WHERE id IN (4,3,1) ORDER BY FIELD(id,4,3,1)

なので、PerlのORMであるDBIx::SkinnyでSQL組み立てられるのか実験してみる。

my @id_lists = (4,3,1);
$" = ",";  #"

my $rs = MyModel->resultset;
$rs->select([qw/*/]);
$rs->from(['entry']);
$rs->add_where('id' => { 'IN' => \@id_lists });
$rs->order({ 'column' => "FIELD(id, @id_lists)" });

warn $rs->as_sql;

----- 実行結果
SELECT *
FROM entry
WHERE (id IN (?,?,?))
ORDER BY FIELD(id, 4,3,1)

特殊変数 $” で 配列展開時の区切り文字を ,(カンマ) にしている。DBIx::Skinnyなんだから生のSQL使えばいい話だけど。かなり無理矢理だけど一応使えると言う事で。

参考

Filed under: MySQL,perlモジュール

Trackback Uri






2013年 5月 13

openssl-develをインストールしてからインストールする。

sudo yum install openssl-devel
cpanm Net-SSLeay

Filed under: CentOS6.x,perlモジュール,インストールメモ

Trackback Uri






2013年 2月 12

手軽に関連語を取得するモジュール – ダウンロードたけし(寅年)の日記

Lingua::JA::Expand は愛用させて頂いているperl moduleですが、近年のAPI不正利用対策の影響でYahoo!APIの利用規約が変更になります。

  • 検索Web APIにて新プランをリリースしました – Yahoo! JAPAN Tech Blog
  • xデーは2013年3月31日。Yahoo!プレミアム会員だと500回/day。これではちょっとだけ少ないし…。 という事で、Lingua::JA::Expand::DataSource::xxx を書けば使えそうなので書いてみた。

  • clicktx/Lingua-JA-Expand-DataSource-GoogleWebSearch · GitHub
  • 基本的にはWeb::Scraperでレスポンスを解析しているだけ。使うには Lingua::JA::Expandを継承したMyExpandクラスを作って、datasourceメソッドをオーバーライドする。

    package MyExpand;
    
    use base qw(Lingua::JA::Expand);
    
    # method overriding.
    sub datasource {
        my $self = shift;
        $self->_class_loader( datasource => 'DataSource::GoogleWebSearch' );
    }

    問題点

    googleの規約には

    本サービスを不正に利用しないでください。たとえば、本サービスの妨害や、Google が提供するインターフェースおよび手順以外の方法による本サービスへのアクセスを試みてはなりません。

    とあります。しかし、以前の規約である利用規約のアーカイブには、

    5.3 Google が提供するインタフェース以外の手段で、本サービスのいずれにもアクセスしないこと(またはアクセスを試みないこと)に同意するものとします。ただし、Google との別個の契約において明確な許可を受けた場合は除きます。特に、ユーザーは、いかなる本サービスについても、いかなる自動化された方法(スクリプトやウェブ クローラーの利用によるものを含みます)によりアクセスせず、アクセスを試みないことに同意し、また、本サービスに関して提示されるいかなる robots.txt ファイルにおける指示に従うものとします。

    と記されていたものが削除されているので、getリクエストで(botがアクセスしても)なら良くなったとも見える。いずれにしろ解釈の違いでどっちとも取れそうな気はするけど、普通に考えればアウトかな。

    あと、とりあえずokだとしてもそこそこのリクエストでアクセス拒否されますので実用性に欠けます。

    google

    某中華製検索エンジンには利用規約にも書いていないので、使うならそっちの方がいいかもね。Web::Scraperのprocessをちょっと変えればすぐに出来るはず。

    関連リンク

  • Takeshi Miki / Lingua-JA-Expand – search.cpan.org

  • Filed under: perlモジュール

    Trackback Uri






    2012年 12月 26

    FormValidator::LazyWay

    フォームのバリデーションルールをアプリケーションで統一出来るモジュールで、便利そうなので試してみたところ FormValidator::LazyWay::Rule::String の nonsymbol_ascii methodでハマったのでメモ。

    FormValidator::LazyWay::Rule::String – search.cpan.org

    ページの設定サンプルに

      username:
        rule:
          - String#nonsimbol_ascii:
              args:
                allow:
                  - '_'
                  - '-'

    という記述があるのだけれど、これが間違っていて nonsimbol_asciiではなく 正しくは nonsymbol_ascii。

    コレただのtypo。

    ハマった点はここではない。

    FormValidator::LazyWay::Rule::String のソースを見ると

    sub nonsymbol_ascii {
        my ($text, $args) = @_;
    
        if ( ref $args->{allow} eq 'ARRAY' ) {
            foreach my $allow ( @{$args->{allow}} ) {
                $text =~ s{$allow}{}xmsg;
            }
        }
    
        return $text =~ /^[a-zA-Z0-9]+$/ ? 1 : 0;
    }

    ってなっているのだけれど、実は第2引数に渡されるものが

    {
      'args' => {
                'allow' => [
                           '_',
                           '-'
                         ]
              }
    }

    となっていて、

    ref $args->{allow} eq 'ARRAY'

    が成り立たない。

    正しい設定は args: は要らなくて

      username:
        rule:
          - String#nonsimbol_ascii:
              allow:
                - '_'
                - '-'

    になる。

    if ( ref $args->{args}->{allow} eq 'ARRAY' ) { ではないかとも思うけど、他のruleのコード(FV::LW::Rule::Emailとか)を見るとドキュメントが間違っているだけだと思われます。

    ちょっとハマったけどこのモジュールは非常に便利そうな感じ。バリデーションのルールがあちこちに散らばるのを防げるので重宝しそうです。


    Filed under: perlモジュール

    Trackback Uri






    2012年 4月 6

    参考:Mac(Leopard) に DBD::SQLite をいれる時には注意 | Supernova

    参考ブログの手順だと

    Please use ‘o conf commit’ to make the config permanent!

    と怒られるのでちょと修正。

    sudo cpan
    cpan[1]> o conf commit makepl_arg USE_LOCAL_SQLITE=true
    commit: wrote '/Users/clicktx/.cpan/CPAN/MyConfig.pm'
    cpan[2]> install DBD::SQLite

    Filed under: Mac,perlモジュール

    Trackback Uri