# プロジェクトツールキットとベストプラクティス

引き続きチュートリアルをご利用いただきありがとうございます。ここからはデータプラントに注目です🚀。次に何をして、どこから手を付ければよいのでしょうか🤔。   

弊社には、ForePaaSプラットフォームの最初のユーザーとして、これまで何年にも渡ってデータプロジェクトを実践してきた豊富な経験があります。長年に渡るサービス実践を通じて得たノウハウをベストプラクティスにまとめて、ご提供できることを大変うれしく思います。 

---
## 重要なのはアジャイルであること
ForePaaSのデータプラントでは、チームを集めて同じデータプロジェクトにチームで協力して取り組むことができます。
基本的なファイルのアップロードから始めて、リアルタイムデータ処理にシームレスに切り替え、同じ手法を使用しながらプロジェクトの拡大に合わせて容易に拡張させることができます。 

ですから、開始からイテレーションを経て、少しずつ成長するプロジェクトに対し、そのニーズの高まりに対応できるデータプラントなのです。

---
## プロジェクトの主要なマイルストーン

一般的なデータプラントプロジェクトは次のフェーズで構成されます。
* ユースケースに関する簡単な[**チェックリスト**](/jp/getting-further/project-toolkit.md?id=checklist)
* [チームへのアクセス権](/jp/getting-further/project-toolkit.md?id=team-management)の付与
* 以下の反復的かつ必要に応じた実行：
  * ニーズに合わせて[データプラントのリソース](/jp/getting-further/project-toolkit.md?id=manage-resources)を調整
  * [データソース](/jp/getting-further/project-toolkit.md?id=collect-data)を定義
  * [データスキーマ](/jp/getting-further/project-toolkit.md?id=organize-data)を設計
  * [アクションとワークフローを作成してデータを物理的に処理](/jp/getting-further/project-toolkit.md?id=process-data)
  * [クエリ](/jp/getting-further/project-toolkit.md?id=write-queries)を作成しデータをチェックして表示
  * [データラボ](/jp/getting-further/project-toolkit.md?id=data-lab)とMachine Learning Managerを使用してAIモデルを設計
  * [アプリケーション](/jp/getting-further/project-toolkit.md?id=build-applications)とAPIを作成
  * [エンドユーザーにアクセス](/jp/getting-further/project-toolkit.md?id=manage-users)を提供
  * フィードバックの収集

---
## チェックリスト

!> [入門編ガイド](/jp/getting-started/index)を参照して、データプラントの主要なコンポーネントとForePaaSの概念について理解しておくことをお勧めします。

始める前に、以下にユースケースの範囲と内容についての基本的な確認点を示します。
* データソース
  * どのデータが必要ですか。
  * データは入手可能ですか、どのように入手可能ですか、データ履歴は入手可能ですか。
  * データベースのサイジング：データベースの規模と種類はどの程度になりそうですか。]
  * データの更新頻度はどのくらいですか。
* データブックの記述：
  * 「データストーリー」：データはどこから来ますか、どのように生成されましたか、データフロー履歴はありますか。
  * データフィールド：フィールドの意味と用途は何ですか。
  * （データに関する）詳細なビジネスルール
  * KPI：どのように計算しますか、その意味は何ですか。
* 作成されるもの
  * UXストーリーボード
  * 外部で使用するためのAPI
  * エクスポートするファイル
* リスクの検知と緩和
  * 何が問題になり得ますか、プロジェクト内の込み入った部分はどこですか。
  * 起こりうるボトルネックや障害を特定、予想します。
* 短いイテレーションの特定と活用
  * 可能な限り早くデータを表示しチェックします。
  * 早期にリリースし、頻繁にリリースします。

---
## チーム管理

データプラントを利用することで、チームとして1つのプロジェクトに取り組むことが容易になります。
それぞれのスキルと権限に応じて[チームにアクセス権を付与する方法](/jp/product/team-management/index)を確認してください。

---
## リソースの管理
**インフラモニタリング**コンポーネントでは、各コンポーネントのリソース（FPU）の再調整を行うことができます。 
[データプラントのセットアップ](/jp/product/infra-monitoring/index?id=forepaas-units-fpu)の詳細を確認し、必要に応じて調整を行います。

!> 変更内容によってはコンポーネントの再起動が必要になる場合があります。コンポーネントの再起動には数秒～数分かかります。
重要なワークフローやアクティビティが実行されていないことを確認してください。

---
## データの収集

[利用可能なコネクター](/jp/product/data-manager/collect/connectors/index)を確認し、インターフェースを介して利用できる機能がない場合はいつでも[カスタムアクション](/jp/product/dpe/actions/custom/index)を作成できることに留意します。

データプラントにファイルを送信する場合は、[データストア](/jp/product/data-manager/datastore/index)を使用することをお勧めします。
* データストアの`バケット`はニーズに応じて**トピック別**（参照など）、**処理のタイプ別**、または**プロバイダー別**に体系化します。
* `バケット`内では、**フォルダー**を使用してファイルを効果的に体系化できます。
* `ソース`を定義する際には、データストアコネクターで`バケット`を選択してからファイルをソースとして選択できます。
* 同じバケット／フォルダー内に複数のファイルがある場合：
  * 個々のファイルが異なる場合は、ファイルを別々に**分析**して`DPEアクション`の`ソース`として使用できます。
  * すべてのファイルを同じ方法で処理する必要がある場合は、**分析**するファイルを1つ選択し、これを`ソース`として使用し、セグメント化を行ってその他のすべてのファイルを処理します。
* 社内プロセスに統合するため、[APIを介してファイルをデータストアに送信する方法](/jp/technical/api-reference/datastore/index)を確認します。

---
## データの分析とブループリントの構成
`ソース`のセットアップが完了したら、[分析](/jp/product/data-manager/analyze/source-analysis)を行い、[ブループリント](/jp/product/data-manager/analyze/blueprint-rules)を構成します。これは次のようなよくある問題を修正するのに役立ちます。
* 日付の書式設定
* 数字の書式設定
* 文字列のクリーンアップ
* 不完全な行のスキップ
* その他多数

これは長い目で見ると、大きな時間の節約につながります。

---
## データの体系化

「[Organize（体系化）](/jp/product/data-manager/organize)」では、[データベーススキーマの準備を行います](/jp/getting-started/app-init/data-manager?id=create-your-schema-in-the-prim)。

次の点に留意してください。
* これは**分析**用であり、**操作**用ではありません。
  * 書き込みは少数、読み取りが多数
  * 非正規化を行うのが通常
* Query Builderは同じテーブル内のフィールドを検索します。
* [仮想属性](/jp/getting-started/app-init/data-manager?id=create-virtual-attributes)を適切に使用します。
* `ACL`または`動的パラメータ`に使用される属性はすべてのクエリ可能なテーブル内に存在している必要があります。

### テーブル

* データのタイプに応じて、次のようにプレフィックスを使用することを推奨します。
  * `ref_`：参照用の安定したデータ（一時的な情報は一切含まない）
  * `raw_`：最小限の変更で*現状のまま*インポートされたデータで、問題をトレースバックするのに使用可能
  * `prim_`：`raw_`を品質改善したデータ
  * `fct_`：複数の`prm_`と`ref_`を共通の`スケール`で統合
  * `agr_`：異なる`スケール`のデータの集約（例：`datetime -> date`）
    * 通常、これらはクエリを最適化するように作成
    * **スケールの細分化**の単位で1つの`agr_`テーブルを作成して必要なすべての属性を追加 
    * 細分化を示す属性名を追加（`agr_ticket_yearmonth`、`agr_movie_date`）
  * `tmp_`：処理に使用するための一時的なテーブル（**クエリ不可**とマーク）
  * `ml_`：機械学習モデル内で使用されるテーブル用
* いずれかのデータ行の内容を表す分かりやすい名前を付けます。
* 必要に応じて**オブジェクトのラベル**を使用します。
* ニーズに合わせて**インデックス**を定義します。

### 属性

以下に示すのは、属性（テーブル内のフィールド名）に関するベストプラクティスです。

* 属性のタイプ：`Dimension（ディメンション）`または`measure（メジャー）`を選択します。
  * `ディメンション`：スケールやフィルターなどの基準として使用できるが、積算できない定性的情報
  * `メジャー`：多くの場合に積算、集計、平均値を取ることなどが可能な数値情報
* 属性名：
  * 属性を区別するための*プレフィックス*を使用します（例：`client_`、`fb_`、`site_`）。
  * 次にように、`メジャー`属性に名前を付けて一時的なウィンドウにヒントが示されるようにします。
    * `_nb_`： その日の数
    * `_total_`：この日の値
    * `_diff_`：前の日との差
    * ...
  * 内容を分かりやすく示す（`_amount_`、`_ticket_`、`_fans_`など）
  * 自明でない場合は単位を示す（`_g`、`_kg`、`_wh`、`_kwh`、`_eur`、`_usd`など）

!> すべてのテーブルで**同じ属性名**を使用して**同じ情報を指定する**ことが非常に重要です。こうすることで、Query Builderでクエリを実行したときに、必要なフィールドに最も適合するオブジェクトが動的にチェックされます。 

---
## データの処理

[Data Processing Engine（DPE）](/jp/product/dpe/index)は、物理データフローの中心である`アクション`を作成するのに使用します。アクションは単独で実行することも、`ワークフロー`というグループにまとめることもできます。

### アクション

提供されている[アクションのタイプ](/jp/product/dpe/actions/index?id=actions-types)をよく確認します。
その他のアクションが必要な場合は、[DPE SDK](/jp/technical/sdk/dpe/index)を使用して[カスタムアクション](/jp/product/dpe/actions/custom/index)を作成してデータプラントとやり取りします。

> カスタムアクションを素早く試作するには、「[Data Lab（データラボ）](/jp/product/data-lab/index)」を使用します。

* 集計アクションの場合：
  * `スケール`：宛先テーブルの`主キー`と同じ細かさにします。
  * **テーブルを結合する際にはルールをダブルチェック**します。これはエラーの主要な要因です。
* ライフサイクルを通じて`ログレベル`を適切に設定します（必要な場合は`debug`、それ以外の場合は`info`）。
* `すべてを自動フラッシュ`を使用してQuery BuilderとAPIのキャッシュをフラッシュし、データセットに対するアクションにより更新された内容を表示します。


### リポジトリとフォルダーの使用

プロジェクトが大きくなるのに合わせて、ニーズに応じて[リポジトリとフォルダー](/jp/product/dpe/actions/index?id=overview)に`アクション`を整理できることを忘れないでください。

> `アクション`はアルファベット順に表示されます。数字などのプレフィックスを追加すると、アクションを適切に整理することができます。

### セグメント化の使用

ForePaaS DPEの機能をフルに活かすには、「[Segmentation（セグメント化）](/jp/product/dpe/actions/settings/segmentation)」を使用して`アクション`レベルで処理タスクを並列化します。

### 境界の使用

`アクション`や`ワークフロー`を一部のデータ（2019年のデータなど）に限定するには、「Perimeter（境界）」オプションを使用します。

---
## クエリの作成

### データセット

* **Prim**および**Mart**を使用してデータを素早く確認し、すべてのフィールドを含む「Advanced（詳細）」モードでサンプルクエリを取得します。
* 「**Dictionaries（ディクショナリ）**」を使用して**オブジェクトのラベル**を確認します。

### クエリ

次のようにして、フォルダーを使用して保存したクエリを整理します。
* Data Quality：データ品質を確認するためのクエリ
* Data Analysis：基本的な機能を表示するためのクエリ
* App-xxx：アプリケーション内で使用するようにクエリを準備します。
  * これにより、新しいアプリケーションバージョンをデプロイすることなくデータベーススキーマとクエリをアップデートできます。
  * クエリには明確で分かりやすい名前を付けます。
  
!> アプリケーションで使用するクエリを準備する場合、アプリケーションによってオンザフライで`アプリケーションの動的パラメータ`が追加されます。そのため、デプロイする前に保存したクエリからこれらを削除することが重要です。

### バージョンの使用

🚧 このセクションは準備中です。

---

## データプラント内のキャッシュ
次の複数のキャッシュレベルが存在します。
* Data Managerのキャッシュ：
  * PrimおよびMart内の各テーブルの`行数`を保持
* Query Builderのキャッシュ：
  * クエリ内の`属性`に従って要求する`オブジェクト`を保持
  * **スキーマの作成と保存**後に自動的にフラッシュ*
* APIのキャッシュ：
  * 特定の`クエリ`の`結果`を保持
  * 要求に応じて、DPEの`アクション`または`ワークフロー`からフラッシュ
  * **Query Builder**から手動でフラッシュ可能
* アプリケーションのキャッシュ：
  * 特定の`クエリ`の`結果`を保持
  * Webページをリロードしたときに自動的にフラッシュ

---
## データラボ

* データをチェックします。
* カスタムアクションを試作します。

---
## アプリケーションの開発

[App Manager](/jp/product/app-manager/index)と指定できる[設定](/jp/product/app-manager/settings/index)について確認します。

### 役に立つヒント

* プロジェクトを開始する前にストーリーボードをデザインします。
* 要求する対象のすべてのテーブルに`動的パラメータ`が存在することを確認します。
* 「**Organize（体系化）**」で**オブジェクトのラベル**を使用して自動的に翻訳を行います。
* [フォーマッタ](/jp/product/app-manager/formatter)と[翻訳](/jp/product/app-manager/translation)を活用します。
* [スタイルテンプレート](/jp/technical/sdk/app/charts/template)を活用してアプリケーション開発を効率化します。

一般的なアプリケーション開発ライフサイクルは、次のとおりです。
1. ストーリーボードの設計
  * データが利用可能であることをチェックします。
  * `動的パラメータ`を特定します。
  * 必要な*グラフ*と*カスタムコンポーネント*を特定します。
2. Query Builder：必要なクエリの準備とチェック
3. UIで最初のバージョンの実装
  * `動的パラメータ`をセットアップします。
  * `ダッシュボード`と`メニュー`をセットアップします。
  * 必要に応じて利用可能な`グラフ`をセットアップします。
  * `ディクショナリ`、`フォーマッタ`、`翻訳`をセットアップします。
4. 最初のバージョンの改善
  * 必要に応じてCSSを調整します。
  * [スタイルテンプレート](/jp/technical/sdk/app/charts/template)を活用します。
  * 必要に応じて独自の[カスタムグラフ](/jp/technical/sdk/app/custom-chart)または[カスタムコンポーネント](/jp/technical/sdk/app/custom-component)を実装します。
  * 必要に応じて[Web分析](/jp/getting-further/app-dev/monitor)を追加します。
5.テストと再度のイテレーション
6.アクセスできるユーザーの追加


### アプリケーションの高度なカスタマイズ

アプリケーションはReactJSフレームワークに基づいています。[アプリケーションのカスタマイズに関する発展的なガイド](/jp/getting-further/app-dev/index)を参照することを強くお勧めします。


### Gitリポジトリ

通常、[アプリケーションをGitリポジトリと同期し](/jp/product/app-manager/settings/git-integration)、次の2つのアプリケーションをデプロイすることをお勧めします。
* `my-develop`：**develop**ブランチと同期される
* `my-master`：**master**ブランチと同期される

### カスタムドメイン名

アプリケーションはデフォルトで、次のURLで利用できます。
```
https://my-dataplant.forepaas.io/my-develop-app/
```

このURLは、次のように、[アプリケーションの設定](/jp/product/app-manager/settings/index)で容易に変更できます。
```
https://my-beautiful-app.forepaas.io/
```
さらなるカスタマイズが必要な場合は、[独自のドメインを登録し、専用のSSL証明書を使用](/jp/product/app-manager/settings/custom-domain)することができます。
```
https://my-beautiful-app.example.com/
```

---
## API

カスタムAPIが必要なシナリオは次の通りです。
* トランスフォーマーの実装
* カスタム「進化」の実装
* 複雑なACLの実装

---
## ユーザーの管理

エンドユーザーのアクセス権は、[Identity Access Manager（IAM）](/jp/product/iam/index)で管理します。

### アプリケーション
**App Manager**で作成されるすべての`アプリケーション`に対し、これに対応するアプリケーションが**Identity Access Manager**内にデフォルトでそれぞれ存在しています。これは少し煩雑な仕組みとなりますが、次の2つの異なるアプリケーションのタイプが存在します。
* [App Manager](/jp/product/app-manager/overview) 
  * デプロイされ実行されるインスタンスを管理します。
  * `設定`で**Identity Access Managerのアプリケーション**にリンクされています。
  * **認証プロバイダー**や**ユーザー**などに関する**IAMアプリケーション**の構成を使用します。
* [Identity Access Manager](/jp/product/iam/application/index)では以下を定義できます。
  * ロゴ
  * アプリケーションタイトル
  * 許可された認証プロバイダー

### ユーザー

Identity Access Managerで、[ユーザー](/jp/product/iam/users/index)は1つの**認証プロバイダー**または**ディレクトリ**にリンクされます。異なる複数の**認証プロバイダー**に対して同じ**電子メール**を複数回登録できます。
ユーザーレベルでは、**APIキー**を生成し、以下を定義できます。
* ロール
* グループ
* ACL
* 権限

### 認証プロバイダー
[認証プロバイダー](/jp/product/iam/auth-provider/index)には、利用可能な認証方法が表示されます。
デフォルトで次の3つが利用できます。
* King：データプラント上でユーザーを認証
* ForePaaS：データプラントにローカルでユーザーを登録
* API key：APIキーを介してアクセス可能

> 企業独自の方式に対応した認証プロバイダーを追加することもできます。
**社内のSSO（シングルサインオン）を使用する場合は、この方法が適しています。

### 構成

主に、**ForePaaS認証プロバイダー**を使用してパスワードポリシーや電子メールテンプレートのカスタマイズを行う場合に、[構成](/jp/product/iam/settings/index)を参照します。

### グループ

**権限**と[ACL](/jp/product/iam/settings/acl)を管理する場合に**グループ**を参照します。
**ACL**では、そのグループ内のユーザーに関するすべてのクエリに対してフィルターを自動的に追加できます。

---
## データプラントのバックアップ

### データプラントの構成
[データプラントの構成のバックアップとリストア](/jp/product/dataplant/config)を行う方法を確認してください。

### データのエクスポート

DPEの`カスタムアクション`を使用すると、すべてのデータをデータストア内の`バケット`にエクスポートできます。

---
##  サポートが必要な場合🆘

> サポートの依頼が必要な場合は、いつでもプラットフォームの「*Support（サポート）*」タブから直接依頼を送信することができます。また、support@forepaas.com宛にメールを送付することもできます。

![Zendesk](picts/support-forepaas.png)

{サポートに質問を送付する🤔}(https://support.forepaas.com/hc/en-us/requests)