講演資料 - InterSystems

Mumps ユーザのための
ユ ザのための
Caché アプリケーション開発
インターシステムズジャパン株式会社
カスタマーサポート部
サポートエンジニア
田中 歩
対象
• Cachéを使用しているが、ルーチンベースのアプリ
Cachéを使用しているが、ルーチンベースのアプリ
ケーションを主に開発されている方
ケ
ションを主に開発されている方
• 他システムからの何らかのアクセス
(ODBC/JDBC/SOAP等
(ODBC/JDBC/SOAP
等)でCaché
Cachéデータへのアクセスが
データへのアクセスが
必要となる//そのようなアプリケーション機能の追加
必要となる
を考えておられる方
1
なぜCachéの機能か?
•
クライアント技術への対応
– .Net
.Net、
Java、
Perl
N t、Java
J 、Perl、
P l、Python
P th ...
– ODBC/JDBC
– ブラウザ
•
クライアントOS
クライアント
OSでサポートされる技術の変化
でサポートされる技術の変化
•
サポート対象外となる技術からの移行
サポ ト対象外となる技術からの移行
相違点/メリット
Caché
設計
ダイレクトアクセス
(Mumps)
グローバル構造
グロ バル構造
構築
ルーチン作成
検証
コマンドラインデバッ
グ
独自テスト作成?
コードのエクスポート XMLでの配布
→インポート?
%Installerパッケージ
独自の監視機能?
ダッシュボード
%Monitor
配置
保守
オブジェクト定義
オブジ クト定義
クラス作成
システムクラスの活用
外部モジュールの活用
スタジオデバッガ
%UnitTest
2
できるところから
• Mumps標準の機能はそのまま
Mumps標準の機能はそのままCaché
Cachéでも使用可能
でも使用可能
– ルーチンはそのまま動作します
ル チンはそのまま動作します
– 各実装固有機能
各実装固有機能(Z*
(Z*コマンド・
コマンド・$Z*
$Z*関数等
関数等))は書き換
えが必要です
• 既存データ(
既存データ(グローバル
グローバル))を外部に公開したい場合に
はマッピング等の手法を使用して旧アクセスと新ア
クセ
クセスの同居が可能です
同居が可能 す
構築
Caché
設計
ダイレクトアクセス
(Mumps)
グローバル構造
グロ バル構造
構築
ルーチン作成
検証
コマンドラインデバッ
グ
独自テスト作成?
コードのエクスポート XMLでの配布
→インポート?
%Installerパッケージ
独自の監視機能?
ダッシュボード
%Monitor
配置
保守
オブジェクト定義
オブジ クト定義
クラス作成
システムクラスの活用
外部モジュールの活用
スタジオデバッガ
%UnitTest
3
オブジェクト指向とは
• オブジェクト指向は、データモデルを考える単なる1
方法 す
つの方法です
• このモデルの考え方は、以下の通りです。
人間の世界を 人間が理解しやすいように
人間の都合でモデル化して
プログラムを作ってしまおう!
以前はどうなっていたか?
ハードウェアが高価で速度も遅くメモリも少なかった時代は、コンピュー
タに合わせ処理しやすいようにプログラムを作っていました。
今はどうか?
ハードウェアも安価になり速度も向上し、使い勝手が良いように変わっ
た現在では、プログラムを作るときに、できることなら人間の現実世界の
ルールをそのまま使えないかと、考えるようになりました。
オブジェクトアクセス
• Cachéのデータは全てグローバル変数として登録されます。
– オブジェクトアクセスであってもダイレクトアクセスと同様にグローバル
変数にデータは格納されます
• オブジェクトアクセス/リレーショナルアクセスでは、ダイレクトアクセスには存
在しないデータ定義が存在します
– グローバル変数の格納情報がクラス定義に隠匿されているので、オブ
ジェクト操作では、グローバル変数を直接操作する文法ではなく、オブ
ジェクト操作用の文法となります
ダイレクトアクセス
リレーショナル
オブジェクト
アクセス
アクセス
(グローバルアクセス)
Cachéのデータエンジン
(多次元データ・エンジン)
4
オブジェクトアクセス(続き)
• データの検索に、$ORDER は使いません
– 検索にはSQL文を利用します
必要な場合は、「カスタムクエリ」を使用して検索ロジック
を独自に作成できます
• インデックスを定義できます
– インデックスをプログラムで更新する必要はありません
– オブジェクトアクセスでは更新操作を行うことで、クラス定
義に用意されたインデ クス定義に従 てデ タとインデ
義に用意されたインデックス定義に従ってデータとインデ
ックスの両方が更新されます
クラスとオブジェクト: クラス
• クラス とは、データ構造とその操作手順であるメソッドをまと
めたオブジェクトの雛型を定義したもの(設計書)です
– プロパティ
どのようなデータを格納するか
– メソッド
どのような処理を行うか
人間
クラスの名前
名前
性別
身長
クラスが持つデータ
誕生日
食べる()
クラスがすること
勉強する()
5
クラスとオブジェクト
ダイレクトアクセスの場合
• データ構造の定義
外部仕様書か
管理用グローバル
などに定義を記述
します
• 動作(ロジック)
ルーチンにグローバルにアクセスするコードを記述します
格納方法・データの検証・インデックスの作成などの処理を作成します
クラスとオブジェクト
オブジェクトアクセスの場合
• クラス定義
プロパティや動作
((コード)をまとめて定
)
義します
プロパティ定義
名前と型と制限
インデックス定義
メソッド(コード)定義
クエリ(検索)定義
6
クラスとオブジェクト
ダイレクトアクセスと比較: プロパティ
データ型パラメータ
格納するデータの「制限」を追加
で指定できます
プロパティ名
$Piece位置では
なく、”名前”でアク
セスします
す
文字型:最小/最大文字数,パターン...
数値型:最小値/最大値...
データ型
どのような形式のデータを格納するかを指定します
単純な文字列/数値型の他に、
ユーザ定義のクラス(型)も使用できます
操作する側の「手順」を信頼するのではなく、操作される側で制限を強制で
きます(整合性の維持)
クラスとオブジェクト
ダイレクトアクセスと比較: メソッド
• オブジェクトの動作(ロジック)を記述するための定義です
– ダイレクトアクセスでのルーチンに相当
– ル
ルーチンと同じように
チンと同じように Cachéオブジ
Cachéオブジェクトスクリプト
クトスクリプト で記述します
• ルーチンとの相違点
– 既定はプロシージャブロックで、変数は他のコードから保護されます
– .Netなど外部アクセス用に公開することができます
7
クラスとオブジェクト
ダイレクトアクセスと比較: クエリ
•
クエリはSQL で記述する検索処理の定義です
– 取り出したい情報
取り出したい情報((プロパティ
プロパティ))
– 条件
– 順序
などを論理的な記述で指定します
•
格納される構造((位置
格納される構造
位置))を意識せずに使用できます
•
使用する手順が共通化できます
クラスとオブジェクト
ダイレクトアクセスと比較: インデックス
インデックス名
インデックス対象データ
(プロパティ)
• 検索速度を向上させるために設定する索引の定義です
– データとインデックスの整合性が維持されます
(ダイレクトアクセスではデータを更新すると合わせ
てインデックスも更新する必要がある)
– インデックスの追加時のデータからのインデックス
構築方法も用意されています
– 追加したインデックスは適応するクエリがあれば使
用されます(コード追加不要)
8
クラスとオブジェクト: オブジェクト
• オブジェクトとは、クラスを基にした実際の値としての
データです。インスタンスとも呼ばれます
ダイレクトアクセスでのイメージ
^Employee(“ID003”)=“日本太郎^東京^03-5321-6200^営業”
識別子(ID)
プロパティ(データ)
ID001
従業員
クラス
ID002
ID003
日本太郎
東京
データの表現方法
• オブジェクトはプロパティ(データ)の塊です。
様々なタイプのデータを表現できるよう、以下の定義
タを表現できるよう、以下の定義
• 様々なタイプのデ
の種類を用意しています。
– 値が1つだけの場合(単一の値)
– 別のオブジェクトを参照(オブジェクト参照)
– 別のオブジェクトを埋め込む(埋め込みオブジェク
ト)
– 値が1つ以上ある(コレクション/リレーションシップ)
– 大容量データ(32K越え文字列/バイナリデータ)
9
データの表現 単一値
Patient
Name
N
単一の値
単 の値
患者(Patient)には、名前が
患者(Patient)には
名前が
あります。名前は、他のオブ
ジェクトとは特に関係を特もた
ない、単一の値です。
データの表現 オブジェクト参照
Patient
Name
PrimaryDoc
参 照
Doctor
Name
Specialty
患者には掛かりつけの医者(PrimaryDoc)がいます。
医者は、患者とは別のDoctorというクラスで表されます。
このような場合、患者の掛かりつけ医者(PrimaryDoc)の情報
は、医者クラス(Doctor)自身を参照し、表現します。
10
データの表現 埋め込み
Patient
Name
PrimaryDoc
Address
Street
City
患者の連絡先(Address)は現住所の他
に、緊急連絡先など人によっていくつか
住所を持つ場合があります。
埋め込み
オブジェクト
患者の住所(Address)情報を、人によっては複数
患者の住所(Add
)情報を 人によ ては複数
持てるように、住所を別のオブジェクトとして表現し
ます。
この住所用オブジェクトを使い、必要に応じて住所
情報を埋め込んで利用する表現方法もあります。
データの表現 複数値(コレクション)
• 前頁までの例では、1つのプロパティに1つの値(また
は、オブジェクト)が登録される単 の値について説
は、オブジェクト)が登録される単一の値について説
明してきました。
– 例) 人の名前、誕生日 など、データが“たった1
つだけ”となるデータ
• 実際のデータでは、1項目に複数値存在するデータ
もあるため Cachéでは以下の2種類の定義方法を提
もあるため、Cachéでは以下の2種類の定義方法を提
供しています。
– リレーションシップ
– コレクション
11
データの表現 リレーションシップ
患者が診察に訪れる回数は1回~複数回と、患
者により異なります。
Patient
Name
診察の回数は、1回~n回であるので、このよう
な関係を表すとき、リレーションシップ、または、
コレクションのプロパティとして表します。
PrimaryDoc
Address
Street
Visit
VisitDate
City
Prescription
1
Visits
*
Patient
データの表現方法 例:コレクシ
ョン
Patient
Name
PrimaryDoc
Address
Street
City
Visit
各コレクションオブジェクト
各 レクシ ンオブジ クト
はVisitクラスにより作成
Visit
VisitDate
Prescription
Patient
12
データ構造の決定
• 新規に作成する (自動設定
自動設定))
– 既存データがない場合
既存デ タがない場合
– %CacheStorage という定義が使用されます
• 既存のグローバル構造にあてはめる
– 既にデータがある場合
– 既存のグローバル構造のデータ位置を各プロパ
既存のグロ バル構造のデ タ位置を各プロパ
ティに対応づける((マッピング
ティに対応づける
マッピング))
– %CacheSQLStorage という定義が使用されます
データ構造 : 自動設定
• プロパティ/
プロパティ/インデックスを定義し、構造はシステムが
生成する既定の構造を使用します
• $List
$List構造で順にプロパティの値が格納されます
構造で順にプロパティの値が格納されます
• スタジオで生成されたストレージ構造を確認/
スタジオで生成されたストレージ構造を確認/変更で
きます
13
データ構造 : グローバルマッピング
• 既存のグローバル構造に合わせてクラスのデータ
格納((参照
格納
参照))方法を定義できます
– ストレージエディタを使用します
設計 – クライアントサイド
• シンクライアント
– 旧COM(ActiveX)
COM(A
COM(ActiveX)技術から
ti X)技術から
X)技術から.net
技術から.netネイティブに
tネイティブに
– サーバ
サーバ//クライアント 64bit
64bit化
化 対応 (COM
(COMは
は32bit
32bitの
の
み)
• ブラウザベース
– WebLink/Developer
p
– CSP
– Zen
14
構築
Caché
設計
ダイレクトアクセス
(Mumps)
グローバル構造
グ
バル構造
構築
ルーチン作成
検証
コマンドラインデバッ
グ
独自テスト作成?
コードのエクスポート XMLでの配布
→インポート?
%Installerパッケージ
独自の監視機能?
ダッシュボード
%Monitor
配置
保守
オブジェクト定義
オブジ クト定義
クラス作成
システムクラスの活用
外部モジュールの活用
スタジオデバッガ
%UnitTest
構築 – 既存資産の利用
• ルーチン呼び出し
– クラス内のメソッドから呼び出せる
– プロシージャ構文に注意
• 外部ツールからの利用
– クラスメソッドでラップすることで利用可能に
– 呼び出しメソッドの使用
15
構築 – システム提供ライブラリ
• システムクラスライブラリにはアプリケーションから
利用可能なパッケ ジが用意されています
利用可能なパッケージが用意されています
– %Library パッケージ
• ファイルアクセス
– %Net パッケージ
– %IO パッケージ
• タスクマネージャによる処理の自動化
– 定義済みタスク
定義済みタスク:: ジャーナル削除、バックアップ
– 任意のタスクを定義
任意のタスクを定義//実行可能
検証
Caché
設計
ダイレクトアクセス
(Mumps)
グローバル構造
グロ バル構造
構築
ルーチン作成
検証
コマンドラインデバッ
グ
独自テスト作成?
コードのエクスポート XMLでの配布
→インポート?
%Installerパッケージ
独自の監視機能?
ダッシュボード
%Monitor
配置
保守
オブジェクト定義
オブジ クト定義
クラス作成
システムクラスの活用
外部モジュールの活用
スタジオデバッガ
%UnitTest
16
検証 – %Populate テストデータ作成
• %Populate クラスによるテストデータの作成
– クラスのダミーデータを生成する
クラスのダミ デ タを生成する
– プロパティの型に応じたデータが作成される
– 独自に拡張可能
検証 – スタジオデバッガ
• スタジオのデバッガ機能を使用したコードの検証
– 実行可能形式
• ルーチン・メソッド・
ルーチン・メソッド・CSP
CSP
– 動作中のプロセスにアタッチ可能
• バックグラウンドプロセスにアタッチして特定のコード
部分で処理を停止、トレースを行う 等
17
検証 – %UnitTest
• %UnitTestパッケージによるテストの作成
%UnitTestパッケージによるテストの作成
– 自動実行
– 結果の集計
– テストの再利用
• %UnitTest.TestCase から継承したテスト実行クラスを
作成
配置
Caché
設計
ダイレクトアクセス
(Mumps)
グローバル構造
グロ バル構造
構築
ルーチン作成
検証
コマンドラインデバッ
グ
独自テスト作成?
コードのエクスポート XMLでの配布
→インポート?
%Installerパッケージ
独自の監視機能?
ダッシュボード
%Monitor
配置
保守
オブジェクト定義
オブジ クト定義
クラス作成
システムクラスの活用
外部モジュールの活用
スタジオデバッガ
%UnitTest
18
配置 – アプリケーション配布
• XML形式によるコードの配布
XML形式によるコードの配布((自動化
自動化))
– $system.OBJ.Export()
$ t OBJ E
t()
– $system.OBJ.Load()
「プロジェクト」単位で
• %Installerパッケージによるインストール時のカスタマ
%Installerパッケージによるインストール時のカスタマ
イズ機能
– ネームスペース
ネームスペース//データベースの構成
– アプリケーションの作成
– コード
コード//データの配置
– 任意のインストール後処理の実行
配置 – アプリケーション配布
• サイレントインストール
– 展開済みキットが必要
(通常配布の exe 単体キットでは実行できません
単体キットでは実行できません))
– インストール後に %Installer を実行できます
start /wait msiexec /i
C:¥¥Cache2010.1.1kit¥
C:
Cache2010.1.1kit¥nt
nt¥¥redist¥
redist¥x86¥
x86¥vc_red.msi
start /wait msiexec /i C:¥
C:¥kit¥
kit¥nt
nt¥¥cache_x86.msi /qn
INSTALLDIR=C:¥¥InterSystems¥
INSTALLDIR=C:
InterSystems¥Demo UNICODE=1
TRANSFORMS=1041_x86.mst
INSTALLERMANIFEST="C:¥¥Installer.xml"
INSTALLERMANIFEST="C:
19
配置
Caché
設計
ダイレクトアクセス
(Mumps)
グローバル構造
グ
バル構造
構築
ルーチン作成
検証
コマンドラインデバッ
グ
独自テスト作成?
コードのエクスポート XMLでの配布
→インポート?
%Installerパッケージ
独自の監視機能?
ダッシュボード
%Monitor
配置
保守
オブジェクト定義
オブジ クト定義
クラス作成
システムクラスの活用
外部モジュールの活用
スタジオデバッガ
%UnitTest
保守 – システムのモニタリング
• %Monitorパッケージ
%Monitorパッケージ
– 定義済みエラー
定義済みエラ
– 追加のユーザ定義監視項目
– メールによる通知、任意のコードの実行
メールによる通知、任意のコードの実行((外部
ユーティリティの呼び出し等))
ユーティリティの呼び出し等
• SNMP WMI 等による外部ツールの使用
20