MTDDC Meetup TOKYO 2015 bit-part

  • View
    1.411

  • Download
    8

  • Category

    Internet

Preview:

Citation preview

リモートワークで加速する! Movable Type によるサイト構築

photo by Zengame https://www.flickr.com/photos/zengame/19947750606

bit part / BUN / h2ham

ABOUT US

mersy tinybeans

業務内容

photo by PRONana B Agyei https://www.flickr.com/photos/nanagyei/5641647904

! MovableType サイトの構築 ! プラグイン開発:MTAppjQuery など ! HTML・CSS・JavaScriptのコーディング業務 " ディレクション・プロジェクトマネジメント業務

などなど

capture http://www.bit-part.net/products/mtappjquery/

中でも得意分野

! MovableType 関連全般 ! プロジェクト進行管理

bit part の二人は苦手?

photo by ぱくたそ https://www.pakutaso.com/20150539128post-5482.html

MovableType構築 やディレクション周りは得意だが HTML・CSSのコーディングはやや不得意

photo by Nicola Barnett https://www.flickr.com/photos/n_corboy/4921290518

作業を分割し、 各分野の専門パートナーとともに仕事

bit partner

(́ ºムº `)

h2ham

photo by Aaron Landry https://www.flickr.com/photos/s4xton/2425718415

bit part の HTML・CSS・JavaScript の制作や 技術面の確認を含めたフロント側業務を主に担当

BUN

BUN

photo by Nicola Barnett https://www.flickr.com/photos/n_corboy/4921290518

Movable Type でのサイト構築担当

bit part チームの制作の流れ

hei_a

mersy

tinybeans

BUNh2ham

#

コーディング指示 MT構築指示

コーディングデータ

役割と流れ

#

hei_a

mersy

tinybeans

BUNh2ham

#

コーディング指示 MT構築指示

コーディングデータ

役割と流れ

#" Direction : bit part $ HTML / CSS : (́ ºムº `) & CodeDesign $ JavaScript : (́ ºムº `) & bit part Movable Type : BUN & bit part &

だがしかし!

photo by Kiks Balayon https://www.flickr.com/photos/kiksbalayon/2113369517

photo by @bloodysheep https://twitter.com/ponoyuku/status/362415739514273792

一人は 北海道

このへん

一人は 秋田

遠いな…

photo by Pulseman https://www.flickr.com/photos/pulseman/577082958

ええ、遠いです

リモートワーク!!

photo by デザイン日本地図のフリー画像 http://www.abysse.co.jp/japan/d-japanmap/map07-1.html

なぜリモートで作業ができるか

photo by ぱくたそ https://www.pakutaso.com/20151016292web-9.html

⇒ 分業による進行

分業? 実は今回の最大のポイント

% 分業が最善というわけではないが

分業できるようにしてあることが超重要

% 負荷分散、複数同時作業、リモートでも 問題なく進行可能

作業を依頼するだけ

photo by ぱくたそ https://www.pakutaso.com/20140927268post-4614.html

分業ができる体制 ↓

作業を効率的に回せる体制

大事なことなのでもう一度

分業できるようにしてあることが 超重要

分業のポイント

分業のポイント

! ドキュメント用意と整理 " 説明時間の省略と忘れた時やチェック時の確認に

! 仕様の明確化 " 作業者を迷わせない

! 曖昧仕様を先に解決しておいての実装 " 手戻り工数の削減

やりがちな問題

やりがちな問題

# 説明のないワイヤーやデザインで作業指示 # 感覚値「もっと大きく・いい感じに など」

もっと大きく?

$ tinybeans

画像を大きくしてください

もっと大きく?

$ tinybeans

なんか変わった?

もっと大きく?

$tinybeans

大きすぎない?

工数増

% 手戻り工数増:作業後の「やっぱりこうしてください」 % 確認工数増:動きは?リンク先は?レスポンシブ仕様は?

問題ない?

? 作業者が仕様を決めながらすすめるスタイル? ? 決めたり提案しながらすすめることが仕事?

確認による手戻り = コスト提案しながらすすめるのはコストが増える原因

コスト増

# 「実装時の適当にいいようにやってください」 " 感覚や求めていることは人により違う " 感覚値は実は地味に工数増 = 金額増

分業している作業者間での やり取りはできるだけ少なく

NGではない

! 感覚値がダメなわけではない ! しかしデザインでの確認・決めるほうが   実装中の確認・実装後のチェック参考にできる ' HTMLに直接変更を反映?   " 確認時の参考資料(デザインなど)と差分が発生

リモートでのプロジェクトは失敗が多い?

capture http://www.slideshare.net/takayukiito739/ss-55141697

そんなことになったことがない bit part チーム!

? ? ?

? ? ?

bit partner が失敗しないのは

! 仕事遂行の意識が共有できている " リモート = 自由な時間で仕事 ではあるが ゆっくりやってよいというわけではない " ディレクターが、いつまでにできるかの確認 と スケジュールまでに完了させる作業者の意識 " 無理のあるスケジュールになっていないか? 想像との乖離がないか要確認

リモートワークのための利用ツール

capture http://www.slideshare.net/takayukiito739/ss-55141697

Slack:連絡や質問、情報共有などは全てここ

案件ごとのチャンネル チーム内は Slack のみ

capture http://www.slideshare.net/takayukiito739/ss-55141697

Redmine:作業・確認チケット

ドキュメントをWikiに 作業はチケットに

capture http://www.slideshare.net/takayukiito739/ss-55141697

Redmine:作業・確認チケット

ドキュメントをWikiに 作業はチケットにその他様々なツールに対応可能

Skype / Backlog / Facebook / Basecamp など

各作業における連携のポイント

ディレクション

いかにスムーズにその後の作業が スムーズに行くかの最大のポイント

段取りと指示

! 段取りが良くないと作業もスムーズにいかない ! 指示のタイミングや量、仕方なども重要

! 不明な点は全て確認するようにする " 技術的に確認が必要な物は早めに共有したうえで、 そのまま対応するか調整提案するなどを検討する " 危険の芽は早めに摘む ! 期日をなるべく指定する " 確認も同様、いつまで回答もらえるのかなど

その他のポイント

! スコープ内容のタスクは全て洗い出してTodo化 " なるべくタスクの粒度は細かくする

! 専門的に決める部分は各担当に任せる " 例:マークアップの要素、MTの変数化など

! 情報は全て共有する ! ボール(確認事項やTodo)は持たないですぐ投げる ! わかりやすく伝える " 意図が伝わらないのはディレクターのバグ

その他のポイント

! なるべく自動化・スニペットの活用など ! 毎回使うようなドキュメントは共通の場所に " 各種ガイドラインなど

その他のポイント

作業者への説明はドキュメントや文章前提

ドキュメントや文章前提

! MTGなどは出来る限り減らす (必要な時以外はしない) ! ドキュメントやプロジェクト管理ツールの活用

説明時間の省略と忘れた時やチェック時の確認に

スケジュールの確認重要

スケジュールの確認

! いつからいつまでの作業か ! 作業者はスケジュールに問題がないか ! 優先度指定

進行管理

進行管理

! 気配り ! 段取り ! 確認は細々(しつこくということではなく)

テクニカルディレクション

テクニカルディレクション

! 希望されているスケジュールや技術と、 想定されるスケジュール・技術に 乖離がないかどうか ! ディレクターと共有して可否判断 ギリギリ・無理なスケジュールで組まない

静的HTML実装フロー

なぜ 静的HTMLを別途分けて制作を進めるか

HTML の制作を分離

! MTのテーマの実装しながらコーディングは すぐにプレビューできないため時間のロス ! どんな案件でも対応可 MT以外の案件でも分業でファイルを渡せる ! システム・CMSのセットアップや設定と 同時進行可能

HTML の工夫

! モジュール前提(システム化前提) 大きなHTML構造に依存しない = 疎結合 ! CSSで対応できるものはCSSで対応 :first-child や :nth-child の利用など ! システムやプラグインで、 決まったHTMLが出力される箇所は、 それに合わせてマークアップ & スタイル " 例:ページャー、wysiwyg

コーディング時に実践していること

capture https://git-scm.com/

Gitの利用(リビジョン管理ツールの利用)

capture http://gulpjs.com/

タスクランナーの活用

capture http://www.metalsmith.io/

静的 HTML ジェネレータの利用

capture http://www.browsersync.io/

サーバー設定を代替、準備時間の短縮

capture http://www.browsersync.io/

FTPアップ & 確認を前提にしない

静的 HTML はローカル確認前提 先祖返り・バッティング 工数増

Git のリモートリポジトリに pushすると、確認環境に自動で反映

Movable Type の実装フロー

大きく3つの流れ

大きく3つの流れ

! ウェブサイト / ブログの設定 ! 管理画面のカスタマイズ ! テンプレートのカスタマイズ

photo by PRONana B Agyei https://www.flickr.com/photos/nanagyei/5641647904

#</>#{css} #{JS}

$

管理画面のカスタマイズまでは、静的HTML実装フローと並行作業

! できることから先に進めて おけるのも、分業化の メリット ! カスタムフィールドなどの 構成を事前に把握でき、 テンプレート実装時点で 過不足に気づきやすい

1.ウェブサイト / ブログの設定

ウェブサイト / ブログの設定

$ ウェブサイト / ブログの作成 $ カスタムフィールドの追加 / 設定 $ 不要テンプレート / ウィジェットの削除 $ 空テンプレートの追加 $ テーマのエクスポート

" これ以降、入力作業と同時並行可能

設計書(カスタムフィールド)

* 写真 * basename * type * object * 写真のキャプション * basename * type * object * 写真の説明文 * basename * type * object

: image_file : 画像 : 記事

: image_caption : 1行テキスト : 記事

: image_description : 複数行テキスト : 記事

" テンプレート実装時 MT タグ名の参照が容易に

設計書(テンプレート)### インデックステンプレート * トップページ * path * identifier * 公開 ### アーカイブテンプレート * カテゴリ * type * mapping * identifier * 公開 * 記事詳細 * type * mapping * identifier * 公開

: index.html : index-top : スタティック

: カテゴリアーカイブ : /%c/index.html : archive-category : スタティック

: ブログ記事 : /%c/%b/index.html : archive-entry : スタティック

" あらかじめ識別子を 決めておくため、編集対象の ローカルファイルを探しやすい

2.管理画面のカスタマイズ

管理画面のカスタマイズ

$ ラベルの変更 $ 入力項目のソート $ 増減可能な表組みによる入力欄 ($.MTAppJSONTable) $ DataAPI を利用したファイルアップロード ($.MTAppMultiFileUpload) $ 異なるブログでの記事の関連付け ($.MTAppListing) " MTAppjQuery で必要に応じたカスタマイズ

MTAppjQuery 利用時のポイント

$ メインウェブサイトのインデックステンプレート化 " プラグインの user.js を上書きし、一元管理 $ 分岐用のブログ ID は config モジュールにセット " 本番 / 開発環境で ID が異なる場合も影響を受けない $ 複数人で作業する場合は、担当ごとにモジュール化 " 管理画面で直接更新する際、ロールバックを回避

3.テンプレートのカスタマイズ

テンプレートのカスタマイズ

<mt:Ignore>================================================== Template Name : トップページ Template Type : index / website Current Site : ウェブサイト名 Required Vars : Template Note : ==================================================</mt:Ignore> <mt:Include module="config" blog_id="1" />

<mt:Ignore>------------------------------- テンプレート固有の変数 -------------------------------</mt:Ignore>

<mt:Ignore>------------------------------- HTML ソースの出力 -------------------------------</mt:Ignore>

config モジュール

$ 変数の定義 " ウェブサイト / ブログ ID " サイトの共通変数(description / keywords など) " 置換のパターン $ SetVarTemplate の定義 " SNS ボタン / Pager などサイト共通のもの

メインウェブサイトに作成

config モジュール のサンプル

<mt:Ignore>== blogID ==</mt:Ignore> <mt:SetVars> blogid_website =1 blogid_topics =2 </mt:SetVars>

<mt:Ignore>== 共通変数 ==</mt:Ignore> <mt:SetVars> base_keywords = サイト共通のキーワード base_description = サイト共通の説明文 base_sitedomain = ドメイン base_sitename = サイト名 <mt:SetVars>

<mt:Ignore>== 置換のパターン ==</mt:Ignore> <mt:SetVarBlock name="compress_pattern">/http:\/\/<mt:WebsiteHost />/g</mt:SetVarBlock> <mt:SetVarBlock name="replace_blank"></mt:SetVarBlock> <mt:SetVarBlock name="replace_sitedomain">http://<mt:Var name="base_sitedomain" /></mt:SetVarBlock>

config モジュール(ブログ専用)

$ SetVarTemplate の定義 (一覧用モジュールなど、ブログ内で複数回利用するもの)

テンプレート固有の変数

<!-- meta 関連 --> <mt:SetVars> meta_title =<mt:Var name="base_sitename" /> meta_description =<mt:Var name="base_description" /> meta_keywords =<mt:Var name="base_keywords" /> </mt:SetVars>

<!-- head 要素に追加する CSS --> <mt:SetVarBlock name="html_head_css"></mt:SetVarBlock>

<!-- head 要素に追加する JS --> <mt:SetVarBlock name="html_head_script"></mt:SetVarBlock>

<!-- /body 直前に追加する JS --> <mt:SetVarBlock name="html_foot_script"></mt:SetVarBlock>

<!-- トピックパス --> <mt:SetVarBlock name="topic_path"></mt:SetVarBlock>

共通ヘッダなどのモジュールで上書きしたいものだけ定義

HTML ソースの出力

<mt:Unless name="compress" regex_replace="/^\s*\n/gm","" trim="1"> <mt:Unless name="compress" regex_replace="$compress_pattern","$replace_blank"> <!-- body 開始タグまで --> <mt:Include module="html_head" blog_id="$blogid_website" /> <!-- 共通ヘッダ --> <mt:Include module="header" blog_id="$blogid_website" />

(中略:テンプレートごとの処理)

<!-- 共通フッタ --> <mt:Include module="footer" blog_id="$blogid_website" /> <!-- body 終了タグ以降 --> <mt:Include module="html_foot" blog_id="$blogid_website" /> </mt:Unless> </mt:Unless>

サイト共通のヘッダ / フッタなどはモジュール化

共通モジュールの例(html_head)

<head> <meta charset=“UTF-8">

<!—- meta 関連 —-> <title><mt:Var name="meta_title" /></title> <meta name="description" content="<mt:Var name="meta_description" />"> <meta name="keywords" content="<mt:Var name="meta_keywords" />">

<link rel="stylesheet" href=“/common/css/style.css">

<!—- ページ単位で追加する CSS / Script —-> <mt:Var name="html_head_css" /> <mt:Var name="html_head_script" />

<body>

とあるウェブサイトのテーマ

├── templates/ │ ├── comment_listing.mtml │ ├── comment_preview.mtml │ ├── comment_response.mtml │ ├── dynamic_error.mtml │ ├── index-top.mtml // トップページ │ ├── index-user_css.mtml // MTAppjQuery の user.css │ ├── index-user_js.mtml // MTAppjQuery の user.js │ ├── module-config.mtml // サイト共通の config モジュール │ ├── module-footer.mtml // 共通フッタ │ ├── module-header.mtml // 共通ヘッダ │ ├── module-html_foot.mtml // 共通 HTML フッタ │ ├── module-html_head.mtml // 共通 HTML ヘッダ │ ├── popup_image.mtml │ └── search_results.mtml └── theme.yaml

増減はあっても最低構成はこの形 " Git で共有

あとは、テンプレートごとに出力用のタグを記述

静的HTML実装フローとの連携

実装フローの連携

! HTML のコーディング段階で テンプレート的にファイルを用意 $ 静的HTMLジェネレータの導入が MT テンプレート実装の効率化に繋がる " 共通部分のインクルード " 条件分岐 " ループ処理

静的 HTML ジェネレータの利用

capture http://www.metalsmith.io/

静的 HTML ジェネレータの利用

capture http://paularmstrong.github.io/swig/

静的 HTML ジェネレータの利用

とあるコンテンツのHTMLテンプレート

<body{% if page == 'top' %} class="page--top"{% endif %}> {% include 'header.html' %} <div class="layout-container"> {{ contents | safe }} </div> {% include 'footer.html' %} </body>

これを MTML に置き換えると

とあるコンテンツのMTMLテンプレート

<body<mt:Unless name="page_class"> class="<mt:Var name="page_class" />"</mt:Unless>> <mt:Include module="header.html" /> <div class="layout-container"> <mt:EntryBody /> <mt:EntryMore /> </div> <mt:Include module="footer.html" /> </body>

ページ単位の変化は diff ツールで確認

SublimeText のプラグインを利用し Kaleidoscope で開く FileDiffs Plugin Package Control でインストール後、2つの設定ファイルを修正

エディタと diff ツールの連携例

[ // SublimeFileDiffs { "keys": ["ctrl+shift+d"], "command": "file_diff_menu" } ]

{ // ksdiff (Kaleidoscope) "cmd": ["/usr/local/bin/ksdiff", "$file1", "$file2"] }

% Preferences > Key Bindings - User

% Preferences > Package Settings > FileDiffs > Settings - User

リモートワークをするためのまとめ

リモートワークをするためのまとめ

! 不明点は早めに確認 ! 分業できる体制用意・情報整理 ! 文字ベースのやりとりで、 いかに認識の違いをなくせるか ! 同時並行で作業できるよう、 タスクの粒度と優先順位が大事 ! 担当者に関わらず、品質を担保できる仕組み作り ! タスク単位で変更点を共有(Git)

- https://www.flickr.com/photos/zengame/19947750606 - https://www.pakutaso.com/20150539128post-5482.html - https://www.flickr.com/photos/n_corboy/4921290518 - https://www.flickr.com/photos/s4xton/2425718415 - https://www.flickr.com/photos/kiksbalayon/2113369517 - https://twitter.com/ponoyuku/status/362415739514273792 - https://www.flickr.com/photos/pulseman/577082958 - http://www.abysse.co.jp/japan/d-japanmap/map07-1.html - https://www.pakutaso.com/20151016292web-9.html - https://www.pakutaso.com/20140927268post-4614.html

Photo credit