まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:nsf

こちらの続きです:
ノーツデータベースの設計変更履歴を git で管理する(1)

↑のブログエントリを書いた時点では未完成だったインポート機能が使えるようになったので、続きのエントリとして紹介します。

上述の記事内で紹介した dxl_export.vbs ツールでエクスポートした XML データを元の NSF ファイルにインポートするのがもう一つのファイルである dxl_import.vbs です。以下のようにして使います(XML ファイルはフルパス指定が必要な点に注意してください):
> c:\Windows\SysWOW64\CScript //nologo dxl_import.vbs C:\Users\username\dev_mydb.nsf\mydb.xml

成功すると指定した XML ファイルと同じフォルダ内に拡張子が .xml から .nsf になったノーツデータベースが復元されます。復元元のデータ(設計要素と文書)は XML ファイルです:
2023051601


復元されたデータベースをドミノデザイナーで開くと、設計要素も元の(dxl_exporter.vbs でエクスポートされる前の)状態で復元されているはずです:
2023051600


このツールの便利なところは XML データを git でバージョン管理できるという点にあります。つまり元のデータベースが変更される度に dxl_exporter.vbs を実行しておくことで、 git の履歴(ログ)を見て、必要に応じて過去のコミットに戻り(チェックアウトし)、過去の状態の NSF データベースに復元することもできるようになる、という点です。この dxl_importer.vbs が正しく動くようになったことでこちらの機能も動くようになりました。





ノーツのデータベース(アプリケーション)はノーツクライアントやドミノサーバーが無いと開くことができないため、内容を確認したりデータ文書を追加したり、あるいはデータベースそのものの設計を変更したりする際には、原則的にこれらがセットアップ済みの環境が必要です。

特に設計に変更を加える場合、ドミノデザイナーという専用クライアントアプリが必要になります。Eclipse RCP をベースとしたツールとして提供されていますが、データベースそのものがバイナリファイルになっていることもあり、(例えば git などを利用してソースコードの変更履歴管理をする場合と比較して)設計の変更履歴を管理することが難しいのでした。

そんな背景の中、「じゃあノーツデータベースの変更履歴を git で管理できるようにならないか」というアイデアネタを思いつき、実現可能性のありそうな方法を見つけて試しに作ってみました。まだ理想形には至っていないのですが、当初の目的であった「git による変更履歴管理」はできそうな目途が立っているので公開します:
https://github.com/dotnsf/dxl.vbs

で、↑このページ内でも(英語で)使い方の説明をしているのですが、このブログエントリでは図を含めて日本語で紹介します。


【前提条件】
上記コードは MIT ライセンスのオープンソースとして公開しますが、正しく動作させる上での前提条件がいくつかあります:
  • Windows 64bit 環境(32bit でも多分動くが未検証)
  • Windows 版 git がインストール済み
  • ノーツがセットアップ済み
  • 対象データベースに対する設計者以上の権限がある

前提条件について補足します。まずこのツール自体が VBScript で出来ています。実現可能性や使っていただく上での条件をいろいろ考慮した結果、最もハードルが低そうなものを選択しました(これはこれで文字コードが Shift-JIS になってしまう制約があって苦労しました。が、他よりはマシだったと思っています)。この VBScript を動かすため Windows 環境が必要となります。変更管理ツールとしての git も Windows 環境下で動かす必要があります※。

※ WSL を併用している場合であれば、このツールを使って出力した結果のフォルダに WSL のターミナルを移動して WSL の git を使う、ということができないわけではありません。ただこのツール自体が Windows の CLI で動くものなので、コマンドプロンプトを起動して、ツールを実行して、実行結果をそのまま git で管理する、、という使い方が便利で、その場合は(WSL の git ではなく)Windows 環境で動く git 環境が必要です。 また Windows 版で GUI を提供する git もあるようですが、今回のツールを使う場合はコミット ID を指定しての差分比較などを行えることが便利だと思っていて、そういった操作までができる GUI 版 git であればいいのですが、私が軽く調べた限りではそこまでの GUI を持ったものがなかったので、CLI 版の利用をお勧めします。

また「ノーツが不要」というわけではありません。ツールを使って設計をテキストにエクスポートした後は git だけで使えますが、ツール利用時にはノーツが必要で、かつ対象となるデータベースに対して設計者権限または管理者権限がないと設計内容にアクセスできません。設計変更履歴を管理しようとすると何回もこのツールを利用することになると思っていますが、仮に「1回だけ利用して中身をテキスト化する」という目的であったとしても、実行時にはセットアップ済みノーツ環境が必要です。


【ツールの使い方】
ツールは Github のこのリポジトリで公開しています。git clone するか、zip download で README.md ごと取得してください:
https://github.com/dotnsf/dxl.vbs


リポジトリには dxl_export.vbs と dxl_import.vbs の2つのツールが含まれています。が、dxl_import.vbs はまだ開発途中で、期待通りの挙動は実現できていないので、2023年5月の現時点では実質的に dxl_export.vbs だけがリリースされている、とご理解ください。

ツールはコマンドラインツールなので、実行する上では Windows のコマンドプロンプトを使います(管理者権限は不要です)。コマンドプロンプトを開き、dxl_export.vbs を保存したフォルダに移動します:
2023051101


ここで CScript.exe (VBScript のコマンド)を実行して del_export.vbs を動かします。パラメータの最後に設計変更履歴を管理したいノーツデータベースを相対パスで指定します(下の例だと dev/mydb.nsf というデータベースを指定しています)。注意点として CScript.exe は必ず指定のフルパス(c:\\Windows\\SysWOW64\\CScript)を指定して実行する必要があります(64bit Windows ではパスを指定せずに CScript を実行すると 32bit 版の VBScript が実行されてしまいます。64bit 版 Windows では 64bit 版 VBScript を実行するためにこのフルパスを指定して実行してください:
> c:\Windows\SysWOW64\CScript //nologo dxl_export.vbs dev/mydb.nsf

このようなダイアログが表示された場合は、表示されているノーツ ID のパスワードを入力してください(一度入力しておくと次回からしばらくパスワードなしで使えるはずです):
2023051001


dxl_export.vbs が正しく実行されると以下のような出力になります(この例だと dev_mydb.nsf/mydb.xml にエクスポート結果が出力されていることになります):
2023051001


この出力された XML がパラメータで指定したデータベースファイル(dev/mydb.nsf)の設計情報を DXL(Domino XML Language) というフォーマットで出力したファイルになっています:
2023051001


本ツールでは、このバイナリデータベースが XML でテキスト化された状態を git でコミットすることを想定しています。具体的にはこんな感じ:
> git add dev_mydb.nsf\mydb.xml

> git commit -m "first comment"

これでこの状態の設計情報が(テキスト形式で)git に格納され、コミットされました。git はコミット単位で履歴を追ったり、比較できるようになるツールなので、まずはその履歴の1つが記録された状態になりました。

その後、このノーツデータベースになんらかの設計変更が加わったとします。例えば "myForm" という名前のフォーム要素を新たに追加したとします:
2023051101


何らかの設計変更が加わった状態で、再度この dxl_export.vbs ツールを実行します(コマンド自体は最初に実行したものと全く同じです):
> c:\Windows\SysWOW64\CScript //nologo dxl_export.vbs dev/mydb.nsf

するとこの時点での設計情報が dev_mydb.nsf\\mydb.xml ファイルに記録(正確には上書き)されます。この結果をやはり同様に git でコミットします:
> git add dev_mydb.nsf\mydb.xml

> git commit -m "myForm added"

コミットの履歴は "git log" で確認することができます。↓の例では1回目の "first commit" というコメントの付いたコミットと、2回目の "myForm added" というコメントのついたコミットの2つを確認することができます:
$ git log

2023051102


2つのコミットログを並べて "git diff" を実行すると、コミット間の差分を表示することができます(以下の例では "myForm" に相当する設計要素が追加されたことがわかります:
$ git diff (変更前のコミットID) (変更後のコミットID)

2023051103


同様にしてデータベースに設計を加え、ツールを使って XML ファイルにエクスポートして、git でコミットし、git diff で比較することができます。以下の例では LotusScript プログラムの内容が表示できていることわかり、そのプログラムに後からコメントを追加している様子がコミット間比較によって視覚化されています:
2023051104


このように、
・データベースの設計を変更
・dxl_export.vbs ツールを実行
・git で差分をコミット
を繰り返すことで、バイナリデータであるノーツデータベースの設計変更履歴を git で管理することができるようになります。

(2023/05/12 追記 裏技の紹介)
dxl_export.vbs は VBScript なのでテキストファイルです。テキストエディタで開くことでカスタマイズもできます。

例えば 76 行目の
nc.SelectDocuments = selDocs           'Documents

となっている部分。これは「(データベースからエクスポートする要素として)各文書データは対象外とする」ことを指定しています。なので dxl_export.vbs をそのまま使った場合、設計要素のみが対象となって、文書データはエクスポート対象外となります。

ここを、
nc.SelectDocuments = True           'Documents

と無理やり変更して保存すると、文書データもエクスポート対象に含まれるようになります(ただし文書データも含めてエクスポートする場合はメモリ不足のエラーが発生する確率が高くなります)。テキストファイルとして読める形でアーカイブしておきたい場合などに使ってください。


(2023/05/16 追記)
続きはこちらです:
ノーツデータベースの設計変更履歴を git で管理する(2)


このたび、ご縁あって浜名湖競艇のとある単レースの冠スポンサーとなる機会をいただきました:



開催日時: 令和日(水)
開催場所: 浜名湖競艇 第
レース名: .nsf@dominoforever記念


リリースから今年で33年目を迎えたグループウェア「ノーツ・ドミノ」。管理会社も社目となり、なんとなくに縁がありそうですが、信じるか信じないかはあなた次第。。


boatrace



に縁のありそうな日に、同じくに縁のありそうなグループウェア「ノーツ・ドミノ」の記念レースを開催させていただくことになりました。

僕を個人的にご存知でない方のために補足しておくと、gmail やツイッター、ポケモン Go などの各種アカウントで "dotnsf" を使っています。これは ".nsf" のことで、もともとは「ノーツ・ドミノ」システムで使うデータベースファイルの拡張子(.nsf)を由来にしています。もともとはロータス株式会社で Lotus 1-2-3 やノーツを含めたソフトウェア製品の開発を担当しており、その頃から自分の製品には愛着があって今に至ります。そんなノーツ・ドミノは 1989 年(平成元年!)のバージョン1リリースから今年で 33 年目を迎えました(余談ですが、これだけ長く業務に使われているアプリケーションソフトって他に一太郎くらいしか思いつきません)。管理会社は Lotus 、IBM を経て、現在は社目となる HCL に移っています。こういった背景&経緯&愛着もあって、今回この滅多にない機会でのレースのネーミングライツに応募し、当選させていただきました。

※名前の "dominoforever" 部分はコミュニティのハッシュタグとしてよく使われるものですが、・・詳しくはググってみてください(笑)

dotnsf_logo_200x200


この個人スポンサーの冠レース、売上の利益はスポンサーには入りません。みなさんが賭けて外れてもそのぶん僕の懐が潤ったりはしませんので(苦笑)、興味ありましたら(今回、このような機会をいただいた浜名湖競艇様を応援する意味で)視聴したり、舟券を購入してみたりいただけると嬉しいです。

#ちなみに僕は当日は抜けられないお仕事があるので、結果を楽しみにしております。 d(ToT)



ところで今回、この冠レースに個人で申し込みを行って知ったのですが、このような公営競技に個人が冠レーススポンサーになることができるレースがいくつかあります(企業スポンサーほどは多くありません)。またスポンサーになった上での特典もまちまちです。今回の浜名湖競艇様はそんな個人スポンサーを募っている数少ない公営競技の1つです。どんな特典があるのか、といったことも含めて興味を持った方はこちらを参照ください(ここから協賛を申し込むこともできます):
個人向け応募概要

※2021 年2月申し込み時点では新型コロナウィルス感染拡大防止のため、無観客開催が行われており、花束プレゼンターとしての表彰式参加ができません。残念とも言えるし、それで抽選のライバルが減るのはラッキーとも言えるような・・・

この浜名湖競艇の場合は「レース名が20文字以内」、「PR文書が80文字以内」という制限が結構厳しく、色々考えた末にこのようなレース名&PR文書となりました(僕のはどちらもギリギリです)。


この記事の最新版です:
ノーツでワトソンを体験!

上記記事は「IBM ノーツのデータベースコンテンツを IBM Watson の NLC(Natural Language Classifier)に学習させた上で問い合わせを行う」という内容でした。アクセスログを見る限り、そこそこの反響があったブログエントリでした。

が、ある時を境にして、この記事で提供していたサンプルが動かなくなってしまいました。直接の原因は別のブログエントリでも紹介した IBM Watson 側のセキュリティ仕様変更でした:
"javax.net.ssl.SSLException: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 64" エラー


上記記事でも紹介していますが、この回避策の1つがプロクシー的なサービスを作る、というものでした。今回、そのプロクシーサービスを IBM Bluemix 上に作った上でサンプルを改良しました。
2016111101

新しいサンプルはこちらです。使い方は変わっていません:
http://dotnsf.blog.jp/nlcdemo.zip

参考程度に、以前のサンプルはこちらです(注 現在は正しく動きません ノーツ9の FP8 を適用することで動くようになりました)
http://dotnsf.blog.jp/nlcdemo.old.zip



新しい nlcdemo.nsf では、リクエストを全て http://watsonapiproxy.mybluemix.net/nlcproxy 経由で Watson に送信するようにしています。この方法で JDK 1.6 からの HTTPS リクエストをエラーなく実行できるようにしています。




自分はエンジニアのキャリアの中でエクセルではない某表計算ソフトの開発に携わる機会がありました。そんなわけで、どちらかというとアンチ・エクセル派だったりします:
2016082100


また一部の人には公にしていますが、その後ノーツ/ドミノのエンジニアも担当させていただく機会もありました。ノーツは大好きです、.NSF 万歳!


だからというわけではないのですが、そんなバックグラウンドを持つ自分がエクセルデータファイル(*.xls や *.xlsx)をノーツデータベース(*.nsf)化するツールを作ってみました。これで幸せになれる人がいたら使ってほしいです(笑)。

ちなみに OpenNTF.org を探してみると、この逆(ノーツをエクセル化)を実現するようなものは(自分が動かしてみたわけではありませんが)見つかります。が「エクセルをノーツ化」という変態的のはさすがになさそうだったので、技術的挑戦も兼ねて作ってみました。正直かなり手間取りましたが、当初考えていた最低限の挙動はできるようになったので、一旦公開して、紹介します。実体はノーツの NTF および NSF ですが、ACL は誰でも開いてみれるようになっているはずなので、興味ある人は中身を確認したり、もう少し便利に作りなおしたりしてみてください。

まず仕様のおさらいの意味で、どんなインプットに対して、どんなアウトプットができるようになるのか、という点を紹介します。用意する必要があるのはエクセルシートファイルです:
2016081901


このエクセルファイルには複数のシートが存在していることを想定します。そして各シート毎になんらかのデータが格納されているものとします。この例ではシートは3つあり、1枚目(Sheet1)にはこんな感じで、7行5列のデータが入ってます(ちなみに E 列の値は同じ行の C 列の値を2倍したものになるような計算結果として定義されています):
2016082001


一方、2枚目のシート(Sheet2)には10行3列のこんなデータが入っているものとします。シートごとに列数や行数が全く異なるデータが入っていることを想定しています:
2016082002


3枚目のシート(Sheet3)には変換対象範囲を理解する上で役立つシートにしました。シート内のセルが虫食い状態のようにところどころに空白のセルがあるものです。ちなみにこの例では5行3列(A1 セルから C5 セルまでの矩形部分)を変換対象にするような仕様にしています(E2 セルにデータは存在していますが、D 列に全くデータがないので対象外と判定する仕様です):
2016082003


このデータをノーツ化するにあたり、以下の様なルールで変換(というかインポート)します:
  • 1つのエクセルシートの内容を1つのビューとして変換する
  • なので、3つのシートを持つエクセルファイルは3つのビューをもつノーツデータベースに変換される
  • ノーツを使いつつ、見栄えはなるべく表計算っぽくする

実際の作業は以下のようになります。まず今回用意したノーツデータベース "XLS2NSF" (リンクは後述)をノーツクライアントから開きます:
2016081902


いわゆる「ポリシー文書」が開き、使い方などが確認できます。内容は確認いただくとして、すぐに試すには「エクセルファイル指定」と書かれたボタンをクリックします:
2016082101


ファイルダイアログが開くので、エクセルファイル(*.xls / *.xlsx)を指定します。ここでは上記で紹介した MyBook1.xls という3つのシートを持つファイルを指定しています:
2016081904


後は全自動でノーツDB化が実行されます。事実上エクセルファイルを指定するだけ、です。

全ての変換処理が完了すると、指定したファイル名と同じタイトルのノーツDB(ファイルパスはノーツデータディレクトリ直下、ファイル名はタイトルの最後に ".nsf" を加えたもの)がワークスペース上に追加されているはずです。これをクリックすると変換結果が参照できます:
2016081903


この作成されたデータベースをノーツで開いた様子がこちらです。元ファイルには3つのシートが存在していましたが、それぞれのシートがノーツのビューとしてナビゲータから切り替えて見ることができます。こちらは Sheet1 のもの。7行5列の表が中身も含めて再現されています。なお元ファイルでは E 列の中身は同じ行の C 列の2倍になるような計算式でしたが、変換後は固定値になっています:
2016082004


2つ目の Sheet2 に切り替えるとこのようになります。元のシート通り、10行3列の表ができているはずです:
2016082005


3つ目の Sheet3 はこちら。セルの虫食い状態も再現されています。また上記で紹介したように元のシートの A1 セルから C5 セルの部分が変換されているはずです:
2016082006



この変換後のノーツデータベース(のビュー)は ViewEdit モードを実装しているので、特定のセルをクリックすると、そのセルの値を書き換えることができます。以下の例では Sheet2 の C6 列(もともと "4" と入力されていた箇所)を編集して "123" にしている所です:
2016082007


Enter を押すと変更が確定して、元のビューに戻ります:
2016082008


と、まあこんな需要があるのかないのか分からないものを作ってみました。折角なので GitHub で公開しています:
https://github.com/dotnsf/xls2nsf

(注 .nsf や .ntf のノーツデータベースを Git で管理すべきではありません。良い子はマネしちゃだめ)


実際に試してみたい! という奇特な方は、上記 GitHub から "Clone or Download" - "Download ZIP" を選択してダウンロードし、展開して使ってください:
2016081902


また、このブログの中で紹介に使っているエクセルのサンプルファイル(MyBook1.xls)も併せて公開します。ぜひ手持ちのファイルで試していただきたいのですが、良さ気なのがない場合は使ってください:
http://dotnsf.blog.jp/MyBook1.xls


以下、2016/Aug/21 時点での制約です:
  • LotusScript で実装しています。エクセル読み取りは OLE を使っています。そのためノーツクライアントとエクセルがインストールされた Windows 環境でないと動かないと思います。
  • 変換の対象となる部分の計算方法が特殊です。現時点では各シートの A1 セルには必ず値が入っている必要があります。
  • また列は行、列ともに空セルしかない最初の行や列を探して、その内側を対象とみなしています。下の霊であれば、D列と 6 行目には空セルしかないので、その内側の A1 セルから C5 セルまでが対象です(E2 セルにデータがありますが、現在の仕様ではデータ変換の対象にはしません)。
2016082001


ノーツ化することで式による計算機能を失ってしまうわけですが(汗)、代わりに強力な ACL によるアクセス管理ができるようになります。この辺りは改善できればしたいなあ、と思っていますが、ノーツのビュー内の各エントリーの中身を式の結果にするというのは現時点では困難と思ってます。あと1行追加とか、1列追加とか、できそうで実装してない機能もありますが、その辺りは興味ある人に追加実装していただきたいです(手抜きともいう)。

ま、自分で作っておいてなんですが、「そこそこ動く MAD なツール」だと思いますw こういうのは我ながら嫌いじゃない。

このページのトップヘ