記事 Akio Hashimoto · 12月 22, 2024 2m read

​ UDL形式でのインポート・エクスポートが出来ない古いCahceバージョンのソースを保守していたり、古くからのバージョン管理下においてXMLでのバージョン管理を行っている環境であったりと、未だにXMLでのエクスポート・インポートが必要になる場面はまれにあるかと思います。 今回、そういった環境下でもわざわざ管理ポータルを開かずとも、VSCodeでXML形式でエクスポートする拡張機能をリリースしましたので、共有させて頂きます。

機能について

編集画面、あるいは、VSCodeのエクスプローラータブ内からクラスを選択し、コンテキストメニューの「XML形式でエクスポート」を実行します。

image

image

XMLファイルは所定の場所に保存されます。保存先は設定で指定が出来ます。

複数のクラスを選択した場合、初期値では1対1でXMLファイルが保存されます。

image  

設定を変更する事で、1つのXMLファイルとして保存する事も可能です。

image  

利用方法

  1. 拡張機能の検索窓から"ObjectScript To XML"を検索し、インストールします。

image

  1. READMEに記載されているソースをダウンロードし、IRISへインポートします。

  2. ウェブ・アプリケーションを作成します。

  3. 必要な場合、拡張機能の設定値を変更します。

image   

"objectscript-to-xml": {
    "applicationName": "/exml-api",
    "exportDir": "exports",
    "bundled": false
}
  • applicationNameに作成したウェブ・アプリケーションの名前を指定します。

  • exportDirにはエクスポートしたXMLファイルの配置先を指定します。

  • bundledがtrueの場合は、1つのXMLファイルとしてエクスポートされます。既定値はfalseです。

0
0 198
質問 Akio Hashimoto · 12月 4, 2024

Pythonでは、拡張モジュールのバージョン違いが混同されないように、venv を使って仮想環境に拡張モジュールをインストールする事を推奨されてたりしますが、IRISから使用する場合に、このvenvで作られた仮想環境を利用する事は可能でしょうか?

PythonPathに仮想環境のパスを指定してはみましたが、プロジェクトから、あるいはimportで、その場所を指定する等出来るでしょうか?

何方か御存知の方がおられましたら、その方法などを教えて下さい。

4
0 251
質問 Akio Hashimoto · 11月 28, 2024

ここ最近になって、VSCodeで以下のようなエラーが出るようになり、波線だらけになってしまいます。
IRISサーバーとは連携出来ていて、コンパイルも通るので大きな問題ではないのですが、ソースが真っ赤っ赤になってとっても見辛いです。
これらを消す方法があれば教えて下さい。
VSCode、拡張モジュール共に最新です。

Avoid using legacy if/else flow control statements (cachequality:OS0089)

鍋蓋カッコを使わない1行のIF文のところで真っ赤な波線が出まくります。
例:if (a = "") set b = "c"
 

Consider using an If statement instead of a postconditional (cachequality:OS0039)

コマンドの後付条件を記載しているところで、青い波線が出まくります。
例:quit:var=""
 

This QUIT invocation exits the current method; consider using RETURN instead (cachequality:OS0031)

処理の途中で、Quitと書いていることろが黄色い波線が出まくります。

ちなみに、以下のようなメッセージも出ます。

5
1 253
記事 Akio Hashimoto · 10月 4, 2024 3m read

IRISはPythonの豊富なライブラリや既存のPythonプログラムをそのまま利用する事も、COS内でネイティブにコーディングする事も可能となりました。 しかし開発において、いくつかの問題点があります。

1. Pythonのバージョン

Pythonを使ったプロジェクトを構築していると、バージョンの問題にあたる時があります。 古いバージョンで開発していたところに、使いたいライブラリが対応していなかった等です。 しかし、IRISのEmbedded Pythonを利用する場合には、Pythonランタイムのバージョンに影響される為、プロジェクトで使用するバージョンは、プロジェクト単位はなく、IRISのバージョン単位で決まってしまいます。 また、現時点ではこのPythonランタイムをアップグレードする事はできません。

2. 外部Pythonファイルの利用

私は既に開発済みのPythonプログラムをそのまま活用したいと思い、外部Pythonファイルを読み込んで利用する方法を取りました。 IRISでは外部Pythonファイルを特定の場所に配置する事で、そのファイルをimportする事が出来ます。 デフォルトは{インストールパス}/lib/python です。 しかし、デフォルトではこの1ヶ所のディレクトリが対象となっていて、さらにサブフォルダは対象外となる為、プロジェクト単位などで管理する事も出来ません。

Python対象パスを指定

PythonPathの値を変更する事で、別のディレクトリを指定できます。 また、複数のディレクトリを指定する事も可能です。 Windowsであればカンマ区切り、linux等であればコロン区切りで複数指定が可能です。 但し、間にスペースを入れると認識されませんので注意して下さい。 また、複数ディレクトリに同じ名前のモジュールが存在すると、最初に読み込まれた物を利用するようです。(筆者実体験から) また、このPythonPathの値は、Pythonの対象ディレクトリを指定した場所だけに変更するのではなく、デフォルトのディレクトリに追加される事に注意して下さい。 PythonPathを書き換えてもデフォルトのディレクトリは読み込まれています。 もしデフォルトのディレクトリに同じ名前のPythonファイルがあると、そちらが先にimportされるようなので注意が必要です。

PythonPathの指定 image ここに記載されていないが、デフォルトのディレクトリも対象となている。

複数指定する場合は、スペースを入れない /opt/iris/python/common: /opt/iris/python/project --> コロンの後にスペースを入れると認識されない。

3. 修正が反映しない

IRISは外部Pythonファイルやライブラリを読み込むと、プロセスが閉じるまで再読み込みをしません。 ですので、外部Pythonファイルを修正しても即時反映しません。 この場合、プロセスを一度閉じて再実行する必要があります。 ターミナル実行時などであれば、対処法が思いつきますが、Webブラウザからの場合は、セッションが閉じられても再読み込みされません。 Webブラウザからのアクセスの場合は、ウェブゲートウェイを閉じる必要があります。それは結構な手間です。 そこで、即時反映に近い動きにする為には、importしたモジュールをリロードする方法があります。

importlib.reload({モジュール名})

これをCOSの中でモジュールをimportしている箇所に記載する事で、実行する毎にモジュールのリロードを行います。

import importlib
import module1
import module2

importlib.reload(module1)
importlib.reload(module2)

以上が、筆者が最近経験したEmbedded Pythonを利用する時に起こった問題点です。

0
0 416
記事 Akio Hashimoto · 7月 5, 2024 2m read

IRISでPythonを扱う時に、既存の%DynamicObject型の値をそのまま利用したいと思うのですが、Embedded Pythonは自動で%DynamicObjectをdict型にはしてくれません。親和性はとてもあるのですが。。。

そこで、既存プログラムで生成した%DynamicObject型の値をPython側、特に外部のPythonファイル側でdict型を期待している関数に利用するにはどうすれば良いか。

少しスマートではありませんが、%DynamicObjectを一旦JSON文字列に置き換え、Embedded Python 内でJSON文字列からdict型に変換する方法しかないようです。
以下が、その手順です。

Set data = {}
Set data.name = "hanako"
Set data.age = 20

Do ..testPython(data)

ClassMethod testPython(arg As %DynamicObject) [ Language = python ]
{
    import json
    import pythonfile

    data = json.loads(arg._ToJSON())
    pythonfile.test(data)
}

pythonfile.py

def test(arg):
    name = arg.name
    age = arg.age

arg._ToJSON()で%DynamicObject型の値をJSON文字列に変換し、更に、json.loads()でJSON文字列をdict型に置き換えています。
"_ToJSON"は、%DynamicObject型の%ToJSONメソッドです。

Pythonファイルの関数からdict型で戻り値がある場合には、この逆を行えば%DynamicObjectで戻すことが出来ます。

Set data = {}
Set data.name = "hanako"
Set data.age = 20

Set sc =  ..testPython(data)
Write sc.status,!

ClassMethod testPython(arg As %DynamicObject) As %DynamicObject [ Language = python ]
{
    import json
    import pythonfile

    result = {}

    data = json.loads(arg._ToJSON())
    re = pythonfile.test(data)
    result.fromJSON(json.dumps(re))

    return result
}

pythonfile.py

def test(arg):
    result = {
        "age":arg.age,
        "status":"ok"
    }

    return result

これで、既存のCOSプログラムと、既存のPythonプログラムを更に有効活用出来るようになります。

5
0 252
記事 Akio Hashimoto · 10月 22, 2023 4m read

開発者の皆さんこんにちは。 これは筆者がDocker上でIRISを動かす時の、構築手順を示した備忘録です。 以前投稿した「Dockerを利用した開発環境下でのIRISへのSSL接続方法」と「IRISサーバーのバックアップと再構築の手順」も合わせて参考にして頂けると良いと思います。

筆者環境

本ドキュメントは筆者の環境に合わせた内容となりますので、以下の環境下でのドキュメントとなります。

  • ホストOS:macOS Sonoma 14.0
  • CPU:Apple M2 Pro
  • Docker:v24.0.6(Docker Desktop for Mac v4.24.2)
  • IRIS:IRIS for UNIX (Ubuntu Server LTS for ARM64 Containers) 2023.2 (Build 227U)

IRISサーバーの構築

Dockerイメージの入手

IRISのDockerイメージファイルを入手します。 入手手順は、Developer Community サイトのメニュー「InterSystems Container Registry」を開き、左側ツリーの "InterSystems IRIS Community Edition" -> "iris-community" -> バージョン を選択。筆者の場合はarm64版のコマンドを実行します。

image

コマンドを実行してDockerイメージを取得します。

image

※ここで接続エラーになる場合、権限が無い可能性があります。トークンを発行してDockerにログインして下さい。

Dockerファイルの作成

以下のようにDockerファイルを作成します。筆者の場合、IRISをインストールした後に管理ポータルから構成を作っていくので、ここでは最小限のコマンドで作成しています。

dockerfile

ARG IMAGE

FROM 'containers.intersystems.com/intersystems/iris-community-arm64:2023.2.0.227.0'

ENV WORKDIR=/tmp/iris

RUN iris start IRIS quietly EmergencyId=sys,sys \
	| iris stop iris quietly

Docker-composeファイルの作成

docker-composeファイルを作成します。上記のDockerファイルだけでも作成は出来ますが、後々の事を考えてDocker-Composeファイルを利用します。

docker-compose.yml

version: '3.8'

services:
  iris:
    build: 
      dockerfile: "dockerfile"
    command: --check-caps false
    container_name: iris_sv
    ports:
      - "9092:52773"
      - "9091:51773"
    volumes:
      - /Users/xxxx/IRIS:/opt/iris
    tty: true
    restart: always
    environment:
      TZ: Asia/Tokyo
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

ポート番号は適宜変更して下さい。
ボリュームの左側値はホスト側のパスです。適宜環境に合わせて下さい。右側値はコンテナのパスです。ここにデータファイル(iris.dat)等を配置しておく事で、コンテナが削除されてもデータは残ります。

docker-composeの実行

作成したdocker-compose.ymlファイルを実行してIRISサーバーのコンテナを起動します。

docker-compose up --build -d

既にビルド済みなら、以下のコマンドになります。

docker-compose up -d

動作確認

管理ポータルを開いて動作確認をします。

http://localhost:9092/csp/sys/%25CSP.Portal.Home.zen

ターミナルを起動してみます。

docker exec -it iris_sv iris terminal IRIS

ターミナルでコマンドを実行してみます。

w $zdt($h, 3, 1)

おそらく、ローカル時間と一致していないかと思います。docker-composeでタイムゾーンを指定してますが、グリニッチ時間になっていると思います。現時点では筆者はここを修正する事が出来ていません。タイムゾーンに正しく沿ったコンテナを作る方法がわかる方がいれば、コメント下さい。

以上がDockerにIRISを構築する手順です。

追記(2023-10-24): docker-compose.yml内で、TZ: Asia/Tokyo としている箇所を TZ: JST-9 と指定する事でコンテナの時間をローカル時間に指定する事が出来ました。情報ありがとうございました。コンテナの時間をグリニッジからローカル時間に変更したい方は是非。

2
1 619
お知らせ Akio Hashimoto · 7月 28, 2023

こんにちは。
VSCodeでObjectScriptにコメントを挿入する拡張機能を作成してみましたので、共有させて頂きたいと思います。


使い方はとても簡単で、コンテキストメニューから「コメントの追加」を選択するだけです。
カーソル位置に合ったコメントが挿入されます。
挿入するコメントの定型文は設定で自由に指定できます。

クラスの説明文を挿入する

 

パラメーターやプロパティの説明文を挿入する

 

メソッドの説明文を挿入する

 

4
0 114
記事 Akio Hashimoto · 3月 16, 2023 3m read

DockerコンテナでIRISサーバーを構築していた時に、Dockerのバージョンアップによって、IRISサーバーが消滅してしまう事がありました。 その経験から、IRISサーバーを復元する為の方法と、事前のバックアップについて共有したいと思います。

###IRISのバックアップ手順

全ての構築が完了したら、事前にバックアップを取っておきます。 クラスやルーチン、グローバルのバックアップは別途、バックアップを取っておく事をお勧めします。

  1. ユーザー定義をエクスポートする。   IRISサーバーで定義したユーザーの設定内容を全てエクスポートします。
zn "%SYS"
write ##class(Security.Users).Export({出力先フルパス})
  1. アプリケーション定義をエクスポートする。   IRISサーバーに定義したアプリケーションの設定内容を全てエクスポートします。
zn "%SYS"
write ##class(Security.Applications).Export({出力先フルパス})
  1. IRISサーバーを停止する。   起動しているIRISサーバーのインスタンス名を指定してIRISサーバーを停止します。
iris stop {IRISインスタンス名}
  1. iris.cpf ファイルをバックアップする。   cpfファイルはインストールディレクトリに在ります。

  2. 各データベースをバックアップする。   各データベースのiris.datをバックアップしておく。   この時、ディレクトリで退避すると良いでしょう。

  3. IRISサーバーを起動する。   IRISサーバーのインスタンス名を指定して起動します。

iris start {IRISインスタンス名}

###IRISサーバーの再構築

IRISサーバーをインストールし直した場合などに、バックアップしておいた情報でIRISサーバーを再構築する。

  1. データベースを元の構成で配置する。   iris.dat等を元のディレクトリ構成で配置しておく。

  2. IRISをインストール。

  3. IRISサーバーを停止する。   IRISサーバーのインスタンス名を指定して停止します。

iris stop {IRISインスタンス名}
  1. バックアップしておいたiris.cpfファイルを上書きする。

  2. 必要に応じて、iris.cpfファイルのパーミッションを変更する。   上手く行かない時はパーミッションを確認して下さい。

  3. IRISサーバーを起動する。   IRISサーバーのインスタンス名を指定して起動します。

iris start {IRISインスタンス名}
  1. ユーザー定義をインポートする。   バックアップしておいたユーザーの定義ファイルをインポートします。
zn "%SYS"
write ##class(Security.Users).Import({バックアップファイルのフルパス})
  1. アプリケーション定義をインポートする。   バックアップしておいたアプリケーションの定義ファイルをインポートします。
zn "%SYS"
write ##class(Security.Applications).Import({バックアップファアイルのフルパス})
  1. 必要な場合、クラス、ルーチンを再コンパイルする。   再コンパイルが必要な場合があります。

以上が、構築したIRISサーバーのバックアップと再構築の手順になります。

0
1 244
質問 Akio Hashimoto · 2月 3, 2022

皆さん
こんにちは。

最近ではVSCodeでIRISのプログラミングを行っている方も多いと思います。
クラスメソッドなんかをコーディングし、実行してエラーとなった場合に、以下のようなエラーメッセージが取得できると思います。

> <UNDEFINED> zNewMethod+32^ClassName.1

これは、NewMethodというメソッド内の32行目でUNDEFINEDが発生した事を指していますが、これは実際にはClassName.clsのNewMethod内の32行目ではなく、ClassName.1というルーチン(int)のzNewMethodでの32行目を示しています。
.clsから生成されるintは空行が削られたり、複数ルーチンに分割されたりしますので、実際のClassName.clsを開いてNewMethodの32行目を見ても実際のエラー箇所では無い場合があります。
VSCodeで開発をしていると、これが結構面倒なのですが、エラーメッセージに出力される行番号を .clsや、.mac 上での行番号に変える方法があれば教えて頂きたく、よろしくお願い致します。

2
0 539
質問 Akio Hashimoto · 2月 1, 2022

Windows端末でCachéやIRIS等を開発環境として使っています。

Windows11での動作状況について、インターシステムズからの正式な対応はまだのようですので、

下記のバージョンで既にインストールをされている方が居られれば、状況などを教えて頂けないでしょうか。

特に問題無く動いていますでしょうか?

・Caché 2017.1

・IRIS for Health 2019.1

この他のバージョンについても情報が御座いましたらよろしくお願い致します。

2
0 402
記事 Akio Hashimoto · 10月 25, 2020 5m read

Docker環境下でWebアプリのコンテナとIRISのコンテナをRESTfulAPIで連携した時の SSL化方法。
ちなみにこの方法で管理ポータル等もSSL通信が可能になります。

参考サイト:

構成

※ Vue.jsはローカル上でホットリロードを利用した開発環境。 ※ IRISはローカル上に構築したDockerコンテナ下で稼働中。

今回、IRISをDockerコンテナで稼働させる方法は割愛します。

WebアプリケーションをHTTPSで利用する

Vue.jsで開発中のアプリケーションをhttpsでホットリロード利用出来るように起動する。

npm run serve -- --https

これで開発中のデバッグ画面をhttpsで呼び出して利用する事ができるようになるが、このままでは、httpsからhttpにアクセスする事が出来ない為、IRISのRESTを呼び出すことが出来ない。

Nginxでプロキシサーバーを立てる

Nginxでプロキシサーバーを立てて、httpsでアクセスされたら全てIRISのサーバーにリダイレクトするようにする。

https://192.168.10.100/ -> http://192.168.10.100:9092/

Dockerfile

FROM nginx

ENV _NGINX_CONF /etc/nginx

RUN mkdir -p $_NGINX_CONF/ssl
RUN apt-get update
RUN apt-get install openssl

※ NginxのコンテナにOpenSSLをインストールしておく

docker-compose.yml

version: '3.7'
services:
    proxy:
        build:
            context: .
        image: proxyiris:latest
        ports:
            - "443:443"
        restart: always
        environment:
            - TZ=Asia/Tokyo

Nginxのコンテナを作成し起動する。

docker-compose up -d

自己証明書を作成する

コンテナにログイン

docker exec -it proxy_proxy_1 /bin/bash

作業ディレクトリを準備

  • 作業ディレクトリに移動
cd /etc/nginx/ssl
  • openssl.cnfの変更
cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.org

※ openssl.cnfのバックアップ

openssl.cnf

・・・
[ CA_default ]

#dir		= ./demoCA		# Where everything is kept
dir		= .		# Where everything is kept
・・・

※編集方法は適宜。私の場合はローカルにコピーしてエディタで修正しました。

ローカルへのコピー方法

docker cp proxy_proxy_1:/etc/ssl/openssl.cnf {コピー先のパス}
  • CA署名時用のシリアルナンバーファイルを準備する
touch index.txt
echo 00 > serial

CA(証明書認証局)を作成

CA秘密鍵の作成。

openssl genrsa -aes256 -out cakey.pem 2048

※パスワードを入力します。

CA証明書リクエストの作成。

openssl req -new -key cakey.pem -config /etc/ssl/openssl.cnf -out cacert.csr

※Common name (e.g, server FQDN or YOUR name) []:192.168.10.100

x509 v3拡張領域の追加内容をファイルで指定する。

touch cav3.txt
echo "basicConstraints = critical, CA:true" > cav3.txt
echo "keyUsage = critical, cRLSign, keyCertSign" >> cav3.txt
echo "subjectKeyIdentifier=hash" >> cav3.txt

CA証明書の作成。

openssl ca -in cacert.csr -selfsign -keyfile cakey.pem -notext -config /etc/ssl/openssl.cnf -outdir . -days 365 -extfile cav3.txt -out cacert.pem

※ iOS13以降、有効期限は13ヶ月となっているので、今回は1年にしています。

サーバー証明書を作成

サーバー秘密鍵の作成。

openssl genrsa -aes256 -out server.key 2048

※パスワードを入力します。

サーバー証明書リクエストの作成。

openssl req -new -key server.key -config /etc/ssl/openssl.cnf -out server.csr

※「Organization Name」と「Common Name」は認証局の時と同じにしておく。

x509 v3拡張領域の追加内容をファイルで指定する。

touch v3server.txt
echo "[SAN]" > v3server.txt
echo "basicConstraints = CA:false" >> v3server.txt
echo "keyUsage = critical, digitalSignature, keyEncipherment" >> v3server.txt
echo "extendedKeyUsage = serverAuth" >> v3server.txt
echo "authorityKeyIdentifier=keyid,issuer" >> v3server.txt
echo >> v3server.txt
echo "subjectAltName=@alt_names" >> v3server.txt
echo "basicConstraints=CA:FALSE" >> v3server.txt
echo "[alt_names]" >> v3server.txt
echo "DNS.1=localhost" >> v3server.txt
echo "IP.1=192.168.10.100" >> v3server.txt
echo "IP.2=127.0.0.1" >> v3server.txt

サーバー証明書の作成。

openssl ca -in server.csr -config /etc/ssl/openssl.cnf -keyfile cakey.pem -outdir . -extfile v3server.txt -extensions SAN -out server.crt -days 365

パスワード無しサーバー秘密鍵の作成。

openssl rsa -in server.key -out nopass_server.key

Nginxに設定ファイルを追加して再起動する

設定ファイル

設定ファイルの作成

touch /etc/nginx/conf.d/irisproxy.cnf

irisproxy.cnf

server {
  listen 443 ssl http2 default_server;
  ssl_certificate         /etc/nginx/ssl/server.crt;
  ssl_certificate_key     /etc/nginx/ssl/nopass_server.key;
  location / {
    proxy_pass http://192.168.10.100:9092;
    proxy_redirect          http:// https://;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

コンテナの再起動

docker restart proxy_proxy_1

以上で、ローカル上のIRISへHTTPS接続出来るようになります。
Webアプリから「http://...:9092/xxx/」とアクセスしてRESTを呼び出している箇所を 「https://.../xxx/」と置き換えるだけです。

2
0 1380
質問 Akio Hashimoto · 10月 19, 2020

Vue.jsのホットリロードを使った環境においてWebアプリケーションを開発しています。Webアプリケーションから開発環境と同じローカルPCにあるDocker上のIRISへ%RESTを使用しRESTfulAPI通信をしていますが、Webアプリケーションをhttpsで利用した場合は、httpsからhttpへはAPI通信ができないので、間にプロキシサーバーを立ててリダイレクトしないといけないと思います。しかし上手くいきません。

○ npm run serve で起動したWebアプリ http -> httpでIRISの%RESTを呼び出せる。

× npm run serve -- --https で起動した場合  https -> http は呼び出しできない。

  https -> プロキシサーバ(https-httpへリダイレクト)-> httpでIRISの%RESTが呼びさせるはず。

環境

Webアプリ:Vue.js 例)https://localhost:3014/

IRIS:Docker上のコンテナで稼働 例)http://localhost:9091 -> 57772

やってみた事

1. Docker上にnginxのコンテナを作成。openssl にてSAN付きオレオレ証明書の作成

2. リダイレクトの定義を作成

現象

7
0 1312
ディスカッション Akio Hashimoto · 9月 3, 2020

前提条件

  • InterSystems ObjectScriptエクステンション 0.9.0
  • Visual Studio Code でローカルにルーチンのファイルを作成している。

問題点

ルーチンをGit等でバージョン管理する等の理由で、IRIS(/Cache)サーバー間でファイル連携している場合に、新規ルーチンをファイルから作成し、サーバーへ「Import and Compile」等を実行するとエラーが出てインポートに失敗する事がある。(xxxxxxxxxxはルーチン名)

ERROR #16006: Document 'xxxxxxxxxx' name is invalid

解決方法

先にサーバーからインポートした事があればお気づきの方もいるかもしれないが、InterSystems ObjectScript エクステンションを使用してルーチンをインポートする場合、ルーチンの先頭行に以下のように1行必要となっている。これが無いと上記のようにエラーとなってしまう。

ROUTINE xxxxxxxxxx

INTやINCファイルの場合は、Type属性が必要。Type属性を省略するとMACファイルとしてインポートされる。

ROUTINE xxxxxxxxxx [Type=INC]

インポートされたサーバー側では上記の1行は追加されたままだが、消してもエクスポートすると自動で付加されるので、一度インポート出来てしまえば心配ない。但し、ローカル側でこの1行を消してしまうと再びエラーとなってしまうので注意して欲しい。

2
0 475