Mac で TypeScript

X(twitter)のポスト参照。

適当なプロジェクトフォルダを作り
npm init //初期化
npm install –save-dev typescript //ts のインスコ
(コーディング sample.ts)
node_modules/.bin/tsc //ts → js コンパイル
node sample.js //コマンドラインでテスト
で一丁完了。

node とはなんぞや?とかは一回やるとわかると思う。

 

(加筆予定)

標準型電子カルテ

現在、国が推進している医療DXの一つの核として標準型電子カルテというものがある。

先日、厚労省がそのアンケートを(主に)ベンダー向けにしたのだが、某社がアプライするということでエンケート作成のお手伝いをしてきた。

気がついたことをいくつか。

官公庁の医療系のシステムというと、大抵の場合、委員会や WG(Working Group)があって、そこでまとまった方針に忖度してそって、企画などを提案するみたいなことになると思う。

出自がそういうものだから、仕事(というかほとんど作業)自体はあまりワクワクして取り組めるものではない。

が、(結論から書くと)このアンケートはそういうものではなかった。

まっさらな状態で青写真を描いていいという。

医療情報を専門的にやっているわけではないので、詳しくはわからないが、これまで SS-MIX だとか FHIR だとか散々議論していませんでしたっけ?
それをベースにしたシステムじゃないの?

でも、まあ、せっかくほぼ自由にシステムの提案してよいって言ってくれてるわけだから、乗らない手はない。技術者であれば、誰しもが興味も持つようなアイディアを随所に入れた。
もちろん全体的なコンセプトはワイにできるわけもなく、上の方々。

久しぶりに「書きたいこと書いた」充実感があり、全体的には楽しく取り組めた。

 

だが、なんで「自由にシステム提案していい」になったのか、その後もよくわからないでいた。
その点、引っかかっていたのだが、さる方が面白い推論をしていた。

官僚の医療DX関係の講釈を聞いていた某大臣がブチ切れて「そういう(仕様の話だとか)話はもういいよ。聞きたくないよ。結果は出たのかよ!何にもできてないじゃないか。偉そうなことは結果出してから言えよ。頭でっかちの連中を呼んで議論させたところで、結果が出るわけないだろう。やり方から考えろよ。それがお前たちの仕事だろう!!」とその官僚を怒鳴りつけた  『君は超アジャイルという開発手法を知っているか?』より

官僚を怒鳴りつけたのは誰なのかわかるような気がするが、そういうことなら腑に落ちる(笑)。

 

CoreData みたびw

すっかり CoreData の使い方を忘れていたので、最初から。

NSPersistentContainer, sqlite ファイルの配置指定など

Xcode で CoreData を使う旨の指定をしてプロジェクトを生成すると NSPersistentContainer はできている。

具体的には

@synthesize persistentContainer = _persistentContainer;

- (NSPersistentContainer *)persistentContainer {
    // The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
    @synchronized (self) {
        if (_persistentContainer == nil) {
            _persistentContainer = [[NSPersistentContainer alloc] initWithName:@"CoreData2"];

といったコードが、AppDelegate.m に自動生成されている。

では、これを単純にビルド→ランさせただけで CoreData2.sqlite ができるかというとそうはならないようだ。

検証の必要はあるが、Display Name = CoreData2 と指定しないと sqlite ファイルを作成しないようだ。

また、sqlite ファイルのコンテナ領域の中の Application Support フォルダの中である。

ややこしい。。。

ところで、これ、置き場所を変えられないものなんだろうか?

結果から言うとできるっぽい。
上の記事にあるようにハンドラを呼び出す前に、URL を改変して指定する。

_persistentContainer = [[NSPersistentContainer alloc] initWithName:@"AppName"];
NSPersistentStoreDescription *storeDescription = _persistentContainer.persistentStoreDescriptions.firstObject;
NSURL *URL = [storeDescription.URL.URLByDeletingLastPathComponent URLByAppendingPathComponent:@"NewLocation.sqlite"];
storeDescription.URL = URL;
[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {

OneToOne の一方向の関係性

というようなものもつくれるが、需要はなさそう。

AppDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    _persistentContainer = [self persistentContainer];
    
    NSManagedObjectContext *context = _persistentContainer.viewContext;
    Child *child = [NSEntityDescription insertNewObjectForEntityForName:@"Child"
                                                       inManagedObjectContext:context];
    child.name = @"taro";
    Child *child2 = [NSEntityDescription insertNewObjectForEntityForName:@"Child"
                                                       inManagedObjectContext:context];
    child2.name = @"hanako";
    Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
                                                       inManagedObjectContext:context];
    person.name = @"yamada";
    person.children = child;
    NSError *error = nil;
    [context save:&error];

結果。

(続く)

addsubview するときの view のお手軽な作成方法

文法ラウンドやメソッド暗記モードを経て、cocoa でアプリっぽいものを作成する機会が多くなったが、全然知られていない方法を一つ。

みんな大好き NSView だが、子供の view を作成して親 view に addsubview したいというときがしばしばある。

しかし、具体的な方法論がほとんど知られていない(笑)。

ワイは試行錯誤(といってもさほど時間はかからなかったが)の結果、以下のようにしている。

Xcode の + で UI パーツのライブラリを呼び出すダイアログを呼び出して、custom view をチョイス。

ここがキモだと思うのだが、これを親ビューが所属する Controller Scene に置く

すると上図のように Xcode 上でもしっかりと操作可能な形で配置される。

iOS 関係はわからんが、MacOS でこんな図は見たことがない。

追加した view を ChildView、元々あった view を ParentView とすると、ViewController の viewdidload あたりに

    _childview = [[ChildView alloc] initWithFrame:_parentview.frame];
    [_parentview addSubview:_childview];

としておくと、しっかりこのビューが生成される。

かなり便利な方法だと思うんだが、全然知られてないよね。

NSView の再描画

ところで MacOS の描画関係は Metal から入ったワイは、NSView は自動で再描画してくれるものだと思い込んでいたが、違うらしい。setNeedsDisplay メソッドで明示する。