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

V.S.A. III

2007年7月アーカイブ

[Secure-SBM:028] カレンダー表示 (1)

こんにちは,五十嵐です.登録した日付でブックマークを見たいと思うときがあるので,カレンダーと組み合わせて日付指定ができるようにします.
カレンダーは以前このブログで紹介した「カレンダー Ajax 風」(2007/06/08) のコードを利用します.

カレンダーの表示の前に,ブックマークの一覧で日付を指定できるようにします.個人ページと最新ブックマーク一覧で URL の引数として date=YYYYMMDD を与えると,その日に登録されたブックマークを表示させます.date=YYYYMM の場合は,当該月の一覧にします.

与えられた引数が有効な日付かどうかを判定する関数を用意しておきます.Secure-SBM のリリースが 2007 年ですから,西暦は 2 から始まることを想定しています.このプログラムが 3000 年まで生き残ることはないと思いますし(笑)
sub _isValidDate : Private { 
    my $date = shift; 
    my @days = (31, 28, 31, 30, 31, 30, 31, 31,  30, 31, 30, 31); 

    $date =~ /^(2[0-9][0-9][0-9])([01][0-9])([0-3][0-9])$/; 
    my $year = $1; 
    my $month = $2; 
    my $day = $3; 

    # 閏年の判定 
    if( _isLeapYear( $year ) ){ 
        $days[1]=29; 
    } 

    # 月の判定: 1 月から 12 月まで 
    if( $month < 1 || $month > 12 ){ 
        return 0; 
    } 

    # 日の判定: 1 日から $days[$month-1] まで 
    if( $day < 1 || $day > $days[$month-1] ){ 
        return 0; 
    } 
    return 1; 

} # end of _isValidDate() 


URL に与えられた引数を検査して,date=YYYYMMDD 形式が正しければ,SQL の条件文を追加します.
    if( defined $data{date} ){ 
        if( $data{date} =~ /^2[0-9][0-9][0-9][01][0-9]$/ ){ 
            # YYYYMM 
            $date = $data{date} . '01'; 
            if( SecureSBMLib::_isValidDate( $date ) ){ 
                $where = 'date_trunc(\'month\',user_bookmark_ts)'; 
            } 
        }elsif( $data{date} =~ /^2[0-9][0-9][0-9][01][0-9][0-3][0-9]$/ ){ 
            # YYYYMMDD 
            $date = $data{date}; 
            if( SecureSBMLib::_isValidDate( $date ) ){ 
                $where = 'date_trunc(\'day\',user_bookmark_ts)'; 
            } 
        }else{ 
            # Error 
        } 
    } 

あとは,変数 $where が定義されているかどうかを見て,search() を呼び出します.

    my @bms; 
    if( defined $where ){ 
        @bms = $ubdb->search({$where => $date}, 
                       {order_by => 'user_bookmark_ts DESC'}) 
                        ->slice( $start, $start + $entrynum - 1 ) 
    }else{ 
        @bms = $ubdb->search(undef, {order_by => 'user_bookmark_ts DESC'}) 
                        ->slice( $start, $start + $entrynum - 1 ); 
    } 

必要な箇所にこれらを施して,date= の処理は終了です.

次回は,カレンダーからのリンクを実装します.

2007/06/27 記

参考:

 

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

 

いかちょー (2007-07-31 21:02) | コメント(0)| トラックバック(12)

ソーシャル・ブックマークを使いたいと思うのは

こんにちは,五十嵐です.Secure-SBM (セキュア・ソーシャル・ブックマーク) の利用促進について考えてみました.

ソーシャル・ブックマーク(SBM)はブックマークを共有することでそこから新たな発見や新たな価値を見出そうというものです.ですから,「共有」が必須条件になります.ところが共有するためには個人がブックマークを登録しなければなりません.ここに SBM 利用促進の課題があります.

話は変わりますが,コミュニティやメーリングリストを利用しようという動機は三種類あるのではないかと思います.一つめは全員で何かを為そうと思って参加するケースです.二つめはコミュニケーションそのものを楽しみたい,あるいは連絡を目的とするというケース,三つめは何かを知りたいと思って参加するケースです.多くの動機は三つでくくられるのではないかと思います.

一つ目のケースでは参加者それぞれの意識がどれだけあるのか,目的意識があるかどうかが盛会になるかどうかの鍵だと思います.やりたくもないのに無理やり参加させられていたり,一人一人の持っている目的意識がばらばらだったり,誰かがやってくれるだろうとまかせっきで他人事だったりすると,そのコミュニティは死に会になってしまうでしょう.共通の意識をもって,参加者各自がそれぞれ活発に活動していれば,コミュニティは生きながらえると思います.この Tyzoh コミュニティがこのケースの典型的な例です (死に会になっているかどうかは,私自身が中にいるのでわかりませんが).

二つ目のケースではコントローラ(中心人物)がいるかいないかで,コミュニティの体質が変わってきます.私の経験では,コントローラが常に話題を出していたり誰かの意見に必ず答えるようにしていると,コミュニティは常に活性化されています.コントローラがいない場合,時々爆発的に盛り上がることもありますが,普段は沈静化して,死んでいるのかのように見える場合があります.しかし,全員がコミュニケーションを目的としているので,完全に死に絶えることはありません.話題があればその時々で活性化されます.代表される例は mixi (特に日記や趣味のコミュニティの部分)ではないかと思います.または,同窓会などのメーリングリストなど.

三つ目のケースは運営が非常に難しいケースです.あるテーマなどで知りたい,情報を得たいと思って参加してくる人に対して,情報を提供する人は参加しない場合があります.中には親切な人もいて,情報を提供してあげようと思って参加する場合もあるかもしれませんが,多くの場合には情報源が少なく,情報を得ようとする人ばかりが参加して,結局コミュニティが死に至ることになります.ツールがどんなに良くても,情報発信者がいなければ,成り立ちません.ただし,参加者の知見レベルがまちまちで,情報を得ようと思って参加したのに,情報提供の機会が意外と多くてうまくバランスするようなケースもあるようです.

このような話を書いたのは SBM も三つ目のケースと同じような問題を抱えるからです.ブックマークを共有して,他の人の知見を得たいと思っても,提供する人がいなければ SBM は成り立ちません.共有云々以前に,個人が使うブックマークツールとして便利でなければ,誰もブックマークを登録しません.これは重要なポイントです.共有するしないということよりも,ブックマークを登録しようというインセンティブを提供する必要があります.ブックマークを登録することでこんなにいいことがあるよ,ということがわからなければ,SBM そのものが死に至ってしまいます.

そこで,Secure-SBM は Secure である以前に,またソーシャルである以前に,ブックマークとしての利用価値を高めることを現在の目標にしています.これが実現できた時に,バージョン 1.0 としてリリースするつもりです.

利用価値を高めるために二つのことを方針として考えています.

  1. 知らず知らずのうちにブックマークしてしまう.あるいはブックマークせずにはいられなくなる.
  2. ブックマークすると付加価値が付く.

一つ目の方針は,具体的にはブラウザのアドオン/プラグインの開発です.いつもと同じようにブラウザにブックマークするだけで,簡単に SBM に登録されるような仕組み.これは既に他の既存の SBM サービスでも行われていることです.複数 PC でのブックマークの共有サービスなどもあります.これは私自身も欲しいと思っています.会社と自宅で同じブックマークリストを使えたらと思いますから.

二つ目の方針については,まだ漠としていますがいくつか考えています.自分のブックマークが貯まれば貯まるほど自分自身にとって価値が高まるような「何か」です.ブックマークを削除する機能が欲しいという要望が現在は出ていますが,その「何か」が実現できれば,削除機能はいらなくなるのではないかと踏んでいます.
(質問回答型のコミュニティなどでは,質問者に対して質の良い回答を行った人に何かのポイントを付加するなどのインセンティブを導入することが多いようです.うちの会社にもそういうのがありました.ブックマークで同様のモデルは考えられるでしょうか?)

これらの個人ツールとしての役割を十分に果たした上で,共有の価値を高める機能を充実させて行こうと思っています.とはいえ,実際には両方を少しずつ実現していくことになるでしょう.はっきり言ってしまえば,今のところ,私の欲しい機能を優先して作っているということになります.

ちなみに,運用保守の面にも少し力を入れたいと思っています.利用面がどんなに便利でも,運用者が苦労するようなツールは私自身が使いたくないですからね.私自身が欲しいものをと思って Secure-SBM を作っているので,当然なんですが.

参考:

 

いかちょー (2007-07-30 12:41) | コメント(0)| トラックバック(10)

【再掲載】 社内ソーシャルブックマーク ふたたび (2006/08/01)

こんにちは,五十嵐です.一年ほど前に書いたブログを再掲載しておきたいと思います.やっと少し形になってきたかなと思う Secure-SBM (セキュア・ソーシャル・ブックマーク) ですが,自分が以前考えていた方向性とずれてきていないかどうかを確認したいと思ったからです.当時は「Secure-SBM」ではなく,「社内ソーシャルブックマーク」と呼んでいました.

http://www.tyzoh.jp/community/ikarashi/2006/08/01_112100.html (2006/08/01)
引用:
さて,社内ソーシャルブックマーク(SBM)のお話.しばらくご無沙汰でしたが,もう少しつめていくことにします.

やりたいこと:
  • 面白いことを見つけたら URI を SBM に登録する.
  • 登録した URI に「ラベル」をつけられる.
  • 登録した URI に「コメント」をつけられる.
  • 登録した URI を「ラベル」で一覧できる.
  • 登録した URI の「コメント」を検索できる.
  • 登録する URI に「タイトル」が自動的につく.
  • 登録する URI の「タイトル」を変更できる.
  • 登録した URI の「タイトル」を検索できる.
  • 登録した URI の参照先の内容を検索できる.
  • 登録した URI を他人と共有できる.
  • 登録した URI の一覧を RSS/ATOM で配信できる.
  • 登録した URI の一覧を(限定した)他人に公開できる.
  • 登録した URI に「システムラベル」が自動的につく.
  • 登録した URI の参照権限の管理ができる.
  • 登録した URI のアクセス管理ができる.(このあたりが情報セキュリティ)
  • 登録した URI の更新ができる.
  • 同じ URI を何度も登録できる.
  • 複数の同じ URI を表示する場合は,どれが最後に登録したものかすぐにわかる.
  • URI の登録日時がわかる.
  • 他の誰が URI を登録しているのかわかる.
  • 自分がその URI を登録していることを他者から隠すことができる.
  • URI 一覧を「ブックマーク」として利用できる.
  • URI を無制限に登録できる.
  • URI 一覧の表示方法をいくつか変えられる.

思いつくままに書いてみましたが,こんなところですか.URL ではなく,URI と書いたのは,tPod との連携を想定しているからです.ホームページだけでなく,tPod が管理するファイルを「ブックマーク」として扱うことで,情報共有の幅が広がりそうです.tPod 側のインターフェースはまだそこまで用意されていませんので,これはあくまでも私の希望です.

簡単なところから始めるとして,他に要件(要求)がないかどうか整理することにします.

自分で書いておいてなんですが,なぜそうしたかったのかがわからないものがいくつかあります.整理すると書いておいて,このあと整理してないようですし...(汗

バージョン 0.3.0 までで実装済み
  • 面白いことを見つけたら URI を SBM に登録する.
  • 登録した URI に「ラベル」をつけられる.
  • 登録した URI を「ラベル」で一覧できる.
  • 登録した URI に「コメント」をつけられる.
  • 登録した URI の「コメント」を検索できる.
  • 登録する URI に「タイトル」が自動的につく.
  • 登録する URI の「タイトル」を変更できる.
  • 登録した URI の「タイトル」を検索できる.
  • 登録した URI を他人と共有できる.
  • 登録した URI の一覧を(限定した)他人に公開できる.
  • 登録した URI の参照権限の管理ができる.
  • 登録した URI のアクセス管理ができる.
  • URI の登録日時がわかる.
  • 他の誰が URI を登録しているのかわかる. (チケット #4)
  • 自分がその URI を登録していることを他者から隠すことができる.
  • URI を無制限に登録できる.

いつの間にか「ラベル」=>「タグ」になってました.いつから「タグ」になったのか...「ラベル」のままの方が感覚的には近いのですけれど.

未実装の分.対応するチケットをリンクしておきます.

  • 登録した URI の一覧を RSS/ATOM で配信できる. (チケット #6)
  • URI 一覧の表示方法をいくつか変えられる. (チケット #33)
  • 登録した URI の参照先の内容を検索できる. (チケット #40)
  • 登録した URI に「システムラベル」が自動的につく. (チケット #41)

後ろの二つは,リンクした先の内容を分析する必要があります.

以下はなぜ必要だと思ったのか思い出せません.必要でしょうか...?

  • 登録した URI の更新ができる.
  • 同じ URI を何度も登録できる.
  • 複数の同じ URI を表示する場合は,どれが最後に登録したものかすぐにわかる.

もう少しブレークダウンする必要があるもの:
  • URI 一覧を「ブックマーク」として利用できる.

どんな風になっているとブックマークとして利用できるのか.私の考えではブラウザと連携できればいいのでは? (チケット #11チケット #12) と思っています.


どんな風に使えるだろうというのをもう少し考えてみたいと思います.そこで,読者の皆さんに質問です.
個人が使うブラウザで,ブックマーク/お気に入りに登録したいと思うのは,「何回も使うから」の他に何が考えられますか?
無尽蔵にブックマークできて,簡単にそのブックマークを探すことができたら,どんなものをブックマークしますか?

参考:

 

いかちょー (2007-07-29 09:00) | コメント(0)| トラックバック(6)

0.3.0 リリース: Secure-SBM (セキュア・ソーシャル・ブックマーク)

こんにちは,五十嵐です.予定より少し早いですが,Secure-SBM (セキュア・ソーシャル・ブックマーク) バージョン 0.3.0 をリリースしました.

7/23 にも「[Secure-SBM:025] Cygwin で Secure-SBM (セキュア・ソーシャル・ブックマーク)」で書きましたが, Windows 上でも動かせるようになりました ので,試してみてください.Secure-SBM 自身を動かしてみるまでの作業に多少時間がかかるかもしれませんが.もちろん, Linux ではバリバリ動きます

0.2 -> 0.3 の細かい変更点はこちらを見ていただくとして,見た目上の大きな変更点はカレンダーかなぁ...(技術開発になってないですが(汗;

インストール方法やらなにやらは


をご覧ください.結構丁寧に細かい部分までインストール方法を書いたつもりです.

ご要望,ご意見,不具合のご連絡は「チケット登録」からお気軽に登録してください.

Version 0.4 で予定している作業項目はこんな感じです.(全部できるのか?)


さてここで,改めて Secure-SBM (セキュア・ソーシャル・ブックマーク)とは何なのか を書いておきます.

Secure-SBM は,「セキュア」 である前に,「ソーシャル・ブックマーク」です.「ソーシャル・ブックマーク(以下 SBM)」とは他人とブックマークを共有するものですが,それによって 集合知暗黙知 を見えるようにしようというものです.あるいは自分の知らなかった情報を(他人のブックマークによって) 発掘 するということにも使えます.SBM は 「はてな」 や 「del.icio.us」 などが有名ですが,これらの SBM は一般公開されており,同一サイトがどれだけの人にブックマークされているのかがわかるようになっています.多くの人にブックマークされている 人気サイト や急激にブックマークされている ホットサイト などがわかるようになっているものがほとんどです.ブックマークに対してコメントがつけられるようになっていて,他人のコメントが読めることも SBM の特徴の一つです.

お互いにブックマーク情報を共有/交換できるということは,探す手間が省け, 生産性向上 にもつながります.そのためには,自分でもどんどんブックマークして有益な情報を集める必要があります.

個人だけで考えた場合,どんどんブックマークしてタグを付けていき, 後でまとめて読む などの方法で使うことができます.論理的に 無尽蔵なブックマーク であると同時に,ブラウザのお気に入りなどとは異なり 整理せずにブックマーク することができます.つまり,このタグによる検索や,タイトルの検索などが SBM の主要素の一つになります.この「個人」で使用するツールという部分は SBM の利用を促進する上で重要な役割をもちます.個々人で利用して便利だという利得(インセンティブ)がなければ,誰もブックマークしないので,ブックマークの共有という考え方そのものが破綻してしまうからです.

共有されたブックマークを介して,SNS (ソーシャル・ネットワーク・サービス) のような他人とのコミュニケーションも考えられますが,そこまでやっている SBM はまだないようです.

これを 企業などの組織内で使うことを考えたものが Secure-SBM です.ある組織で使用すると,傾向が偏るはずですが,組織が必要とする情報を誰かが見つけたら,それをブックマークするように習慣を付けておきます.すると, 自分が欲しかった情報を他の人が見つけてくれるかもしれません.大きな組織ではホームページの情報が散逸しているかもしれませんが,必要な情報が SBM によって 人間の目によってフィルタリング され 集約された情報 になっているはずです.

ここで,組織の構成員によって役割や閲覧権限が違う場合,その 情報の存在そのものを隠さなくてはならない 場合があるかもしれません.あるいは,その 組織だけでブックマークを共有したいと考えるかもしれません.そのために Secure-SBM では 「ロール」 という概念を導入し,ブックマークを閲覧できる範囲を限定できるようにしました.この点が Secure の由来 です.

さらに,Secure という特徴を生かして,SNS 的な使い方ができると面白いのではないかと考えています.

バージョン 0.3.0 をリリースしたものの,まだまだ機能が足りません.先進的な技術の部分よりも SBM として持っていて当然の機能 (上に書いた人気リストやホットリストなども) が足りないので,その部分の作業に時間をとられているのが実態です.SBM とし当たり前の機能がそろったときに初めてバージョン 1.0 として世の中に出せるかなと思っています.それまでは 0.x ですね.(0.9 の次は 0.10 です.でもその前には 1.0 として出したいなぁ...)

今後は SBM で集まったブックマークを分析し,情報の偏在傾向やブックマークの 「おすすめ」 などを見れるようにして行きたいと考えていますが,その実装はもう少し先になりそうです.有効な数のブックマークが集まらないというのもあるのですが,なかなか SBM の有用性をわかってもらえないんですよね....とちょっと愚痴...

ダウンロードしてどんどん試していただき,足りない機能使い勝手の悪い点チケット登録 していただければ幸いです.ついでに 一緒に開発していただける方がいるともっとよいのですが.公開デモサーバなども徐々に考えていきたいと思います ( 「Tyzoh2.0」 と一緒に公開できるといいですが).

どうぞよろしくお願いいたします.


Keyword: cygwin PostgreSQL Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク オープンソース Linux

 

いかちょー (2007-07-27 09:23) | コメント(0)| トラックバック(0)

[Secure-SBM:027] データベースのバックアップ

こんにちは,五十嵐です.サービスを閉塞した後にデータベースのバックアップを行えるようにします.今のところ Linux/PostgreSQL のみ対応しています.

sub makebackup : Local {
        my ( $self, $c ) = @_;

        $_ = $c->config->{'Model::SecureSBMDB'}->{connect_info}[0];
        my ( $dbi, $dbd, $dbparams ) = split( ':' );
        my ( @dbparams ) = split( ';', $dbparams );
        my %dbparams;
        foreach my $d (@dbparams){
                my ( $name, $data ) = split( '=', $d );
                $dbparams{$name} = $data;
        }

        my $dbname = (defined $dbparams{dbname})?$dbparams{dbname}:'';

        my $dbuser = $c->config->{'Model::SecureSBMDB'}->{connect_info}[1];
        my $dbpwd = $c->config->{'Model::SecureSBMDB'}->{connect_info}[2];
初期設定の config から dbname などを切り出します.connect_info 配列の 0 番目は dbname など,1 番目はデータベースのユーザ名,2 番目はパスワードになります.

        if( $dbd eq 'Pg' ){
                my $dbhostopt = (defined $dbparams{host})?
"-h $dbparams{host}":'';
                my $dbportopt = (defined $dbparams{port})?
"-p $dbparams{port}":'';
                my $dbfileopt = "-f $backuppath";

                system( "pg_dump -U $dbuser -F t $dbhostopt $dbportopt 
$dbfileopt $dbname" );
                my ( $dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, 
                      $atime, $mtime, $ctime, $blksize, $blocks ) 
                        = stat($backuppath);
                my ( $sec, $min, $hour, $mday, $mon, 
                      $year, $wday, $yday, $isdst ) 
                        = localtime($mtime);
                my $filestat 
                        = sprintf( '%s <br />owner:%s group:%s size:%s 
                          <br />mtime: %4d/%02d/%02d %02d:%02d:%02d',
                            $backupfilename, $uid, $gid, $size,
                            $year + 1900, $mon + 1, $mday, $hour, $min, $sec
                        );
                $c->stash->{backupfileinfo} = $filestat;
                $c->stash->{backupfilename} = $backupfilename;
        }else{
                # Not implimented
                $c->stash->{resultmessage} = 'Not implimented yet';
        }
        $c->forward('index');

} # end of makebackup()
dbname が "Pg" かどうかを判断していますが,PostgreSQL の場合に "Pg" を設定していますので,この場合にのみ "pg_dump" を利用してバックアップファイルを作成します.他のデータベースの場合には対応していません.それから,このままだと Windows でも動きません.これは今後の課題.

ファイルを作成したら,ダウンロードできるようにします.
sub getbackup : Local {
        my ( $self, $c, $bfname ) = @_;

        if( $bfname ne $backupfilename ){
                $c->forward('index');
                return 0;
        }

        my $backupfilepath = $backupdir . '/' . $bfname;
        my ( $dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, 
$atime, $mtime, $ctime, $blksize, $blocks ) = stat($backupfilepath);

        my $bfcontents = '';

        if( open( BFH, $backupfilepath ) ){
                my $rsize = 1;
                while( $rsize && $size > 0){
                        my $tmp;
                        $rsize = read( BFH, $tmp, $size );
                        $bfcontents .= $tmp;
                        $size -= $rsize;
                }
                close( BFH );
        }

        $c->res->headers->header(
                'Content-Type' => 'application/x-tar;'
                        . 'name="' . $bfname . '";' );

        $c->res->body( $bfcontents );
        $c->forward('index');

} # end of getbackup()
ファイルを読み込んで, body に格納するだけです.ポイントは HTML ヘッダで "Content-Type" を設定することです.

2007/07/14 記

参考:


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

 

いかちょー (2007-07-26 12:54) | コメント(0)| トラックバック(24)

[Secure-SBM:026] サービスの閉塞処理

こんにちは,五十嵐です.データベースのバックアップの処理を追加しますが,その前に,サービスの閉塞処理を行います.いわゆる 「メンテナンス画面」の表示です.表示を変えるだけなら簡単ですが,データベースにアクセスしないようにする必要があるため,いままで作ってきたコントローラにすこしずつ処理を追加する必要があります.

現在利用している PostgreSQL (フリー版)には閉塞にする処理が無いようですので,アプリケーションの閉塞を行います.

サービスを停止するためにファイルを作成します.このロックファイルの中には,セッション ID を格納しておきます.同じセッション ID をもつブラウザのみがサービスを開始できます.(セッション ID のセキュリティについては別途)

"service_disable" と "service_enable" というアクションを用意して,閉塞処理と閉塞解除処理を行います.
sub service_disable : Local {
    my ( $self, $c ) = @_; 

    if( _makeLockfile( @_ ) ){
        $c->log->debug('Success: make ' . $c->config->{lockoutfile});
    }else{
        $c->stash->{resultmessage} = 'Cannot make lockfile';
    }   
    $c->stash->{lockout} = 1;
    $c->logout;
    $c->forward('index');
}

sub service_enable : Local {
    my ( $self, $c ) = @_; 

    if( _deleteLockfile( @_ ) ){
        $c->log->debug('Success: delete ' . $c->config->{lockoutfile});
        undef $c->stash->{lockout};
    }else{
        $c->stash->{resultmessage} = 'Cannot delete lockfile';
    }   
    $c->forward('index');
}


"$c->stash->{lockout}" を 1 に設定することで,メニューを一掃するようにします.

ロックファイルを作ることで,他のユーザがアクセスした場合に Root::auto でチェックします.

sub auto : Private {
    my ( $self, $c ) = @_; 

    if( my $sessionid = SecureSBMLib::_isServiceLocked( @_ ) ){

        $c->stash->{lockout} = 1;

        if( $c->controller eq $c->controller('Noauth::Mentenance') ){
            return 1;
        }

        if ( $c->sessionid eq $sessionid ) { 
            if( $c->controller eq $c->controller('Admin::ServiceCtl') ){
                return 1;
            }
        }

        $c->res->redirect( $c->uri_for('/mentenance') );
        return 0;

    }else{

...


"Noauth::Mentenance" は「メンテナンス中」を表示するページですので,無条件でチェックを抜けます."Admin::ServiceCtl" はサービス閉塞の解除を行うページですので,セッション ID を確認して,auto を抜けます.それ以外ではデータベースのバックアップを取り扱うコントローラ "Admin::DBMentenance" を追加予定ですが,これについては,次回にします.他のページにアクセスした場合には「メンテナンス中」を表示します.

auto アクションがあるおかげで,チェックが簡単に済みました.次回はデータベースのバックアップ処理です.

2007/07/05 記

参考:


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

 

いかちょー (2007-07-25 11:21) | コメント(0)| トラックバック(10)

インターネット治安情勢 2007/06 月期

こんにちは,五十嵐です.警察庁から 2007 年 6 月期のインターネット治安情勢のレポートが出ました.


相変わらずボットと思われる攻撃数が増加しているようです.SQL Slammer も勢いが衰えませんね.インターネット治安情勢のレポートを見るたびに,自宅の PC は大丈夫だろうかと不安になります.会社の方は情シス部門が頑張ってくれていると信じています.

それにしても,この手のサイトをしばらく見てませんでした.情報セキュリティの情報収集がおろそかに...一日のうち少しの時間でも作って,覗くようにしたいと思っているのですが,なにせ,頭がシングルタスクなので...

こういう有用なサイトを Secure-SBM に登録して(いや,Public なサイトなので,セキュアである必要はないんですが),みんなで共有したいものです(と,さりげなく Secure-SBM の宣伝...え?全然さりげなくない?!).

ところで,日本は「中国」と「台湾」を分けてるんだなぁと改めて思いました.こういうレポートを中国政府がみて,抗議してきたりということはないんでしょうか.

 

いかちょー (2007-07-24 11:16) | コメント(0)| トラックバック(7)

[Secure-SBM:025] Cygwin で Secure-SBM (セキュア・ソーシャル・ブックマーク)

こんにちは,五十嵐です.やっと Windows で Secure-SBM を動かすことができました! といっても cygwin 上です.残念ながら,ActivePerl での動作は未だ成功していません.

cygwin での Perl の cpan shell のアップデートと Catalyst モジュールのインストールにちょっとしたコツが必要でした.詳細は以下にリンクしたページに記述してあります.Secure-SBM 開発ページからもリンクしました.

インターネットで検索してもほとんど情報がなかったので(あるいは,探し方が悪いのか...),Windows で本格的に Catalyst を動かしている人は,残念ながら,あまりいないということなのかもしれません.上のページを参考にすれば,Catalyst の開発環境ができますので,Catalyst 人口が少しでも増えるとうれしいなぁ.かなり詳細に記述しましたので,初めて cygwin や Perl CPAN モジュール,Perl Catalyst,PostgreSQL などに触る方でも Secure-SBM を立ち上げることができると思います.

cygwin の Perl と,単体の PostgreSQL (Windows 用) の組み合わせで動作しています.cygwin での PostgreSQL との組み合わせでは動作を確認していません.cygwin に含まれる PostgreSQL はバージョンが 7 で古いのです.ここは新しいバージョン 8 で動作させたほうがいいだろうということです.バージョン 8 からは Windows 用のバイナリが提供されています.将来 ActivePerl などで動かすことができれば,cygwin から切り離しておいた方が便利ですし.

これで,Windows 上でも開発もできます.Linux がなくてもちょこっと動かして見ることもできるようになりました.インストールにはそれなりに手間が必要とはいえ,Windows の裾野は Linux よりも広いですからね.ただし,まだ Apache + mod_perl で動作できていません.単体の開発用サーバだとリクエストがシーケンシャルに処理されるので,ちょっと重たいのが難点です.最近の PC は高性能になってきているので,大した問題じゃないかもしれません.

Windows と言っても確認したのは Windows XP 上です.Vista はまだ触ったこともなくて...確認していませんが,Windows 2000 でも動くのではないかと.

ActivePerl + PostgreSQL での動作が今後の課題です.ActivePerl だと,ppm を使っても cpan shell を使っても,追加モジュールのインストールでエラーになってしまうんですよねぇ...手間は cygwin を使うよりもかかるかも.いろいろとやってみてはいるのですがなかなかうまくいきません.Microsoft 社からフリーのコンパイラ (Visual C/C++ Express Edition) が入手可能なんですね.→ http://www.microsoft.com/japan/msdn/vstudio/express/visualc/

2007/07/17 記


【追記】
先週の Secure-SBM のダウンロードが Tyzoh サイトで2位でした.やたっ!
(Tyzoh トップページより)


参考:


Keyword: cygwin PostgreSQL Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク オープンソース

 

いかちょー (2007-07-23 10:40) | コメント(0)| トラックバック(20)

TGIF: 宇宙大作戦 デジタルリマスター版

こんにちは,五十嵐です.明日 (2007/07/21 の深夜,正確には 22日の早朝) から NHK 衛星第二 でなんと 『宇宙大作戦』が放映開始です.最近だと 『スタートレック』 と言わないとわからない世代もいるかも...とにかく,トレッキーの皆さん,録画予約をお忘れなく.

今回放映が開始されるのは昨年全米で話題になったデジタルリマスター版.デジタルリマスターというと,彩色などを鮮やかにしたり,ぼやけた境界線をはっきりさせたりということかと思っていましたが,この 『宇宙大作戦 デジタルリマスター版』 はそれだけじゃないそうです.小物やセットを CG で作り直し,大幅に手直ししているとのこと.予告映像を観た人の話によれば,かなりきれいになっているらしい.スタートレックファンとしては相当に期待大です.

今や低予算のドラマでも簡単に CG が作れる時代.CG を見世物にしていた時代は終わり,CG が使われていることを気づかせずに見せる時代.昨年公開された新作の 『日本沈没』で最も大変だった撮影はツバメのいない巣のシーンだったとか.撮影シーズンの関係で結局ツバメのいないツバメの巣は撮影できず,CG でツバメを消すことになったという話.見ていても CG で消されたとは気づきませんでした.

CG で消されたものは全くわからなくなったものの,作られたもの - 特に人物の動き - にはまだまだ違和感があります.今年公開されたスパイダーマン 3 (あのロゴはどう見ても 「ヨ」 なんだよな~) の CG の動きは,クニョクニョしていかにも CG です,と言わんばかり.合成音声はすでに違和感のないものになっている様子ですから,合成人物の違和感がなくなれば,ニュースキャスターなんかが真っ先に置き換えられそうですね.徐々にドラマの人物として入り込み,亡くなった役者が合成で新しい演技に挑戦なんてことも近い将来に起きそうです.

『宇宙大作戦』 に出演されていた役者さんが既に何人も亡くなられていますが,何年かすると 『宇宙大作戦 デジタルリマスター フル CG 版』 なんてのができる世の中になるかもしれません.

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

いかちょー (2007-07-20 09:23) | コメント(0)| トラックバック(3)

[Secure-SBM:024] タグのビジュアル表示

こんにちは,五十嵐です.タグのビジュアル表示...つまるところ,フォントの大きさを変えようということ.どこぞのソーシャル・ブックマークのサービスと同じようにしてみようということです.

こんな感じ.

  • 一番良く使われるタグ
     
  • よく使われるタグ
     
  • 結構使われるタグ
     
  • まぁまぁ使われるタグ
     
  • あまり使われないタグ
     
  • ほとんど使われないタグ
     
  • 一番使われないタグ
     



ここで,方針としては,タグの大きさの修飾はスタイルシートに任せて,とにかく 7 段階で表示することにします.使用されなくなったタグも残していますので,使用されている回数は最小 0 から最大値まであります.それを単純に 7 段階に分けることにします.つまり (最大値/7) の幅で class を分けます.

 

[Secure-SBM:024] タグのビジュアル表示の続きを読む

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

[Secure-SBM:023] コメントの一覧表示

こんにちは,五十嵐です.ブックマークを登録しているユーザとコメントの一覧を作成します.

ユーザの一覧は "/listbookmarkusers" で呼び出します.ブックマークの ID を bookmarkid とすると,"/listbookmarkusers/bookmarkid" という具合に呼び出します.

指定されたブックマークをテーブルから検索し,URL とタイトルを取得します.
    if( my $bdb = $c->model('SecureSBMDB::Bookmark')->find(
                        {
                            bookmark_id => $bookmarkid
                        }       
                )
    ){              
        my $bookmark = {
            url => $bdb->bookmark_uri,
            title => $bdb->bookmark_title
        };
       ...


ブックマークしているユーザを検索し,プロフィールの設定から,ニックネームを公開しているかどうかを確認します.ニックネームが公開されていればニックネームを,そうでなければユーザ ID の番号を変数 $nickname に格納します.コメントも一旦変数 $comment に格納しておきます.
        my %user;
        my @users;
        my $usersnum = 0;
        foreach my $ubdb ($bdb->user_bookmarks->search(
                {
                    -or     =>  \@ORquery,
                    -and    =>  \@ANDquery,
                },
                {
                    join    =>  [qw/
                        user_bookmark_roles
                    /],
                    order_by    =>  'user_bookmark_ts DESC',
                }
                )
        ){
            my $userid = $ubdb->user_id;
            my $profile = $ubdb->user->user_profiles->find({user_id => $userid});

            my $nickname;
            if( $profile->user_profile_nickname_publish == 1 ){
                $nickname = '<ul class="noId"><li>'
                    . $profile->user_profile_nickname
                    . '</li></ul>';
            }else{
                $nickname = '<ul class="onlyId"><li>'
                    . $profile->user_id
                    . '</li></ul>';
            }

            my $comment = $ubdb->user_bookmark_comment;
       ...
    }
発行したい SQL はわかっているのに search() でどのように書くのか,というところでちょっと苦労しました.ロールとの関連性を記述している user_bookmark_roles の指定の仕方.ここが今回のポイントです.

話が前後しますが,ブックマークが public (role_id が 2 番)か,public ではない場合,閲覧しようとしているユーザのロールとを設定し,上の @ORquery に設定しておきます.
    my @ORquery = ({'user_bookmark_roles.role_id' => 2});
    if( $c->user_exists ){
        my $udb = $c->stash->{user};
        foreach my $ur ($udb->user_roles->all){
            push( @ORquery, {'user_bookmark_roles.role_id' => $ur->role_id} );
        }
    }

最後に,一覧するものがあれば stash に格納してテンプレート (View) に渡します.

if( defined $bookmark && $#users > 0 ){ 
    $c->stash->{bookmark} = $bookmark; 
    $c->stash->{publishusers} = \@users; 
    $c->stash->{usersnum} = $#users; 
} 

あとは,テンプレート側で体裁を整えれば終了です.

2007/06/22 記

参考:


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

 

いかちょー (2007-07-18 10:01) | コメント(0)| トラックバック(0)

『地方公共団体におけるITガバナンスの強化ガイド』

こんにちは,五十嵐です.総務省から 『地方公共団体におけるITガバナンスの強化ガイド』 が公表されています.

地方公共団体に対する取り組みとして書かれたものですが,民間企業でも十分に利用可能だと思います.当該ページにある概要 (PDF) を眺めるだけでも自企業のチェックリストとして利用できそうです.

できていない課題として,
  • 利用が政策目標達成の手段として十分に位置づけられていない
  • 情報システムの導入が各部署に任されている
  • 電子自治体の取組が、特定の職員の能力や努力に依存している

が挙げられています.ちょっと耳の痛い話です.うちの会社でも 「情報システムの導入が各部署に任されている」の部分は徐々に解消されてきているようですが, 「特定の職員の能力や努力に依存している」はまだまだ改善の余地がありそうです.属人的な部分を切り離すというのはなかなか難しいものです.

取り組み内容としては 6 分野 9 項目が挙げられています.
  1. 基本戦略
    1. T利用の基本方針策定
    2. 全体最適化の取組

  2. 推進体制
    1. 組織体制の確立
    2. 人材の確保・配置

  3. 予算・実施計画・評価
    1. 予算・実施計画の策定
    2. 評価の実施

  4. 調達・開発・運用
    1. 調達・開発・運用の管理

  5. 情報セキュリティ
    1. 情報セキュリティの確保

  6. 標準化・知識共有・人材育成
    1. 標準化・知識共有
    2. 人材の育成

IT ガバナンスの強化を行うために 4 段階の強化策が挙げられていました.

6 分野の取り組み内容に対して,強化のチェックポイントとして 23 項目が挙げられています.
  1. 基本戦略のポイント
    • ITを政策達成の手段と位置づけて方針を策定する
    • 形式にこだわらず、質を高める
    • 情報資産を一元的に把握する
    • 技術基準の統一や共通基盤の整備を行う
    • 業務とシステム双方について、最適化を進める

  2. 推進体制のポイント
    • CIOを支える体制を強化する
    • CIO等の権限・責任を明確化する
    • 情報担当部門と業務担当部門の協力体制を整える
    • 人事担当部門と連携して内部人材を確保する
    • 外部人材の選択肢も活用する

  3. 予算・実施計画・評価のポイント
    • 重要案件は、首長や幹部を含めて政策判断を行う
    • 予算編成過程に情報担当部門等が関与する
    • 評価と予算をリンクさせる

  4. 調達・開発・運用の管理のポイント
    • 仕様書・要件定義書の内容を明確化する
    • 積算方法を向上させる
    • 調達改革を推進する
    • プロジェクト・マネジメント手法を導入する

  5. 情報セキュリティの確保のポイント
    • PDCAサイクルを確立・継続する
    • 一般職員を含め、情報漏えい対策を徹底する

  6. 標準化・知識共有・人材育成のポイント
    • ガイドライン等を策定・更新する
    • 知識・経験の情報共有化を進める
    • 求められるスキル・知識を明確化する
    • OJTと専門的研修等により人材を育成する


こうしてみてみると,一つ一つは当たり前のようなことばかりですが,これらを統合的にガバナンスを効かして,実行するというのはなかなか難しそうです.

参考文献には地方公共団体ガバナンス研究会の 『情報ガバナンス確立のための戦略手引き』をはじめとして,各地方自治体の取り組み事例などが含まれています.

民間企業でも参考になるガイドだと思いますので一読をお勧めします.同じ総務省から 「地方公共団体における情報セキュリティ監査に関するガイドライン」 も公開されていますので,あわせて読むとよいと思います.

 

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

TGIF: SF は IT の未来を描けるか

こんにちは,五十嵐です.今年は世界 SF 大会 (ワールドコン: Nippon2007) というものが日本,横浜で 8 月末に開催されます.参加登録者は 3 千人規模.新聞に記者会見の様子などが載ったようです.無料イベントへも 1 万人規模の来場者を見込んでいるそうですが... 5 日間の開催ですから,のべ人数で数えたら 2 万人くらい来てもおかしくないかも.

東京新聞などにも載ったらしいですが,Web ではみつからず...

日本 SF 作家クラブが全面的に支援して,企画を計画しているようです.記者会見もワールドコンの実行委員会と日本 SF 作家クラブと共同での記者会見だった模様です.同日には SF 作家クラブ 40 周年史発行記念パーティーも行われました.


ワールドコン Nippon2007 は「第65回世界SF大会」であると同時に「第46回日本SF大会」でもあります.日本でも 45 年の歴史があるのです.45 年といえば,私と同じ歳です(そうだったのか!).この歳月で様々なものが変わってきました.

Nippon2007 ではインターネットで海外とつないでテレビ会議をやろうという話もあるようです.ノートパソコンを使ってのプレゼンテーションは当たり前.PC につなぐ OHC (Over Head Camera:現物投影機) なんて,携帯用の廉価版まであるようです.現実が SF に追いついてきたと感じています.私の子供の頃には夢のような話だったものが今やほとんどのモノが実現されてきていますね.そういう意味では,これからの SF は益々アイディアが勝負の世界になっていくのではないでしょうか.私自身の読む量が昔に比べて格段に少なくなってきているので,今の SF 界を語れるほど知っているわけではありませんが,最近は,なんか哲学的な SF が多くなってきているような気がします.

IT 業界に身を置いていると,SF の中に出てくる IT ガジェットが妙に気になります.しかし,なかなか突拍子も無いガジェットは出てきませんね.なんだか今の延長上で想像できるようなものばかり.もっとこう,面白いガジェットはないものでしょうか.って,読んでいないんですが...一番身近で顕著な実現されたガジェットはやはり携帯電話でしょう.あとは,ほんとに小さい腕時計型テレビ電話ができれば「アンヌ,だいじょうぶか!」とかウルトラセブンごっこができるんですけど...

SF と現実の追いかけっこ.SF は IT の未来を現実に追いつかれずに描くことができるのでしょうか.
人生半ば.まだまだ楽しみです.

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

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

なんのためにブログを書くのか

こんにちは,五十嵐です.仲間内ですら他人のブログを読んでいない,ということがわかり,かなりショックを受けました.

この Tyzoh でも二つのブログでコミュニケーションツールの議論が盛り上がっています.

ブログのシステムがさくさくと動くというのは見てもらうための第一条件ですが,それに加えて,意識の問題は大きいと思います.一日のうち 10 分でも他人のブログを見る習慣をつけるようにできないでしょうか.RSS を全く利用していない人が仲間内で何人もいるというのも意外でした.まずは,RSS を利用することから始めてみて下さい.Tyzoh ブログであれば http://www.tyzoh.jp/community/ikarashi/rss.xml を RSS リーダに登録しておくだけで,メールと同じような感覚でブログを読むことができます(私は Mozilla Thunderbird で利用しています.)

習慣だけでなく,職場の文化もそれに対応して変える必要があります.ブログを見ていても当たり前,むしろ勤務時間の何パーセントかをそういう情報収集のために使うことを奨励するようなマネジメントがなければ,ブログを見る文化は育ちません.ブログに限らず,コミュニティに参加することも同様です.マネジメントは従業員が Tyzoh ブログなどを見ることをむしろ強制してもいいくらいだと思っています.

オフラインで「昨日のブログ読んだ?」「あれについてどう思う?」くらいの軽い議論ができる素地が無ければ,いくらツールを良くしてもオンラインで議論ができるわけがありません.ましてや独創的なアイディアの共創なんて夢の夢.ツールを議論する前に,意識改革をしていくことです.

もちろん,そのためにも質の良い記事を提供するということも必要です.その一方で,毎日何か新しい記事があるということも重要で,なんでもいいからいつも更新されていることは来訪者をあきさせない手段でもあります.あまりにもくだらないと,リピーターがいなくなってしまいますけど,たまにはバカ話(私の場合は毎週金曜日の TGIF のコーナー)もあったりすると息抜きにはなります(なると思うんですが...違う?).

さて,ブログの提供側の話も書いておきましょう.私の場合,ブログを書いている理由は以下のようなものです.

  • 誰かが自分の意見を聞いてくれる(読んでくれる)のがうれしい.
  • 自分の発信した情報が誰かに役立てればうれしい.
  • 困っているので助けて欲しい.情報,意見が欲しい.
  • コメントなどで他人とコミュニケーションするのが楽しい.


他にもこまごまとした理由がありますが,こういう自発的なモチベーションがないと,なかなか書き続けるのは難しいでしょう.

Secure-SBM の開発日記では,稚拙ながらコードも載せていますが,少しでも Perl Catalyst をやっている人に参考になればと思って書いています.この場合にはすべてのひとに読んでもらうというよりは,検索サイトからでも見てもらえればいいなという気持ちが強いですね.もちろん,オープンソースで公開しているので,その解説という性質が強いですが.あとは,アイツはこんなことをやっているのか,と知ってもらえるためでしょうか...このコードはもっとこうするといいよ,というコメントがもらえたら最高です.

まぁ,とにかく,他人のブログを読みましょうよ,ってことです.読んで,何も感じないのか,大きくうなずいて自分の糧にするのか,はたまたコレは違うぞと自分の中で考えるきっかけにするのか,それはアナタの自由です.ついでにアクションを起こして思い切ってコメントしてみるというのもやってみましょう.コメントでのコミュニケーションも楽しいものですよ.

そしてマネジメントの皆さん.生産性を上げるためにあえて時間を許す,そういう文化を育てましょうよ.

 

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

[Secure-SBM:022] User と Tag の関連付け

こんにちは,五十嵐です.Version 0.3 に向けて作業を開始しています.まず始めに,ユーザが使用しているタグの一覧を作成するのに時間がかかるため,ユーザとタグを直接紐付けるテーブルを作成しました.

CREATE TABLE user_tags ( 
        user_tag_id     SERIAL, 
        user_id                 INTEGER, 
        tag_id                  INTEGER, 
        PRIMARY KEY(user_tag_id), 
        FOREIGN KEY(user_id) REFERENCES users(user_id), 
        FOREIGN KEY(tag_id) REFERENCES tags(tag_id) 
);


今まで運用していた場合には,紐付けが宙ぶらりんになってしまいますので,Version 0.2 からのバージョンアップ用に,紐付けを行うアクション updateFromVersion02 を追加しました.admin で呼び出します.

sub updateFromVersion02 : Local {
    my ( $self, $c ) = @_;

    my $num = 0;
    $c->stash->{pagetitle} = 'Secure-SBM Users-Tags Update';
    $c->stash->{template} = 'admin/updatefromversion02.tt';

    $c->model('SecureSBMDB::UserTag')->delete_all;
    foreach my $udb ($c->model('SecureSBMDB::User')->all){
        my $uid = $udb->user_id;
        foreach my $ubdb ($udb->user_bookmarks->all){
            foreach my $ubtdb ($ubdb->user_bookmark_tags->all){
                my $tid = $ubtdb->tag_id;
                if( $c->model('SecureSBMDB::UserTag')->find_or_create({
                        user_id => $uid,
                        tag_id  => $tid
                    })
                ){
                    $num++;
                }
            }
        }
    }

    $c->stash->{resultnum} = $num;

} # end of updateFromVersion02()

/admin/updateFromVersion02 を呼ぶと user_tags テーブルが更新されます.

あとは,タグを更新する際に必ず呼ばれる _registTags() 関数を変更します.
       $c->model('SecureSBMDB::UserTag')-> 
             find_or_create( 
                        { 
                             user_id => $uid, 
                             tag_id  => $tid 
                         } 
                    ); 

いままでは,ブックマークの一覧を呼び出して,タグを検索していましたが,これで直接一覧を得られるので,ユーザに紐付けられたタグ一覧の取得が少し速くなりました.

2007/06/22 記

参考:


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

 

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

検索バー Suggest 機能の応答フォーマット

呼ばれて飛び出てジャジャジャジャ~ん.こんにちは,五十嵐でごじゃる.sato さんの「suggest 付き検索バー」で「ikarashiさんが調べて」と書いてあるので...

と言っても,Mozilla のサイトにフォーマットが書いてあるのでその通りに書けばいいんですけどね.

JSON の二つのフォーマット(私の拙い訳をつけておきます):引用:
* A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
* An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

(拙訳:
* name と value の組の集合.色々な(開発)言語では object, record, struct, dictionary, hash table, keyed list, associative array などで表される.
* 順序付けされた値 (value) のリスト.多くの言語では 配列,ベクトル, リスト,シーケンスなどで表される.
)
このうち二番目の順序で決まっている方を使います.

検索語が与えられたときに,応答は
  1. 検索語(value)
  2. 候補リスト(array)
  3. 説明(オプション, array)
  4. 検索 URL(オプション, array)

という順序の配列で返します.具体的には "fir" いう検索語が与えられた場合には
引用:
["fir", ["firefox", "first choice", "mozilla firefox"], [], []]
という具合に返します.後ろの二つはオプションですから無くても構いません.また,Firefox 2 ではこれらの二つのオプションは無視されるそうです.

suggest 付き検索バー」の例で
引用:
["tP", ["tPod", "tPodBMP", "tPodText"],[],[]]


となっていましたが,
["tP", ["tPod", "tPodBMP", "tPodText"]]
でもかまいません.

というわけで,Secure-SBM にも搭載予定ですが,Version 0.4 でのリリースになりそうです.

 

いかちょー (2007-07-10 17:14) | コメント(0)| トラックバック(2)

[Secure-SBM:021] Firefox / IE 用検索バー

こんにちは,五十嵐です.sato さんの 「firefox 用 tPod 検索バー (2007/07/06)」に刺激を受けて,Secure-SBM でも検索バー用のプラグインを作ってみました.本当は Version 0.4.0 リリース時に作るつもりだったのですが前倒しです.検索バーのみで,いわゆるプラグインではありません.

フォーマット等は「Creating OpenSearch plugins for Firefox」「Internet Explorer 7 における検索プロバイダの拡張性 」「 OpenSearch description document」を参考にしています.


sato さんの説明では,"c:\Program Files\Mozilla Firefox\searchplugins" に xml ファイルを置くということでしたが,これは使用者全員に登録されることになります.個人の設定の場合には,"C:\Documents and Settings\UserName\Application Data\Mozilla\Firefox\Profiles\環境次第.default\searchplugins" に "Secure-SBM.xml" などとして置くことになります.Linux/UNIX 系の場合には,"~/.mozilla/firefox/*.default/searchplugins/Secure-SBM.xml" としてください.

Firefox 2.x/IE7, Secure-SBM 0.2.0(リリース済み)
<?xml version="1.0" encoding="UTF-8" ?>
<OpenSearchDescription
        xmlns="http://a9.com/-/spec/opensearch/1.1/"
        xmlns:moz="http://www.mozilla.org/2006/browser/search/">
  <ShortName>Secure-SBM</ShortName>
  <Description>Secure-SBM(セキュア・ソーシャル・ブックマーク)検索</Description>
  <InputEncoding>UTF-8</InputEncoding>
  <Image width="16" height="16">
    data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAA
    QAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBWiAAglsgAH5
    aJQB%2FWyUAflsmAHVaMwCAXyoAeV42AINhLQCHYy0Ae2A6AIpoNQCJaTgAi
    2s6AI1sOgCQbjsAim1AAI5uPgCRcD4AkXFBAIpvSQCOcUYAjXNKAJR1RgCXd
    0gAjnVQAJh4SQCWeEsAj3ZSAJZ5TACTeVIAm3tNAJl7TgCUe1QAkHpYAJp9U
    QCVfFUAm35SAJ1%2FUACcf1IAn4JVAJF%2BYwCchmIAq5VzAJGRkQCwmXkAs
    pt2ALSdewComocAlpaWALWefAC3oX8AtaGCAKmejQC2ooIAq5%2BNALmjgQC
    4o4IAuaSFALilhwC9qYoAs6eUAL6qjQC%2Fq40Av6uOAMCsjwCrq6sAuq%2B
    eAK2trQCyr6gAv7KeAL%2BznwCvr68AsbCuALCwsAC1sqwAsrGwALKysgDFt
    6IAt7SuALOzswC6ubUAybyrALm5uQDNvqkAurq6AMu%2FrADPwq4Avr6%2BA
    MbDvQDUyLcAxcXFANbKuADHx8cAzsvFANnOvADaz74AzszKANHNygDR0dEA3
    dXKANjVzwDh4eEA4uLiAOjk3gDp5d8A6ubgAOfn5wDp6OYA7erkAOnp6QDq6
    uoA7evnAO3r6ADv7OcA6%2BvrAOzs7ADt7e0A8O7tAPHv7ADv7%2B8A8PDwA
    PPx7gDz8e8A8fHxAPLy8gDz8%2FMA9vX0APX19QD29fUA9%2Fb0APb29gD39
    %2FcA%2Bvj1APr59wD6%2BfgA%2Bfn5APr6%2BAD7%2B%2FsA%2FPz7AP38%
    2BwD8%2FPwA%2Ff38AP39%2FQD%2B%2Fv4A%2F%2F%2F%2FAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkYh1bnl%2BgHyDioR4b4ORkZB
    1UyxCRFBdY1tNVTFTfZGRXwEdGwE3IGVFNScMUW6QkZEXPnsBYkB2KTBaCoi
    PkZGRMxMfJH9fMgZWVwFxkZGRkT8ZkAI%2BhgsEkS8NK5GRkZEYAxImbV8BT
    pGGABqJkZGQg359c2dreX58b2d1ipGRjWxeT0lIWGFZS0xKXXONkWABAQEBP
    UcBIwEBQ2Z0ipGLRo%2BDNAdwUoqBLQWNj5GRkYI6ISIUiHc2HhUckZGRkZE
    8FhEzaZEuECU5cpGRkZGRQQyHkVxoOCqOkVR6kZGRkYwoDgEPZIU7CQEIapG
    RkZGRkZGRkZGRkZGRkZGRkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D
  </Image>
  <Url type="text/html" 
     template="http://localhost:3000/searchbookmark?searchword={searchTerms}"/>
  <moz:SearchForm>http://localhost:3000/personal</moz:SearchForm>
</OpenSearchDescription>
<!--
This Program is distributed under version 1.0 of the Rinza Public
License Agreement, that is bundled with this package in the file
LICENSE, and is available through the website at the following URL:
http://www.tyzoh.jp/rinza/licenses/LICENSE-1.0.txt.

The Initial Developer of the Original Program is Nihon Unisys, Ltd.
The Original Program is copyrighted (C) 2007 by Nihon Unisys, Ltd.
with all rights reserved.
There is NO WARRANTY OF ANY KIND by the Initial Developer of the
Original Program.
-->
"http://localhost:3000" の部分を実際のサーバのアドレスとポート番号に変更して使用します.

Firefox 2.x/IE7, Secure-SBM 0.3.x(開発中) 用
<?xml version="1.0" encoding="UTF-8" ?>
<OpenSearchDescription
        xmlns="http://a9.com/-/spec/opensearch/1.1/"
        xmlns:moz="http://www.mozilla.org/2006/browser/search/">
  <ShortName>Secure-SBM</ShortName>
  <Description>Secure-SBM(セキュア・ソーシャル・ブックマーク)検索</Description>
  <InputEncoding>UTF-8</InputEncoding>
  <Image width="16" height="16">
    data:image/x-icon;base64,AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAA
    QAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBWiAAglsgAH5
    aJQB%2FWyUAflsmAHVaMwCAXyoAeV42AINhLQCHYy0Ae2A6AIpoNQCJaTgAi
    2s6AI1sOgCQbjsAim1AAI5uPgCRcD4AkXFBAIpvSQCOcUYAjXNKAJR1RgCXd
    0gAjnVQAJh4SQCWeEsAj3ZSAJZ5TACTeVIAm3tNAJl7TgCUe1QAkHpYAJp9U
    QCVfFUAm35SAJ1%2FUACcf1IAn4JVAJF%2BYwCchmIAq5VzAJGRkQCwmXkAs
    pt2ALSdewComocAlpaWALWefAC3oX8AtaGCAKmejQC2ooIAq5%2BNALmjgQC
    4o4IAuaSFALilhwC9qYoAs6eUAL6qjQC%2Fq40Av6uOAMCsjwCrq6sAuq%2B
    eAK2trQCyr6gAv7KeAL%2BznwCvr68AsbCuALCwsAC1sqwAsrGwALKysgDFt
    6IAt7SuALOzswC6ubUAybyrALm5uQDNvqkAurq6AMu%2FrADPwq4Avr6%2BA
    MbDvQDUyLcAxcXFANbKuADHx8cAzsvFANnOvADaz74AzszKANHNygDR0dEA3
    dXKANjVzwDh4eEA4uLiAOjk3gDp5d8A6ubgAOfn5wDp6OYA7erkAOnp6QDq6
    uoA7evnAO3r6ADv7OcA6%2BvrAOzs7ADt7e0A8O7tAPHv7ADv7%2B8A8PDwA
    PPx7gDz8e8A8fHxAPLy8gDz8%2FMA9vX0APX19QD29fUA9%2Fb0APb29gD39
    %2FcA%2Bvj1APr59wD6%2BfgA%2Bfn5APr6%2BAD7%2B%2FsA%2FPz7AP38%
    2BwD8%2FPwA%2Ff38AP39%2FQD%2B%2Fv4A%2F%2F%2F%2FAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkYh1bnl%2BgHyDioR4b4ORkZB
    1UyxCRFBdY1tNVTFTfZGRXwEdGwE3IGVFNScMUW6QkZEXPnsBYkB2KTBaCoi
    PkZGRMxMfJH9fMgZWVwFxkZGRkT8ZkAI%2BhgsEkS8NK5GRkZEYAxImbV8BT
    pGGABqJkZGQg359c2dreX58b2d1ipGRjWxeT0lIWGFZS0xKXXONkWABAQEBP
    UcBIwEBQ2Z0ipGLRo%2BDNAdwUoqBLQWNj5GRkYI6ISIUiHc2HhUckZGRkZE
    8FhEzaZEuECU5cpGRkZGRQQyHkVxoOCqOkVR6kZGRkYwoDgEPZIU7CQEIapG
    RkZGRkZGRkZGRkZGRkZGRkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D
  </Image>
  <Url type="text/html" 
     template="http://localhost:3000/searchbookmark?q={searchTerms}"/>
  <moz:SearchForm>http://localhost:3000/personal</moz:SearchForm>
</OpenSearchDescription>
<!--
This Program is distributed under version 1.0 of the Rinza Public
License Agreement, that is bundled with this package in the file
LICENSE, and is available through the website at the following URL:
http://www.tyzoh.jp/rinza/licenses/LICENSE-1.0.txt.

The Initial Developer of the Original Program is Nihon Unisys, Ltd.
The Original Program is copyrighted (C) 2007 by Nihon Unisys, Ltd.
with all rights reserved.
There is NO WARRANTY OF ANY KIND by the Initial Developer of the
Original Program.
-->

"http://localhost:3000" の部分を実際のサーバのアドレスとポート番号に変更して使用します.

 

[Secure-SBM:021] Firefox / IE 用検索バーの続きを読む

いかちょー (2007-07-09 10:04) | コメント(0)| トラックバック(18)

[Secure-SBM:020] ロール処理

こんにちは,五十嵐です.金曜日ですが,Secure-SBM の開発日記.毎週恒例の TGIF はお休みです.

Secure-SBM という名前の割には,今までロール(グループ)に関しては触れてきませんでした.今回はロールの処理を追加します.

表示の際には必ず _makeOneBookmarkEntry() を呼び出します.この処理に _checkRole() 関数呼び出しを追加して,参照できるブックマークかどうかを確認します.
lib/SecureSBM/Controller/Personal.pm (_makeOneBookmarkEntry 関数):
    unless( _checkRole( $c, $bookmark_id ) ){
        return undef;
    }

(_checkRole 関数):
sub _checkRole : Private {
    my ( $c, $bookmark_id ) = @_; 
    my $udb = $c->stash->{user};

    if( my $bdb = $c->model('SecureSBMDB::Bookmark')->
        find( {bookmark_id => $bookmark_id} )
    ){  
        foreach my $brole ($bdb->roles->all){
            foreach my $urole ($udb->roles->all){
                if( $brole->role_id == $urole->role_id ){
                    return 1;
                }   
            }
        }
    }
    return 0;
}

(Version 0.3 では使用していません)

ここまでは表示の話ですので,登録されたロールの比較だけで簡単に表示の有無が決まります.ブックマークをどのロールに登録するのかという点は,誰がそれを設定するのかという点も含めて考える必要があります.

  • ブックマークの初期登録時には,public のみが紐づけられる.

  • ロールの登録と削除は管理者(admin)のみが行える.
    • ユーザの所属するロール

  • ユーザ自らが所有するブックマークに対するロールへの処理は,ユーザが所属するロールに限られる.

この程度は基本項目として決められます.問題になるのは,ブックマークを複数のユーザが共有している場合に,公開すべきロールを誰がきめるかということになります.ファイルの登録とは異なり,ブックマークのオーナーという概念はなじみません.一般公開されているものはブックマークそのものを隠しても意味がありません.ロールが意味を持つのは,他人のブックマークの一覧を見る場合に限られます.他人のブックマークを見る方法はふたつあります.public に登録されているブックマークを非ユーザに公開する場合と,他のユーザのブックマークを参照する場合です.今回のバージョンでは全体の検索は提供しませんが,いずれその機能を提供する場合にはロールが意味を持ってきます.非ユーザが参照できるのは public ロールに登録されたブックマークのみです.

ブックマークを公開するように設定できるのはだれか,ということですが,誰か一人でも public に設定すると公開できる方法と,オーナの全てが public にしないと公開されないという方法が考えられます.public 情報を共有するという考え方からみると,ブックマークを登録するたびにひとつひとつをわざわざ公開設定するのは煩わしいです.登録時に簡単に選択できるようにチェックボックスを用意しておくのが良いと思われます.もう少し厳密には,何かしらのロール(public以外)に属するブックマークは public には属さないということになります.

ここで,「ソーシャル」の部分に目を向けると,他人のブックマークが見れることが大切で,「セキュア」とのトレードオフを考えなければなりません.結論としては,誰か一人が public に設定してあれば,全体としてはブックマークは公開されます.ただし,public に設定していないユーザがその URL をブックマークしていることは秘匿するようにします.

最後に,ロール R1 に所属するユーザ U1 がブックマーク B1 をロール R1 に紐付けたとき,ロール R1 とロール R2 に所属するユーザ U2 がブックマーク B1 をロール R2 に紐付けることを妨げることはできません.そのため,隠れチャネルを完全に避けることは困難です.これについては今後の課題です.

2007/04/05 記

参考:

 

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

 

いかちょー (2007-07-06 23:28) | コメント(0)| トラックバック(3)

Web用の画像ボタンのまとめ

こんにちは,五十嵐です.

HTML で javascript と組み合わせて画像をボタンとして設置するための方法をまとめてみました.


ボタンの形状をそろえるために,スタイルシートを設定しておきます.

<style type="text/css">
<!--

.imgbutton1720 {
  cursor: pointer;
}

.imgbutton1720_2 {
  width: 32px;
  height: 32px;
}

.imgbutton1720_3 {
  border: 0px;
  margin: 0px;
  padding: 0px;
}
-->
</style>

1. FORM + INPUT を使う方法


<form method="POST" action="http://www.tyzoh.jp/modules/weblog/details.php?blog_id=1720">
<input type="image" src="http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png"
alt="submit" 
title="実行"
class="imgbutton1720_2"
name="input1720_1"
id="input1720_1_2"
/>
</form>

<script type/javascript>
<!--
document.getElementById('input1720_1_2').onmouseover = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/276.jpg";
}

document.getElementById('input1720_1_2').onmouseout = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/273.png";
}
// -->
</script>

form の中で使うと,javascript を使わずに submit と同じ動きができます.何か指定する場合には document.フォーム名.inputのname でアクセスできます.もちろん,id も使うことができます.画像の上にマウスを持っていった時に,自動的に pointer になってくれるのもメリットです.画像そのものを動的に変更したい場合には,getElementById を使う必要があります.

2. FORM なし INPUT を使う方法

<input 
type="image" src="http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png"
alt="submit" 
title="実行" 
name="img1720_2"
id="img1720_2_2"
class="imgbutton1720_2"
/>

<script>
<!--
document.getElementById('img1720_2_2').onclick = function(){
  location.href="http://www.tyzoh.jp/modules/weblog/details.php?blog_id=1720";
}

document.getElementById('img1720_2_2').onmouseover = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/276.jpg";
}

document.getElementById('img1720_2_2').onmouseout = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png";
}
// -->
</script>

form を使わない input では,動作を指定する必要があります.document.フォーム名.inputのname が使えないので,getElementById で id からオブジェクトを取り出してアクションを指定する必要があります.ポインタは自動的に pointer になります.

3. IMG を使う方法

submit

<img
src="http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png"
name="img1720_3" 
alt="submit"
title="実行"
class="imgbutton1720 imgbutton1720_2" 
/>

<script type/javascript>
<!--
document.img1720_3.onclick = function(){
  location.href = "http://www.tyzoh.jp/modules/weblog/details.php?blog_id=1720";
}

document.img1720_3.onmouseover = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/276.jpg";
}

document.img1720_3.onmouseout = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/273.png";
}
// -->
</script>

img タグの場合には明示的に動作を指定する必要があります.name フィールドを使って document.img タグの name でアクセスできます.ポインタの形状は明示的に指定する必要があります.

4. IMG を使う方法 2

submit

<img
src="http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png"
id="img1720_4" 
alt="submit"
title="実行"
class="imgbutton1720 imgbutton1720_2"
/>

<script type/javascript>
<!--
document.getElementById('img1720_4').onclick = function(){
  location.href = "http://www.tyzoh.jp/modules/weblog/details.php?blog_id=1720";
}

document.getElementById('img1720_4').onmouseover = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/276.jpg";
}

document.getElementById('img1720_4').onmouseout = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/273.png";
}
// -->
</script>

4 番目の方法と img タグを使う点は同じですが,getElementById で id をつかって動作を指定しています.ポインタの形状は指定する必要があります.

5. BUTTON を使う方法

<button 
type="button" 
id="img1720_5_1" 
class="imgbutton1720 imgbutton1720_3" 
alt="submit">
<img
src="http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png"
name="img1720_5_2" 
alt="submit"
title="実行"
class="imgbutton1720 imgbutton1720_2 imgbutton1720_3"
id="img1720_5_3"
/>
</button>

<script type="text/javascript">
<!--
document.getElementById('img1720_5_1').onclick = function (){
  location.href="http://www.tyzoh.jp/modules/weblog/details.php?blog_id=1720";
}

document.getElementById('img1720_5_3').onmouseover = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/276.jpg";
}

document.getElementById('img1720_5_3').onmouseout = function(){
  this.src = "http://www.tyzoh.jp/uploads/weblog_imagephotos/273.png";
}
// -->
</script>

button は汎用的ですが,ボタンの形状そのものを変更できません.スタイルシートで button の形状を画像に指定したりできるといいのですが...

getElementById で id にアクセスする必要があります.ポインタも明示的に変更しなければ pointer にはなってくれません.画像を動的に変更させる方法がわかりませんでした.



スタイルシートで画像を指定しておいて, class を切り替えると画像が変わるような仕組みができるといいんですが,スタイルシートで画像を指定する方法がわかりませんでした.innerHTML で img タグそのものを書き換えてやるとできるのでしょう.


<style type="text/css">
button {
  img: http://foo.bar.jp/hoge.gif;
}
</style>

とかやりたいんですけどねぇ...



【追記】watanabe さんから教えてもらいました.

スタイルシートで,background を使うのだそうです.ただし,IE で「BUG: WinXP: DHTML CSS background-image プロパティは BUTTON 要素に機能しません。」という問題があるようなので,background-image は使えません.



<style type="text/css">
<!-- 
button.engageimage1720 {
  background: url('http://www.tyzoh.jp/uploads/weblog_imagephotos/276.jpg');
  cursor: pointer;
}

button.editimage1720 {
  background: url('http://www.tyzoh.jp/uploads/weblog_imagethumbs/273.png');
  cursor: pointer;
}
-->
</style>

<button class="editimage1720 imgbutton1720_2" id="button1720_6"></button>

<script type="text/javascript">
<!-- 
document.getElementById('button1720_6').onclick = function(){
  location.href="http://www.tyzoh.jp/modules/weblog/details.php?blog_id=1720";
}

document.getElementById('button1720_6').onmouseover = function(){
  this.className = "engageimage1720 imgbutton1720_2";
}

document.getElementById('button1720_6').onmouseout = function(){
  this.className = "editimage1720 imgbutton1720_2";
}
// -->
</script>


バックグラウンドの画像の大きさを変えられないのが難点です.

 

いかちょー (2007-07-05 10:48) | コメント(0)| トラックバック(5)

「iPhoneが当たりました」という便乗スパム

こんにちは,五十嵐です.便乗スパムや便乗ワームが出回っているようです.


ハリーポッターに便乗するスパムやワームもあるようです.自分は引っかからないぞ,とか思っていても,子供たちはその気になって感染が広がる可能性もありますね.根本的なスパム対策ってないものでしょうか.

 

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

[Secure-SBM:019] タグによる検索

こんにちは五十嵐です.タグによる検索の設定です.表示されたタグをクリックして,同じタグを持つブックマークを表示します.

ブックマークの一覧でタグを表示させましたが,その部分を以下のように変更します.
root/template/personal/personal_center.tt:
[%- FOREACH tag_v IN bookmark_v.tags -%]
  [%- SET tagelement = 'tag_' _ bookmark_v.id _ tag_v | html | collapse -%]
  <span id="[% tagelement %]" class="eachtag">
  [%- tag_v | html %]</span>,
[%- END -%]

javascript を追加して,マウスのポインタがタグ表示の上を通過したときに表示が変わるようにします.
[% FOREACH tag_v IN bookmark_v.tags %]
    [%- SET tagelement = 'tag_' _ bookmark_v.id _ tag_v | html | collapse -%]
    var var_[% tagelement %]
        = _getElementById('[% tagelement %]');
    var_[% tagelement %].onmouseover
        = function () {
            this.style.color='#ffffff';
            this.style.background='#999999'; 
            this.style.cursor='pointer';
        }
    var_[% tagelement %].onmouseout
        = function () {
            this.style.color='#000000';
            this.style.background='#ffffff';
            this.style.cursor='auto';
        }
    var_[% tagelement %].onclick
        = function () {
            location.href 
                = '/searchbookmark?tag='
                    + encodeURI('[% tag_v | html %]');
        }
[% END %]
クリックすると /searchbookmark を呼び出します.

サーバ側ではタグに対応するブックマークを検索し,応答を返します.
sub searchbookmark : Path('/searchbookmark') {
    my ( $self, $c ) = @_;
...(省略)
    # Bookmark の検索
    $tid = $c->model('SecureSBMDB::Tag')->
                   find( {tag_name => $data{tag}} )->tag_id;
    foreach my $ub ($udb->user_bookmarks->all){
        foreach my $t ($ub->user_bookmark_tags->all){
            if( $t->tag_id == $tid ){
                my $tmpbe = _makeOneBookmarkEntry( $c, $ub->bookmark_id );
                if( $tmpbe ){
                    unshift( @bookmarks, $tmpbe );
                }
            }
        }
    }

    $c->stash->{pagetitle} = 'Secure-SBM Search Bookmark Result';
    $c->stash->{template} = 'personal/personal.tt';

    $c->stash->{mybookmarks} = \@bookmarks;
}
タグのマッチングを行い,結果を mybookmarks に格納しています._makeOneBookmarkEntry() は,「[Secure-SBM:017] ブックマークの登録(2)」 で使用したものです.テンプレートは personal.tt をそのまま使用します.

次回は,ロールに関する処理を追加します.

2007/04/02 記

参考:

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

 

いかちょー (2007-07-03 10:29) | コメント(0)| トラックバック(11)

[Secure-SBM:018] ブックマークの削除と編集

こんにちは,五十嵐です.ブックマークが登録できるようになりましたので,今度は削除と編集をできるようにしましょう.

まずは削除から.deletebookmark のアクションは非常にシンプルです.
lib/SecureSBM/Controller/Personal.pm:
sub deletebookmark : Path('/deletebookmark') {
    my ( $self, $c ) = @_;
    my $bookmarkid = $c->req->param('bookmark_id');
    my $uid = $c->stash->{user}->user_id;
    my $title;

    if( my $ubdb = $c->model('SecureSBMDB::UserBookmark')->
            find( {user_id => $uid, bookmark_id => $bookmarkid} )
    ){
        $title = $ubdb->bookmark->bookmark_title;
        $ubdb->user_bookmark_tags->delete_all;
        $ubdb->delete;
    }

    $c->flash->{resultmessage} = '「' . $title . '」を削除しました.';
    $c->res->redirect('/personal');
}
Model スキーマの記述により,user_bookmark_tags を利用して,変数 $ubdb から簡単に SecureSBMDB::UserBookmarkTag へアクセスできます.今回は flash を使用してみました.

これに対応するためにテンプレートも変更します.
root/template/personal/personal_center.tt:
<div id="resultmessage">
[% resultmessage || c.flash.resultmessage -%]
</div> <!-- end of resultmessage -->

削除ボタンを追加します.
<button type="button" id="deletebookmark_button[% bookmark_v.id %]">
削除
</button>
タグやコメントの表示部分を表示/非表示に切り替えるために,固有の id をつけて操作できるようにします.
<div id="bookmark_info[% bookmark_v.id %]">
タグ: [%- FOREACH tag_v IN bookmark_v.tags -%][% tag_v | html %],[% END -%]
<br />
コメント: [% bookmark_v.comment | html %]<br />
タイムスタンプ: [% bookmark_v.timestamp %]
</div> <!-- end of bookmark_info[% bookmark_v.id %] -->

[Secure-SBM:018] ブックマークの削除と編集の続きを読む

いかちょー (2007-07-02 20:10) | コメント(0)| トラックバック(5)

« 2007年6月 | メインページ | 2007年8月 »

プロフィール

いかちょー

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

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

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

RSSフィード

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

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