tokuhirom@株主の日記 このページをアンテナに追加 RSSフィード

 | 

2005-11-26

Sledge::Plugin::Validator のドキュメント 00:09 Sledge::Plugin::Validator のドキュメント - tokuhirom@株主の日記 を含むブックマーク

typo 発見。

Index: Sledge/Plugin/Validator/email_loose.pm
===================================================================
--- Sledge/Plugin/Validator/email_loose.pm      (revision 855)
+++ Sledge/Plugin/Validator/email_loose.pm      (working copy)
@@ -64,7 +64,7 @@
 ただし @ の前の . は許可します。

 このチェックは、標準では読み込まれません
-chekcメソッドで、EMAIL_LOOSE を設定しておくか、
+checkメソッドで、EMAIL_LOOSE を設定しておくか、
 load_function('email_loose') で チェック定義を読み込んでください。

 =back

まぁ、こんなのはどうでおもいいんだけど、SubversionPerl モジュールを管理してると、diff 取りやすくて良いよね。すげー楽。

勉強発表資料 19:49 勉強会発表資料 - tokuhirom@株主の日記 を含むブックマーク

なんとなく気分がノってきたので、ほげほげと書いた。

てか、hiki で s5 できるプラグインって無いの?

Livedoor Wireless 17:45 Livedoor Wireless - tokuhirom@株主の日記 を含むブックマーク

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:170)


root cause 

java.lang.NullPointerException
	com.livedoor.wireless.request.action.DrawMap.execute(DrawMap.java:67)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:170)


note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.


--------------------------------------------------------------------------------

Apache Tomcat/5.0.28

Sledge::Plugin::Validator を Data::Properties でホゲる術 その3 13:11 Sledge::Plugin::Validator を Data::Properties でホゲる術 その3 - tokuhirom@株主の日記 を含むブックマーク

SixApartミヤガワマンYAML の方がよくね?というアドバイスにより思いついた。

---
func:
    cdbi_unique: %s はユニークじゃないよ
    email:       %s が電子メイルアドレスとして正しくありません
    not_null:    %s が空です
param:
    email: Eメールアドレス
    tel:   電話番号
ambi:
    email.not_null: 電子メールアドレスを入力してください

こっちの方がいいじゃん!

email.*    = 電子メイルアドレス
*.not_null = %s が空です

だと、数が増えた時に .* が醜いのでー。

これいいじゃん!やっぱ YAML にしよっと。

Sledge::Plugin::Validator を Data::Properties でホゲる術 その2 09:27 Sledge::Plugin::Validator を Data::Properties でホゲる術 その2 - tokuhirom@株主の日記 を含むブックマーク

かなり良い感じになってきた。

こうやって書けるとなると、Sledge::Plugin::Validator の元々の機能の奴なんて、もう使ってられないね!

Index: Validator.pm
===================================================================
--- Validator.pm        (revision 855)
+++ Validator.pm        (working copy)
@@ -2,12 +2,17 @@

 use strict;
 use vars qw($VERSION);
+use base qw(Class::Accessor);
 $VERSION = '0.13';

 use Carp;
 use vars qw($AUTOLOAD);
 use UNIVERSAL::require;
+use FileHandle;
+use Data::Properties;

+__PACKAGE__->mk_accessors(qw(messages));
+
 sub import {

       my $class = shift;
@@ -31,6 +36,7 @@
                       #
                       $self->{valid} = Sledge::Plugin::Validator->new(
                               LOAD_FUNCTION => [qw(default japanese)],
+                MESSAGE_FILE  => eval {$self->create_config->validator_message_file},
                       );

                       $self->$vali_page();
@@ -118,6 +124,9 @@
       if (defined $option{LOAD_FUNCTION}) {
               $self->load_function($_) for (@{$option{LOAD_FUNCTION}});
       }
+    if (defined $option{MESSAGE_FILE}) {
+        $self->load_messages($option{MESSAGE_FILE});
+    }

       return $self;
 }
@@ -265,6 +274,86 @@
 }

 # -------------------------------------------------------------------------
+# エラーメッセージの生成
+#
+# -------------------------------------------------------------------------
+sub get_error_messages {
+    my $self = shift;
+
+    die "Please set the message file" unless $self->messages;
+
+    # エイリアスをパラメータをキーにしたハッシュにする
+    my %alias;
+    while (my ($alias, $params) = each %{$self->{ALIAS}}) {
+        for my $param (@{$params}) {
+            $alias{$param} = $alias;
+        }
+    }
+
+    my %log_for; # 同じの二回出さないために記録しておく
+    my @messages;
+    while (my ($param, $result) = each %{$self->{ERROR}}) {
+        # エイリアス効いてたら、そっち使う
+        if (defined $alias{$param}) {
+            $param = $alias{$param};
+        }
+
+        for my $type (keys %{$result}) {
+            next if exists $log_for{"$param.$type"}; # すでに出てる
+            push @messages, $self->get_error_message($param, $type);
+            $log_for{"$param.$type"} = 1;
+        }
+    }
+
+    return @messages;
+}
+# -------------------------------------------------------------------------
+# エラーメッセージの取得
+# Usage: $self->valid->get_error_message('email', 'NOT_NULL');
+#
+# -------------------------------------------------------------------------
+sub get_error_message {
+    my $self  = shift;
+    my $param = shift;
+    my $type  = shift;
+
+    $type = lc($type);
+
+    my $ambi_msg  = $self->messages->get_property("$param.$type");
+    my $param_msg = $self->messages->get_property($param);
+    my $type_msg  = $self->messages->get_property("*.$type");
+
+    if ($ambi_msg) {
+        return $ambi_msg;
+    } elsif ($type_msg && $param_msg) {
+        if ($type_msg =~ /%s/) {
+            $type_msg =~ s/%s/$param_msg/;
+            return $type_msg;
+        } else {
+            return $param_msg . $type_msg;
+        }
+    } else {
+        die  "$param.$type is not defined in message file.";
+    }
+}
+
+# -------------------------------------------------------------------------
+# プロパティファイルを設定する
+#
+# -------------------------------------------------------------------------
+sub load_messages {
+    my $self = shift;
+    my $path = shift;
+
+    my $handle = FileHandle->new($path) or
+                Sledge::Exception::PropertiesNotFound->throw("$path: $!");
+
+    my $prop = Data::Properties->new;
+    $prop->load($handle);
+    $self->messages($prop);
+}
+
+# -------------------------------------------------------------------------
 # $valid->is_FUNCTION で読み込まれているチェックを読むことができる
 #
 # -------------------------------------------------------------------------

Sledge::Plugin::Validator を Data::Properties でホゲる術 08:23 Sledge::Plugin::Validator を Data::Properties でホゲる術 - tokuhirom@株主の日記 を含むブックマーク

http://blog.shebang.jp/archives/50247763.html

id:ikebeブログで、ヴァリデータの文言を Data::Properties にいれとくとウマーであるよー、的なことが書いてあって、これはウマーっぽいなあ、と俺も共感したわけであるよ。

なので、試しに、Sledge::Plugin::Validator を Data::Properties でメッセージ書けるように拡張してみた。まだ作り途中なので、ザックリした感じのコードですが、一応さらしておきます。

昨日書いたみたいに

*.not_null           = が入力されていません
email                = イーメールアドレス
login_id.cdbi_unique = そのログインIDは既に使われています

みたいに書けて便利っぽい。一度作ればどこのサイトでも使いまわせそうな気もするし。

Index: Validator.pm
===================================================================
--- Validator.pm     (revision 855)
+++ Validator.pm     (working copy)
@@ -2,12 +2,18 @@

 use strict;
 use vars qw($VERSION);
+use base qw(Class::Accessor);
 $VERSION = '0.13';

 use Carp;
 use vars qw($AUTOLOAD);
 use UNIVERSAL::require;
+use FileHandle;
+use Data::Properties;
+use Data::Dumper;

+__PACKAGE__->mk_accessors(qw(messages));
+
 sub import {

        my $class = shift;
@@ -31,6 +37,7 @@
                        #
                        $self->{valid} = Sledge::Plugin::Validator->new(
                                LOAD_FUNCTION => [qw(default japanese)],
+                MESSAGE_FILE  => eval {$self->create_config->validator_message_file},
                        );

                        $self->$vali_page();
@@ -118,6 +125,9 @@
        if (defined $option{LOAD_FUNCTION}) {
                $self->load_function($_) for (@{$option{LOAD_FUNCTION}});
        }
+    if (defined $option{MESSAGE_FILE}) {
+        $self->load_messages($option{MESSAGE_FILE});
+    }

        return $self;
 }
@@ -265,6 +275,48 @@
 }

 # -------------------------------------------------------------------------
+# エラーメッセージの生成
+# FIXME: エイリアスの扱い
+#
+# -------------------------------------------------------------------------
+sub error_messages {
+    my $self = shift;
+#warn Dumper($self->{ERROR});
+#warn Dumper($self->{ALIAS});
+    my $props = $self->messages or die "Please set the message file";
+    my @messages;
+    while (my ($param, $result) = each %{$self->{ERROR}}) {
+        for my $type (keys %{$result}) {
+            $type = lc($type);
+            if ($props->get_property("$param.$type")) {
+                push @messages, $props->get_property("$param.$type");
+            } elsif ($props->get_property($param) && $props->get_property("*.$type")) {
+                push @messages, ($props->get_property($param) . $props->get_property("*.$type"));
+            } else {
+                die  "$param.$type is not defined in message file.";
+            }
+        }
+    }
+    return @messages;
+}
+
+# -------------------------------------------------------------------------
+# プロパティファイルを設定する
+#
+# -------------------------------------------------------------------------
+sub load_messages {
+    my $self = shift;
+    my $path = shift;
+
+    my $handle = FileHandle->new($path) or
+                Sledge::Exception::PropertiesNotFound->throw("$path: $!");
+
+    my $prop = Data::Properties->new;
+    $prop->load($handle);
+    $self->messages($prop);
+}
+
+# -------------------------------------------------------------------------
 # $valid->is_FUNCTION で読み込まれているチェックを読むことができる
 #
 # -------------------------------------------------------------------------

連番 08:15 連番 - tokuhirom@株主の日記 を含むブックマーク

http://subtech.g.hatena.ne.jp/drawnboy/20051126/p1

wget http://www.example.com/{0..9}.jpg とかすると複数ファイルを一括取得可

2chUNIX 板でもっとも役にたつと言われていたあのスレ一生懸命勉強したものですなぁ。

berrettei-fabieneberrettei-fabiene2006/09/12 17:30Next week is when the earnings period really starts to heat up, said Chris Johnson, market strategist at Schaeffers Investment Research. <a href= "http://www.resellrightproducts.com/cgi-bin/rrp.pl?listing=888&cat=111&seqfrom=65" >resellrightproducts com</a> I dont want to call it a litmus test, but I think investors are likely to take a cue from what happens <a href= "http://www.berrettei-fabiene.com/html_links_3.html" >berrettei-fabiene </a> http://www.berrettei-fabiene.com/html_links_3.html

 |