2020年1月16日木曜日

ビューで選択中の文書を別のビューですばやく見つける方法

ショートカットキーといえば、効率よく操作するために欠かせません。最近は RPA を活用してショートカットキーが使える Notes クライアントを操作するようなことも行われているようです。

今回はビューやフォルダを移動する時に私が活用している方法をご紹介します。

実はバージョン 8.5 のヘルプには記載されていたのですが、バージョン 9 では探せていません。とは言え Notes V11 ベータでも使えることを確認していますので、まだ現役と思います。

さてここに、過去に実施したプロジェクトに関する話題を登録しているデータベースがあります。話題(=文書)を登録する際、プロジェクトの名称と実施された国名を保存しています。

「プロジェクト別」ビューは、プロジェクト名をカテゴリ表示します。プロジェクト名の左にある▼をクリックすると、プロジェクトに共通する文書のタイトルと国名を表示します。

同様に「国別」ビューもあり、こちらは国名の左にある▼をクリックすると、国に共通する文書のタイトルとプロジェクト名を表示します。

あなたは「プロジェクト別」ビューを見て、「AA橋再構築」が "A国" で実施されたプロジェクトであることを知ります。そしてあなたは「A国に関する話題をもっと知りたい」と思いました。

この時、

  1. ナビゲーションから「国別」をクリックする(国別のビューが開く)
  2. カテゴリのリストから "A国" を探す
  3. その文字の左側にある▼をクリックする

といったプロセスを踏むユーザーが多いのではないでしょうか。

これらの作業では「探す」ことが最もわずらわしいと思いますが、Notes クライアントには、この 2 と 3 を省略できるステキな方法があります。

では、プロジェクト別ビューで「AA橋再構築」プロジェクトの文書をシングルクリックして、文書にフォーカスが当たった状態(ハイライト表示)にしましょう。

ここから [Ctrl] キーを押しながら 1 の操作(ナビゲーションの「国別」をクリック)を行います。

するとどうでしょう!
フォーカスを当てていた文書が、開いた「国別」ビューの中で選択されているではありませんか!

当然のことながら、選択されている文書の付近には、同じ国に関連する文書が表示されています。

カテゴリの数が増えてくると、カテゴリのリストから特定の値(ここでは"A国")探すことは非常につらい作業になる場合がありますが、その手間が無くなったわけです。探す作業をショートカットできるのです。

このワザを、ビューを切り替えた後に目的のカテゴリや文書を「もう一度探す」ことをわずらわしいと感じているユーザーに紹介したところ、すぐさま部内に共有してくださり部内でも評判が良かったとのことでした。意外と知られていなかったようです。

このワザは、たとえばメールの「受信ボックス」の中でフォーカスしている文書を、「すべての文書」ビューに切り替えて表示する、といったように、フォルダとビューの間でも使えます。

私はパソコンの音をミュートしているので知りませんでしたが、選択している文書が切替先のビューに無い場合は警告音がなるとのこと。

ビューを選択するためにマウス操作する時点でショートカットキーじゃないだろうって?
では [Alt] + V → G → 矢印キーでビューを選択 → [Tab] → [Ctrl] + [Enter] なんていかがでしょうか。

2020年1月8日水曜日

Notes データベースを開くショートカットを iPad のホーム画面へ追加する

HCL Nomad が登場して、メール以外の Notes アプリへも設計変更なしにアクセスできるようになり、とても便利になりました。

頻繁に使うデータベースのアイコンはいつも同じ位置にあってほしいものですが、現状の HCL Nomad には、Notesクライアントのようなワークスペースは無く、そのかわりに「最近使用したアプリケーション」の画面に(iPadでは)12個のアイコンが並びますが、アイコンの位置は固定ではありません。

実は HCL Nomad のローカルにも bookmark.nsf が存在し、一度開いたデータベースのアイコンはほぼほぼそちらに追加されているようなのですが、残念ながら現状ではワークスペースをサポートしていません

そこで今回は Notes データベースを開くアイコンを iPad のホーム画面に追加する方法をご紹介します。

まずは Safari を起動して、そのアドレス欄へ notes:///0000000000000E01 (13個のゼロ・イー・ゼロ・ワン)をタイプしてリターンキーをタップしてみましょう。
すると HCL Nomad が起動してローカルのアドレス帳が開くはずです。

Safari では、 http や https で始まる URL の場合、URL へアクセスしている状態で共有ボタンをタップして「ホーム画面に追加」をタップすれば、ホーム画面にアイコンを追加できます。

しかしながら notes:// で始まる URL ではその方法が使えません。

そこで、iOS 12 より実装されている「ショートカット」アプリを使います。

ショートカットアプリを起動して「ショートカットを作成」をタップします。
画面左側のアクションから「Web」をタップします。

画面左側の Safari のカテゴリにある「URLを開く」をタップします。すると、画面右側に「URL を開く」が追加されます。「URL を開く」の “URL”の文字をタップして Notes URL を入力します。

ここでは先ほどの notes:///0000000000000E01 をタイプします。
画面右上の「次へ」をタップします。

ショートカット名を「Nomadでアドレス帳を開く」として「完了」をタップすると、マイショートカットに追加したショートカットが表示されます。

次にショートカットをホーム画面に追加してみます。
マイショートカットに追加したショートカットを長押しして「詳細」をタップします。
「ホーム画面に追加」をタップして「追加」をタップします。するとホーム画面上にショートカットが作成できます。

ちなみに「ホーム画面に追加」をタップして表示される画面で、名前の左にあるアイコンをタップすると、アイコンのイメージを変えることができます。

アイコンのイメージをNotesデータベースのアイコンと同じにすると見た目にもわかりやすいですね。

ホーム画面上のショートカットを自分にとってわかりやすい場所へ移動しておけば、探す手間がなくなり、すばやくアクセスできるようになりそうです。


ところで、ショートカットで開きたい対象の Notes URL を取得するにはどうすればよいのでしょうか。(ここで言う Notes URL とは、URLの最初が notes:// で始まるアドレスを指します)

Notes URL を取得したいとき、私が最も手っ取り早いと考えるのは、Notes クライアントから対象のデータベースに保存されている文書のプロパティを表示し、ヘッダー情報(<+>) のタブにある「識別子」の文字列をコピーする方法です。

ちなみにコピーした文字列を iPad へ渡す手段として、私は iPad からもアクセスできる Domino にテンポラリのデータベースを用意しており、コピーした文字列を Notesクライアントからそのデータベースを経由して iPad へ渡しています。多少面倒ですが...

Notes URL の構造はこのあたりが参考になると思います。文書のプロパティからコピーした場合、URLの最後は文書の UNID で終わっているはずです。ショートカットで開く対象が文書ではなくデータベースそのものだったり特定のビューだったりする場合、取得した Notes URL から文書の UNID 等の余計な文字列を削除したりしておきます。
もし文書を編集モードで開きたい場合、Notes URL にある文書の UNID の右側に "?EditDocument" を追加します。

出来上がった Notes URL が正しく動作するかどうかを簡単に確認したい場合、前出のとおり Safari を使えます。Notes URL をアドレス欄へタイプ(またはペースト)してみましょう。HCL Nomad がインストールされていれば「このページを "HCL Nomad" で開きますか?」と聞かれ、「開く」をタップすれば HCL Nomad 上で開きます。

今回ご紹介した Notes URL のように、アプリに直接アクセスすることができるURLは「URLスキーム」とか「ディープリンク」などと呼ばれていました。検索する際の参考まで。

2019年12月17日火曜日

HCL Master (2年連続 2度目)

今朝がた 2020 年の HCL Masters が発表されました。

HCL Masters Class of 2020


10月のノミネーションから今日まではどきどきでしたが、無事に再任していただけたようで嬉しい限りです。

ちなみに、1年目となる今年(2019年)はコラボレーション分野の IBM Champion がそのまま HCL Master として選ばれました。

世界中の著名なイベント登壇者やブロガーなど多くの有名人が選ばれている中、私もその中の一人になれたことを誇りに思います。

昨年末に IBM Champion として認められてから、人とお会いする機会がずいぶんと増え、その度に励ましていただけたことが、私自身のモチベーションとなっているように感じています。もちろん、発信した情報へのレスポンスも同様ですし、こういった認証制度で認められることは非常に励みになっています。

来年は HCL Master 2年目となるわけですが、このブログやのの会といったこれまでの活動を継続しつつ、ノーツコンソーシアムやテクてく夜会といったコミュニティーへも貢献していけたらいいなと思っています。

2019年12月7日土曜日

HCL Factory Tour 4 in Tokyo に参加しました

12月4日に東京コンベンションホールで開催された HCL Factory Tour 4 in Tokyo に参加しました。

海外のイベントに参加したことの無い私にとって、こんなに興奮した Notes/Domino 関連のイベントはこれまでなかったかもしれません。

ありがたいことに HCL Master には最前列がリザーブされてました。私は2列目の中央に陣取りました。平坦な会場ではまさに特等席でした。
この距離感。最前列は HCL Master 加藤氏のみ。
この席から私の iPhone で撮影したスライドとコメントを残しておこうと思います。
※以下Notes/Domino ばかりでごめんなさい

冒頭に登壇した Richard Jefts 氏は日本市場の重要性について語りました。
Richard Jefts 氏
日本に特化した戦略と投資について。
HCL Digital Solutions にとっての日本
ノーツコンソーシアム、のの会といったコミュニティやパートナーとのエコシステム。のの会関係者としては会場や設備といった面でこれからに期待が持てました。
戦略的パートナーとコミュニティとのエコシステム
IBM Cloudインフラにあるメールを移行するためのツールの提供と、移行先となるパートナーについて。ISW の右下に小さく日本の KTrick 社の文字も。
現行のクラウドメールの移行先となるパートナーと移行ツール

3製品についてロードマップ的な発表がありました。(次の3つのスライドの製品バージョンは今月でてくるものではなく、その1ステップ先のものです)
HCL Domino V12

HCL Connections V7

HCL Sametime V12
次は Json Gary 氏です。私がこのイベントで最も楽しみにしていたセッションです。彼は Domino の進化の方向性について熱心に語りました。

現在の Domino V10 も Docker 対応を謳っていますが、OS込みのイメージでなければなりません。しかしながら将来の Domino はずっとポータブルになりそうです。
クラウドネイティブプラットフォームとしての Domino へ進化

そしてコンテナ化された Domino や DX, Sametime, Connections が Kubernates 上で動作しているイメージも提示されました。ここから数枚は勉強不足によりついていけず。
k8s で動作する Domino や Connections
イベント駆動アーキテクチャと CloudEvents
標準イベントモデルに合わせ、統合を加速
会議室の状況をモニタリングするIoT(センサー)の情報で Dominoの予約データを更新し、更新イベントを受けて Microsoft Teams へ反映する、というイメージが示されました。
IoTとDomino、Microsoft Teamsとの統合のイメージ
次の画面は、先の Domino V12 のスライドにあった Designer Reimagined に相当するものと思います。LotusScript が VSCode に表示されています。
VisualStudio Code 上の LotusScript
次のスライドにある Translation Services とは LotusScript から JavaScript への変換を意味しているのだそうです。この点については嫌な予感がしなくもない。
Project Keep の概要

続いて Andrew Manby 氏から V11 の紹介です。
その前に、ローコード/ノーコードの開発ツール「HCL LEAP」がDomino上で動くよ!とアナウンスされてきましたが、既存の「HCL LEAP」と区別され、Dominoで動くほうは「Domino Volt」となることがわかりました。Volt の図柄は稲妻でイメージしやすいですね。
Domino版の名称は Domino Volt
V11 で注目すべき3つに焦点を絞って紹介しました。

  • Domino Volt
  • Domino Nomad
  • ActiveDirectory同期

Volt, Nomad, AD同期

新たに Low-code 基盤を追加

Domino Volt の eGA は 来年1H

Nomad は iPad のほか iPhone, Android, ChromeOS にも対応

Event Publisher は「文書の追加」といった Domino 上のイベントを公開する

ユーザーはAD上のユーザーのメールアドレスを知らなくても探せるようになる

Sametime はサードパーティーのWebミーティングとの統合をサポート

Notes V11 と Verse オンプレミス (VOP) 1.0.9

Domino V11 の拡張

前回の投稿で触れました DAOS tier 2 ストレージについて、イメージが更新されていましたのでひとこと。これまでの発表(資料のP27)を下(このイベント)のイメージと比較すると、tier 2 のオブジェクトが複数のままに変わったことがわかります。どこかで検証してみたいポイントです。
DAOS tier 2 ストレージの「新しい」イメージ
DQL では全文索引とワイルドカードを使用可能に
Domino 製品戦略
新たなライセンスモデル

ここまでが昼食前。昼食はお弁当が用意されており、おいしくいただきました。※写真撮り忘れた...

そして午後です。
再び登場の Andrew Manby 氏。いよいよ軽量クライアントが出てくるかと思って勝手にわくわくしている私。
シンクライアント戦略
ブラウザ内でNotesが動く、というイメージが示されました。WebAssembly で実現する軽量クライアントはインストール不要になります。
動くデモは見られず...残念!!
Verse のロードマップ

Verse 1.0.8, 1.0.9
 Verse 1.0.10 のスライドに Progressive Web App という言葉が登場しました。これはどのブラウザでも動作するウェブアプリです。パフォーマンスが気になります。
Verse 1.0.10 と PWA

SAML で TLS 1.2 をサポート


このあと、DX と Sametime と Connections についてそれぞれのトップによるセッション、(開発者ではない)Tim Clark 氏による Domino Volt を使ったアプリ開発のデモなどありました。Volt で作成したアプリは Domino Designer で開きますが、既存アプリをモダナイズするといった用途では使えません。

ここでバッサリ省いた内容については セッションの動画が公開されましたので、そちらでご確認いただけるかもしれません。

登壇者はグローバルの製品のトップばかりでした。最高の製品・サービスであり続けるために取り組んでいる事への情熱や自信といったものが伝わってきました。

Notes/Domino V11 のダウンロードは今月(2019年12月)20日(日本時間ではないと思いますが)に利用可能になります。いよいよですね!

2019/12/11 追記
日本語のセッションの資料英語のセッションの資料が公開されました。

2019年12月1日日曜日

DAOS tier 2 ストレージ

リッチテキストフィールドに添付したファイルは通常、データベース( .nsf ファイル)内に保存されますが、添付されたファイルの代わりに「チケット」をデータベース内に保存し、ファイルの実体をデータベースの外(レポジトリ)へ移動して .nlo という拡張子の「オブジェクト」として保持する DAOS (Domino Attachment and Object Service)という機能があります。

リッチテキストへの添付が便利すぎるため、ユーザーはサイズの大きいファイルを文書へ添付しがちですが、DAOS (私はダオスと呼称しています)がすばらしいのは、文書にファイル添付してサーバー上のデータベースへ保存するとか、他のDominoへ複製するなどして文書を転送するときに、転送先のレポジトリに添付ファイルと一致する DAOS のオブジェクトがあれば、添付ファイルの実体を転送せず、添付ファイルをチケットに自動で置き換えて nsf へ保存します。レポジトリに無い場合は、実体をレポジトリに移動します。nsf のサイズとサーバーへ転送するサイズを節約してくれます。

転送と書きましたが言い方を変えると、メールデータベースで DAOS を有効にした場合、サイズが 30MB の動画ファイルを添付したメールを同じホームサーバーを使う1000人へ送ったとしても、サーバー上の1001人のメールデータベース内のメール文書にはチケットがあるだけで、添付ファイルの実体はレポジトリに移動した1つのオブジェクトだけです。DAOSが無効の場合と比較すると、サーバー内のストレージは 30MB x 1000 = 約 30GB が節約されることになります。なお DAOS はメール以外のデータベースでも設定することができます。


さて、2019年12月にリリースされる Domino の次期バージョン V11 には、DAOS のストレージを2層にして、レポジトリ(tier 1)にあるオブジェクトのうち、一定期間参照されないものを S3 互換ストレージ(tier 2)へ移動する、という拡張があります。

直近のイベントで目にした、この拡張のイメージ図(「V11新機能と今後のロードマップ」27ページ)では、複数の Domino サーバーのレポジトリ(tier 1)にあるオブジェクトが、S3 互換ストレージ (tier 2) へ移動するのですが、「実体の同じ」オブジェクトがすでに tier 2 に存在すれば、新たに tier 2 へ移動することなしに tier 1 のオブジェクトを削除する、という風に見えます。※そんな説明は資料にはありません

Domino内の複数のDBから参照される同一の添付ファイルが、Domino内の tier 1 で1つのオブジェクトで管理され、さらに複数のサーバーにある同一の添付ファイルが tier 2 で1つのオブジェクトで管理されるようなのです。

ところで、レポジトリにあるオブジェクトは拡張子が nlo のファイルですが、デフォルトでは元サーバーの鍵で暗号化されます。暗号化された nlo は、他のDominoサーバーのレポジトリに作成されたオブジェクトを持ってきても使えないようになっています。

暗号化された nlo をそのまま tier 2 へ移動したのでは、他の Domino からオブジェクトを参照できても内容を読むことができないのではないでしょうか。

tier 1 に作成されるオブジェクトで暗号化を無効にすることは現行バージョンでも可能です。notes.ini に DAOS_ENCRYPT_NLO=0 を追加しておきます。

Domino V11 ベータ2 の What's New には、tier 2 を設定するにあたり暗号化を無効にしなければならないとは書いていません。複数の Domino で tier 2 を共有する場合の設定にも触れていますが、オブジェクトの暗号化については触れていませんでした。
また、暗号化されたオブジェクトを tier 2 へ移動する際、自動で復号化される、といった細かい話にも触れていません。

もし、現状 DAOS を複数の Domino で使っていて暗号化をデフォルトのまま有効にしている場合、同一ファイルから生成された nlo でも tier 2 上では Domino の数の nlo が作成されるかもしれないのです。これでは少々つまらないですよね。

そんなことを考えながら、ノーツコンソーシアム「ザ・ノーツ研究会」11月度の活動の中で検証してみようと取り組んでみましたが、敢え無く時間切れとなってしまいました...うーん、気になる!

このノーツ研究会で検証する前に V11 ベータ2 が公開され、その What's New を読んでいたとき DAOS tier 2 のことが記載されたのを見つけた(ベータ1には記載が無かった)ので、個人で aws のアカウントを作り、無料枠内で S3 を使って DAOS tier 2 を試してみました。

以下に V11 ベータ2 での印象とか、ベータフォーラムで聞いて分かったこと、What's New に書いていないことなどを、つらつらと書き残しておこうと思います。

あ、tier 2 の有効化やその設定方法は小野様のブログが詳しいです。

S3 にはいくつもの「リージョン」があります。ベータ2の What's New に書かれているリージョンは「米国東部(バージニア北部)」のものでしたが、テスト当初は米国内の違うリージョンにバケットを作成したものの Domino からの接続がうまくいかず(サーバー文書で設定する URL などの設定に問題があった可能性はありますが)結局は米国東部のリージョンにバケットを作成して接続できました。そのせいか、私の環境からだとパフォーマンスは恐ろしく悪く、tier 1 にあった約 1GB のオブジェクトをpushできない理由がわからないときに非常に難儀しました。テストするなら小さい添付ファイルから始めることをお勧めします。

DAOS tier2 に関連した統計情報や notes.ini に追加されるいくつかのパラメータには COS という単語が登場します。これは Cloud Object Storage を省略したものかと思います。

ベータでサポートするストレージは aws S3 と MinIO の2つでした。MinIO はオンプレミスに構築できる S3 互換ストレージのようで、Docker で使えるみたいです。
ひょっとすると aws s3 互換 を謳っているサービスなら使えるのかしら...と思ってグーグル先生に「aws s3 互換」と聞くと、MinIO 以外にもたくさんヒットしました。これらが tier 2 として使えるかどうかは不明です。

tier 1 から tier 2 へ push(移動)するにあたり、ファイルが最後に参照されてからの経過日数を基準としています。これはコンソールコマンド tell daosmgr objectinfo all を投入して出力される objectinfo.txt にある AGE の数値と比較しているように思います。

tier 2 の設定を行い、それが有効になると、show tasks コマンド投入で「DAOS Manager   S3Push: Idol」が出力されます。push している最中は Idol が Processing に変わりましたが、ここではオブジェクト(.nloのファイル)の名前はわかりません。
push しているオブジェクト名とサイズを知りたい場合、notes.ini へ DEBUG_COS_PROVIDER=2 をセットしておくと、show tasks ではありませんが、tier 2 への push する時にコンソール上に出力されていました。なお、このデバッグパラメータを追加すると、プログラムディレクトリ内に aws_sdk_yyyy-mm-dd-hh.log といったログが1時間おきに作成されます。

tier 2 への push は午前2時に実行されました。この時刻を変更できるかどうかは不明です。手動で tell daosmgr objectpush 0 をコンソールへ投入すれば、午前2時を待たずにすぐさま tier 2 へ push されます。このコマンドの最後にあるゼロは参照されなくなってからの日数を指しますので、ゼロを指定すると tier 1 にあるすべての nlo が push されます。サーバー文書の DAOS タブで、参照されなくなったオブジェクトを tier 2 へ移動するまでの日数を指定します(デフォルトは1000日)が、午前2時に tier 2 へ push する場合、この値をテストだからと 1 にしても数日待っても移動しませんでした。聞けばこれはバグで7日経過しないと Push されないとのことでした。製品版では修正されていることでしょう。

サイズが大きなオブジェクトの push に時間がかかり、渋滞するのではないかと心配な場合、push スレッドを多重化しておくことができる、と教えてもらいました。notes.ini へ DAOS_S3_PUSH_THREADS=n (nはスレッドの数)を追加します。

tier 2 への push が失敗する場合、notes.ini へ DEBUG_DAOSMGR_TRACE=1 を設定すると、少なくともエラーがわかると教えてもらったのですが、エラーが出なかったこともあり未確認です。

tier 2 へ push されたオブジェクトは、対応する添付を Notes から参照すると tier 1 へ落ちてくるのかと思いきやそうではなく、data ディレクトリ配下に objectStoreTemp という名前のフォルダが作成され TMP1.tmp といったファイルが作成されました。これが tier 2 からダウンロードされたオブジェクトで、クライアントから参照された実体なのだと思います。

最後に、ベータ2 では tier 2 へ push された後、tier 1 には .nlo という拡張子が .nlx に変わっただけのように見えるオブジェクトが存在しました。ベータではフォールバックのために .nlx として残していますが、製品版では削除される、とのことでした。


Domino V11 のリリースはもうすぐです。
Domino 上で動く LEAP やまだ見ぬ軽量クライアントは少々遅れてのリリースとなるようですが、それらを含めて V11 の登場が待ち遠しいです。

2019年10月31日木曜日

GPS ロガー的なアプリを作ってみた

前回のエントリーで HCL Nomad で NotesGPS クラスが動いたことを書きましたが、今回はその続きで、GPSの位置情報を継続的に保存する仕組みを作ってみたお話です。

LotusScript には NotesTimer という私があまり使ったことの無いクラスが存在します。NotesTimer クラスを使うと、指定した間隔(秒単位)ごとにイベントを発生させることができます。

定期的に発生するイベントでGPSからの位置情報を保存すれば、GPSロガー的なものになりそうです。


まずは、フォームを1つ作成して以下のコードをフォームへ追加しました。

(Globals)の(Declarations)
Dim elapsedTimer As NotesTimer
Dim gps As NotesGPS
Dim position As NotesGPSPosition
Dim ss As NotesSession
%INCLUDE "lsconst.lss"

(Globals)の Initialize
Sub Initialize
 Set  ss = New NotesSession
End Sub

QyeryOpen
Sub Queryopen(Source As NotesUIDocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
 On Error 4508 Goto ERROR4508
 
 Set gps = ss.CreateGPS
 gps.TimeoutSec = 9
 gps.HighAccuracy = False
 If Not gps.RequestAccess Then
  Messagebox "False",,"Request access"
  Exit Sub
 End If
 Set position = gps.GetCurrentPosition
 Call gpslog( "Start" )
 Exit Sub
 
ERROR4508:
 Messagebox "NotesGPS class のインスタンスを取得できません。" & Chr(10) & "Err: 4508"
 Continue = False
 Exit Sub
End Sub

PostOpen
Sub Postopen(Source As NotesUIDocument)
 Set elapsedTimer = New NotesTimer(60, "")
 On Event Alarm From elapsedTimer Call elapsedTimerHandler
End Sub

QueryClose
Sub Queryclose(Source As NotesUIDocument, Continue As Variant)
 elapsedTimer.Enabled = False
 Call gpslog( "End" )
End Sub

さらに次の2つのコードを追加しました。

Sub elapsedTimerHandler(Source As NotesTimer)
 Call gpslog( "" )
End Sub
Sub gpslog( msg As String )
 Dim ndt As NotesDateTime
 Dim doc As NotesDocument
 Dim coodinates As NotesGPSCoordinates
 
 position.Update
 Set ndt = position.TimeStamp
 Set coodinates = position.Coordinates
 
 Set doc = New NotesDocument( ss.CurrentDatabase )
 
 doc.Form = "Main"
 doc.Message = msg
 doc.gps.TimeoutSec = gps.TimeoutSec
 doc.gpsposition.TimeStamp = ndt.LSLocalTime
 
 doc.Latitude = coodinates.Latitude
 doc.Longitude = coodinates.Longitude
 doc.Altitude = coodinates.Altitude
 doc.Heading = coodinates.Heading
 doc.Speed = coodinates.Speed
 doc.Accuracy = coodinates.Accuracy
 doc.AltitudeAccuracy = coodinates.AltitudeAccuracy
 
 doc.Save True, False
 
 Set doc = Nothing
 Set ndt = Nothing
End Sub


このフォームを開くとき、NotesGPS のオブジェクトを作り、イベント発生の間隔を60秒にセットします。イベント発生ごとにコールするスクリプトを「elapsedTimerHandler」としました。

このフォームを閉じるとき、NotesTimer を非アクティブの状態にします。これでイベントが発生しなくなります。


さて NotesTimer のヘルプには次のような記述があります。
NotesTimer はエージェントではなく Lotus Notes UI オブジェクトで使用することを意図されています。
なんだか嫌な予感が...

HCL Nomad でこのフォームを前面に開いてる間は 約60秒おきに位置情報が保存されました。

フォームを開いて記録している間、HCL Nomad 上には、3つのタブ(ホーム、GPS Logger ビュー、フォーム)がありましたが、GPS Logger ビューのタブをタップしてフォームのタブが他のタブのうしろにある状態でも、位置情報は記録され続けました。※下図はフォームのタブが前面に表示されてます

しかしながら、画面の操作をしばらくやめて画面が暗転した状態では、位置情報が記録されませんでした。また HCL Nomad から別のアプリに切り替えている間も位置情報は記録されませんでした。

それから、 iPhone などのスマホでは他のアプリからの通知が表示されることがありますが、通知が表示されている間は位置情報は記録されていないような印象です。

位置情報が記録されなかった場合も、フォームを開いている間はタイマーが有効のようで、指定した間隔どおりにはなりませんでしたが遅れて記録され続けました。

こんなことがあったので、フォームを開いた後は、画面が暗くならないように画面をサワサワと触り続けたり、通知が表示されればすぐさま画面の外へスワイプするといったつまらない操作を継続的に行っていました。

そんなこんなで散歩ついでに取得した位置情報から KML ファイルを作り、Google Map へ読み込んでみると、次のように表示できました。→KMLファイルの作り方


GPS ロガーとしては、なかなか使いづらいものが出来上がりました。

2019年10月29日火曜日

Nomad で GPS を使う

つい数日前に Notes/Domino V11 Beta 2 がダウンロード可能になりました。

このベータ版で、私が楽しみにしていた機能のひとつがようやく実装されたのです!

実は V11 Beta 1 の Domino Designer でも LotusScript に新たに追加された3つのクラス、
NotesGPS
NotesGPSPosition
NotesGPSCoodinates
が見えてはいるのですが、NotesSession クラスに CreateGPS メソッドが実装されていないために実質使えなかったのです...

V11 Beta 2 の Domino Designer では、これらが動くことを確認しました。

次のコードがこれらのクラスの動作を確認できたものです。

Dim ss As New NotesSession
Dim gps As NotesGPS
Dim gpscoodinates As NotesGPSCoordinates
Dim gpsposition As NotesGPSPosition
Dim ndt As NotesDateTime
Dim msg$

Set gps = ss.CreateGPS
gps.TimeoutSec = 9
gps.HighAccuracy = False
If Not gps.RequestAccess Then
 MessageBox "False",,"Request access"
 Exit sub
End If

Set gpsposition = gps.GetCurrentPosition
Set ndt = gpsposition.TimeStamp
Set gpscoodinates = gpsposition.Coordinates

msg = _
"タイムスタンプ: " & ndt.LSLocalTime & Chr(10) &_
"緯度(Latitude): " & gpscoodinates.Latitude & Chr(10) &_
"経度(Longitude): " & gpscoodinates.Longitude & Chr(10) &_
"高度(Altitude): " & gpscoodinates.Altitude & Chr(10) &_
"緯度経度の誤差(Accuracy): " & gpscoodinates.Accuracy & Chr(10) &_
"高度の誤差(AltitudeAccuracy): " & gpscoodinates.AltitudeAccuracy & Chr(10) &_
"方角(Heading): " & gpscoodinates.Heading & Chr(10) &_
"速度(Speed): " & gpscoodinates.Speed

MessageBox msg

このコードを私の iPad 上の HCL Nomad 1.0.5 (TestFlight版)で実行すると、次のように表示されました。


ここで取得した緯度と経度の値で現在地がわかります。(自宅なので隠しましたが..)

GPS レシーバの無い端末(=私のパソコン)で実行すると、CreateGPS メソッドでコード 4508 Method is not available となりました。


さて、私がこの GPS の使い道として考えているのは、現在地に最も近い現場の情報を自動で入力/表示することです。

現在地に関係している情報とは、国、地域、住所、現場の名称の他、顧客名、プロジェクト名やこれらのコードなど意外に多いように思います。

また、iPad を持ちながら、HCL Nomad の入力画面をソフトウェアキーボードでタイプすることはかなりしんどい作業になります。リストから選択するにしても、リストが1000件にもなれば小さい画面の中で縦スクロールして見つけ出すことさえ困難なように思います。

そんな時、例えば「現場マスター」へ緯度経度の値を追加しておくことで、現在地から最も近い現場の情報を候補として表示できるようになりそうです。
たったこれだけでも使い勝手がよくなるのではないでしょうか。


これを実現するには、マスター上の緯度経度と現在地の緯度経度から「最も近い」場所を調べる必要があると考え、距離を求めるコードを書いてみました(以下)。戻り値の単位はメートルです
(lat は緯度、lng は経度、lat1 と lng1 が一方の地点、lat2 と lng2 が他方)

Function distance( lat1 As Double, lng1 As Double, lat2 As Double, lng2 As Double ) As Double
 Dim radLat1 As Double, radLng1 As Double
 Dim radLat2 As Double, radLng2 As Double
 Dim aveLat As Double, aveLng As Double
 Dim c As Double
 Const r = 6378137.0 '赤道半径
 
 '円弧の長さを扱うため、角度(緯度経度)をラジアンへ変換
 c = 180 / Pi
 radLat1 = lat1 / c
 radLng1 = lng1 / c
 radLat2 = lat2 / c
 radLng2 = lng2 / c
 
 aveLat = ( radLat1 - radLat2 ) / 2
 aveLng = ( radLng1 - radLng2 ) / 2
 
 distance = r * 2 * Asin( Sqr( Sin( aveLat ) ^ 2 + Cos( radLat1 ) * Cos( radLat2 ) * Sin( aveLng ) ^ 2 ) )
End Function

例えば、マスターに登録した緯度と経度の値を列に表示するビューを用意しておけば、最も近い情報を入力の候補として表示する、といった感じのものは簡単に作れそうです。