0 フォロワー · 37 投稿

Caché Server Pages (CSP) は、InterSystemsデータプラットフォームでインタラクティブなWebアプリケーションを構築するために使用するアーキテクチャとツールセットの両方のことです。

記事 Mihoko Iijima · 7月 7, 2025 3m read

これは InterSystems FAQ サイトの記事です。

一般的に、500番台はサーバー側で発生したエラーを表していて、503番エラーはサーバーが何らかの理由で機能を停止していてクライアントの要求に回答できない場合に出現するエラーです。

外部サイトの説明:503エラー 【HTTP 503 Service Unavailable】

以下、InterSystems 製品の使用で発生する503エラーの考えられる原因について一覧します。

 

REST/CSPページにアクセスできない

原因:ライセンスが割り当てられない場合に発生します(ライセンスが「同時接続ユーザ」での購入である場合、ユーザ数が制限を迎えたためライセンスが割り当てられずこのエラーが発生します)。

アプリケーションが「認証なし」アクセスを使用している場合、以下の原因により503エラーが発生します。

0
0 66
記事 Tomoko Furuzono · 4月 17, 2025 1m read

これは、InterSystems FAQサイトの記事です。


メソッドの実装に使用する言語を明示する場合は、下記のようにメソッドキーワードで「Language=~~~」と指定します。

Method name(formal_spec) As returnclass [ Language = language ]
{    //implementation }

 指定できるLanguageの値は下記のとおりです。

  • objectscript (既定) — ObjectScript
  • python — 組み込み Python
  • tsql — Transact-SQL
  • ispl — Informix ストアド・プロシージャ言語

ドキュメント:Language (メソッド・キーワード)

上記の通り、ObjectScriptで記載する場合は、「Language=objectscript」と指定します。
但し、CSP内の<SCRIPT>タグ内で指定する場合は、下記の通り、「LANGUAGE=’cache’」と指定することにご注意ください。

<SCRIPT LANGUAGE='cache', ~~~>

ドキュメント:<SCRIPT>  

※CSPページは、IRISでは非推奨の機能です。

0
0 57
記事 Toshihiko Minamoto · 4月 11, 2025 10m read

django_logo

説明

これは、ネイティブウェブアプリケーションとして IRIS にデプロイできる Django アプリケーションのテンプレートです。

インストール

  1. リポジトリをクローンする
  2. 仮想環境を作成する
  3. 要件をインストールする
  4. docker-compose ファイルを実行する
git clone
cd iris-django-template
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
docker-compose up

使用法

ベース URL は http://localhost:53795/django/ です。

エンドポイント

  • /iris - IRISAPP ネームスペースに存在する上位 10 個のクラスを持つ JSON オブジェクトを返します。
  • /interop - IRIS の相互運用性フレームワークをテストするための ping エンドポイント。
  • /api/posts - Post オブジェクトの単純な CRUD エンドポイント。
  • ``/api/comments` - Comment オブジェクトの単純な CRUD エンドポイント。

このテンプレートからの開発方法

WSGI 導入記事をご覧ください: wsgi-introduction

概要: セキュリティポータルで DEBUG フラグをトグルすると、開発作業の過程で変更内容がアプリケーションに反映されるようになります。

コードの説明

Django アプリケーションは次のように構造化されています。

  • app - Django プロジェクトフォルダ
    • app - 構成用の Django アプリフォルダ
      • settings.py - Django の設定ファイル
      • urls.py - ビューを URL に接続する Django URL 構成ファイル
      • wsgi.py - Django WSGI ファイル
      • asgi.py - Django ASGI ファイル
    • community - コミュニティアプリの Django アプリフォルダ、Post と Comment オブジェクトでの CRUD 操作
      • models.py - Post と Comment オブジェクトの Django モデルファイル
      • views.py - Post と Comment オブジェクトにアクセスするための Django ビューファイル
      • serializers.py - Post と Comment オブジェクトの Django シリアライザーファイル
      • admin.py - 管理インターフェースに CRUD 操作を追加する Django 管理ファイル
      • migrations - データベースを構築するための Django マイグレーションフォルダ
      • fixtures - Django fixtures フォルダデモデータ
    • sqloniris - IRIS アプリでの SQL に使用する Django アプリフォルダ
      • views.py - IRISAPP ネームスペースをクエリするための Django ビューファイル
      • apps.py - Django アプリ構成ファイル
    • interop - 相互運用性アプリ用の Django アプリフォルダ
      • views.py - 相互運用性フレームワークをテストするための Django ビューファイル
      • apps.py - Django アプリ構成ファイル
    • manage.py - Django 管理ファイル

app/settings.py

このファイルには、アプリケーションの Django 設定が含まれます。

...

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'community',
    'sqloniris',
    'interop',
    'rest_framework'
]

...

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 20
}

...

DATABASES = {
    "default": {
        "ENGINE": "django_iris",
        "EMBEDDED": True,
        "NAMESPACE": "IRISAPP",
        "USER":"SuperUser",
        "PASSWORD":"SYS",
    }
}

一部の重要な設定:

  • INSTALLED_APPS - Django プロジェクトにインストール済みのアプリのリストが含まれます。
    • community - Post と Comment オブジェクトでの CRUD 操作用 Django アプリ。
    • sqloniris - IRIS での SQL 操作に使用する Django アプリ。
    • interop - 相互運用性操作用の Django アプリ。
    • rest_framework - REST API 用の Django REST フレームワーク。
  • REST_FRAMEWORK - Django REST フレームワークの設定が含まれます。
    • DEFAULT_PERMISSION_CLASSES - 認証済みのユーザーのみが CRUD 操作を実行できます。
    • DEFAULT_PAGINATION_CLASS - REST API のページネーションクラス。
  • DATABASES - IRIS データベース接続の設定が含まれます。
    • ここでは、django_iris エンジンを使って IRIS データベースに接続しています。

app/urls.py

このファイルには、Django アプリケーションの URL 構成が含まれます。

from django.contrib import admin
from django.urls import path,include
from rest_framework import routers
from community.views import PostViewSet, CommentViewSet
from sqloniris.views import index
from interop.views import index as interop_index

router = routers.DefaultRouter()
router.register(r'posts', PostViewSet)
router.register(r'comments', CommentViewSet)


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
    path('iris/', index),
    path('interop/', interop_index)
]
  • router - REST API のデフォルトのルーターが含まれます。
  • routeer.register - Post と Comment ビューセットをルーターに登録します。
  • urlpatterns - Django アプリケーションの URL パターンが含まれます。
    • /admin/ - Django 管理インターフェース。
    • /api/ - Post と Comment オブジェクトの REST API。
    • /iris/ - IRIS エンドポイントでの SQL。
    • /interop/ - 相互運用性エンドポイント。

app/wsgi.py

このファイルには、Django アプリケーションの WSGI 構成が含まれます。

これが、Django アプリケーションを実行するために IRIS に提供する必要のあるファイルです。

Security->Applications->Web Applications セクションで、このファイルへのパスを指定する必要があります。

  • アプリケーション名
    • app.wsgi
  • コーラブル名
    • application
  • WSGI アプリディレクトリ
    • /irisdev/app/app

community/models.py

このファイルには、Post と Comment オブジェクトの Django モデルが含まれます。

from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Comment(models.Model):
    content = models.TextField()
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
  • Post - Post オブジェクトのモデル。
    • title - 投稿のタイトル。
    • content - 投稿のコンテンツ。
  • Comment - Comment オブジェクトのモデル。
    • content - コメントのコンテンツ。
    • post - Post オブジェクトの外部キー。
    • related_name - コメントの関連名。

community/seializers.py

このファイルには、Post と Comment オブジェクトの Django シリアライザーが含まれます。

Django REST フレームワークでは、Django モデルを JSON オブジェクトにシリアル化できます。

from rest_framework import serializers
from community.models import Post, Comment

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('id', 'title', 'content', 'comments')

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ('id', 'content', 'post')
  • PostSerializer - Post オブジェクトのシリアライザー。
  • CommentSerializer - Comment オブジェクトのシリアライザー。
  • fields - シリアル化されるフィールド。

community/views.py

このファイルには、Post と Comment オブジェクトの Django ビューが含まれます。

Django REST フレームワークを使て、Django モデルの CRUD 操作を作成できます。

from django.shortcuts import render
from rest_framework import viewsets

# Import the Post and Comment models
from community.models import Post, Comment

# Import the Post and Comment serializers
from community.serializers import PostSerializer, CommentSerializer

# Create your views here.
class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
  • PostViewSet - Post オブジェクトのビューセット。
  • CommentViewSet - Comment オブジェクトのビューセット。
  • queryset - ビューセットのクエリセット。
  • serializer_class - ビューセットのシリアライザークラス。

sqloniris/views.py

このファイルには、IRIS 操作における SQL の Django ビューが含まれます。

from django.http import JsonResponse

import iris

def index(request):
    query = "SELECT top 10 * FROM %Dictionary.ClassDefinition"
    rs = iris.sql.exec(query)
    # Convert the result to a list of dictionaries
    result = []
    for row in rs:
        result.append(row)
    return JsonResponse(result, safe=False)
  • index - IRIS 操作における SQL のビュー。
  • query - IRIS データベースで実行される SQL クエリ。
  • rs - クエリの結果セット。
  • result - 結果セットからのリストのリスト。
  • JsonResponse - ビューの JSON レスポンス。リストのリスト表示を許可するには safe を False に設定します。

interop/views.py

このファイルには、相互運用性操作における SQL の Django ビューが含まれます。

from django.http import HttpResponse

from grongier.pex import Director

bs = Director.create_python_business_service('BS')

def index(request):
    result = bs.on_process_input(request)
    return HttpResponse(result, safe=False)
  • bs - Director クラスを使用して作成されるビジネスサービスオブジェクト。
  • index - 相互運用性操作のビュー。
  • result - ビジネスサービスの結果。

注: コードを単純化するために JsonResponse は使用しません。JSON オブジェクトを返す場合は使用できます。

トラブルシューティング

スタンドアロンモードで Django アプリケーションを実行する方法

スタンドアロンモードで Django アプリケーションを実行するには、以下のコマンドを使用できます。

cd /irisdev/app/app
python3 manage.py runserver 8001

これは、デフォルトのポート 8001 で Django アプリケーションを実行します。

注: このコマンドを実行するには、コンテナー内にいる必要があります。

docker exec -it iris-django-template-iris-1 bash

IRIS でアプリケーションを再起動する

DEBUG モードでアプリケーションに複数の呼び出しを行うと、変更はアプリケーションに反映されます。

IRIS 管理ポータルへのアクセス方法

http://localhost:53795/csp/sys/UtilHome.csp に移動すると、IRIS 管理ポータルにアクセスできます。

このテンプレートをローカルで実行する

これには、マシンに IRIS がインストールされている必要があります。

次に、IRISAPP というネームスペースを作成する必要があります。

要件をインストールします。

# Move to the app directory
cd /irisdev/app/app

# python manage.py flush --no-input
python3 manage.py migrate
# create superuser
export DJANGO_SUPERUSER_PASSWORD=SYS
python3 manage.py createsuperuser --no-input --username SuperUser --email admin@admin.fr

# load demo data
python3 manage.py loaddata community/fixtures/demo.json

# collect static files
python3 manage.py collectstatic --no-input --clear

# init iop
iop --init

# load production
iop -m /irisdev/app/app/interop/settings.py

# start production
iop --start Python.Production

静的ファイルの配信方法

Django アプリケーションで静的ファイルを配信するには、以下のコマンドを使用できます。

cd /irisdev/app
python3 manage.py collectstatic

これは、Django アプリケーションから静的ファイルを収集して、/irisdev/app/static ディレクトリに配信します。

IRIS で静的ファイルを公開するには、Security->Applications->Web Applications セクションを構成します。

web_applications

0
0 37
記事 Tomoko Furuzono · 4月 10, 2025 2m read

これは、InterSystems FAQ サイトの記事です。
 

※Caché/Ensembleの「CSPゲートウェイ」は、IRISでは「Webゲートウェイ」と名称が変更されています。
 これに伴い、サービス名も、「%Service_CSP」 ⇒ 「%Service_WebGateway」となっています。
 以下は、IRISベースの名称で記載しておりますので、適宜読み替えてご参照ください。

Webゲートウェイ・レジストリとその関連クラスを使用すると、Webゲートウェイのインストール環境の確認、および、設定値の変更が可能です。
関連するクラスは、以下になります。
%CSP.Mgr.GatewayRegistry
%CSP.Mgr.GatewayMgr

例えば、以下は、アクティブなWebゲートウェイのインストール環境(リストの1番目)の情報を書き出しています。

Set reqistry = $system.CSP.GetGatewayRegistry()
Set gateways = reqistry.GetGatewayMgrs()
Set gateway = gateways.GetAt(1)
Write gateway.IPAddress," : ",gateway.Port," : ",gateway.Version

      ↓(結果)

0
0 57
記事 Toshihiko Minamoto · 3月 27, 2025 8m read

fastapi_logo

説明

これは、ネイティブウェブアプリケーションとして IRIS にデプロイできる FastAPI アプリケーションのテンプレートです。

インストール

  1. リポジトリをクローンする
  2. 仮想環境を作成する
  3. 要件をインストールする
  4. docker-compose ファイルを実行する
git clone
cd iris-fastapi-template
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
docker-compose up

使用法

ベース URL は http://localhost:53795/fastapi/ です。

エンドポイント

  • /iris - IRISAPP ネームスペースに存在する上位 10 個のクラスを持つ JSON オブジェクトを返します。
  • /interop - IRIS の相互運用性フレームワークをテストするための ping エンドポイント。
  • /posts - Post オブジェクトの単純な CRUD エンドポイント。
  • /comments - Comment オブジェクトの単純な CRUD エンドポイント。

このテンプレートからの開発方法

WSGI 導入記事をご覧ください: wsgiサポートの概要

概要: セキュリティポータルで DEBUG フラグをトグルすると、開発作業の過程で変更内容がアプリケーションに反映されるようになります。

コードの説明

app.py

これは FastAPI アプリケーションのメインのファイルです。 FastAPI アプリケーションとルートが含まれます。

from fastapi import FastAPI, Request

import iris

from grongier.pex import Director

# import models
from models import Post, Comment, init_db
from sqlmodel import Session,select

app = FastAPI()

# create a database engine
url = "iris+emb://IRISAPP"
engine = init_db(url)
  • from fastapi import FastAPI, Request - FastAPI クラスト Request クラスをインポートします。
  • import iris - IRIS モジュールをインポートします。
  • from grongier.pex import Director: Flask アプリを IRIS 相互運用性フレームワークにバインドする Director クラスをインポートします。
  • from models import Post, Comment, init_db - モデルと init_db 関数をインポートします。
  • from sqlmodel import Session,select - Session クラスと sqlmodel モジュールの選択された関数をインポートします。
  • app = FastAPI() - FastAPI アプリケーションを作成します。
  • url = "iris+emb://IRISAPP" - IRIS ネームスペースの URL を定義します。
  • engine = init_db(url) - sqlmodel ORM のデータベースエンジンを作成します。

models.py

このファイルには、アプリケーションのモデルが含まれます。

from sqlmodel import Field, SQLModel, Relationship, create_engine

class Comment(SQLModel, table=True):
    id: int = Field(default=None, primary_key=True)
    post_id: int = Field(foreign_key="post.id")
    content: str
    post: "Post" = Relationship(back_populates="comments")

class Post(SQLModel, table=True):
    id: int = Field(default=None, primary_key=True)
    title: str
    content: str
    comments: list["Comment"] = Relationship(back_populates="post")

説明することは特にありません。外部キーとリレーションによる単なるモデルの定義です。

init_db 関数は、データベースエンジンの作成に使用されます。

def init_db(url):

    engine = create_engine(url)

    # create the tables
    SQLModel.metadata.drop_all(engine)
    SQLModel.metadata.create_all(engine)

    # initialize database with fake data
    from sqlmodel import Session

    with Session(engine) as session:
        # Create fake data
        post1 = Post(title='Post The First', content='Content for the first post')
        ...
        session.add(post1)
        ...
        session.commit()

    return engine
  • engine = create_engine(url) - データベースエンジンを作成します。
  • SQLModel.metadata.drop_all(engine) - すべてのテーブルをドロップします。
  • SQLModel.metadata.create_all(engine) - すべてのテーブルを作成します。
  • with Session(engine) as session: - データベースを操作するためのセッションを作成します。
  • post1 = Post(title='Post The First', content='Content for the first post') - Post オブジェクトを作成します。
  • session.add(post1) - Post オブジェクトをセッションに追加します。
  • session.commit() - 変更内容をデータベースにコミットします。
  • return engine - データベースエンジンを返します。

/iris エンドポイント

######################
# IRIS Query example #
######################

@app.get("/iris")
def iris_query():
    query = "SELECT top 10 * FROM %Dictionary.ClassDefinition"
    rs = iris.sql.exec(query)
    # Convert the result to a list of dictionaries
    result = []
    for row in rs:
        result.append(row)
    return result
  • @app.get("/iris") - /iris エンドポイントの GET ルートを定義します。
  • query = "SELECT top 10 * FROM %Dictionary.ClassDefinition" - IRIS ネームスペースで上位 10 個のクラスを取得するクエリを定義します。
  • rs = iris.sql.exec(query) - クエリを実行します。
  • result = [] - 結果を保存する空のリストを作成します。
  • for row in rs: - 結果セットを反復処理します。
  • result.append(row) - 結果リストを行にアペンドします。
  • return result - 結果リストを返します。

/interop エンドポイント

########################
# IRIS interop example #
########################
bs = Director.create_python_business_service('BS')

@app.get("/interop")
@app.post("/interop")
@app.put("/interop")
@app.delete("/interop")
def interop(request: Request):
    
    rsp = bs.on_process_input(request)

    return rsp

  • bs = Director.create_python_business_service('BS') - Python ビジネスサービスを作成します。
    • ビジネスサービスの複数のインスタンスを防止するために、ルート定義の外に作成する必要があります。
  • @app.get("/interop") - /interop エンドポイントの GET ルートを定義します。
  • @app.post("/interop") - /interop エンドポイントの POST ルートを定義します。
  • ...
  • def interop(request: Request): - ルートハンドラーを定義します。
  • rsp = bs.on_process_input(request) - ビジネスサービスの on_process_input メソッドを呼び出します。
  • return rsp - レスポンスを返します。

/posts エンドポイント

############################
# CRUD operations posts    #
############################

@app.get("/posts")
def get_posts():
    with Session(engine) as session:
        posts = session.exec(select(Post)).all()
        return posts
    
@app.get("/posts/{post_id}")
def get_post(post_id: int):
    with Session(engine) as session:
        post = session.get(Post, post_id)
        return post
    
@app.post("/posts")
def create_post(post: Post):
    with Session(engine) as session:
        session.add(post)
        session.commit()
        return post

このエンドポイントは、Post オブジェクトで CRUD 操作を実行するために使用されます。

説明することは特にありません。すべての投稿を取得し、ID で投稿を取得し、投稿を作成するためのルートの定義です。

すべては sqlmodel ORM を使って行われます。

/comments エンドポイント

############################
# CRUD operations comments #
############################


@app.get("/comments")
def get_comments():
    with Session(engine) as session:
        comments = session.exec(select(Comment)).all()
        return comments
    
@app.get("/comments/{comment_id}")
def get_comment(comment_id: int):
    with Session(engine) as session:
        comment = session.get(Comment, comment_id)
        return comment
    
@app.post("/comments")
def create_comment(comment: Comment):
    with Session(engine) as session:
        session.add(comment)
        session.commit()
        return comment

このエンドポイントは、Comment オブジェクトで CRUD 操作を実行するために使用されます。

説明することは特にありません。すべてのコメントを取得し、ID でコメントを取得し、コメントを作成するためのルートの定義です。

すべては sqlmodel ORM を使って行われます。

トラブルシューティング

スタンドアロンモードで FastAPI アプリケーションを実行する方法

以下のコマンドを使用して、いつでもスタンドアロンの Flask アプリケーションを実行できます。

python3 /irisdev/app/community/app.py

注: このコマンドを実行するには、コンテナー内にいる必要があります。

docker exec -it iris-fastapi-template-iris-1 bash

IRIS でアプリケーションを再起動する

DEBUG モードでアプリケーションに複数の呼び出しを行うと、変更はアプリケーションに反映されます。

IRIS 管理ポータルへのアクセス方法

http://localhost:53795/csp/sys/UtilHome.csp に移動すると、IRIS 管理ポータルにアクセスできます。

このテンプレートをローカルで実行する

これには、マシンに IRIS がインストールされている必要があります。

次に、IRISAPP というネームスペースを作成する必要があります。

要件をインストールします。

IoP のインストール:

#init iop
iop --init

# load production
iop -m /irisdev/app/community/interop/settings.py

# start production
iop --start Python.Production

セキュリティポータルでアプリケーションを構成します。

0
0 75
記事 Tomoko Furuzono · 3月 19, 2025 3m read

これはInterSystems FAQサイトの記事です。


ISCLOG を有効にすることにより、CSP(REST)アクセスに関連するログ情報を収集できます。これを使用して CSP(REST)でのトラブル時の調査を行うことが可能です。  
◎このツールをトラブルシューティングに使用する場合は、基本的に、エラーを(意図的に)再現できる状況で使用します。
 他のウェブアクセス等がない状態で、単体実行してエラーを発生させ、このログを取得して調査します。
手順は以下のとおりです。

① ログをクリアします。

//IRISKill^ISCLOG//CachéKill^%ISCLOG


② ロギングレベルを設定します。

Set^%ISCLOG=3
------------------------------------
#0 ― ログを記録しません。
#1 ― 例外的なイベント (エラー・メッセージなど) のみをログに記録します。
#2 ― 'method ABC invoked with parameters X,Y,Z and returned 1234' などの詳細な情報をログに記録します。
#3 ― HTTP 要求から受け取ったデータなどの未処理のデータをログに記録します。
------------------------------------

 
③ CSPでエラーになる処理を行います。

0
1 78
記事 Toshihiko Minamoto · 2月 27, 2025 7m read

Flask_logo

説明

これは、ネイティブウェブアプリケーションとして IRIS にデプロイできる Flask アプリケーションのテンプレートです。

インストール

  1. リポジトリをクローンする
  2. 仮想環境を作成する
  3. 要件をインストールする
  4. docker-compose ファイルを実行する
git clone
cd iris-flask-template
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
docker-compose up

使用法

ベース URL は http://localhost:53795/flask/ です。

エンドポイント

  • /iris - IRISAPP ネームスペースに存在する上位 10 個のクラスを持つ JSON オブジェクトを返します。
  • /interop - IRIS の相互運用性フレームワークをテストするための ping エンドポイント。
  • /posts - Post オブジェクトの単純な CRUD エンドポイント。
  • /comments - Comment オブジェクトの単純な CRUD エンドポイント。

このテンプレートからの開発方法

WSGI 導入記事をご覧ください: wsgi-introduction

概要: セキュリティポータルで DEBUG フラグをトグルすると、開発作業の過程で変更内容がアプリケーションに反映されるようになります。

コードの説明

app.py

これはアプリケーションのメインのファイルです。 Flask アプリケーションとエンドポイントが含まれます。

from flask import Flask, jsonify, request
from models import Comment, Post, init_db

from grongier.pex import Director

import iris

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'iris+emb://IRISAPP'

db = init_db(app)
  • from flask import Flask, jsonify, request: Flask ライブラリをインポートします。
  • from models import Comment, Post, init_db: モデルとデータベース初期化関数をインポートします。
  • from grongier.pex import Director: Flask アプリを IRIS 相互運用性フレームワークにバインドする Director クラスをインポートします。
  • import iris: IRIS ライブラリをインポートします。
  • app = Flask(__name__): Flask アプリケーションを作成します。
  • app.config['SQLALCHEMY_DATABASE_URI'] = 'iris+emb://IRISAPP': データベース URI を IRISAPP ネームスペースに設定します。
    • iris+emb URI スキームは、埋め込み接続として IRIS に接続するために使用されます(別の IRIS インスタンスの必要はありません)。
  • db = init_db(app): Flask アプリケーションでデータベースを初期化します。

models.py

このファイルには、アプリケーションの SQLAlchemy モデルが含まれます。

from dataclasses import dataclass
from typing import List
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

@dataclass
class Comment(db.Model):
    id:int = db.Column(db.Integer, primary_key=True)
    content:str = db.Column(db.Text)
    post_id:int = db.Column(db.Integer, db.ForeignKey('post.id'))

@dataclass
class Post(db.Model):
    __allow_unmapped__ = True
    id:int = db.Column(db.Integer, primary_key=True)
    title:str = db.Column(db.String(100))
    content:str = db.Column(db.Text)
    comments:List[Comment] = db.relationship('Comment', backref='post')

説明することは特にありません。モデルはデータクラスとして定義されており、db.Model クラスのサブクラスです。

__allow_unmapped__ 属性は、comments 属性を使用せずに Post オブジェクトを作成できるようにするために使用する必要があります。

dataclasses はオブジェクトを JSON にシリアル化するのに使用されます。

init_db 関数は、Flask アプリケーションでデータベースを初期化します。

def init_db(app):
    db.init_app(app)

    with app.app_context():
        db.drop_all()
        db.create_all()
        # Create fake data
        post1 = Post(title='Post The First', content='Content for the first post')
        ...
        db.session.add(post1)
        ...
        db.session.commit()
    return db
  • db.init_app(app): Flask アプリケーションでデータベースを初期化します。
  • with app.app_context(): アプリケーションのコンテキストを作成します。
  • db.drop_all(): データベースのすべてのテーブルをドロップします。
  • db.create_all(): データベースのすべてのテーブルを作成します。
  • アプリケーションの偽データを作成します。
  • データベースオブジェクトを返します。

/iris エンドポイント

######################
# IRIS クエリ例 #
######################

@app.route('/iris', methods=['GET'])
def iris_query():
    query = "SELECT top 10 * FROM %Dictionary.ClassDefinition"
    rs = iris.sql.exec(query)
    # Convert the result to a list of dictionaries
    result = []
    for row in rs:
        result.append(row)
    return jsonify(result)

このエンドポイントは、IRIS データベースでクエリを実行し、IRISAPP ネームスペースに存在する上位 10 個のクラスを返します。

/interop エンドポイント

########################
# IRIS interop example #
########################
bs = Director.create_python_business_service('BS')

@app.route('/interop', methods=['GET', 'POST', 'PUT', 'DELETE'])
def interop():
    
    rsp = bs.on_process_input(request)

    return jsonify(rsp)

このエンドポイントは、IRIS の相互運用性フレームワークをテストするために使用されます。 ビジネスサービスオブジェクトを作成し、それを Flask アプリケーションにバインドします。

注: bs オブジェクトは有効な状態を維持するために、リクエストの範囲外にある必要があります。

  • bs = Director.create_python_business_service('BS'): 'BS' というビジネスサービスオブジェクトを作成します。
  • rsp = bs.on_process_input(request): リクエストオブジェクトを引数としてビジネスサービスオブジェクトの on_process_input メソッドを呼び出します。

/posts エンドポイント

############################
# CRUD operations posts    #
############################

@app.route('/posts', methods=['GET'])
def get_posts():
    posts = Post.query.all()
    return jsonify(posts)

@app.route('/posts', methods=['POST'])
def create_post():
    data = request.get_json()
    post = Post(title=data['title'], content=data['content'])
    db.session.add(post)
    db.session.commit()
    return jsonify(post)

@app.route('/posts/<int:id>', methods=['GET'])
def get_post(id):
    ...

このエンドポイントは、Post オブジェクトで CRUD 操作を実行するために使用されます。

dataclasses モジュールにより、Post オブジェクトは簡単に JSON にシリアル化できます。

以下では、すべての投稿を取得する sqlalchemy の query メソッドと、新しい投稿を作成するための addcommit メソッドを使用しています。

/comments エンドポイント

############################
# CRUD operations comments #
############################

@app.route('/comments', methods=['GET'])
def get_comments():
    comments = Comment.query.all()
    return jsonify(comments)

@app.route('/comments', methods=['POST'])
def create_comment():
    data = request.get_json()
    comment = Comment(content=data['content'], post_id=data['post_id'])
    db.session.add(comment)
    db.session.commit()
    return jsonify(comment)

@app.route('/comments/<int:id>', methods=['GET'])
def get_comment(id):
    ...

このエンドポイントは、Comment オブジェクトで CRUD 操作を実行するために使用されます。

Comment オブジェクトは外部キーによって Post オブジェクトにリンクされます。

トラブルシューティング

スタンドアロンモードで Flask アプリケーションを実行する方法

以下のコマンドを使用して、いつでもスタンドアロンの Flask アプリケーションを実行できます。

python3 /irisdev/app/community/app.py

注: このコマンドを実行するには、コンテナー内にいる必要があります。

docker exec -it iris-flask-template-iris-1 bash

IRIS でアプリケーションを再起動する

DEBUG モードでアプリケーションに複数の呼び出しを行うと、変更はアプリケーションに反映されます。

IRIS 管理ポータルへのアクセス方法

http://localhost:53795/csp/sys/UtilHome.csp に移動すると、IRIS 管理ポータルにアクセスできます。

このテンプレートをローカルで実行する

これには、マシンに IRIS がインストールされている必要があります。

次に、IRISAPP というネームスペースを作成する必要があります。

要件をインストールします。

IoP のインストール:

#init iop
iop --init

# load production
iop -m /irisdev/app/community/interop/settings.py

# start production
iop --start Python.Production

セキュリティポータルでアプリケーションを構成します。

0
0 69
記事 Hiroshi Sato · 9月 12, 2024 1m read

これは InterSystems FAQ サイトの記事です。
 

messages.logまたはcconsole.log内に記録されるCSPGatewayLatencyのメッセージは、サーバが、パフォーマンス測定のため定期的に「CSPゲートウェイにリクエストを送信して応答をもらう」ことを行っており、応答を受け取るまで一定時間以上かかったときに出る警告(応答時間の閾値)です。

その既定値は1000ミリ秒です。

WebGateway(CSPGateway)が稼働する Web サーバの負荷が高い場合に出力する場合がありますが、実際のCSPアプリケーションやREST APIの動作や応答速度に影響が見られなければ、特に問題はありません。

またこのメッセージの出力頻度を下げるためにこの閾値を変更する方法もあります。

変更方法は以下を参照ください

ヘルスモニタのセンサー値をコマンドで変更する方法 

0
0 90
記事 Hiroshi Sato · 9月 12, 2024 2m read

これは InterSystems FAQ サイトの記事です。
 

404エラーが返される場合に、以下の対応でエラーが解消されることがわかっています。


(1) binの接続を許可

/cspの構成エディタ>セクションで以下選択

  system.webServer > security > requestFiltering

  > hiddenSegmets 選択 > (コレクション)の右欄(Count=xx)の右端 [...] クリック

  > segment欄に binの行があったので、選択して削除

  > 画面戻って、右上の [適用] クリック  

または、IISの構成ファイルを直接編集することでも対応可能です。

C:\Windows\System32\inetsrv\config\applicationHost.config

そのファイルから以下のような記述部分を探し、<add segment="bin" />の行を削除し、保存します。

0
0 213
記事 Megumi Kakechi · 9月 3, 2024 2m read

これは InterSystems FAQ サイトの記事です。
HTTPレスポンスヘッダ情報を取得したい場合、以下のような方法があります。
開発中などに、送られてきたヘッダの項目名、そのデータを確認したい場合に、是非ご活用ください。
 

*CSPまたはRESTでヘッダ情報を取る場合

set var=""for {
   set var=$order(%request.CgiEnvs(var))
   if var=""quitset val=$get(%request.CgiEnvs(var))
   write var_": "_val,"<BR>"
 }

%request オブジェクトについて


*ターミナルで情報を取る場合

%Net.HttpRequest クラスの Head メソッドを使用します。

set http = ##class(%Net.HttpRequest).%New()
 set http.Server = "localhost"set http.Port = 80do http.Head("/csp/user/menu.csp")         // ヘッダ情報をリクエストするURLdo http.HttpResponse.OutputToDevice()
 set http = ""


*簡単に目で見る場合

0
0 123
InterSystems公式 Yoichi Miyashita · 6月 18, 2021

InterSystems は、より新しく優れたオプションが利用可能になったときに従来のテクノロジーの開発を中止することがあります。
ただし、それら機能は最小サポートバージョン以後の製品であれば他の機能と同等にサポートします。

非推奨(Deprecated)とは、InterSystems が現在積極的に開発を行っておらず、より優れたオプションが存在する機能またはテクノロジーを意味します。
非推奨の機能やテクノロジーを使用されているお客様はそれらを使用しないように計画していただく必要がございます。
InterSystems は非推奨の製品機能をサポートするためのスタッフの専門知識を維持しております。
例: ICM, NLP, Studio, UIMA, Spark Connector, Atelier, Zen, Zenレポート, Cache Server Pages (CSP)

廃止された(Discontinued)とはその機能またはテクノロジーが既存アプリケーションであっても今後利用できなくなることを意味します。
InterSystems はそのような技術を使用し続けることがお客様のリスクであると考えます。
理由には以下が挙げられますが、これらに限定するものではありません。

1
0 388
記事 Hiroshi Sato · 1月 9, 2024 1m read

最後にCSP機能の中でReactでうまく置き換えできなかった処理について紹介します。

該当する処理は、サーバー上の商品データに含まれるその商品の画像データ(GIF形式)を取得して、ブラウザにイメージとして描画させるものです。

CSPにはStreamServer.clsというサーバー側で動作する機能が用意されています。

この機能を使ってデータベース上に格納されているストリームデータをHTML IMGタグで処理できる形式に変換してくれます。

StreamServer機能を使って画像を表示する処理

Reactで同様の機能を実現する方法が見つからなかったため(そもそもReactはサーバーサイドではなくクライアント上の技術なので)、データベース内に格納されているイメージを取得するのではなく、静的なイメージファイルをウェブサーバーが参照可能な場所に置くことで解決しました。

0
0 123
記事 Hiroshi Sato · 12月 26, 2023 3m read

IRIS側の処理は、IRISでREST APIを実装する方法を理解していれば、簡単です。

前回のログイン処理でユーザー認証をIRIS側でどのように実装されているか確認して見ましょう。

まずはディスパッチクラスの定義です。

Shop.Brokerというクラスの中で定義されています。

checkpasswordというメソッドが最後に定義されていて、最終的にShop.Rest.Customer:checkPasswordという(クラス)メソッドが呼ばれているのがわかると思います。

ここで定義しているパラメータは、とりあえずおまじない的に含めておくことをお勧めします。

(説明し出すと少し長くなるので)

0
0 153
記事 Hiroshi Sato · 12月 26, 2023 7m read

それでは、今回はより具体的にReact開発方法について解説します。
ショップデモのリポジトリの配下にreactというディレクトリがあります。

この下にReactのコードがあります。

ここのreact-setup.mdに記載されている通り、前準備としてreactのテンプレートを作ります。

npx create-react-app shopdemo --template typescript

 

あとはこのReactプロジェクトを動かすためのライブラリのインストールを行います。

詳細は、react-setup.mdに書いてあります。

まず3つのディレクトリがあって、これは絶対こうしなければならないというものでもないのですが、基本的なお作法として用意するのが一般的なようです。

  • public
    • ここにはindex.htmlだけ置くのが一般的なようです。
    • テンプレートが自動生成するものでも良いのですが、Bootstrapを使用する場合は、テンプレートのindex.htmlにそのライブラリのロードを付け加えています。
  • components
    • ここに自分で開発するreactコンポーネントを配置します。
  • hooks
    • hookを用意する場合は、ここに配置します。 ​​​​

ここでは、まずログインをするためのユーザー認証を行うコンポーネントの処理について説明します。

0
0 293
記事 Hiroshi Sato · 12月 26, 2023 4m read

CSPを使って作成したアプリケーションをReactを使用して書き換える2回目の記事です。

前回の記事で紹介したショップデモの書き換えについてもう少し詳しく説明します。

まずReactについて、インターネット上に様々な情報が提供されていますので、それらを利用しながら学習するということも可能だとは思いますが、一方で学習時間を短縮するには、やはりReactについて説明した本を一通り読む方が速いのではないかと思います。

実際Reactに関する本はたくさんあるので、その中から自分に合いそうなものを選ぶのが良いかと思います。

ちなみに参考までに私が学習に使ったものは、以下です。

  • React実践の教科書
    • この本はReactの基本を習得するのに非常に役立ちました。
  • React開発 現場の教科書
    • こちらは、少し高度な内容になっていて、単にReactの使い方を教えるというより、Reactの様なフレームワークが必要である背景とか、現在のWebアプリケーション開発に必要なデザインやアプローチに踏み込んだ内容になっています。


詳細は、本を読んでいただくとして、ここでは私の経験上のReact学習のポイントについて、いくつか列挙したいと思います。

0
0 189
記事 Hiroshi Sato · 11月 13, 2023 2m read

CSPは非推奨機能となり、今後の新規アプリケーションの開発には使用しないことが推奨されています。

代わりに昨今のウェブアプリケーション開発に広く利用されているモダンなフレームワークの使用が推奨されています。

Webアプリケーション開発用のJava scriptフレームワークはたくさんあり、そのどれを選択するかは開発者の好みの問題です。

その中で比較的人気の高いReactを使って、CSPアプリケーションを書き換えた例について紹介します。
ちなみにCSPは機能的には2つの側面があり、今回非推奨となったのは、HTMLをサーバー側で生成するための拡張機能を使ったプログラミングに関連する部分です(.cspファイルを使用したHTMLとサーバーサイドプログラミング、Javascriptプログラミングによる開発)。

HTTP通信のインフラの部分(リクエストオブジェクトやセッション管理など)は引き続きIRISの根幹を支える機能として残ります。

実際、現在のIRISのREST関連機能は、このインフラ上で実装されています。

さて、CSPで記述されたアプリケーションをJavascriptフレームワークを使ったアプリケーションに簡単にコンバートできたらいいなと思われるでしょうが、残念ながらそんなうれしい方法はありません。

1
1 308
記事 Megumi Kakechi · 9月 6, 2023 1m read

Windows環境にWebGatewayのみをインストールした場合に、「Service Unavailable / HTTP Error 503. The service is unavailable.」エラーとなりWebアプリケーションに接続できない場合があります。

 

こちらは、Visual C++ 再頒布可能パッケージ がインストールされていない環境に、Webゲートウェイをインストールした場合に見られる事象です。

Microsoft社のホームページより、Visual C++ 再頒布可能パッケージ(X64)をダウンロードしてインストールしてください。

インストール後IISを再起動し、以下のリンクよりWebゲートウェイ管理ページに接続できることをご確認ください。
 

Webゲートウェイ管理ページ:
http://localhost/csp/bin/Systems/Module.cxw

 
 


エラーが解消されない場合は、IISのアプリケーションプールが起動しているかをご確認ください。


【ご参考】
Microsoft Visual C++ Redistributable latest supported downloads

0
0 340
記事 Megumi Kakechi · 9月 4, 2023 3m read

こちらの記事では、RESTやCSPなどの「Webアプリケーションのトラブルシューティング」のヒントをご紹介します。

何かしらのトラブルと思われる事象が発生した場合、確認したいのがログファイルになります。
各コンポーネント間のやり取りで、どこでどのようなトラブルが発生しているかを、それぞれログを取得して確認することができます。

① クライアント ⇔ Webサーバ間では、「Webサーバログ(IISやApacheのアクセスログなど)」、
② Webサーバ ⇔ Webゲートウェイ間では、「イベントログ」・「HTTPトレース」、
③ Webゲートウェイ ⇔ IRISサーバ間では、「ISCLOG」・「監査ログ」・「messages.log」などがあります。

 

こちらの記事では、IRISで取得できるログとして で取得可能なログの取得方法をご紹介します。
 

② Web サーバと Webゲートウェイ間のアクセスに関連するログ情報


◆ イベントログ

1) Webゲートウェイ管理ページ(http://<IPアドレス>:<ポート>/csp/bin/Systems/Module.cxw)に接続します。

2) イベントログを削除します。
 [イベントログを参照] > ログをクリア をクリック

0
1 442
記事 Megumi Kakechi · 2月 27, 2023 2m read

Question:

Windows環境にて、新規サーバにWebゲートウェイ(Web Gateway)をインストールしたところ「HTTP Error 503. The service is unavailable.」エラーで接続ができません。
対処法を教えてください。
 

Answer:

IRIS2022.1以降のバージョンでは、Visual Studio 2015 Visual C++ 再頒布可能パッケージ(64bit) のインストールが必須となりました。
IRISをインストールされているお客様は、IRISのインストール時に VC++ 2015 再頒布可能パッケージもインストールされるため気にする必要はありませんが、Webゲートウェイのみインストールされる場合は別途インストールする必要があります。

0
0 300
記事 Megumi Kakechi · 9月 5, 2022 2m read

これは InterSystems FAQ サイトの記事です。
 

Web 経由でのイメージファイルのアップロード/ダウンロードを行うサンプルをご紹介します。
サンプルでは、以下の手順でファイルの「アップロード/ダウンロード」を行っています。

  1. Stream型のプロパティをもったクラスを用意する
  2. upload ボタン押下でイメージファイルをIRISサーバにアップロードする
  3. アップロードされたデータを %request.MimeData で受け取り CopyFromAndSave メソッドを使ってコピー&1 のクラスに保存する
  4. アップロードされたファイルを画面に表示する
  5. download ボタンを押下し、1 のクラスに保存したファイルをローカルにダウンロードする。


サンプルプログラムの使い方は次のとおりです。


最初のページでファイルを選択し go ボタンをクリックすると、次のページにアップロードされた画像が表示されます。

アップロードしたファイルをダウンロードしたい場合は、download ボタンをクリックしてください。

0
0 285
記事 Toshihiko Minamoto · 7月 8, 2022 8m read

皆さん、こんにちは。

IRIS 履歴モニタープロジェクトが更新されました。ZPM とビルトインの REST API /api/monitor/metrics を使用します。

これに伴い、IRIS 2019.4 に含まれた API の機能と可能性を示す CSP ページを新たに作成しました。 そのため、Caché インストールまたは 2019.4 より前の IRISでプロジェクトを使用しているユーザーは、何も気にせずにそのままプロジェクトを使用続けることができます。 

ビルトイン API とその使用方法については、@Murray.Oldfieldが投稿した以下の 2 本の素晴らしい記事をお読みください。 

https://community.intersystems.com/post/monitoring-intersystems-iris-using-built-rest-api

https://community.intersystems.com/post/example-review-monitor-metrics-intersystems-iris-using-default-rest-api

/metrics エンドポイントには多数の使用方法がリストされてはいますが、既存のすべてのグラフにデータソースを指定するには、さらに多くの情報が必要でした。 

その助けになったのがドキュメントです。ドキュメントには、私が求めていたアプリケーション指標の作成方法が説明されていました! 

https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GCM_rest#GCM_rest_metrics_application

カスタムアプリケーション指標を /metrics エンドポイントが返す指標に追加するには、以下を実行します。

  1. %SYS.Monitor.SAM.Abstract を継承する新しいクラスを作成します。
  2. アプリケーションの名前として、PRODUCT パラメーターを定義します。
  3. 目的のカスタム指標を定義する GetSensors() メソッドを実装します。 このメソッドは、成功した場合に $$$OK を返し、SetSensor() メソッドへの呼び出しが 1 つ以上含まれている必要があります。各指標の名前、値、およびオプションのラベルは、このメソッドによって設定されます。

ドキュメントの指示に従って、%SYS.Monitor.SAM.Abstract を継承する diashenrique.historymonitor.util.customSensors クラスを作成します。

/// /metric API のカスタムクラスの例
Class diashenrique.historymonitor.util.customSensors Extends %SYS.Monitor.SAM.Abstract
{

Parameter PRODUCT = "irismonitor";

/// 指標を収集 
Method GetSensors() As %Status
{
    Do ..getDashboardWS(.dashboard)

    Do ..SetSensor("systemuptime",dashboard.SystemUpTime)
    Do ..SetSensor("lastbackup",dashboard.LastBackup)
    Do ..SetSensor("locktable",dashboard.LockTable)
    Do ..SetSensor("journalspace",dashboard.JournalSpace)
    Do ..SetSensor("journalstatus",dashboard.JournalStatus)
    Do ..SetSensor("ecpappserver",dashboard.ECPAppServer)
    Do ..SetSensor("ecpdataserver",dashboard.ECPDataServer)
    Do ..SetSensor("writedaemon",dashboard.WriteDaemon)
    Do ..SetSensor("licensecurrent",dashboard.LicenseCurrent)
    Do ..SetSensor("licensecurrentpct",dashboard.LicenseCurrentPct)
    Do ..SetSensor("licensehigh",dashboard.LicenseHigh)
    Do ..SetSensor("licensehighpct",dashboard.LicenseHighPct)
    Do ..SetSensor("licenselimit",dashboard.LicenseLimit)
    Do ..SetSensor("applicationerrors",dashboard.ApplicationErrors)

    Return $$$OK
}

ClassMethod getDashboardWS(Output dashboard)
{
    New $Namespace
    Set $Namespace = "%SYS"

    Do ##class(Config.Startup).Get(.Prop)
    Set webPort = Prop("WebServerPort")

    Set client = ##class(SYS.WSMon.Client).%New()
    Set client.Location = "http://localhost:"_webPort_"/csp/sys/SYS.WSMon.Service.cls"
    Set dashboard = client.GetDashboard()

    Quit $$$OK
}
}

追加情報のソースについては、SYS.WSMon.Service という Web サービスを選択しました。

この Web サービスには、多数の Web メソッドが用意されており、内容は以下に説明されています。

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_wsmon

すべての準備が整うと、インストーラーマニフェストの最後で、作成したカスタムアプリケーション指標が呼び出されます。

ClassMethod CustomApplicationMetrics() As %Status
{
  New $Namespace
  Set $Namespace = "%SYS"   
  Set status = ##class(SYS.Monitor.SAM.Config).AddApplicationClass("diashenrique.historymonitor.util.customSensors","IRISMONITOR")
  
  Quit status
}

その後、REST API http://localhost:52773/api/monitor/metrics は最終的に以下のようになります。

iris_cpu_pct{id="CSPDMN"} 0
iris_cpu_pct{id="CSPSRV"} 0
iris_cpu_pct{id="ECPWorker"} 0
iris_cpu_pct{id="GARCOL"} 0
iris_cpu_pct{id="JRNDMN"} 0
iris_cpu_pct{id="LICENSESRV"} 0
iris_cpu_pct{id="WDSLAVE"} 0
iris_cpu_pct{id="WRTDMN"} 0
iris_cpu_usage 7
iris_csp_activity{id="127.0.0.1:52773"} 746
iris_csp_actual_connections{id="127.0.0.1:52773"} 10
iris_csp_gateway_latency{id="127.0.0.1:52773"} .585
iris_csp_in_use_connections{id="127.0.0.1:52773"} 1
iris_csp_private_connections{id="127.0.0.1:52773"} 0
iris_csp_sessions 3
iris_cache_efficiency 177.284
iris_db_expansion_size_mb{id="IRISAUDIT"} 0
iris_db_expansion_size_mb{id="IRISLOCALDATA"} 0
iris_db_expansion_size_mb{id="IRISMONITOR"} 0
iris_db_expansion_size_mb{id="IRISSYS"} 0
iris_db_expansion_size_mb{id="IRISTEMP"} 0
iris_db_expansion_size_mb{id="USER"} 0
iris_db_free_space{id="IRISAUDIT"} .27
iris_db_free_space{id="IRISLOCALDATA"} .2
iris_db_free_space{id="IRISMONITOR"} .16
iris_db_free_space{id="IRISSYS"} 9.4
iris_db_free_space{id="IRISTEMP"} 9.6
iris_db_free_space{id="USER"} .38
iris_db_latency{id="IRISAUDIT"} 0.003
iris_db_latency{id="IRISMONITOR"} 0.003
iris_db_latency{id="IRISSYS"} 0.017
iris_db_latency{id="IRISTEMP"} 0.003
iris_db_latency{id="USER"} 0.002
iris_db_max_size_mb{id="IRISAUDIT"} 0
iris_db_max_size_mb{id="IRISLOCALDATA"} 0
iris_db_max_size_mb{id="IRISMONITOR"} 0
iris_db_max_size_mb{id="IRISSYS"} 0
iris_db_max_size_mb{id="IRISTEMP"} 0
iris_db_max_size_mb{id="USER"} 0
iris_db_size_mb{id="USER",dir="/durable/irissys/mgr/user/"} 1
iris_db_size_mb{id="IRISSYS",dir="/durable/irissys/mgr/"} 90
iris_db_size_mb{id="IRISTEMP",dir="/durable/irissys/mgr/iristemp/"} 11
iris_db_size_mb{id="IRISAUDIT",dir="/durable/irissys/mgr/irisaudit/"} 1
iris_db_size_mb{id="IRISMONITOR",dir="/opt/irisapp/IRISMONITOR/"} 11
iris_db_size_mb{id="IRISLOCALDATA",dir="/durable/irissys/mgr/irislocaldata/"} 1
iris_directory_space{id="USER",dir="/durable/irissys/mgr/user/"} 39209
iris_directory_space{id="IRISSYS",dir="/durable/irissys/mgr/"} 39209
iris_directory_space{id="IRISTEMP",dir="/durable/irissys/mgr/iristemp/"} 39209
iris_directory_space{id="IRISAUDIT",dir="/durable/irissys/mgr/irisaudit/"} 39209
iris_directory_space{id="IRISMONITOR",dir="/opt/irisapp/IRISMONITOR/"} 39209
iris_disk_percent_full{id="USER",dir="/durable/irissys/mgr/user/"} 34.45
iris_disk_percent_full{id="IRISSYS",dir="/durable/irissys/mgr/"} 34.45
iris_disk_percent_full{id="IRISTEMP",dir="/durable/irissys/mgr/iristemp/"} 34.45
iris_disk_percent_full{id="IRISAUDIT",dir="/durable/irissys/mgr/irisaudit/"} 34.45
iris_disk_percent_full{id="IRISMONITOR",dir="/opt/irisapp/IRISMONITOR/"} 34.45
iris_ecp_conn 0
iris_ecp_conn_max 2
iris_ecp_connections 0
iris_ecp_latency 0
iris_ecps_conn 0
iris_ecps_conn_max 1
iris_glo_a_seize_per_sec 0
iris_glo_n_seize_per_sec 0
iris_glo_ref_per_sec 32
iris_glo_ref_rem_per_sec 0
iris_glo_seize_per_sec 0
iris_glo_update_per_sec 4
iris_glo_update_rem_per_sec 0
iris_journal_size 1472
iris_journal_space 36141.84
iris_jrn_block_per_sec 0
iris_jrn_entry_per_sec 0
iris_jrn_free_space{id="WIJ",dir="default"} 36141.84
iris_jrn_free_space{id="primary",dir="/durable/irissys/mgr/journal/"} 36141.84
iris_jrn_free_space{id="secondary",dir="/durable/irissys/mgr/journal/"} 36141.84
iris_jrn_size{id="WIJ"} 100
iris_jrn_size{id="primary"} 1
iris_jrn_size{id="secondary"} 0
iris_license_available 3
iris_license_consumed 2
iris_license_percent_used 40
iris_log_reads_per_sec 25
iris_obj_a_seize_per_sec 0
iris_obj_del_per_sec 2
iris_obj_hit_per_sec 5
iris_obj_load_per_sec 0
iris_obj_miss_per_sec 1
iris_obj_new_per_sec 2
iris_obj_seize_per_sec 0
iris_page_space_per_cent_used 0
iris_phys_mem_per_cent_used 96
iris_phys_reads_per_sec 0
iris_phys_writes_per_sec 0
iris_process_count 32
iris_rtn_a_seize_per_sec 0
iris_rtn_call_local_per_sec 37
iris_rtn_call_miss_per_sec 0
iris_rtn_call_remote_per_sec 0
iris_rtn_load_per_sec 0
iris_rtn_load_rem_per_sec 0
iris_rtn_seize_per_sec 3
iris_sam_get_db_sensors_seconds .000745
iris_sam_get_jrn_sensors_seconds .000811
iris_system_alerts 2
iris_system_alerts_new 1
iris_system_state 0
iris_trans_open_count 0
iris_trans_open_secs 0
iris_trans_open_secs_max 0
iris_wd_buffer_redirty 0
iris_wd_buffer_write 0
iris_wd_cycle_time 706
iris_wd_proc_in_global 0
iris_wd_size_write 0
iris_wd_sleep 9006
iris_wd_temp_queue 81
iris_wd_temp_write 0
iris_wdwij_time 496
iris_wd_write_time 209
iris_wij_writes_per_sec 0
irismonitor_applicationerrors 1
irismonitor_ecpappserver OK
irismonitor_ecpdataserver OK
irismonitor_journalspace Normal
irismonitor_journalstatus Normal
irismonitor_lastbackup 
irismonitor_licensecurrent 2
irismonitor_licensecurrentpct 40
irismonitor_licensehigh 2
irismonitor_licensehighpct 40
irismonitor_licenselimit 5
irismonitor_locktable Normal
irismonitor_systemuptime 0d  1h 18m
irismonitor_writedaemon Normal

クラスの PRODUCT パラメーターを覚えていますか?

Parameter PRODUCT = "irismonitor";

このパラメーターが顧客情報の接頭辞になっています。

この例をお楽しみいただけたでしょうか。コードの参考としてご利用ください。

0
0 178
記事 Toshihiko Minamoto · 6月 28, 2022 5m read

皆さん、こんにちは!

職場で持ち上がった単純なリクエストで始めた個人プロジェクトを紹介したいと思います。 

使用している Caché ライセンス数を調べることはできますか? 

コミュニティに掲載されている他の記事を読んでみたところ、David Loveluck が投稿したぴったりの記事が見つかりました。 

APM - Using the Caché History Monitor(APM - Caché 履歴モニターを使用する)
https://community.intersystems.com/post/apm-using-cach%C3%A9-history-monitor

そこで、David の記事を参考に、Caché 履歴モニターを使って、リクエストされた情報を表示して見ました。 

「どのテクノロジーを使用するのか」という疑問に対し 

私は CSP に決定しました。単純で強力なテクノロジーであるため、私が担当するお客様は Caché が単なる MUMPS/ターミナルではないことに気づくでしょう。

ライセンス、データベース増加状況、CSP セッションの履歴を表示するページを作成した後、「システムダッシュボードとプロセス」ページのデザインを新装することにしました。

私の Caché インスタンスではすべてうまく機能します。

でも、IRIS はどうでしょうか? 

Evgeny Shvarov が投稿した以下の記事に従って、

Using Docker with your InterSystems IRIS development repository(InterSystems IRIS 開発リポジトリで Docker を使用する)
https://community.intersystems.com/post/using-docker-your-intersystems-iris-development-repository

コードを Docker 化して GitHub に配置しました。いくつかの手順を踏めば、どなたでも利用できます。


実行方法

このリポジトリでコーディングを始めるには、以下を実行します。

  1. 任意のローカルディレクトリにリポジトリを Clone/git pull します。
    $ git clone https://github.com/diashenrique/iris-history-monitor.git

  2. このディレクトリでターミナルを開き、以下を実行します。
    $ docker-compose build

  3. プロジェクトで IRIS コンテナを実行します。
    $ docker-compose up -d

テスト方法

ブラウザを開いて、以下のアドレスに移動します。

例: http://localhost:52773/csp/irismonitor/dashboard.csp

ユーザー名 _SYSTEM を使用して、ダッシュボードとその他の機能を実行できます。

システムダッシュボード

システムダッシュボードには、以下の項目が表示されます。

  • ライセンス
  • システム時間
  • アプリケーションエラー
  • Cache プロセス
  • CSP セッション
  • ロックテーブル
  • ジャーナル空間
  • ジャーナルのステータス
  • ECP AppServer
  • ECP DataServer
  • Write デーモン
  • Cache の効率
  • 重大なアラート

線グラフウィジェットには、5 秒ごとにポイントがプロットされます。

 システムメニュー

システムプロセス

プロセスフィルター

さまざまなフィルターを使用して、必要な結果を得ることができます。 また、列のヘッダーを Shift + クリックすると、複数の項目で並べ替えることもできます。データグリッドを Excel にエクスポートすることも可能です!

履歴モニター

CSP セッションとライセンスの履歴モニターでは、情報が以下の 3 つのセクションに分かれて表示されます。

  • 5 分毎
  • 毎日
  • 毎時間

データベースの増加が表示できるのは、毎日の情報のみです。

履歴ページでは以下の機能を共通して使用できます。

日付範囲の選択ツール

_デフォルト_値は、「過去 7 日間」です。

グラフ/データテーブル

各セクションの右上に、2 つのボタン(チャート/データテーブル)があります。

データテーブルには、グラフを作成する情報が表示されます。Excel 形式でダウンロード可能です。

Excel には、CSP で定義されたのと同じフォーマット、コンテンツ、およびグループが表示浚えます。

ズーム機能

すべてのグラフにはズームオプションがあるため、情報をより詳細に可視化することができます。

平均と最大

毎時間と毎日のセクションのグラフには、平均値と最大値が表示されます。

平均

最大

どうぞお楽しみください!

0
0 225
記事 Hiroshi Sato · 12月 20, 2021 1m read

これは、InterSystems FAQサイトの記事です。
 

CSPアプリケーションでは、リクエスト処理時間がサーバー応答タイムアウト値(CSPゲートウェイ管理ページで設定、既定値60 sec)を経過すると、CSPゲートウェイからクライアントブラウザにタイムアウトを通知し、処理を続けているデータプラットフォームサーバプロセスにエラーを発生させます。

エラーが発生している処理を確認して頂き、処理遅延の改善、例えばタイムアウトが発生しないように処理内容を見直して応答時間を短くすることや必要に応じてサーバ応答タイムアウト値を大きくすることで対処可能です。

0
0 485
InterSystems公式 Yoichi Miyashita · 12月 1, 2021

InterSystems 製品のキットには Apache Web サーバが含まれています。
これにより、お客様が外部Webサーバをインストールせずに Caché/IRIS 管理ポータルを動作させる為の便利な方法を提供しています。
ただし、このWebサーバを実稼働インスタンスに使用しないでください。お客様は、システムに応じたニーズとセキュリティ/リスク要件に適合するWebサーバを別途インストールする必要があります。

最近のテストでは、現在含まれている Apache Web サーバにいくつかのセキュリティ問題があることがわかっていますが InterSystems が管理していないテクノロジである為、
InterSystems は、Apache または別のサードパーティから直接取得した Web サーババージョンをインストールし、付属の Apache Webサーバ を無効にすることをお勧めします。
InterSystems は、今後のリリースに Apache Web サーバの新しいバージョンを含める予定です。
現在のバージョンと同様に、そのバージョンも本番インスタンスには使用できません。
当社の製品の将来のリリースでは、InterSystems はWeb サーバを同梱またはインストールしません。
計画の詳細については、今後、更新情報を提供する予定です。 

0
0 179
記事 Hiroshi Sato · 10月 26, 2021 1m read

これは、InterSystems FAQサイトの記事です。
InterSystems 製品の管理ツールやWebページのセキュリティ強化のため、%付きのWebページ(例:管理ポータル上のユニットテストポータル、Webサービスクラスのテスト画面)に対するアクセスがより効率的に制御できるよう、新しいルールが追加されました。

これによりデフォルトで参照可能なページ以外については、明示的に参照許可を設定する必要があり、設定しない場合参照エラーとなります。 以下のドキュメントをご参照いただき、必要に応じて参照許可を設定するようにしてください。


%CSP ページへのアプリケーション・アクセスの制御について

Webサービスクラスのテスト画面の場合は、以下をご覧ください。


Webサービスのカタログおよびテストページについて【IRIS】
Webサービスのカタログおよびテストページについて

0
0 166
記事 Hiroshi Sato · 10月 5, 2021 2m read

これは InterSystems FAQ サイトの記事です。
Web/CSPゲートウェイ管理ページは、通常クライアントマシンからアクセスできないように構成されています。

クライアントからその管理ページにアクセスすると、以下の様なメッセージが返ってきます。

システム管理  このシステムを使用する権限がありません。

Not authorized to use this facility.

You are not authorized to use this facility.

任意のクライアントからアクセスするためには以下の操作を行います。

Web/CSPゲートウェイ管理ページにアクセス可能なシステムからブラウザを起動し、管理ポータルにアクセスします。


管理ポータル>システム管理>構成>の所でCSPゲートウェイ管理をクリックします。


表示されるページの左ペインに表示されるデフォルトパラメータをクリックします。

システム管理マシンの所に*.*.*.*と入力し、設定を保存ボタンを押下げます。

しかしながら任意のクライアントから管理ページにアクセスできるようにするのはセキュリティの観点からはあまりお勧めできません。


アクセスできるクライアントはなるべく限定することをお勧めします。

クライアントアドレスの指定方法としては、以下のような指定形式があります。

0
0 581
記事 Toshihiko Minamoto · 8月 25, 2021 7m read

この記事では、Caché Webアプリケーション(主にREST)のテストとデバッグを外部ツールを用いて行うことについて説明します。 パート2では、Cachéツールの使用について説明します。

サーバー側のコードを作成したのでクライアントからテストしたい、またはすでにWebアプリケーションが存在するが機能していない― そういったときに使用できるのがデバッグです。 この記事では、最も使いやすいツール(ブラウザ)から最も包括的なツール(パケットアナライザー)までを説明しますが、まずは、最も一般的なエラーとその解決方法について少し説明します。

エラー

401 Unauthorized

これは、本番環境へのデプロイ中に最も頻繁に発生するエラーだと思います。 ローカル開発サーバーには通常、最小限のセキュリティ設定か、バニラを除く通常セキュリティ設定が構成されています。 一方の本番サーバーには、より制限的なスキームが適用されます。 つまり、以下を確認してください。

  • ログイン済みであること
  • アクセスするdatabase/table/procedure/row/columnへのアクセス権があること
  • 許可されていないユーザーがOPTIONSリクエストを実行できること

404 Not Found

以下を確認してください。

  • URLが正しいこと
  • 新しいアプリケーションであり、外部Webサーバーを使用している場合は、Webサーバーをリロードしてください。

アプリケーションエラー

最も簡単に見つけるには、スタックトレースを使用できます。 解決策は、完全にアプリケーション固有です。

デバッグツール

Webブラウザ

必ず最初に利用できるデバッグツールはWebブラウザです。Chromeが推奨されますが、Firefoxでも十分にデバッグできます。 GETリクエストについては、URLをアドレスバーに入力すればテストできますが、その他すべてのリクエストには、Webアプリケーションかjsコードの記述が必要です。 一般的には以下のように行います。

  • F12キーを押して、デベロッパーツールを開きます。
  • [Network]タブに移動します。
  • [Preserve Log]チェックボックスがオンになっていない場合は、それをオンにします。
  • XHRリクエストのみを表示します。
  • Webアプリケーションでバグのあるアクションを実行します。

ここから、リクエストを調べて再送信できます。 Firefoxでは、リクエストを繰り返す前にリクエストを編集することも可能です。

メリット:

  • いつでも利用可能
  • 使いやすい(エンドユーザーは[Network]と[Console]タブのスクリーンショットを送信できます)
  • エンドユーザー環境

デメリット:

  • 部分送信/破損などのレスポンスを表示しない
  • 大規模なレスポンスでは速度が低下する
  • 大量のレスポンスでは速度が低下する
  • すべて手動で行われる

RESTクライアント

RESTクライアントは、Webアプリケーションのテスト向けに特別に作成されたスタンドアロンのWebアプリケーションまたはWebブラウザアドオンです。 私はPostmanを使用していますが、似たようなものはたくさん存在します。 Postmanでのデバッグは次のようになります。

Postmanはリクエストをコレクションにグループ化して処理します。 リクエストは環境に送信可能です。 環境は変数のコレクションです。 たとえば、私のCACHE@localhost環境ホスト変数は、localhostに設定されており、userは_SYSTEMに設定されています。 リクエストが送信される際は、変数は選択した環境の値に置き換えられてリクエストが送信されます。

MDX2JSONプロジェクトのサンプルのcollectionenvironmentはこちらにあります。

メリット:

  • 一度作成すれば、どこででも使用できる
  • リクエストの制御に優れている
  • レスポンスの「Pretty」表示

デメリット:

  • 連鎖リクエスト(request1に対するレスポンスがrequest2またはrequest2Bを強制できる)のデバッグは依然として手動
  • 部分送信/破損などのレスポンスに失敗することがある

HTTPデバッグプロキシ

HTTP(S) トラフィックをログに記録するスタンドアロンアプリケーション。 ログに記録されたリクエストを変更して再送信することができます。 私はCharlesFiddlerを使用しています。

メリット:

  • 部分送信/破損などのレスポンスを処理する
  • レスポンスの「Pretty」表示
  • HTTPSトラフィックのサポートに優れている(パケットアナライザーより)
  • キャプチャセッションを保存できる

デメリット:

  • リクエストを送信するために何か(Webアプリケーション/RESTクライアント/JSコード)が必要

パケットアナライザー

ネットワークを通過するトラフィックを傍受してログに記録できるコンピュータープログラム。 データストリームがネットワークを流れる際に、スニファーが各パケットをキャプチャし、必要に応じてパケットの生データをデコードします。 これが最も包括的なオプションですが、適切に動作させるには、ある程度のスキルも必要となります。 私はWireSharkを使用しています。 以下にインストールと使用方法を簡単に説明します。

  1. ローカルパケットをキャプチャする場合は、ループバックについて読み、前提条件のソフトウェア(Windows用npcap)をインストールします。
  2. WireSharkをインストールします。
  3. キャプチャフィルタを構成します(たとえば57772のトラフィックのみをキャプチャするファイルはport 57772とします)。
  4. キャプチャを開始します。
  5. 表示フィルタを構成します(たとえば特定のIPへのhttpトラフィックのみを表示する場合は、ip.addr == 1.2.3.4 && httpとします)。

以下は、ポート57772(キャプチャフィルタ)のhttpトラフィック(表示フィルタ)をキャプチャした例です。

  メリット:

  • 部分送信/破損などのレスポンスを処理する
  • 大量のトラフィックをキャプチャできる
  • 何でもキャプチャできる
  • キャプチャセッションを保存できる

デメリット:

  • リクエストを送信するために何か(Webアプリケーション/RESTクライアント/JSコード)が必要

どれを使用するか

それは目的によって異なります。 まず、リクエストをログに記録する(デバッグプロキシ、パケットアナライザー)かリクエストを生成(ブラウザ、RESTクライアント)することを目的とすることができます。

REST Web APIを開発している場合は、RESTクライアントを使用するのが、動作をテストする最速の方法です。

ただし、RESTクライアントからのリクエストが機能してもクライアントWebアプリケーションが機能しない場合は、httpデバッグプロキシとパケットアナライザーが必要となることがあります。

クライアントがあり、サーバー側APIを開発してそれを操作する場合は、httpデバッグプロキシかパケットアナライザーが必要となります。

4種類すべてのツールを理解し、使用中のものが作業に不十分となった場合に素早く切り替えられるようにしておくことをお勧めします。

適切なツールが明確である場合もあります。

私は最近、人気のあるhttp拡張プロトコル用のサーバー側APIを開発しましたが、その際の要件は次のとおりでした。

  • クライアントがすでに作成済みであり、コードを変更できない。
  • クライアントごとに動作が異なる。
  • httpとhttpsでの動作が異なる。
  • 認証タイプごとに動作が異なる。
  • クライアントごとの1秒当たりのリクエスト数は最大100件である。
  • 全員がRFCを無視する。

この要件で使用できるソリューションは1つしかありません。パケットアナライザーです。

または、JS消費用のREST APIを開発しているのであれば、テストに最適なツールはRESTクライアントです。

Webアプリケーションをデバッグする場合は、Webブラウザでデバッグを開始しましょう。

パート2では、Webデバッグに関してCaché側でできること(たくさんあります)について説明します。

皆さんは、クライアント側通信をデバッグする際にどのようなアプローチを採用していますか?

0
0 1721
記事 Megumi Kakechi · 6月 30, 2021 2m read

これは InterSystems FAQ サイトの記事です。

2012.1以降管理ポータルの使用もライセンスを消費する様にシステムを変更しました。

これはインターシステムズが定める製品のライセンスポリシーとシステムの動作をできるだけ合わせる一連の措置の1つとして行われました。

この変更に伴いライセンス使用に関わる思わぬトラブルが発生する可能性がありますので注意が必要です。

特にライセンスの解放が管理ポータルページの操作法によって異なるため、その違いを十分認識して対処する必要があります。
 

管理ポータルのライセンスの解放はページの切断の仕方により以下の様に変わります。

a) ポータルを開き何らかの操作を行った後にログアウトを行うとライセンスは即時解放されます。

b) ポータルのページを開いた後、他に何も操作せずにログアウトを行うと一定の待ち時間の後にライセンスの解放が行われます。

この待ち時間はライセンスの意図的な規約違反を防ぐための措置であるため、設定等で変更できないようになっています。

c) ポータルを開き、ブラウザのXボタンやAlt+F4等のショートカットでページを強制的に閉じた場合は、デフォルトでは8時間後にライセンスの解放が行われます。
 

ライセンスの解放の時間は以下の操作で変更することができます。

0
0 428
記事 Toshihiko Minamoto · 6月 29, 2021 5m read

RESTフレームワークの有用な機能の1つに、ディスパッチクラスがリクエストのプレフィックスを識別して別のディスパッチクラスに転送するという機能があります。 URLマップをモジュール化するこの手法により、コードの可読性が向上し、インターフェースの個別のバージョンが管理しやすくなります。また、特定のユーザーのみがアクセスできるように、API呼び出しを保護する手段も得ることができます。

概要

CachéインスタンスにRESTサービスをセットアップするには、専用のSCPアプリケーションを定義して、それに関連付けられた、受信リクエストを処理するディスパッチクラスを作成する必要があります。 ディスパッチクラスは、%CSP.RESTを拡張し、URLマップを含むXDataブロックを含めます。 こうすることで、システムに、特定のリクエストを受信したときにどのメソッドを呼び出すのかを指示します。

以下に、例を示します。

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
  <RouteUrl="/orders"Method="GET"Call="GetOrders"/>
  <RouteUrl="/orders"Method="POST"Call="NewOrder"/>
</Routes>
}

<Route> 要素は、サービスが処理するさまざまなリクエストを定義しています。 「/orders」リソースのGETリクエストは、クラスに「GetOrders」メソッドを呼び出しています。 同じリソースに対して行われるPOSTリクエストは、代わりに「NewOrder」メソッドを呼び出しています。

CSPアプリケーション名は、URLマップでリクエストされるリソース名の一部としてみなされないことに注意しておくことが重要です。 次のアドレスに対して行われるリクエストについて考えてみましょう。

http://localhost:57772/csp/demo/orders

CSPアプリケーションを「/csp/demo」とした場合、ディスパッチクラスが処理するリクエストのセグメントは、アプリケーション名の後に続くものだけになります。 つまり、この場合は「/orders」のみということになります。

リクエストの転送

URLマップで利用できる、ディスパッチクラス内のメソッドを呼び出す以外のオプションは、特定のプレフィックスに一致するすべてのリクエストを別のディスパッチクラスに転送する方法です。

これは、UrlMapセクションの<Map> 要素を使って行います。 この要素には、**Prefix Forward**の2つの属性があります。 リクエストURLがプレフィックスの1つに一致する場合、そのリクエストを特定のディスパッチクラスに送信して処理を続けることができます。

以下に、例を示します。

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
  <MapPrefix="/shipping"Forward="Demo.Service.Shipping"/>
  <RouteUrl="/orders"Method="GET"Call="GetOrders"/>
  <RouteUrl="/orders"Method="POST"Call="NewOrder"/>
</Routes>
}

/orders」のGETリクエストまたはPOSTリクエストは、このクラスによって直接処理されますが、 「/shipping」プレフィックスに一致するリクエストは、独自のURLマップを持つ「/shipping」ディスパッチクラスにリダイレクトされます。

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
  <RouteUrl="/track/:id"Method="GET"Call="TrackShipment"/>
</Routes>
}

URLルーティングの詳細

リクエストされたURLの各コンポーネントが、最終的に呼び出されるメソッドにどのような影響があるのかを示すために、次のアドレスのリクエストを分解して説明します。

http://localhost:57772/csp/demo/shipping/track/123
http://The protocol used for the request.
localhost:57772The server that we connect to.
/csp/demo/shipping/track/123The resource being requested.
/csp/demoThe CSP application name.
A dispatch class is defined for the application, route the request there.
/shipping/track/123The resource segment sent to the first dispatch class.
/shippingThe prefix that matches the <Map> element in the URL map.
Redirect to the Demo.Service.Shipping class.
/track/123The resource segment sent to the second dispatch class.
Matches the route "/track/:id".
Call the method TrackShipment(123).

 使用時のメリット

  • ソース管理 — REST APIを複数のクラスに分離すると、各クラスの全体的なサイズが小さくなるため、ソースの管理履歴を明確かつ読みやすく維持することができるようになります。  
  • バージョン管理 — 転送を使用すると、複数のバージョンのAPIを簡単に同時にサポートすることができます。 1つのディスパッチクラスは、「/v1」または「/v2」プレフィックスに一致するリクエストを、そのバージョンのAPIを実装するディスパッチクラスに転送できます。 私たちの新しいIDEであるAtelierの中心にあるREST APIでは、これと同じバージョン管理スキームが使用されています。  
  • セキュリティ — 特定の種類のリクエストを管理者だけが実行できるようにする場合など、特定のユーザーに制限されたルーティングをAPIで使用する必要がある場合、独自のクラスにルートを分離すると、特定のプレフィックスを使用して合理的にリクエストを転送することができます。 2つ目のディスパッチクラスでOnPreDispatchメソッドが定義されている場合、各リクエストを処理する前に、そのコードが実行されます。 サービスはこれを利用して、ユーザーの権限を確認し、処理を続行するか、リクエストをキャンセルするかを決定できます。
0
0 440
記事 Mihoko Iijima · 4月 22, 2021 4m read

これは InterSystems FAQ サイトの記事です。
 

ルーチン(*.mac)の場合

ソースプログラムのコンパイル後に生成される *.obj のみをエクスポート/インポートすることでソースの隠蔽化を実現できます。

コマンド実行例は、EX1Sample.mac と EX2Sample.mac のコンパイルで生成される EX1Sample.obj と EX2Sample.obj をエクスポート対象に指定し、第2引数のファイルにエクスポートしています。

別ネームスペースに移動したあと、エクスポートした XML ファイルを利用してインポートを実行しています。

0
0 304