Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
プラグイン作者脳に 
なろう 
{ 
実案件で学ぶプラグイン開発フロー 
@takeyuweb 
竹内雄一Yuichi Takeuchi 
MTDDC Meetup TOKYO 2014
• プログラマ向けの話をし 
ます。 
• プラグイン作成”入門”的 
な内容ではありません。 
• 実案件でプラグインを 
作ったときの作業フロー 
についてお話しします。 
このセッションについて
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 タケユー・ウェブ(2008~) 
 フリーWebエンジニア 
 Rails / MT / AngularJS / Linux / 
AWS etc… 
 MT東京 
 Ruby好き 
 Lancers認定ランサー 
 2014....
 MTプラグイン開発経験 
 たぶん60個ぐらい 
 業務(非公開) 
 趣味 
 KetaiPost (2010) 
 初プラグイン 
 携帯メール投稿 
 息子の成長記録 
竹内雄一@takeyuweb
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 できること、種類からみた分類 
 ある処理に別の処理を挟む「コールバック」 
 管理画面を変更「トランスフォーマー」 
 テンプレートタグ 
 バッチ処理 
 DataAPI拡張 
 MTフレームワーク独自アプリ 
などなど… ...
学習資料① 
 Movable Type 開発者向 
けガイド 
 GitHubにある 
 詳しい 
 基本的なことはここで 
写経してればOK
学習資料② 
 Movable Typeプラグイ 
ン開発入門 
 MT4の本だけどMT6で 
も基本は同じ 
 私も買いました。
学習資料③ 
 Movable Type 
Developer’s Guide 
Volume 1 
 MT4の本だけどMT6で 
も基本は同じ 
 私も買いました。
 ソースコード 
 MT本体 
 今でもよく読む、今日も読む 
 公開されている他のプラグイン 
学習資料④
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 実際のご依頼 
 「メールマガジンをMTでやりたい」 
 レンタルサーバで動かしたい 
 できればHTMLメールでやりたい 
 購読者は6000人ぐらいで月1配信 
「ではプラグイン作りましょう」 
プラグイン作成の動機
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 メールマガジンをMTでやりたい 
 配信先を管理 
 メールマガジンを管理 
 指定日時配信 
 HTMLメール 
 配信数は10000通程度 
要件を洗い出す
 メールマガジンをMTでやりたい 
 配信先を管理…MTユーザ&ロール 
 メールマガジンを管理 
 指定日時配信 
 HTMLメール 
 配信数は10000通程度 
MTに落とし込む
配信先を管理 
 MTのユーザを配信先 
に 
 メルマガ受信【権限】 
 【ロール】に権限設定 
 「メルマガ会員」 
ロール追加 
配信時点のメルマガ受信 
ユーザへ!
 メールマガジンをMTでやりたい 
 配信先を管理…MTユーザ&ロール 
 メールマガジンを管理…ブログ記事 
 指定日時配信…ブログ記事 
 HTMLメール 
 配信数は10000通程度 
MTに落とし込む
 ブログ記事 
=メールマガジン記事 
 記事からメール本文 
 公開時に配信 
メールマガジンを管理
指定日時配信 
 記事の公開日時指定 
 標準機能でいけそう
 メールマガジンをMTでやりたい 
 配信先を管理…MTユーザ&ロール 
 メールマガジンを管理…ブログ記事 
 指定日時配信…ブログ記事 
 HTMLメール…テンプレート処理&MTのメール 
 配信数は10000通程度 
MTに落...
HTMLメール 
 MTテンプレートで 
 <$MTEntryBody$> 
 本文作成用テンプレー 
トを追加 
 本文を構築 
 MTのメール送信機能 
 通知メールなどのやつ
 メールマガジンをMTでやりたい 
 配信先を管理…MTユーザ&ロール 
 メールマガジンを管理…ブログ記事 
 指定日時配信…ブログ記事 
 HTMLメール…テンプレート処理&MTのメール 
 配信数は10000通程度…非同期処理...
 タイムアウトの危機 
 非同期処理 
 Ex)公開キュー 
 配信先リスト作成 
 生SQL 
配信数は10000通程度
 メールマガジンをMTでやりたい 
 配信先を管理…MTユーザ&ロール 
 メールマガジンを管理…ブログ記事 
 指定日時配信…ブログ記事 
 HTMLメール…テンプレート処理&MTのメール 
 配信数は10000通程度…非同期処理...
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
目処を立てる
 知りたいこと 
 権限の追加方法 
 ロールの追加方法 
 メールアドレス一覧取得方法 
MTユーザ&ロール
(ソースコードを表示します) 
 権限の追加 
 tmpl/cms/edit_role.tmpl 
 <mt:loop 
name="loaded_permissions"> 
 MT::CMS::User 
 my $perms =...
(ソースコードを表示) 
 プラグインインストール時に「メールマガジン会 
員」ロールをシステムに登録したい。 
 http://www.sixapart.jp/movabletype/manual/object_r 
eference/a...
(ソースコードを表示) 
 権限を設定した(ロールを割り当てた)ユーザ 
のメールアドレス一覧取得方法 
 ロール割り当てのDB構造 
 MT::CMS::User::grant_role 
 MT::Association->link...
(試しに実行) 
 送信先ユーザIDの取得(SQL) 
 SELECT mt_association.author_id 
FROM mt_association 
WHERE blog_id=<blog_id> AND role_id=<...
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 知りたいこと 
 公開したときに処理を入れる「コールバック」 
 記事編集フォーム 
 一括編集 
 指定日時公開 
ブログ記事公開時に処理
(ソースコードを表示) 
 MT::CMS::core_methods を見れば`__mode`と実装コードの対応が 
わかる 
 save_entry 
 MT::CMS::Entry::save 
 $app->run_callba...
 まとめ 
 記事保存時cms_post_save.entry 
 一括編集cms_post_bulk_save.entry 
 指定日時公開scheduled_post_published 
コールバックでいけそう。 
ブログ記事公開...
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 テーマ機能 
 メルマガブログテーマ 
テンプレート処理 
 プラグインでテーマを追 
加する方法 
 システムテンプレートを 
テーマに含める方法 
 テンプレート処理 
 テンプレートの取りだし方 
 テンプレートとブログ記...
(ソースコードを表示) 
 プラグインによるテーマ追加 
 ブログ作成時のテーマ選択一覧 
 <select name="blog_theme“ 
 tmpl/cms/edit_blog.tmpl 
 theme_loopに入ってる ...
(ソースコードを表示) 
 取りだし 
 コメント完了時「コメント完了」システムテンプレートを処 
理 
 MT::App::CMS::post 
 my $tmpl = MT::Template->load( 
{ type => '...
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 知りたいこと 
 MTのメール送信API 
 Multi-Partメール対応可能か 
MTのメール
 メール送信方法 
 管理者メールアドレスEmailAddressMain 
 MT::Mail->send( %head, $body ); 
 MT::Mail->send( %head, $body ); 
 Bodyはそのまま...
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 知りたいこと 
 ジョブキュー 
 Amazon SQS / Resqueみたいなの 
 公開キューとかで使ってる 
 run-periodic-tasks 
非同期処理
(ソースコードを表示) 
 FUTURE() 
 MT::WeblogPublisher 
 my $job = TheSchwartz::Job->new(); 
 $job->funcname('MT::Worker::Publis...
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
https://github.com/takeyuweb/mt-plugin-MailMug 
ソースコード公開します
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
デモ
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 非公開サブルーチンを外から利用 
 MT::Hoge::_fuga みたいなの 
 モンキーパッチ 
バージョンアップで壊れるリスク 
追従するコスト 
やるべきでないこと
 なんちゃってロール実装なのでちゃんと権限をみるように修正 
 宛先インポート 
 content_actions でインポート機能追加 
 空メール送信で登録 
 /etc/aliases でパイプ 
 受け取りスクリプトを作成 ...
以上
Upcoming SlideShare
Loading in …5
×

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

1,768 views

Published on

MTDDC Meetup TOKYO 2014 発表資料。

実際の案件で開発したプラグインを題材に、私が「ある要件を満たすプラグインを作る」ために、
・どのように考え
・何を見て/読んで
・どうやって実装
したのかをソースコードも交えて私なりの視点で解説します。
本セッションの対象は、MTプラグイン開発をはじめた or はじめてみたい、プログラマの方で、本セッションが「何からはじめれば良いのか」の取っ掛かりのひとつなればと思います。

Published in: Technology
  • Be the first to comment

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

  1. 1. プラグイン作者脳に なろう { 実案件で学ぶプラグイン開発フロー @takeyuweb 竹内雄一Yuichi Takeuchi MTDDC Meetup TOKYO 2014
  2. 2. • プログラマ向けの話をし ます。 • プラグイン作成”入門”的 な内容ではありません。 • 実案件でプラグインを 作ったときの作業フロー についてお話しします。 このセッションについて
  3. 3.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  4. 4.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  5. 5.  タケユー・ウェブ(2008~)  フリーWebエンジニア  Rails / MT / AngularJS / Linux / AWS etc…  MT東京  Ruby好き  Lancers認定ランサー  2014.4~さいたま市 ↑週3ぐらいでいます。 竹内雄一@takeyuweb
  6. 6.  MTプラグイン開発経験  たぶん60個ぐらい  業務(非公開)  趣味  KetaiPost (2010)  初プラグイン  携帯メール投稿  息子の成長記録 竹内雄一@takeyuweb
  7. 7.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  8. 8.  できること、種類からみた分類  ある処理に別の処理を挟む「コールバック」  管理画面を変更「トランスフォーマー」  テンプレートタグ  バッチ処理  DataAPI拡張  MTフレームワーク独自アプリ などなど… 大抵のことはがんばればできます。 プラグインについて
  9. 9. 学習資料①  Movable Type 開発者向 けガイド  GitHubにある  詳しい  基本的なことはここで 写経してればOK
  10. 10. 学習資料②  Movable Typeプラグイ ン開発入門  MT4の本だけどMT6で も基本は同じ  私も買いました。
  11. 11. 学習資料③  Movable Type Developer’s Guide Volume 1  MT4の本だけどMT6で も基本は同じ  私も買いました。
  12. 12.  ソースコード  MT本体  今でもよく読む、今日も読む  公開されている他のプラグイン 学習資料④
  13. 13.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  14. 14.  実際のご依頼  「メールマガジンをMTでやりたい」  レンタルサーバで動かしたい  できればHTMLメールでやりたい  購読者は6000人ぐらいで月1配信 「ではプラグイン作りましょう」 プラグイン作成の動機
  15. 15.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  16. 16.  メールマガジンをMTでやりたい  配信先を管理  メールマガジンを管理  指定日時配信  HTMLメール  配信数は10000通程度 要件を洗い出す
  17. 17.  メールマガジンをMTでやりたい  配信先を管理…MTユーザ&ロール  メールマガジンを管理  指定日時配信  HTMLメール  配信数は10000通程度 MTに落とし込む
  18. 18. 配信先を管理  MTのユーザを配信先 に  メルマガ受信【権限】  【ロール】に権限設定  「メルマガ会員」 ロール追加 配信時点のメルマガ受信 ユーザへ!
  19. 19.  メールマガジンをMTでやりたい  配信先を管理…MTユーザ&ロール  メールマガジンを管理…ブログ記事  指定日時配信…ブログ記事  HTMLメール  配信数は10000通程度 MTに落とし込む
  20. 20.  ブログ記事 =メールマガジン記事  記事からメール本文  公開時に配信 メールマガジンを管理
  21. 21. 指定日時配信  記事の公開日時指定  標準機能でいけそう
  22. 22.  メールマガジンをMTでやりたい  配信先を管理…MTユーザ&ロール  メールマガジンを管理…ブログ記事  指定日時配信…ブログ記事  HTMLメール…テンプレート処理&MTのメール  配信数は10000通程度 MTに落とし込む
  23. 23. HTMLメール  MTテンプレートで  <$MTEntryBody$>  本文作成用テンプレー トを追加  本文を構築  MTのメール送信機能  通知メールなどのやつ
  24. 24.  メールマガジンをMTでやりたい  配信先を管理…MTユーザ&ロール  メールマガジンを管理…ブログ記事  指定日時配信…ブログ記事  HTMLメール…テンプレート処理&MTのメール  配信数は10000通程度…非同期処理 MTに落とし込む
  25. 25.  タイムアウトの危機  非同期処理  Ex)公開キュー  配信先リスト作成  生SQL 配信数は10000通程度
  26. 26.  メールマガジンをMTでやりたい  配信先を管理…MTユーザ&ロール  メールマガジンを管理…ブログ記事  指定日時配信…ブログ記事  HTMLメール…テンプレート処理&MTのメール  配信数は10000通程度…非同期処理 できるかな?
  27. 27.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  28. 28.  実装方法を調査  MTユーザ&ロール  ブログ記事「公開」時に処理  テンプレート処理  MTのメール  非同期処理 目処を立てる
  29. 29.  知りたいこと  権限の追加方法  ロールの追加方法  メールアドレス一覧取得方法 MTユーザ&ロール
  30. 30. (ソースコードを表示します)  権限の追加  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_regist ry  Permissionsレジストリに追加すれ ばいけそう  MT::Core::load_core_permissions MTユーザ&ロール
  31. 31. (ソースコードを表示)  プラグインインストール時に「メールマガジン会 員」ロールをシステムに登録したい。  http://www.sixapart.jp/movabletype/manual/object_r eference/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 を設定す る MTユーザ&ロール
  32. 32. (ソースコードを表示)  権限を設定した(ロールを割り当てた)ユーザ のメールアドレス一覧取得方法  ロール割り当てのDB構造  MT::CMS::User::grant_role  MT::Association->link  MT::Associationモデル  中間テーブル`mt_association`にブログとユーザ、 ロールが設定されている MTユーザ&ロール
  33. 33. (試しに実行)  送信先ユーザIDの取得(SQL)  SELECT mt_association.author_id FROM mt_association WHERE blog_id=<blog_id> AND role_id=<role_id>  送信先メールアドレスの取得(SQL)  select mt_author.author_email from mt_association INNER JOIN mt_author ON mt_author.author_id = mt_association.association_author_id WHERE association_blog_id=<blog_id> AND association_role_id=<role_id> MTユーザ&ロール
  34. 34.  MT上での実装方法を調査  MTユーザ&ロール  ブログ記事「公開」時に処理  テンプレート処理  MTのメール  非同期処理 実装の目処を立てる
  35. 35.  知りたいこと  公開したときに処理を入れる「コールバック」  記事編集フォーム  一括編集  指定日時公開 ブログ記事公開時に処理
  36. 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 ); ブログ記事公開時に処理
  37. 37.  まとめ  記事保存時cms_post_save.entry  一括編集cms_post_bulk_save.entry  指定日時公開scheduled_post_published コールバックでいけそう。 ブログ記事公開時に処理
  38. 38.  MT上での実装方法を調査  MTユーザ&ロール  ブログ記事「公開」時に処理  テンプレート処理  MTのメール  非同期処理 実装の目処を立てる
  39. 39.  テーマ機能  メルマガブログテーマ テンプレート処理  プラグインでテーマを追 加する方法  システムテンプレートを テーマに含める方法  テンプレート処理  テンプレートの取りだし方  テンプレートとブログ記事 から文字列を得る
  40. 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 で追加できる テーマ機能
  41. 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 ); テンプレート処理
  42. 42.  MT上での実装方法を調査  MTユーザ&ロール  ブログ記事「公開」時に処理  テンプレート処理  MTのメール  非同期処理 実装の目処を立てる
  43. 43.  知りたいこと  MTのメール送信API  Multi-Partメール対応可能か MTのメール
  44. 44.  メール送信方法  管理者メールアドレスEmailAddressMain  MT::Mail->send( %head, $body );  MT::Mail->send( %head, $body );  Bodyはそのまま送信される  HTMLメールはMIME::Entity等で組み立てて渡せ ばOK  %head フィールド名をキーにした連想配列 MTのメール
  45. 45.  MT上での実装方法を調査  MTユーザ&ロール  ブログ記事「公開」時に処理  テンプレート処理  MTのメール  非同期処理 実装の目処を立てる
  46. 46.  知りたいこと  ジョブキュー  Amazon SQS / Resqueみたいなの  公開キューとかで使ってる  run-periodic-tasks 非同期処理
  47. 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 非同期処理
  48. 48.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  49. 49. https://github.com/takeyuweb/mt-plugin-MailMug ソースコード公開します
  50. 50.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  51. 51. デモ
  52. 52.  自己紹介  プラグインについて  プラグイン作成の動機  要件を固める  目処を立てる  実装する  デモ  TODO(時間があれば) Agenda
  53. 53.  非公開サブルーチンを外から利用  MT::Hoge::_fuga みたいなの  モンキーパッチ バージョンアップで壊れるリスク 追従するコスト やるべきでないこと
  54. 54.  なんちゃってロール実装なのでちゃんと権限をみるように修正  宛先インポート  content_actions でインポート機能追加  空メール送信で登録  /etc/aliases でパイプ  受け取りスクリプトを作成  AmazonSES等のメール配信サービス利用  メルマガ送信用のSMTP設定は?  無理なら別途メール送信コードを書く  拡張用コールバック  メールマガジン送信専用スクリプト  run-periodic-tasksを使用せず TODO
  55. 55. 以上

×