プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

55
{ プラグイン作者脳に なろう 案件で学ぶプラグイン開発 フロー @takeyuweb 竹内雄一 Yuichi Takeuchi MTDDC Meetup TOKYO 2014

Upload: takeuchi-yuichi

Post on 11-Jul-2015

895 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

{

プラグイン作者脳になろう

実案件で学ぶプラグイン開発フロー

@takeyuweb竹内雄一 Yuichi TakeuchiMTDDC Meetup TOKYO 2014

Page 2: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

このセッションについて

• プログラマ向けの話をします。

• プラグイン作成”入門”的な内容ではありません。

• 実案件でプラグインを作ったときの作業フローについてお話しします。

Page 3: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 4: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 5: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

竹内雄一 @takeyuweb

タケユー・ウェブ(2008~) フリーWebエンジニア

Rails / MT / AngularJS / Linux / AWS etc…

MT東京

Ruby好き

Lancers認定ランサー

2014.4~さいたま市

↑週3ぐらいでいます。

Page 6: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

竹内雄一 @takeyuweb

MTプラグイン開発経験

たぶん60個ぐらい

業務(非公開)

趣味

KetaiPost (2010)

初プラグイン

携帯メール投稿

息子の成長記録

Page 7: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 8: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

できること、種類からみた分類 ある処理に別の処理を挟む「コールバック」 管理画面を変更「トランスフォーマー」 テンプレートタグ バッチ処理 DataAPI拡張 MTフレームワーク独自アプリ

などなど…大抵のことはがんばればできます。

プラグインについて

Page 9: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

学習資料①

Movable Type 開発者向けガイド

GitHubにある

詳しい

基本的なことはここで写経してればOK

Page 10: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

学習資料②

Movable Typeプラグイン開発入門

MT4の本だけどMT6でも基本は同じ

私も買いました。

Page 11: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

学習資料③

Movable Type Developer’s Guide Volume 1

MT4の本だけどMT6でも基本は同じ

私も買いました。

Page 12: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

ソースコード

MT本体

今でもよく読む、今日も読む

公開されている他のプラグイン

学習資料④

Page 13: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 14: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

実際のご依頼

「メールマガジンをMTでやりたい」

レンタルサーバで動かしたい

できればHTMLメールでやりたい

購読者は6000人ぐらいで月1配信

「ではプラグイン作りましょう」

プラグイン作成の動機

Page 15: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 16: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンをMTでやりたい

配信先を管理

メールマガジンを管理

指定日時配信

HTMLメール

配信数は10000通程度

要件を洗い出す

Page 17: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンをMTでやりたい

配信先を管理…MTユーザ&ロール

メールマガジンを管理

指定日時配信

HTMLメール

配信数は10000通程度

MTに落とし込む

Page 18: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

配信先を管理

MTのユーザを配信先に メルマガ受信【権限】

【ロール】に権限設定

「メルマガ会員」ロール追加

配信時点のメルマガ受信ユーザへ!

Page 19: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンをMTでやりたい

配信先を管理…MTユーザ&ロール

メールマガジンを管理…ブログ記事

指定日時配信…ブログ記事

HTMLメール

配信数は10000通程度

MTに落とし込む

Page 20: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンを管理

ブログ記事=メールマガジン記事

記事からメール本文

公開時に配信

Page 21: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

指定日時配信

記事の公開日時指定

標準機能でいけそう

Page 22: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンをMTでやりたい

配信先を管理…MTユーザ&ロール

メールマガジンを管理…ブログ記事

指定日時配信…ブログ記事

HTMLメール…テンプレート処理&MTのメール

配信数は10000通程度

MTに落とし込む

Page 23: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

HTMLメール

MTテンプレートで

<$MTEntryBody$>

本文作成用テンプレートを追加

本文を構築

MTのメール送信機能

通知メールなどのやつ

Page 24: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンをMTでやりたい

配信先を管理…MTユーザ&ロール

メールマガジンを管理…ブログ記事

指定日時配信…ブログ記事

HTMLメール…テンプレート処理&MTのメール

配信数は10000通程度…非同期処理

MTに落とし込む

Page 25: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

配信数は10000通程度

タイムアウトの危機

非同期処理

Ex)公開キュー

配信先リスト作成

生SQL

Page 26: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メールマガジンをMTでやりたい

配信先を管理…MTユーザ&ロール

メールマガジンを管理…ブログ記事

指定日時配信…ブログ記事

HTMLメール…テンプレート処理&MTのメール

配信数は10000通程度…非同期処理

できるかな?

Page 27: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 28: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

実装方法を調査

MTユーザ&ロール

ブログ記事「公開」時に処理

テンプレート処理

MTのメール

非同期処理

目処を立てる

Page 29: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

知りたいこと

権限の追加方法

ロールの追加方法

メールアドレス一覧取得方法

MTユーザ&ロール

Page 30: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

MTユーザ&ロール

(ソースコードを表示します) 権限の追加

tmpl/cms/edit_role.tmpl <mt:loop

name="loaded_permissions">

MT::CMS::User my $perms = $app-

>model('permission')->perms_from_registry;

MT::Permission::perms_from_registry

Permissionsレジストリに追加すればいけそう

MT::Core::load_core_permissions

Page 31: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

MTユーザ&ロール

(ソースコードを表示)

プラグインインストール時に「メールマガジン会員」ロールをシステムに登録したい。

http://www.sixapart.jp/movabletype/manual/object_reference/archives/mt_plugin.html

upgrade_functionsを使うと明示している。できそう。 MT/Plugin.pm

upgrade_functions

MT/Upgrade.pm post_schema_upgrade

upgrade_functionsを追加してそこでやればよさそう upgrade_functionsの plugin にプラグインIDを設定する プラグイン新規インストール用… version_limitを設定

しない プラグインアップグレード用… version_limitを設定す

Page 32: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

(ソースコードを表示)

権限を設定した(ロールを割り当てた)ユーザのメールアドレス一覧取得方法 ロール割り当てのDB構造

MT::CMS::User::grant_role MT::Association->link

MT::Associationモデル 中間テーブル`mt_association`にブログとユーザ、ロールが設定されている

MTユーザ&ロール

Page 33: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

(試しに実行) 送信先ユーザIDの取得(SQL)

SELECT mt_association.author_idFROM mt_associationWHERE blog_id=<blog_id> AND role_id=<role_id>

送信先メールアドレスの取得(SQL) select mt_author.author_email

from mt_associationINNER JOIN mt_author ON mt_author.author_id =

mt_association.association_author_idWHERE association_blog_id=<blog_id> AND association_role_id=<role_id>

MTユーザ&ロール

Page 34: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

MT上での実装方法を調査

MTユーザ&ロール

ブログ記事「公開」時に処理

テンプレート処理

MTのメール

非同期処理

実装の目処を立てる

Page 35: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

知りたいこと

公開したときに処理を入れる「コールバック」

記事編集フォーム

一括編集

指定日時公開

ブログ記事公開時に処理

Page 36: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

(ソースコードを表示) MT::CMS::core_methodsを見れば`__mode`と実装コードの対応がわかる

save_entry MT::CMS::Entry::save $app->run_callbacks( 'cms_post_save.' . $type, $app, $obj, $orig_obj );

save_entries MT::CMS::Entry::save_entries $app->run_callbacks( 'cms_post_bulk_save.' . ( $type eq 'entry' ?

'entries' : 'pages' ), $app, \@objects );

MT::Core::load_core_tasks MT->instance->publisher->publish_future_posts

MT->run_callbacks( 'scheduled_post_published', $mt, $entry );

ブログ記事公開時に処理

Page 37: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

まとめ

記事保存時 cms_post_save.entry

一括編集 cms_post_bulk_save.entry

指定日時公開 scheduled_post_published

コールバックでいけそう。

ブログ記事公開時に処理

Page 38: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

MT上での実装方法を調査

MTユーザ&ロール

ブログ記事「公開」時に処理

テンプレート処理

MTのメール

非同期処理

実装の目処を立てる

Page 39: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

テンプレート処理

テーマ機能 メルマガブログテーマ

プラグインでテーマを追加する方法

システムテンプレートをテーマに含める方法

テンプレート処理 テンプレートの取りだし方

テンプレートとブログ記事から文字列を得る

Page 40: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

(ソースコードを表示) プラグインによるテーマ追加

ブログ作成時のテーマ選択一覧 <select name="blog_theme“

tmpl/cms/edit_blog.tmpl theme_loopに入ってる

MT/App/CMS/Common.pm $param{theme_loop} = MT::Theme->load_theme_loop($type); …

MTのテーマディレクトリ(`MT_DIR/themes`)に加えて、themesレジストリを参照することがわかった

config.yamlで追加できる

テーマ機能

Page 41: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

(ソースコードを表示) 取りだし

コメント完了時「コメント完了」システムテンプレートを処理

MT::App::CMS::post my $tmpl = MT::Template->load(

{ type => 'comment_response', blog_id => $entry->blog_id } );

文字列を得る my $ctx = MT::Template::Context->new;

$ctx->stash( 'comment', $comment ); MT::Template::Tags::Entry::_hdlr_entry_title my $html = $tmpl->build( $ctx, \%cond );

テンプレート処理

Page 42: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

MT上での実装方法を調査

MTユーザ&ロール

ブログ記事「公開」時に処理

テンプレート処理

MTのメール

非同期処理

実装の目処を立てる

Page 43: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

知りたいこと

MTのメール送信API

Multi-Partメール対応可能か

MTのメール

Page 44: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

メール送信方法

管理者メールアドレス EmailAddressMain

MT::Mail->send( \%head, $body );

MT::Mail->send( \%head, $body );

Bodyはそのまま送信される

HTMLメールはMIME::Entity等で組み立てて渡せばOK

%head フィールド名をキーにした連想配列

MTのメール

Page 45: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

MT上での実装方法を調査

MTユーザ&ロール

ブログ記事「公開」時に処理

テンプレート処理

MTのメール

非同期処理

実装の目処を立てる

Page 46: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

知りたいこと

ジョブキュー

Amazon SQS / Resqueみたいなの

公開キューとかで使ってる

run-periodic-tasks

非同期処理

Page 47: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

(ソースコードを表示) FUTURE() MT::WeblogPublisher

my $job = TheSchwartz::Job->new(); $job->funcname('MT::Worker::Publish'); MT::TheSchwartz->insert($job);

MT::Worker::Publish use base qw( TheSchwartz::Worker );

MT::Core task_workers

非同期処理

Page 48: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 49: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

ソースコード公開しますhttps://github.com/takeyuweb/mt-plugin-MailMug

Page 50: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 51: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

デモ

Page 52: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

自己紹介

プラグインについて

プラグイン作成の動機

要件を固める

目処を立てる

実装する

デモ

TODO(時間があれば)

Agenda

Page 53: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

非公開サブルーチンを外から利用

MT::Hoge::_fugaみたいなの

モンキーパッチ

バージョンアップで壊れるリスク

追従するコスト

やるべきでないこと

Page 54: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

なんちゃってロール実装なのでちゃんと権限をみるように修正 宛先インポート

content_actions でインポート機能追加

空メール送信で登録 /etc/aliases でパイプ 受け取りスクリプトを作成

AmazonSES等のメール配信サービス利用 メルマガ送信用のSMTP設定は? 無理なら別途メール送信コードを書く

拡張用コールバック メールマガジン送信専用スクリプト

run-periodic-tasksを使用せず

TODO

Page 55: プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~

以上