SlideShare uma empresa Scribd logo
1 de 55
プラグイン作者脳に 
なろう 
{ 
実案件で学ぶプラグイン開発フロー 
@takeyuweb 
竹内雄一Yuichi Takeuchi 
MTDDC Meetup TOKYO 2014
• プログラマ向けの話をし 
ます。 
• プラグイン作成”入門”的 
な内容ではありません。 
• 実案件でプラグインを 
作ったときの作業フロー 
についてお話しします。 
このセッションについて
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 タケユー・ウェブ(2008~) 
 フリーWebエンジニア 
 Rails / MT / AngularJS / Linux / 
AWS etc… 
 MT東京 
 Ruby好き 
 Lancers認定ランサー 
 2014.4~さいたま市 
↑週3ぐらいでいます。 
竹内雄一@takeyuweb
 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通程度…非同期処理 
MTに落とし込む
 タイムアウトの危機 
 非同期処理 
 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 = $app- 
>model('permission')- 
>perms_from_registry; 
 MT::Permission::perms_from_regist 
ry 
 Permissionsレジストリに追加すれ 
ばいけそう 
 MT::Core::load_core_permissions 
MTユーザ&ロール
(ソースコードを表示) 
 プラグインインストール時に「メールマガジン会 
員」ロールをシステムに登録したい。 
 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ユーザ&ロール
(ソースコードを表示) 
 権限を設定した(ロールを割り当てた)ユーザ 
のメールアドレス一覧取得方法 
 ロール割り当てのDB構造 
 MT::CMS::User::grant_role 
 MT::Association->link 
 MT::Associationモデル 
 中間テーブル`mt_association`にブログとユーザ、 
ロールが設定されている 
MTユーザ&ロール
(試しに実行) 
 送信先ユーザ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ユーザ&ロール
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 知りたいこと 
 公開したときに処理を入れる「コールバック」 
 記事編集フォーム 
 一括編集 
 指定日時公開 
ブログ記事公開時に処理
(ソースコードを表示) 
 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 ); 
ブログ記事公開時に処理
 まとめ 
 記事保存時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/Common.pm 
 $param{theme_loop} = MT::Theme->load_theme_loop($type); 
 … 
 MTのテーマディレクトリ(`MT_DIR/themes`)に加えて、 
themesレジストリを参照することがわかった 
 config.yaml で追加できる 
テーマ機能
(ソースコードを表示) 
 取りだし 
 コメント完了時「コメント完了」システムテンプレートを処 
理 
 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 ); 
テンプレート処理
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 知りたいこと 
 MTのメール送信API 
 Multi-Partメール対応可能か 
MTのメール
 メール送信方法 
 管理者メールアドレスEmailAddressMain 
 MT::Mail->send( %head, $body ); 
 MT::Mail->send( %head, $body ); 
 Bodyはそのまま送信される 
 HTMLメールはMIME::Entity等で組み立てて渡せ 
ばOK 
 %head フィールド名をキーにした連想配列 
MTのメール
 MT上での実装方法を調査 
 MTユーザ&ロール 
 ブログ記事「公開」時に処理 
 テンプレート処理 
 MTのメール 
 非同期処理 
実装の目処を立てる
 知りたいこと 
 ジョブキュー 
 Amazon SQS / Resqueみたいなの 
 公開キューとかで使ってる 
 run-periodic-tasks 
非同期処理
(ソースコードを表示) 
 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 
非同期処理
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
https://github.com/takeyuweb/mt-plugin-MailMug 
ソースコード公開します
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
デモ
 自己紹介 
 プラグインについて 
 プラグイン作成の動機 
 要件を固める 
 目処を立てる 
 実装する 
 デモ 
 TODO(時間があれば) 
Agenda
 非公開サブルーチンを外から利用 
 MT::Hoge::_fuga みたいなの 
 モンキーパッチ 
バージョンアップで壊れるリスク 
追従するコスト 
やるべきでないこと
 なんちゃってロール実装なのでちゃんと権限をみるように修正 
 宛先インポート 
 content_actions でインポート機能追加 
 空メール送信で登録 
 /etc/aliases でパイプ 
 受け取りスクリプトを作成 
 AmazonSES等のメール配信サービス利用 
 メルマガ送信用のSMTP設定は? 
 無理なら別途メール送信コードを書く 
 拡張用コールバック 
 メールマガジン送信専用スクリプト 
 run-periodic-tasksを使用せず 
TODO
以上

Mais conteúdo relacionado

Mais procurados

Data API ことはじめ
Data API ことはじめData API ことはじめ
Data API ことはじめYuji Takayama
 
20141206 handson
20141206 handson20141206 handson
20141206 handsonSix Apart
 
第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介foom_in
 
MTAppjQueryでマニュアルいらずの管理画面を
MTAppjQueryでマニュアルいらずの管理画面をMTAppjQueryでマニュアルいらずの管理画面を
MTAppjQueryでマニュアルいらずの管理画面をbitpart
 
CSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズ
CSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズCSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズ
CSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズrie05
 
20141101 handson
20141101 handson20141101 handson
20141101 handsonSix Apart
 
20161115 okubo mt_cloud_handson
20161115 okubo mt_cloud_handson20161115 okubo mt_cloud_handson
20161115 okubo mt_cloud_handsonSix Apart
 
jQueryを中心としたJavaScript
jQueryを中心としたJavaScriptjQueryを中心としたJavaScript
jQueryを中心としたJavaScripthideaki honda
 
ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門muracchi
 
20141119 Movable Type HandsOn Seminar
20141119 Movable Type HandsOn Seminar20141119 Movable Type HandsOn Seminar
20141119 Movable Type HandsOn SeminarSix Apart
 
20140228 Movable Type Seminar
20140228 Movable Type Seminar20140228 Movable Type Seminar
20140228 Movable Type SeminarSix Apart
 
Blog=pelican+bit bucket+docker
Blog=pelican+bit bucket+dockerBlog=pelican+bit bucket+docker
Blog=pelican+bit bucket+dockerNobuaki Aoki
 
詳説 Movable type 7
詳説 Movable type 7詳説 Movable type 7
詳説 Movable type 7Yuji Takayama
 
20151207 shibuya handson
20151207 shibuya handson20151207 shibuya handson
20151207 shibuya handsonSix Apart
 
WordBench Saitama vol.6
WordBench Saitama vol.6WordBench Saitama vol.6
WordBench Saitama vol.6masaaki komori
 
20160927 okubo mt_cloud_handson
20160927 okubo mt_cloud_handson20160927 okubo mt_cloud_handson
20160927 okubo mt_cloud_handsonSix Apart
 
スキトラ Spring + mybatis
スキトラ Spring + mybatisスキトラ Spring + mybatis
スキトラ Spring + mybatis小川 昌吾
 
MyBatis を利用した web application 開発についてのご紹介
MyBatis を利用した web application 開発についてのご紹介  MyBatis を利用した web application 開発についてのご紹介
MyBatis を利用した web application 開発についてのご紹介 Tokuhiro Matsuno
 

Mais procurados (20)

Data API ことはじめ
Data API ことはじめData API ことはじめ
Data API ことはじめ
 
20141206 handson
20141206 handson20141206 handson
20141206 handson
 
第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介第3回WordPress Cafe プラグイン紹介
第3回WordPress Cafe プラグイン紹介
 
Learning jQuery
Learning jQueryLearning jQuery
Learning jQuery
 
MTAppjQueryでマニュアルいらずの管理画面を
MTAppjQueryでマニュアルいらずの管理画面をMTAppjQueryでマニュアルいらずの管理画面を
MTAppjQueryでマニュアルいらずの管理画面を
 
CSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズ
CSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズCSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズ
CSS Nite in OSAKA, Vol.32:デザイナーのためのWordPressカスタマイズ
 
20141101 handson
20141101 handson20141101 handson
20141101 handson
 
20161115 okubo mt_cloud_handson
20161115 okubo mt_cloud_handson20161115 okubo mt_cloud_handson
20161115 okubo mt_cloud_handson
 
jQueryを中心としたJavaScript
jQueryを中心としたJavaScriptjQueryを中心としたJavaScript
jQueryを中心としたJavaScript
 
ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門
 
20141119 Movable Type HandsOn Seminar
20141119 Movable Type HandsOn Seminar20141119 Movable Type HandsOn Seminar
20141119 Movable Type HandsOn Seminar
 
Mtddc Tokyo 2012
Mtddc Tokyo 2012Mtddc Tokyo 2012
Mtddc Tokyo 2012
 
20140228 Movable Type Seminar
20140228 Movable Type Seminar20140228 Movable Type Seminar
20140228 Movable Type Seminar
 
Blog=pelican+bit bucket+docker
Blog=pelican+bit bucket+dockerBlog=pelican+bit bucket+docker
Blog=pelican+bit bucket+docker
 
詳説 Movable type 7
詳説 Movable type 7詳説 Movable type 7
詳説 Movable type 7
 
20151207 shibuya handson
20151207 shibuya handson20151207 shibuya handson
20151207 shibuya handson
 
WordBench Saitama vol.6
WordBench Saitama vol.6WordBench Saitama vol.6
WordBench Saitama vol.6
 
20160927 okubo mt_cloud_handson
20160927 okubo mt_cloud_handson20160927 okubo mt_cloud_handson
20160927 okubo mt_cloud_handson
 
スキトラ Spring + mybatis
スキトラ Spring + mybatisスキトラ Spring + mybatis
スキトラ Spring + mybatis
 
MyBatis を利用した web application 開発についてのご紹介
MyBatis を利用した web application 開発についてのご紹介  MyBatis を利用した web application 開発についてのご紹介
MyBatis を利用した web application 開発についてのご紹介
 

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

HTTPとサーブレット
HTTPとサーブレットHTTPとサーブレット
HTTPとサーブレットTakashi Makino
 
Django 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppDjango 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppYikei Lu
 
Word Press on Movable Type
Word Press on Movable TypeWord Press on Movable Type
Word Press on Movable TypeHajime Fujimoto
 
脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_QueryHidekazu Ishikawa
 
[日本語・Japanese] Creative Technical Content for Better Developer Experience
[日本語・Japanese] Creative Technical Content for Better Developer Experience[日本語・Japanese] Creative Technical Content for Better Developer Experience
[日本語・Japanese] Creative Technical Content for Better Developer ExperienceTomomi Imura
 
広島IT勉強会カレンダー(仮)はRubyを使っています
広島IT勉強会カレンダー(仮)はRubyを使っています広島IT勉強会カレンダー(仮)はRubyを使っています
広島IT勉強会カレンダー(仮)はRubyを使っていますYoshitake Takata
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVCjz5 MATSUE
 
eZ Publish勉強会10月〜Wysiwygエディター〜
eZ Publish勉強会10月〜Wysiwygエディター〜eZ Publish勉強会10月〜Wysiwygエディター〜
eZ Publish勉強会10月〜Wysiwygエディター〜ericsagnes
 
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へDevelopers Summit
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
Yapc::Asia 2011 rejectConf Slide
Yapc::Asia 2011 rejectConf SlideYapc::Asia 2011 rejectConf Slide
Yapc::Asia 2011 rejectConf SlideSeiji Ohira
 
Ptengine の解析コードについてのご説明
Ptengine の解析コードについてのご説明Ptengine の解析コードについてのご説明
Ptengine の解析コードについてのご説明Ptmind_jp
 
Redmineを使ってみよう
Redmineを使ってみようRedmineを使ってみよう
Redmineを使ってみようmrgoofy33 .
 

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

HTTPとサーブレット
HTTPとサーブレットHTTPとサーブレット
HTTPとサーブレット
 
Django 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppDjango 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブApp
 
Word Press on Movable Type
Word Press on Movable TypeWord Press on Movable Type
Word Press on Movable Type
 
Inside Movable Type
Inside Movable TypeInside Movable Type
Inside Movable Type
 
脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query脱コピペ!デザイナーにもわかるPHPとWP_Query
脱コピペ!デザイナーにもわかるPHPとWP_Query
 
[日本語・Japanese] Creative Technical Content for Better Developer Experience
[日本語・Japanese] Creative Technical Content for Better Developer Experience[日本語・Japanese] Creative Technical Content for Better Developer Experience
[日本語・Japanese] Creative Technical Content for Better Developer Experience
 
20120118 titanium
20120118 titanium20120118 titanium
20120118 titanium
 
広島IT勉強会カレンダー(仮)はRubyを使っています
広島IT勉強会カレンダー(仮)はRubyを使っています広島IT勉強会カレンダー(仮)はRubyを使っています
広島IT勉強会カレンダー(仮)はRubyを使っています
 
はじめての ASP.NET MVC
はじめての ASP.NET MVCはじめての ASP.NET MVC
はじめての ASP.NET MVC
 
eZ Publish勉強会10月〜Wysiwygエディター〜
eZ Publish勉強会10月〜Wysiwygエディター〜eZ Publish勉強会10月〜Wysiwygエディター〜
eZ Publish勉強会10月〜Wysiwygエディター〜
 
Webteko 20090925
Webteko 20090925Webteko 20090925
Webteko 20090925
 
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
Yapc::Asia 2011 rejectConf Slide
Yapc::Asia 2011 rejectConf SlideYapc::Asia 2011 rejectConf Slide
Yapc::Asia 2011 rejectConf Slide
 
C++0x concept
C++0x conceptC++0x concept
C++0x concept
 
Botbird Business
Botbird BusinessBotbird Business
Botbird Business
 
WordPress と Bootstrap
WordPress と BootstrapWordPress と Bootstrap
WordPress と Bootstrap
 
Ptengine の解析コードについてのご説明
Ptengine の解析コードについてのご説明Ptengine の解析コードについてのご説明
Ptengine の解析コードについてのご説明
 
Redmineを使ってみよう
Redmineを使ってみようRedmineを使ってみよう
Redmineを使ってみよう
 

Mais de Takeuchi Yuichi

Rails受託会社を作っている話
Rails受託会社を作っている話Rails受託会社を作っている話
Rails受託会社を作っている話Takeuchi Yuichi
 
Web時代の完全リモート会社作り
Web時代の完全リモート会社作りWeb時代の完全リモート会社作り
Web時代の完全リモート会社作りTakeuchi Yuichi
 
素人のための機械学習
素人のための機械学習素人のための機械学習
素人のための機械学習Takeuchi Yuichi
 
最近やった決済システムの実装の話
最近やった決済システムの実装の話最近やった決済システムの実装の話
最近やった決済システムの実装の話Takeuchi Yuichi
 
使ってみたAssets系gemの紹介
使ってみたAssets系gemの紹介使ってみたAssets系gemの紹介
使ってみたAssets系gemの紹介Takeuchi Yuichi
 
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Takeuchi Yuichi
 
Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話
Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話
Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話Takeuchi Yuichi
 
アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方
アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方
アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方Takeuchi Yuichi
 

Mais de Takeuchi Yuichi (8)

Rails受託会社を作っている話
Rails受託会社を作っている話Rails受託会社を作っている話
Rails受託会社を作っている話
 
Web時代の完全リモート会社作り
Web時代の完全リモート会社作りWeb時代の完全リモート会社作り
Web時代の完全リモート会社作り
 
素人のための機械学習
素人のための機械学習素人のための機械学習
素人のための機械学習
 
最近やった決済システムの実装の話
最近やった決済システムの実装の話最近やった決済システムの実装の話
最近やった決済システムの実装の話
 
使ってみたAssets系gemの紹介
使ってみたAssets系gemの紹介使ってみたAssets系gemの紹介
使ってみたAssets系gemの紹介
 
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
Shinjuku.rb #29 ActiveJobでSQS使ったのとその永続化についての話
 
Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話
Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話
Shinjuku.rb #28 LT Rails Engineで変なことをやってみた話
 
アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方
アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方
アイテムのアップロード時にCGIMaxUploadを無視するプラグインの作り方
 

Último

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Último (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

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

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

Notas do Editor

  1. 自己紹介 プラグインについて プラグイン作成の動機 要件を固める 20分 ソースコードリーディング 20分 デモ5分