$c->user_existsと$c->userについて*[CPAN][Catalyst]

(途中)

Catalyst::Plugin::Authenticationの設定値として、
use_sessionというものがあります。

use_session 

Whether or not to store the user's logged in state in the session, 
if the application is also using the Catalyst::Plugin::Session plugin. 
This value is set to true per default.

と、CPANには書かれているのですが、設定することでどのフローが変わるのか、よくわかりません。
で、調べてみて、一言で言うと、
(※Catalyst::Plugin::Authentication::Store::DBICを使う場合)

『もしセッションがあれば、認証チェック[$c->user_exists]のときに、
 セッションに$c->session->{__user}があれば認証OKとみなすYO!』

ってことです。
要するに、認証が通っているかどうかは、session->{__user}があるかないか イコール
sessionkeyである、cookieがあるかないかで判断される、ということです。

カニズムは非常にシンプル。

一方、$c->userのフローに目を向けてみると、

$c->userでは、 $c->session->{__user}の値で、(login_id)でサーチを行います。
ここで食い違いがあると、

$c->user内で$c->get_userは、

sub get_user {
  $c->{auth}{catalyst_user_class}->new( $id, @rest );

{デフォルトでは、catalyst_user_class = Catalyst::Plugin::Authentication::Store::DBIC::User}

sub new {
  my ( $class, $id, $config ) = @_; 

なので、
catalyst_user_classのnew(実際にdbアクセスするところ)は、

  1. $c->login(Credential::Password)
  2. $c->user(Authentication)

の2つから利用されることになります。

したがって、catalyst_user_classを拡張する場合に、
newメソッドを、ログインフォームからのことだけを考えて実装してはだめで、
$c->userとして、sessionに入っているlogin_idもこの引数となることを前提にしなければなりません。

ここでかなりはまりましたwww

正規表現のオプションメモ

$path = '/home/user/(__value1*value2__)/(__value2/1000__)/(__value3__)/test.txt';
replace_with_variables( $path, { value1 => 1, value2 => 2,  value3 => 1 } );

sub replace_with_variables {
    my ($path, $args) = @_;
    my $value1 = $args->{value1};
    my $value2 = $args->{value2};
    my $value3 = $args->{value3};

    my @vals = $path =~ /\(__(.+?)__\)/g;

    my $count = 0;
    my @regex_map = map{ $count++; ["__________${count}" => $_ ] } @vals;

    for(@regex_map){
        my $val_key = $_->[0];
        $path =~ s/\(__(.+?)__\)/$val_key/o;
    }

    for(@regex_map){
        $_->[1] =~ s/value1/$value1/g if $value1;
        $_->[1] =~ s/value2/$value2/g if $value2;
        $_->[1] =~ s/value3/$value3/g if $value3;

        my $error;
        {
            local $@;
            $_->[1] = eval( $_->[1] );
            $error = $@;
        }
        if($error){
            die 'eval missed';
        }

        my $key = $_->[0];
        my $val = $_->[1];
        $path =~ s/$key/$val/;
    }
    return $path;
}

というようなファイルパスを置換するモジュールを作成してたのですが、
最後の置換のところでちょっとしくったので、そこんとこメモ。

  $path =~ s/$key/$val/o;

と、正規表現オプションのoを付けると、

/home/user/2/__________2/__________3/test.txt

っとな、置換が1度しか実行されない状態になります。
オプションoをきちんと確認。

「 /o => パターンを1回だけコンパイルする 」

ううん、、しっくりこないので、また明日調べるよ。

FC6 ver.2869のyumレポジトリがおかしい件について

メモとして。

wmware player のインストール。
runme.pl(vmware-any-any-update)してもインストールがうまくいかないよぉ。

って、ことで社内のlinux神(Sさん)に神頼み。。
さすると、天の仰せが(ぉ

kernel-develのパッケージだけi585(それ以外はi686)になってて、
insmodで落ちちゃってるとのことでした。

rpm -Uvh kernel-2.6.18-1.2869.fc6.i686.rpm \
          kernel-devel-2.6.18-1.2869.fc6.i686.rpm \ 
          kernel-headers-2.6.18-1.2869.fc6.i386.rpm --force

「どっかのyumレポジトリがおかしいんじゃないかな...」
って、自分じゃ絶対気付けません、 :'(

svnの属性 各ファイル・ディレクトリへの付加情報 [svn:ignore]]

svnでは、ファイル・ディレクトリに付随するものとして、
「リビジョン」だけではなく、「属性」と呼ばれるものが存在します。

属性とは、ファイル・ディレクトリの付加情報を示します。
この属性は、属性名と属性値から成っており、

属性名 属性値
name1 var1

と設定することができます。
レポジトリには、「リビジョン」管理されて登録されます。

そして、属性名として、svnが既に規定しているものがいくつか存在します。

今回は、svn:ignoreについて。

svn:ignore

あるファイルやディレクトリを、レポジトリにいれたくない、svn statusで状態表示させたくない、
といったときに使用する属性になります。
属性の作成は、svn propsetコマンドで行い、
引数として、属性名と属性値、およびファイル(ディレクトリ)パスを渡します。

svn:ignore属性が取りうる値は、patternを表す文字列になります。

$ svn propset svn:ignore '*' trunk/tmp.txt

patternをひとつのファイルにまとめて共有化する場合

$ svn propset svn:ignore -F ignore_pattern.txt trunk/temporary/

ignore_patter.txt

temporary_*

上の例ではcommit後、
trunk/temporary/以下のtemporary_*という名前のファイルは無視されることになります。
なお、無視すべきファイルもsvn statusで表示させたい場合には、
--no-ignoreオプションを指定してください。

$ svn status --no-ignore

指定した属性と属性値を表示するコマンド。

$ svn proplist project -v
Properties on project:
  svn:ignore: *

また、svkではsvnと同様に動作します。

$ svk propset svn:ignore '*' .

SVK(subversionベースのバージョン管理ツール)

svkを触ってみました。

SVK-v2.0.0 - A decentralized version control system - metacpan.org

svkとは..subversionをベースとしてperlで作られたバージョン管理ツールです。


開発レポジトリのミラーを個人レポジトリとしてローカルに作成することができ、
全体(レポジトリ)への影響をコントロールしながら開発を進めていくことができます。

個人レポジトリであれば、自由にコミットできるし、(ソース管理を自由に行える)
好きなときに全体レポジトリへ反映することもできます。(手間なく本線にマージ)


svk インストール

svk インストール」でググると参考になるページが結構でてきますので、
ここでは割愛。
ただ、fedora coreの場合の簡単インストールだけご紹介です。(FC6で動作確認)

svkperlベースのツールなので、CPANから落とすことができます。

cpan -i 'SVK'

ただし、SVN::Coreが無いと怒られます。なのに、SVN::CoreはCPANにない..
subversionのパッケージに付いているようなので、yumインストール。

yum install subversion-devel(必要ないかも)
yum install subversion-perl

この際、yumで本体もいれてしまいましょう。

yum install perl-svk
yum install perl-SVN-Mirror

SVN::MirrorはCPANからだとうまく入らなかったので、こちらもyumで。


CPANではうまく入らないので、yumで...ってのが増えてきたなぁと感じるこの頃です。
Image::MagickやらDBD::mysqlやら...
coreのレポジトリだけでも50個もあるよ(*0*)
yum search perl- | grep core してみて。)
...yum様様です。


使い方

こちらも「svk 使い方」でググると結構でてきます。

などのサイトが参考になると思います。お世話になってます。m(_ _)m
って、これじゃナニなので。


svnの運用って、リビジョンがしがし上げていっても問題ないことも多いのですが、
1リビジョン1リビジョン大切に、って気持ち、svkは応援します。

svk push -l (--lump)

lumpオプションで、ローカルレポジトリへのコミット全てを
全体レポジトリへ1リビジョンのコミットとしてまとめてくれます。

全体レポジトリを大事にしたけりゃsvk. これ○○。

Catalyst::Plugin::Authentication::Store::DBIC::User - A user object representing an entry in a database. - metacpan.org
のrolesメソッドにおいて、
_search_rolesの実装、

  $search->{ "me.$role_field" } = { -in => \@wanted_roles } if @wanted_roles;

rolesのカラムを、not nullにすべき。(∵ -in)
(途中)