eYACO/GEMBA Noteは、今現在生じていることを手書き、テキスト、写真、音声、動画などで素早く記録することができるデジタルノートアプリである。また、複数の離れたメンバーと同じ図面や画像に手書きやテキストを書き込んだり、現場でレポートを共同で作成・更新するなど、チーム作業の支援や、さまざまな情報を一元管理して、「現場」での業務の生産性を向上することを目的とする。
単なるノートアプリではなく、目的に応じたビジネス帳票を柔軟に作成、蓄積された帳票から集計結果を導き出したりすることができるカスタマイズ性に富んだ「アプリケーション開発基盤」と見なすことができる。
アプリケーション開発フレームワークの主な役割は、開発の効率化と品質の向上である。通常、ソフトウェア開発のために事前準備されたコンポーネントやテンプレートを利用することで実現する。しかしながら、eYACHO/GEMBA Noteの開発環境は、独自技術およびユニークなカスタマイズ手法に基づくため、著名なフレームワークと比べてまだまだ一般的とは言い難い。
本ドキュメントは、eYACHO/GEMBA Noteの「フレームワーク化」を目指して、よく使われるフォーム部品の細かな設定、ノートの検索や集約を実行するアグリゲーション検索条件をパターン化してアプリ開発の仕様を記述しやすくする。そこで用いる記述方法の一部を利用して、生成AIへ与える要求文に用い、SQL式を自動的に作成することも試みる。
また、バイナリデータの取り扱い方、外部システムとのデータ連携について実装例を示しながら解説する。さらにはアプリケーションの設計から、試験、再公開の工程までを網羅して、GEMBAアプリ開発全般についての1つのモデルケースを提起する。
本書を利用してeYACHO/GEMBA Noteアプリを本格的に開発してみようというユーザーは、すでに初級編と位置づける「eYACHO/GEMBA Noteでアプリケーションを作る ~ はじめてのアプリ制作 ~」に沿ってアプリ開発の基本知識をマスターしていることを前提とする。したがって次の知識をすでに有していると仮定する。
リレーショナルデータベースシステムにおけるデータの操作や定義を行うための専用言語SQL(Structured Query Language)の知識、RESTサーバーを構築するスキルを持っていると、高度な機能をもつアプリケーションを実装方法の理解が早く進むと思われる。
本書は、全部で7章から構成される。それぞれの章の概要とその章で習得するポイントを説明する。
2章「アプリケーションの設計」
eYACHO/GEMBA Note上にアプリを開発するには、ページ上にフォーム部品を配置し、定義したタグスキーマと紐づけ、アグリゲーション検索条件を実装する。この一連の作業を確実に実行し、目標となる機能を実装し、その品質を保証するため、あらかじめアプリケーションを設計する。
3章「フォームの細かな設定」
eYACHO/GEMBA Noteでは、フォームやアイテムを構成するためのフォーム部品が揃っている。これらをノートや図形の上に配置して、定型的なフォームを作成する。ここでは部品の挙動をもっと豊かにする細かな設定について紹介する。
4章「アグリゲーションのパターン化」
アグリゲーションの実行処理と結果出力のパターンを分類し、設計の工程、仕様の記述方法や表現を詳しく解説する。その記述表現を生成AIに与えて、SQLを自動的に生成する要求文(プロンプト)の記述方法についてもふれる。
5章「バイナリデータの利用」
eYACHO/GEMBA Noteは、画像、PDF、動画、音声を取り扱うことができる。ここではそのようなバイナリデータを処理する手法についてサンプルを提示する。
6章「データの連携」
eYACHO/GEMBA Noteも単独ではなく他の製品やサービスの情報を必要とする場合がある。このような外部データ連携を必要とする場合、どのような形態でデータのやりとりが可能になるのかサンプルとともに解説する。ただし、外部システムとの認証については、本書ではふれない。
7章「アプリケーションの試験」
実装したアプリケーションが設計通りに動作するか、設定した品質に達しているか設計書から試験項目を抽出し、各項目をチェックできるようにする。
付録
各章で述べた内容への補足、具体的な例および参照するサイトなどを提示する。
各章の中で説明のために用いたフォーム、タグスキーマ、アグリゲーション検索条件は、以下に示すバックアップファイルの中に含まれる。読者が実際に定義と動作を確認するため、ダウンロードして、開発パッケージを復元することを想定している。その他に共有リスト、インポート用のCSVファイル、テストケース生成ツールPICTに与えるサンプルのテストケースファイルなども配置している。
バックアップファイル
| ファイル | 内容物の説明 | 開発パッケージ名 |
|---|---|---|
| PracticalAppDev__0.2.2__backup.gncproj | 本ドキュメントで用いるサンプルのバックアップファイル | アプリ開発実践編 |
| PropertyManagementFormEdition__0.2.0__backup.gncproj | 教則本アプリをフォーム形式にしたバックアップファイル | 不動産管理アプリ フォーム編 |
バックアップファイルから復元した開発パッケージの中のフォルダとノートを次のように提示する。サンプルを動作確認する場合、この表で示される所定のノートを開く。処理パターンと出力パターンについては4章で述べる。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| 復元した開発パッケージ名 | 対象となるフォルダ名 | 開くノート | アグリゲーション実行処理のパターン名 | アグリゲーション実行結果の出力パターン名 |
共有リスト
| ファイル | 内容物の説明 |
|---|---|
| propertyDetailList.csv | インポート用CSVファイル |
| propertyTypes_en.csv | 英語の選択メニューリソース |
| propertyTypes_jp.csv | 日本語の選択メニューリソース |
図面関連
| ファイル | 内容物の説明 |
|---|---|
| map_open.png | 図面ユニット用サンプル画像ファイル |
テスト関連
| ファイル | 内容物の説明 |
|---|---|
| testCase.txt | PICT用テストケースサンプル |
本書では、コード類の説明とコマンドの実行例を示すために数字、記号を使い分けている。それぞれの意味は以下の通りである。
コードの書式の例
SELECT *
FROM P_TABLE
WHERE name != '' -- コメントSQLのような式やコードを提示したときは、着目する箇所に – を付与し、その後ろにコメントを記入する。
コマンド実行の書式の例
> sqlite3 property_management.dbコマンドを実行するときは、Windowsコマンドプロンプトを用いて行う。コマンドの先頭に > シンボルを配置し、その後ろにコマンドを記述する。
本文中に記載されている会社名、製品名等は、各社の登録商標または商標である。本文中ではTM、(R)マーク等は明記していない。
本書は、eYACHOとGEMBA Noteの両方の製品におけるアプリケーション開発について述べるが、本章以降では、製品の呼称はGEMBA Noteのみとする。eYACHO/GEMBA Noteアプリケーションのことを「GENBA Noteアプリ」「GEMBAアプリ」あるいは単に「アプリ」と呼ぶ。
本ドキュメントに登場するよく使われる言葉や略語について説明する。
| 用語 | 説明 |
|---|---|
| GEMBAアプリ | eYACHOあるいはGEMBA Note上で開発したアプリケーション |
| REST API | 「Representational State Transfer」の略で、Web上のリソースに対してHTTPを用いて操作を行うAPIの設計スタイル |
| アプリ開発教則本(教則本) | GEMBAアプリ開発基礎編「eYACHO/GEMBA Noteでアプリケーションを作る ~ はじめてのアプリ制作 ~」を指す。 |
| アプリ開発実践本(実践本) | 本ドキュメントのことを指す。 |
| タグインスタンス | タグスキーマ定義から生成されたデータを指す。データベースシステムのレコードに相当する。 |
| タグスキーマ | 対象物を表現する入れ物。データベースシステムのテーブルに相当する。 |
| タグプロパティ | タグスキーマを構成する属性。データベースシステムのフィールドに相当する。 |
| ナビゲーションメニュー | eYACHO/GEMBA Note製品のトップバーメニュー |
| プロンプト | 生成AIに与える特定のタスクを指示するためのテキスト入力。本書では要求文とも呼ぶ。 |
| 物件 | アプリ開発教則本でテーマとした不動産物件 |
アプリケーション開発に関連するドキュメントは次の通りである。
この章では、GEMBA Note上でアプリケーション開発を始めるにあたって、準備段階での設計の作業と手順および設計する対象物とその定義の記述方法について述べる。
GEMBA Noteアプリの開発は、開発パッケージを準備し、そこにフォーム(帳票)、タグスキーマ、アグリゲーション検索条件を作成し、それらを細かく設定する作業になる。その手順を示したのが次の図である。
設計する箇所は図中の[3]から[7]の箇所になる。それらの作業を開始する前にまず要件のヒアリングから行う。
[1] 要件をヒアリングする
業務に適したGEMBA Noteアプリを実装するため、利用者から要望を聞き、アプリで何をどう解決していきたいかを詳細に把握する。
[2] 要件を定義する
ヒアリングした内容から業務要件、機能要件、非機能要件として明確化し、要件定義書を作成する。
[3] UIを設計する [3]
機能要件の一つである外部仕様として業務に適するユーザーインターフェースを定義する。
[4] タグスキーマを設計する [4] [5]
ユーザーインターフェースを構成するフォーム上に配置した各フォーム部品がどのタグプロパティに紐づくか関連付けする。
[5] アグリゲーションを設計する [6] [7]
アグリゲーションが処理する内容と制約を具体化する。
要件の定義はソフトウェアの開発にとって最も重要な工程の一つである。システムやアプリケーションで実現したい業務、機能、非機能等を「要件定義書」として記述する。要件は利用者しかわからないので、本来は利用者が作成すべきだが、慣例的に開発会社がヒアリングと確認を行いつつ作成することが一般的である。
企業ごとに要件定義の内容は異なるが、一般的には次のような構成になる。
屋外で利用するケースが多いGEMBA Noteアプリの特徴を鑑みると、次の内容が記述されていることが望ましい。
表2-2-1 目的と業務要件
| 項目 | 記述内容 |
|---|---|
| 目的 | 開発するアプリは、どの場所で、誰が、何の目的で利用するのか。その具体的なメリット。 |
| 業務要件 | 業務一覧、概要と流れ |
機能要件:機能一覧とその概要を記述する
表2-2-2 機能要件
| 項目 | 記述内容 |
|---|---|
| 外部仕様 | 帳票上に配置される要素(入力フィールド、出力フィールド、ボタン)と制約。帳票間の関係。 |
| 内部仕様 | アグリゲーションやボタンアクションが処理する内容。 外部データ連携の詳細(認可サーバーの有無や仕様概要など) |
非機能要件:
表2-2-3 非機能要件
| 項目 | 記述内容 |
|---|---|
| 可用性 | 利用時間帯、オンライン・オフラインでの利用、 利用場所(特に危険な現場や特殊環境で利用するときの要件)、 データ増加量、シェアの利用方法 |
| 性能 | アプリが達成する性能目標。例えば、ボタン押下後に、表示時間が1秒以内。 |
| セキュリティ | 管理者、標準ユーザー、社外ユーザーや部署ごとに利用する機能の区別 |
| 移行性 | あらかじめ外部からデータを取り込むときの方法と手段 |
| 保守性 | 開発パッケージの更新手順、更新した内容の動作確認手順 |
| 留意事項 | プロジェクトの制約(GEMBA Note製品本体とオプションのライセンス数、アプリ利用開始時期など) |
要件定義書に基づき、実現する帳票ごとに、入力フィールド、出力フィールド、ボタンのページ上での配置を明確にする。
ページに張り付けるタイプの「アイテム」としてユーザーインターフェースを設計する場合もあるので区別する。
GEMBA Noteのフォーム(帳票)は、ページ上に業務に必要な情報を記録していく。そのためのページの形式を定義する。
表2-3-1 フォーム体裁の記述
| 定義項目 | 記述内容 |
|---|---|
| フォーム名称 | フォームの名前を命名する |
| 種類 | 利用する用紙テンプレート(縦向き、横向き) |
| サイズ | 用紙のサイズ |
| 背景 | ページの背景色やイメージパターン、透明度を記述 |
| 縮尺 | (あれば)縮尺度と単位を指定する |
表2-3-2 フォーム体裁の例
| 定義項目 | 記述内容 |
|---|---|
| フォーム名称 | 物件フォーム |
| 種類 | 横向き |
| サイズ | はがき |
| 背景 | 薄緑 |
| 縮尺 | 設定なし |
ページ上に張り付けることができる共有化した部品をアイテムと呼ぶ。その形式を定義する。
表2-3-3 アイテム体裁の記述
| 定義項目 | 記述内容 |
|---|---|
| アイテム名称 | アイテムの名前を命名する |
| ベース | アイテムの基礎部分(一番下のレイヤーがあれば)を何で実現するか? 図形、画像など |
| 背景 | アイテムの背景色やイメージパターン、透明度を記述 |
| 寸法 | 縮尺度と単位を設定する |
表2-3-4 アイテム体裁の例
| 定義項目 | 記述内容 |
|---|---|
| フォーム名称 | 訪問者カード |
| ベース | 図形 |
| 背景 | 水色 |
| 縮尺 | 設定なし |
ページやアイテムに張り付けるフォーム部品(フィールド)を定義する。
表2-3-5 フォーム部品定義の記述
| 定義項目 | 記述内容 |
|---|---|
| 見出し | フォーム部品に与えられた(外部の)テキスト |
| プレースホルダ | 部品内部の仮に入力されているテキスト |
| フォーム部品 | フォーム部品の種別 |
| 詳細設定 | フォーム部品を初期状態から変更する設定内容 |
表2-3-6 フォーム部品定義の例
| 見出し | プレースホルダ | フォーム部品 | 詳細設定 |
|---|---|---|---|
| 名称 | 物件の名前を記入 | 1行テキスト | 初期設定のまま |
| 物件タイプ | 物件のタイプを選択 | 1行テキスト | アパート、一戸建て、土地、オフィス、その他、から選択 |
| 価格 | 価格を入力 | 数値 | 3桁区切り、円を付与 |
| 住所 | 住所を入力 | テキスト | 4行程度を記入できる |
各フォーム部品をページやアイテム上にどのように配置するかは、おおよそのイメージが伝わるように、実際にGEMBA Noteを使ってフォームやアイテムのプロトタイプを作成してイメージ可能にする。
フォーム上にボタンが配置してあれば、その名称やアクションの内容を記述する。
表2-3-7 ボタン定義の記述
| 定義項目 | 記述内容 |
|---|---|
| ラベル | ボタンのラベルテキスト |
| コマンド | ボタンを押下したときのアクション |
| アグリゲーション | 起動するアグリゲーション名、検索パラメータ、オプション |
| その他の設定 | コマンドに固有な設定項目 |
表2-3-8 ボタン定義の例
| ラベル | コマンド | アグリゲーション | その他の設定 |
|---|---|---|---|
| 最新に更新 | アグリゲーションの更新 | 動作は「最新に更新」 | 初期設定のまま |
| クリア | アグリゲーションの更新 | 動作は「結果をクリア」 | 初期設定のまま |
複数のページをもつアプリでは、ページ間でデータを転記したち、値を参照して計算・加工する場合がある。そのときにどの帳票のどのフィールドが、別の帳票のどのフィールドと関係しているか明確にする。
よく利用するページは用紙テンプレートとして、ノートはノートテンプレートとして再利用することができる。どのページおよびノートを再利用できるようにさせるか決める。
ノートテンプレートの定義
表2-3-9 ノートテンプレート定義の記述
| 定義項目 | 記述内容 |
|---|---|
| テンプレート名 | ノートテンプレートの名前を命名する |
| タイトルルール | 生成されるノートの名称規則を定義する |
| パスワード | あり/なし |
| ヘッダ | ヘッダに表示する項目 |
| フッタ | フッタに表示する項目 |
| カスタム設定 | 初期状態から変更設定を記述する |
| 表示倍率を図面幅で固定 | オン/オフ |
| シェアノートテンプレート | オン/オフ |
表2-3-10 ノートテンプレート定義の例
| 定義項目 | 記述内容 |
|---|---|
| テンプレート名 | 物件フォーム |
| タイトルルール | 物件フォーム 日時 ユーザー名 |
| パスワード | なし |
| ヘッダ | なし |
| フッタ | なし |
| カスタム設定 | 3-1-5で定義 |
| 表示倍率を図面幅で固定 | オフ |
| シェアノートテンプレート | オフ |
用紙テンプレートの定義
表2-3-11 用紙テンプレート定義の記述
| 定義項目 | 記述内容 |
|---|---|
| テンプレート名 | 用紙テンプレートの名前を命名する |
| フォーム名 | テンプレートとするフォームの名称(上記ページ体裁での名称) |
表2-3-12 用紙テンプレート定義の例
| 定義項目 | 記述内容 |
|---|---|
| テンプレート名 | 物件シート |
| フォーム名 | 物件フォーム |
GEMBA Noteの編集画面は初期設定では、全ての利用できるメニューやコマンドが表示されている。ある特定の帳票は、数多くのコマンドやメニューはユーザーにとって不要なものも存在する。そこで「UI定義ファイル」を作成して、画面上の各領域に何を配置するのか定義する。
表2-3-13 カスタムUI設定の記述
| 定義項目 | 記述内容 |
|---|---|
| 左メニュー | 左メニュー領域で利用するコマンド |
| 中央モード | 中央モード表示領域で利用するコマンド |
| 右メニュー | 右メニュー領域で利用するコマンド |
| ページタブ | ページタブ領域で利用するコマンド |
コマンドは、参考ドキュメントの「カスタムUI設定ガイド」に記載されている名称を記入する。
表2-3-14 カスタムUI設定の例
| 定義項目 | 記述内容 |
|---|---|
| 左メニュー | note_drive_menu_comb, add_menu |
| 中央モード | view_mode, select_mode |
| 右メニュー | sync_doc_right_now, undo, redo, undo_redo_comb |
| ページタブ | page_list_show_hide, gemba_page_mode, page_backw, page_forw |
GEMBA Noteでは、ページや図形と、その上に配置したフォーム部品の構造を定義するために「タグスキーマ」と呼ばれる属性(タグプロパティ)の集合体を用意している。構造を定義することによって情報の検索、集約、加工(計算)を行うことができる。
なお、ここで定義したタグスキーマとタグプロパティの構造は、4.4節にて述べる生成AIからSQL式の自動生成のプロンプトとして用いる。そのため、Markdownでの記述方法も示す。
タグスキーマは、データベースにおけるテーブルのようにデータを格納する入れ物である。GEMBA Noteでは開発パッケージ内において、ユニークなIDで定義をする必要がある。
表2-4-1 タグスキーマ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| タグID | タグスキーマのID |
| 日本語表示名 | その日本語表示名 |
| 設定箇所 | このタグスキーマを設定(配置)したUI(ページ、文字列、フォーム部品など) |
設定箇所 は、フォーム部品とタグプロパティをリンクづけするために必要とする。
表2-4-2 タグスキーマ定義の例:物件
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| Property | 物件 | ページ |
上記タグスキーマの表は、次のMarkdown記述をHTMLに変換したものである。
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Property | 物件 | ページ |タグスキーマを構成する要素がタグプロパティである。タグプロパティの定義を明確にする。
表2-4-3 タグプロパティ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| プロパティID | タグスキーマを構成するタグプロパティID |
| 日本語表示名 | タグプロパティの日本語表示名 |
| データの型 | 論理/数値/整数/文字列/日付/日時/参照のどれか |
表2-4-4 タグプロパティ定義の例
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
Markdown記述例:
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |フォーム部品に入力した値が対象タグスキーマのどのタグプロパティに割り当てられるのか関係を定義する。
表2-4-5 リンク定義の記述
| 定義項目 | 記述内容 |
|---|---|
| 見出し/プレースホルダ | 対象となるフォーム部品のタイトル、あるいはプレースホルダのテキスト |
| タグプロパティID | 上記にリンクするタグプロパティID |
表2-4-6 リンク定義の例
| 見出し/プレースホルダ | タグプロパティID |
|---|---|
| 名称 | Name |
| 物件タイプ | Type |
| 価格 | Price |
| 住所 | Address |
Markdown記述例:
| 見出し/プレースホルダ | タグプロパティID |
| --- | --- |
| 名称 | Name |
| 物件タイプ | Type |
| 価格 | Price |
| 住所 | Address |GEMBA Noteではタグスキーマにリンクしたフォーム入力データを「タグデータベース(タグDB)」として操作を行うことができる。それが「アグリゲーション」と呼ばれる集約機能である。ここではアグリゲーションを定義するときに必要な要素について表形式で表現する。
なお、ここでも定義したアグリゲーションの構造を、4.4節にて述べる生成AIからSQL式の自動生成のプロンプトとして用いる可能性があるため。Markdownでの記述例を一部だけ示す。
アグリゲーションの挙動を規定する構成要素を次の表にまとめる。
表2-5-1 アグリゲーション定義の記述
| 定義項目 | 記述内容 |
|---|---|
| 設定ID | 検索条件を識別するID |
| 日本語表記 | 日本語での表記 |
| 結果タグスキーマ | 実行の結果を表示する時に用いられるタグスキーマのID |
| 検索パラメータ | 検索条件内で使用する変数を定義する |
| コネクタ | 検索対象となるデータリソースを定義する |
| SQL | 何に対してどのように値を取得するか説明する。 4.4節「生成AIの利用」で説明する命令文を記入することを勧める。 |
表2-5-2 アグリゲーション定義の例
| 定義項目 | 記述内容 |
|---|---|
| 設定ID | propertyListWithType |
| 日本語表記 | タイプ別 物件一覧 |
| 結果タグスキーマ | Property(物件) |
| 検索パラメータ | TYPE |
| コネクタ | M-N節で定義する(別途、別に定義する) |
| SQL | {#物件タグスキーマ}の{#物件タグプロパティ}から全てのタグプロパティの値を取得するSQLiteのSQLを生成してください。 ただし、検索パラメータ{TYPE}は、物件タイプを意味する。この変数をつかって絞り込む。価格が高いものから順番に表示する |
Markdown記述例:
| 定義項目 | 記述内容 |
| --- | --- |
| 設定ID | propertyListWithType |
| 日本語表記 | タイプ別 物件一覧 |
| 結果タグスキーマ | Property(物件) |
| 検索パラメータ | TYPE |
| コネクタ | M-N節で定義する(別途、別に定義する) |
| SQL | {#物件タグスキーマ}の{#物件タグプロパティ}から全てのタグプロパティの値を取得するSQLiteのSQLを生成してください。<br>ただし、検索パラメータ{TYPE}は、物件タイプを意味する。この変数をつかって絞り込む。価格が高いものから順番に表示する |アグリゲーションの検索条件を定義するとき、外部からの変数的な値を参照して利用するためには検索パラメータを用いる。
表2-5-3 検索パラメータ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | パラメータを識別するID |
| 日本語表記 | 日本語での表記 |
| パラメータ型 | 論理/整数/数値/文字列/日付/日時のどれか |
| 初期値 | パラメータの型に応じて初期値を設定する |
| 選択肢 | パラメータの選択候補のリスト |
| UIタイプ | ダイアログでパラメータ値を編集するときのUIを指定するメニュー |
表2-5-4 検索パラメータ定義の例
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | TYPE |
| 日本語表記 | 物件タイプ |
| パラメータ型 | 文字列 |
| 初期値 | アパート |
| 選択肢 | なし |
| UIタイプ | 指定しない |
Markdown記述例:
| 定義項目 | 記述内容 |
| --- | --- |
| パラメータID | TYPE |
| 日本語表記 | 物件タイプ |
| パラメータ型 | 文字列 |
| 初期値 | アパート |
| 選択肢 | なし |
| UIタイプ | 指定しない |コネクタは、どこのデータリソースから検索するかを定義する。そのタイプごとに設定する項目は異なる。
表2-5-5 コネクタ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| 抽出テーブル名 | コネクタの結果を格納する抽出テーブル名を入力 |
| タイプ | NoteTagDB/LocalTagDB/ServerTagDB/Unit/REST/Salesforceのどれか |
| タグ検索条件 | 検索対象のタグスキーマID、検索条件を記述する |
| 検索対象のパス | LocalTagDB/ServerTagDBの場合、検索するフォルダを指定する |
| コネクタ固有の設定 | コネクタタイプに依存した条件、設定を記述する |
表2-5-6 コネクタ定義の例
| 定義項目 | 記述内容 |
|---|---|
| 抽出テーブル名 | P_TABLE |
| タイプ | LocalTagDB |
| タグ検索条件 | Propertyタグスキーマを検索する、その他条件はなし |
| 検索対象のパス | /context/ |
| コネクタ固有の設定 | 特になし |
アグリゲーションの実行は、どこから行うのか(ナビゲーションメニュー、ボタン、入力フィールド)、実行結果の表示を想定した図を準備する。
表2-5-7 実行処理の記述
| 定義項目 | 記述内容 |
|---|---|
| 見出し | (あれば)フォーム部品に割り振られたタイトル |
| 起動箇所 | アグリゲーションを実行する場所(ナビゲーションコマンド、フォーム部品の種別) |
| 実行内容 | コマンドやフォーム部品をクリック/タップしたときの実行内容 |
| 処理パターン | 集約、転記、計算を指定する。 4.1節「アグリゲーションの処理パターン」を参照 |
| 出力パターン | 表、フォーム、CSV、リスト、図面を指定する。 4.2節「アグリゲーションの出力パターン」を参照 |
表2-5-8 実行処理の記述例
| 見出し | 起動箇所 | 実行内容 | 処理パターン | 出力パターン |
|---|---|---|---|---|
| 物件タイプ | 1行テキスト | アパート、一戸建て、土地、オフィス、その他、から選択 | 集約 | リスト |
| 最新に更新 | ボタン | 選択した物件タイプで物件データを絞り込み、名前、物件タイプ、価格、住所を出力 | 集約 | 表 |
GEMBA Note上で開発したアプリを安定して運用するために、運用ルール、障害対応の方法などの情報をまとめておく。 基本的に、運用を設計するには、アプリケーションを、Who(誰が)・When(いつ)・Where(どこで)・How(どのように)使用するか、またどうすれば安定してサービスを提供できるかを設計する。これにGEMBA Note独自の運用方法や手順を考慮する。
表2-6-1 運用設計項目と記述例
| 設計項目 | 記述内容 | 記述例 |
|---|---|---|
| 想定するユーザー数 | ユーザーアカウントの数 | 社内ユーザー:200 社外ユーザー:10 システム管理者:2 パッケージ開発者:3 |
| 利用場所 | アプリを利用する場所 | 化学プラント工場内 |
| 利用タイミング | アプリを利用するタイミング(時間帯) | 現場に到着後、業務開始時に起動する |
| フォルダ構成 | チームフォルダの構成と参加するメンバーの定義 | 下記「フォルダ構成例」を参照 |
| ノート構成 | 1つのノートにどれだけの粒度でフォーム(ページ)を作成するか | 1ユーザーあたり一か月分のフォーム |
| データ増減量 | 一定期間あたりの増減量 | 1ユーザ1日あたり36ノート(3ノート × 12フォルダ)を作成・更新 |
| オフライン運用 | オフラインで利用する場合の記述 | トンネル内の中ではオフライン、事務所に戻り次第同期する |
| シェアの利用方法 | スケジュール設定あり(日時を指定)・なし GEMBA Talk利用あり・なし |
毎週月曜10時 現地からGEMBA Talkで事業本部担当と接続 |
| 障害発生時の対応手順 | 障害時の報告ラインと手段を決める | 各ユーザー → パッケージ開発ユーザーへチャットorメールで報告 |
| 開発パッケージの管理方法 | パッケージの名称、バージョン規則、共同編集者 | 下記「開発パッケージ管理項目例」を参照 |
フォルダ構成例
チームフォルダ
|-- 南関東営業
| |-- 東京営業
| | |-- 東東京営業
| | |-- 西東京営業
| |-- 神奈川営業
| |-- 千葉営業
| |-- 埼玉営業
|
|-- 北関東営業
| |-- 茨城営業
| |-- 栃木営業
| |-- 群馬営業
|
|-- 甲信越営業
| |-- 山梨営業
| |-- 長野営業
| |-- 新潟営業開発パッケージ管理項目例
表2-6-2 開発パッケージ定義の記述
| 管理項目 | 記述内容 | 記述例 |
|---|---|---|
| パッケージ名称 | 管理パッケージの名前 | アプリ開発実践編 |
| バージョン管理 | 最大4つのバージョン番号の区分を決める | 3つの数字で表現する: メジャー/マイナー/ロット |
| バージョン更新基準 | バージョン番号を更新するときのタイミングを定義 | ロット:細かな修正 マイナー:半期おきのまとまった機能追加と修正 メジャー:大規模な機能が追加されるときに検討 |
| パッケージパラメータ | あり/なし | あり |
| 共同編集者 | パッケージ開発者を列挙する | 徳島太郎、阿波花子 |
表2-6-3 開発パッケージ定義の記述例
| 管理項目 | 内容 |
|---|---|
| パッケージ名称 | 不動産管理マスター |
| バージョン管理 | 3つの数字で表現する:メジャー/マイナー/ロット |
| バージョン更新基準 | ロット:不具合対応と細かな修正 マイナー:四半期毎のまとまった機能追加と修正 メジャー:大規模機能が追加されるときに検討 |
| パッケージパラメータ | なし |
| 共同編集者 | 武田信代、上杉謙三 |
もしアグリゲーションの中でパッケージパラメータを利用するものがあれば、記載する。
表2-6-4 パッケージパラメータ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | パッケージパラメータを構成するID |
| 日本語表示名 | パッケージパラメータの日本語表示名 |
| パラメータ型 | 論理/数値/整数/文字列/日付/日時のどれか |
| 設定 | 初期値、選択肢などを記述 |
| 説明 | このパラメータの意味、用途 |
表2-6-5 パッケージパラメータ定義の記述例
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | PATH |
| 日本語表示名 | 検索対象フォルダ |
| パラメータ型 | 文字列 |
| 設定 | 初期値として /home/team/xyz を設定 |
| 説明 | LocalTagDBの検索フォルダを定義する |
ここまで述べてきた設計項目をMarkdown形式のファイルにして仕様書(設計書)を作成する。仕様書の作成は、一般的にはOffice文書を利用する場合が多いが、Markdownを用いると次のようなメリットがある。
ちなみに本ドキュメントもソースファイルは複数のMarkdown形式ファイルから構成されている。複数のMarkdownファイルを1つに統合し、HTML形式ファイルへ変換している。
本書やGEMBAアプリの設計に用いている主なMarkdown記法をまとめておく。
見出し
見出しの先頭部分に#をつける。#が増えることにより、小さな見出しになる。
# 大見出し
## 中見出し
### 小見出しリスト
項目や文章を箇条書きにするときに用いる。通常の見出しと番号付き見出しがある。
通常見出し:
# 会社組織の例
- ビル事業本部
- 国内法人営業部
- 海外法人営業部
- 事業推進部
- 住宅分譲事業本部
- 営業部
- 事業企画部
- 事業推進部
- 都市開発事業本部
- 営業部
- 事業企画推進部通常見出しの表示例:
番号付き見出し:
# カレーの作り方
1. 野菜を切る
1. 玉ねぎは皮をむき、たて半分に切る。
1. にんじん、じゃがいもは皮をむき、食べやすい大きさの乱切りにする。
1. 炒める
1. 鍋にサラダ油大さじ1を入れ、中火~強火で表面にしっかり焼き色がつくように肉を炒める。
1. 玉ねぎを弱火~中火でよく炒める。
1. 玉ねぎが茶色くなってきたら、にんじん、じゃがいもを入れてさらによく炒める。
1. 煮る
1. 水とローレルを入れて煮込む。
1. よく沸騰したら火を弱め、アクをとり、材料がやわらかくなるまで弱火~中火で煮込む。
1. ルウを入れる
1. いったん火を止めて、ルウを割り入れ、よく溶かす。
1. 再び、弱火でとろみが出るまで 煮込む。
1. 仕上げる
1. 最後にガラムマサラを適量ふり、味を調える。
1. お皿にごはんをよそい、カレーをかける。番号付き見出しの表示例:
強調
文章の一部など、強調したい箇所を「**」で囲むと強調された文字になる。
**ここ**が、重要です。表
表(テーブル)は パイプ「|」を使って表現する。
| TH | TH |
| --- | --- |
| TD | TD |
| TD | TD |表の表示例:
表の2行目にコロン「:」を付与して、右寄せ・中央寄せ・左寄せを表現する。コロンを入れない場合は左寄せになる。
Markdown形式の文書を作成するためのおすすめのエディタを紹介する。
付録1:不動産管理アプリケーション仕様書にGEMBAアプリ開発教則本で試用した不動産管理アプリ開発の仕様書を例示しているので、参考にする。
この仕様書には、試験項目を自動的に取得できるように、抽出を開始する箇所(見出し)には、拡張記法 {.testitems} を付与している。詳しくは第7章で述べる。
### 見出し {.testitems}この章では、GEMBA Noteで帳票を制作する上で、フォーム部品のよく利用されるであろう便利な設定について述べる。
フォーム部品の設定を変更するには、対象となる部品を長押し/右クリックし、コンテキストメニューの フォーム を選択し、<対象部品名>の設定 を選択する。下の例は、1行テキストフィールドの場合を示している。
ここから後ろの節では、この操作の後からの手順を説明する。
ユーザーによってフォーム部品を編集できるかどうかを仕分けるには、高度な設定 > 操作可能な人 から設定する。下図のようなユーザーを検索するダイアログを通して編集可能なユーザーを設定する。
ノートのタイトルのような属性情報からもフォーム部品を編集できるかどうかを仕分けることができる。次の手順で、編集可能とするルールを設定する。
フォーム部品は、ある条件を満たすと書式を変更することができる。ここでは1行テキストフィールドを用いて説明する。
条件付き書式は以下の手順で設定する。
以下の例では、「赤」と1行テキストフィールドに入力すると、背景色が赤色になるルールを定義している。
複数のフォーム部品を連続して自動的に入力を促す機能である。入力漏れを軽減し、入力作業の省力化につながる。
利用するには、ページに配置した対象となるフォーム部品を投げ縄で選択し、コンテキストメニューの中から フォーム > 続けて入力させる を選択する。部品の配置位置により、左から右、上から下の優先順で矢印が部品間にふられる。始点となる部品をクリックすると、矢印の順序で入力が促される。
順序入力を解除させるときは、対象となるフォーム部品を投げ縄で選択し、コンテキストメニューのフォーム > 続けて入力を解除 を選択する。
「アイテム」とは、ページ上に複数張り付けることのできるUI部品である。GEMBA Note製品に組み込まれているTODO、日付スタンプ、付箋などがその例である。フォームと同じようにタグスキーマを設定し、構成される部品フォームに紐づけすることができ、アグリゲーション検索条件によって集約が可能となる。
下に示した例は、顧客の訪問者カードの例であり、四角い図形の上に日時入力フィールド、1行テキストフィールド、電話番号フィールドが配置してある。それぞれのフィールドは、タグスキーマVistorのタグプロパティvisitedDate、customerName、phoneにリンク付けしている。
アイテムの体裁
表3-1 訪問者カードの体裁
| 定義項目 | 記述内容 |
|---|---|
| アイテム名称 | 訪問者カード |
| ベース | 図形(長方形、線は灰色) |
| 背景 | 水色 |
| 寸法 | 指定しない |
フォーム部品の定義
表3-2 訪問者カードのフォーム部品
| 見出し | プレースホルダ | フォーム部品 | 補足 |
|---|---|---|---|
| 訪問日 | 日付を選択 | 日時入力フィールド | 初期設定のまま |
| 顧客名 | 顧客名を記入 | 1行テキストフィールド | 初期設定のまま |
| 連絡先 | 電話番号を入力 | 電話番号フィールド | 初期設定のまま |
タグスキーマの定義
表3-3 訪問者カードのタグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| Visitor | 訪問者 | 図形(長方形、線は灰色) |
タグプロパティの定義
表3-4 訪問者カードのタグプロパティ
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| visitedDate | 訪問日 | 日付型 |
| customerName | 顧客名 | 文字列型 |
| phone | 電話番号 | 文字列型 |
リンクするフォーム部品とタグプロパティID
表3-5 訪問者カードのリンク
| フォーム部品 | タグプロパティID |
|---|---|
| 訪問日 | VisitedDate |
| 顧客名 | CName |
| 連絡先 | Phone |
複数の部品から構成されるアイテムは、通常は全体をグループ化して、1つの部品のようにする。これを再利用可能にするために、コンテキストメニューの 操作 > アイテムを登録 を選択して登録する。登録したアイテムは、アイテム一覧メニュー(+ > アイテムを追加)から利用する。
フォーム部品のボタンには、現在位置での緯度と経度を計測するコマンド「現在位置をタグに反映」が備わっている。図面ユニットと組み合わせて、現在地を地図用にプロットするとき利用される。
利用するには緯度と経度を入力させる数値フィールドをページ上に配置する。これらの値をタグプロパティとして構成するタグスキーマを準備する。それぞれの数値フィールドを対象するタグプロパティにリンクさせておくと、ボタンを押したときに現在位置の緯度と経度が計測されて入力される。
フォーム部品の定義
表3-6 緯度・経度を取得するのフォーム部品
| 見出し | プレースホルダ | フォーム部品 | 詳細設定 |
|---|---|---|---|
| 緯度 | 緯度を入力 | 数値 | 初期設定のまま |
| 経度 | 経度を入力 | 数値 | 初期設定のまま |
タグスキーマの定義
表3-7 緯度・経度を表現するタグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| location | 位置 | 文字列「緯度」 |
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| longitude | 緯度 | 数値 |
| latitude | 経度 | 数値 |
フォーム部品とタグプロパティIDのリンク
表3-8 フォーム部品とタグプロパティのリンク
| 見出し/プレースホルダ | タグプロパティID |
|---|---|
| 緯度 | longitude |
| 経度 | latitude |
フォーム部品およびタグプロパティには、ユーザーが操作によって値を与える前に初期値を自動的に設定する機能が備わっている。その方法は2通り存在し、用途によって使い分ける。 なお、初期値の自動設定は、該当するフォーム部品やタグスキーマを含むアイテムやテンプレートを張り付けたときに実行される。
フォーム部品の1行テキストフィールドおよび日時入力フィールドには、その属性としてアイテム/テンプレート利用設定 が存在し、初期値の値を設定することができる。
1行テキストフィールドの初期値設定オプション(利用時の初期値)
| オプション | 説明 |
|---|---|
| 登録時のまま | アイテムあるいはテンプレートとして登録したときの値を設定する。 |
| 名前 | 現在利用しているユーザーの名前を設定する。 |
| 法人名 | 現在利用している法人の名前を設定する。 |
| ユーザーID | 現在利用しているユーザーの識別文字列を設定する。 |
| 法人ID | 現在利用している法人の番号を設定する。 |
| メールアドレス | 現在利用しているユーザーのEmailアドレスを設定する。 |
| タイトル | 現在利用しているノートの見出しを設定する。 |
| チーム名 | 現在利用しているチームの名前を設定する。 |
| フォルダ名 | 現在利用しているノートのフォルダ名を設定する。 |
| タグフォルダ名 | 現在利用しているタグフォルダの名前を設定する。 |
日時入力フィールドの初期値設定オプション(日付)
| オプション | 説明 |
|---|---|
| 登録時のまま | アイテムあるいはテンプレートとして登録したときの値を設定する。 |
| 利用した日 | アイテムやテンプレートを張り付けた日付を設定する。 |
| デイリーページの日 | 現在のデイリーページの日付を設定する。 |
タグスキーマを構成するタグプロパティには初期設定として値や関数を設定することができる。 タグスキーマ編集画面からタグプロパティ設定画面上の 式 を選択して、プロパティ初期値 に利用する関数を設定する。
初期値に利用できる関数
| 関数 | データ型 | 説明 |
|---|---|---|
| companyName() | 文字列 | 現在利用している法人の名前を設定する。 |
| date() | 日付 | アイテムやテンプレートを張り付けた日付を設定する。 |
| email() | 文字列 | 現在利用しているユーザーのEmailアドレスを設定する。 |
| userid() | 文字列 | 現在利用しているユーザーの識別文字列を設定する。 |
| userName() | 文字列 | 現在利用しているユーザーの名前を設定する。 |
| uuid() | 文字列 | Universally Unique Identifierの略で、世界中で重複しない一意な識別子を設定する。 |
初期値に関数を利用するときの注意
ページやアイテムにタグスキーマを設定するとき、コンテキストメニューの タグ > 設定 で対象となるタグスキーマを選択する。関数を初期値として利用する場合は、設定しようとしているタグスキーマのタグプロパティの一覧を表示し、以下のようにチェックが入っていることを確認する。チェックされていないと、ページやアイテムを複製した時に初期値が反映されない。
初期値の自動設定には2つの方法があることを述べたが、どちらを利用すればよいか、その違いを示す。
| 方法 | 開発オプション | 特徴 |
|---|---|---|
| フォーム部品に設定 | 不要 | アグリゲーションで用いるとき部品とタグプロパティのリンクが必須である。 |
| タグプロパティに設定 | 必要 | フォーム部品がなくても目的の値を設定できる。 |
開発オプションを購入していない場合は、そもそもタグスキーマを定義できないので、フォーム部品の初期値設定を用いるしかない。 タグプロパティの初期値として関数を設定した場合、フォーム部品へのタグプロパティをリンクせずとも、「隠しフィールド」のごとく、アグリゲーションに用いることができることが利点となる。
アグリゲーション検索条件の実行結果は、ナビゲーションメニューの + > アグリゲーション > 結果を表にして追加 から「表」として出力する方法は、アプリ開発教則本 で学んだ。
実行結果を横(あるいは縦)に並べたフォーム部品それぞれに出力する形式が「フォーム表形式出力」あるいは「フォーム形式出力」と呼ぶ表示形態である。 次の画像は不動産管理アプリの検索条件をフォーム形式で出力した例である。
フォーム形式として出力するには、1行(あるいは1列)に並べたフォーム部品が1つのタグインスタンスの内容となるようにタグスキーマとそのプロパティをフォーム部品群に設定する。対象となるタグスキーマを1行(あるいは1列)のどこかに設定し、各フォーム部品とタグプロパティをリンク付けしていく作業を行う。この1行を「縦に複製」あるいは「横に複製」することによって、アグリゲーション検索条件が返す複数のタグインスタンスを「行ごと」あるいは「列ごと」に出力する仕組みである。
表形式とフォーム形式の出力方法の違いは次の通りである。
表3-9 表形式とフォーム形式の出力方法の違い
| 比較項目 | 表形式出力 | フォーム形式出力 |
|---|---|---|
| ボタンコマンド | アグリゲーション結果を更新 | アグリゲーション結果をタグに反映 |
| 編集のしやすさ | 項目追加・削除の作業小 | 項目追加・削除の作業大 |
| 機能性 | グラフを利用可 | リストメニュー、高度な編集条件を設定可 |
| 出力結果を再集約 | ユニットコネクタを用いた集約 | 結果タグスキーマが集約対象なので同じ検索条件が再利用可能 |
出力結果を再集約する例として、出力結果を他のページに転記する機能があげられる。
フォーム部品の1行テキストフィールド、数値フィールド、および選択フィールドは、選択できる項目をリストとして与えるとプルダウンメニューのように振舞う。カスケードリスト(カスケードメニュー)は、前のリストの選択値によって次のリストの選択候補が切り替わり、多層的に値を決定していく仕組みである。利用例として、企業の部門や部署、住所などがあげられる。
多言語の選択メニューを実現するには、値を共通にして表示を言語ごとに切り替える。 以下は日英に対応した物件タイプを選択させるメニューを実現する共有リストファイルである。
| ファイル | 内容物の説明 |
|---|---|
| propertyTypes_en.csv | 英語向け物件種別選択項目 |
| propertyTypes_jp.csv | 日本語向け物件種別選択項目 |
ファイルの第1行は見出し、2行目以降に選択項目を定義している。 それぞれのファイルを1行テキストのリストに設定するときに、ダイアログ上で表示名と値の順序を選択する。
あるフォーム部品で選択した値が別のフォーム部品の選択候補を動的に切り替える場合はよくある。これを一般的には「カスケードメニュー」と呼び、とくにリストボックス形式で表現する場合を「カスケードリスト」という。 例えば会社組織における「本部」「部」「課」、住所を構成する「都道府県」「市区町村」「町名・番地」をUIで選択するときに用いる。GEMBA Noteで、このような多段階のカスケードリストを実現するにはアグリゲーションを利用する。
カスケーディングは、まず前のフォーム部品の選択値が次のフォーム部品に設定されたアグリゲーションの「検索パラメータ」として渡される。データリソースの中からそのパラメータ値と合致する項目を収集して選択項目一覧を提示する仕組みである。
アグリゲーションは、該当するフォーム部品の設定画面を開き、リストの設定 から アグリゲーション にチェックを入れて、ここに指定する。
アグリゲーション検索条件を指定するときは、その条件が有する検索パラメータをどのタグプロパティから取得するのか指定する。
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | フォーム設定 | フォーム部品の設定 | - | - |
不動産管理アプリのアグリゲーション結果を「表形式」ではなく「フォーム表形式」として出力するサンプルを確認する。次のノートの中に、フォーム部品列を利用した集約結果表示方法を実現する手順を見ることができる。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| 不動産管理アプリ フォーム編 | - | 物件集計 フォーム編 作成手順 | 集約 | フォーム |
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | フォーム設定 | カスケードリスト | 集約 | リスト |
GEMBA Noteではタグスキーマにリンクしたフォーム入力データをタグデータベース(タグDB)として操作を行うことができる。それが「アグリゲーション」と呼ばれる集約機能である。アグリゲーション検索システムは、各種DBコネクタによって収集したデータの中から検索条件に合ったデータを抽出し、表示、加工するしくみを提供する。
この章は、アプリ開発教則本と本ドキュメントで例示したアグリゲーション検索条件を詳細に解説し、アグリゲーション開発における設計方法と実装手順を学ぶ。
GEMBAアプリ開発を行う上で、アグリゲーション検索条件を設計する際には、アプリの要件に応じて下記の2点を考慮して設計することが重要となる。
つまり処理を司る部分と処理結果をどう表現するかは切り離して設計する。ここでは、「実現するべき処理は何か」について、アグリゲーションを実行処理するときによく見られるパターンを大きく3つに分類し、設計内容を構成する要素とする。
表4-1-1 アグリゲーションの処理パターンの種別
| 処理パターン名 | 処理の概要 |
|---|---|
| 集約パターン | 各ノート・各ページの複数のタグインスタンスを集約する。 |
| 転記パターン | 特定のタグインスタンスのみを抽出し他の場所に転記する。 |
| 計算パターン | SQLで実行できる数値演算、関数での演算などの結果を出力する。 |
ここからは、それぞれの処理パターンについて特徴をを説明する。
GEMBA Noteの各ノート・各ページからタグインスタンスを検索し、結果タグスキーマの構造としてひとつに集約する処理パターンである。
集約パターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル3-2 | 不動産管理アプリ フォーム編 | - | 物件集計 フォーム編 作成手順 | 集約 | フォーム |
| サンプル3-3 | アプリ開発実践編 | フォーム設定 | カスケードリスト | 集約 | リスト |
| サンプル5-2 | アプリ開発実践編 | 物件地図用 | 物件画像フォーム | 集約 | 図面 |
| サンプル6-1 | アプリ開発実践編 | データ連携 | CSVデータ出力 | 集約 | CSV |
| サンプル6-4(受信テスト) | アプリ開発実践編 | データ連携 | RESTサーバーから取得 | 集約 | 表 |
| サンプルA4-1 | アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 集約 | 表 |
GEMBA Noteのあるノート・あるページから特定のタグインスタンスを検索し、結果タグスキーマの構造でデータを取得する処理パターンである。 言い換えると、あるデータを出力パターンに応じて出力するために、対象のデータをコピーしておく処理パターンである。
転記パターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル5-1 | アプリ開発実践編 | バイナリデータの利用 | 物件画像フォーム | 転記 | フォーム |
GEMBA Noteのあるノート・あるページから特定のタグインスタンスを検索し、その値に対しSQLのSELECT文にて行える数値計算を行い、その結果を結果タグスキーマの構造で出力する処理パターンである。計算を広い意味で捉え、値の変換処理もここに含める。
計算パターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル4-1 | アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 計算 | フォーム |
| サンプル4-2 | アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 計算 | 表 |
GEMBAアプリ開発を行う上で、アグリゲーション検索条件を設計する際には、アプリの要件に応じて下記の2点を考慮して設計することが重要であることは前に述べた。
処理を司る部分と処理結果をどう表現するかは切り離して設計することが可能である。ここでは、「処理した結果をどのように出力するか?」について、5つのパターンに分類して解説する。
表4-2-1 アグリゲーションの出力パターンの種別
| 出力パターン名 | 出力の概要 | 設定・起動箇所 |
|---|---|---|
| 表パターン | ノート内の表に出力する。 | ナビゲーションメニュー、ボタン部品 |
| フォームパターン | ノート内のフォーム部品に出力する。 | ボタン部品 |
| CSVパターン | GEMBA Noteの外部にエクスポートするためにCSV形式で出力する。 | ボタン部品 |
| リストパターン | アグリゲーションの処理結果を表やフォーム部品におけるリストの選択肢として表示する。 | 1行テキストフィールド、数値フィールド、選択フィールド |
| 図面パターン | アグリゲーションの処理結果を図面ユニット上にプロットする。 | 図面ユニット |
アグリゲーション処理で得られた値を、GEMBA Noteの特定のノート・ページに表形式(表ユニットと呼ぶ)で出力する。
得られた値を単にノートに表示するために使用され、表示した値を他のアグリゲーションで活用しない場合に使用される。
コネクタタイプとして Unit が存在するが、表ユニットの値をタグインスタンスとして別のアグリゲーションから取得することもできる。ただし、これを実現するためにはGEMBA Noteがあらかじめ用意しているシステムタグ(ベーシックタグ: ExtractDefinition〈抽出定義〉、SpreadExtractParameter 〈表計算抽出パラメータ〉)を該当の表に設定する必要がある。取得する表の範囲は絶対値で設定するのであるが、表の編集によって行と列の位置は変動しやすく、継続的なメンテナンスが簡単ではないという理由で、本書では扱わない。
表パターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル4-2 | アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 計算 | 表 |
| サンプル6-4(受信テスト) | アプリ開発実践編 | データ連携 | RESTサーバーから取得 | 集約 | 表 |
| サンプルA4-1 | アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 集約 | 表 |
アグリゲーション処理で得られた値を、GEMBA Noteの特定のノート・ページに張り付けたフォーム部品に出力する。
前節の表パターンは単に値をノートに表示するために使用するが、この出力パターンは値をノートに表示するだけでなく、さらに他のアグリゲーションにて再利用できるデータとして出力するために使用する。そのため、出力したデータを他のアグリゲーションでさらに集約したり転記したりする場合にこのパターンを選択する。
このパターンを選択する場合には、アグリゲーションの処理を行う前に出力対象のフォームと結果タグスキーマの各プロパティをリンクする必要がある。
フォームパターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル3-2 | 不動産管理アプリ フォーム編 | - | 物件集計 フォーム編 作成手順 | 集約 | フォーム |
| サンプル4-1 | アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 計算 | フォーム |
| サンプル5-1 | アプリ開発実践編 | バイナリデータの利用 | 物件画像フォーム | 転記 | フォーム |
アグリゲーション処理で得られた値を、CSV形式でファイルとして出力する。
このパターンは、GEMBA Noteアプリの外部にデータを連携する際に使用される。
ボタン実行コマンドの以下のオプションには、アグリゲーション実行結果をCSVファイルとして出力する機能が備わっている。
CSVパターンに該当するサンプルは次の箇所に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル6-1 | アプリ開発実践編 | データ連携 | CSVデータ出力 | 集約 | CSV |
アグリゲーション処理で得られた値を、表やフォーム部品の選択肢として出力する。
このパターンは前節までに紹介した出力パターンとは異なり、結果タグスキーマの選択とSQLの書き方に留意する必要がある。
結果タグスキーマの設定
結果タグスキーマは、「ベーシックタグスキーマ」としてGEMBA Noteアプリにあらかじめ用意されているタグスキーマのどちらかを要件に応じて選択する。
表4-2-2 リストパターンで結果タグスキーマに選択するタグスキーマ
| タグスキーマ | タグプロパティ | 用途 |
|---|---|---|
| StringValue (文字列値) | v (値) ja (日本語) en (英語) |
文字列のリストを作成する場合に利用する。 |
| NumberValue (数値) | v (値) ja (日本語) en (英語) |
数値のリストを作成する場合に利用する。 |
SQLの書き方
集約パターンあるいは計算パターンで処理された結果をリストとして用いる。その場合、下記4点を考慮しSQLを記述する。
SELECT
DISTINCT col1 AS v -- リスト選択肢列
, col1_ja AS ja -- 日本語表記列
, col1_en AS en -- 英語表記列
FROM
LIST_TBL -- リストの選択肢の値などが格納されているテーブル
;SELECT
DISTINCT col1 AS v
, col1_ja AS ja
, col1_en AS en
FROM
LIST_TBL
WHERE
col2 = :col2 -- ページ上のフォームの値である検索パラメータを条件として結果を絞り込む
;フォーム部品への設定方法
表のセルへの設定方法
リストパターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル3-3 | アプリ開発実践編 | フォーム設定 | カスケードリスト | 集約 | リスト |
アグリゲーション処理で得られた値を、図面ユニット上にピンマークとして張り付ける。
他の出力パターンより図面ファイルの設定など、手順および起動方法が複雑なため、5.3節「図面ユニットを利用」を参照する。
図面パターンに該当するサンプルは次の箇所(節)に提示している。
| 記載箇所 | パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|---|
| サンプル5-2 | アプリ開発実践編 | 物件地図用 | 物件画像フォーム | 集約 | 図面 |
ここまで述べてきたアグリゲーションの「処理のパターン」と「出力のパターン」を踏まえ、アグリゲーション全体を設計するために必要な5つの工程についてそれぞれ説明する。
GEMBA Noteからの検索対象は、現在開いているノート、ローカル保存されている別のノート、サーバーに格納されているノート、外部のデータ(データベースやサーバー)になる。検索対象物を明らかにして、どのコネクタ(接続先)を用いるか選別する。
ただし、Unitコネクタについては、取得する表の範囲を絶対値で設定するのであるが、編集によって表の行と列の位置は変動しやすいため、継続的なメンテナンスが簡単ではないという理由で、本書では扱わない。またMMJCloudコネクタはMetaMoJiクラウドのサービスと連携するためのコネクタであるが、当社から顧客個別の案件で提供しているため、ここでは除外する。
シェアノートを対象にLocalTagDBコネクタを用いてアグリゲーションを実行するときには注意が必要である。シェアノートの変更は、対象のノートを開いている全てのユーザーがそのノートを閉じなければ反映できない。変更が反映されていなければ、アグリゲーション処理の結果に漏れが生じる。
コネクタタイプが決まると、アグリゲーション検索対象とするタグスキーマを決定する。
2章でも述べたが、タグスキーマは、データベースにおけるテーブルのようにデータを格納する入れ物である。タグスキーマを構成する要素がタグプロパティである。
表4-3-1 タグスキーマ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| タグID | タグスキーマのID |
| 日本語表示名 | その日本語表示名 |
| 設定箇所 | このタグスキーマを設定(配置)したUI(ページ、文字列、フォーム部品など) |
表4-3-2 タグプロパティ定義の記述
| 定義項目 | 記述内容 |
|---|---|
| プロパティID | タグスキーマを構成するタグプロパティID |
| 日本語表示名 | タグプロパティの日本語表示名 |
| データの型 | 論理/数値/整数/文字列/日付/日時/参照のどれか |
表4-3-3 物件タグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| Property | 物件 | ページ |
表4-3-4 物件タグプロパティ
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
コネクタタイプと検索対象タグスキーマを設定すると、コネクタの種別によってさらに条件を設定することができる。ただし、Unit、Salesforce、およびMMJCloudコネクタタイプについては言及しない。
現在開いているノート内を検索するコネクタを選択すると、以下の検索条件を設定することができる。
表4-3-5 NoteTagDBの検索条件
| 定義項目 | 記述内容 |
|---|---|
| プロパティ条件 | 指定した検索対象タグスキーマのプロパティであらかじめ絞り込む |
| 並び替え条件 | 指定した検索対象タグスキーマのプロパティで並び替える |
| 拡張条件 | ページ順、ページ逆順に並び替える |
| デイリーページ | 検索対象としてデイリーページを含めるか、含めないか。開始日と終了日も指定できる。 |
| 自由ページ | 検索対象として自由ページを含めるか、含めないか |
| シェアページ | 検索対象とするシェアページを最新にするか、しないか |
ローカルに保存された他のノートを含めて検索するコネクタを選択すると、以下の検索条件を設定することができる。
表4-3-6 LocalTagDBの検索条件
| 定義項目 | 記述内容 |
|---|---|
| プロパティ条件 | 指定した検索対象タグスキーマのプロパティであらかじめ絞り込む |
| 並び替え条件 | 指定した検索対象タグスキーマのプロパティで並び替える |
| 検索対象のパス | どこに保存されているかパスを指定する(表4-3-7を参照) |
表4-3-7 検索対象のパス
| 場所 | folder要素の記述 |
|---|---|
| ホーム | /home/ |
| 個人フォルダ | /home/private/ |
| チームすべて | /home/team/ |
| チーム | /home/team/チーム名/ |
| チーム内のフォルダ | /home/team/チーム名/フォルダ1/…/フォルダN/ |
| 検索実行時のノートが存在するフォルダ | /context/ |
サーバーに格納されたノートを検索するコネクタを選択すると、LocalTagDBと同じ検索条件に加えて、つぎの項目を設定することができる。
表4-3-8 ServerTagDBの検索条件(LocalTagDB検索条件への追加)
| 定義項目 | 記述内容 |
|---|---|
| リミット | サーバーから取得するデータの件数を数値文字列で指定する(※注意)。 |
| オフセット | サーバーから取得するデータの取得開始位置を数値文字列で指定する。 |
※注意:この値を1,000より大きく設定するときは、MetaMoJiのクラウドサーバーへの負荷を考慮する。特に5,000以上にするときは、MetaMoJi営業担当者に相談すること。
RESTサーバーにアクセスして検索するコネクタを選択すると、以下の検索条件を設定することができる。
表4-3-9 RESTの検索条件
| 定義項目 | 記述内容 |
|---|---|
| URL | RESTサーバーにアクセスする URL の設定。 |
| METHOD | RESTサーバーにアクセスするときのMETHODを選択する(GET/POST) |
| BODY | POST などで送信する BODY の内容を設定する。文字列やJSON形式を選んで内容を送信する。 |
アグリゲーション検索条件の実行結果を出力するタグスキーマを決定する。結果タグスキーマは、検索結果の中に入っているデータを解釈するために用いるタグスキーマである。検索対象となるタグスキーマの全てのプロパティではなくその一部のプロパティを表示したり、表示順序を変更したり、加工や計算した結果を求める時に利用する。
前節の物件タグスキーマをもとに生成されるタグインスタンスに対して、いくつかの価格を計算した結果を出力するためのタグスキーマを示す。
表4-3-10 物件統計情報タグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| propertyStatistics | 物件統計情報 | ページ |
表4-3-11 物件統計情報タグプロパティ
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| min | 最低価格 | 数値 |
| max | 最高価格 | 数値 |
| average | 平均価格 | 数値 |
| total | 合計価格 | 数値 |
検索パラメータは、初期値やフォーム部品など外部から値を与えてSQL式の中で、処理を切り替えたり、検索結果を絞り込むために用いる。
設定した検索パラメータを利用できる箇所は主に次の場所である。
アグリゲーションに設定した検索パラメータをフォーム部品を関連付けるには、次の手順で行う。
検索パラメータに関わるタグスキーマとタグプロパティを作成する。
作成したタグスキーマをページ上のどこかに(例えば、見出しの文字列)設定する。
フォーム部品を張り付ける。
張り付けたフォーム部品から関連付けるタグプロパティにリンクする。
ボタン部品を長押しor右クリックして編集状態にして、設定の変更 を選択する。
検索パラメータを更新する をオンにすると、検索条件一覧が現れる。
対象とする検索条件を選択する。
検索パラメータにリンクするタグ を1で作成したタグスキーマの該当するタグプロパティに設定する。
表4-3-12 物件検索向けパラメータ「TYPE」の定義
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | TYPE |
| 日本語表記 | 物件タイプ |
| パラメータ型 | 文字列 |
| 初期値 | アパート |
| 選択肢 | なし |
| UIタイプ | 指定しない |
このパラメータの場合、$TYPE あるいは :TYPE と使ってSQL式を構成する。
SELECT *
FROM P_TABLE
WHERE Type = :TYPE AND Name != ''
ORDER BY Price DESCSQL(Structured Query Language)は、リレーショナルデータベースを操作するための言語で、データベースに命令を送ってデータの検索や追加、更新、削除などを実行する。 GEMBA Noteでは、各種コネクタからのデータ抽出方法を表現するために用い、SELECT文のみを提供する。
一般的なSQLにおけるSELECTは散らばっているデータ群に対して、大きく3つの操作を実行する命令文である。
GEMBA Noteの場合は、これらに加えて次の操作ができることが特殊である。これは検索対象となるタグスキーマと結果タグスキーマが分離していること、ボタン実行コマンド「アグリゲーション結果をタグに反映」が存在することに起因する。
よく用いる基本的なSELECT文の構文をGEMBA Noteの言葉を補足して表現すると次のようになる。
SELECT カラム列(結果タグスキーマを構成するタグプロパティ名)
FROM コネクタの抽出テーブル名
WHERE カラム1 比較演算子 条件値 AND/OR カラム2 比較演算子 条件値 ...
GROUP BY グループ化を行うカラム名
ORDER BY 並び順の基準となるカラム名 ASC/DESC;GEMBA NoteのSQL実行における特殊性は、アグリゲーションのSQLに用いることができるカラム名はタグスキーマだけではなく、システムが提供するカラムやパラメータの存在にある。
システムカラム(インデックス情報カラム)は、タグスキーマを設定した対象物、あるいはその対象物を含んだノートやページの識別情報を値として取得する。SELECT文のカラムとして記述しておくと、NoteTagDB、LocalTagDB、およびServerTagDBコネクタの場合は、結果としてサムネイル表示や該当ページへのジャンプなどができる。 また、通常ノートとシェアノートにおけるページを特定するための一意性の検査に用いることができる。一意性は、RESTコネクタのように外部システムからデータを受け取るときに重要となる。
表4-3-13 システムカラム一覧
| カラム名 | 説明 | 通常ノートの一意性 | シェアノートの一意性 |
|---|---|---|---|
| _driveId | 対象ノートが存在するフォルダのID | ✓ | |
| _documentId | 対象ノートのID | ✓ | |
| _roomId | 対象のシェアノートを特定するID | ✓ | |
| _objectType | 対象オブジェクトを識別する情報 | ||
| _objectId | 対象オブジェクトを識別する情報 | ||
| _ownerId | 対象オブジェクトを識別する情報 | ||
| _pageId | 対象オブジェクトが存在するページのID | ✓ | ✓ |
| _layerType | 対象オブジェクトが存在するレイヤーを識別する情報 | ||
| _layerId | 対象オブジェクトが存在するレイヤーを識別する情報 | ||
| _x | 対象オブジェクトのX軸の値 | ||
| _y | 対象オブジェクトのY軸の値 | ||
| _width | 対象オブジェクトの横幅 | ||
| _height | 対象オブジェクトの高さ |
システムが提供するパラメータは、現在開いているページや日付を利用した条件絞り込みに用いる。
表4-3-14 主な組み込みパラメータ
| パラメータ | 説明 |
|---|---|
| _PAGE_DATE | 検索を実行したときの現在のページ日付 |
| _PAGE_ID | 検索を実行したときの現在のページID |
アグリゲーションを実行処理するときによく見られるパターンを大きく3つに分類することは前に述べた。ここでは各パターンでのSQL記述の特徴についてふれる。
集約パターンには、シンプルなSELECT文でのSQL記述が多い。入力フィールドからの値を検索パラメータとして受け取り、それをWHERE句の中に定義して絞り込むケースがよく見られる。
SELECT カラム列(結果タグスキーマを構成するタグプロパティ名)
FROM コネクタの抽出テーブル名
WHERE カラム1 比較演算子 検索パラメータ1 AND カラム2 比較演算子 検索パラメータ2, ...転記パターンは、コピーする場所を指定するため、同じページである・ではないことを条件とする場合が多い。
SELECT カラム列(結果タグスキーマを構成するタグプロパティ名)
FROM コネクタの抽出テーブル名
WHERE _pageId 比較演算子 _PAGE_ID(同じページであるか、ないかを検査する場合)また他のノートから転記する場合は(LocalTagDBやServerTagDBコネクタ)、IDや日付で絞り込むこともある。
SELECT カラム列(結果タグスキーマを構成するタグプロパティ名)
FROM コネクタの抽出テーブル名
WHERE 日付カラム 比較演算子 _PAGE_DATE AND/OR ...
LIMIT 1 -- 複数存在したときに最初に現れたものにする計算パターンは、検索対象タグスキーマのカラムの値を四則演算したり、集合関数(MIN, MAX, SUM, COUNTなど)を適用して結果を集計する。計算結果は、AS句 を使って別のカラムに出力する。
SELECT 検索カラム1 四則演算 検索カラム2 AS 出力カラム1、集合関数(検索カラム2) AS 出力カラム2(結果タグスキーマを構成するタグプロパティ名)
FROM コネクタの抽出テーブル名
WHERE ...生成AIとは、深層学習や機械学習の手法を駆使して、人が作り出すようなテキスト、画像、音楽、ビデオなどのデジタルコンテンツを自動で生成する技術である。ここでは生成AIの一つである ChatGPT を用いてアグリゲーション実行処理の根幹となるSQL式を設計情報から生成する手順について解説する。
プロンプト(prompt)は、ChatGPTに対する命令や質問のことを指す。たとえば、「不動産物件のデータを10件作成してください」と命令すれば、物件名、住所、間取り、面積、築年数、賃料など、架空の不動産データを10件提示してくれる。情報が不足している場合は、「物件タイプも追加して」と命令を追加すると、それに見合ったデータを生成する。
ChatGPTにアグリゲーション検索条件であるSQLを生成するためには、まず対象となるタグスキーマとタグプロパティを与える必要がある。 このようなまとまりがある記述は、ハッシュタグ(#)の後ろに適当な見出しを記入し、その下にこのドキュメントで提案したタグスキーマとタグプロパティのMarkdown形式テキストを書く。
ハッシュタグは、プロンプト内でのタグ付けや分類、数値や数量を示すために使用される。
タグスキーマとタグプロパティのプロンプト記述例
#物件タグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Property | 物件 | ページ |
#物件タグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
中括弧({})の中に前述したハッシュタグを受けこみ、どのタグスキーマを対象に、どのSQLシステムの形式で、どのような条件でSQL式を作成してほしいか伝える。
中括弧は、選択肢を示したり、プロパティや属性を定義するために使用される。
SQL作成要求のプロンプト記述例(全体)
{#物件タグスキーマ}の{#物件タグプロパティ}から、最小価格、最大価格、平均価格を算出するSQLiteのSQLを生成してください。
#物件タグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Property | 物件 | ページ |
#物件タグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
生成されたSQL
SELECT
MIN(Price) AS MinPrice,
MAX(Price) AS MaxPrice,
AVG(Price) AS AvgPrice
FROM Property;何か不足している、過剰に反応している場合は、その旨を何度も伝えて最終形態にもっていく。
追加質問その1
検索パラメータ{propertyTYPE}は、物件タイプを意味します。この変数をつかって絞り込みを付け加えてください。
※{propertyTYPE}とせずともpropertyTYPEでも問題ないかもしれない。
生成されたSQL
SELECT
MIN(Price) AS MinPrice,
MAX(Price) AS MaxPrice,
AVG(Price) AS AvgPrice
FROM Property
WHERE Type = :propertyTYPE;追加質問その2
MinPriceはmin、MaxPriceはmax、AvgPriceはaverageに置き換えてください。
生成されたSQL
SELECT
MIN(Price) AS min,
MAX(Price) AS max,
AVG(Price) AS average
FROM Property
WHERE Type = :propertyTYPE;前節で生成した物件の最小価格、最大価格、平均価格を計算するサンプルを確認するため、次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 計算 | フォーム |
「物件タイプごとに統計情報を算出する」と書かれたページへ移動し、「物件タイプ」をメニューから選択しなおして、算出 ボタンをクリックして出力結果をみる。
ChatGPTに次のプロンプトを与えて生成したアグリゲーションの実行を確認する。このサンプルでは2つの異なるタグスキーマからSQL式を作成する。 なお、ChatGPTは日々学習を重ねているので、これと全く同じSQL式を生成するとは限らないことに留意する。
質問の意図:各不動産物件への訪問者数を数える。
{#物件タグスキーマ}は{#物件タグプロパティ}から構成されます。
{#訪問者カードのタグスキーマ}は{#訪問者カードのタグプロパティ}から構成されます。
物件の名称ごとに、物件ページと同じページにある訪問者カードの数を集計するSQLiteのSQLを作成してください。
#物件タグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Property | 物件 | ページ |
#物件タグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
#訪問者カードのタグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Visitor | 訪問者 | 図形(長方形、線は灰色) |
#訪問者カードのタグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| visitedDate | 訪問日| 日付型 |
| customerName | 顧客名 | 文字列型 |
| phone | 電話番号 | 文字列型 |
生成されたSQL:
WITH PropertyPages AS (
SELECT
p.Name AS PropertyName,
p.PageID
FROM Property p
),
VisitorCounts AS (
SELECT
v.PageID,
COUNT(v.VisitorID) AS VisitorCount
FROM Visitor v
GROUP BY v.PageID
)
SELECT
pp.PropertyName,
COALESCE(vc.VisitorCount, 0) AS VisitorCount
FROM PropertyPages pp
LEFT JOIN VisitorCounts vc ON pp.PageID = vc.PageID;着目点:
追加質問:
追加の条件でSQLを更新してください。
・「同じページ」は_pageIdカラムを利用する。
・訪問者数はcustomerNameカラムでカウントする。
・集約結果は、{#訪問者数カウントのタグスキーマ}の{#訪問者数カウントのタグプロパティ}のプロパティIDに出力する。
#訪問者数カウントのタグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| visitorCount | 訪問者数カウント | - |
#訪問者数カウントのタグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| propertyName | 物件名称| 文字型 |
| numVisitors | 訪問者数 | 整数型 |
更新されたSQL:
WITH VisitorCounts AS (
SELECT
v._pageId,
COUNT(v.customerName) AS numVisitors
FROM Visitor v
WHERE v.customerName IS NOT NULL
GROUP BY v._pageId
)
SELECT
p.Name AS propertyName,
COALESCE(vc.numVisitors, 0) AS numVisitors
FROM Property p
LEFT JOIN VisitorCounts vc ON p._pageId = vc._pageId;実際にアグリゲーションの動作を確認するため、次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 計算 | 表 |
「各物件の訪問者数をカウントする」と書かれたページへ移動し、最新に更新 ボタンをクリックしてみる。
この章では、GEMBA Noteが画像データやPDFファイルのようなバイナリデータをどのように処理することができるかサンプルを提示しながら解説する。音声と動画はフォーム部品としてまだ提供されていないので、ここではふれない。
GEMBA Noteが取り扱うことができるバイナリデータは、動画データ、画像データ、音声データ、そしてPDFファイルである。この中のうちGEMBA Noteアプリとしてデータの入出力をタグスキーマを介して連携できるものは、画像とPDFである。これら2つのデータタイプは、「参照型」のタグプロパティからイメージフィールドとPDFフィールドにリンクして利用する。
あるフォームに配置したイメージフィールドに張り付けた画像、およびPDFフィールドに読み込まれたPDF文書を別のフォームから取得するサンプルを実装する。このサンプルを実現するフォーム、タグスキーマ、アグリゲーションを第2章「アプリケーションの設計」で述べた手法で設計する。
不動産物件情報として画像とPDF形式の詳細情報を1つ登録するための帳票を定義する。
フォームの体裁
表5-1 物件画像フォームの体裁
| 定義項目 | 記述内容 |
|---|---|
| フォーム名称 | 物件画像フォーム |
| 種類 | 縦向き |
| サイズ | はがき |
| 背景 | 水色 |
| 縮尺 | 設定なし |
フォーム部品の仕様
表5-2 物件画像フォーム上のフォーム部品
| 見出し | プレースホルダ | フォーム部品 | 詳細設定 |
|---|---|---|---|
| 物件名称 | タップしてテキストを入力 | 1行テキスト | 初期設定のまま |
| - | 物件写真を追加 | イメージ | 最大個数が10、プレースホルダ「物件写真を追加」サイズ24 |
| - | PDFを読み込み | プレースホルダ「PDFを読込」サイズ24 | |
| 取得 | - | ボタン | コマンドは「アグリゲーション結果を反映」で、物件画像転記を実行する |
フォーム部品の配置
物件画像フォーム上の見出しと部品の配置は次の図のようにする。
タグスキーマの定義
表5-3 物件写真タグスキーマとタグプロパティ
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| propertyPhoto | 物件写真 | ページ |
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| name | 名称 | 文字列 |
| photo | 写真 | 参照 |
| 詳細 | 参照 |
フォーム部品とタグプロパティのリンク
表5-4 物件写真タグプロパティとのリンク
| 見出し/プレースホルダ | タグプロパティID |
|---|---|
| 名称 | name |
| 物件写真 | photo |
| 物件詳細 |
表5-5 物件画像コピーの定義
| 定義項目 | 記述内容 |
|---|---|
| 設定ID | propertyCopy |
| 日本語表記 | 物件画像コピー |
| 結果タグスキーマ | propertyPhoto(物件写真) |
| 検索パラメータ | name |
| コネクタ | 後述 |
| SQL | 検索パラメータ「name」に部分一致したpropertyPhotoタグインスタンスの名称、写真、詳細を取得する。 |
検索パラメータ「name」の仕様
表5-6 物件名称パラメータの定義
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | name |
| 日本語表記 | 物件名 |
| パラメータ型 | 文字列 |
| 初期値 | XYZ |
| 選択肢 | なし |
| UIタイプ | 指定しない |
コネクタの仕様
表5-7 物件写真タグスキーマを取得するコネクタの定義
| 定義項目 | 記述内容 |
|---|---|
| 抽出テーブル名 | PROPERTY_PHOTO |
| タイプ | LocalTagDB |
| タグ検索条件 | propertyPhotoタグスキーマを検索する。画像・PDFのインポート設定は後述 |
| 検索対象のパス | /context/ |
| コネクタ固有の設定 | 特になし |
画像・PDFのインポート設定
表5-8 物件写真タグスキーマのインポート設定
| プロパティID | 画像・PDFを取得するノート | 取得失敗時の動作 |
|---|---|---|
| photo (写真) | 端末内のノート | 代替画像に置き換える |
| pdf (詳細) | 端末内のノート | 代替PDFに置き換える |
実行結果
「取得」ボタンを押すとアグリゲーションが実行し、物件名称に部分一致したpropertyPhotoタグインスタンスの写真と画像をそれぞれのフォーム部品に挿入する。
図面ユニットとは、対象物を水平面上から見た投影図のことである。GEMBA Noteでは、図面ユニットを使用して、画像ファイルやPDFファイル上にプロットされた対象物を表現する。各対象物の意味は、ピンマークの属性(形状、色、サイズなど)によって分類することができる。例えば、地図画像上に不動産物件をプロットする場合、タイプや価格帯などによってピンマークの形状を変化させることによって、一目で区別することが可能である。
ここでは不動産物件の位置を図面ユニット上に配置する手順について例を用いて解説する。利用する図面は再利用できるように開発パッケージに登録する。
建設現場での機材や設備の場所、不動産物件の位置など2次元上の情報を画像やPDFへプロットするようなアプリケーションを開発するには、次のコンポーネントが必要となる。
表5-9 図面に関わるアプリに必要なコンポーネント
| 構成要素 | 説明 |
|---|---|
| 図面ユニット | 図面を取り扱うGEMBA NoteのUI部品 |
| 図面画像ファイル | 図面ユニットに添付する地図や配置図など画像やPDFファイル |
| タグスキーマ | 図面上に配置する対象物を表現するもの |
| アグリゲーション検索条件 | 対象物を集約するアグリゲーション |
開発パッケージを長押しor右クリックし、コンテキストメニューの 操作 > 図面一覧 を選択する。
取り込んだ画像へ縮尺情報を設定する手順を示す。
上記図の「変換表」をクリックすると、ピンマークの属性値とタグプロパティの値との関係を定義するダイアログが現れる。下の表はピンマークの属性とその値が取りうる値を示す。
表5-10 変換表
| ピンマーク属性 | 属性値(範囲) |
|---|---|
| 位置(JSON) | { “la”:<緯度の値>, “lo”:<経度の値>} |
| 色 | blue/red/magenta/green/cyan/yellow |
| 形状 | circle/pin/cross/triangle/square/star |
| 大きさ | 10~90 |
| 緯度 | 緯度の最小値と最大値 |
| 経度 | 経度の最小値と最大値 |
| x座標 | 0~画像の横幅 |
| y座標 | 0~画像の縦の長さ |
| 有無 | 即値 |
例えば、形状 を選択して、不動産物件に関わるピンマークの形と物件タイプの関連について連想配列を用いて定義する。
表5-11 変換表の例
| ピンマーク属性 | 変換方法 | 設定 |
|---|---|---|
| 形状 | 連想配列 | アパート→circle, オフィス→pin, 土地→square, 一戸建て→star, その他→triangle |
| その他 | - | 無変換 |
ピンの形が円形であれば「アパート」、星であれば「一戸建て」という意味をもつことになる。
ピンマークの属性とアグリゲーション結果、つまり結果タグスキーマとの関係を定義する。
下の設定は、結果タグスキーマのタグプロパティxとyはピンマークの緯度と経度、Typeは形状、Nameはラベルに反映されることを意味する。
ここまで作業を終えると、完了 や 閉じる ボタンをクリックして、新規図面を保存し、図面一覧から抜ける。
図面ユニット上に対象物を配置するには、入力UIとなるフォームとそのタグスキーマを定義する必要がある。次の例は、不動産物件フォームを拡張して、写真、PDF、位置情報を追加したフォームとそのタグスキーマの例である。
フォームから入力したデータから図面上にピンマークをプロットするには、最低XY座標(緯度と経度)がタグスキーマに存在する必要がある。前で定義した「変換表」とここで定義するタグスキーマの関係を示す。
あるタグスキーマから生成されるタグインスタンスを収集し、図面ユニット上に位置などを配置するにはアグリゲーション検索条件を定義する。ここは上記物件詳細向けタグスキーマを用いたアグリゲーションの定義例である。同じノート内に検索対象となる物件詳細フォームが含まれていると仮定する。
表5-12 アグリゲーションの定義例
| 定義項目 | 記述内容 |
|---|---|
| 設定ID | getPropertyLocations |
| 日本語表記 | 物件位置を取得 |
| 結果タグスキーマ | propertyDetails(物件詳細) |
| 検索パラメータ | なし |
| コネクタ | 次に定義する |
| SQL | SELECT * FROM PROPERTY_DETAILS |
表5-13 コネクタの定義例
| 定義項目 | 記述内容 |
|---|---|
| 抽出テーブル名 | PROPERTY_DETAILS |
| タイプ | NoteTagDB |
| タグ検索条件 | propertyDetailsタグスキーマを検索する、その他条件はなし |
| コネクタ固有の設定 | 特になし |
ここまでで図面ユニットの設定は終了である。図面上で検索条件を実行する手順は、動作確認も兼て次節で述べる。
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | バイナリデータの利用 | 物件画像フォーム | 転記 | フォーム |
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | バイナリデータの利用 | 物件地図 | 集約 | 図面 |


この章では、GEMBA Noteが外部システムとどのように情報をやりとりするのかサンプルを動作させながら学習する。
GEMBA Noteのノートやページからフォーム部品や表の内容をCSVファイルとして出力することができる。
ノートを開かない状態
表6-1 ノートを開かないでCSVファイル保存
| # | 対象 | 操作 |
|---|---|---|
| 1 | フォルダ | 長押し/右クリックしてコンテキストメニューから CSV出力 を選択 |
| 2 | ノート | 同上 |
「CSV出力設定」ダイアログが現れ、出力対象の「タグ検索条件」を選択、出力オプションを設定し、完了 ボタンを押してファイルを保存する。
ノートを開いた状態
表6-2 ノートを開いてCSVファイル保存
| # | 対象 | 操作 |
|---|---|---|
| 3 | ページ | ナビゲーションメニュー上の |
| 4 | 表 | 表の上を長押し/右クリックしてコンテキストメニューから 送る を選択、アプリケーションにCSVを送る あるいは CSVをファイルに保存する を選択する。 |
ページ上にボタン部品を配置して、以下のような設定にすればナビゲーションメニューからの操作を短縮することができる。
表6-3 CSVファイル保存するボタンの定義例
| ラベル | コマンド | 形式 | 出力対象 |
|---|---|---|---|
| CSV保存 | ストレージに送る | CSV | フォーム部品・表、タグ、アグリゲーション |
出力対象物(#1~6)とその出力結果は次の通り。
表6-4 CSV出力の形式
| # | 出力対象 | 出力形式 |
|---|---|---|
| 1 | フォルダ | タグ検索条件で指定したタグスキーマのタグプロパティ値が行として並ぶ |
| 2 | ノート | 同上 |
| 3 | フォーム部品・表 | ページの上から下、左から右の順序でフォーム部品と表の値が1列に並ぶ |
| 4 | タグ | タグ検索条件で指定したタグスキーマのタグプロパティ値が行として並ぶ |
| 5 | 表 | 表そのままの順序でヘッダーと値が各行ごとに並ぶ |
| 6 | アグリゲーション | アグリゲーション検索条件の結果タグスキーマの仕様に従う |
画像はBase64形式(DataURL宣言付き)の文字列として出力される。
画像出力例:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2w...
GEMBA Noteに表計算ソフトや外部システムからのCSVファイルをインポートして、フォームを生成する手順について説明する。
取り込むCSVファイルの形式は次の表の通りである。
表6-5 CSVファイル形式
| 項目 | 説明 |
|---|---|
| エンコーディング | UTF-8 |
| 改行コード | CRLF |
| ヘッダ行 | 1行目にプロパティIDを記述 |
| レコード行 | 2行目以降は、論理型は TRUE もしくは FALSE、日付型は YYYY-MM-DD、日時型は YYYY-MM-DDThh:mm:ss、画像はBase64文字列 |

カスタムURLスキームは、myapp://… のように独自のURLスキームを利用してアプリを直接起動させるURLである。
GEMBA Noteも製品ごとに独自のスキームを介して外部システムから製品を起動し、指定したテンプレートからノートを作成、あるいは指定した帳票を開いてデータを受送信する仕組みである。
カスタムURL起動は、外部システムから下記形式のURLを発行することにより実行する。
[スキーム名]:///[エンドポイント]?[パラメータ...]
表6-6 MetaMoJi製品とバージョン別スキーム名
| 製品 | V6 スキーム名 | V7 スキーム名 |
|---|---|---|
| eYACHO for Business | eyachoch6 | eyachoch7 |
| eYACHO Viewer | eyachoch6s | eyachoch7s |
| GEMBA Note for Business | gembanotech6 | gembanotech7 |
| GEMBA Note Viewer | gembanotech6s | gembanotech7s |
表6-7 エンドポイントとアクション
| エンドポイント | アクション |
|---|---|
| /nsk/new | ノートを作成する |
| /nsk/open | ノートを開く |
| /nsk/token | アクセストークンを渡す |
カスタムURL起動の例
eyachoch6:///nsk/new?... // eYACHO for Business 6 を起動してノートを作成
gembanotech6s:///nsk/open?... // GEMBA Note Viewer 6を起動してノートを開く
eyachoch7s:///nsk/new?... // eYACHO Viewer 7 を起動してノートを作成
gembanotech7:///nsk/open?... // GEMBA Note for Business 7を起動してノートを開く
カスタムURLに指定するパラメータはエンドポイントごとに異なる。
表6-8 カスタムURLのパラメータ
| パラメータ | /nsk/new | /nsk/open | /nsk/token | 説明 |
|---|---|---|---|---|
| access_id | 必須 | 必須 | 必須 | アクセストークンを保存するためのキー |
| access_token | 必須 | 必須 | 必須 | サーバーにアクセスするための認証トークン |
| template_id | 必須 | - | - | 新規作成する帳票のノートテンプレートID |
| page_template_id | Option | Option | - | レコードセットを流し込む用紙テンプレートのID |
| folder_uri | 必須 | - | - | 新規作成する帳票の保存先フォルダURL |
| internal_id | 必須 | - | - | 新規作成したノートと関連付けするシステム側の識別ID |
| note_new_uri | 必須 | - | - | 新規作成したノートURLの送信先APIエンドポイント |
| note_uri | - | 必須 | - | 開くノートのURL(note_new_uriで取得したノートURL等) |
| supply_info_uri | Option | Option | - | 追加パラメータを取得するシステム側のURL |
| recordset_uri | Option | Option | - | レコードセットを取得するシステム側のAPIエンドポイント |
| tag_namespace | Option | Option | - | レコードを反映するタグのタグネームスペース |
新規に作成するノートのひな型になるテンプレートは、template_id パラメータに指定する。 そのIDは次の手順で取得する。
作成するノートに追加するページのひな型となるテンプレートは、page_template_id パラメータに指定する。そのIDは次の手順で取得する。
作成したノートを保存するフォルダを folder_uri パラメータに指定する。 このURIを取得するため、対象フォルダを右クリックあるいは長押しし、コンテキストメニューの中から URL を選択する。
ページ生成時に対象となるタグスキーマの名前空間は、tag_namespace パラメータに指定する。 それを取得手順は次の通りである。
重要事項
REST APIは、Webアプリケーションやサービスが、インターネットを介して情報を共有したり操作したりするための手続きである。
REST APIが提供する機能を利用するには、フォーム部品であるボタンからボタンコマンド「サーバーに送信」、あるいはアグリゲーション検索条件でRESTコネクタからアクセスする2つの方法がある。
RESTサーバーにデータを送信する場合、ボタンコマンド「サーバーに送信」を用いて、アクセスするサーバーのエンドポイント(URL)、出力対象(PDF、タグ、タグ検索結果、アグリゲーション結果)を指定する。
出力対象を「タグ」に指定した場合、出力内容に画像やPDFの参照型のタグプロパティがある場合は、「参照先をデータとして出力する」を有効化する。
RESTサーバーにアクセスして、外部システムからデータを取得する場合は、アグリゲーション検索条件を定義する。コネクタのタイプは「REST」を用いる。
コネクタ定義例 (サンプル6-4に用いられている例)
| 定義項目 | 記述内容 |
|---|---|
| 抽出テーブル名 | PROPERTY |
| タイプ | REST |
| URL | http://localhost:8000/get/json |
| 認証設定 | なし |
| METHOD | GET |
| BODY | なし |
METHODへはRESTサーバーが提供するAPIに合わせてGET または POST を指定する。パラメータも設定可能であり、形式はtext/plainやapplication/jsonをリクエストBODYに指定することができる。
ボタンコマンド「サーバーに送信」やRESTコネクタから送信されるパラメータはRESTサーバーのGETメソッド、POSTメソッドにて受け取る。
次はPython FastAPI(https://fastapi.tiangolo.com/)、Node.jsのExpress(https://expressjs.com/)というフレームワークを用いてRESTサーバーを実装するときに定義するGETとPOST関数を抽象的に定義した例である。
Python GETメソッド
@app.get(<エンドポイント>)
def <関数名(request: Request):
# 変数requestの中にGEMBA Noteから送信されたキーとその値が含まれる
<パラメータ値> = request.query_params.get(<パラメータ>)Node.js GETメソッド
import express from 'express';
const router = express.Router();
router.get(<エンドポイント>, function(req, res) {
// 変数reqの中にGEMBA Noteから送信されたキーとその値が含まれる
let <パラメータ値> = req.query.<パラメータ>;Python POSTメソッド
@app.post(<エンドポイント>)
def <関数名>(jsonData: dict):
# 変数jsonDataの中にGEMBA Noteから送信されたキーとその値が含まれる
<パラメータ値> = jsonData[<パラメータ>]Node.js POSTメソッド
import express from 'express';
const router = express.Router();
router.post(<エンドポイント>, function(req, res) {
// 変数reqの中にGEMBA Noteから送信されたキーとその値が含まれる
let <パラメータ値> = req.body.<パラメータ>;RESTサーバーが提供するREST APIエンドポイントは、ボタンコマンド「サーバーに送信」やRESTコネクタが受け取ることのできる定型的なJSON構造を返却しなければならない。
「サーバーに送信」への出力構造
「サーバーに送信」の処理結果は、GEMBA Noteが処理結果のメッセージをダイアログ上で提示するため、次のシンプルなJSONデータを返却する。
{
'message': <メッセージ>
}RESTコネクタへの出力構造
{
'keys': ['key1', 'key2', ... 'keyN'], # recordsの中で用いるキーの一覧
'records': [
{'key1': value-11, 'key2': value-21, ... 'keyN': value-N1},
{'key1': value-12, 'key2': value-22, ... 'keyN': value-N2},
...,
{'key1': value-1m, 'key2': value-2m, ... 'keyN': value-Nm},
],
'message': エラーメッセージ or null(success)
}eYACHO および GEMBA NoteのWindows Storeアプリは、初期設定ではlocalhostに接続できない。localhostへの接続を許可するには、対象製品ごとにループバックを有効化する。
有効化は、管理者モード で起動したコマンドプロンプトを用いて実行する。
Version 6
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.eYACHOforBusiness6_dprdgbsyk6pqcVersion 7
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.eYACHOforBusiness7_dprdgbsyk6pqcVersion 6
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.eYACHOViewer6_dprdgbsyk6pqcVersion 7
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.eYACHOViewer7_dprdgbsyk6pqcVersion 6
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.GEMBANoteforBusiness6_dprdgbsyk6pqcVersion 7
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.GEMBANoteforBusiness7_dprdgbsyk6pqcVersion 6
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.GEMBANoteViewer6_dprdgbsyk6pqcVersion 7
> CheckNetIsolation.exe LoopbackExempt -a -n=MetaMoJiCorporation.GEMBANoteViewer7_dprdgbsyk6pqc※Windowsの設定で開発者用モードをONにしている場合など、環境によってはコマンドの実行が必要ない場合がある。
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | データ連携 | CSVデータ出力 | 集約 | CSV |
フォーム部品・表からCSV保存 ボタンをクリックする
保存先をファイラーで聞かれるので、適当な場所を指定してCSVファイルを保存する。
アグリゲーション結果をCSV保存 ボタンをクリックする。
保存先をファイラーで聞かれるので、適当な場所を指定してCSVファイルを保存する。
保存したCSVファイルをテキストエディタあるいは表計算ソフトで開き、内容を確認する。
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | データ連携 | CSVデータ取り込み | - | - |

不動産管理アプリで教材として用いた物件フォームをカスタムURLスキーマから作成するWebサーバーのサンプルプログラム(python)はGitHub上に公開している。
GitHub URL: https://github.com/mmj-ajiki/cuscheme-property-manager
サーバーを起動して、該当するURLにWebブラウザからアクセスするとトップページが現れる。
それぞれのリンクをクリックすると、eYACHOあるいはGEMBA Noteを起動するように促され(起動する製品はスキーム名に依存する)、ノートとフォーム(ページ)が生成される。
動作を確認するRESTサーバーは、GEMBA Noteから送信されてきたJSONデータ、画像データ、PDFデータをファイルとして保存するAPIを提供する。READMEファイルを確認してサーバーを起動する。
GitHub URL: https://github.com/mmj-ajiki/rest-file-transfer-py
送信テストを行った後で、受信テストを行う。
注意事項
次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | データ連携 | RESTサーバーへ送信 | - | - |
JSONファイルをアップロードする

画像・PDFファイルをアップロードする

次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | データ連携 | RESTサーバーから取得 | 集約 | 表 |
保存されたJSONファイルの内容を取得する(その1)

保存されたJSONファイルの内容を取得する(その2)

ソフトウェアのテストとは、開発したソフトウェアが想定どおりに動作するかを評価・検証することである。開発したソフトウェアが、仕様書で求められている仕様どおりに機能するかどうかをチェックする。
この章では、GEMBA Note上で開発したアプリケーションに対する試験の1つの手法について述べる。
ソフトウェアの試験は、一般的に、単体テスト、結合テスト、システムテスト、そして受け入れテストのフェーズで実施する。開発したGEMBA Noteアプリもこの流れで試験を実施するが、受け入れテストは本番稼働直前の最終テストであり、納入先で試験することと捉え、ここでは述べない。
単体テストとは、モジュール単位でプログラムが正しく動作するか検証するテストである。GEMBA Noteでは、実装したフォーム、アイテムごとに構成されるフォーム部品の入力を試みる。入力形式や条件が仕様と合致しているか、ボタンアクションは正しく挙動しているか、カスケードメニューの項目は正しいか、また極限値の入力や設定をしてみる。開発パッケージ内でテストを行う。
通常ノートではなくシェアノートとしてフォームを運用する場合、次の項目をチェックする。
現時点では、Android版には開発オプションがないので、Android上でのテストは割愛する。
結合テストとは、モジュールを結合させた状態で正しく動作するか検証するテストである。GEMBA Noteでは、フォームが他のフォームやアイテムと連動している場合(例えば、他ページや別ノートからの転記)、正しくデータの受け渡しが行われているか、データが存在しない場合、極限値が入っている時どうなるか組み合わせて動作を確認する。開発パッケージ内でテストを行う。
シェアノートとしてフォームを運用する場合、開いたシェアノートが存在すると集計漏れが発生するため、シェアノートを全て閉じた後、アグリゲーション検索実行が期待通りの結果を提示するか確認する。
現時点では、Android版には開発オプションがないので、Android上でのテストは割愛する。
開発パッケージ内での単体テストと結合テストが終わったのち、テスト用チームフォルダとテストユーザーを準備して、開発パッケージを配置する。そのチームフォルダ内でパッケージが利用できるように設定して、動作を確認する。
全社利用が必要であれば、全社配信を試み、個人フォルダ上でも動作するか確認する。もし社外ユーザーにも公開するのであれば、一般ユーザーアカウントに加えて社外ユーザーアカウントでも試験を実施する。
確認は単体テストと結合テストで行った試験項目を対象とする。ここでの重要事項は、アプリの機能としてユーザー属性、チーム属性に関係する条件がフォームあるいはアイテムに設定されている場合の挙動を確かめる。
単体テスト、結合テストで確認する試験項目は、まずフォームやアイテムを設計したときの入力部品を列挙する。例えば、不動産管理アプリの場合、フォームを構成するページの体裁とフォーム部品は次のように仕様設計されている(「付録1:不動産管理アプリ仕様書」を参照のこと)。
表7-1 フォームの体裁
| 定義項目 | 記述内容 |
|---|---|
| フォーム名称 | 物件フォーム |
| 種類 | 横向き |
| サイズ | はがき |
| 背景 | 薄緑 |
| 縮尺 | 設定なし |
表7-2 フォーム部品の仕様
| 見出し | フォーム部品 | 詳細設定 |
|---|---|---|
| 名称 | 1行テキスト | 初期設定のまま |
| 物件タイプ | 1行テキスト | アパート、一戸建て、土地、オフィス、その他が選択候補 |
| 価格 | 数値 | 3桁区切り、円を付与 |
| 住所 | テキスト | 4行程度を記入できる |
試験では「詳細設定」を期待値と見なし、実際に正しく設定されているか、アプリケーションを動作して確認する。
試験項目の自動抽出
Markdown形式で記述された仕様書ファイルからテスト項目となる箇所を抽出して、テスト仕様書を生成する。
このツールは。以下のGitHubリポジトリから取得する。
https://github.com/mmj-ajiki/md2testspec
起動方法は次の通り。
Windowsの場合
> md2testspec.bat <仕様書ファイル名>.mdLinux/macOSの場合
> ./md2testspec.sh <仕様書ファイル名>.md出力は、<仕様書ファイル名>_testspec.md という名前で出力される。
試験項目箇所の指定
試験項目の抽出を開始する箇所(見出し)には、Markdownの拡張記法{.testitems}を付与する。
###見出し {.testitems}試験項目取得の終了は、次の見出しまでとする。取得する内容に表が含まれている場合、仕様定義と見なし、項目番号、テスト結果、そしてメモの列を自動的に追加する。
表7-3 元の表の例
| 見出し | プレースホルダ | フォーム部品 | 詳細設定 |
|---|---|---|---|
| 名称 | 物件の名前を記入 | 1行テキスト | 初期設定のまま |
| 物件タイプ | 物件のタイプを選択 | 1行テキスト | アパート、一戸建て、土地、オフィス、その他、から選択 |
| 価格 | 価格を入力 | 数値 | 3桁区切り、円を付与 |
| 住所 | 住所を入力 | テキスト | 4行程度を記入できる |
表7-4 抽出後の表の例
# |
見出し | プレースホルダ | フォーム部品 | 詳細設定 | テスト結果 |
メモ |
|---|---|---|---|---|---|---|
| 1 | 名称 | 物件の名前を記入 | 1行テキスト | 初期設定のまま | OK, NG or Attn | - |
| 2 | 物件タイプ | 物件のタイプを選択 | 1行テキスト | アパート、一戸建て、土地、オフィス、その他、から選択 | OK, NG or Attn | - |
| 3 | 価格 | 価格を入力 | 数値 | 3桁区切り、円を付与 | OK, NG or Attn | - |
| 4 | 住所 | 住所を入力 | テキスト | 4行程度を記入できる | OK, NG or Attn | - |
試験項目を組み合わせて試験を実施するとき、項目数が多くなればなるほど組み合わせの数が増大する。組み合わせの数を合理的に削減するため、「ペアワイズ法」を用いる。
ペアワイズ法は、ソフトウェアのバグの多くが1つまたは2つの因子の組み合わせによって発生している、という事実に基づいて、実験計画法を用いてテストケースを生成する方法である。
テストケースの組み合わせを表現する際に以下のような用語を用いる。
例えば、1因子当たり2個(例えば、TRUE/FALSE)の水準があるとき、因子が10個あれば、すべての水準の組み合わせは、2^10 = 1024個になる。
ペアワイズ法は、すべての因子の組み合わせでなく、 2組の因子(強さ2) における水準の組み合わせをすべて網羅することによってテストケースを削減する手法である。
PICTは、Microsoftが公開しているペアワイズ法によってテストケースを生成するためのオープンソース・ソフトウェアである。そのインストール方法と使い方を説明する。
Windowsの場合:
pict.exeを https://github.com/microsoft/pict/releases/からダウンロードし、コマンドプロンプトから実行できる適当なフォルダに配置する。
Linux/macOSの場合:
makeとg++がインストールされていることを前提とする。Pictのソースコードからmakeを使ってビルドを行う。
> git clone https://github.com/Microsoft/pict.git
> cd pict/
> make
> sudo install -m 0755 pict /usr/local/bin/pictPICTを実行するには、因子となる試験項目と取りうる値をテキストファイルに記述する。
因子a: 値a1, 値a2, 値a3, ... 値aN
因子b: 値b1, 値b2, 値b3, ... 値bN
...
因子z: 値z1, 値z2, 値z3, ... 値zNcontents/pictフォルダに置いてある testCase.txt を用いてPICTを実行してみる。
全ての組み合わせを抽出:
> pict testCase.txt /s /o:4
Combinations: 136
Generated tests:136
Generation time:0:00:00テストケースは136通りである。 ※因子の数が3以下であると、エラーが発生する。
ペアワイズ法で抽出:
> pict testCase.txt /s /o:2
Combinations: 114
Generated tests:34
Generation time:0:00:00テストケース数は34と削減される。
テストケースを出力:
> pict testCase.txt /o:2因子(試験項目)とそれが取りうる値の組み合わせを提示する。この組み合わせに従って試験を実施する。この出力内容は、付録2:PICT出力例を参照のこと。
ここではGEMBA Noteアプリの試験を実施して、結果を報告するまでの手順について述べる。
7-2節で説明した試験項目抽出ツールは、生成したMarkdown形式の試験項目ファイルの前に序論、目的、テスト環境など、後ろにテスト判定とコメントの見出しを追加して1つのテスト仕様書を生成する。内容を記入してテスト仕様書を完成させる。試験因子の組み合わせごとに、仕様書のコピーを準備する。
テスト仕様書のヘッダの内容
# 〇〇テスト仕様書
## 序論(はじめに)
### 目的
### テスト期間
### 注意事項など
## テスト環境について
### 試験対象機材とOSバージョン
### テスト用アカウント
### テストデータの準備・作成方法など
テスト仕様書のフッタの内容
## テスト判定
### テスト結果
| 試験日 | 試験担当者 | OK | NG | Attn |
| --- | --- | --- | --- | --- |
| YYYY-MM-DD | - | - | - | - |
### 判定結果
合格/不合格
### コメント
テストを開始するにあたって必要なユーザーアカウント、機材(iPad, iPhone, Androidデバイス、Windows PCやタブレット)、テストに用いるデータの内容を明確にする。
テスト仕様書のテスト項目を1つ1つ確認する。期待値通りの設定あるいは動作であれば、テスト結果にOK、動作しなければNG、何かしら疑問や懸念があれば、Attn (Attention)と記述し、メモ欄にその内容用を記述する。
テスト仕様書の最後にテスト判定の結果とコメントを記入する。
表7-5 テストの判定記入事項
| 見出し | 説明 |
|---|---|
| 試験日 | 試験を実施した日付 |
| 試験担当者 | 試験を実施した人の姓名 |
| OK | OKの数 |
| NG | NGの数 |
| Attn | Attentionの数 |
表7-6 テストの判定記入例
| 試験日 | 試験担当者 | OK | NG | Attn |
|---|---|---|---|---|
| 2024-12-23 | 徳島花子 | 123 | 13 | 7 |
このドキュメントは、不動産物件を取り扱うアプリケーションの機能と実現するための構成要素とその定義を詳細に記述する。なお本書はMarkdown形式で作成する文書の例でもあり、そのソースファイルはこちらからダウンロードできる。
実現するアプリケーションは「不動産物件アプリケーション」と呼ぶ。これ以降は「物件アプリ」と呼ぶ。eYACHOあるいはGEMBA Note上で動作する。物件アプリは不動産物件を管理するための簡易的な機能を2つ提供する。
eYACHOあるいはGEMBA Noteの開発パッケージ(不動産管理パッケージ)として運用可能とし、ユーザーに配信する。
第2章では物件アプリのシステム構成と機能概要を述べ、第3章でそれぞれの機能を詳細に説明し、実装するための構成要素の定義を行う。
物件アプリの構成図を示す。
ローカル環境の説明:
サーバー環境の説明:
| 機能番号 | 機能名 | 概要 |
|---|---|---|
| 1 | 物件情報登録 | 物件の名称、種別、価格、住所を登録する |
| 2 | 物件情報表示 | 登録された物件を収集し、種別ごとに一覧表示する |
将来的に、不動産物件を所有し、利用する不動産関係者が利用できるようにする。そのため、価格、住所だけではなく、地図上の位置、間取り、設備などを情報として追加していく必要がある。
不動産物件情報を1つ登録するための帳票の仕様を定義する。
| 定義項目 | 記述内容 |
|---|---|
| フォーム名称 | 物件フォーム |
| 種類 | 横向き |
| サイズ | はがき |
| 背景 | 薄緑![]() |
| 縮尺 | 設定なし |
| 見出し | プレースホルダ | フォーム部品 | 詳細設定 |
|---|---|---|---|
| 名称 | 物件の名前を記入 | 1行テキスト | 初期設定のまま |
| 物件タイプ | 物件のタイプを選択 | 1行テキスト | アパート、一戸建て、土地、オフィス、その他、から選択 |
| 価格 | 価格を入力 | 数値 | 3桁区切り、円を付与 |
| 住所 | 住所を入力 | テキスト | 4行程度を記入できる |
物件フォーム上の見出しと部品の配置は次の図のようにする。
ノートテンプレートの定義:
| 定義項目 | 記述内容 |
|---|---|
| テンプレート名 | 物件フォーム |
| タイトルルール | 物件フォーム 日時 ユーザー名 |
| パスワード | なし |
| ヘッダ | なし |
| フッタ | なし |
| カスタム設定 | 3-1-5で定義 |
| 表示倍率を図面幅で固定 | オフ |
| シェアノートテンプレート | オフ |
用紙テンプレートの定義:
| 定義項目 | 記述内容 |
|---|---|
| テンプレート名 | 物件シート |
| フォーム名 | 物件フォーム |
| 定義項目 | 記述内容 |
|---|---|
| 左メニュー | note_drive_menu_comb, add_menu |
| 中央モード | view_mode, select_mode |
| 右メニュー | sync_doc_right_now, undo, redo, undo_redo_comb |
| ページタブ | page_list_show_hide, gemba_page_mode, page_backw, page_forw |
タグスキーマの定義:
| タグID | 日本語表示名 | 設定箇所 |
|---|---|---|
| Property | 物件 | ページ |
| プロパティID | 日本語表示名 | データの型 |
|---|---|---|
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
フォーム部品とタグプロパティのリンク:
| 見出し/プレースホルダ | タグプロパティID |
|---|---|
| 名称 | Name |
| 物件タイプ | Type |
| 価格 | Price |
| 住所 | Address |
登録した物件情報を一覧表示する。表示する項目は機能1の入力項目すべてである。 さらにタイプで絞り込んで表示する。
| 定義項目 | 記述内容 |
|---|---|
| 設定ID | propertyListWithType |
| 日本語表記 | タイプ別 物件一覧 |
| 結果タグスキーマ | Property(物件) |
| 検索パラメータ | TYPE |
| コネクタ | 3-2-3節で定義する |
| SQL | 検索パラメータと物件タイプが合致する物件データを一覧表示する。価格が高いものから表示する。 |
| 定義項目 | 記述内容 |
|---|---|
| パラメータID | TYPE |
| 日本語表記 | 物件タイプ |
| パラメータ型 | 文字列 |
| 初期値 | アパート |
| 選択肢 | なし |
| UIタイプ | 指定しない |
| 定義項目 | 記述内容 |
|---|---|
| 抽出テーブル名 | P_TABLE |
| タイプ | LocalTagDB |
| タグ検索条件 | Propertyタグスキーマを検索する、その他条件はなし |
| 検索対象のパス | /context/ |
| コネクタ固有の設定 | 特になし |
アグリゲーションはページ上に配置したフォーム部品2つから実行する。そのイメージは次の通り。
| 見出し | 起動箇所 | 実行内容 | 処理パターン | 出力パターン |
|---|---|---|---|---|
| 物件タイプ | 1行テキスト | アパート、一戸建て、土地、オフィス、その他、から選択 | 集約 | リスト |
| 最新に更新 | ボタン | 選択した物件タイプで物件データを絞り込み、名前、物件タイプ、価格、住所を表にして出力 | 集約 | 表 |
物件データ数が1,000をこえても1秒以内に一覧表示がされる(仮)。
| 運用項目 | 内容 |
|---|---|
| 想定するユーザー数 | 社内ユーザー:150、システム管理者:1、パッケージ開発者:2 |
| 利用場所 | 不動産販売物件箇所 |
| 利用タイミング | 現地到着後に起動する |
| フォルダ構成 | 下記「フォルダ構成」を参照 |
| ノート構成 | 1ノートは各ユーザーが担当する物件ページから構成される。四半期おきに新規物件を含めた新たなノートを作成する。 |
| データ増減量 | 1ユーザ四半期あたり1ノートを作成 |
| オフライン運用 | なし |
| シェアの利用方法 | 現地からGEMBA Talkで事業本部担当と接続 |
| 障害発生時の対応手順 | 各ユーザー → パッケージ開発ユーザーへメールで報告 |
| 開発パッケージの管理方法 | 下記「開発パッケージ管理項目」を参照 |
フォルダ構成
チームフォルダ
|-- ビル事業本部
| |-- 法人営業1部
| |-- 法人営業2部
| |-- 法人営業3部
| |-- 海外事務所統括部
| |-- 事業推進部
|
|-- 住宅分譲事業本部
| |-- 営業部
| |-- 事業企画部
| |-- 事業推進部
| |-- マンション管理部
|
|-- 都市開発事業本部
| |-- 営業部
| |-- 事業企画推進部開発パッケージ管理項目
| 管理項目 | 内容 |
|---|---|
| パッケージ名称 | 不動産管理マスター |
| バージョン管理 | 3つの数字で表現する:メジャー/マイナー/ロット |
| バージョン更新基準 | ロット:不具合対応と細かな修正、マイナー:四半期毎のまとまった機能追加と修正、メジャー:大規模機能が追加されるときに検討 |
| パッケージパラメータ | なし |
| 共同編集者 | 武田信代、上杉謙三 |
本アプリケーションを開発するにあたって、参考にしたドキュメントは次の通りである。
7.3節で用いたサンプルのテストケースファイルをPICTに与えた時に出力された内容である。
| ファイル | 内容物の説明 |
|---|---|
| testCase | PICT用テストケースサンプル |
OS 製品 配置フォルダ ユーザー
iOS 14 eYACHO 個人 社外ユーザー
iOS 12 GEMBA Note チーム 社外ユーザー
iOS 18 eYACHO チーム 社員
Android 13 GEMBA Note 個人 社外ユーザー
Windows 11 eYACHO 個人 社員
Android 14 GEMBA Note 個人 社員
Android 10 GEMBA Note チーム 社外ユーザー
Windows 11 GEMBA Note チーム 社外ユーザー
Windows 10 eYACHO 個人 社外ユーザー
Android 15 GEMBA Note 個人 社外ユーザー
iOS 14 GEMBA Note チーム 社員
Android 11 eYACHO チーム 社外ユーザー
iOS 15 eYACHO 個人 社外ユーザー
iOS 18 GEMBA Note 個人 社外ユーザー
Android 12 eYACHO 個人 社員
iOS 10 eYACHO チーム 社員
Android 15 eYACHO チーム 社員
Android 13 eYACHO チーム 社員
iOS 11 GEMBA Note チーム 社員
iOS 16 eYACHO チーム 社員
iOS 16 GEMBA Note 個人 社外ユーザー
iOS 13 eYACHO チーム 社員
iOS 17 GEMBA Note 個人 社員
Android 12 GEMBA Note チーム 社外ユーザー
Android 14 eYACHO チーム 社外ユーザー
Android 11 GEMBA Note 個人 社員
iOS 11 eYACHO 個人 社外ユーザー
Windows 10 GEMBA Note チーム 社員
iOS 17 eYACHO チーム 社外ユーザー
Android 10 eYACHO 個人 社員
iOS 13 GEMBA Note 個人 社外ユーザー
iOS 10 GEMBA Note 個人 社外ユーザー
iOS 15 GEMBA Note チーム 社員
iOS 12 eYACHO 個人 社員
6.4節で利用するサンプルRESTサーバーのソースファイルを公開している場所である。
| リポジトリ名 | 開発言語 | 説明 |
|---|---|---|
| cuscheme-property-manager | Python | カスタムURLスキーマサンプル |
| rest-file-transfer-py | Python | ファイル転送RESTサーバー |
| rest-open-meteo | Node.js | Open-MeteoへアクセスRESTサーバー |
| rest-open-meteo-py | Python | Open-MeteoへアクセスRESTサーバー |
4.4節で述べた生成AIへの要求文についてさらなる例を示す。
質問の意図:日付ごとに物件の名前と訪問者の名前を集計する。
{#物件タグスキーマ}は{#物件タグプロパティ}から構成されます。
{#訪問者カードのタグスキーマ}は{#訪問者カードのタグプロパティ}から構成されます。
物件ページと同じページにある訪問者カードの訪問日ごとに、物件の名称、顧客名を集計するSQLiteのSQLを作成してください。ただし、次の{#条件}に従います。
#条件
・「同じページ」は_pageIdカラムを利用する。
・集約結果は、{#訪問者履歴のタグスキーマ}の{#訪問者履歴のタグプロパティ}のプロパティIDに出力する。
・訪問日の順序でソートする。
#物件タグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Property | 物件 | ページ |
#物件タグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| Name | 名称 | 文字列 |
| Type | 物件タイプ | 文字列 |
| Price | 価格 | 整数 |
| Address | 住所 | 文字列 |
#訪問者カードのタグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| Visitor | 訪問者 | 図形(長方形、線は灰色) |
#訪問者カードのタグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| visitedDate | 訪問日| 日時型 |
| customerName | 顧客名 | 文字列型 |
| phone | 電話番号 | 文字列型 |
#訪問者履歴のタグスキーマ
| タグID | 日本語表示名 | 設定箇所 |
| --- | --- | --- |
| visitorHistory | 訪問者履歴 | - |
#訪問者履歴のタグプロパティ
| プロパティID | 日本語表示名 | データの型 |
| --- | --- | --- |
| visitedDate | 日付 | 日時型 |
| propertyName | 物件名称 | 文字列型 |
| visitorName | 訪問者名 | 文字列型 |
生成されたSQL:
SELECT
v.visitedDate AS visitedDate,
p.Name AS propertyName,
v.customerName AS visitorName
FROM Visitor v
JOIN Property p ON v._pageId = p._pageId
ORDER BY v.visitedDate;着目点:
実際にアグリゲーションの動作を確認するため、次のノートを開く。
| パッケージ | フォルダ | ノート | 処理パターン | 出力パターン |
|---|---|---|---|---|
| アプリ開発実践編 | アグリゲーションパターン | 生成AIの利用 | 集約 | 表 |
「訪問者履歴一覧」と書かれたページへ移動し、最新に更新 ボタンをクリックしてみる。
| 日付 | 説明 |
|---|---|
| 2025-10-23 | GEMBA Note V7に伴う見直し |
| 2025-05-27 | 3章に「初期値の設定」を追記 |
| 2025-04-08 | サンプル記載箇所のパッケージへリンク付け、細かな修正 |
| 2025-03-27 | β版 |
| 2025-03-05 | プリβ版 |
| 2025-01-23 | 不動産管理アプリ フォーム編のバックアップファイルを配置 |
| 2024-12-25 | α版 |