Sugmak's Log

A freelance programmer, coding, debugging, and even bug fixing his life...

2010年2月3日

WordCamp Fukuoka 2010 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

0A2DB2F4-575A-4DA3-B287-71C45FBFB6CB.jpg

WordPress関連のイベントが福岡で開催されます。私は当日、運営スタッフの一員として裏方の仕事をやっていますので、ステージ脇や受付周辺をウロウロしていると思います。見かけた方は声をかけてくださると喜びます。

話は変わって、私はWordPressにはもう4年くらい触っていないのですが、聞くところによると、最近ではブログツールとしてだけではなくCMSとして使われることが多いそうです。私はCMS自体を作ることに、仕事で毎日のように携わっていますが、既存の製品を使ったことは、まだ一度もありません。

たぶん私の仕事は服飾でいうところのオーダーメイドなんだと思います。既製品の服は、ぴったりとカスタマイズすることは難しいけれども、廉価で手が出しやすいというメリットがあります。そうやって多くのユーザーが集まり、同じ製品を愛する人たちの知恵が集結すれば、オーダーメイドにも負けないような結果が出せるんじゃないか?ということを、このイベントで見極めたいと思っています。

まだ定員まで余裕があります。興味のある方は是非ご参加ください。

2009年10月18日

「Fukuoka Perl Workshop #14」の開催についてと雑感 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

現在参加者募集中です。詳細はこちらからどうぞ。
Fukuoka Perl Mongers: 「Fukuoak Perl Workshop #14」開催のお知らせ

前回の記事にも書きましたが、先月開催されたYAPC::Asia 2009にイベントレポータとして参加したお陰で、Perlを愛して止まない多くの方々とお会いすることができました。初日の懇親会ではShibuya.pmリーダーの竹迫さんとYokohama.pmリーダーの栗原さんと集まってお話することができました。他にも「機会があればFukuoka.pmへ参加したい」という方々が何人もいらっしゃいました。東京から1000キロ以上離れた場所にあるFukuoka.pmですが、その距離が一気に縮まったような気がしました。

そのFukuoka.pmは2007年11月に設立されました。満2歳を向かえる来月、なんとJPA代表理事の牧大輔さんが、Fukuoka.pmへ参加されることになりました。牧さんには感謝この上もございません。また、このような繋がりが生まれつつあるのは、YAPC::Asiaのお陰であり、Perlコミュニティのお陰でもあります。本当に参加して良かったと思います。

2009年9月13日

YAPC::Asia 2009 大雑把な所感 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

私は今回、id:hirataraさんと共に、前夜祭も含めた全日程でgihyo.jpのイベント・レポーターなるものに挑戦しました。

http://gihyo.jp/news/report/01/yapcasia2009

レポータをやっていて「これは今後使われるケースが増えていくんじゃないか?」と思った技術的なキーワードをざっとリストアップしてみました(既に流行っているものもありますが)。全体的にPerlでのWebアプリケーションの作り方が、また新たな局面を迎えた感があります。

  • HTTP::EngineベースのWAF
  • PSGI/Plack
  • イベント駆動(AnyEvent)
  • スレッド(Coro)
  • 非同期
  • 継続
  • nginx

全てのセッションを聴講したわけではないので抜けがあると思います。その点はご了承ください。

ちなみにMooseは、第一線ではもうすっかり定着している感じで、現在はHTTP::EngineのようにMooseをベースとした成果物、さらにはそれをベースとしたMoose三世くらいの時代に入っているのかなと思いました。

最後に、YAPCのボランティアスタッフの皆様、JPAの皆様、そしてスピーカの皆様、本当にお疲れさまでした、そしてありがとうございました。

Perl大好き!

2009年2月17日

初めて本格的にJavaを使ってみていいと思ったところ Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

昨年の4月頃から仕事で本格的にJavaを使い始めました。ちなみにそれまでの自分の仕事をざっと言語別にみると「Perl、ActionScript、JavaScript、(時々)PHP」という感じで、いわゆるスクリプト言語が殆どでした。しかしここ1年を見ると、サーバーサイド言語に関してはPerlよりもJavaが多くなり、クライアントサイドがJavaScriptとActionScript、そしてバッジ処理、テキスト処理等の部分でPerlを使うという具合に変わってきています。

最初のうちはJavaという慣れないプラットフォームに戸惑いましたが、周囲にいらっしゃる優秀なJavaプログラマーの皆さんのおかげで、なんとか仕事で使えるレベルまで到達してきました。またスクリプト言語とJavaの双方を経験することにより、お互いの良いところ、あるいは足りないところを再認識できたのも、自分にとっての大きな収穫でした。

そこで今回は、私の感じたプラットフォームとしてのJavaが優れていると思った点をメモしてみたいと思います。

  1. VMの存在
    • JavaVM(Java仮想マシン)のおかげで、開発環境や実運用環境の構築の際に、OSの種類やバージョン等に振り回されることが少なくなりました。JavaVMという仮想世界に閉じこもることのできないスクリプト言語では、そうはいかない場合が多いのです。そういう意味で、Perl6から導入されるであろうParrotに期待しています。
  2. DIとAOP
    • Depandency Injection(依存性注入)とAOP(アスペクト指向プログラミング)。これらの概念が最も浸透している言語のひとつがJavaだと思います。DIとAOPについての詳しい説明はここでは省きますが、極めて平たく言うと、部品(オブジェクト)同士の依存関係を切り詰めることによって、全体の柔軟性を高めることが可能となり、その結果、メンテナンス性が高まるとか、テストがやり易くなる等のメリットを享受することができるというものです。特に規模の大きなプロジェクトでその効力を発揮します。ちなみに私はSeasar2というフレームワークをメインで使っています。
    • DIもAOPもスクリプト言語ではあまり馴染のない概念ですが、現在私はPerlのDIフレームワークであるBread::Boardを弄っています。Perlの場合、Mooseあるいは将来登場するPerl6のように、成熟した純然たるオブジェクト指向で書けるようになるつれて、DIやAOPのような概念がどんどん普及してくるのではないかと思っています。そういう意味で近い将来に期待したいと思います。
  3. 周辺技術の充実
    1. IDE
      • スクリプト言語のコーディングやXHTMLのマークアップの際にはVimかEmacsを使いますが、Javaプログラミングでは専らElipseを使っています。Javaのように静的な型付けをする言語の場合、型を補完したりチェックしてくれるIDEがないとかなり厳しいと思います。定番と呼ばれるものには、それなりの理由があって、Eclipseの場合も慣れてしまえば本当に便利なツールになるはずです。
    2. Maven
      • プロジェクトのスケルトン作成、依存ライブラリの管理、ビルド、テスト、そしてデプロイ(サーバーへの配備)まで、一貫して面倒を見てくれるツールです。スクリプト言語の場合だと、複数のツールをいろいろ組み合わせて実現するようなことを、Mavenの場合には、これひとつで一貫してできるというのがポイントです。また意外と柔軟性もあって、豊富なpluginを使ってさらに便利に拡張することも可能ですし、Antやシェルスクリプトなど他のツールと組み合わせて使うこともできます。最初のうちはMavenの仕様というか哲学みたいなものを理解するのに時間がかかりましたが、理解が深まるにつれて、とても便利なツールだということを実感しました。
    3. Tomcat
      • 実績のある定番アプリケーションサーバーの存在は、特に実運用の際に心強いものです。スクリプト言語にもそれぞれ定番の運用環境はあるものの、Tomcatほど簡単に設置できるものは見かけません。やはりここでもプラットフォームの差異を吸収してくれるVMの存在が大きいのかも知れません。
    4. CIツール
      • 有名なものとしてはHudsonとContiniumがあります。言語を問わずソフトウェアの品質を維持・管理する上で、「コンピューターにできることは、できる限り自動的にそして定期的にコンピューターにやらせる」というのはとても大切なことだと思います。私も今後はこのCI(継続的インテグレーション)という概念を、スクリプト言語にも積極的に取り入れたいと思っています。
  4. 豊富な情報量
  • これは書店の技術書のコーナーへ行くとわかるのですが、プログラミング言語の場合、おそらくJavaに関する書籍の数が最も多いのではないでしょうか?英語が苦にならないような現場ならば別ですが、大抵の場合、日本語の情報量が豊富というのは、かなり重要な要因になると思います。

以上、大雑把ですが、ざっとまとめてみました。今後もJavaとスクリプト言語のお互いの良いところを取り入れながら、適材適所で上手く使い分けていきたいと思います。

2008年12月6日

LaunchBar 5の新機能 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

NEXTSTEP/OPENSTEPの時代から、知る人ぞ知るLaunchBarですが、ついにバージョン5のβ版が出ました。 今回も期待を裏切ることなくさらに便利になっています。

以下、新バージョンをざっと使ってみて、便利だと思った機能をリストアップしてみました。

  • Firefox3のブックマークや履歴をサポート。
    • 以前のFirefoxのブックマークや履歴をLaunchBarのインデックス画面(Cmd+Opt+i)で削除してから、再度登録する必要があるようです。
    • Firefoxで使われているSQLiteの性質上、 Firefoxの起動中はインデックスのアップデートをしてくれないようです。
  • 設定画面でホットキーがいろいろとカスタマイズできるようになりました。
  • Clipboard History
    • クリップボードの履歴を再利用できます。
  • クリップマージ
    • Cmd-C を2回押すことで、選択したクリップボード履歴を現在のクリップボードに追加することができます。
  • Quick Look
    • アイテムを表示した状態で Space(または Cmd+Y) を押すとファイルの内容を閲覧できます。もう一度Spaceを押すと閉じます。
    • Cmd + Option + Y でフルスクリーン表示。
    • この機能の追加により、インデックス画面を表示するためのショートカットが、Cmd+Yから Cmd+Opt+i に変更されたようです。
  • ファイルをフォルダーに送るときのキーバインド
    • ファイルを選択してから、Tabを押して送り先のフォルダを選択する。このとき
      • Cmd+Return で移動(既存のファイルは上書きされます)
      • Cmd+Option+Return でコピー(既存のファイルは上書きされます)
    • ファイルを選択するときにCmd+Aで複数アイテム選択(LaunchBarで一覧表示されているアイテムが全て選択されます)
  • iCalサポート
    • LaunchBarからiCalにイベントやTo-doを追加できるようになりました。
      • カレンダーを表示してSpaceを押すと入力できるようになります。
        • イベントの入力フォーマットは、 description @ date [and time]
        • To-doの入力フォーマットは、description または description > due date.
  • 新しいActionの追加
    • 「Actions」の中にいろいろと便利なActionが入っていますので、是非一度目を通しておくと良いと思います。
    • Actionの実体はAppleScriptやシェルスクリプトですので、 ~/Library/Application Support/LaunchBar/Actions の中に自作のActionを登録すれば、LaunchBarをさらに便利に拡張していくことができます。
    • 以下便利そうなAction
      • ファイルを選択して→ Compress でZIPアーカイブ。
      • ファイルを選択して→ Copy as PlainText でファイルのパスをコピー
      • Show IP Address で現在のIPアドレスを表示。
      • 起動中のアプリケーションを表示して(Cmd+R)→ Quit Application で終了
      • Quit All Application で全てのアプリケーションを終了
      • 画像ファイルを選択して→フォーマット変更、反転、回転などもできます。
  • その他
    • Search Templateで Shift+Space を押すと、最後に入力した検索文字列を再利用できるようになりました。
  • 電卓機能(Calculator)
    • かなり高機能になってます。
    • bcベースになりました。
    • 対数、分数、指数、三角関数などが扱えるようになりました。
      • 下記はショートカットの一部です。
        • P →pow(|)
          • 例)pow(2|3)で「2の3乗」
        • Q →Sqrt()
        • G →log()
        • S →sin()
        • C →cos()
        • T →tan()
        • R →1/()
        • D →lD()
        • AS →asin()
    • 以前は数字キーを押すといきなりCalculatorが起動していたのですが、設定画面でそれを無効にできるようになりました。
  • 自動ソフトウェアアップデート機能が付きました。

2008年11月15日

「The evolution of Perl frameworks」日本語要約 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

原文は The evolution of Perl frameworks

Perlフレームワークの進化

西暦2006年、Perl製Webフレームワークの土俵では重量級のCatalystと軽量級のCGI::Applicationが戦っていた。その後、Perl製フレームワークの選択肢は進化を遂げた。CGI::ApplicationとCatalystは共に人気を保っているものの、最近では新たな選択肢もいくつか登場した。以下でザッと説明しよう。

Titanium
CGI::Applicationにお勧めのプラグイン集と統一されたドキュメントがバンドルされたもので、インストールは比較的簡単である
ベースとなっているコンポーネントは既に使われている安定したもので、改名してあるものの、安心かつ安定して使えるものである
将来、より簡単にインストールできるように、依存関係チェーンを盛り込んだパッケージダウンロードの仕組みが提供される予定である
HTTP::Engine
Catalystに見られるようなHTTPリクエストオブジェクトをMooseをベースで発展させたもの
Webアプリケーションを様々なサーバーバックエンド上で動作させるための抽象化を取り入れている
手短かに言うと、Webフレームワーク中のHTTP部分にフォーカスしたものである
MojoとMojolicious
Catalystの初期コントリビューターの一人であるSebastian Riedel氏率いるプロジェクトを代表するもの
Mojoは"core Perl"に依存しないという特色がある
MojoはHTTP::Engineのような低レベルなHTTPコンポーネントを提供している
一方のMojoliciousは、Mojo上に一つの完成したフレームを構築可能なことを示すものである
Mojoliciousの特徴的な機能として、目新しいディスパッチの設計があるが、これはRuby on Railsの"Routes"の精神に基づいている
私の見る最近のトレンド
共通基盤
Perlフレームワークが高レベルなところで歩み続ける一方で、私たちは引き続き、有用なモジュールを共有することで協力していく
たとえばHTTP::FillInFormやData::FormValidatorのようなプロジェクトは、いくつかのフレームワークで使われているが、再発明されることはない。
CGI.pm死すべし
私たちが同じモジュールを共有する一方、HTTP::EngineとCatalystとMojoは全て固有のHTTPリクエストオブジェクトを考案しており、それらがCGI.pmの機能を置き換えている。
そこには明らかに、CGI名前空間内に172のサブルーチンを詰め込んだ定番モジュールを越えた利益がある。
(この点に関してCGI::Applicationは中立的な立場を維持しており、クエリーオブジェクトをアウトソーシングしている)
収束の可能性
CGI::ApplicationとCatalystではPluginの多くがかなり類似しているものの互換性は無い。これらはオープンソースなので、通常あるフレームワークから別のものへ移植することは簡単ではあるが、それは望ましいことでは無い。
HTTP::EngineとMojoは共に「フレームワークのためのフレームワーク」のようなものである。
軽量なフレームワークあるいは際立ったフレームワークを使いたがるプログラマー達には人目を引くような経験をもたらすとはいえ、私が思うに、プロジェクトにとっての将来性は、どちらかのバックエンドを使うということで落ち着くだろう。
結果、それは広くPerlコミュニティにとって有益な"web framework plugins"ということになるだろう

Mark Stosberg氏は10年以上の間、WebプログラミングにPerlを使い続けてきました。氏はSummersaultにおける開発の主役であり、TitaniumやData::FormValidatorを含むいくつかのCPANモジュールのメンテナーでもあります。

2008年11月9日

Catalystで一行掲示板 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

Fukuoka Perl Mongers第12回定例勉強会で発表させていただいた資料を公開します。アプリケーションとしては、かなり貧弱なものですが、Catalystの触りの部分だけでも理解していただければ幸いです。

Catalystで一行掲示板

目的

  1. とにかくCatalystで動作するものを作ってみる。
  2. 実装は簡単に。
    • ログイン/ログアウトは実装する。
    • DBのテーブルリレーションは一箇所くらいやってみる。
  3. DBは設置が簡単なSQLiteを使う。

今回実装した機能

  1. 一行掲示板
  2. ログイン機能
  3. 一覧表示機能
  4. コメント投稿機能
  5. バリデーションは実装していません。
  6. 画面デザインは全くやってません。

開発環境

  1. Mac OS X 10.5
    • ターミナル
    • テキストエディタ
    • Webブラウザ
  2. Perl 5.8.8
  3. Sqlite3
  4. Catalyst (5.7014)
  5. DBIx::Class (0.08010)
  6. DBIx::Class::Schema::Loader (0.04005)
  7. Template Toolkit (2.20)

インストール

PerlとSQLiteは既にインストールしてあるものとして解説します。

Catalystのインストール

cpan -i Task::Catalyst

もしテストが失敗して、インストールできないようだったら、

cpan -if Task::Catalyst

アプリケーションのスケルトンを作成

適当なディレクトリへ移動してから、以下のコマンドを実行

catalyst.pl MyBBS

アプリケーションのルートディレクトリへ入る

cd MyBBS/

以下、ファイル名やスクリプトの実行などは、このディレクトリを基点に解説しています。

開発用サーバー起動

perl script/mybbs_server.pl -r

プラウザでhttp://localhost:3000/ にアクセスしてみる。

停止させる場合は、 キーボードの Ctrl+c

初期設定

とりあえず使いそうなモジュールを追記しておきます。

lib/MyBBS.pm

use Catalyst qw/
    -Debug
    ConfigLoader
    Static::Simple
    StackTrace
    /;

URIマッピングを決める

ログイン画面
/login
ログアウト画面
/logout
コメント入力画面
/comment
コメント一覧画面
/comment/list

コントローラー名決定

Root.pm (既にある)
Login.pm
Logout.pm
Comment.pm

コントローラー(Controller)生成

以下のコマンドを実行すると上記のControllerが lib/MyBBS/Controller ディレクトリ内に作られます。

perl script/mybbs_create.pl controller Login
perl script/mybbs_create.pl controller Logout
perl script/mybbs_create.pl controller Comment

Template Toolkit(TT)の初期設定

テンプレートクラス作成

下記のコマンドを実行します。

perl script/mybbs_create.pl view TT TTSite;

テンプレートファイルの拡張子を設定

下の一行を加えます。

lib/MyBBS/View/TT.pm

TEMPLATE_EXTENSION => '.tt2',

テスト

以下のコマンドを実行します。

CATALYST_DEBUG=0 prove --lib lib -v t

データベース

DBスキーマーの作成

mybbs.sql というファイルを以下の内容で作成します。

-- First drop everything
DROP INDEX if exists "user_id_pkey";
DROP INDEX if exists "comment_id_pkey";
DROP INDEX if exists "login_name_unique_index";
DROP TABLE if exists user;
DROP TABLE if exists comment;

-- Create tables
CREATE TABLE user (
	id INTEGER PRIMARY KEY AUTOINCREMENT
	, login_name TEXT NOT NULL
	, password TEXT NOT NULL
	, email TEXT NOT NULL
	, name TEXT NOT NULL
	, delete_flag BOOLEAN NOT NULL default 'false'
	, created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP
	, updated_on TIMESTAMP
);

CREATE TABLE comment (
	id INTEGER PRIMARY KEY AUTOINCREMENT
	, statement TEXT NOT NULL
	, user_id INTEGER NOT NULL
	, delete_flag BOOLEAN NOT NULL default 'false'
	, created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP
	, updated_on TIMESTAMP
    , FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE
);

-- Create indexes
CREATE INDEX "user_id_pkey" ON "user" ("id");
CREATE INDEX "comment_id_pkey" ON "comment" ("id");
CREATE UNIQUE INDEX "login_name_unique_index" ON "user" ("login_name");

-- Insert test users
INSERT INTO user
    (
    login_name
    , password
    , email
    , name
    )
    VALUES
    (
    'foo'
    , 'foo'
    , 'foo@example.com'
    , 'Mr. Foo'
    );
INSERT INTO user
    (
    login_name
    , password
    , email
    , name
    )
    VALUES
    (
    'bar'
    , 'bar'
    , 'bar@example.com'
    , 'Mr. Bar'
    );

データベース作成

上で作成した mybbs.sql をsqlite3に読み込んでデータベースを作成します。 以下のコマンドを実行します。

sqlite3 mybbs.db < mybbs.sql

mybbs.db というファイルが生成されているのを確認します。

DBIx::Class

Perlの代表的なO/Rマッパーを使用しますが、今回のアプリケーションでは、ほとんどその存在を意識することはないと思います。

スキーマークラスを生成する

以下のコマンドを実行します。

rm lib/MyBBS/Schema.pm;
perl script/mybbs_create.pl model DB DBIC::Schema MyBBS::Schema create=static dbi:SQLite:mybbs.db;

データベース( mybbs.sql )に変更があったときには、再度上のコマンドを実行してください。

リレーションシップの設定

上で作成したSQLが正しければ、すでに自動で設定されています。

テンプレート(View)作成

最初にエラーメッセージとステータスメッセージを表示する領域を追記しておきます。

root/lib/site/layout

<div id="content">

<span class="message">[% status_msg %]</span>
<span class="error">[% error_msg %]</span>
[% content %]
</div>

コメント一覧画面作成

Controllerを実装

lib/MyBBS/Controller/Comment.pm

=head2 list

コメント一覧を表示

=cut

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

    # コメントの配列
    $c->stash->{comments} = [
        $c->model('DB::Comment')->search(
            undef,
            {

                # 取得するカラム名を指定します。
                # ここでは関連テーブルからログイン名(login_name)も取得しています。
                columns => [qw/statement user_id.login_name/],

                # リレーション名を指定
                join => 'user_id',
            }
        )
    ];

    $c->stash->{template} = 'comment/list.tt2';
}

テンプレート

root/src/comment/list.tt2

[% META title = 'コメント一覧' -%]

<table>
  [% FOREACH comment IN comments -%]
  <tr>

    <td>[% comment.statement %]</td>
    <td>[% comment.user_id.login_name %]</td>
  </tr>
  [% END -%]
</table>

<p>
  <a href="[% c.uri_for('form_create') %]">コメントする</a>
  <a href="[% c.uri_for('/logout') %]">ログアウト</a>
</p>

[%# USE Dumper(Indent=1) -%]
[%# Dumper.dump(comments) %]

コメント投稿フォームを表示するメソッドを実装

コントローラー

Comment.pm


=head2 form_create

入力フォームを表示するメソッド

=cut

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

    # テンプレートをセット
    $c->stash->{template} = 'comment/form_create.tt2';
}

テンプレート

root/src/comment/form_create.tt2

[% META title = 'コメント入力' -%]

<form method="post" action="[% c.uri_for('form_create_do') %]">

  <table>
    <tr><td>Comment:</td><td><textarea name="statement"></textarea></td></tr>
  </table>

  <input type="hidden" name="user_id" value="[% c.user.id %]">
  <input type="submit" name="Submit" value="Submit">

</form>

<p>
  <a href="[% c.uri_for('/comment/list') %]">コメント一覧へ</a>
  <a href="[% c.uri_for('/logout') %]">ログアウト</a>

</p>

入力されたコメントをDBに保存する処理を実装

コントローラー

lib/MyBBS/Controller/Comment.pm

=head2 form_create_do

入力されたコメントをDBに保存する処理を実装します。

=cut

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

    # フォームで入力されたコメントと入力したユーザーのID(hidden)を取得します。
    my $statement = $c->request->params->{statement} || 'N/A';
    my $user_id   = $c->request->params->{user_id}   || 'N/A';

    # DBに保存します。
    my $comment = $c->model('DB::Comment')->create(
        {   statement => $statement,
            user_id   => $user_id,
        }
    );

    # コメント一覧画面ヘリダイレクトします。
    $c->response->redirect($c->uri_for('list'));

}

ログイン機能

必要なモジュールを追加

ログイン機能の実装に必要なモジュールを追記します。

lib/MyBBS.pm

Authentication

Session
Session::Store::FastMmap
Session::State::Cookie

設定ファイル

mybbs.conf

<authentication>
  default_realm dbic
  <realms>

    <dbic>
      <credential>
        class Password
        password_field password
        password_type clear
      </credential>
      <store>
        class DBIx::Class
        user_class DB::User
        id_field login_name
      </store>

    </dbic>
  </realms>
</authentication>

コントローラー

lib/MyBBS/Controller/Login.pm

=head2 INDEX

ログイン機能を実装します。

=cut

sub index : Path : Args(0) {
    my ( $self, $c ) = @_;

    # フォームに入力されたログイン名とパスワードを取得します。
    my $login_name = $c->request->params->{login_name} || "";
    my $password = $c->request->params->{password} || "";

    # もしログインIDとパスワードがどちらも取得できたら、
    if ( $login_name && $password ) {

        # ログインを試みます。
        if ($c->authenticate(
                {   login_name => $login_name,
                    password => $password,
                }
            )
            )
        {
            # ログインに成功したら、コメント一覧へリダイレクトします。
            $c->response->redirect( $c->uri_for('/comment/list') );
            return;
        }
        else {

            # ログインに失敗したら、エラーメッセージをテンプレートにセットします。
            $c->stash->{error_msg} = "Bad username or password.";
        }
    }

    # ログインページを表示します。
    $c->stash->{template} = 'login.tt2';
}

ログアウト

lib/MyBBS/Controller/Logout.pm

=head2 index

ログアウト処理を実装します。

=cut

sub index : Path : Args(0) {
    my ( $self, $c ) = @_;

    # ログアウトします。
    $c->logout;

    # トップページへリダイレクトします。
    $c->response->redirect( $c->uri_for('/') );
}

ログインフォーム用テンプレート

root/src/login.tt2

[% META title = 'Login' %]

<!-- Login form -->
<form method="post" action="[% c.uri_for('/login') %]">

  <table>
    <tr>
      <td>Login Name:</td>
      <td><input type="text" name="login_name" size="40" /></td>

    </tr>
    <tr>
      <td>Password:</td>
      <td><input type="password" name="password" size="40" /></td>

    </tr>
    <tr>
      <td colspan="2"><input type="submit" name="submit" value="Submit" /></td>

    </tr>
  </table>
</form>

<p>
  [% IF c.user_exists %]
  既に '[% c.user.login_name %]' としてログインしています。<br />
  こちらから<a href="[% c.uri_for('/logout') %]">ログアウト</a>できます。
  [% ELSE %]
  ログインしてください
  [% END %]

</p>

ログインチェック機能

ここでは、ログインしていないユーザーが、認証が必要なページに直接アクセスした場合にできないようにチェックする機能を実装します。

コントローラー

lib/MyBBS/Controller/Root.pm

=head2 auto

ユーザーがログイン認証済かどうか検査します、認証されていないユーザーはログインページヘリダイレクトします。

=cut

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

    # とりあえず認証していなくてもログインページだけはアクセスできるようにします。
    if ( $c->controller eq $c->controller('Login') ) {
        return 1;
    }

    # 認証されていなければ、ログインページへリダイレクトします。
    if ( !$c->user_exists ) {

        $c->response->redirect( $c->uri_for('/login') );

        return 0;
    }

    # 認証済ならば1を返します。
    return 1;
}

Catalyst v5.66

動作確認

以上で、ひととおりの実装が終了しました。

下記の項目を確認してみます。

  • ログインできること。
    • ログイン名とパスワードは、foo/foo もしくは bar/bar
  • ログインしていない状態では、ログイン画面以外のURLには行けない(ログイン画面に飛ばされる))こと。
  • ログアウトできること。
  • コメント一覧が表示できること。
  • コメント投稿できること。

足りない機能

  • フォーム・バリデーション
  • コメントの削除
  • ユーザー追加
  • ユーザー情報の編集・削除

Reference

Catalyst::Manual::Tutorial (English)
もう少し複雑なアプリケーション(書籍データーベース)を作る過程が、このチュートリアルで解説されています。

具体的には、

  • ユーザーの役割(role)による権限(Authentication)の管理
  • DBに保存されるパスワードをSHA-1でハッシュ化する方法。
  • 揮発性メッージ(Flash)の使い方。
  • FormFuを使ったフォームの生成やバリデーション。

などです。

2008年10月26日

Mac OS X 版のNetBeans(6.5RC1)上にCubby(1.1.1)の開発環境を作ったときのメモ Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

仕事では専らEclipseを使っていますが、試しにNetBeansでやってみたところ、 意外と簡単に開発環境を作ることができたので、ログしておきます。Mac OS X以外のOSでもやり方は変わらないのではないかと思います。

自分の環境は、Mac OS X 10.5.5、JREはbuild 1.5.0_16-b06-284(Leopardに付属のもの)、Maven 2.0.9です。

Cubbyはシンプルでとても使い易いフレームワークですので、是非NetBeansユーザーにもその「サクサク感」を味わって欲しいと思います。

1. NetBeansをインストール

ダウンロード
http://download.netbeans.org/netbeans/6.5/rc/
インストール
途中、「使用許諾」の次の画面の左下にある「カスタマイズ」ボタンから「Apache Tomcat 6.0.18」を追加しました。

2. Mavenプラグインをインストールする

NetBeansを起動する
ツール > プラグインから 「Maven」を選択してインストールします。
なお、Mavenについて一点補足ですが、私の場合は既に過去に自前でインストールしたMavenにPATHを通しており、今回は自動的にそのMavenが使われていました。しかし、NetBeansにMavenプラグインをインストールした時点で、オプション画面上に「Embedded Maven version: 3.0-SNAPSHOT」という文字が表示されるようになりましたので、ひょっとしたら、あらかじめMaven自体をインストールしておく必要もないのかも知れません。

3. Cubbyプロジェクトを作成する

「ファイル > 新規プロジェクト」を選択する。
ステップ1 (新規プロジェクト)
カテゴリ => Maven プロジェクト=> Maven Project
ステップ2 (Maven Archetype)
Addボタンを押して、以下の項目を入力します。

GroupId: org.seasar.cubby
ArtifactId: cubby-archetype
Version: 1.1.1
Repository: http://maven.seasar.org/maven2/

(上記の入力作業は初回のみです。 次回、新規にCubbyプロジェクトを作る際には、 「Cubby Archetype」という選択肢を選ぶだけで、次の「ステップ3」に遷移します)

「OK」ボタンを押します
「Custom archetype - cubby-archetype」が表示されるので、それを選択して「Next >」ボタンを押します。
ステップ3 (Name and Location)

これから作成するプロジェクトの雛形を作成します。

入力例)
Project Name: cubbysample
Artifact Id: cubbysample
Group Id: com.sugmak
Package: com.sugmak.cubbysample

「Finish」ボタンを押すとプロジェクトが作成されます

4. 実行環境を指定する

作成されたプロジェクト・ルートを右クリックして「Properties」を選択する。
カテゴリから 「Run」を選択する。
Server: Tomcat 6.0を選択する。
「了解」ボタンを押してプロパティウィンドウを閉じる。

5. アプリケーションを起動する

プロジェクト・ルートを右クリックして、 「Run」を選択する。
Webブラウザからhttp://localhost:8084/cubbysample/にアクセスしてみる(私の場合、Tomcatは8080ではなく8084で起動していました。)。ポート番号はTool > Serverで変更可能です。
Cubbyのサンプル・アプリケーションのページ(グリーンのヘッダー)が表示されていれば導入成功です。

6. その他(デフォルトのJDKを変更したいとき)

Core2Duo搭載のMacで動作しているLeopardの場合ですと、/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/HomeというPATHにJDK1.6が入っていますが、それでもNetBeansはJDK1.5の方をDefaultのプラットフォームに設定するようです。JDK1.6をデフォルトにしたい場合には、

~/.netbeans/6.5rc1/etc/netbeans.confをテキストエディタで開く(無ければ作成する)。
以下の1行を追記する。
netbeans_jdkhome=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
NetBeansを再起動する。
Tools > Java PlatformでJDK1.6(Default)になっていることを確認する。

セットアップは以上ですが、この先は、実際に開発を進めた訳ではないので、未知数なところもありますが、セットアップに限って言えば、Cubbyのオフィシャルサイトで説明されているような、コマンドラインからMavenを操作してプロジェクトをセットアップする方法よりは敷居は低いのではないかと思います。

なお、Eclipseでは別途プラグインが必要な、*.propertiesファイルの日本語表示やSubversionとの連携などはプラグイン無しで実現できています。

追記

matsuokaさんからのコメントで、Windowsでも上記手順で動作したとの報告をいただきました。またWindowsでの文字コードの設定方法もアドバイスしていただきました。

Windows でも同様の手順で動きました。 Windows ではファイルのエンコードが Shift_JIS で扱われるので netbeans.conf の netbeans_default_options に "-J-Dfile.encoding=UTF-8" を付け加えておく方がいいです。

2008年1月7日

謹賀新年 - 最近の生活とお仕事 Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

あけまして、おめでとうございます。

  1. 単身赴任しています。11月の初旬より、福岡市に単身赴任しています。住み慣れた山口の田舎に家族を残し、一人都会のワンルーム・マンションで暮らしております。
  2. と書くと、かなり悲壮感が漂いますが、現在やっている仕事は、これ以上無いくらい楽しくやり甲斐のあるものでして、念願だったMac用のソフト開発、それからCatalystを使ったシステム開発を主にやっています。
  3. 「福岡で働くWebの人々」。という一風変わった名前のコミュニティを、昨年春に同志と共に立ち上げ、地道に活動を続けています。名前からだと一体どんなコミュニティか判り難いのですが、平たく言うと、Webの制作現場を少しでも楽しくしようというコミュニティです。
  4. Fukuoka Perl Mongers(略称: Fukuoka.pm)というコミュニティを設立しました。こちらは非常に目的が判り易い集団で、プログラミング言語「Perl」を愛する人たちの集いです。私がリーダーとなって、昨年11月に設立しました。
  5. 昨年末に毎日新聞の福岡版に写真付きで載りました(先に断わっておきますが、悪いことをしたのではありません)。「ピンポイント」というコラム欄に掲載されました。簡単に言いますと、私自身の仕事とどういった経緯でその仕事をやっているかみたいな紹介がメインだったのですが、私は生来、直感と好奇心の赴くまま、いろいろやってみないと気が済まない質でして。気が付けば、随分ややこしい経歴の持ち主になってしまいました。今回の取材インタビューでお話しした内容は、そんな私の長くてややこしいプロフィールが、編集者様の努力により、すっきりと編集されていました。
  6. 会社設立2年目。良くも悪くも勉強になりました。元々直感とか好奇心で生きてきた人間ですので、今年はもっとその「内なる声」に正直になろうと思います。人生は短いのですから。

2007年10月22日

Googleの検索ページでVimライクなショートカットキーが使える Add to Delicious Bookmark この記事をクリップ! Yahoo!ブックマークに登録

Digg経由で知りました。
How Google does Vim

例えば、
http://www.google.com/search?q=rattlesnake&esrch=BetaShortcuts
上記のページでは、右ソデに記載されているような、ショートカット・キーが使えます。通常の検索結果のURLに、&esrch=BetaShortcutsを追加するだけで、この機能が使えるようです。

  • Vimの編集モードと同じように、jkで検索結果内を上下移動できます。
  • ページの一番下あるいは一番上まで行くと、その次は前後のページへ移動するようになっています。
  • カーソルが置いてあるURLへジャンプするには、アルファベットのoもしくはEnterキーをタイプします。
  • /(スラッシュ)で検索ボックスへ移動し、ESCで抜けます。

上記のURLにさらに&complete=1を加えると、検索フィールド上で、Googleサジェストの補完機能も使えますが、補完候補のリスト内ではショートカット・キーは使えないようでした。また現時点では、google.co.jpの方では、このショートカット機能は使用できませんでした。

今のところ、experimental(実験的)な機能という事ですが、自分が慣れ親しんでいるエディターのショートカットキーを、おそらく最も頻繁に利用しているサイト上でも使えるのは、とても便利だと思いました。ソフトウェアだけでなくWebサイト上でも、ヘビー・ユーザーにとっての理想的なUIというのはショートカット・キーにあるのかも知れません。