Myページ
ホーム
コミュニティの人々
ソフトウェア
技術紹介
適用分野
Tyzohとは
ご意見お問い合わせ

V.S.A. III

2007年6月アーカイブ

TGIF: パンシャーヌ終わる

こんにちは,五十嵐です. 『美少女戦麗舞(セレブ)パンシャーヌ』 が終わっちゃいました.実はまだ最終回を見てません.それにしても短かった.1 クールです.

「クール」 というのは元々ドイツ語で Kur だそうです.一年が 52 週間ですから,その四分の一,三ヶ月=13週間という単位のようです.最近のドラマは 13 回もなくて,10回そこそこで終わらせるものが多いようです.しかし,パンシャーヌの場合はどうでしょうね.

この手の特撮系番組の場合,スポンサーの商品が売れることが大切ですので,子供たちの目を釘付けにして親にねだらせるようにするわけですが,パンシャーヌを見ていたお子様はほとんどいなかったのではないかと...美少女とかいいながらとうが立った奥様でしたし,途中から投入したパンシャーヌミニはあまりにも幼女すぎたし...いわゆる 「打ち切られた」 というやつでしょうね.

アニメなどで人気が出ずに半年で打ち切り,というのはよく聞く話ですが,1 クールとなるとなかなか思いあたるものがありません.

それにしても三ヶ月というのは長いようで短く,短いようで長い.見通せるような気がしていても打ち切りのような羽目になってしまうとは,考えさせられるものがあります. 1 クール後に私が何をしているのか,その先を続けられるのか,ちゃんと見通せていません.打ち切られないように,新しいアイディアを捻出せねば...と,意気込みだけは見せておきましょう(笑)


"TGIF" とは,"Thank God, It's Friday!" の略.「花の金曜日」略して「花金」(笑) 毎週金曜恒例のお遊び/オタクモードです.


追伸:このブログ記事の ID が 1701 番でした.1701 といえば,かの 『宇宙大作戦』,『スタートレック』 のエンタープライズ (USS Enterprise) 号の番号 (NCC-1701) です.ちょっとうれしい.
(ねらってたわけじゃないよ )

 

【2008/05/12 追記】

新しいブログに移行したので、番号が1701ではなくなってしまいました。しょぼん...

いかちょー (2007-06-29 23:32) | コメント(0)| トラックバック(10)

(センスのいい)ちっちゃい画像求む!

こんにちは,五十嵐です.Secure-SBM のアイコンに使える画像のコントリビューションを募集中です.


私が作ると,こんなのしかできません.なんとかして,もうちょっときれいな,あるいは可愛らしいアイコンを使いたいのですけれど...



Gimp で定規を使って線を引くとかできないんでしょうか.使いこなせてないというのが原因の一つではあるんですが...
使いこなせてもセンスないし...


追加 ・ 編集編集 ・ 削除削除 ・ 実行実行 ・ キャンセルキャンセル ・ コメント入力コメント入力 辺りがそろうだけでも見栄えが変わると思ってます.だれか,助けてちょうだい.

上のように 64x64 くらいで作って,16x16 の大きさで使いたいのです.

チケットにファイル添付していただけるとうれしいんですけど.
http://dev.tyzoh.jp/trac/secure-sbm/ticket/17

tPod の命名じゃありませんが,採用された方には,GAINAX からいただいた,アニメ「天元突破グレンラガン」の非売品ドリル型消しゴム(首から提げるための穴もついてるぞ!)を差し上げます!

 

(センスのいい)ちっちゃい画像求む!の続きを読む

いかちょー (2007-06-28 17:37) | コメント(0)| トラックバック(13)

[Secure-SBM:017] ブックマークの登録(2)

こんにちは,五十嵐です.ブックマークを実際に登録する '/registbookmark' の処理を追加します.

lib/SecureSBM/Controller/Personal.pm:
sub registbookmark : Path('/registbookmark') {
    my ( $self, $c ) = @_; 
    my %data;
    my $uid = $c->stash->{user}->user_id;
    my $bookmark_exist = 0;
    my $bdb;

    # URL から直接ブックマークの場合
    if( $c->req->method eq 'GET' ){
        $c->stash->{template} = 'personal/getregistbookmark.tt';
    }   

    foreach my $k (qw/
            bookmark_title
            bookmark_url
            bookmark_tags
            bookmark_comment
            /
    ){
        $data{$k} = Jcode::jcode($c->req->param($k))->utf8;
    }
ここはお決まりの部分.form からの入力を受け取ります.GET method を確認しているのは,form を経由せずに URL で直接アクセスした場合の処理を行うためです.

URL の空欄チェックを行います.
    # URL の確認
    if( $data{bookmark_url} eq '' ){
        $c->flash->{resultmessage} = 'URL が入力されていません';
        $c->res->redirect('/personal');
        return 1;
    }

URL が確認できたところで,ブックマークの既登録確認を行います.
    my $url = $data{bookmark_url};

    # Bookmark の既存確認
    if( $bdb = $c->model('SecureSBMDB::Bookmark')->
        find( {bookmark_uri => $url} )
    ){
        if( my $ubdb = $c->model('SecureSBMDB::UserBookmark')->
                find( {user_id => $uid, bookmark_id => $bdb->bookmark_id} )
        ){
            $c->flash->{resultmessage} = $url . ' は既に登録されています.';
            $c->res->redirect('/personal');
            return 1;
        }
        $bookmark_exist = 1;
    }

stash の代わりに flash を使用してリダイレクトしています.ブックマークが存在していても他人が登録したものの場合には,関連づけを行うために $bookmark_exist = 1 を設定しておきます.

 

[Secure-SBM:017] ブックマークの登録(2)の続きを読む

いかちょー (2007-06-27 14:53) | コメント(0)| トラックバック(19)

[Secure-SBM:016] View セキュアフィルタ

こんにちは,五十嵐です.ブックマーク登録の続きを書くつもりでしたが,プログラムが多くなる前にクロスサイトスクリプティング (XSS) 対策をやっておきます.View::TT のフィルタの機能を使って, < や > などを "&lt;" や "&gt;" と出力するようにします.入力されたデータにスクリプトなどが含まれている場合の対策です.

フィルタの詳しい説明は 「Template::Manual::Filters - Standard filters」 に書かれています.もっとも必要と思われるのは "html" フィルタです.
引用:
Converts the characters '<', '>', '&' and '"' to '&lt;', '&gt;', '&amp;', and '&quot;' respectively, protecting them from being interpreted as representing HTML tags or entities.

これで,一応,XSS 対策がとれます.html_entity というフィルタもありますが,これを使うと日本語もすべてコードに変換されてしまいます.試してみましたが,decode 処理が必要になりますので,html フィルタを使うことにしました.entity については W3C の 「24 Character entity references in HTML 4」 を参照するとよいでしょう.

全ては書きませんが,データベースからの output を次のように変更します.
root/template/admin/listroles_center.tt
@@ -70,7 +70,7 @@
 <tr><td><button id="editrole_button[% role_v.role_id  %]">
        編集</button></td>
        <td><button id="deleterole_button[% role_v.role_id %]">
         削除</button></td>
        <td align="right">[% role_v.role_id %]</td>
-       <td>[% role_v.role_name %]</td>
+       <td>[% role_v.role_name | html %]</td>
 </tr>
 
 <tr>
ポイントは,データベースからの出力部分に,"html" というフィルタをかけていることです.これをおこなう前は,スクリプトがそのまま出力されてしまいましたが,これによってスクリプトの実行などを抑えることができます.しかし一方で,出力それぞれに perl のフィルタが呼ばれるので,実行速度が遅くなるという欠点があります.

2007/03/26,27 記

注: ブログの内容は,開発途中で記述しているため,現在の実装とは異なる場合があります.

参考:

Keyword: Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク

 

いかちょー (2007-06-26 05:20) | コメント(0)| トラックバック(3)

Secure-SBM Version 0.2.0 リリース

こんにちは,五十嵐です.
Secure-SBM (セキュア・ソーシャル・ブックマーク) の Version 0.2.0 をリリースしました.

上のリンクからダウンロードしてください.インストール方法は同じページにある 「インストールと実行環境構築」 からどうぞ.プラットフォームは Linux です.

紹介ページからの引用:
Secure-SBM とは,"Secure Social BookMark" の略です.「ソーシャルブックマーク」は,ホームページをブックマークして,それを他人と共有しようというものです.Secure-SBM はさらにそれを一歩進めて,ブックマークをグループ分けして,共有する人と共有しない人を明確にわけようというものです.セキュア・ソーシャル・ブックマークは,アクセス制御に焦点を当てたソーシャル・ブックマークです.ソーシャル・ブックマークはブックマークを共有するシステムですが,企業内などで使用する場合には,参照するユーザによって見えるブックマークの範囲を限定する必要があります.Secure-SBM は企業の組織などで使用することを前提としています.

Ver 0.2.0 では Secure-SBM として最小限の機能を提供しています.ソーシャル・ブックマークとしてみても,まだまだ機能がそろっていません.

もう少し機能がそろってからとも考えたのですが,そうするといつになるかわからないので,思い切ってリリースしました. Catalyst のサンプル 程度にはなるかと思います.

以前書いたブログ 『社内ソーシャルブックマークの 「目的」 と必要とされる 「機能」』 (2006/04/12) で以下のようなことを書いています.

引用:
必要な機能を思いつくままに列挙してみましょう.まず,個人レベルから.

* URL が簡単に入力できる.
* ブックマークのタイトルが簡単に入力でき,編集できる.
* ブックマークに個人でコメントがつけられ,編集できる.
* ブックマークを個人が分類できる(ラベルなどの機能).
* 過去のブックマークを検索できる.
* ブックマークした日時がわかる.
* とりあえずブックマークしたものか,価値あるものとしてブックマークしたものかわかる.

次に,共有の観点から.

* ブックマークされている数がわかる.
* 他人のコメントが読める.
* 共有の分類ができる.
* 他人のブックマークの日時がわかる.
* ブックマークの増加傾向がわかる.
* 他の複数人とブックマークが共有できる.

最後に,秘密区分(セキュリティ)の観点から.

* 見る権限があるものが見れる.
* 見る権限のないものが見れない.
* ブックマークの公開レベルを強制的に設定できる.
* ブックマークの公開レベルをユーザが許された範囲で設定できる.

このうち,Ver. 0.2.0 では以下のものが 実装されていません


これらの未実装部分は,今後の作業に入れていく予定です.ただし,「共有の分類ができる」については,実装しない可能性があります.「とりあえずブックマークしたものか,価値あるものとしてブックマークしたものかわかる」については,タグ付けによって自分で分類できると解釈しています.

インストールができない,動作の不具合,要望等がありましたら,お気軽にチケットを登録してください.上に列挙した「共有の分類ができる」以外の 3 件はチケットに登録済みです.チケットにはいろいろなフィールドがありますが,わからなければ,そのままにしておいて入力してください.適宜修正します.

現在予定されている作業項目は, 「未解決チケット(マイルストーン別)」 で管理しています.

 

いかちょー (2007-06-25 09:03) | コメント(0)| トラックバック(0)

TGIF: 日本動画協会

こんにちは,五十嵐です.先週の TGIF 「アニメ技能検定」の話は,日経新聞に堂々と載っていたのですが,経済産業省は知らんぷりしているようですね.どこにも公式な情報はないようです.天下の日経新聞に載ったのですから,ガセネタということはないと思うのですが...

ところで,「日本動画協会」というのがあるのを初めて知りました.sato さんなんかは知ってるのかもしれませんが.この協会の正式名称は 「有限責任中間法人日本動画協会」です.「有限責任中間法人」 ですよ.JPCERT/CC などと同じ.そう思うと,ここって,どこかの省庁の息がかかっているんだろうなぁと想像してしまいますね.(「有限責任中間法人」ってそういう意味じゃないでしょうけど)

面白いのは,ここの沿革を読むと,平成17年に 『財団法人機械システム振興協会受託事業「ユビキタス社会における携帯型映像コンテンツ再生機器及び著作権保護システムに関する調査・研究」 実施』 などとあります. 「ユビキタス」と書くと反応しそうな人がこの Tyzoh コミュニティにはたくさんいそうです.(沿革が未だに平成 17 年で終わってる辺りが,ちょっと胡散臭い感じがします)

真面目にこのサイトを隅から隅まで覗いてみようかな.なんかいろんな意味で(笑)掘り出し物がありそうです.

"TGIF" とは,"Thank God, It's Friday!" の略.「花の金曜日」略して「花金」(笑) 毎週金曜恒例のお遊び/オタクモードです.

いかちょー (2007-06-22 23:59) | コメント(0)| トラックバック(8)

[教えて]Catalyst の debug メッセージを出力させないようにする方法

こんにちは,五十嵐です.他力本願 「教えて」 シリーズ(笑)...Perl Catalyst で debug メッセージを出さなくする方法がわからず,ハマっています.

マニュアルには
引用:
-Log

Specifies log level.

と書いてあるので,アプリケーション(仮に MyApp とする)のトップファイル MyApp.pm のなかで,

use Catalyst qw/
                -Log=info
                ...

とかやれば良さそうなんですが...

/usr/lib/perl5/site_perl/5.8.8/Catalyst.pm の処理は

    foreach (@arguments) {

        if (/^-Debug$/) {
            $flags->{log} =
              ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
        }
        elsif (/^-(\w+)=?(.*)$/) {
            $flags->{ lc $1 } = $2;
        }
        else {
            push @{ $flags->{plugins} }, $_;
        }
    }
... 略 ...
    $class->setup_log( delete $flags->{log} );

となっていますから,'-Log=info' で処理されそうなものなのですが,これを設定しても相変わらず $c->log->debug('...') と記述した部分はログに表示されてしまいます.

環境変数で CATALYST_DEBUG=0 に設定して実行してもユーザ設定メッセージは表示されてしまいます.同じ Catalyst.pm のなかで,
sub setup_log {
    my ( $class, $debug ) = @_;

    unless ( $class->log ) {
        $class->log( Catalyst::Log->new );
    }

    my $app_flag = Catalyst::Utils::class2env($class) . '_DEBUG';

    if (
          ( defined( $ENV{CATALYST_DEBUG} ) || defined( $ENV{$app_flag} ) )
        ? ( $ENV{CATALYST_DEBUG} || $ENV{$app_flag} )
        : $debug
      )
    {
        no strict 'refs';
        *{"$class\::debug"} = sub { 1 };
        $class->log->debug('Debug messages enabled');
    }
}

setup_log() がこんな風になっていますから,info とか設定してあっても関係ないという感じですね.何か見落としているかなぁ.

どうやったら $c->log->debug('...') と書いたメッセージを実行時に表示させなくできるのでしょうか.自分で,コード書かなきゃだめか?

MyApp.pm に以下のような記述を setup の前後に追加してみました.
+if( ! defined $ENV{CATALYST_DEBUG} ){
+       $ENV{CATALYST_DEBUG} = 0;
+}
+
 __PACKAGE__->setup;
 
+if( $ENV{CATALYST_DEBUG} == 0 ){
+       __PACKAGE__->log->disable('debug');
+}
+

これで,script/myapp_server.pl を -d オプションなしで実行すれば,デバッグメッセージは出なくなります.-d オプションを付けるか,環境変数で CATALYST_DEBUG=1 とやれば,デバッグメッセージが出力されます.でも,なんとなくかっこ悪い...

もっとスマートな方法がきっとあるはずですよね.教えて Catalyst の偉いひと!

 

いかちょー (2007-06-22 21:47) | コメント(0)| トラックバック(8)

[Secure-SBM:015] ブックマーク登録(1)

こんにちは,五十嵐です.ソーシャル・ブックマークの心臓部分,ブックマークの登録部分を作っていきます.

ブックマークを登録する際には URL の他にタイトルを取得できると便利です.もちろん,タイトルが適切に付いていないページもありますので,自分で編集できることも条件になります.表示しているページをボタンひとつでブックマークできれば便利ですが,それは段階を追って,いずれ作ることにして,ここでは手で URL を入力して,そのページのタイトルを取得し,必要があればタイトルを編集した後,登録するという手順で作業できるようにします.これらが /personal のページで操作可能とします.
右図のように DHTML と非同期通信を使用した Ajax で,ページの切り替えをおこなわなくて済むようにデザインします.

 

[Secure-SBM:015] ブックマーク登録(1)の続きを読む

いかちょー (2007-06-20 15:24) | コメント(0)| トラックバック(0)

[javascript] 変数が定義されているかどうかをチェックする

こんにちは,五十嵐です.javascript で動的に作成された変数が定義されているかどうかを確認したいんですが...

<script type="text/javascript">
<!-- 
for( num = 0; num < 4; num++ ){
  eval("var a_" + num + " = new Array(1,2,3,4);");

  document.write( 'a_' + num + ': ' + eval('a_' + num) + "<br />" );

  eval('delete a_' + num);

  try{
    eval("var tmp = a_" + num);
  }catch(e){
    document.write( "a_" + num + " Error: " + e + "<br />" );
    eval("var a_" + num + " = new Array(11,12,13,14);");
  }

  document.write( 'a_' + num + ': ' + eval('a_' + num) + "<br /><br />" );
}
// -->
</script>

こんな感じでしょうか.try-catch だと大仰な気がするんですが,もうちょっとお手軽な方法がないでしょうか.いい方法があったら教えてください.>> javascript の人


実行結果:


【追記 2007/06/20】
"window.hasOwnProperty" というのがあるのですね.知りませんでした.勉強不足がバレバレ...

<script type="text/javascript">
<!-- 
function _isDefined( obj ){
  if( window.hasOwnProperty( obj ) ){
    return true;
  }
  return false;
}

for( num = 4; num < 8; num++ ){
  eval("var a_" + num + " = new Array(1,2,3,4);");

  if( _isDefined( "a_" + num ) ){
    document.write( 'a_' + num + ': ' + eval('a_' + num) + "<br />" );
  }

  eval('delete a_' + num);

  if( ! _isDefined( "a_" + num ) ){
    document.write( "a_" + num + " is NOT defined.<br />" );
    eval("var a_" + num + " = new Array(11,12,13,14);");
  }

  document.write( 'a_' + num + ': ' + eval('a_' + num) + "<br /><br />" );
}
// -->
</script>

実行結果:


こっちの方が好みかも.

<script type="text/javascript">
<!-- 
function _isDefined2( obj ){
  if( obj in window ){
    return true;
  }
  return false;
}

for( num = 8; num < 12; num++ ){
  eval("var a_" + num + " = new Array(1,2,3,4);");

  if( _isDefined2( "a_" + num ) ){
    document.write( 'a_' + num + ': ' + eval('a_' + num) + "<br />" );
  }

  eval('delete a_' + num);

  if( ! _isDefined2( "a_" + num ) ){
    document.write( "a_" + num + " is NOT defined.<br />" );
    eval("var a_" + num + " = new Array(11,12,13,14);");
  }

  document.write( 'a_' + num + ': ' + eval('a_' + num) + "<br /><br />" );
}
// -->
</script>

実行結果:

 

いかちょー (2007-06-19 23:50) | コメント(0)| トラックバック(39)

[Secure-SBM:014] 各コントロールへの認証

こんにちは,五十嵐です.全体像を見ながら (「[Secure-SBM:002] 全体像」 参照) ,admin 用の認証を追加します.全体の認証は lib/SecureSBM.pm の auto アクションで行いました ( 「[Secure-SBM:012] いよいよ認証」 参照) ので,Admin のコントロールに auto アクションを追加します.auto アクションの役割については 「[Secure-SBM:013] ひと休み」 をご覧ください.

lib/SecureSBM/Contoroller/Admin.pm:
sub auto : Private {
        my ( $self, $c ) = @_;

        if( $c->user_exists ){
                if( $c->user eq 'admin' ){
                        return 1;
                }else{
                        $c->res->redirect($c->uri_for('/personal'));
                        return 0;
                }
        }
        $c->res->redirect($c->uri_for('/'));
        return 0;
}
まず,認証が済んでいるかどうかを "$c->user_exists" で確認します.認証が済んでいなければ '/' へリダイレクト,済んでいても 'admin' ユーザではなければ '/personal' へリダイレクトします.admin ユーザだけが,このコントローラで定義したアクションを利用することができます.

同様に Login.pm も変更します.
lib/SecureSBM/Controller/Login.pm:
@@ -42,7 +42,7 @@
                        if( $loginname eq 'admin' ){
                                $c->res->redirect($c->uri_for('/admin'));
                        }else{
-                               $c->res->redirect($c->uri_for('/')); 
+                               $c->res->redirect($c->uri_for('/personal')); 
                        }
                        return;
                } else {


[Secure-SBM:014] 各コントロールへの認証の続きを読む

いかちょー (2007-06-18 13:14) | コメント(0)| トラックバック(6)

TGIF: アニメ技能検定

こんにちは,五十嵐です.昨日 6 月 14 日付けの日経新聞朝刊に「経済産業省がアニメ技能検定」という内容の記事が載っていたんですが,一日たっても Google には引っかからない.でも「クールジャパン」の一環ということらしいです.

こうやって文化が築かれていくのかもしれませんが,私がよぼよぼになるころには,アニメ技能の無形文化財の人とか現れたりして...

「技能」の検定ですから,アニメオタク度検定ではありません(たぶん(笑)).それにしてもアニメの技能って,何を検定するんでしょうね.作画の検定とか手作業モーフィング技術とか...

アニメの世界は昔のように紙でかいてセル画におこしてという時代でもなくなってきたようです.ここでも IT 技術が活躍し,「セル画」なんか無いものもあるとか.背景画なんかはまだ紙の絵からおこしたりすることもあるらしいですが,これも完全にコンピュータアートにとってかわられる日も遠くないでしょう.この検定,実は,IT オペレーション検定だったりして...

配信だって,放送からインターネットへシフトしてきています.インターネットの動画を見ることを前提にしたテレビも発売されてきていますし.

と考えると,文部科学省じゃなくて経済産業省がやってるってあたりが見えてきますね.(たぶん,総務省とかも関係するわけだ.麻生外務大臣が言い出しても驚かないけど.)


"TGIF" とは,"Thank God, It's Friday!" の略.「花の金曜日」略して「花金」(笑) 毎週金曜恒例のお遊び/オタクモードです.

いかちょー (2007-06-15 15:02) | コメント(0)| トラックバック(1)

[Secure-SBM:013] ひと休み

こんにちは,五十嵐です.認証の話に入る前にちょっとひと休み.今回は,今までに端折った部分をいくつか書いてみます.

まずはテンプレート.基本は "[%" と "%]" で囲んだ部分が自動的に展開されます.IF-ELSE-END 文や FOREACH 文などを書くことができ,変数を使って制御が可能です.詳しい文法は "Template::Manual::Syntax - Directive syntax, structure and semantics" を参照するとよいでしょう.

次に,SHA-1 のハッシュ値の作成.admin 用のパスワードとして "admin" というパスワードを設定しましたが,これは Perl の Digest::SHA モジュールを使ってハッシュ値を作成しました.("Catalyst::Manual::Tutorial::Authentication - Catalyst Tutorial - Part 4: Authentication" に記載されています.)
$ perl -MDigest::SHA -e 'print Digest::SHA::sha1_hex("admin"), "\n"'
d033e22ae348aeb5660fc2140aec35850c4da997
$ 
ここで表示された "d033e22ae348aeb5660fc2140aec35850c4da997" をデータベースの初期値として使用しています.

これも書き忘れたかもしれません.script/securesbm_server.pl は,"-r" オプションを付けると,catalyst の環境を監視して,ファイルが変更されると自動的に再起動してくれます.
$ ./script/securesbm_server.pl -r
...(省略)
File(s) "...(省略)/Controller/Admin.pm" modified, restarting
...(省略)



ついでに,環境変数 DBIC_TRACE=1 を設定しておくと,DBIC から発行された SQL を見ることができます.

ここで Catalyst の "Action" について少し書いておきます.
ビルトインアクションと呼ばれるものが 5 つあります.default, index, begin, end, auto.これらの動きを理解しておくと,Catalyst の動作を使って,色々な実行をさせることができます.

 

[Secure-SBM:013] ひと休みの続きを読む

いかちょー (2007-06-14 17:31) | コメント(0)| トラックバック(18)

[Secure-SBM:012] いよいよ認証

こんにちは,五十嵐です.管理者用のページができましたので,認証の仕組みに入っていきます.admin だけが /admin のページにアクセスできるようにします.

まず,DBIx::Class の認証の仕組みを使うために,Plugin を設定します.

lib/SecureSBM.pm
@@ -16,6 +16,14 @@
                Charsets::Japanese
 
                StackTrace
+
+               Authentication
+               Authentication::Store::DBIC
+               Authentication::Credential::Password
+
+               Session
+               Session::Store::FastMmap
+               Session::State::Cookie
                /;
 
 use Digest::SHA;
6 つの Plugin を読み込むように設定します.

つぎに,securesbm.yml ファイルにユーザ名やパスワードのデータベーステーブルがどのようになっているのかを設定します.

securesbm.yml
authentication:
  dbic:
    user_class:           SecureSBMDB::User
    user_field:           user_email
    password_field:       user_password
    password_type:        hashed
    password_hash_type:   SHA-1

何度も繰り返しますが,.yml のファイルはタブコードを使用せずに,空白でインデントを付けてください.この設定は前に設定した Plugin のためのものです.各フィールドの意味は次の通り.

 

[Secure-SBM:012] いよいよ認証の続きを読む

いかちょー (2007-06-12 09:36) | コメント(0)| トラックバック(0)

daemon の書き方を忘れてしまいました

こんにちは,五十嵐です.久しぶりに Linux 上の C 言語で daemon (常駐) プログラムを書こうと思い立ったのですが,書き方を完全に忘れてしまいました.

  1. 標準入出力(fd=0,1),エラー出力(fd=2)を含めてファイルを close する.
  2. tty を切り離す.
  3. セッショングループを切り離す.
  4. カレントディレクトリを / にする.
  5. fork() して親は死に,子プロセスは処理を続ける.
  6. シグナルハンドリングを設定する.
  7. syslog の設定をする(ログの出力処理)


他に何が必要でしたっけ...なんか,順番も大切だったような...

検索したらすぐに出てきそうですけど,完全に他力本願.

 

daemon の書き方を忘れてしまいましたの続きを読む

いかちょー (2007-06-11 13:18) | コメント(0)| トラックバック(0)

Sunがソーシャルブックマークを公開

こんにちは,五十嵐です.Sun Microsystems 社からオープンソースのソーシャルブックマークソフトが出ているそうです.知らなかったぁ...

やっぱり,デザインセンスとかいいですねぇ.うーん,Secure-SBM Ver. 0.2 を出すのが恥ずかしくなってきました...ショックの色は隠せません.こうして,休日に Tyzoh ブログを書いているのが,何よりの証拠...

微妙に狙うところが違うので,いいのかもしれませんが,どうもねぇ.
とりあえず,出すだけ出しちゃって,世の中に揉んでもらった方がいいのか.
Powered by Sun Microsystems に対して,こちらは Powered by オレ,だし.

もうちょっと "Secure" の部分に力入れんと,差別化が図れないですね.
ま,いずれは tPod と SSDB と連携するという大義名分はあるわけですけど.

こういうの↓は見て見ぬふりをしてました.


Scuttle のコードとか覗いてみたいんですが,パクったってことになるとイヤですから,ねぇ...

 

いかちょー (2007-06-09 17:16) | コメント(0)| トラックバック(35)

TGIF: 桃が熱い!

こんにちは,五十嵐です.円谷プロからのメールマガジンで何の脈絡もなく「今年は桃が熱い。」というタイトル.これは暗に桃太郎をモチーフにした仮面ライダー電王がいいぞ,ってことだと思ってますが...仮面ライダー電王は円谷ではなくて東映です(笑)

こういうのは比較広告じゃなくて,何というのでしょうね.他社の方を持ち上げてるわけですから,非難も出ないでしょうし.なんかいい感じ.

比較広告と言えば 「マック」 と 「パソコン」 の CM は面白いですね.ここまでやってもいいのか,と心配してしまうくらいの敵愾心むき出し.欧米の文化の流れでしょうか.完全にホームユースをターゲットにしているので,サーバー関連の話は出てきませんが,そこんところも考えないとね.

少し前には,「パソコン」 の方がフリーズしやすいとか,ウィルスにかかりやすいとかいう比較もしてました.でもねぇ,いくらなんでも最近の「パソコン」で固まってしまって,リブートしないとにっちもさっちもいかないという状況は全く経験していません.家でも仕事でも.もっとヘビーに使うホームユーザだと違うのかなぁ.OS が古ければそういうこともあるでしょうけれども...

ウィルスに関しては 「マック」 も 「パソコン」 も似たようなもんでしょう.むしろ, 「マック」 の方がウィルス対策の選択肢が少ないのではないかと心配になります.余計なお世話?

私はマックを全く触ったことがないので DTP にすぐれているという噂しか知りません.作家の方は歴史的な経緯で 「マック」 ユーザが多いそうですが.この比較広告を見ただけで食指が動くかというと...率直なところ,やりすぎていて,眉唾な感じがしてしまいます.
みなさんはどうですか?


"TGIF" とは,"Thank God, It's Friday!" の略.「花の金曜日」略して「花金」(笑) 毎週金曜恒例のお遊び/オタクモードです.

P.S. 今晩は 「帰ってきた時効警察」 の最終回.お見逃しなく!

 

いかちょー (2007-06-08 20:13) | コメント(0)| トラックバック(7)

カレンダー Ajax 風

こんにちは,五十嵐です.昨日の javascript カレンダーがけっこうウケたみたいなので,調子に乗って,Ajax 風に作ってみました.本当は Ajax でもなんでもなくて,単に DOM を操作しているだけなんですが...

"<<" や ">>" をクリックしてみてください.

日付の数字には,その日に書かれたこの Tyzoh ブログへのリンクを作成してみました.ただし,ブログが書かれていないかどうかは検査していませんので,ブログのない日もあります.このリンクは全然 Ajax 風ではありません(笑)



ソース:
<div id="calendar"></div>

<script type="text/javascript">
<!-- 
function getDayOfTheWeek(year, month, day) {
    if( month < 3 ){
        month += 12;
        year--;
    }

    return (
        year
        + Math.floor( year / 4 )
        - Math.floor( year / 100 )
        + Math.floor( year / 400 )
        + Math.floor( (13 * month + 8) / 5 ) + day
        ) % 7;
}

function make_calendar( year, month, curyear, curmonth ){
    var days = new Array(31, 28, 31, 30, 31, 30, 31, 31,  30, 31, 30, 31);
    if( (((year % 4) == 0)&&((year % 100) != 0)) || ((year % 400) == 0) ){
        days[1]=29;
    }

    var startday = getDayOfTheWeek(year, month, 1);
    var lastday = days[month-1];

    var lastmonth = month - 1;
    var nextmonth = month + 1;
    var lastyear = year;
    var nextyear = year;

    if( lastmonth == 0 ){
        lastmonth = 12;
        lastyear--;
    }
    if ( nextmonth == 13 ) {
         nextmonth = 1;
         nextyear++;
    }

    if( month < 10 ){
        smonth = "0" + month;
    }else{
        smonth = "" + month;
    }

    var calhtml = "";

    calhtml += "<table align=\"center\">";

    calhtml += "<tr><td>";
    calhtml += "<span onmouseover=\"style.cursor='pointer';\" "
            + "onclick=\"rewriteCal("
            + lastyear + "," + lastmonth + ","
            + curyear + "," + curmonth + ")\">"
            + "&lt;&lt;</span></td>";
    calhtml += "<td colspan=\"5\" align=\"center\">"
            + "<a href=\"archive.php?date="
            + year + smonth + "\" target=\"_blank\">"
            + year + "&nbsp;年&nbsp;" + month + "&nbsp;月</td>";
    calhtml += "<td>"
    calhtml += "<span onmouseover=\"style.cursor='pointer';\" "
            + "onclick=\"rewriteCal("
            + nextyear + "," + nextmonth + ","
            + curyear + "," + curmonth + ")\">"
            + "&gt;&gt;</span></td></tr>";

    calhtml += "<tr><td>日</td><td>月</td><td>火</td><td>水</td>";
    calhtml += "<td>木</td><td>金</td><td>土</td></tr>";

    var cols = 0; 
    if( startday != 0 ){
        calhtml += "<tr>";
        for( cols = 0; cols < startday; cols++ ){
            calhtml += "<td>&nbsp;</td>";
        }
    }

    for( day = 1; day <= lastday; day++ ){
        if( cols == 0 ){
            calhtml += "<tr>";
        }
        if( day < 10 ){
            sday = "0" + day;
        }else{
            sday = "" + day;
        }
        calhtml += "<td align=\"right\">"
                + "<a href=\"index.php?date="
                + year + smonth + sday + "\" target=\"_blank\">"
                + day + "</a></td>";                
        cols++;
        if( cols >= 7 ){
            calhtml += "</tr>";
            if( day < lastday ){
                cols = 0;
            }
        }
    }
    for( i = cols; i < 7; i++){
        calhtml += "<td>&nbsp;</td>";
    }

    calhtml += "</tr>";
    calhtml += "<tr><td colspan=\"7\" align=\"right\">";
    calhtml += "<span onmouseover=\"style.cursor='pointer';\" "
            + "onclick=\"rewriteCal("
            + curyear + "," + curmonth + ","
            + curyear + "," + curmonth + ")\">"
            + "今月へ</span></td></tr>";
    calhtml += "</table>";

    return calhtml;
}

function _getElementById( id ) {
    var elem;
    if( document.getElementById ){ // for NS, IE>=5
       elem = document.getElementById( id );
    }else if( document.all ){ // for IE < 5
       elem = document.all( id );
    }else{
       elem = null;
    }
    return elem;
} // end of _getElementById()

function rewriteCal(year,month,curyear,curmonth){
    var cal = make_calendar( year, month, curyear, curmonth );
    _getElementById("calendar").innerHTML = cal;
}

var today = new Date();
var curyear = today.getFullYear();
var curmonth = today.getMonth() + 1;
rewriteCal(2007,6,curyear,curmonth);
// -->
</script>


【追記】
ブログを連続して表示した場合に,昨日のブログ内に記述した javascript と衝突が起こり,正しく動作しない場合がありました.単独で使用する場合にはソースとして表示している javascript で問題ありませんが,このブログでは不都合なため,実際のコードは関数名などを変更して回避しています.

 

いかちょー (2007-06-08 17:02) | コメント(0)| トラックバック(20)

カレンダー

こんにちは,五十嵐です.突然ですが,javascript でカレンダーを作成してみました.「ツェラーの公式」というのを使って,月の最初の日の曜日を算出します.
Zellerの公式

0 が日曜とすると,与えられた「年」「月」「日」の曜日は
     (年 + 年/4 - 年/100 + 年/400 + (13*月+8)/5 + 日) % 7
となる.
(ただし 1月,2月は前年の13月,14月として計算する)

だそうです.これを使って,今月のカレンダーを javascript で表示.



ソース:

<script type="text/javascript">
<!-- 
function getDayOfTheWeek(year, month, day) {
    if( month < 3 ){
        month += 12;
        year--;
    }

    return (
        year
        + Math.floor( year / 4 )
        - Math.floor( year / 100 )
        + Math.floor( year / 400 )
        + Math.floor( (13 * month + 8) / 5 ) + day
        ) % 7;
}

function make_calendar( year, month, curyear, curmonth ){
    var days = new Array(31, 28, 31, 30, 31, 30, 31, 31,  30,31, 30, 31);
    if( (((year % 4) == 0)&&((year % 100) != 0)) || ((year % 400) == 0) ){
        days[1]=29;
    }

    var startday = getDayOfTheWeek(year, month, 1);
    var lastday = days[month-1];

    var calhtml = "";
    calhtml += "<table align=\"center\">";
    calhtml += "<tr><td>日</td><td>月</td><td>火</td><td>水</td>";
    calhtml += "<td>木</td><td>金</td><td>土</td></tr>";
 
    var cols = 0;
    if( startday != 0 ){
        calhtml += "<tr>";
        for( cols = 0; cols < startday; cols++ ){
            calhtml += "<td>&nbsp;</td>";
        }
    }

    for( day = 1; day <= lastday; day++ ){
        if( cols == 0 ){
            calhtml += "<tr>";
        }
        calhtml += "<td align=\"right\">" + day + "</td>";                
        cols++;
        if( cols >= 7 ){
            calhtml += "</tr>";
            if( day < lastday ){
                cols = 0;
            }
        }
    }
    for( i = cols; i < 7; i++){
        calhtml += "<td>&nbsp;</td>";
    }
    calhtml += "</tr></table>";
    return calhtml;
}

var today = new Date();
document.write( today.getFullYear() + "年" + (today.getMonth() + 1) + "月<br  />" ) 
var cal = make_calendar( today.getFullYear(), today.getMonth() + 1, 0, 0 );
document.write( cal );
// -->
</script>

これを使って,リンクを張れば,日付指定の処理なんかが出来そうですね.というか,このブログの右上のメニューでカレンダーとリンクの組み合わせで使われてますけど...

Secure-SBM でもサーバサイドの Perl バージョンで使おうと思ってます.

追伸.
「 Ajax 風カレンダー」 も作ってみました → こちら

 

いかちょー (2007-06-07 15:13) | コメント(0)| トラックバック(19)

[Secure-SBM:011] データベース管理処理 (4)

こんにちは,五十嵐です.今回は deleteuser,edituser と searchuser です.Catalyst を使用したデータベースの処理については,今回で 4 回目ですが,これで,データベースを操作する一通りの処理ができるようになります.


delete ユーザでの注意点は一点."admin" を削除しないようにすることです."admin" を管理用の固定ユーザとして使用します.

まず,削除できるかどうかを確認するための is_deletableuser() を作成します.データベースを検索するので,$c と $user_id を引数として渡します.

lib/SecureSBM/Controller/Admin.pm
sub is_deletableuser : Private {
    my( $c, $user_id ) = @_; 

    if( $user_id eq '1' ){ # for admin
        return ''; 
    }
ユーザ ID が 1 かどうかを判断しています.admin の id は 1 ですので,この部分でチェックします.
    if( my $udb = $c->model('SecureSBMDB::User')
                                      ->find({user_id => $user_id}) ){
        my $udbname = $udb->user_email;
        if( $udbname eq '' || $udbname eq 'admin' ){
            return '';
        }else{  
            return $udb;
        }
    }
"user_email" フィールドが admin かどうかを再度確認します.registuser の処理ではあまり説明しませんでしたが,同じ名前は登録できないようにチェックしています.基本的に admin というユーザはひとつしか存在しないはずですが,念のために確認しています.$c->log->debug() はログメッセージを出力するもので,'-Debug' オプションが指定されていなければ,出力されません.
    return '';
}

データベースの検索でエラーが出れば,空文字を返します.

 

[Secure-SBM:011] データベース管理処理 (4)の続きを読む

いかちょー (2007-06-06 16:26) | コメント(0)| トラックバック(4)

モバイル Suica って便利だけど不便

こんにちは,五十嵐です.定期券も Suica も携帯電話のモバイル Suica になって,こりゃ便利と思ってたんですが...

チャージ機がありません.駅の切符売り場に行っても,カードのチャージはできるけれど,モバイルSuica がチャージできる機械がない.現金を持っているので,クレジットからチャージする気にもなれなくて.お買い物をするとポイントがつくサービスもできたから,モバイル Suica でお買い物をと思ったのですが...

結局,お店でチャージしてから買い物をするという,なんだか本末転倒なことになってしまいました.

モバイル Suica のみなさんって,クレジットカードからノーキャッシュでチャージしてるんでしょうか?


ついでに,電源切ってても使えるけど,電池がなくなると使えなくなるというのはどういうことなんでしょう? Passive じゃないの?

いかちょー (2007-06-04 23:52) | コメント(0)| トラックバック(56)

TGIF: 放送と通信の融合

こんにちは,五十嵐です.少し前ですが映画の『スパイダーマン ヨ』を見ました.前作を見ていなかったので,キャラクターがわけがわからず,十分には楽しめませんでした.後で聞いたら,直前にテレビで前作を放映していたとか.しっかり予習していけばよかった...

最近では『パイレーツ・オブ・カリビアン』が放映されていました.映画の三作目を見る前にしっかりと予習.二作目も放映してくれないかなぁ.

テレビ放送が始まった頃,映画界はテレビに猛反発.テレビとの融合なんて考えてもいなかったそうです.それが今やテレビ放送とタイアップ.むしろテレビ局が映画を作ったり.そのせいもあってか,映画の興行成績はやっと上向きになったそうです.

今のテレビ放送界とインターネットの世界の構図に似ていますね.著作権の問題も出演者すべてに許諾をとらなくてもよい方向に変わるらしいので,そうなると再放送やインターネット配信もどんどん活性化されます.単なるホームページだけではなく,もっと活用する方法を考えていかないと,テレビ業界がインターネットに食われてしまうかもしれません.

それにしても,無線の放送から有線へというのは,なんだか閉塞的な感じがしますが,今後も有線が主流になるのでしょうか.局所的には無線 LAN が使われたりしていますが,やっぱりまだまだ有線が基幹です.双方向化のためにプライバシーを守る必要があるとか,そういう理由なんでしょうか.携帯電話は無線でどこでも通信が基本ですよね.インターネットもそういう方向に進まないかなぁと思っています.

無線の放送と有線の通信がもっと近くなればいいのに.PLC を使った有線でも構わないのですけど.


"TGIF" とは,"Thank God, It's Friday!" の略.「花の金曜日」略して「花金」(笑) 毎週金曜恒例のお遊び/オタクモードです.

いかちょー (2007-06-01 20:46) | コメント(0)| トラックバック(9)

« 2007年5月 | メインページ | 2007年7月 »

プロフィール

いかちょー

いかちょーこと五十嵐智です。
情報セキュリティ分野に興味があります。
一応、CISSP ホルダー。

SF者です。どうぞよろしく。

プロフィール詳細 (Google プロフィール)

RSSフィード

コミュニティの人々 | ソフトウェア | 技術紹介 | 適用分野 | Tyzohとは | ご意見お問い合わせ

Copyright (C) 2004-2010 Nihon Unisys, Ltd. All Rights Reserved.
Powered by Movable Type Open Source