Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-02-17

Test::Continuous

| 22:04 |  Test::Continuous - dann@catalyst を含むブックマーク はてなブックマーク -  Test::Continuous - dann@catalyst  Test::Continuous - dann@catalyst のブックマークコメント

http://search.cpan.org/dist/Test-Continuous/

コードが正しくなるタイミングとファイル変更のタイミングは違う気がするから、ファイル変更時に自動テストをするということの有効性があまりわかっていないのだけれど、何か使い方考えれば使えるところあるのかなぁと思って気にしている。

Rails界隈ではそこそこZenTestも使われているみたいだから、何か良い点があるのかもなぁ。Catalystのテスト環境としてなんか使えないかなと思っているのだけれど。

Catalyst用のsnippet

| 21:56 |  Catalyst用のsnippet - dann@catalyst を含むブックマーク はてなブックマーク -  Catalyst用のsnippet - dann@catalyst  Catalyst用のsnippet - dann@catalyst のブックマークコメント

id:spiritlooseさんのsnippet

http://d.hatena.ne.jp/spiritloose/20080217/1203245464

おぉ、これは大分早くコーディングできそう。

Tabはautocomplのほうとバッティングするから、<C-B>に割当てみることにした。

Catalystでマルチバイト

| 20:57 |  Catalystでマルチバイト - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystでマルチバイト - dann@catalyst  Catalystでマルチバイト - dann@catalyst のブックマークコメント

hide-kさんの素晴らしいまとめ。

http://blog.hide-k.net/archives/2007/03/catalyst_2.php

ユーザーの入力、DBの入出力、ユーザーへの出力の3点で気をつける必要がある。Perlの場合、UTF-8フラグ周りの文字化けではまりがちなので、その点上記を抑えておけばはまりどころが殆どない。

アプリケーションの文字コードと国際化の全体方針は最初に決めておいたほうがよくって、こういうのはstarterでやっておくのがいいかなと。starterには組み込み済み。

自分用のcatstarter

20:37 |  自分用のcatstarter - dann@catalyst を含むブックマーク はてなブックマーク -  自分用のcatstarter - dann@catalyst  自分用のcatstarter - dann@catalyst のブックマークコメント

lang/perl/misc/catstarter/dannに移動

http://coderepos.org/share/browser/lang/perl/misc/catstarter/dann

catgen.shなどもコミットした。

Catalystでi18n

| 20:32 |  Catalystでi18n - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystでi18n - dann@catalyst  Catalystでi18n - dann@catalyst のブックマークコメント

Catalyst::Plugin::I18Nを使う。

これを使うことで、locメソッドが使えるようになる。

メッセージの国際化の方法

Pelrモジュール

$c->loc('Hello World');

TT内

[% c.loc('Hello World') %]

で、localeに応じた切り替えが可能。

POファイルの置き場所

poファイルは、MyApp/I18N/ に配備する。

POファイルの生成

catstarterで、以下のようなscriptscript/myapp_update_po.sh に生成するようにしている。

script/myapp_update_po.sh で、MyApp/I18Nにpoファイルを生成するようになる。

TTのテンプレートとPerlモジュールが国際化対象。

#!/bin/sh
(find root/templates/ -name '*.tt2' ; find lib/ -name '*.pm' )| xargs xgettext.pl -o lib/MyApp/I    18N/ja.po
(find root/templates/ -name '*.tt2' ; find lib/ -name '*.pm' )| xargs xgettext.pl -o lib/MyApp/I    18N/en.po

POファイルを生成したら、charsetはutf-8に変更しておくこと。

msgid ""
msgstr ""
"Project-Id-Version: XXX\n"
"PO-Revision-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: XXX\n"
"Last-Translator: XXX\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

考察

Catalystにべったり依存した構造にするのであれば、これでもいいかもしれない。ただ、Catalystに依存しないようにとモジュールを作った場合に、そのモジュールがcontextにアクセスできないと国際化ができなくなるので、その点で国際化機構をCatalystのプラグインにしてしまうというのは、困ることはありそう。

国際化機構は、Catalystのフレームワークとは別の枠組みで作ったほうがいいかなというのが、今のところの印象。

TODO

  • POファイルの生成部分の改善

Catalystでキャッシュ

16:23 |  Catalystでキャッシュ - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystでキャッシュ - dann@catalyst  Catalystでキャッシュ - dann@catalyst のブックマークコメント

基本的なキャッシュの種類

http://www.thinkit.co.jp/free/marugoto/2/1/6/1.html

  • HTTPキャッシュ
    • HTTP 1.1ではキャッシュ機能が強化され、より細かいキャッシュコントロールが可能
  • 出力キャッシュ
    • 動的に生成したページをディスクなどに保存し、DBクエリ、ページ生成負荷を軽減
  • クエリキャッシュ
    • DBサーバーへのクエリ結果をキャッシュし、クエリ数を削減

これに対応させてみると、

  • HTTPキャッシュ,出力キャッシュ
  • クエリキャッシュ

後は、

See also:

http://catalyst.perl.org/calendar/2005/11

GalangGalang2012/10/31 00:53I suppose that sounds and smlles just about right.

serowtserowt2012/11/01 06:46dg9QAM , [url=http://lguawwokcygh.com/]lguawwokcygh[/url], [link=http://znungxozrjzp.com/]znungxozrjzp[/link], http://etsniywijzoa.com/

pcoposfcuyapcoposfcuya2012/11/01 13:21FcmCUk <a href="http://fnojtbacntmu.com/">fnojtbacntmu</a>

vgozepoqvgozepoq2012/11/02 02:125rliHl , [url=http://ishgorqhgyly.com/]ishgorqhgyly[/url], [link=http://cugddjtgnaxl.com/]cugddjtgnaxl[/link], http://xhbdujjoggle.com/

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080217

2008-02-16

DB周りの設定とSchema作成の流れ

15:34 |  DB周りの設定とSchema作成の流れ - dann@catalyst を含むブックマーク はてなブックマーク -  DB周りの設定とSchema作成の流れ - dann@catalyst  DB周りの設定とSchema作成の流れ - dann@catalyst のブックマークコメント

config/deploy.rbでDBのパスワードの編集

MySQLの設定。DBの作成など。

% cap deploy:setup

schemaの編集

% vim config/sql/schema.sql

テーブルの作成

% cap deploy:create_table

Schemaの生成

script/hoge2_schema_dumper.pl 

schema.sqlを直したら、テーブルの作成からループ。

後はリリース後にDBのスキーマ変更とかしたい場合に、migrateするところをどう自動化するか。ここが決まれば手順としては大体いいかな。

Catalyst::Helper::Schema::DumperでYAMLからdsnなど取得

02:57 |  Catalyst::Helper::Schema::DumperでYAMLからdsnなど取得 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalyst::Helper::Schema::DumperでYAMLからdsnなど取得 - dann@catalyst  Catalyst::Helper::Schema::DumperでYAMLからdsnなど取得 - dann@catalyst のブックマークコメント

myapp.ymlから、dsn, user, passwordを取得するようにした。helperにdsn, user, password渡さなくていいからhelperの使い方を覚えてなくてもいい。

--- Dumper.pm.orig      2008-02-17 02:17:10.000000000 +0900
+++ Dumper.pm   2008-02-17 02:22:06.000000000 +0900
@@ -47,7 +47,7 @@

     my @path = (split('::', $app), 'Schema');

-    $helper->render_file( 'script', $script, { path => \@path, arg => \@arg } );
+    $helper->render_file( 'script', $script, { path => \@path, appprefix => Catalyst::Utils::appprefix($app) } );
     chmod 0755, $script;
 }

@@ -75,6 +75,7 @@
 use strict;
 use warnings;

+use YAML;
 use FindBin;
 use File::Spec;
 use lib File::Spec->catfile( $FindBin::Bin, qw/.. schema lib/ );
@@ -82,10 +83,6 @@
 use Path::Class qw/file dir/;
 use DBIx::Class::Schema::Loader qw/make_schema_at/;

-my @arg = defined @ARGV ? @ARGV : qw([% arg.join(",") %]);
-
-die unless @arg;
-
 # do manual delete instead of really_erase_my_files option
 #    for keep MyApp/Schema.pm
 my $libdir = dir($FindBin::Bin, '..', 'lib', '[% path.join("', '") %]' );
@@ -93,13 +90,16 @@
     $libdir->rmtree;
 }

+my $config = YAML::LoadFile(File::Spec->catfile( $FindBin::Bin, '..', '[% appprefix %].yml'));
+my $db_config = $config->{'Model::DBIC'};
+
 make_schema_at(
-    '[% app %]::Schema',
+    $db_config->{schema_class},
     {   components => [ 'ResultSetManager', 'UTF8Columns' ],
         dump_directory => File::Spec->catfile( $FindBin::Bin, '..', 'lib' ),
         debug          => 1,
     },
-    \@arg,
+    $db_config->{'connect_info'},
 );

 1;

Perl::Critic

| 21:32 |  Perl::Critic - dann@catalyst を含むブックマーク はてなブックマーク -  Perl::Critic - dann@catalyst  Perl::Critic - dann@catalyst のブックマークコメント

catastarterに追加。殆どPlaggerのやつまんまだけれど。

=== test ===
---
file: 't/perlcriticrc'
template: |
  # for mkdir $dir, 0777
  [-ValuesAndExpressions::ProhibitLeadingZeros]

  [-BuiltinFunctions::ProhibitStringyEval]

  # no strict 'refs'
  [TestingAndDebugging::ProhibitNoStrict]
  allow = refs

---
file: 't/99perlcritic.t'
template: |
  use strict;
  use Test::More;

  eval { require Test::Perl::Critic; Test::Perl::Critic->import(-profile => "t/perlcriticrc") };
  plan skip_all => "Test::Perl::Critic is not installed." if $@;

  all_critic_ok("lib");

Shipwright

10:34 |  Shipwright - dann@catalyst を含むブックマーク はてなブックマーク -  Shipwright - dann@catalyst  Shipwright - dann@catalyst のブックマークコメント

これは、かなり使える気がする。cool!

http://search.cpan.org/~jesse/Shipwright-1.0/

  • CPANモジュールがバージョン管理できる。
  • モジュール間の依存関係、インストール順をyamlで管理することができる
  • モジュールのバージョンの更新が簡単にできる
  • cpanコマンドみたいに、何度もy押さなくていい!

といったことができるようになっている。

一回、CPANモジュールをバージョン管理下にいれてしまえば、後はどのサーバーでも同じバージョンのものが使えるようになるわけで、各サーバーでモジュールのバージョンが異なるなんてことは無くなりそう。

sudo shipwright create -r svk://mirror/acme-musume
sudo shipwright import -r svk://mirror/acme-musume Acme::MorningMusume

これでAcme::MorningMusumeに必要なものがバージョン管理下に。

以下でインストール。

sudo shipwright build -r svk://mirror/acme-musume

/tmp/* に必要なモジュール一式が生成される。インストールされる先は、--install-baseで指定できるようになっている。デフォルトは/tmp/*。forceを指定すればforce install.

多分、複数台のサーバーに同一のCPANモジュールをインストールするには、ディストリビューションのパッケージを作って、そのパッケージをバージョン管理する方法しかないような気がするのだけれど、その代替になりえそうだなぁという気がした。(複数台にデプロイだけであれば、ディスクイメージ丸ごとコピーして、そのディスクイメージだけ頑張って更新ってのもあるのかも。)

これで、アプリケーションのに必要なモジュールも、アプリケーション本体もバージョン管理できて、それらを一括でデプロイできるようになりそう。これは可能性を感じるなぁ。

そんなこんなで、Catalyst用のshipwright buildが作れるようにしておこうと思ったのでした。依存モジュールが多いCatalystは、cpanコマンドでインストールするの大変なんですよね。(Plaggerのも欲しい!)

ShelcyShelcy2012/10/30 22:21Thought it wuoldn't to give it a shot. I was right.

huhgqysvfohuhgqysvfo2012/11/01 01:23jAF3Eb <a href="http://sgebxcktvppi.com/">sgebxcktvppi</a>

rgukfswkrgukfswk2012/11/01 06:34syuiuf , [url=http://tcxhglztdxaa.com/]tcxhglztdxaa[/url], [link=http://vsssdqhlinam.com/]vsssdqhlinam[/link], http://wgthsyqwdlzk.com/

hbwepcntafahbwepcntafa2012/11/01 13:10QC20R0 <a href="http://sxlvgxikvans.com/">sxlvgxikvans</a>

ayaxcknayaxckn2012/11/02 02:00MCWowV , [url=http://lfxurgdvfssk.com/]lfxurgdvfssk[/url], [link=http://dfhlnklckjue.com/]dfhlnklckjue[/link], http://audqpmbmroqf.com/

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080216

2008-02-15

モデルをまたがったロジックの共有

| 20:56 |  モデルをまたがったロジックの共有 - dann@catalyst を含むブックマーク はてなブックマーク -  モデルをまたがったロジックの共有 - dann@catalyst  モデルをまたがったロジックの共有 - dann@catalyst のブックマークコメント

結局、コントローラにPrivateなアクション定義して、そこで実現するのが一番シンプルなんじゃないかと思った。

ただ、コントローラにもたせちゃうとテストはしにくいから、そこのロジックが複雑になるのであれば、コントローラからディスパッチする別のロジック専用のクラスを作るという形にするんじゃないかと思った。思うに、複数のUIで共有されるビジネスロジックは実際は少ないんじゃないかという気がする。

だから、ロジックが複雑になる場合には、<コントローラ名>LogicというPlainなクラスを作って、そこにモデルをまたがったロジックを記述するようにすればいいんじゃないかという気がした。ロジックがシェアされなければ、こういう命名規則はありなんじゃないかと思う。

自分の中ではすっきりしたつもり。後はこれでやってみるだけ。今までは極力モデルに押し込もうとしてたんだけど、モデルにまたがったロジックをどう扱うのかというので、全部コントローラに入ってしまって、上手くいかないところがあったのだけれど、次からは上記方針でやってみる。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080215

2008-02-14

Catalystの良さ

02:54 |  Catalystの良さ - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystの良さ - dann@catalyst  Catalystの良さ - dann@catalyst のブックマークコメント

一つは、プラグインシステムとしての気持ちよさ。デフォルトで何でもできるフレームワークでなくて、何でも「選択できる」フレームワーク。自由にプラグインを組み込めて、プラグインが選択ができる。フレームワークとしては薄くできているんだけれど、プラグインを追加すれば色々なことができる。これは、Java界隈にも、Ruby界隈にもないフレームワークなんじゃないかと思う。その点では一番進んでいるフレームワークだと思う。フレームワークとして薄くできているという点は開発者視点でみるととても有難い。

2点目は、プラグインシステムでのレイヤの置き換え。これはプラグインを選択できるというのとほぼ同じ意味なのだけれど、レイヤが固有の技術に縛られないということ。だから、ORマッパだけを置き換えたりというのも簡単にできるようになっている。

3点目は、Railsと同じなのだけれど、ERモデルを主体にしたモデル層の構築。いわゆるドメインモデルとERモデルがずれない。これは本当に開発効率が高い。PofEAAとかDomain Driven Designとかを読んでたときは、ドメインモデルとDAOは分けて、DBの作りは、そのまま上位レイヤには見えないほうがいいと思っていたことがあった。確かに美しいドメインモデルを作りたい場合にはそうなんだけれど、結局それをやるとモデル間のミスマッチを吸収するのが面倒だし、レイヤ間をつなぐのもいちいち手間がかかる。ERモデルを直にモデルとして扱うというのの快適さは、OO厨だった自分には衝撃だったし、これは大きな流れになっているんじゃないかと思う。

メタフレームワークという選択肢

01:57 |  メタフレームワークという選択肢 - dann@catalyst を含むブックマーク はてなブックマーク -  メタフレームワークという選択肢 - dann@catalyst  メタフレームワークという選択肢 - dann@catalyst のブックマークコメント

フレームワークは制御の逆転があるからフレームワークなわけで、prototype.jsはフレームワークじゃなくてライブラリなんですよね。

ライブラリは制御の流れを自分がコントロールできるから、背後の思想を理解しなくていい分、使う側は楽。一方、フレームワークは、制御の流れが逆転する分、その枠組みの中で作らなきゃいけないわけで、設計思想がわからないとつらい。設計思想がわかれば、すばらしいよねと思えるフレームワークもある。ただ、設計思想がわかってもつらいというフレームワークも数多くあって、Java界隈にはそういうフレームワークがとても多かった。

Strutsは、なんでこんなに複雑な設定ファイルを書かなきゃいけないのという、全くもって理解に苦しむフレームワークの一つなわけで、多分そういうところから入っちゃうと、フレームワークによる制約の強さとフレームワークのつくりの悪さの問題で、そもそもフレームワークの有り難味が理解できない。チームで使えば少しは有り難味がわかっても、個人で出来の悪いフレームワークを使えば、なおさら理解できないんじゃないかと思う。

Catalystは、その点ガチガチな規約はないし、どのレイヤもプラグインで切り分けられるから、フレームワークによる制約というのはさほど強いわけではない。だから、フレームワークがあるから実現できないってことは特にない。フレームワークによる制約を避けたければ、Catalystのようなメタフレームワークを使うという選択肢はある。

#ただ、ダメフレームワークといったって、大概の場合オレオレフレームワークよりはよっぽどいい。それくらいフレームワークのデザインは難しい。これはStrutsだってそう。大枠を作るのが大変なのはあるし、それを細部まで完璧にデザインしきるのは本当に難しい。だから、Strutsが使いずらいとか色々なことはあっても、それでも良くできているし、世間で使われるフレームワークの最初の一歩を作ったっていう点で、Strutsの功績は計り知れないものがあるよねというのは、書いておきたいなぁ。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080214

2008-02-13

catstarter

22:57 |  catstarter - dann@catalyst を含むブックマーク はてなブックマーク -  catstarter - dann@catalyst  catstarter - dann@catalyst のブックマークコメント

自分用にカスタマイズしたのは、テンプレートとかも含めて、明らかにstarterの範囲を超えているので、テンプレートとかは別に切り出して管理しようかなと。今のところ、素直にCatalystの構成にあわせて、以下のような形にしようかなぁと。

catastarter.pl
catshare/
  Capfile
  config/
    templates/
  root/
    templates/
    static/
      css/
      js/
      images/
  lib/

ただ、一つのファイルにまとまっているのが、starterの魅力でもあるような気も... そうすると、上記構成からstarterスクリプトを自動生成か、と段々違う方向へ...

Rails to Catalyst

22:25 |  Rails to Catalyst - dann@catalyst を含むブックマーク はてなブックマーク -  Rails to Catalyst - dann@catalyst  Rails to Catalyst - dann@catalyst のブックマークコメント

Railsでいいなぁと思うことを全部Catalystでもやりたいなぁと思っていた。大体、Catalystでも殆ど実現できるようになったんじゃないかなぁと。Railsだとデフォルトで全部入りだから、自分で組み合わせる必要ないのだけれど、Catalystだとプラグイン含めて組み合わせを考えないといけない。

これは、欠点のようで欠点でない。時代には流行があって、少し時間がたつと、このORマッパだめだよねとかそういうことになる。そんなときでも、Railsに比べればずっと移行はしやすいと思う。全部がプラグインみたいな仕組みは、自由度が高すぎるというのはあるけれど、その自由度があるから息の長いフレームワークになるんじゃないかという気がする。

これは、Perlだから成り立つ仕組みでもある。この何でもプラグインみたいな仕組みは、CPANと相性がとてもよくて、CPANがあるからCPANのモジュールをベースに拡張がどんどんされていく。ここが強烈で、それがPerlのフレームワークらしいところなんじゃないかと思う。時代にあわせて進化していける仕組みがあるというのが一つの大きな魅力になっている。

Railsの規約とかDeploymentとか、すばらしいところだけを盗んできて、後はCatalystCPAN使ってWebアプリを作るっていうのが、一番やりたいことを短時間でできて、将来にわたって割と使えるものになるんじゃないかなぁと思っています。そんなこんなで、Catalystとたわむれている今日この頃です。

# こう考えると、Rubyにはgemsがあるけれど、CPANほど成熟していないから、Railsが生まれたんじゃないかという気がする。

application serverのIPの設定の共有@capistrano

21:37 |  application serverのIPの設定の共有@capistrano - dann@catalyst を含むブックマーク はてなブックマーク -  application serverのIPの設定の共有@capistrano - dann@catalyst  application serverのIPの設定の共有@capistrano - dann@catalyst のブックマークコメント

erbのテンプレートとRoleに定義する部分で共有したかったのだけれど、Rubyを忘れているので全然書けなかった。結局、以下のように書けばよいだけだった。erb中ではbindingで変数がbindされるので、これで参照できる。

appserver_ips = ["192.168.0.30", "192.168.0.31"]
webserver_ips = ["192.168.0.30"]
dbserver_ip = "192.168.0.30"

# Role definition
role :app, *appserver_ips
role :web, *webserver_ips
role :db,  dbserver_ip, :primary => true

starterにも反映済み。これで、appserver_ipsの配列中にIPを追加すれば、mod_proxy_balancerの設定ファイルに、アプリケーションサーバーのIPが設定されることになる。これで、また一つ自動化された。

後はLVSとかの設定ファイルの生成とかやってくのもいいのかもなぁ。まぁ、自宅サーバーで使う必要は全くないのだけれど。それにしても、capistranoによる自動化は強力だなぁ。

migration

21:37 |  migration - dann@catalyst を含むブックマーク はてなブックマーク -  migration - dann@catalyst  migration - dann@catalyst のブックマークコメント

Railsのmigrationの機能をまんま使うようにすればいいんじゃないかという気がしてきた。Table定義もそっちに移すかなぁ。Table定義をRubyで書くというのはけど微妙かなぁ。Railsのdatabase.ymlとCatalystyamlファイルにDB定義を2種類書くっていうのも、微妙な気もするし。要検討。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080213

2008-02-12

Catalystでのモード切替

| 22:54 |  Catalystでのモード切替 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystでのモード切替 - dann@catalyst  Catalystでのモード切替 - dann@catalyst のブックマークコメント

Railsライクに、production, development, testの3つの環境を切り替えられるようにしたほうがよさそう。

やらなきゃいけないのは、

  • DB用の設定ファイルの切り替え
    • ConfigLoader::Multiを使って、DBの設定を3つのモードで用意するのかなと。
  • モード切替
    • 環境変数でモード切替
  • 3つのモードのDBの作成
    • DB、テーブル生成

ということで、暇があれば週末にでも。

追記:

starterでテスト用DB、開発用DBの設定ファイルは追加した。ConfigLoader::Multiでの切り分けはまた後で。以下の設定でDBの切り替え。

% MYAPP_CONFIG_LOCAL_SUFFIX=development ./script/myapp_server.pl -d -r
% MYAPP_CONFIG_LOCAL_SUFFIX=test ./scrip/myapp_server.pl -d -r 

myapp.yml, myapp_suffix.ymlの順でロードされ、suffixのファイルで上書きされる。

development, test用のyamlを作っておけばいい(Starterで用意)

後は、CapistranoであらかじめDB作るタスク用意するだけ。

See also:

http://d.hatena.ne.jp/ZIGOROu/20061108/1162971638


追記:

cap deploy:setupで、上記3種のDBを作るようにした。未テストなので週末時間あればテスト。schemaのupdateも、もっと簡単にやりたいな。

CatalystのModel(DBIC)のテスト

| 22:54 |  CatalystのModel(DBIC)のテスト - dann@catalyst を含むブックマーク はてなブックマーク -  CatalystのModel(DBIC)のテスト - dann@catalyst  CatalystのModel(DBIC)のテスト - dann@catalyst のブックマークコメント

Test::Fixture::DBIC::Schema

http://coderepos.org/share/browser/lang/perl/Test-Fixture-DBIC-Schema/trunk/lib/Test/Fixture/DBIC/Schema.pm

これでCatalystのモデルもテストできるなぁ。cool !

テストの中からCatalystのcontext参照する方法だけ調べれば、Catalystのモデルのテストのためのベースクラスは簡単に作れそう。Railsライクに、fixtureのようなメソッドを定義して、複数のFixtureを渡すような実装になる。fixtureメソッドでは、上記のTest::Fixture::DBIC::Schemaのconstruct_fixtureを呼ぶと。Test::Classを使ったベースクラスを作ることになるかな。

後は、これでモデルについてのテストは大体よさそう。実際のDBからFixtureをDumpするようなものを作っておくと、fixture作りが楽になるかな。

大体、これでモデルのテストのイメージは固まった気がする。

CatalystのControllerのテスト

| 22:54 |  CatalystのControllerのテスト - dann@catalyst を含むブックマーク はてなブックマーク -  CatalystのControllerのテスト - dann@catalyst  CatalystのControllerのテスト - dann@catalyst のブックマークコメント

Modelに実装を押し込めば、そんなにControllerのテストが数多く必要になるような気はしないな。Test::WWW::Mechanize::Catalystを使ってテスト。これはどこまでやるかは微妙かなと。Controller込みのテストはSeleniumをベースにした結合テストで十分な気がする。

FastCGI

22:54 |  FastCGI - dann@catalyst を含むブックマーク はてなブックマーク -  FastCGI - dann@catalyst  FastCGI - dann@catalyst のブックマークコメント

Lighty + FastCGIがいいのかなぁ。

http://googlewhacks.blogspot.com/2008/02/london-perl-workshop9catalyst-quick.html

Voxmod_perlだったような気もするんだけれど、実際は何で運用されているのが多いんだろうな。運用部分まで入ると、表面だけ調べたんじゃ全然わからないんだよなぁ。実際に運用している人に聞いてみたいなぁ。

ただ、lighttpd+FastCGIがお勧めってことになっても、lighttpd使ったことないから、移行すればすぐにハマリそうな気はする。。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080212

2008-02-11

自宅鯖管理者の憂鬱

23:34 |  自宅鯖管理者の憂鬱 - dann@catalyst を含むブックマーク はてなブックマーク -  自宅鯖管理者の憂鬱 - dann@catalyst  自宅鯖管理者の憂鬱 - dann@catalyst のブックマークコメント

自宅鯖->さくらインターネット->自宅鯖 と、結局自宅鯖に戻ってきた今日この頃。自宅鯖が煩いからレンタルに変えたのだけれど、何とか音が気にならない環境を確保できたので戻ってきた。Catalystで遊ぶには、さくらインターネットのレンタルだと殆ど遊べなかったので、これでぼちぼち楽しめそう。実際、電気代もサーバー1台あたり月1000円程度だから、レンタル鯖の制約の中でやるよりはよっぽどいい。

自宅鯖に戻ったこともあって、ルータを家庭用(BA8000Pro)をやめて、IX2015っていう小規模拠点用の業務用ルータにしてみた。自宅鯖@2chでは、ぼちぼち評判はいい。1日100万Hit程度は捌けるとか。設定は、殆どCatalyst互換のインターフェースでできる。これで少しくらいアクセスあったって、まぁ落ちないはず。といっても、今は落ちることを心配するようなアクセスはないんだけれど...

サーバーは、SC440を1台。一応、もう一台予備を買ったんだけれど、電気代がかかるからサーバーとしては使ってない。Xen環境作るために使おうかなと考え中。

Catalyst遊び用の環境のTODOとしては、

  • 固定IPの取得?(まぁ、無くてもいいんだけど)
    • Dynamic DNSで運用しているのだけれど、やっぱり固定IPを取ろうかなぁと。
  • Xenでの自動VMデプロイメント
    • 遊ぶサーバー作るために、環境作りたいなぁと。
  • NFSでマウントできるNASの購入(ReadyNASとか?)
    • なんかまだ結構高くて、買う気がしない。サーバー立てるのは電気代が高そうでやる気がしない。今年は一段と大容量HDDの価格が下がりそうだから、いいのがあったら買いたいんだけどなぁ。

なんだか、週末2-3時間はいつも環境構築しているような。。環境作りはそろそろ止めて、アプリケーション作りに戻ろうかな。

メンテナンス画面

23:35 |  メンテナンス画面 - dann@catalyst を含むブックマーク はてなブックマーク -  メンテナンス画面 - dann@catalyst  メンテナンス画面 - dann@catalyst のブックマークコメント

Rails風に、cap deploy:web:disableでメンテナンス画面、cap depoy:web:enableでアプリケーションの画面に切り替わるようにしてみた。dann-catastarterに組み込み済み。

後は

  • Deployしたものの取り消し機能(アプリケーションのRollback、Apacheのファイルの削除。enabledからシンボリックリンク削除程度でいいいかも。)
  • ステージングサーバーへのDeploy
  • railsのmigrate

段々、TODOが減ってきた。個人用とでは、Deployしたものを削除できるようになれば、十分実用で使えそうな気はする。

Catalystアプリのアジャイル公開

17:02 |  Catalystアプリのアジャイル公開 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystアプリのアジャイル公開 - dann@catalyst  Catalystアプリのアジャイル公開 - dann@catalyst のブックマークコメント

公開するまでは、最低限以下のステップが必要です。結構やること多いですね。10分で掲示板を作れても、公開しようとすると結構時間がかかります。

  • Catalystプロジェクト作成
  • Subversionレポジトリに取り込む
  • 不必要なファイルを削る
  • DBにユーザーとデータベースを作る
  • DBにテーブルを作る
  • ドメイン決定
  • アプリケーションサーバーの設定
  • リバースプロキシサーバーの設定
  • DBサーバーの設定
  • Capistranoでデプロイ

そこで、自動化してみることにしました。

  • Catalystプロジェクト作成(catgen.sh)
  • Subversionレポジトリに取り込む(catgen.sh)
  • 不必要なファイルを削る(catgen.sh)
  • SVKでミラー(catgen.sh)
  • DBにユーザーとデータベースを作る(cap deploy:setup)
  • DBにテーブルを作る
  • ドメイン決定
  • アプリケーションサーバーの設定(cap deploy:setup)
  • リバースプロキシサーバーの設定(cap deploy:setup)
  • DBサーバーの設定(cap deploy:setup)
  • Capistranoでデプロイ(cap deploy)

以下で、上記プロセスが殆ど自動化できるようになりました。

% catgen.sh プロジェクト名
% vim config/deploy.rb (ドメイン決定、DBのユーザーのパスワード決定)
% cap deploy:setup
% vim config/sql/schema.sql
% cap deploy:create_table 
% cap deploy

規約

規約は以下のように決めています。

  • Subversionレポジトリ
  • SVK
    • ミラー: //mirror/プロジェクト名
    • ローカル: //プロジェクト名
  • ドメイン名
    • subdomain.domain
  • ファイルの配置
    • /u/apps/<domain>/<subdomain>/プロジェクト名
  • mod_proxy_balancer
    • balancer名: プロジェクト名
  • DB
    • ユーザー名 : プロジェクト名のlowercase
    • DB名: プロジェクト名のlowercase

ダウンロード

上記自動deploymentスクリプトなどを含むcatastarterは、CodeReposに置いてあります。catgen.shは、先日のエントリに。

構成が、mod_proxy_balancer + mod_perlUbuntu(or Debian)でないと使えず、かなり環境に依存した構成になってますが、これでさくさく開発とDeployができるようになりました。

TODO

  • アプリケーションサーバーのportの自動割当
  • staging serverへのDeploy
  • catastarterから分離?
    • starterで無理にやってる感は否めないので、テンプレートを切り離そうかなと。

RangleRangle2011/12/27 22:45That's going to make things a lot eisaer from here on out.

dblujrfxgldblujrfxgl2011/12/28 19:08bHAl0W <a href="http://lenyutschvoc.com/">lenyutschvoc</a>

ajuwyiiayajuwyiiay2011/12/29 19:149kHh8q <a href="http://bmchbnzmmakk.com/">bmchbnzmmakk</a>

seateyjmbseateyjmb2011/12/29 23:27ebWJjE , [url=http://olhqyzchfash.com/]olhqyzchfash[/url], [link=http://gfwlkfwnypas.com/]gfwlkfwnypas[/link], http://rwrabchbieeo.com/

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080211

2008-02-10

Catalystアプリをsvkで管理

03:33 |  Catalystアプリをsvkで管理 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystアプリをsvkで管理 - dann@catalyst  Catalystアプリをsvkで管理 - dann@catalyst のブックマークコメント

subversionのレポジトリ作成、catstarterでアプリ生成、subversionレポジトリにコミット、svkでmirror、sync、localコピー作ってco。

catgen.sh

#!/bin/bash

CATALYST_CMD='/home/dann/devbin/dann-catstarter.pl'
CATALYST_APP_NAME=$1
SVN_REPO_PATH=/var/svn/repos/$CATALYST_APP_NAME
SVN_TARGET=http://localhost/svn/$CATALYST_APP_NAME

if [ -z $1 ]; then
    echo "You need to give a catalyst project name."
    return 1
fi

if [ -f $1 -o -d $1 ]; then
    echo "$1 exist in current directry.\nYou should change directry."
    return 1
fi

sudo svnadmin create --fs-type fsfs $SVN_REPO_PATH
sudo chown -R www-data:www-data $SVN_REPO_PATH

mkdir $1
cd $1
mkdir trunk tags branches
svn import . $SVN_TARGET -m "initial import"
cd ..
rm -rf $1

$CATALYST_CMD $CATALYST_APP_NAME -new
if [ $? -ne 0 ]; then
    echo "commad  catastarter failed."
    return 1
fi

svn import $CATALYST_APP_NAME $SVN_TARGET/trunk/ -m "import"
rm -rf $CATALYST_APP_NAME
svn co $SVN_TARGET/trunk $CATALYST_APP_NAME
cd $CATALYST_APP_NAME
svn remove logs/*
svn ci -m 'rm logfile'
svn up
svn propset svn:ignore "*.log" logs/
svn ci -m 'add ignore ./log/*.log'
svn up
svn propset svn:ignore "*" tmp/cache
svn ci -m "add ignore tmp/"
svn up
cd ../
rm -rf $CATALYST_APP_NAME
svk mirror $SVN_TARGET //mirror/$CATALYST_APP_NAME
svk sync //mirror/$CATALYST_APP_NAME
svk copy //mirror/$CATALYST_APP_NAME //$CATALYST_APP_NAME
svk co //$CATALYST_APP_NAME $CATALYST_APP_NAME

自分の環境だと、ネットワークにつながらない環境で開発することが殆どないので、localコピー作らなくてもいいかもな。svkじゃなくていいよいいよと言われているgitで遊んでみるのもいいかも。

以下のスクリプトも。

#!/bin/bash

CATALYST_APP_NAME=$1
SVN_TARGET=http://localhost/svn/$CATALYST_APP_NAME
if [ -z $1 ]; then
    echo "You need to give a catalyst project name."
    return 1
fi
svk mirror $SVN_TARGET //mirror/$CATALYST_APP_NAME
svk sync //mirror/$CATALYST_APP_NAME
svk  //mirror/$CATALYST_APP_NAME
svk copy //mirror/$CATALYST_APP_NAME //$CATALYST_APP_NAME
svk co //$CATALYST_APP_NAME $CATALYST_APP_NAME

MichadredyMichadredy2017/05/09 22:34Side Effects Of Amoxicillin In Dogs Vente De Viagra Pas Cher En Caen Priligy Precio En Farmacias Wellbutrin 150 Count Canada 30days <a href=http://byuvaigranonile.com>viagra</a> My Secure Tabs Pharmacy Vendo Viagra Iquique Accutane 40 Mg Online

KennicoriaKennicoria2017/06/13 12:19Prix Viagra 25 Milligrams <a href=http://cial40mg.com/cialis-on-line.php>Cialis On Line</a> Fluoxetine 60mg For Sale Medicine

KennicoriaKennicoria2017/06/14 18:33Kamagra With Food <a href=http://where-to-order-viagra.via100mg.com>Where To Order Viagra</a> Buy Online Viagra Where Cephalexin Vs Amoxicillin <a href=http://buy-levitra.buylevi.com>Buy Levitra</a> Zithromax Dosage Rxlist

YoldypeYoldype2018/01/26 19:59Zoloft Australia Vu <a href=http://cialibuy.com>cialis price</a> Celecoxib

EllroyatoEllroyato2018/04/24 11:14Cephalexin Dose For Dog <a href=http://cialicheap.com>cialis</a> Kamagra Spray

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080210

2008-02-03

CapistraでCatalstアプリ用のApacheのConfig生成

17:08 | CapistraでCatalstアプリ用のApacheのConfig生成 - dann@catalyst を含むブックマーク はてなブックマーク - CapistraでCatalstアプリ用のApacheのConfig生成 - dann@catalyst CapistraでCatalstアプリ用のApacheのConfig生成 - dann@catalyst のブックマークコメント

完全自動化まであとちょい。まだ、自動化するには結構やることあるなぁ。

  task :setup do
    create_apache_web_config
    create_apache_app_config
  end

  desc "Creates an Apache 2.2 compatible virtual host configuration file for web server"
  task :create_apache_web_config, :roles => :web do
    config_template = File.read(File.dirname(__FILE__) + "/templates/apache_web.erb");
    config = ERB.new(config_template).result(binding)
    put config, "/tmp/apache-web-#{subdomain}.#{domain}-#{application}.conf"
    sudo "mv /tmp/apache-web-#{subdomain}.#{domain}-#{application}.conf #{apache_web_config_dir}"
  end

  desc "Creates an Apache 2.2 compatible virtual host configuration file for application server"
  task :create_apache_app_config, :roles => :app do
    config_template = File.read(File.dirname(__FILE__) + "/templates/apache_web.erb");
    config = ERB.new(config_template).result(binding)
    put config, "/tmp/apache-app-#{subdomain}.#{domain}-#{application}.conf"
    sudo "mv /tmp/apache-app-#{subdomain}.#{domain}-#{application}.conf #{apache_app_config_dir}"
  end

config/templates/apache_app.erb

NameVirtualHost *:8080
<VirtualHost *:8080>
        ServerName <%= subdomain %>.<%= domain %>
        ServerAdmin webmaster@localhost

        DocumentRoot <%= deploy_to %>/root

        PerlModule <%= applivation %>
        PerlOptions +Parent
        PerlSwitches <%= deploy_to %>/current/lib
        <Location />
            SetHandler modperl
            PerlResponseHandler <%= application %>
        </Location>

        ErrorLog <%= deploy_to %>/current/logs/apache_app/error.log
        LogLevel warn
        CustomLog <%= deploy_to %>/current/logs/apache_app/access.log combined
        ServerSignature On
</VirtualHost>
NameVirtualHost *:80
<VirtualHost *:80>
        <IfModule proxy_module>
            # フロントのproxyが詰まらないようにする
            # ために、timeout時間を短くする
            ProxyTimeout 3
        </IfModule>

        ServerName <%= subdomain %>.<%= domain %>
        ServerAdmin webmaster@localhost

        DocumentRoot <%= deploy_to %>/current/root
        Alias /static <%= deploy_to %>/current/root/static

        ProxyRequests Off
        <Proxy *>
            Order deny,allow
            allow from all
        </Proxy>

        # App server
        <Proxy balancer://<%= application %>/>
            <% appserver_ips.each do |appserver_ip| %>
            BalancerMember http://<%= appserver_ip %>:8080 loadfactor=10 keepalive=On
            <% end %>
        </Proxy>

        ProxyPass /static/images !
        ProxyPass /static/js !
        ProxyPass /static/css !
        ProxyPass /favicon.ico !
        ProxyPass / balancer://<%= application %>/
        ProxyPassReverse / balancer://<%= application %>/
        # バックエンドでVirtualHostの場合に
        ProxyPreserveHost On

       <Location /static>
            SetHandler  default-handler

            # mod_filterでdeflate
            <IfModule filter_module>
                FilterDeclare deflate CONTENT_SET
                FilterProvider deflate DEFLATE Content-Type /text\x2F\w+|application\x2Fx-javascript/
                FilterChain deflate
            </IfModule>
            # mod_expiresでexpire
            <IfModule mod_expires.c>
                ExpiresActive On
                ExpiresDefault "access plus 1 year"
                ExpiresByType image/gif "access plus 1 week"
                ExpiresByType image/jpeg "access plus 1 week"
                ExpiresByType image/png "access plus 1 week"
                ExpiresByType application/x-shockwave-flash "access plus 1 week"
                ExpiresByType text/html "access plus 1 week"
                ExpiresByType text/css "access plus 1 week"
                ExpiresByType application/x-javascript "access plus 1 week"
            </IfModule>
       </Location>

       ErrorLog <%= deploy_to %>/current/logs/apache_web/error.log
       LogLevel warn
       CustomLog <%= deploy_to %>/current/logs/apache_web/access.log combined
       ServerSignature On
</VirtualHost>

やってみて思ったのは、Apacheの設定ファイルのおき場所とか、規約を決めておかないといけないなぁってこと。もうちょい改善の必要性はあり。

TODO

  • deploy:setupでやるのは変かも。Capistranoで何のnamespace使ってるのか調べること。
トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080203

2008-02-01

複数台構成へのスケールのためのXen

18:58 |  複数台構成へのスケールのためのXen - dann@catalyst を含むブックマーク はてなブックマーク -  複数台構成へのスケールのためのXen - dann@catalyst  複数台構成へのスケールのためのXen - dann@catalyst のブックマークコメント

OS一つで1台構成だと、複数台に移行するときに、設定も含めて書き換えが必要になってしまう。

  • Xenで構成して、Web、App、DBサーバー用の複数のVMをDeploy
  • サーバーが増やせるようになった場合
    • DBサーバー用のVMをライブマイグレーションで移動する
    • AppサーバーのVMは削除. Koanで新しいVM作成.
    • Deploy実行

なんてことをすればいいじゃないかと思った。

Xenがどれくらい使えるレベルのものなのか知らないけれど、物理的なサーバーを意識させないDeployment環境ってのが必要な気がする。自宅サーバーに必要かといわれると、微妙だけど。。。

アジャイルな環境作り

18:58 |  アジャイルな環境作り - dann@catalyst を含むブックマーク はてなブックマーク -  アジャイルな環境作り - dann@catalyst  アジャイルな環境作り - dann@catalyst のブックマークコメント

アジャイルな環境作り - そんなに急いでどこへ行く

http://blog.masuidrive.jp/index.php/2007/09/03/agile/

大体、やりたいことはこんな感じだなぁ。これのCatalyst版をやればいいんじゃないかと思ってる。

Catalystで10分でアプリを作るのは、catastarterとかがあればできちゃうけれど、実際にサービスとして公開するには結構ギャップがある。複数個のアプリをデプロイしようと思うと、これまたギャップがある。それを簡単にするための仕組みをつくろうかなと。

CapistranoでApacheのWebサーバーの設定ファイルを生成

17:42 |  CapistranoでApacheのWebサーバーの設定ファイルを生成 - dann@catalyst を含むブックマーク はてなブックマーク -  CapistranoでApacheのWebサーバーの設定ファイルを生成 - dann@catalyst  CapistranoでApacheのWebサーバーの設定ファイルを生成 - dann@catalyst のブックマークコメント

以下のようなタスクでApacheのファイルを生成するようにしてみた。

やっていることは、

  • ERBのテンプレートから設定ファイル読み込んで
  • テンプレートからApacheの設定ファイルを生成して
  • 設定ファイルをサーバーにアップロード

deploy.rbに以下の変数を設定

set :apache_web_config_dir, "/path/to/apache_config_dir"
set :appserver_ips, ["192.168.0.2", "192.168.0.3"]

タスクは以下のような感じ

  desc "Creates an Apache 2.2 compatible virtual host configuration file for web server"
  task :create_apache_web_config, :roles => :web do
    config_template = File.read(File.dirname(__FILE__) + "/templates/apache_web.erb");
    config = ERB.new(config_template).result(binding)
    put config, "/tmp/apache-web-#{subdomain}.#{domain}-#{application}.conf"
    sudo "mv /tmp/apache-web-#{subdomain}.#{domain}-#{application}.conf #{apache_web_config_dir}"
  end

config/template/apache_web.erbは以下のような感じ。

NameVirtualHost *:80
<VirtualHost *:80>
        <IfModule proxy_module>
            # フロントのproxyが詰まらないようにする
            # ために、timeout時間を短くする
            ProxyTimeout 3
        </IfModule>

        ServerName <%= subdomain %>.<%= domain %>
        ServerAdmin webmaster@localhost

        DocumentRoot <%= deploy_to %>/current/root
        Alias /static <%= deploy_to %>/current/root/static

        ProxyRequests Off
        <Proxy *>
            Order deny,allow
            allow from all
        </Proxy>

        # App server
        <Proxy balancer://<%= application %>/>
            <% appserver_ips.each do |appserver_ip| %>
            BalancerMember http://<%= appserver_ip %>:8080 loadfactor=10 keepalive=On
            <% end %>
        </Proxy>

        ProxyPass /static/images !
        ProxyPass /static/js !
        ProxyPass /static/css !
        ProxyPass /favicon.ico !
        ProxyPass / balancer://<%= application %>/
        ProxyPassReverse / balancer://<%= application %>/
        # バックエンドでVirtualHostの場合に
        ProxyPreserveHost On

       <Location /static>
            SetHandler  default-handler

            # mod_filterでdeflate
            <IfModule filter_module>
                FilterDeclare deflate CONTENT_SET
                FilterProvider deflate DEFLATE Content-Type /text\x2F\w+|application\x2Fx-javascript/
                FilterChain deflate
            </IfModule>
            # mod_expiresでexpire
            <IfModule mod_expires.c>
                ExpiresActive On
                ExpiresDefault "access plus 1 year"
                ExpiresByType image/gif "access plus 1 week"
                ExpiresByType image/jpeg "access plus 1 week"
                ExpiresByType image/png "access plus 1 week"
                ExpiresByType application/x-shockwave-flash "access plus 1 week"
                ExpiresByType text/html "access plus 1 week"
                ExpiresByType text/css "access plus 1 week"
                ExpiresByType application/x-javascript "access plus 1 week"
            </IfModule>
       </Location>

       ErrorLog <%= deploy_to %>/current/logs/apache_web/error.log
       LogLevel warn
       CustomLog <%= deploy_to %>/current/logs/apache_web/access.log combined
       ServerSignature On
</VirtualHost>

TODO

  • appserver_ipsと role :webの設定がダブっちゃっているのがいまいち...
  • 上記のタスクをどの段階で呼ぶのかの検討
    • setup, or after_update_code?
  • catastarterへの追加
    • もうちょっと構成を検討しおえたら。

大体、CapistranoとERBの使い方も大体わかったので、これからテンプレート追加していくのは簡単かなと。Capistranoでの構成とCatalystの構成にあわせて、オレオレ環境で一発Deployできるようにまでしていこうかなと。

Webサーバー、アプリケーションサーバー、DBサーバーの自動設定をしないといけないなと。実際にやろうとすると、まだまだやることありそうだなぁ。

WilliamidemaWilliamidema2019/02/02 09:56ist cialis rezeptpflichtig
cialis london delivery
<a href=https://kellyannehulme.com>Cheap cialis buy</a>
you tube cialis
cialis 20mg user reviews
https://kellyannehulme.com
cialis online america
what does cialis do for men
<a href=https://kellyannehulme.com>20 mg cialis</a>
cheap cialis online canadian pharmacy
cialis online bestellen mit rezept
https://greatwinesgrandhouses.com

ArnoldwalArnoldwal2019/02/05 18:01cialis over seas
cialis generika shop
<a href="http://xcialisxx.com">Buy Cialis Online</a>
walmart pharmacy cialis pills
is adcirca cheaper than cialis
<a href="http://xcialisxx.com">Buy Cialis Online</a>
cialis generico espana
order cialis online south africa
<a href="http://cialisfurr.com">Buy Cheap Cialis Online</a>

KelhitaKelhita2019/05/12 21:06Priligy Originale Vendita On Line <a href=http://drugsir.com>cheap cialis</a> Acheter Cialis Quebec Buy Levitra In Us Without Prescription Propecia Cost Buy

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080201