ヘッドレスCMS = Watson Contents Hubを使ってみた～ 1.オーサリング編


当記事は以下の３本の連続記事の２本目です。
1. [ Watson Content Hub = クラウド上のヘッドレスCMS + Watson + CDN ](http://qiita.com/ishida330/items/3593b1cb772d7f3491f9)
2. [ヘッドレスCMS = Watson Contents Hubを使ってみた～ 1.オーサリング編](http://qiita.com/ishida330/items/156350b28b3657b5b413)
3. [ヘッドレスCMS = Watson Contents Hubを使ってみた～ 2.アプリ開発編](http://qiita.com/ishida330/items/7dff30995d48f56d6166)
- 執筆時点(2017/06)での情報です(WCHは機能追加がどんどん行われているので..)

# <i class="fa fa-play" style="font-size:1em;"></i>はじめに
当記事では左側のオーサリング環境をUIを中心にご紹介します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a42df7b0-48e1-f005-9b90-e73fc9ab9560.png)

# <i class="fa fa-commenting-o" style="font-size:1em;"></i>用語と概念
まずはWCHの用語や概念をご説明しますね。（この辺がわからないとハンズオンとかやっても、「で結局何だったんだっけ？」となってしまう恐れがあるので）

※Knowledge Centerでの該当箇所は「[概念](https://www.ibm.com/support/knowledgecenter/ja/SS3UMF/dch/admin/concepts_admin.html)」ですのでそちらも併読いただくとよろしいかと。

### コンテンツとアセットの違い
普通は「コンテンツ」というとWebページに記述する実際のイメージ画像ファイルであったり動画ファイルを意味すると思いますが、WCHでは「コンテンツ」とは「一連の物理ファイルやテキストを組み合わせた一定の構造」のことを意味します。ってもわけがわからんので具体的にお示ししますと、たとえば下記がWCHでの「**コンテンツ**」です。（WCHではコンテンツを構成する個々の物理ファイルは「**アセット**」と呼びます。つまりWCHの「コンテンツ」は複数の「アセット」から構成されます）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/416add81-b5d7-743e-b695-f6adfbe3552e.png)

上記のコンテンツ(正確には「コンテンツ・モデル」）の定義例では以下のような「構造」を定義しています。(なお下記の名前は任意であり、hogeでもなんでもいいです）
- 先頭に「Title」という名前のテキスト情報があるよ
- その次は「Summary」という名前のテキスト情報だよ
..
- 5番目に「Image」という名前でイメージ画像を配置するよ
- 6番目は「Publish Date」という名前で日付データを置くよ
- 最後は「Category」という名前でカテゴリーのデータを置くよ


今は、WCHではこういう「構造」のことを「コンテンツ」と呼ぶんだな、ファイルは「アセット」と呼ぶんだな、と思っておいてください。（「構造」というと難しければ「配置」「並び順」でもいいです。なぜ「構造」があるとうれしいか、はあとでご説明します。）

### 全体図 
次は用語や概念の全体図です（公式文書ではなく、筆者の理解です）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/007e3652-df1b-b542-2fde-f78eb3fe41a5.png)

まず大きくは**①コンテンツ・モデル**と**②コンテンツ・アイテム**（こっちを単に「コンテンツ」と呼ぶこともあります）の大きな区分けがあります。コンテンツ・モデルは「モデル」との呼称の通り、「雛形」「テンプレート」です。これらの「テンプレート」はコンテンツの構造や属性を定義するもので、再利用可能です。前述の「コンテンツ」の例は正確には「コンテンツ・タイプ」なのですが、「テンプレート」なので各要素の具体的なテキストの文言やイメージ画像のファイル名などは何も定義していません。WCHでは先に「テンプレート」としての「コンテンツ・タイプ」を作成してから、それをベースに実装としての「コンテンツ・アイテム」を作成します。実装である「コンテンツ・アイテム」では、テンプレートの各アセットにリポジトリーからテキストやイメージ画像・動画等のファイルを選択し、割り当てていきます。
:warning:個々のイメージ画像などのアセットは、コンテンツ・アイテムとは独立してリポジトリー内に格納されています。つまり「コンテンツ」とは「アセット」の構造（配置）を決めるテンプレートである、とも言えます。



### 個々の用語・概念の簡単なご説明
その他、用語・概念を簡単にまとめます

| 用語・概念 | 意味 |
| :---------------------------- |:--- |
| コンテンツ・タイプ | 様々なアセットの「構造」のテンプレート・雛形 |
| イメージ・プロファイル | イメージ画像に関する定義<br />同一の画像ファイルをベースにWeb用、モバイル用など様々なサイズの画像を生成できます |
| イメージ・レンディション | Web用、モバイル用など用途別の画像サイズ定義 |
| 分類法(Taxonomy) | あとでAPIでコンテンツやアセットを絞り込む際に使える分類・区分の定義。<br />(たとえば Fashion, Travel, Lifestyleなどのお好きな分類)<br />この分類をアセットやコンテンツに割り当てると、<br />「Fashionカテゴリーに属するイメージのみを下さい」など、<br />アプリケーションでの絞り込み(フィルタリング）が可能になります。<br />(利用は必須ではありません）|
| コンテンツ・アイテム | コンテンツ・タイプをベースに作られる実際のコンテンツ。<br />デリバリー環境へのパブリッシュはこの単位で行います。（個々のアセット毎ではありません)|
| アセット | コンテンツ・アイテムを構成する個々の物理ファイル（やテキスト）。<br />当然ですがアセットは複数のコンテンツ・アイテムで再利用可能です。|

### コンテンツの構造は何の役に立つのか？

少し先走りになりますが、コンテンツの構造を定義することの意味をご説明します。まずは「構造があることで、多様なデバイスやチャネル間でのサイトのプレゼンテーション表現を共通的に組み立てることができる」＝「統一された顧客体験を簡単に提供することができる」ことがあります。分かりやすく言えば「**１つのコンテンツからWebでもモバイルでも、同じロジックで同じUI表現を生成できると、作る方も楽だし、お客様から見ても美しいよね！**」ということです。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e66fc42d-8abc-379f-8b25-15453d532731.png)

ここで「UI表現を生成」と書きましたが、WCHの提供するAPIのレスポンスはコンテンツのメタデータをJSONで表現したものにすぎません。WCHを利用する側のアプリケーションは、この**JSONデータ構造をJQueryやAngular,Handlebarsなど任意のUIフレームワークやテンプレート・エンジンを使って解釈・パースし、UIを動的に生成する**のがWCHでの基本的な実装方法になります。

この点をもうすこし具体的にご説明しますね。たとえば下記のような構造を持つコンテンツ・タイプがあります。（商品説明とイメージ画像が２つ）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/cade3f55-ac6b-7428-e29d-ad1af22c3b78.png)

このコンテンツ・タイプの定義を元に具体的なコンテンツ・アイテムを作成してAPIで当該コンテンツの情報を要求すると、構造を含むメタデータのJSONレスポンスが戻りますので、それをJava ScriptでHTMLとして組み立てます。同じメタデータを使って（使うUIフレームワークは別かも知れませんが）モバイル・デバイス向けにHTMLを生成するのも容易ですよね。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/66eaab6a-23f4-c111-9af6-533911fd87f4.png)


# <i class="fa fa-user-circle-o" style="font-size:1em;"></i>やってみる
ってことで説明を読むのはウンザリしてきたかと思いますので、WCHでのオーサリングの入門編をやってみましょう。題材としては、シンプルな方がいいので上の図にある「ランニング」のコンテンツを定義します。

### オーサリングUIへのアクセス
まずは[Watson Contents Hubの製品ページ](https://www.ibm.com/jp-ja/marketplace/cloud-cms-solution)からトライアルに申し込んでください。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/94df100a-7998-60da-2c77-5a97a90bf139.png)

- IBMidを未取得の場合は同時に取得できます
- IBMidをお持ちの方はトライアルにサインアップすればいいだけですので、「Already have an IBMid?」の方をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5f7e1011-433d-0217-0876-29f2beffd231.png)

以降の手続きの詳細は割愛しますが、トライアルにサインアップできたら[このログイン画面](https://www.digitalexperience.ibm.com/landing/splashpage.html)で「Launch」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5d3a1825-78b5-6e13-7c58-502d11448656.png)

サインインしていなければ、先程取得したIBMidでサインインします。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b651432f-c38f-32b0-d885-2c1bde9f613f.png)

サインインが成功すると以下のトップ画面に遷移します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ea1d78de-9068-b34d-d2a5-82a201ab0c3d.png)

もし画面が英語になっている場合はブラウザーの言語設定を日本語にしてください。あと「ハブセットアップ」－「一般設定」で日本語を設定しておきましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/574023c5-e2ad-fd37-412c-1693923a868c.png)

ついでに**今だけ**「セキュリティ」タブで「クロス・オリジン・リソース共有のトラステッド・ドメインに「*(アスタリスク)」を追加して、すべてのクライアントからの要求を受け入れるようにしておきます。これをするとブラウザー上のJavaScriptから直接APIを叩くことができるようになります。（セキュリティ的には問題がありますので**本番ではきちんと自社ドメインのみ**登録しましょう）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4c86249f-7948-edb9-7391-ab65411fd2d3.png)

これで準備ができました。

\:warning: ご注意: 以下の手順では「Running」とか「Title」「Image01」などの名前をセットしていますが、これは**変更せずそのまま入力**してください。後続のプレゼンテーション編では今回の定義を使いますが、そのサンプルコードがこれらの名前を使っているためです。

### イメージ・プロファイルの定義
まずはイメージ・プロファイルです。イメージ・プロファイルはイメージ画像のサイズや表示範囲を定義するものです。個別の定義を「レディション」と呼びます。１つのイメージ・プロファイルにレンディションは複数定義できます。

左上のボタンでメニューを展開し「コンテンツ・モデル」－「イメージ・プロファイル」を選択。右上の「イメージ・プロファイルの作成」ボタンをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/61adbeda-0759-41e2-da06-65d3c79c5807.png)

まずは標準のイメージ・サイズを定義します。
①ラベルの名前として「Standard」をセット（名前は何でもいいのですが）
②幅 800 高さ 600をセット
③「レンディションの追加」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5374cf4a-b3c3-80c1-3d54-c8c501789c4c.png)

次は横長のバナーのイメージ・サイズを定義します。

①「Standard」という名前のレンディションが追加されますした
②ラベルの名前として「Banner」をセット
③幅 800 高さ **200**をセット
④「レンディションの追加」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7f8ef8fa-9882-d4ab-9989-4d9520c2dbaf.png)

最終的に以下のイメージ・プロファイルができましたので、右上の「閉じる」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5ea27595-b48e-a19f-1b05-14432ca2e297.png)

### コンテンツタイプの定義
次はテキスト１つとイメージ２つから成るコンテンツタイプの構造を定義します。

左上のボタンでメニューを展開し「コンテンツ・モデル」－「コンテンツ・タイプ」を選択。右上の「コンテンツ・タイプの作成」ボタンをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9ad48d9d-2d87-0147-9fe1-a1eeadb70e78.png)

まずはタイトルのテキスト欄です。

①コンテンツ・タイプの名前を「Running」にセット
②右側のパレットを（表示されていなければ）表示
③「テキスト」のアイコンをクリック
④パネルでラベル「Title」をセット（キーは自動的にセットされます）
⑤「適用」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7f2f06ac-99a4-13be-ffb3-baed4cdae244.png)

次は一つ目の画像です。
①パレットから「イメージ」のアイコンをクリック
②パネルでラベル「Image01」をセット（キーは自動的にセットされます）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5f1edb3c-5e7e-5262-d7cf-475d054c9d60.png)

①パネルを閉じず、「イメージ・プロファイル」タブ
②イメージ・プロファイルのリストボックスから直前に定義した「Running」を選択（結果、２つのレンディションが表示されます）
③「適用」ボタン

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/48bef96c-5c32-c964-46b5-9e912045fc53.png)
今とまったく同じ操作で2つ目のイメージ画像を定義します。（名前のみImage02にしてください）
結果、以下のような定義ができたら、右上の「閉じる」ボタン
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/86d86d3b-33f6-3137-0a08-348cea0aa76e.png)

### 分類法の定義
分類法（タクソノミー）も同様の手順で定義できますが、必須ではありませんので、ご説明をシンプルにするために割愛します。要は、ここでSports, Travel, Entertainmentなどお好きなカテゴリーを登録しておくと、あとでAPIを介したアセットのフィルタリングをしたい時に条件として使えるのです。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ed6a9a9b-3cef-18be-6770-8d6ea951655f.png)

### コンテンツの作成
ここまでで「テンプレート」としてのモデルの定義が終わりました。ではこのモデル定義から実際のコンテンツを定義しましょう。

①「コンテンツ」－「マイコンテンツおよびアセット」
②右上の「作成」で今作ったコンテンツ・モデル「Running」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0b94d843-5372-2fd5-e371-6b6556afa75d.png)

### テキストとイメージ画像の登録

①コンテンツの名前を「Running Item」とセット
② Titleとして「ランニングって最高！」とセット
③「イメージのドロップ」で「アップロード」を選択して、お手持ちのイメージを選択してアップロードしてください。（何でもいいです）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2bab5890-610a-b43d-3775-0d8fe70ce630.png)

① アップロードが完了すると以下のように画像が表示されます。
② イメージレンディション毎にイメージが生成されています。
③ イメージのタグを確認しましょう。通知の「要約の表示」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a29abd36-543e-64fb-8255-08f5310493b4.png)

なお、②で画像の抽出位置がずれていたり、もっと拡大したい、など調整したい場合はレンディションの鉛筆アイコンをクリックするとエディターが開くので調整できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2ba6f599-a40b-54c7-2483-9bf4e6d4b3cb.png)

Watsonが自動的にタグを付けているのが確認できますね。また私の場合は画像自体に元々メタデータが付いていたので、それもタグとして認識しています。いずれにせよ、必要なら手で追加できますし、不要・不適なものは削除できます。

次の記事で使いますので「タグの追加」からタグ「jogging」を追加しておいてください。（画像はジョギングのものでなくてもかまいません）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/63bf66e3-63d0-66c7-de9b-bc48c58f8aec.png)

まったく同じ手順で２つめのイメージも登録してください。（:warning:タグ「jogging」も追加しておいてください）

結果、以下のように定義できたら、右上の「準備完了」ボタン。この操作によりコンテンツが確定し、CDNへのパブリッシュが開始されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ad6b7ce4-a6cb-e759-beb2-1550b2e08d05.png)
※画面の都合で１ページを折り返して表示しています

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/480a0dc0-341a-d192-1b1b-1427813614a4.png)

#### ご参考) イメージ・ピッカー

今回は新規にイメージをアップロードしたので使いませんでしたが、イメージを再利用する場合は「検索」をクリックすると下記のように「イメージ・ピッカー」が起動します。使いたいイメージをクリックすればコンテンツに反映します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/56c9e9b9-4833-ef7d-20cb-a9962a35c0e2.png)

### ＣＤＮへのパブリッシュの確認
①ステータスが「ドラフト」から「準備完了」になります
②最下の「API情報」ボタンをおすとパネルが開きます
③「配信URL」の右のコピーボタンを押してURLをコピーします
④（ご参考までにJSONをそのままみることもできます）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4c0f356c-0fe4-b214-a85e-299e6fa886fa.png)

コピーしたURLをブラウザーのアドレス・バーに貼り付けてリロードします。結果、GETでREST APIが発行され、JSONレスポンスが戻ってくればパブリッシュは完了しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/768116ce-312d-0b20-f50e-9d157fba3ed0.png)

CDNへのパブリッシュはすぐ終わりますが、過去の経験では時間がかかることもありました。HTTPのRCが404(見つからない）の場合は、CDN側の伝搬が完了するまでしばらくお待ちください。( あまり時間がかかるようであれば、サポートやForumにて問い合わせるとよいかと思います）

ご参考までに、上記ブラウザーによる「配信URL」の呼び出しは下図の①の部分を叩いていることになります。「オーサリングURL」の呼び出しは②の部分になりますが、こちらは一旦認証を経ないとアクセスできませんので今は扱いません。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/9091e316-9370-f3fc-764a-6e9eec4e7c85.png)

以上、お疲れ様でした！
これでオーサリングが完了しましたので、次の記事では実際にAPIを呼び出すプレゼンテーション側のアプリケーションのほうをご紹介しようと思います。