KUMA TYPE

猫、パソコン、プログラム、映画、ドラマ、アニメ、perl、etc.

『低燃費少女ハイジ』まとめ 第01話~第05話‐ニコニコ動画(9)

「低燃費少女ハイジ」という日産がやってるWEBアニメがあるらしいですね。ちょとまとめ動画を見てみましたが、4話と5話は面白かった。4話はかなり笑いました。

◇公式サイト:日産:ノート [ NOTE ] コンパクトカー Webカタログ ホーム

タグ : ,

浅草散歩 2009.11.05

2009年11月05日(木)の浅草です。床屋に行ったついででうろうろしたのですが、平日の昼間なのにこの人混みです。外国の方も結構いますね。僕としては夜中や明け方の雷門と仲見世通りを一度みてみることをお勧めしますけど。

CA350138

雷門前から、うんこビル方面。

CA350139

浅草のリンガーハットで野菜たっぷりちゃんぽん食べたんですよ。

リンガーハット大好きな僕としてはどうしてお金あるときに株主になっておかなかったのか激しく後悔してます。お食事券目当てで株主になってる人って結構いるよね?

野菜たっぷりちゃんぽんおすすめです。野菜をおいしくたっぷりとれます。野菜だけでお腹いっぱいになりそうな気もします。野菜と豚肉や魚介類が口の中であわさってお互いのうまみを引き出あいおいしいったらないですね。ドレッシングが付いてるんですが、最初ドレッシングなんかかけたらちゃんぽんの味が変わっちゃいそうで心配だったんですが、かけると野菜をおいしく食べれて、それでいてちゃんぽんの味もおかしくしないよくできたドレッシングなのでぜひ掛けて食べることをお勧めします。スープも相変わらずおいしいですね。いつも全部飲んでしまいます。野菜は全て国産を謳っているのでちょっと安心ですね。

CA350140

カロリーは691Kcalです。

個人的には、お昼や夕食時の混雑する時間帯を避けて昼前のオープン直後やすいてる時刻に行くのをお勧めします。ゆっくり食べれるし急いで作ってたり作り置きしてないのかおいしいような気がする。

タグ : ,

Webフォトギャラリーアプリ TiltViewerがかっこいい

XG001636

色々とFlashのWebフォトギャラリーソフトを探していたときに見つけた3Dのイメージビューアです。

とってもかっこいいのです。

実際にサンプルデモを見てみてください。

 

XG001637

一覧から写真をクリックするとその写真が拡大表示され、回転マークをクリックすると、

XG001638

くるっと写真が回転してコメントの画面になります。さらに回転マークをクリック数と画像に戻ります。

コメントには、フォントタグと、太い文字、取り消し線、下線、イタリック等のタグが指定できます。ハイパーリンクは利用できません。

設定ファイルのgallery.xml内で各画像毎のリンク先を指定することはできます。

具体的には下記の様なxmlファイルです。コメントやリンク先ボタンの表示・非表示等を設定する事ができます。ファイルの文字コードをUTF-8で書けば日本語もちゃんと表示できます。

<tiltviewergallery>
    <photos>
        <photo imageurl="imgs/070111_0207~0002.jpg" linkurl="https://blog.kumacchi.com/">
            <title>ねこ01</title>
            <description>足を抱えて寝るねこ。 日本語が使えるよ。</description>
        </photo>
        <photo imageurl="imgs/070328_0210~0003.jpg" linkurl="http://www.google.com">
            <title>Image 2</title>
            <description><![CDATA[足の間に<b>頭</b>を <u>はさんで</u>, <i>眠る</i>, 猫<br>そして<font color="#ff0000" size="60">フォントタグ</font>.ハイパーリンクはサポートしてない。]]></description>
        </photo>
        <photo imageurl="imgs/070328_0211~0002.jpg" >
            <title>ねこ3</title>
        <description>リンクボタンが表示されない例。</description>           
        </photo>
        <photo imageurl="imgs/070328_1245~0005.jpg" linkurl="http://www.google.com" showFlipButton="false">
            <title>猫の写真4</title>
            <description>洗濯かごの中でねそべるねこ。 フラップボタンを表示しない例。</description>           
        </photo>
        <photo imageurl="imgs/070328_1304~0004.jpg" linkurl="http://www.google.com">
            <title>ばんざーい</title>           
        </photo>

        (中略)

 

        <photo imageurl="imgs/CA350327.jpg" linkurl="http://www.google.com">
            <title>Image 16</title>
        </photo>
    </photos>
</tiltviewergallery>

 

1画面に表示する縦と横の枚数は設定で変更できます。設定はindex.htmlに記述するオプションで行います。色々細かく指定する事ができます。

こんな感じ。

<script type="text/javascript">

    var fo = new SWFObject("TiltViewer.swf", "viewer", "100%", "100%", "9.0.28", "#000000");           
    // TILTVIEWER CONFIGURATION OPTIONS
    // To use an option, uncomment it by removing the "//" at the start of the line
    // For a description of config options, go to:
    // http://www.airtightinteractive.com/projects/tiltviewer/config_options.html
    //FLICKR GALLERY OPTIONS
    // To use images from Flickr, uncomment this block
    //fo.addVariable("useFlickr", "true");
    //fo.addVariable("user_id", "48508968@N00");
    //fo.addVariable("tags", "jump,smile");
    //fo.addVariable("tag_mode", "all");
    //fo.addVariable("showTakenByText", "true");           
    // XML GALLERY OPTIONS
    // To use local images defined in an XML document, use this block       
    fo.addVariable("useFlickr", "false");
    fo.addVariable("xmlURL", "gallery.xml");
    fo.addVariable("maxJPGSize","640");
    //GENERAL OPTIONS       
    fo.addVariable("useReloadButton", "false");
    fo.addVariable("columns", "4");
    fo.addVariable("rows", "4");
    //fo.addVariable("showFlipButton", "true");
    //fo.addVariable("showLinkButton", "true");       
    fo.addVariable("linkLabel", "goto Link");
    //fo.addVariable("frameColor", "0xFF0000");
    //fo.addVariable("backColor", "0xDDDDDD");
    //fo.addVariable("bkgndInnerColor", "0xFF00FF");
    //fo.addVariable("bkgndOuterColor", "0x0000FF");               
    //fo.addVariable("langGoFull", "Go Fullscreen");
    //fo.addVariable("langExitFull", "Exit Fullscreen");
    //fo.addVariable("langAbout", "About");               
    // END TILTVIEWER CONFIGURATION OPTIONS
    fo.addParam("allowFullScreen","true");
    fo.write("flashcontent");           
</script>   

 

各オプションの説明は下記ページで解説されています。(英語)

◇参考:TiltViewer Configuration Options

XG001639

画像が1ページに収まらないときはページ切り替え用の矢印が表示されているので、これをクリックすると

XG001642

パラパラとかっこよく写真が飛んできて入れ替わります。セガサターンの起動画面を思い出しますw。

設置は簡単なので、ちょっとかっこよく写真を紹介したい場合はいいかも。

◇配布サイト:TiltViewer – About

タグ :

[perlメモ]perlのフレームワークCatalystで遊んでみる その4

遊び半分で触り始めたCatalystなんだけど、ちょっと面白そうなのでちゃんと覚えたいなーとか思い始めた。

それで色々検索したり書籍探してるんだけど「Catalyst5.8」に対応したいい書籍ってないのかな?まだ今年出たばっかりだから書籍はこれからかな。「モダンPerl入門」という本がCatalyst5.7ベースで解説してるみたいなのでちょっとほしい。買うかも。この本よくおすすめとか見かけてたんだけどフレームワークとか意識した事なくていまいちピンとこなかったんだけど、いまここに至って本の価値が理解できたというw。

とりあえず気になったリンクを後学の為にここに保存。

◇参考:「来月、「モダンPerl入門」を発売します (CodeZine編集部ブログ)」
http://codezine.jp/blog/2009/01/perl.php

モダンPerl入門 (CodeZine BOOKS)

 

で、Catalystの勉強に古い参考記事を参考にしてしてしまったけど、今からやるなら下の記事の方がCatalyst5.80007ベースなのでインストールのしかたとか今のに対応しているのでこっちがよさそう。

◇参考:「初めてのCatalyst入門(1) PerlによるWebフレームワークCatalystとは?(1/5):CodeZine」
http://codezine.jp/article/detail/4190

とりあえず、サンプルで感じがつかめたら、下のサイトのCatalyst5.6ベースで作成された本格的な掲示板のソースを追ってみて勉強するのがいいかも。

◇参考:「Catalystを使ったアプリケーションの作成(その1)」
http://hk-tech.homeip.net/programing/catalyst/01.html

Catalystじゃないけど下の連載は面白そう。

◇参考:「連載:モダンPerlの世界へようこそ|gihyo.jp … 技術評論社」
http://gihyo.jp/dev/serial/01/modern-perl

タグ : ,

[perlメモ]perlのフレームワークCatalystで遊んでみる その3

◇参考記事:第4回 Catalyst(前編)—Perl向けWebアプリ・フレームワーク – 簡単実装で学ぶWeb技術:ITpro

というわけで参考記事を見ながら、perlのMVCフレームワークCatalystのお勉強その3なのです。

今日は、参考記事の4ページ目を見ながらサンプルのメモ帳プログラムを突くてみます。

MVCっていうのはM(モデル:データの事主にデータベースの事をさすのかな?)V(View:表示部分の制御)C(コントローラー:入力からの制御する部分)

普通にプログラム作ってもそんな感じだと思うけどより明確にプログラムを分割してやる設計というか技法という事ですね。

というわけで今日はやっとMの部分に入れるわけです。(ちょっと楽しみ、ブログ書きながらやらなければサクッと終わると思うんだけど、メモがてらです。)

◇参考:Model View Controller – Wikipedia

◎スケルトン作成

参考記事の5ページ目を見ながらメモ帳アプリのスケルトンを作成してみます。

コマンドプロンプトから、Memoスケルトンの作成。

F:\WWW\work>catalyst.pl Memo
created "Memo"
created "Memo\script"
created "Memo\lib"
created "Memo\root"
created "Memo\root\static"
created "Memo\root\static\images"
created "Memo\t"
created "Memo\lib\Memo"
created "Memo\lib\Memo\Model"
created "Memo\lib\Memo\View"
created "Memo\lib\Memo\Controller"
created "Memo\memo.conf"
created "Memo\lib\Memo.pm"
created "Memo\lib\Memo\Controller\Root.pm"
created "Memo/README"
created "Memo/Changes"
created "Memo\t/01app.t"
created "Memo\t/02pod.t"
created "Memo\t/03podcoverage.t"
created "Memo\root\static\images\catalyst_logo.png"
created "Memo\root\static\images\btn_120x50_built.png"
created "Memo\root\static\images\btn_120x50_built_shadow.png"
created "Memo\root\static\images\btn_120x50_powered.png"
created "Memo\root\static\images\btn_120x50_powered_shadow.png"
created "Memo\root\static\images\btn_88x31_built.png"
created "Memo\root\static\images\btn_88x31_built_shadow.png"
created "Memo\root\static\images\btn_88x31_powered.png"
created "Memo\root\static\images\btn_88x31_powered_shadow.png"
created "Memo\root\favicon.ico"
created "Memo/Makefile.PL"
created "Memo\script/memo_cgi.pl"
created "Memo\script/memo_fastcgi.pl"
created "Memo\script/memo_server.pl"
created "Memo\script/memo_test.pl"
created "Memo\script/memo_create.pl"
Change to application directory and Run "perl Makefile.PL" to make sure your ins
tall is complete

 

スケルトンができたら、ビューの作成。

F:\WWW\work>cd Memo

F:\WWW\work\Memo>script\memo_create.pl view TT TT
exists "F:\WWW\work\Memo\lib\Memo\View"
exists "F:\WWW\work\Memo\t"
created "F:\WWW\work\Memo\lib\Memo\View\TT.pm"
created "F:\WWW\work\Memo\t\view_TT.t"

 

コントロールの作成

Editコントロール(編集画面部分)

F:\WWW\work\Memo>script\memo_create.pl controller Edit
exists "F:\WWW\work\Memo\lib\Memo\Controller"
exists "F:\WWW\work\Memo\t"
created "F:\WWW\work\Memo\lib\Memo\Controller\Edit.pm"
created "F:\WWW\work\Memo\t\controller_Edit.t"

 

Writeコントロール(書き込み処理部分)

F:\WWW\work\Memo>script\memo_create.pl controller Write
exists "F:\WWW\work\Memo\lib\Memo\Controller"
exists "F:\WWW\work\Memo\t"
created "F:\WWW\work\Memo\lib\Memo\Controller\Write.pm"
created "F:\WWW\work\Memo\t\controller_Write.t"

 

Listコントロール(一覧画面部分)

F:\WWW\work\Memo>script\memo_create.pl controller List
exists "F:\WWW\work\Memo\lib\Memo\Controller"
exists "F:\WWW\work\Memo\t"
created "F:\WWW\work\Memo\lib\Memo\Controller\List.pm"
created "F:\WWW\work\Memo\t\controller_List.t"

 

Readコントロール(読み込み表示部分)

F:\WWW\work\Memo>script\memo_create.pl controller Read
exists "F:\WWW\work\Memo\lib\Memo\Controller"
exists "F:\WWW\work\Memo\t"
created "F:\WWW\work\Memo\lib\Memo\Controller\Read.pm"
created "F:\WWW\work\Memo\t\controller_Read.t"

 

Searchコントロール(検索画面部分)

F:\WWW\work\Memo>script\memo_create.pl controller Search
exists "F:\WWW\work\Memo\lib\Memo\Controller"
exists "F:\WWW\work\Memo\t"
created "F:\WWW\work\Memo\lib\Memo\Controller\Search.pm"
created "F:\WWW\work\Memo\t\controller_Search.t"

 

◎SQLiteを使ってデータベースを作成

SQLiteでデータベースを作成します。

「Memo\db」フォルダを作成して、その中にmemo.sqlというテキストファイルを作成。中身は参考記事の通り

CREATE TABLE memo (
    id TEXT PRIMARY KEY,
    title TEXT,
    message TEXT
);

 

memo.sqlを作ったら、コマンドプロンプトから、以下のように入力してデータベースを作成。(参考記事と違うのはSQlite3を使っているのでコマンドがsqliteじゃなくてsqlite3になってるところ。)

F:\WWW\work\Memo\db>sqlite3 memo.db < memo.sql

F:\WWW\work\Memo\db>

 

ちなみに、sqlが間違ってると下の様にエラーが表示されます。(この場合最後の「;」(セミコロン)をうち忘れていた為にエラーとなった。)

 F:\WWW\work\Memo\db>sqlite3 memo.db < memo.sql
Error: incomplete SQL: CREATE TABLE memo (
    id TEXT PRIMARY KEY,
    title TEXT,
    message TEXT
)

 

「Memo\db」フォルダ内にmemo.dbが作成されていれば成功。

そして作成したこのデータベースを指定してモデルを作成します。

エラーになりました。

F:\WWW\work\Memo\db>cd ..

F:\WWW\work\Memo>script\memo_create.pl model DBIC DBIC dbi:SQLite:www/work/Memo/db/memo.db
exists "F:\WWW\work\Memo\lib\Memo\Model"
exists "F:\WWW\work\Memo\t"
Couldn’t load helper "Catalyst::Helper::Model::DBIC", "Can’t locate Catalyst/Helper/Model/DBIC.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at (eval 222) line 3."
F:\WWW\work\Memo>ppm

どうやら、Catalyst::Helper::Mdel::DBICモジュールが入っていない為の様です。

CPAN「Browse and search CPAN : Catalyst::Helper::Model::DBIC」で調べてppmからcatalyst-model-dbicをインストール
XG001620

再度挑戦してみるとできたようです。

が、Catalyst::Helper::Model::DBICがDEPRECATED(非推奨)、つまり廃止予定なので使わないでねという事になってるようなので、ワーニングとか表示されます。たぶんこれを利用して実際に物を作るのはやめておいた方がいいでしょう。何らかの代替え手段があるはずです。最新の情報を収集しましょう。ここでは勉強なので無視しますw。

DBIx::Class::DB もDEPRECATEDみたいですね。

F:\WWW\work\Memo>script\memo_create.pl model DBIC DBIC dbi:SQLite:/www/work/Memo
/db/memo.db
created "F:\WWW\work\Memo\lib\Memo\Model"
exists "F:\WWW\work\Memo\t"
This module has been deprecated in favor of Catalyst::Model::DBIC::Schema at C:/
Perl/site/lib/Catalyst/Helper/Model/DBIC.pm line 46.
created "F:\WWW\work\Memo\lib\Memo\Model\DBIC.pm"
IMPORTANT: DBIx::Class::DB is DEPRECATED AND *WILL* BE REMOVED. DO NOT USE.
created "F:\WWW\work\Memo\lib\Memo\Model\DBIC"
created "F:\WWW\work\Memo\lib\Memo\Model\DBIC\Memo.pm"
exists "F:\WWW\work\Memo\t"
exists "F:\WWW\work\Memo\t\model_DBIC-Memo.t"

F:\WWW\work\Memo>

 

参考記事の5ページ目を見ながら、Edit.pmとedit.ttを作成。

Edit.pm

これを打ち込みながら思ったのは、これでDBからidに一致したレコード読んで表示できるんだすげーと思った。

package Memo::Controller::Edit;

use strict;
use warnings;
use Data::Uniqid qw(uniqid);
use parent ‘Catalyst::Controller’;

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

    #$c->response->body(‘Matched Memo::Controller::Edit in Edit.’);
    $c->stash->{template} = ‘edit.tt’;
    $c->stash->{hedline} = ‘Create new memo’;
    $c->stash->{id} = uniqid;
    $c->log->debug(‘Edit::default: id = ‘ . $c->stash->{id});
}

sub edit : Regex(‘^edit/(\w+)$’){
    my ($self,$c) = @_;
    $c->stash->{template} = ‘edit.tt’;
    $c->stash->{id} = $c->request->snippets->[0];
    $c->stash->{hedline} = ‘Edit memo’;
    $c->stash->{memo} = $c->model(‘DBIC::Memo’)->find($c->stash->{id});
}

1;

 

edit.tt

これを打ち込みながら思ったのは、 [%INCLUDE header.tt %]の部分ってテンプレート中で他のテンプレート読み込んでるんだーと便利そうで関心した。

[ % INCLUDE header.tt %]

<h1>[% c.stash.headline %]</h1>

<form method="post" action="/write">
  <input type="hidden" name="id" value="[% c.stash.id %]" />
  title: <input type="text" name="title" size="40" value="[% memo.title %]" /><br />
  <textarea name="message" cols="40" rows="10">[% memo.message %]</textarea><br />
    <input type="submit" value="write">
</form>

[% INCLUDE footer.tt %]

 

Write.pm

package Memo::Controller::Write;

use strict;
use warnings;
use parent ‘Catalyst::Controller’;

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

    #$c->response->body(‘Matched Memo::Controller::Write in Write.’);

    $c->stash->{template} = ‘write.tt’;
    my $id = $c->request->params->{id};
    unless($id){
        $c->stash->{error} = "invvalid request: missing id ";
        return 0;
    }
    my $table = $c->model(‘DBIC::Memo’);
    my $record = $table->find_or_create(id => $id);
    $record->id($id);
    $record->title($c->request->params->{title});
    $record->message($c->request->params->{message});
    $record->update;
    $c->log->debug(‘Write::default: id = ‘ . $id);
    $c->response->redirect(‘/read/’ . $id);
}

1;

 

と、ここまで入力してみて、6ページ目をみると、記事がおわってるーw。

あれー、記事中には全部のソース載ってないのか―。

という事で、とりあえずこの状態でサーバーを動かしてみる。

Data::Uniqidがないと怒られてるのでppmからインストールした。

F:\WWW\work\Memo>script\memo_server.pl -restart
Can’t locate Data/Uniqid.pm in @INC (@INC contains: F:/WWW/work/Memo/script/../l
ib C:/Perl/site/lib C:/Perl/lib .) at F:/WWW/work/Memo/script/../lib/Memo/Contro
ller/Edit.pm line 5.
BEGIN failed–compilation aborted at F:/WWW/work/Memo/script/../lib/Memo/Control
ler/Edit.pm line 5.
Compilation failed in require at C:/Perl/site/lib/Catalyst/Utils.pm line 280.
Compilation failed in require at F:\WWW\work\Memo\script\memo_server.pl line 66.

Terminating on signal SIGINT(2)

F:\WWW\work\Memo>

 

Data::Uniqidインストール後再度サーバーを起動したら、とりあえず動いた。が、このままでは例によって、下の画面のままなので、参考記事の1ページ目のリンク先からサンプルプログラムのソースをダウンロードしてきて、root.ttとroot.pmを見ながらファイルを作成。

サンプルソース眺めるだけで結構面白いです。(勉強になる。)

XG001622

 

root.pm

とりあえず、indexサブルーチンを以下のように修正。

 

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

    # Hello World
    #$c->response->body( $c->welcome_message );
    $c->stash->{template} = ‘root.tt’;
}

 

root.tt

[% INCLUDE header.tt %]とか面倒なので普通にべたなタグを指定。

<html>
    <body>
        <ul>
            <li><a href="/edit">Create Memo</a></li>
            <li><a href-"/list">List Memo</a></li>
        </ul>
    </body>
</html>

 

edit.ttも上と同様の理由で以下のように修正した。

<html>
<body>

<h1>[% c.stash.headline %]</h1>

<form method="post" action="/write">
  <input type="hidden" name="id" value="[% c.stash.id %]" />
  title: <input type="text" name="title" size="40" value="[% memo.title %]" /><br />
  <textarea name="message" cols="40" rows="10">[% memo.message %]</textarea><br />
    <input type="submit" value="write">
</form>

</body>
</html>

 

で、ブラウザで動作を確認。

 XG001625

リンクをクリックすると、書き込み画面が表示されました。

XG001626

書き込んでみようと思ったけど、read(読み込み表示)部分作ってないやーと思って、どうしようかと思いましたが、何となく感じもわかったので、Read.pmとread.ttはダウンロードしたファイルを見ながら適当にコピペ―で作成。

で、書き込みしてみると。XG001629

なんかエラー出た。

XG001627

Write.pmの30行目見直してみるとつづり間違ってたので修正。

再度書き込み。
36行目もつづりエラーで修正。

再度書き込み。

どうやら成功。

XG001628

 

ざっとやってみた感じ、確かにデータベースへの書き込みと読みだしはかなり簡潔にできる感じでいいかもしれないですね。数行でデータの書き込み、読み出しができるのはなかなかいいです。複雑な事をしないアプリなら簡単に作れそうな感じ。

複雑な事をしようと思うとちょっとと勉強と慣れが必要かなーと思います。慣れてしまえば生産性は良さそうですね。

さくらインターネットのレンタルサーバーでもCatalystをユーザーディレクトリにインストールして使っている人もいるようなので、次に何か作るときはCatalystをつかって開発してみたいなーと思います。Catalyst関係のいい(日本語の)書籍があったら読んでみたいですね。

とりあえず、Plugin使っちゃダメというのは覚えておきます。

サンプルのheader.ttとかで[% c.config.encoding %]とか[% c.config.name %]とかあるんだけど、これってどこで定義されてるのか気になった。

なるほどー

work\Memo\lib\Memo.pm

のなかで、自由に設定できるのね。

__PACKAGE__->config( name => ‘Memo’ );

 

これとか見るとわかりやすいかも、英語読める人は英語の方が最新情報なのでいいですよ。

Catalyst – Web Framework

タグ : ,

外国人参政権で憲法違反を指摘されキョドるぽっぽ‐ニコニコ動画(9)

あれ、ニコニコ動画の外部プレイヤーっていつの間にどこにでも貼り付けられるようになったの?しばらくニコニコ動画は特定のゲームの実況プレイ以外みてなかったけど、この最近またちょっとランキングとかのぞいてみてますが、政治関連で面白かった動画です。挿入されるテーマ曲(無限に広がる大宇宙)が面白すぎる。鳩山さんはマジモンですねw。

外国人参政権問題について鳩山総理がそういう発言をしたというのは2chコピペ系のブログかどこかで見かけた気がするけど、またネトウヨ共の出まかせだと思ってたんだけどマジでいってたのねw。

ニコニコがうまく表示されない場合はYouTubeをどうぞ↓

 

こっちがネタじゃない長い動画です。

 

タグ : , ,

[perlメモ]perlのフレームワークCatalystで遊んでみる その2

前回の「[perlメモ]perlのフレームワークCatalystで遊んでみる その1」で

XG001609 
こんな感じでとりあえず、ファイルを生成して画面を確認してみるところまでやりました。

そして、参考にさせて頂いている2006年9月の記事「第4回 Catalyst(前編)—Perl向けWebアプリ・フレームワーク – 簡単実装で学ぶWeb技術:ITpro」を元にさらに実験を継続。

でもって、コメント欄でShinnya様からご指摘いただいたように、僕と同じように上記の記事を参考にしちゃう様な人は「そろそろ日経LinuxがDISられた理由について解説しておくか – TokuLog 改めB日記」の方もご参照ください。

◎生成されたファイルをいじる

1.参考記事の3ページ目を見ながらRoot.pmをいじる。パスは以下の通り。

Hello\lib\Hello\Controller\Root.pm

 

Root.pmの以下の部分を

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

    # Hello World
    $c->response->body( $c->welcome_message );
}

以下のように書き換えた。

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

    # Hello World
#   $c->response->body( $c->welcome_message );
    $c->response->body( ‘Hello World!’ );
}

サーバーを起動時に「-restart」オプションを付けて

F:\WWW\work>Hello\script\hello_server.pl -restart

の様に起動しておいた場合、このファイル編集が行われてファイルが保存されたタイミングでファイル変更を感知して以下の様な表示とともにサーバーが再起動される事を確認した。実際にはページにアクセスするだけでもどんどんコマンドプロンプトにメッセージが流れる。

Saw changes to the following files:
– F:/WWW/work/Hello/lib/Hello/Controller/Root.pm (modify)

Attempting to restart the server

それから、やってみるとわかるけど、参考記事とは生成されるソースの内容がCatalystのバージョンの違いによるものと思いますが若干変わっているので注意です。

2.変更結果を確認

ブラウザをリロードしてみると変更結果が確認できます。どうなるかというと以下のようになりました。やっと初歩の初歩ですねw。

XG001610

 

◎ビューってのを使ってみる

1.参考記事の「ビューを作る」を参考にしてやってみたら、エラーがでて失敗したw。

F:\WWW\work>cd  Hello

F:\WWW\work\Hello>script\hello_create.pl view TT TT
exists "F:\WWW\work\Hello\lib\Hello\View"
exists "F:\WWW\work\Hello\t"
Couldn’t load helper "Catalyst::Helper::View::TT", "Can’t locate Catalyst/Helper
/View/TT.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at (eval 222
) line 3.
"
F:\WWW\work\Hello>

よくわかんないけど、ppmからCatalyst-View-TTでフィルタして「Catalyst::View::TT」をインストール

XG001613

そして、再度挑戦したら、できた。はて、ppmからのTask-Catalystでは必要なパッケージが入らないのかな?まーいいやw。

F:\WWW\work\Hello>script\hello_create.pl view TT TT
exists "F:\WWW\work\Hello\lib\Hello\View"
exists "F:\WWW\work\Hello\t"
created "F:\WWW\work\Hello\lib\Hello\View\TT.pm"
created "F:\WWW\work\Hello\t\view_TT.t"

F:\WWW\work\Hello>

 

2.Root.pmを編集。

参考記事を参考にあってるのかわかんないけど以下のように修正してみた。

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

    # Hello World
#   $c->response->body( $c->welcome_message );
#   $c->response->body( ‘Hello World!’ );
    $c->stash->{template} = ‘root.tt’;
    $c->strash->{message} = ‘Hello!’;
}

 

それから、

以下を

sub end : ActionClass(‘RenderView’) {}

以下のように

sub end : ActionClass(‘RenderView’) {
    my ( $self, $c ) = @_;
    $c->forward( $c->view(‘TT’) ) unless $c->response->body;
}

 

で、結果は、以下のようにエラー画面

XG001614

3.参考記事を参考にroot.ttを作成。

Hello\root\root.tt

を下記の内容で作成。

<html>
    <body>
        <h1>[% c.stash.message %]</h1>
        <p>
            [% c.stash.template %]
        </p>
    </body>
</html>

 

再度、ブラウザで確認。

あれ、まだ、同じエラーのままだ。あ、よくエラーを見てみるとRoot.pmの36行目がおかしいと出てます。

 

Caught exception in Hello::Controller::Root->index "Can’t locate object method "strash" via package "Hello" at F:/WWW/work/Hello/script/../lib/Hello/Controller/Root.pm line 36."

 

Root.pmの36行目(下の赤い文字ある行)をみるとつづり間違ってましたw。

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

    # Hello World
#   $c->response->body( $c->welcome_message );
#   $c->response->body( ‘Hello World!’ );
    $c->stash->{template} = ‘root.tt’;
    $c->strash->{message} = ‘Hello!’;
}

以下のように修正。

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

    # Hello World
#   $c->response->body( $c->welcome_message );
#   $c->response->body( ‘Hello World!’ );
    $c->stash->{template} = ‘root.tt’;
    $c->stash->{message} = ‘Hello!’;
}

 

再度ブラウザで確認。

うまくいったようです。

XG001615

まてよ、ということは、root.ttファイルがなかった時、実際にはどんなエラーが表示されるのか気になるのでroot.ttをリネームして確認してみた。

↓こうでした。

XG001616

というわけで、MVCのV(View)の部分をやったわけです。今日はこれくらいにしといてやるぜw。

まとめると、root.ttでアプリとがわの部分を切り分ける事ができるというわけですね。デザイン重視のアプリだと通常、プログラマとデザイナは別々に作業するので、効率いいですね。デザインの修正でアプリをいじる必要もないわけですし。まあ最近では普通にCGI作る場合でもちょっと気のきいたものを作るときはテンプレートファイルを作成してプログラム部分とデザイン部分は切り分けるような作り方をしていると思います。僕自身もちょっと気の利いたものを作るときはそうしてます。

それから、今回、プログラムの編集にKomodo Edit 5.2を使ってみました。何気に激しく便利です。Komodo EditはActiveperlを開発している事でも有名なActiveStateの開発しているKomode IDEのエディタ部分らしいのですが無料で利用できます。Komodo IDEは有償らいしいですがどう違うのかは知りませんw。いつもコードを書くのに僕は秀丸エディタを使っていますが、久しぶりにこういうIDEっぽいのを使ってみました。IDEぽいのを使うのはVisual StudioやVB以来久しぶりです。

ちょっと使ってみた感じですが、色々箇条書きにしてみると、

  • プロジェクトを作成作業すると関連するファイルがツリー表示で管理できるので、ファイルがどこに行ったか迷わなくて便利。
  • タブエディタで便利。
  • コードの色分けもできて便利。
  • WEBの表示もできるので、Catalystと組み合わせるとコード修正>保存>リロード、で結果を確認できて便利。
  • デフォルトだとタブはスペースで入るみたい。(設定でタブ文字に変更できるのかな?)
  • 括弧を入力すると閉じかっこを入力してくれるなど入力補助もしてくれて便利。
  • とりあえずメニューは英語。
  • 定型文を登録できるみたいなので、よく使う命令は登録しておくと便利っぽい。
  • いろんなプログラム言語に対応してるらしい。

といった感じです。ちょっと使った感じでこれなので他にも色々便利な機能がありそうですね。

XG001618

タグ : ,

[perlメモ]perlのフレームワークCatalystで遊んでみる その1

最近のWebプログラミングではフレームワークというのがはやっているようです。ちょっとWebプログラミングの求人を見てみるとフレームワークを利用しての開発とかフレームワーク経験者募集とかいうのを見かけます。Ruby on Rails(ルビー・オン・レールズ)というのを最近たまに見かけていたのでなんぞこれ?とか思っていたのですが、Ruby on RailsというのはRubyのフレームワークらしいです。で、perlのそれに当たるのがCatalyst(カタリスト)らしいです。フレームワークっていうのは要は、生産性を上げる為のライブラリというかモジュールで、色々と処理を共通化できたりして楽チンになるらしいです。実際にはまだ試してないので何ともいえませんが、たとえばデータベースなどはOracleやMySQLやpostgresqlやSQLiteなどなどいろいろあるわけですが、基本的なSQLは同じでも色々とそれぞれに癖というか独自の機能や書き方があったりするわけですが、そういうのを意識しないでいいようにSQLを直接書かないでフレームワークを使った記述を使うのでデータベースの違いを意識しないでよくなり(データベースの違いをフレームワークが吸収してくれる)移植性もあがるとか、実際にはたくさんのコードを書かなければいけないところをちょっとの記述で実現できるらしいとか色々とよさげな話を見かけるわけです。というわけで、これは実際に触って試してみたいという事になりました。まあ、でも実際に使うとなると共用のレンタルサーバーとかでも使えるのかな?専用サーバーとかローカルマシンじゃないとCatalystインストールする事さえ難しいだろうし、成果物はCatalystがインストールされていない環境でも動くのかな?まあ、そういうところはこれから実際に試したり勉強しながら覚えていこうと思います。汎用的にして生産性を上げると大抵犠牲になるのが、細かい部分の作りこみができないとか、データベースだとそれぞれのデータベースに合わせた最適化とか独自機能をつかった高速化ができないとかいう事がありそうですが、そういう場合はその部分だけフレームワークをつかわないで開発する事も出来るようなので、なかなか万能そうですね。まあ、今現在の知識だとかなり間違ったことを書いている気がするので、詳しくは下記のWikipediaや参考記事を参照して下さいw。

◎とりあえず、Catalystのインストールから

とりあえず、下記の記事を参考にして勉強する事にしました。

◇参考:第4回 Catalyst(前編)—Perl向けWebアプリ・フレームワーク – 簡単実装で学ぶWeb技術:ITpro

2006年9月の記事なのでちょっと情報は古いですが、とても参考になるのではないかと思います。

僕の環境は

Windows XP Home Edition SP3
Active perl v.5.8.8 build 824

です。

とりあえず、記事を参考に CPANからインストールしようとしてみましたが、コンパイルにかなり時間がかかった挙句にインストール失敗したのでppmからインストールしてみました。こっちだとインストールもかなり早くお奨めです。SQLiteは参考記事ではSQLite2ですが、現在はSQLite3が主流だと思うので3をダウンロードしてパスが通ったところ(たとえばC:Windows)に入れておきます。CPANからのDBD:SQLite2は行わないで必要になったらppmからDBD-SQLiteをインストールすればいいと思います。

1.コマンドプロンプトでppmと入力してppmを起動

XG001605

2.ppmが起動したら

XG001606

3.Task-Catalystをインストール

赤丸1.View all packagesの状態にして。
赤丸2.フィルターにtask-catalystと入力してモジュールのTask-Catalystを絞り込みます。
赤丸3.Task-Catalystを選択して、右クリックか[Mack for install]のアイコンをクリックしてインストール対象としてマークします。
赤丸4.インストール開始ボタンでCatalystとCatalystを利用するのに必要なモジュールがインストールされます。
※パッケージのリストにTask-Catalystが現れない場合は、リポジトリが登録されていないので、リポジトリの追加を行います。リポジトリの追加については「ActivePerlにGDをインストールする」の記事を参考にしてください。リポジトリのURLは「Browse and search CPAN : Task-Catalyst」のページの下の方の「Win32 PPM packages for "Task-Catalyst"」のリンク先からActiveperlのバージョンに一致したリポジトリのURLを利用して下さい。

具体的にはperl.5.8なら[http://trouchelle.com/ppm/]
perl.5.10なら[http://trouchelle.com/ppm10/]
でいけると思います。

XG001607c

あとは、先に書いた参考記事の通りにやればとりあえずWelcomeページを見る事ができるようになります。

◎一応Welcomeページを見るところまでやってみる。

※詳しくは参考記事の「第4回 Catalyst(前編)—Perl向けWebアプリ・フレームワーク – 簡単実装で学ぶWeb技術:ITpro」を参照して下さい。

1.適当なワークフォルダを作成して、コマンドプロンプトから下記のコマンドを実行する。

F:\WWW\work>catalyst.pl Hello

すると下の様にぞろぞろとファイルやフォルダが生成される。

F:\WWW\work>catalyst.pl Hello
created "Hello"
created "Hello\script"
created "Hello\lib"
created "Hello\root"
created "Hello\root\static"
created "Hello\root\static\images"
created "Hello\t"
created "Hello\lib\Hello"
created "Hello\lib\Hello\Model"
created "Hello\lib\Hello\View"
created "Hello\lib\Hello\Controller"
created "Hello\hello.conf"
created "Hello\lib\Hello.pm"
created "Hello\lib\Hello\Controller\Root.pm"
created "Hello/README"
created "Hello/Changes"
created "Hello\t/01app.t"
created "Hello\t/02pod.t"
created "Hello\t/03podcoverage.t"
created "Hello\root\static\images\catalyst_logo.png"
created "Hello\root\static\images\btn_120x50_built.png"
created "Hello\root\static\images\btn_120x50_built_shadow.png"
created "Hello\root\static\images\btn_120x50_powered.png"
created "Hello\root\static\images\btn_120x50_powered_shadow.png"
created "Hello\root\static\images\btn_88x31_built.png"
created "Hello\root\static\images\btn_88x31_built_shadow.png"
created "Hello\root\static\images\btn_88x31_powered.png"
created "Hello\root\static\images\btn_88x31_powered_shadow.png"
created "Hello\root\favicon.ico"
created "Hello/Makefile.PL"
created "Hello\script/hello_cgi.pl"
created "Hello\script/hello_fastcgi.pl"
created "Hello\script/hello_server.pl"
created "Hello\script/hello_test.pl"
created "Hello\script/hello_create.pl"
Change to application directory and Run "perl Makefile.PL" to make sure your install is complete

F:\WWW\work>

 

2.とりあえず生成されたものを動かしてみる。

生成されたファイルはとりあえず動くので実際に動かしてみる。下記コマンドでサーバープログラムを起動する。

F:\WWW\work\Hello>script\hello_server.pl

 

起動すると下の様に表示される。

F:\WWW\work>Hello\script\hello_server.pl
[debug] Debug messages enabled
[debug] Statistics enabled
[debug] Loaded plugins:
.—————————————————————————-.
| Catalyst::Plugin::ConfigLoader  0.27                                       |
| Catalyst::Plugin::Static::Simple  0.25                                     |
‘—————————————————————————-‘

[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::HTTP"
[debug] Found home "F:\WWW\work\Hello"
[debug] Loaded Config "F:\WWW\work\Hello\hello.conf"
[debug] Loaded components:
.—————————————————————–+———-.
| Class                                                           | Type     |
+—————————————————————–+———-+
| Hello::Controller::Root                                         | instance |
‘—————————————————————–+———-‘

[debug] Loaded Private actions:
.———————-+————————————–+————–.
| Private              | Class                                | Method       |
+———————-+————————————–+————–+
| /default             | Hello::Controller::Root              | default      |
| /end                 | Hello::Controller::Root              | end          |
| /index               | Hello::Controller::Root              | index        |
‘———————-+————————————–+————–‘

[debug] Loaded Path actions:
.————————————-+————————————–.
| Path                                | Private                              |
+————————————-+————————————–+
| /                                   | /index                               |
| /                                   | /default                             |
‘————————————-+————————————–‘

[info] Hello powered by Catalyst 5.80013
You can connect to your server at http://umbrella:3000

 

3.とりあえず色々表示されているのは気にしないで最後の行をみる。これが動作を確認できるURLです。うちの場合は僕が使っているマシン名が[umbrella]なので下の様になっています。ここは使っている人の環境によってIPアドレスだったり使ってる人のマシン名だったりと色々変わると思います。

http://umbrella:3000

4.実際にURLにブラウザでアクセスしてみます。

無事Welcomeページを表示する事ができました。とりあえず、apache等のうウェブサーバーをインストールしていなくても自前のウェブサーバーで動作が確認できるのはすごいですね。また、参考記事にあるように、サーバー起動時に「hello_server.pl -restart」とオプションを指定して起動すると、ソースを修正したら自動的にサーバーを再起動してくれるらしいです。超便利かも知れません。

XG001608

とりあえず、ここまで試してみました。まだどこまで便利なのかはわかりません。ここからが本番かなーと思います。ちょっと色々触って簡単な掲示板ぐらい作ってみようかと思います。

 

◇関連:Catalyst (ソフトウェア) – Wikipedia
◇関連:Ruby on Rails – Wikipedia
◎関連:Catalyst – Web Framework

 

モダンPerl入門 (CodeZine BOOKS)

タグ : ,

[MySQLメモ]オートインクリメントするカラムの値をINSERT直後に取り出すには

dfGalleryの画像アップロードがいまいち安定性がないので(特に複数画像の一括アップロード時、さくらだから?)ちょっと自前で簡易のアップローダを作ってみたのですが、その際にMySQLをいじったのでちょっと勉強した点だけメモっておきます。

◆関連:SQLiteメモ:オートインクリメントするカラムの値をINSERT直後に取り出すには

◇参考:Bluestick.JP 開発メモ – SQLServer, MySQL, SQLiteで自動採番列の結果を取得するには
◇参考:perl DBI 最後に挿入したIDを取得する方法 last_insert_id

具体的には下の様なコードを書いたのでそのまま貼り付けておきます。

肝心の部分は下の部分で、last_insert_idを使うとオートインクリメントされたidの値を取得する事ができます。

my $LID = $hDB->last_insert_id($cfg{database}, $cfg{database}, "$cfg{dbprefix}content", ‘id’);

SQLiteの場合と違って引数にデータベース名とテーブル名、カラム名?等の引数が必要なのがちょっと面倒ですね。面倒というほどでもないか。

 

#———————————————————-
#    DB登録

#1.kumacchi_content テーブルにタイトルをインサート
#2.1.のインサート時のオートインクリメントされたidを取得
#
# id    uid pid type    title
# 39     1     33     image     onaji2
#
#    3. 2.で取得したidをcidにして 画像3種の登録 kumacchi_contentprop テーブルに
#
#   id      cid name           value
#      110     39     thumbnail_file      FXP0000012.jpg
#    111     39     image_file     FXP0000012.jpg
#    112     39     timestamp     1256931224
#———————————————————-
sub insertDB{
    my ($ori,$tumb,$title) = @_;

    my $cnt =0;

    my $hDB = DBI->connect("DBI:$cfg{dbdriver}:$cfg{database}:$cfg{hostname};mysql_server_prepare=1","$cfg{username}","$cfg{password}",{PrintError=>0});
    unless($hDB){&error($DBI::errstr);}
    $hDB->do("set names utf8");

    my $SQL = "INSERT INTO $cfg{dbprefix}content VALUES(NULL,?,?,?,?)";
    $hDB->do(‘BEGIN’);

    my $hst = $hDB->prepare($SQL);
    unless($hst){&error($hDB->errstr);}
    my $retval = $hst->execute("1",$kdecode::in{‘album’},"image",$title);
    unless($retval){&error($hDB->errstr);}

    #my $LID = $hDB->func(‘LAST_INSERT_ID’);
    my $LID = $hDB->last_insert_id($cfg{database}, $cfg{database}, "$cfg{dbprefix}content", ‘id’);
    #&error("$LID");

    $SQL = "INSERT INTO $cfg{dbprefix}contentprop VALUES(NULL,?,?,?)";
    $hst = $hDB->prepare($SQL);
    unless($hst){&error($hDB->errstr);}
    $retval = $hst->execute($LID,"thumbnail_file",$tumb);
    unless($retval){&error("1:".$hDB->errstr);}

    $SQL = "INSERT INTO $cfg{dbprefix}contentprop VALUES(NULL,?,?,?)";
    $hst = $hDB->prepare($SQL);
    unless($hst){&error($hDB->errstr);}
    $retval = $hst->execute($LID,"image_file",$ori);
    unless($retval){&error("2:".$hDB->errstr);}

    $SQL = "INSERT INTO $cfg{dbprefix}contentprop VALUES(NULL,?,?,?)";
    $hst = $hDB->prepare($SQL);
    unless($hst){&error($hDB->errstr);}
    $retval = $hst->execute($LID,"timestamp",time);
    unless($retval){&error("3:".$hDB->errstr);}

    #コミット
    $hDB->do(‘COMMIT’);

    $hst = undef;

    #DB切断
    $hDB->disconnect;
}

タグ : , , ,

[Perlメモ]ImageMagickで画像サイズ変更

ウェブアプリ等で画像を扱う大抵の場合ImageMagickかGDを使うことになるかとおもいます。

ImageMagickで用途が多いと思われる画像サイズの変更を行う方法をメモしておきます。

検索しても割と出てきにくいので困った方もいるかと思います。(幅だけ指定のはよく出てくるけど、縦横指定でアスペクト比固定の方法がみつからないんですよね)

とりあえずサブルーチンとして書くとこんな感じかなと思います。

&ReSave(“inp.jpg”,”outp.jpg”,800,600);

みたいにコールして使います。

#
# usage &ReSave(input file,output file,max image width,max image height);
#

sub ReSave{
    use Image::Magick;

    my($fname)    = $_[0];                    #入力ファイルパス
    my($out)    = $_[1];                    #出力ファイルパス
    my($maxwidth)    = $_[2];                #縮小実行トリガサイズ
    my($maxheight)    = $_[3];                #縮小実行トリガサイズ

    my($i) = Image::Magick->new;            #Image Magick用オブジェクト生成

    $i->Read($fname);

    #縦横比を保ってサイズの変更
    $i = $i->Transform(geometry=>"$maxwidth x $maxheight");

    $i->Set(quality=>90);                    #圧縮率変更!やってみてます。
    $i->Write("$out");                    #イメージを指定フォーマットで書き出し

    undef $i;                                # オブジェクト破棄
}

 

ミソの部分は

$i = $i->Transform(geometry=>"$maxwidth x $maxheight");

ですね。これで縦横比(アスペクト比)を保ったまま、指定した幅と高さ内で画像を拡大や縮小する事ができます。

下の様に書くと幅だけを指定して幅のピクセルを基準に縦横比を保ったまま画像のサイズを変更できます。

$i = $i->Transform(geometry=>"$maxwidth x");

 

下の場合は高さだけを指定した場合で高さを基準に縦横比を保ったまま画像のサイズを変更できます。

$i = $i->Transform(geometry=>"x $maxheight");

 

後は、画質を90で書きだしています。書きだすときにWriteにちょっと書きたすだけで別の画像形式で書き出せたりするのがImageMagickのいいところですね。

http://www.libgd.org/Main_Page Main Page – LibGD
GD Graphics Library

ImageMagick逆引きコマンドリファレンス
amazon 楽天

最近は書籍があっていいですね。

タグ :

 
© KUMA TYPE