• 検索結果がありません。

Microsoft PowerPoint - MUMPSユーザーのためのCache入門.pptx

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - MUMPSユーザーのためのCache入門.pptx"

Copied!
26
0
0

読み込み中.... (全文を見る)

全文

(1)

ため

ため

入門

入門

MUMPS

MUMPSユーザーのための

ユーザーのための

Caché

Caché入門

入門

インターシステムズジャパン株式会社 インターシステムズジャパン株式会社 ビジネスディベロップメント ビジネスディベロップメント シニアマネージャーシニアマネージャー 佐藤 佐藤 比呂志比呂志

アジェンダ

アジェンダ

•• MUMPSMUMPSユーザーのユーザーのCachéCaché FAQFAQ C hé

C héととMUMPSMUMPSの言語的相違点の言語的相違点

•• CachéCachéととMUMPSMUMPSの言語的相違点の言語的相違点

•• CachéCachéととMUMPSMUMPSのの機能的相違点機能的相違点

(2)

CachéはMUMPSですか?

CachéはMUMPSですか?

•• そうともいえるそうともいえる •• ちがうともいえるちがうともいえる 3

CachéがMUMPSなところ

CachéがMUMPSなところ

•• MUMPSMUMPSプログラムがそのまま動作するプログラムがそのまま動作する DSM DSM –– DSMDSM –– MSMMSM –– DTMDTM

(3)

CachéがMUMPSでないところ

CachéがMUMPSでないところ

•• 言語仕様がモダン言語仕様がモダン •• オブジェクト指向が使えるオブジェクト指向が使える •• SQLSQLが使えるが使える •• 様々な外部インタフェースが用意されている様々な外部インタフェースが用意されている –– JavaJava 5 –– .NET.NET

–– Web ServicesWeb Services

–– etcetc

Caché ObjectScriptはMUMPSですか?

Caché ObjectScriptはMUMPSですか?

•• そうともいえるそうともいえる MUMPS MUMPSのシンタックスが使えるのシンタックスが使える –– MUMPSMUMPSのシンタックスが使えるのシンタックスが使える –– MUMPSMUMPSプログラムがそのまま動作するプログラムがそのまま動作する •• そうじゃないともいえるそうじゃないともいえる –– スペースの使用制限がゆるいスペースの使用制限がゆるい –– ほかの言語の様なブロック構造が取れるほかの言語の様なブロック構造が取れるほかの言語の様なブロック構造が取れるほかの言語の様なブロック構造が取れる –– 変数のスコープが他言語に近い変数のスコープが他言語に近い –– 他言語の良い所は積極的に取り入れている他言語の良い所は積極的に取り入れている

(4)

Caché言語エンジンの構造

Caché言語エンジンの構造

P-Code DSM MSM DTM Caché Object Script Caché Basic 7

Caché Virtual Machine P Code

Caché ObjectScriptの大改造

Caché ObjectScriptの大改造

•• 20002000年頃大改造仕様を策定年頃大改造仕様を策定 •• ゴールゴール –– より良いブロック構造の提供より良いブロック構造の提供 –– より良いローカル変数の保護より良いローカル変数の保護 –– フロー制御コマンドの改善フロー制御コマンドの改善 –– 可読性向上のための空白の自由な使用可読性向上のための空白の自由な使用可読性向上のための空白の自由な使用可読性向上のための空白の自由な使用

(5)

Caché ObjectScriptの大改造

Caché ObjectScriptの大改造

•• プライベート変数とプロシジャプライベート変数とプロシジャ

•• 新しいコマンド新しいコマンド

–– IF ELSEIF ELSE FOR WHILE DO WHILEIF ELSEIF ELSE FOR WHILE DO WHILE

•• 空白の自由な使用空白の自由な使用 •• 複数行に跨がる記述複数行に跨がる記述 9

プロシジャ

プロシジャ

; Admitを呼ぶ前、パブリック変数は: ; a =1,b=2,c=3,d=4 DO Admit(5,.d) Admit(x,y)[a,b,y]{ ;これはプロシジャです ; この時点でプロシジャに見えるのは: ; パブリック変数: a=1,b=2,y=4 ; プライベート変数: x=5 SET c=8,f=9 ; これはプライベート“c” とプライベート “f”の設定 ; 以前に定義した“c” や “f”には触っていない

SET a=4 ; これはパブリック “a”の設定

DO sub ; これはプライベートサブルーチンにアクセスする ; このプロシジャの中 DO discharge ; これはパブリックサブルーチン ; 中身は同じルーチン ; 中身は同じル チン QUIT sub ; これはAdmitプロシジャのサブルーチン 変数はそのまま ; Admitプロシジャの中からだけ呼び出すことができる。 ; QUIT

(6)

プロシジャ(続き)

プロシジャ(続き)

discharge; Dischargeは同じルーチンのパブリックサブルーチン ; Iパブリック変数は全て参照できますが、プライベート変数は ; “Admit”の変数。 パブリック変数a=4,b=2,y=4が見える ; Admit の変数。 パブリック変数a 4,b 2,y 4が見える ; その他のパブリック変数同様: c=3,d=4 ; 注意:参照呼び出しなので“d”と“y” ; は同じ変数に結びつけられる QUIT 11

Newコマンド

Newコマンド

•• NewNewコマンドで同じことができる?コマンドで同じことができる? Yes Yes –– YesYes –– 変数を忘れずに毎回指定する変数を忘れずに毎回指定する •• 人間とは忘れやすい動物である人間とは忘れやすい動物である

–– New (New (a,ba,b))を使えば?を使えば?

(7)

コードのフリーフォーマット

コードのフリーフォーマット

•• より見やすいコード記述のためより見やすいコード記述のためMUMPSMUMPS仕様からあえ仕様からあえ て離れる て離れる て離れる て離れる •• いくつかの制限は残るいくつかの制限は残る –– 名前は空白で区切ることはできない名前は空白で区切ることはできない –– リテラル値も空白で区切ることはできないリテラル値も空白で区切ることはできない –– コマンドとその最初の引数の間に1つの空白がコマンドとその最初の引数の間に1つの空白が 13 必要なコマンド 必要なコマンド –– 引数のないコマンドは、2つ以上の空白、または引数のないコマンドは、2つ以上の空白、または 行末が必要 行末が必要 –– 後置条件表現は、括弧で囲まなければ空白で区後置条件表現は、括弧で囲まなければ空白で区 切ることができない 切ることができない

継続行とコメント

継続行とコメント

SET abc = x * y / ;これはコメントです (m + n) , ; これもコメントです (m n) , ; これもコメントです def = “hello” SET a=1 ; 従来のコメント SET b=2 // もうひとつのコメント SET c 3 /* 複数行に渡る SET c=3 /* 複数行に渡る 長いコメント です*/

(8)

継続行(続き)

継続行(続き)

Admit ( id , // idは患者id bed , // bedはベッド番号 bed , // bedは ッド番号 ward ) // wardは棟番号 // 次にパブリック変数を列挙します [ hosp , // hospは病院名 doc ] // docは担当医 public { set x = ^abc( 3,

id ) set hosp = $li(x 2)

15

id ) set hosp = $li(x,2) }

IF {}, ELSEIF {}, ELSE {}

IF {}, ELSEIF {}, ELSE {}

IF exprlist { code }

IF exprlist { code } ELSE { code } IF exprlist { code } ELSE { code }

IF exprlist {code } ELSEIF exprlist {code}

(9)

IF {}, ELSEIF {}, ELSE {}

IF {}, ELSEIF {}, ELSE {}

if x>3,z<5 { set a=1 do tag set b=2 do tag2 }

do tag2 } else { do tag4 }

IF b=5 {SET a=1} ELSEIF b=6 {SET a=2} ELSEIF b=7 {SET a=3} ELSE {SET a=4} GOTO x

17

FOR {}

FOR {}

FOR { SET x=3 DO tag }

FOR a=1:1:3,5,10 { SET x=3 DO tag } FOR a 1:1:3,5,10 { SET x 3 DO tag }

(10)

WHILE and DO … WHILE

WHILE and DO … WHILE

WHILE x>3,y=4 {SET a=5 DO tag} WRITE “done” DO { SET a=5 DO tag

SET x=”yes”}

WHILE y>4,y<10 WRITE “done”

19

コードブロック

{}の一般的なルール

コードブロック

{}の一般的なルール

•• コマンドコンストラクトは、コマンドコンストラクトの始コマンドコンストラクトは、コマンドコンストラクトの始 めからしか入力できない めからしか入力できない めからしか入力できない めからしか入力できない •• コードブロックはコードブロックは{{の所からしか入力できないの所からしか入力できない •• コードブロック内のコードブロック内のGOTOGOTO文は以下の場所にしかブラ文は以下の場所にしかブラ ンチしない ンチしない –– コードブロックの中コードブロックの中

(11)

// 例1

IF x>3,y<4 {SET z=1 DO tag^rou} ELSE {SET z=2 DO tag2^rou2} // 例2 IF x>3,y<4 { SET z=1 DO tag^rou } ELSE { 21 } ELSE { SET z=2 DO tag2^rou2 } ; この例は例1と同じ

例(続き)

例(続き)

// 例3

IF x>3 { SET a=”” FOR { SET a=$O(abc(a)) QUIT:a=”” SET x=x+abc(a) } SET y=y+x }

// この例ではy=y+xはFORループが完了した後に一度実行 // (そのif文が真と想定して)

// 例4 IF x>3 { IF x>3 {

SET a=”” FOR SET a=$O(abc(a)) QUIT:a=”” SET x=x+abc(a) SET y=y+x

(12)

例(続き)

例(続き)

// 例5

F y=1:1:10 { IF abc(y)>0 {S x=x+abc(y)} ELSE {S x=x-abc(y)} F y 1:1:10 { IF abc(y) 0 {S x x abc(y)} ELSE {S x x abc(y)} DO tag } // do tagはforループの一部で毎回繰り返し実 行される // FORループの繰り返し // 例6 23 // 例6 F y=1:1:10 {

IF abc(y)>0 {S x=x+abc(y)} ELSE {S x=x-abc(y)} DO tag

} // このコードは例5と同じ

$CASE

$CASE

•• $SELECT$SELECTをよりシンプルに、より効率的にしたものをよりシンプルに、より効率的にしたもの

SET a = $CASE(x+1*3,3:”A”,6:17+43,9:$H, 1/2:”one-half”, :”default”) DO $CASE(x+1*3, 3:goodsub, 6:bettersub^rou(a,.b), :errorsub)

(13)

新しい論理和、論理積演算子

新しい論理和、論理積演算子

$d(^a(3))#10 && ^a(3) $d(^a(3))#10 & ^a(3)

25

パラメータ付タグの暗黙

QUIT

パラメータ付タグの暗黙

QUIT

Start ; WRITE “Hello”,! WRITE Hello ,! ; 暗黙QUITはここ MySub(a) ; WRITE a,! ; 暗黙QUITはここ MyProc() { WRITE “これは私のプロシジャです ” WRITE これは私のプロシジャです。 ; プロシジャの最後にも暗黙QUITあり }

(14)

CacheTempグローバル

CacheTempグローバル

•• メモリー(グローバルバッファー)が許す限り、ディスメモリー(グローバルバッファー)が許す限り、ディス クに書かない クに書かない クに書かない クに書かない •• システム再起動の際に消えるシステム再起動の際に消える •• ジャーナル対象外ジャーナル対象外 •• 作業用データとして使用することでアプリケーション作業用データとして使用することでアプリケーション 性能向上 性能向上 27 性能向 性能向

プロセスプライベートグローバル

プロセスプライベートグローバル

•• ローカル変数の様に使用可能ローカル変数の様に使用可能 ^|A ^|A –– ^|A^|A •• プロセスが終了すると消えるプロセスが終了すると消える •• ローカル変数の様な容量制限がないローカル変数の様な容量制限がない –– データベースサイズの制限のみデータベースサイズの制限のみ

(15)

マクロ

マクロ

#define

#define StringMacroStringMacro "Hello, World!" "Hello, World!" WRITE

WRITE $$$$$$St i MSt i M WRITE

WRITE $$$$$$StringMacroStringMacro #define output1(%

#define output1(%strstr,%,%lf,%indentlf,%indent) do ) do output^%fm2class(%

output^%fm2class(%strstr,%,%lf,%indentlf,%indent,$$$display),$$$display)

29

インクルードファイル

インクルードファイル

•• 以下のマクロ定義を別ファイルとして定義以下のマクロ定義を別ファイルとして定義

/// Create a success %Status code /// Create a success %Status code #define OK

#define OK

/// Return true if the %Status /// Return true if the %Status //// %// %scsc -- %Status code %Status code

##define ISOK(%define ISOK(%scsc)) (+%(+%scsc)) /// Return true if the %Status /// Return true if the %Status //// %// %scsc -- %Status code %Status code

(16)

#include文

#include文

#include %

#include %occCacheDirectoccCacheDirect ##include %include %occExtentoccExtent ##include %include %occExtentoccExtent ##include %include %occTransactionoccTransaction ##include %include %occIncludeoccInclude ##include %include %msqlmsql ##include %include %cspIncludecspInclude

31

$LIST

$LIST

•• $PIECE$PIECEの欠点解消の欠点解消 区切り文字を断片文字列内に持てない 区切り文字を断片文字列内に持てない –– 区切り文字を断片文字列内に持てない区切り文字を断片文字列内に持てない –– 長くなると処理時間がかかる長くなると処理時間がかかる

(17)

$SORTBEGIN,$SORTEND

$SORTBEGIN,$SORTEND

•• ランダム書き込みの性能向上ランダム書き込みの性能向上 インデックス構築など インデックス構築など –– インデックス構築などインデックス構築など 33

$ORDER/$QUERY第3引数

••

第第33引数の変数名引数の変数名 – $ORDER(^GlobalData(ref),1,dataRow) – グローバル参照を減らすことができる – 500,000レコードをアクセスするための時間: • “従来の”方法 = 1.20秒 • この方法 = 0.65秒 • - 約2倍!

(18)

共有ロックシンタックス

••

>>LOCK +^data(id)#"s" – 複数プロセスが同じ共有ロックを取得できる – 共有ロックは、排他ロックをブロックするし、排他 ロックは、共有ロックをブロックする。 – 複数プロセスがそれを使っている間は、データの 変更はできない。 – 排他 (既定)と共有ロックは、独立にカウントされ る。 – 引数なしロックは、両方のタイプをクリアする。

可変引数シンタックス

可変の引数を受け付ける様にプロシジャは特別なシ ンタックス...を使うことができる

唯一または最後の引数の後に…をつける。この引数 のタイプは、%List

(19)

SQLの使用

SQLの使用

•• 動的動的SQLSQL

SET

SET myquerymyquery = "SELECT TOP 5 = "SELECT TOP 5 Name,Home_CityName,Home_City FROM FROM Sample.PersonSample.Person ORDER BY Age" ORDER BY Age" SET

SET tStatementtStatement = ##class(%= ##class(%SQL.StatementSQL.Statement).%New() ).%New() SET

SET tStatustStatus = = tStatementtStatement.%Prepare(.%Prepare(myquerymyquery) ) SET

SET rsetrset = = tStatementtStatement.%Execute(.%Execute()) DO

DO rsetrset.%Display() WRITE !,"End of data".%Display() WRITE !,"End of data"

37

SQLの使用

SQLの使用

•• 埋め込み埋め込みSQLSQL

&&sqlsql(SELECT COUNT(*) INTO :(SELECT COUNT(*) INTO :myvarmyvar FROM FROM Sample.PersonSample.Person) ) Write

(20)

ビット文字列関数

••

$BIT ,$BITCOUNT, $BITFIND, $BITLOGIC$BIT ,$BITCOUNT, $BITFIND, $BITLOGIC

– ビット文字列関数は、エンコードされたビットデー タを操作します 通常は ビ ト関数で処理する タを操作します。 通常は、ビット関数で処理する – $BIT関数は、アトミック処理を実施する – $BIT関数は、ビット文字列の内部圧縮を行う。

ビットマップインデックス

– 例

P T bl Person Table

(21)

ビットマップインデックス

– 論理ビュー

Stateビットマップインデックス

ビットマップインデックス – 論理ビュー

(22)

ビットマップインデックス – 複合条件

複数インデックスを使用

ビットスライス

– 例

•• 例えば、例えば、 1つのレコードの総請求額が1つのレコードの総請求額が0.830.83とするとする と、 と、 整数となる様、、、整数となる様、数 な 様、数 な 様、8383に調整して、に調整して、 バイナリ値調調 、、バイナリ値ナリ値ナリ値 ‘ ‘1010011’1010011’に分解する、そしてそのレコードは、以に分解する、そしてそのレコードは、以 下の条件のもと、インデックス化する。 下の条件のもと、インデックス化する。 •• 総合計ビット総合計ビット77をセットをセット •• 総合計ビット総合計ビット55をセットをセット

(23)

ビットスライス

– 例

顧客番号 顧客番号33はは $27$27の支払いの支払い((2進数2進数11011)11011) –– 顧客番号顧客番号33は、は、$27$27の支払いの支払い((2進数2進数11011)11011) –– 顧客番号顧客番号44は、は、$17$17の支払いの支払い((2進数2進数10001)10001) 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 2) S M l レコード番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ….. 1000万 …. 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 ... 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 ... 2) Sex = Male 3) Bill bit 5 4) Bill bit 4 5) Bill bit 3 6) Bill bit 2 7) Bill bit 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 ... 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 …. 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 ...

ビットスライス

– 例

•• 全男性の総合計請求額は?全男性の総合計請求額は? ( d2 AND d3)*16 + ( d2 AND d4)*8 + ( d2 AND d3)*16 + ( d2 AND d4)*8 +

–– (cond2 AND cond3)*16 + (cond2 AND cond4)*8 + (cond2 AND cond3)*16 + (cond2 AND cond4)*8 + (cond2 AND cond5)*4 + …

(cond2 AND cond5)*4 + …

0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 2) S M l レコード番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ….. 1000万 …. 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 ... 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 ... 2) Sex = Male 3) Bill bit 5 4) Bill bit 4 5) Bill bit 3 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 ... 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 …. 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1

(24)

Caché Object

Caché Object

set

set person=##class(person=##class(Sample.PersonSample.Person).%).%OpenIdOpenId(1(1)) write

write person.Nameperson.Name write

write person.Nameperson.Name Van

Van De De Griek,CharlotteGriek,Charlotte M. M. write

write person.FavoriteColors.Countperson.FavoriteColors.Count(()) 1

1 write

write person.FavoriteColors.GetAtperson.FavoriteColors.GetAt(1) (1) Red

Red write

write person SSNperson SSN

47

write

write person.SSNperson.SSN 571 571--1515--24792479

Cachéクラスライブラリー

Cachéクラスライブラリー

•• ファイルインタフェースクラスファイルインタフェースクラス S t fil ## l (%

S t fil ## l (%LibLib Fil ChFil Ch t Stt St ) %N () ) %N () Set file=##class(%

Set file=##class(%Library.FileCharacterStreamLibrary.FileCharacterStream).%New() ).%New() Set

Set file.Filenamefile.Filename="c:="c:¥¥sample.txtsample.txt" " Do

(25)

Cachéクラスライブラリー(続き)

Cachéクラスライブラリー(続き)

•• SMTPSMTP Set s=##class(%Net.SMTP).%New() Set s.smtpserver=“smtpserver.xxx.com” set auth=##class(%Net.Authenticator).%New() set auth.UserName=“Test” set auth.Password=“Test” set s.authenticator=auth Set m=##class(%Net.MailMessage).%New() Set m.From=$Get(“[email protected]”) 49 Do m.To.Insert(“[email protected]”) Set m.Subject=“Caché Solution Page” Set crlf=$C(13,10)

Do m.TextData.Write($ZCVT(“こんにちは","O","JIS")) set status=s.Send(m)

If $$$ISERR(status) Quit $System.Status.GetErrorText(status)

SQLマッピング

SQLマッピング

•• 既存グローバルをテーブル(クラス)として定義し、外既存グローバルをテーブル(クラス)として定義し、外 部から 部からODBCODBC、、JDBCJDBCを通して参照できるを通して参照できる 部から 部からODBCODBC、、JDBCJDBCを通して参照できるを通して参照できる

(26)

最後にお願い

最後にお願い

•• 新しく作るルーチンは是非新しく作るルーチンは是非CachéCaché ObjectScriptObjectScriptで記述しで記述し ましょう。

ましょう。 ましょう。 ましょう。

–– MUMPSMUMPSととCOSCOSは相互に呼び出し可能は相互に呼び出し可能

•• 是非プロシジャ記述でコードを書きましょう是非プロシジャ記述でコードを書きましょう •• CachéCachéのクラスライブラリーを積極的に利用しましょうのクラスライブラリーを積極的に利用しましょう •• SQLSQLマッピングに挑戦したい人はお知らせくださいマッピングに挑戦したい人はお知らせください 51 •• SQLSQLマッピングに挑戦したい人はお知らせくださいマッピングに挑戦したい人はお知らせください •• できる限り最新バージョンのできる限り最新バージョンのCachéCachéをお使いくださいをお使いください

参照

関連したドキュメント

喫煙者のなかには,喫煙の有害性を熟知してい

バックスイングの小さい ことはミートの不安がある からで初心者の時には小さ い。その構えもスマッシュ

Bでは両者はだいたい似ているが、Aではだいぶ違っているのが分かるだろう。写真の度数分布と考え

子どもが、例えば、あるものを作りたい、という願いを形成し実現しようとする。子どもは、そ

共通点が多い 2 。そのようなことを考えあわせ ると、リードの因果論は結局、・ヒュームの因果

ているかというと、別のゴミ山を求めて居場所を変えるか、もしくは、路上に

(自分で感じられ得る[もの])という用例は注目に値する(脚注 24 ).接頭辞の sam は「正しい」と

 「フロン排出抑制法の 改正で、フロンが使え なくなるので、フロン から別のガスに入れ替 えたほうがいい」と偽