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

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

タグ:export

(以下 2023/05/15 追記)
このブログエントリで紹介している DXL Import 機能は正しく動くようになりました。記録として残しておきますが、現状は問題なく動作します。
(以上 2023/05/15 追記)


自作ツール dxl.vbs を紹介する目的で先日こんなブログエントリを書きました:
ノーツデータベースの設計変更履歴を git で管理する

このツール(dxl_export.vbs)は HCL Notes のデータベースをテキスト(XML)化することで、本来はバイナリデータであるデータベースファイルの設計変更履歴(ちょっとカスタマイズするとデータも含めた変更履歴)を git で管理できるようにする、というものです。テキストデータになっていれば変更差分の履歴や、変更一回ごとに限らず任意の2つのタイミングでの変更差分を比較する、といったことも(git の機能として)可能になる、というものでした。

実はこの dxl.vbs にはもう1つ dxl_import.vbs というツールがあります。Export と Import ということで、なんとなく機能の想像がつくかもしれませんが「XML 化されたデータから Notes データベースを復元する」ためのものです。git で変更履歴を管理しつつ、どこかのタイミングで使っていた設計状態に git checkout して、その状態を作成した時のノーツデータベースを復元する、というためのものです。が、残念ながら現時点ではこちらは期待通りに動きません。その点に関する解説ブログエントリとして記載します。

もともとこのツールは LotusScript および Java の API として用意されている DXL Import/Export の機能を使って実装しています。ツールそのものは VBS で、いわゆる ActiveX/COM を使って NotesSession オブジェクトを生成し、そこからこれらの機能を呼び出すことで Export で XML 化し、Import で復元を実装しています。この Import 部分がどうも正しく動いていないように見えるのでした。

少し補足をすると、DXL Export を実行すると指定されたデータベースが XML 化されます。実はここにも一点問題があって、「データに日本語が含まれている場合、XML には encoding 指定のない(つまり UTF-8 )データが出力されるが、実際にはシフト JIS の日本語データが含まれる」というものです。この時点で XML データとしての不整合が生じてしまっています。そのため本ツール(dxl_export.vbs)では、この XML データを書きだす前に強制的に encoding="Shift_JIS" を追加してから出力することで不整合を回避しています。

で、改めて dxl_import.vbs ですが、現状ではこのツールを実行することでノーツデータベースファイル(.nsf ファイル)を(日本語文字列含めて)復元することまではできています(※)。が、この復元結果をノーツクライアントから開こうとするとこのようなエラーが発生してしまって正しく開くことができないのでした:
20230508

↑左のアイコンがある方が元のデータベースで、これを dxl_export してから dxl_import したものが右のアイコンがない方。アイコンは復元できていないが、(日本語の)データベースタイトルは復元できている。でも開くことはできない。

※厳密には dxl_import.vbs 実行時に以下のようなエラーが発生しています。エラーにはなるけど .nsf ファイルは出力されている、という状況です:
2023051402


なお、この復元された(?)ノーツファイルを Domino Designer で開くと、フォームなどの設計要素が空になっています。という意味ではやはり DXL Import に失敗しているとみるべきなのだと思っています:
2023051401


XML の encoding 設定を勝手に書き換えたのがよくなかったのか、、と思ってやり直してみても結果は同じ。というわけで DXL Import がおかしいのか、あるいはその前の DXL Export の時点で何か間違っているのか、その両方なのか・・・ この辺りはもう手が出せないのでこれ以上の対応が難しいのですが、ここがなんとかなればこの1対のツールとしても完成すると思っています。


無料のグループウェアを SaaS で提供していたサイボウズ Live が 2019 年4月15日をもってサービスを終了する、というアナウンスがありました:
サイボウズLiveサービス終了のお知らせ

個人的にも仲間内サークル活動の中で使っていたりしていたもので、このニュース自体はとても残念なものでした。が、終了まで1年半も猶予を持ったアナウンスであり、また(上記リンクによると)今後データのエクスポート(CSVファイル?機能?)などを提供する予定もあるらしいです。データを他のサービスに移行するための準備期間としては充分にあるようにも感じました。

データ移行に関しては時間的な猶予もあるので、しばらくは謹製のデータエクスポートが出されるのを待ってもいいとは思っています。が、個人的/技術的な興味もあって自分でも PHP で作ってみました。詳しくは後述しますが、もしご利用になる場合、現時点ではまだ不完全なものだと理解の上で使ってください。なおこのツールではデータを XML ファイルでエクスポートします(掲示板データなど、改行情報を含むデータは CSV に向かないと判断したので):
https://github.com/dotnsf/cbl_export/blob/master/cbl_export.php


実際に使うには、まず PHP 実行環境が必要です(自分自身がテストした範囲では PHP 5.3.3 でも動きました、かなり古いバージョンでも大丈夫だと思います):
(例 CentOS の場合)
# yum install php php-mbstring php-xml php-pear

加えてプログラムの中で OAuth などの外部ライブラリモジュールを使うため、これらのモジュールをあらかじめインストールしておいてください:
(例 pear を使う場合)
# pear install Net_URL2
# pear install HTTP_Request2
# pear install HTTP_OAuth

またこのツールを使う準備としてサイボウズ Developer Center のアカウントが必要です。同アカウントをお持ちでない場合はリンク先の「デベロッパー登録」ボタンから申請してアカウントを作成してください:
2017102901


アカウント作成後にログインし、「Myアプリケーション」の一覧で「アプリケーションを登録する」を選択し、今から動かすアプリケーションの登録を行います:
2017102902


アプリケーションを登録する際のアプリケーション名などは任意に設定いただいていいのですが、「アプリケーションの種類」は「クライアント」、そして「アクセスレベル」は「レベルZ」を選択する点に注意してください(ここを間違えると正しく動かなくなります。なおアプリケーション種類をクライアントにしないとレベルZのアクセスレベルは選択できないはずです):
2017102903


こうしてアプリケーションを登録し、登録後の画面に表示される Consumer Key と、Consumer Secret をメモしておきます(他人に教えてはいけません)。またアプリケーションの種類とアクセスレベルが正しく登録されていることを確認してください:
20171026



ここまでの準備ができたところで、改めて今回作成したエクスポートアプリを使います。こちらのサイトから git clone するなどして cbl_export.php をコピーします:
https://github.com/dotnsf/cbl_export/blob/master/cbl_export.php


cbl_export.php をテキストエディタで開き、一部を編集します:
<?php
//. cbl_export.php
//. Referer: https://developer.cybozulive.com/doc/current/#id1
//. For XAuth(Ones of Level Z)
$consumer_key           = '(CybozuLive Developer Center Consumer Key)';
$consumer_secret        = '(CybozuLive Developer Center Consumer Secret)';
$xauth_access_token_url = 'https://api.cybozulive.com/oauth/token';
 
$params = array(
    'x_auth_username' =--> '(CybozuLive Email)',
    'x_auth_password' => '(CybozuLive Password)',
    'x_auth_mode'     => 'client_auth',
);

:
:

上記の青字部分を編集します。$consumer_key には上記サイボウズ Developer Center でのアプリケーション登録時に確認した Consumer Key を、$consumer_secret には同 Consumer Secret を代入します。また $params 'x_auth_username' には自分のサイボウズ Live ログイン時のメールアドレスを、そして 'x_auth_password' には同パスワードを指定します。


ここまでの準備ができたら php コマンドで cbl_export.php を実行します:
# php -f cbl_export.php

実行が成功するとカレントディレクトリに自分のメールアドレスと同じ名前のフォルダと、自分がサイボウズ Live で所属しているグループごとの ID(X:XXXXX みたいなフォーマットです)のフォルダが作成され、各データがそれぞれのフォルダ内にエクスポートされます。例えば1つのグループにしか所属していない場合であれば、自分のメールアドレスのフォルダが1つと、そのグループのIDのフォルダが1つ生成されます:
2017102904
(↑自分が実行した場合の結果サンプル)


そして個人のデータはメールアドレスのフォルダ内に、要素毎に XML ファイルでエクスポートされています(現在の仕様ではスケジュール、チャット、ToDo、コネクションのデータがエクスポートされます):
2017102905


またグループ ID のフォルダには各グループ毎のメンバー、掲示板、イベント、ToDo、ファイル共有の情報が XML ファイルでエクスポートされています:
2017102906


なお、このツールを開発するにあたり、サイボウズ Live API を使っています。その仕様はこちらです:
サイボウズLive データ API ドキュメント


(↓2017/Oct/29 時点での制限事項)
上記のように一応動くものが作れたつもりなのですが、2017/Oct/29 時点ではファイルのダウンロード機能が正しく動いていません。例えばサイボウズ Live のファイル共有機能や掲示板の中でファイルを添付しているケースは珍しくないと思っています。その「どんなファイルが添付されているか?」といった情報は取得できて、その情報は現在取得できるファイルの中にも正しくエクスポートできているのですが、肝心のファイルそのもののダウンロードができていません。具体的にはこの API の実行時にだけ想定外のエラーになってしまい、まだその理由や解決策が分からずにいます:
https://developer.cybozulive.com/doc/current/pub/fileDownload.html


この部分については私のミスなのか、API 側の問題なのかの判別ができず、現在は問い合わせ中です。分かり次第に対応するつもりです。
(↑2017/Oct/29 時点での制限事項)


(↓2017/Nov/06 追記)
サイボウズより返答あり。サイボウズ側では問題なく動いているとのこと。むむむ・・ (--;
(↑2017/Nov/06 追記)


添付ファイルのダウンロード以外についてはある程度動くようになっているつもりです。早めのデータ移行を検討していたり、移行先候補へのテストを早めに実行したい場合に活用ください。

なおサイボウズから謹製のエクスポートデータやエクスポートツールが提供された場合は、(きっと面倒なアカウント登録なども不要になると思うので)そちらの利用をオススメします。 (^^;


(↓2017/Dec/19 追記)
kintone エバンジェリストでもある長井様( @akvabit)からコメントをいただき、現在ダウンロード API は画像ファイルのみが対象となっていることがわかりました。つまり画像以外のファイルは現時点では API ではダウンロードできないようです。
併せて長井様からのコメントを参考に PHP ファイルを改良しました。現在は「画像ファイルについてはダウンロードする(画像以外のファイルは無視する)」ような仕様にした上で動いています。
(↑2017/Dec/19 追記)

(↓2017/Dec/24 追記)
ファイルダウンロード機能ですが、動いていたように思えたのですが、やはり正しく動いていませんでした。ロジックを間違えていたせいで気付かなかったのですが、元のエラーが取れていませんでした(画像ファイルを対象にしても同じエラーが発生しています)。
(↑2017/Dec/24 追記)

このページのトップヘ