2016年 8月 25

Mojolicious::Plugin::LocaleTextDomainOO – I18N(GNU getext) for Mojolicious. – metacpan.org

きっかけ

Mojolicousで国際化するプラグインにはMojolicous::Plugin::I18Nというものがある。これは良く出来ていて、URLやドメイン名での振り分けが出来たりする。

国際化の部分はLocale::Maketextを使う。Locale::Maketext::Lexiconも使えばpoファイルなどもつかえる。

普通に使う分なら問題ないのだけど、GNU gettextのmsgctxttext domainのようなことは出来ない。

CPANをいろいろ漁ってみて、gettextコンバーチブルなモジュールでLocale::TextDomain::OOってのが自分の要件に合いそうなのでこちらをMojoliciousで使えるようにしてみた。

手順

Perl Moduleの作成にはMinillaを使った。MojoliciousプラグインをMinillaで開発する手順は別エントリーに書いた。

Minillaを使ってMojoliciousプラグインを開発する

PAUSEアカウントを取得

注意点は各エントリー等に書いてある通り。一番悩むのはA short description of why you would like a PAUSE ID:というPAUSEの申請理由でした。

長くかかる場合もあるみたいだけど、自分の場合はその日のうちに返信来ていました。

Minilla release

MinillaでCPANにアップロードする方法はCPAN に姉を公開した話とかを参考に。

モジュール開発で一番大変なのはドキュメントの作成。恐らく通じないであろう英語で書かなくてはならないのツラい。ま、コード載せておけば半分くらいつたわる、はず。

あと、cpanfile.snapshotの扱いをどうすればよいかが分からない。他のモジュール見て回ると一緒にパッケージングされていないので.gitignoreに書いておいたけど、この方法で良いか不明。

失敗談

Mojolicous::Plugin::I18N の機能はそのまま使いたかったのでパッケージに含めてアップロードしたらネームスペースの権限に引っかかってしまった。おれおれモジュールの場合には問題ない事(?)だったので注意したい。

おそらくはそれさえも平凡な日々: CPANで意図しない名前空間の取得を防ぐために

懸念点

Locale::TextDomain::OOは、Mooベースだし、結構依存が多い。Cartonでパッケージ管理しているなら特に問題ないのかな。

雑感

  • とにかくモジュール開発にはMinilla(やDist::Milla)が大変便利。
  • CPANに公開するとなるとそれなりにテストやドキュメントを整備しなくてはいけないので大変な反面、とても勉強になる。
  • いろいろ試行錯誤したけど、それも勉強になる。

と、どれをとっても勉強になるので是非挑戦して頂きたい。

Filed under: perl,プログラミング

Trackback Uri






2016年 8月 21

プラグインとしては Mojolicious::Plugin::Mount  がある。短いコードなの読むと参考になる。

Mojoliciouアプリを埋め込む


追記:Mojolicious::Commandsを使う方法があるらしい。こっちの方が正統?

$app->routes->any( '/sub' )->detour(
    app => Mojolicious::Commands->start_app('SubApp') 
);

Mojolicious::Liteのアプリをマウントする方法は日本語だと Mojolicious::Guides::Routing に書いてある。

この方法を使ってMojoliciousアプリ(Liteではない)を埋め込む場合は、下記コードのようにMojo::Serverを使えば出来る。

# SubApp が Mojolicous::Liteの場合
$app->routes->any('/sub')->detour(app => SubApp::app());

# SubApp が Mojoliciousの場合
my $sub_app = Mojo::Server->new->build_app('SubApp');
$app->routes->any('/sub')->detour(app => $sub_app);

MyAppにSubAppを埋め込むだけの簡単なコードだとこんな感じ。

package MyApp;
use Mojo::Base 'Mojolicious';

# Route
sub startup {
    my $self = shift;
    my $app = $self->app;

    # Main route
    $self->routes->get('/')->to('foo#hello');

    # SubApp route
    my $sub_app = Mojo::Server->new->build_app('SubApp');
    $app->routes->any('/sub')->detour(app => $sub_app);
}

# Controller
package MyApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller';

# Action
sub hello {
    my $self = shift;
    $self->render(text => 'Hello MyApp!');
}

# Sub App
package SubApp;
use Mojo::Base 'Mojolicious';

# Route
sub startup {
    my $self = shift;
    $self->routes->get('/')->to('foo#hello');
}

# Controller
package SubApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller';

# Action
sub hello {
    my $self = shift;
    $self->render(text => 'Hello SubApp!');
}


# /    -> Hello MyApp!
# /sub -> Hello SubApp!

アプリケーションプラグイン

上記コードを使えば、Mojoliciousアプリでも自身を含めた再利用可能なプラグイン アプリケーションプラグイン のような事も出来るはず。

package Mojolicious::Plugin::EmbeddedSubApp;
use Mojo::Base 'Mojolicious::Plugin';

sub register {
    my ($self, $app) = @_;

    # ルートを追加
    my $sub_app = Mojo::Server->new->build_app('SubApp');
    $app->routes->any('/sub')->detour(app => $sub_app);
}

# Sub App
package SubApp;
use Mojo::Base 'Mojolicious';

# Route
sub startup {
    my $self = shift;
    $self->routes->get('/')->to('foo#hello');
}

# Controller
package SubApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller';

# Action
sub hello {
    my $self = shift;
    $self->render(text => 'Hello SubApp!');
}

1;

アプリケーションでプラグインをロードする

package MyApp;
use Mojo::Base 'Mojolicious';

sub startup {
    my $self = shift;

    # プラグイン
    $self->plugin('EmbeddedSubApp');
}

1;

リンク

Filed under: perl

Trackback Uri






2016年 8月 16

1. Mojoliciousプラグインの雛形作成

$ mojo generate plugin MyPlugin

カレントディレクトリに Mojolicious-Plugin-MyPlugin というディレクトリ名で雛形作成される。

2. ドキュメントにAuthor情報を追記する。

minillaではPODに書かれているAuthorが使われる。作成された雛形(MyPlugin.pm)のPODにはAuthorの項目がないので追記する。

vi lib/Mojolicious/Plugin/MyPlugin.pm

...

=head1 AUTHOR

Lastname Firstname <name@domain.com>

=head1 SEE ALSO

....

3. Minilizeする

$ minil migrate

minillaで必要なファイルが作成される。

この時にMakefileが作成されるが、必要ないファイルなので削除する。

$ rm -f ./Makefile

※このファイルがあるとCPANにアップロードした時に

no_generated_files
Remove the offending files/directories!

とおこられるみたい。

4. commitする

$ git add -A
$ git commit -m'initial commit'

まずは全てをコミットしておく。開発準備完了。

5. バリバリ開発する

あとはもりもり開発をすすめる

Filed under: Mojolicious,perl

Trackback Uri






2016年 7月 4

YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa
2016/7/2 – 2016/7/3

選考方法が抽選でドキドキでしたが、無事(?)2日とも参加することが出来ました。

前夜

2日とも当選したので朝から参加しようと前泊。出発が思いのほか遅くなってしまい、品川周辺についたのが22:30まわっていたのでホテルの近場で軽く一杯飲んで帰るつもりが…常連さんと意気投合して3:00頃まで飲んでしまった…。青横ハイボールの常連さんありがとうございました。

初日

そんなこんなで初日から若干の遅刻。

聞いたトーク
  • MySQLと正規形のはなし
  • お前ら!!!!画面の中から出てこーーいい!!!!世の中は3次元だぞ!!!!!!!!!!!!!
  • 「全国タクシー」を支えるクラウドインフラ(AWSとAzureと、時々GCP)
  • Fluentdが新Plugin API実装においていかに自由すぎる旧APIとの互換性を確保したかの話
  • esa.io、その後の話
  • Lightning Talks 1日目 C room
懇親会

ジャスト100人の参加という事で「懇親会出るやつは信頼できる」名言頂きました。@hayajoさんとお話したり、ぼったくり(られ?)の話で盛り上がったり、半分くらい覚えてなかったり、幸せな時間を過ごしました。

3次会

@ytnobodさん、@ichigotakeさん遅くまでありがとうございました!内緒にしていましたが、実はあの後となりの中華屋で担々麺たべました。いや、食べたと思います。寝落ちしたらしく起きた時はお店片付け中だったので食べたかどうか記憶にありません…。

2日目

前日もやはり飲み過ぎて若干の遅刻。

聞いたトーク
  • あの日見たM-V-WhateverのModelを僕たちはまだ知らない
  • CPANの依存モジュールをもう少し正しく検出したい
  • HTTP/2でウェブサイトを高速化(実践編)
  • 突如見知らぬ言語に出会ってしまった俺達は
  • 開発フローケーススタディ
  • Lightning Talks 2日目 A room
懇親会(打ち上げ)

60名弱の参加で大盛況。やっぱり懇親会は楽しい。あと、新幹線の時間まで付き合って頂き感謝です。@ace_project++

さいごに

@uzullaさんをはじめスタッフの皆様、企画から準備、開催といろいろ大変だったと思いますが、本当に楽しいイベントありがとうございました!!#yapc8oji最高!!@__papix__くん来年がんばってください!

…あれ、飲んだ話しか書いてないや。

Filed under: 勉強会

Trackback Uri






2016年 5月 28

  • OSX El Capitan(10.11.5)
  • MAMPのバージョン 3.0.7.3 ※1
  • MySQLのバージョン 5.5.38

MAMPだとWarning (mostly harmless): No library found for -lmysqlclientのエラーでインストール出来ない。

mysql.hが存在しないため、別途インストールする必要があるようだ。

検索しているとC++ で MAMP の MySQL に接続する : あかぎメモ

まずこの記事の手順で、MySQL のヘッダファイルやライブラリを用意しておく。うまくいけば次のようなファイルができる。
/Applications/MAMP/Library/include/mysql/mysql.h
/Applications/MAMP/Library/lib/libmysqlclient.dylib

とある。このエントリーを参照してヘッダファイル等をインストールしてみる。

手順エントリー:Ruby on Rails 入門 (1日目) : あかぎメモ

$ brew install cmake
$ cd /tmp
$ curl -OL http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.29.tar.gz
$ tar zxvf mysql-5.5.38.tar.gz
$ cd mysql-5.5.38
$ cmake . \
    -DMYSQL_UNIX_ADDR=/Applications/MAMP/tmp/mysql/mysql.sock \
    -DCMAKE_INSTALL_PREFIX=/Applications/MAMP/Library
$ make -j 3
$ cp -v libmysql/*.dylib /Applications/MAMP/Library/lib
$ mkdir -p /Applications/MAMP/Library/include/mysql
$ cp -v include/*.h /Applications/MAMP/Library/include/mysql

.bash_profileの設定

インストール時に参照されるMySQL関連のパス等を.bash_profileに書いておく。

参考:

cpanmでDBD::mysqlを入れる – Qiita

DBD::mysql – Environment Variable

# export path for MAMP
export PATH="$PATH:/Applications/MAMP/Library/bin/"
export DBD_MYSQL_CFLAGS=-I/Applications/MAMP/Library/include/mysql
export DBD_MYSQL_LIBS="-L/Applications/MAMP/Library/bin/mysql -lmysqlclient"
export DBD_MYSQL_EMBEDDED=
export DBD_MYSQL_CONFIG=/Applications/MAMP/Library/bin/mysql_config
export DBD_MYSQL_NOCATCHSTDERR=0
export DBD_MYSQL_NOFOUNDROWS=0
export DBD_MYSQL_SSL=
export DBD_MYSQL_TESTDB=test
export DBD_MYSQL_TESTHOST=localhost
export DBD_MYSQL_TESTPORT=3306
export DBD_MYSQL_TESTUSER=root
export DBD_MYSQL_TESTPASSWORD=root

DBD::mysqlのインストール

cpanm DBD::mysqlcarton installでインストールできた。

※1 執筆時、MAMPの最新バージョンは3.7だったがMySQLのバージョンは5.5.38と同じものだった

Test::mysqld(Harriet)を使う場合

とりあえずcould not find mysql_install_dbというエラーが出るので、対処する。

上記手順を行うとmysql_install_db/Applications/MAMP/Library/scriptsにある。まずは実行権限を付ける。

$ chmod +x /Applications/MAMP/Library/scripts/mysql_install_db

PATHを通してもFATAL ERROR: Could not find ./bin/my_print_defaultsというエラーが出るのでシンボリックリンクを作る。

$ ln -s /Applications/MAMP/Library/scripts/mysql_install_db /Applications/MAMP/Library/bin/mysql_install_db

Filed under: perl,perlモジュール

Trackback Uri