<?xml version="1.0" encoding="utf-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:cc="http://web.resource.org/cc/"
  xmlns="http://purl.org/rss/1.0/">

  <channel rdf:about="http://unknownplace.org/memo/">
    <title>unknownplace.org - Tags: catalyst</title>
    <description>powered by CLON 0.2</description>
    <link>http://unknownplace.org/memo/</link>
    <dc:language>ja</dc:language>
    <dc:creator>typester</dc:creator>    <dc:date>2008-07-23T15:38:00+09:00</dc:date>
    <admin:generatorAgent rdf:resource="http://unknownplace.org/apps/clon?v=0.2" />

    <items>
      <rdf:Seq>
	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/07/23#e002" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/07/23#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/03/05#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/02/29#e003" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/02/29#e002" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/02/16#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/02/05#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/01/30#e002" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/01/30#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/01/18#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2008/01/17#e002" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2007/12/20#e003" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2007/12/20#e002" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2007/09/13#e001" />
 	<rdf:li rdf:resource="http://unknownplace.org/memo/2007/06/15#e001" />
       </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="http://unknownplace.org/memo/2008/07/23#e002">
    <title>15:38 </title>
    <description />
    <link>http://unknownplace.org/memo/2008/07/23#e002</link>
    <content:encoded><![CDATA[<p>とりあえず <code>Test::WWW::Mechanize::Catalyst</code> は使わずに <code>Catalyst::Test</code> だけでがんばることにした。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-07-23T15:38:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/07/23#e001">
    <title>11:32  Perl 5.10 + Test::WWW::Mechanize::Catalyst</title>
    <description />
    <link>http://unknownplace.org/memo/2008/07/23#e001</link>
    <content:encoded><![CDATA[<p>うごかんわけだが、みんなどうしてんの？</p>

<p>5.10 の問題ではなくて、最新版の libwww-perl (5.10に付属)の問題という話だけど、5.8.x でも LWP あげたらおなじことになるのかなー。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-07-23T11:32:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/03/05#e001">
    <title>13:32  Catalyst MVC</title>
    <description />
    <link>http://unknownplace.org/memo/2008/03/05#e001</link>
    <content:encoded><![CDATA[<p>Catalyst に関してだけ言えば Model いらなくね？という話もわかるのだが、アプリの複数の箇所で共通で使うオブジェクトはModelを使うと楽だし論理的な実装になるとおもう。</p>

<p>僕のMVCの理解が変かもしれないけど、今はそんな感じで考えている。＞共通で使うオブジェクトはModel</p>

<p>そんで、<code>Catalyst::Model</code> 微妙っていうのはやっぱり Catalyst 専用の Model つくってもほかから利用できないしなってのがあるんだけど、それは <code>Catalyst::Model::Adaptor</code> で解決。jrockway++</p>

<p>なので、単体で動作する何らかのモジュールをまずつくり、それを Model::Adaptor で連結する、というのが今の好きな方法。</p>
]]></content:encoded>
    <dc:subject>catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-03-05T13:32:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/02/29#e003">
    <title>19:12 </title>
    <description />
    <link>http://unknownplace.org/memo/2008/02/29#e003</link>
    <content:encoded><![CDATA[<blockquote>
  <p>俺は MyApp::Context って名前で BK まとめてるな。</p>
</blockquote>

<p>こっちのがカコイイ！</p>
]]></content:encoded>
    <dc:subject>catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-02-29T19:12:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/02/29#e002">
    <title>12:17  Catalystアプリオレオレポリシー</title>
    <description />
    <link>http://unknownplace.org/memo/2008/02/29#e002</link>
    <content:encoded><![CDATA[<p>下記camr作った時点での僕のポリシーは</p>

<ol>
<li>アプリ名にかかわらず設定ファイルはconfig.yamlとconfig_local.yaml</li>
<li>でも変更することがないほとんどの設定はyamlには書かない。yamlがごちゃっとするときもい</li>
<li>ForceUTF8系モジュールは使用しない。内部がきちんとutf8で統一されていれば必要ない。</li>
<li>MyApp::UtilsとかいうのでいろいろBKなことをまとめてする。uri_forを気に入るように直したり、FillInFormの挙動変えたり</li>
</ol>

<p>なんか抜けてる気がするけどこんな感じ。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-02-29T12:17:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/02/16#e001">
    <title>19:34  Catalyst::Controller::Resources</title>
    <description />
    <link>http://unknownplace.org/memo/2008/02/16#e001</link>
    <content:encoded><![CDATA[<p>かっこいい。</p>

<p>オレオレ規約をもとに雛形を生成するヘルパースクリプトでがんばるよりこういう自分用のコントローラをつくるほうがスマートだなぁ。</p>

<p>Catalystユーザー的にはオールドタイプな自分としては見習おうと思った。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-02-16T19:34:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/02/05#e001">
    <title>16:51  JSON::XS を実戦投入した</title>
    <description />
    <link>http://unknownplace.org/memo/2008/02/05#e001</link>
    <content:encoded><![CDATA[<p>いままでずっと <code>JSON::Syck</code> を使い続けていたのだけど、いまの <code>JSON::Syck</code> には</p>

<pre><code>/y|Y
|n|N
|yes|Yes|YES
|no|No|NO
|true|True|TRUE
|false|False|FALSE
|on|On|ON
|off|Off|OFF
|null|Null|NULL
|~
/x
</code></pre>

<p>の正規表現にマッチする値はシングルクオートでくくられてしまうという仕様があり、これはJSONの仕様に反するのでパーサーによっては正しく処理できないものがある。</p>

<p>これがFlashから使うJSON APIでもろにはまって、adobe の corelib に入っている JSON のパーサーはこれをパースできない。(rubyのyamlパーサーでもエラーになるようだ)</p>

<p>cho45さんが<a href="http://rt.cpan.org/Public/Bug/Display.html?id=32910">これを直すパッチ</a>を書いてくれたのだけど、いい機会なので <code>JSON::XS</code> を試してみた。<code>JSON::Syck</code> のドキュメントからも言及されてるしね。</p>

<p><code>Catalyst::View::JSON</code> から使うには以下のような感じで <code>MyApp::View::JSON</code> をかけばOK。</p>

<pre><code>package MyApp::View::JSON;
use strict;
use base 'Catalyst::View::JSON';

use JSON::XS ();

sub new {
    my $self = shift-&gt;NEXT::new(@_);

    my $dumper = JSON::XS-&gt;new-&gt;latin1;
    $self-&gt;json_dumper(sub { $dumper-&gt;encode($_[0]) });

    $self;
}

1;
</code></pre>

<p><code>JSON::Any</code> つかってないのは Any だと環境変数で使用ライブラリを上書きできてしまっていやなので XS を直使用している。</p>

<p>一日くらい社内でテストしたけどだいじょうぶっぽかったのでさっき本番投入してみた。どうだろうな。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-02-05T16:51:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/01/30#e002">
    <title>12:18  コード再利用の話</title>
    <description />
    <link>http://unknownplace.org/memo/2008/01/30#e002</link>
    <content:encoded><![CDATA[<p>基本自社サービス or 個人サービスしかつくってないので、本当にcatalystを使っているとコピペ地獄になる。</p>

<p>また同じことかいてるなーってのが多すぎるため、むかついてなるべくコピペを減らす工夫をしている。</p>

<p>codereposにあげたcatstarterってのもそうだし、あとはヘルパーを結構書いてる。</p>

<p>Catalystのヘルパーってまぁ要するにコードジェネレータなんだけど、ユーザー登録とかログイン・ログアウトとかほんとにいつもかいてるのでその辺はヘルパー一発で雛形生成するようにしてたりとか、jsのajax apiのサーバーサイドとかもjson形式を決めうちにしちゃってこれも雛形生成している。</p>

<p>いまの <code>Catalyst::Helper</code> って新しいコード生成には使えるけど既存のクラスにメソッド追加とかそういうのできないのが不満。なんかつくりたい。</p>

<p>この辺の話はちゃんとまとめたいな。catalyst conやりたい！</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-01-30T12:18:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/01/30#e001">
    <title>12:14 </title>
    <description />
    <link>http://unknownplace.org/memo/2008/01/30#e001</link>
    <content:encoded><![CDATA[<blockquote>
  <p><a href="http://catalyst.g.hatena.ne.jp/dann/20080129/1201620323">Catalyst::Plugin::URI::MtimeQueryとCatalyst::Plugin::Assets - dann@catalyst - Catalystグループ</a></p>
  
  <p>Catalyst::Plugin::AssetsにCatalyst::Plugin::URI::MtimeQueryのアイデアをインスパイアしたものを加えると、Assetsも結構使えるかも知れないなぁ。export_with_mtimequeryみたいなのがあればいいのかも。</p>
</blockquote>

<p>これ今まさに仕事で使おうと思ってかいている。</p>

<p>そのうち公開します！</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-01-30T12:14:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/01/18#e001">
    <title>03:23  uri_forのやつ</title>
    <description />
    <link>http://unknownplace.org/memo/2008/01/18#e001</link>
    <content:encoded><![CDATA[<p>uri_withも同じようにおかしかったのでそっちもなおしてもらった。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-01-18T03:23:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2008/01/17#e002">
    <title>03:19  uri_forのパッチ</title>
    <description />
    <link>http://unknownplace.org/memo/2008/01/17#e002</link>
    <content:encoded><![CDATA[<p>いまどきのperl使いな皆様におかれましては内部ではutf8フラグを立てたutf8 stringとして文字列を扱っていると思いますが、そういった場合は <code>uri_for</code> は正しく動作します。</p>

<p>そうではなく、utf8 bytes を渡した場合、今の <code>uri_for</code> では壊れたURIが帰って来るというバグがあります。単純なミスなのだけど。</p>

<p>かなり前からなんだけど誰も気がつかないのか必要ないのか一向に直らないので業を煮やしてメールでパッチ送ったところすぐに反映してくれた。ナイス。</p>

<blockquote>
  <p><a href="http://dev.catalyst.perl.org/svnweb/Catalyst/diff/Catalyst-Runtime/5.70/trunk/lib/Catalyst.pm?rev1=7391;rev2=7392">http://dev.catalyst.perl.org/svnweb/Catalyst/diff/Catalyst-Runtime/5.70/trunk/lib/Catalyst.pm?rev1=7391;rev2=7392</a></p>
</blockquote>

<p>パッチはこんなん。</p>

<p>canonical してないのは仕様らしい。(昔のはしてたよね？)</p>

<p>mst によれば</p>

<blockquote>
  <p>For RSS/atom feeds etc.</p>
</blockquote>

<p>とのこと。どゆこと？</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2008-01-17T03:19:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2007/12/20#e003">
    <title>15:13 </title>
    <description />
    <link>http://unknownplace.org/memo/2007/12/20#e003</link>
    <content:encoded><![CDATA[<p>舌足らずすぎた。</p>

<pre><code>Model::DBIC:
  connect_info:
    - dbi:mysql:table
    - root
    - on_connect_do:
        - SET NAMES utf8
      cursor_class: DBIx::Class::Cursor::Cached
  cache_file: __path_to(tmp/query_cache)__
</code></pre>

<p>さっきはこんなconfigで使った場合のコードです。</p>
]]></content:encoded>
    <dc:subject>catalyst, dbic</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2007-12-20T15:13:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2007/12/20#e002">
    <title>13:33  DBIx::Class::Cursor::Cachedつかってみた</title>
    <description />
    <link>http://unknownplace.org/memo/2007/12/20#e002</link>
    <content:encoded><![CDATA[<p>すばらしすぎる。もっと早く使えばよかったとおもった。</p>

<p><code>Catalyst::Model::DBIC::Schema</code> で使う場合はこんな感じでOK。</p>

<pre><code>sub new {
    my $self = shift-&gt;NEXT::new(@_);

    my $cache = Cache::FastMmap-&gt;new( share_file =&gt; $self-&gt;{cache_file} );

    $self-&gt;schema-&gt;default_resultset_attributes({
        cache_object =&gt; $cache,
    });

    $self;
}
</code></pre>

<p>そんで、あとはsearchのattrとして { cache_for => 300 } とかかいてやればそのクエリは300秒キャッシュされる。</p>

<p>実際にはsearch時ではなくてallとかnextのときにそのクエリをキャッシュしてる。</p>

<p>ちなみに<code>default_resultset_attributes</code>に<code>cache_for</code>を含めるとすべてのクエリがキャッシュされる。</p>
]]></content:encoded>
    <dc:subject>catalyst, dbic</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2007-12-20T13:33:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2007/09/13#e001">
    <title>16:48  CatalystアプリのスタータースクリプトをCodeReposに</title>
    <description />
    <link>http://unknownplace.org/memo/2007/09/13#e001</link>
    <content:encoded><![CDATA[<p>あげた。</p>

<p>もともと使ってるのはpmsetupを改造したので雛形つくるだけだったんだけど、毎回DBとか使うわけでもないので、ついでにそこを選べるように改造した。</p>

<p>ほぼ僕専用ルールにのっとった雛形を作成しますので他の方はまったく使えないと思いますが、参考にはなるかもしれません。</p>

<p>他の方のも見てみたいのでぜひとも<a href="http://coderepos.org/share/">coderepos</a>で共有しましょう！</p>

<p>あ、Catalyst自分規約カンファレンス、とかおもしろいかもしれない。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2007-09-13T16:48:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2007/06/15#e001">
    <title>17:07  IP認証とBasic認証を同時に使うCatalystコードサンプル</title>
    <description />
    <link>http://unknownplace.org/memo/2007/06/15#e001</link>
    <content:encoded><![CDATA[<p>Catalystは <code>Authentication::Credential::*</code> プラグインを複数使うことにより、複数の認証方式に対応できる。</p>

<p>IP認証などのような、Credプラグインが提供されていないものも即席でCredインタフェースにそったモジュールを作ることで簡単に認証方法を追加することができる。</p>

<p>MyApp.pm はこんな感じ</p>

<pre><code>package MyApp;

use strict;
use warnings;

use Catalyst::Runtime '5.70';
use Catalyst qw/
    ConfigLoader

    Authentication
    Authentication::Credential::HTTP
    +MyApp::Credential::IP
    Authentication::Store::DBIC
    /;

our $VERSION = '0.01';

__PACKAGE__-&gt;setup;
</code></pre>

<p><code>Cred::HTTP</code> が Basic 認証用のモジュール。<code>+MyApp::Credential::IP</code> がIP認証用のオリジナルモジュール。</p>

<p>この <code>MyApp::Credential::IP</code> のコードはこんな感じ。</p>

<pre><code>package MyApp::Credential::IP;
use strict;
use warnings;
use base qw/Catalyst::Plugin::Authentication::Credential::Password/;

sub authenticate_from_address {
    my $c = shift;

    my $ip = $c-&gt;model('DBIC::UserIp')-&gt;find({ ip =&gt; $c-&gt;req-&gt;address }, { prefetch =&gt; 'user' })
        or return;
    my $user = $c-&gt;get_user( $ip-&gt;user-&gt;username )
        or return;

    $c-&gt;set_authenticated($user);

    1;
}

1;
</code></pre>

<p>こんな短いコードで認証増やせるの。なかなか便利。</p>

<p>で、実際に利用するのは以下のように、Root Controller の auto アクションに</p>

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

    # basic auth
    $c-&gt;authenticate_http and return 1;

    # ip auth
    $c-&gt;authenticate_from_address and return 1;

    # return basic auth response when no auth success
    $c-&gt;authorization_required_response( realm =&gt; 'Require Authentication' );
    return;
}
</code></pre>

<p>などとする。</p>

<p>全体に認証かけたいときはルートコントローラの auto に、コントローラ個別に指定したいときは、上記コードを埋め込んだ認証用の親コントローラクラスつくって認証必要なコントローラはそれを継承する。</p>

<p>パスごとにやりたいときは <code>Authentication::ACL</code> ってのがあるけど僕は使っていない。</p>
]]></content:encoded>
    <dc:subject>perl, catalyst</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2007-06-15T17:07:00+09:00</dc:date>
  </item>
</rdf:RDF>
