tag:blogger.com,1999:blog-65510492088046910802024-02-22T00:20:40.573+09:00ノーツってヤッぁ..二児の父の苦悩つかれこれ20年以上の付き合いとなる Notes は2019年に満30年だそうです。これからもまだまだ進化しつづけるであろう IBM Notes/Domino の可能性を信じつつ、今日もサーバーを監視しつつヘルプデスクをこなしアプリ開発に磨きをかけるのである...Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.comBlogger190125tag:blogger.com,1999:blog-6551049208804691080.post-26726532022559736412024-02-09T08:30:00.010+09:002024-02-15T19:24:11.905+09:00HCL Notes 14.0 の「スタイルの変更」を試しました<p> 昨晩は第60回「のの会」に参加しました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://media.connpass.com/thumbs/12/aa/12aa9eb7c5708edb853bcadb131b992b.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="239" data-original-width="660" height="239" src="https://media.connpass.com/thumbs/12/aa/12aa9eb7c5708edb853bcadb131b992b.png" width="660" /></a></div><br /><p>私がお話した内容は前回に引き続き「スタイルの変更」ですが、今回は強化されたポイントである「3 設定の確認」について掘り下げました。使用したスライドを共有しました。</p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.7777777777777777" frameborder="0" src="https://speakerdeck.com/player/6ec12467cbed4517b65c1b3ee43555d8" style="aspect-ratio: 560 / 315; background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: auto; margin: 0px; padding: 0px; width: 100%;" title="HCL Notes 14.0 「スタイルの変更」で「3 設定の確認」を深掘り"></iframe><p>スライドの中でサブフォームについて触れていますが、その結果について「バグでは?」とのご意見をいただきました。本件についてはメーカーサポートからはバグではない旨回答があり、次の説明が加えられていました。</p><p><span face="Roboto, SourceSansPro, Helvetica, Arial, sans-serif" style="background-color: white; color: #4b4b4b; font-size: 14px; white-space-collapse: preserve;"></span></p><blockquote>設計種別としてフォームが選択された場合は全てのフォームとサブフォームがスタイル変更されますが、設計個別のフォームが選択された場合は選択されたものだけスタイル変更され、それ以外のフォームと全てのサブフォームはスタイル変更されません。</blockquote><p></p><p>またアイデア・ポータルには、サブフォームも個別に選択可能にする改善要望がありますので、ご賛同いただけると嬉しいです。</p><p><a href="https://domino-ideas.hcltechsw.com/ideas/DDXP-I-1223" target="_blank">Allow subforms to be individually selectable as design elements that can be restyled</a></p><p><br /></p><p>2024/2/15 追記:ナビゲータを含むアプリケーションを「スタイルの変更」する際にメッセージ「文書アイテムが見つかりません。」を表示する場合がありますが、こちらは 14.0 FP1 で修正予定とのこと。次の技術文書を参照ください。</p><p><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0110666" target="_blank">Domino Restyle でナビゲーターをスタイル変更の対象にするとエラーが発生する</a><br /></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-21448696958181412202023-12-21T08:41:00.003+09:002023-12-23T13:44:13.838+09:00ブラウザの言語を英語にして Nomad Web を開くためのショートカットを作る<p>巷では噂になっていた、ブラウザで Notes アプリケーションを開発できる「HCL Nomad Designer」がリリースされました!</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-pys5JLv3Pc8sa4HV4NoVPsxgwJLn_poF03L2gc7hnjzbNJYZuhLyJ6cwjnPN0fh6n8ig4NRVmKsB8uALlaMd-fuHG28PaPMPMV_myVvxtiA0930vQH5cZkXItjMmRCOP_Hm0C0JHGZgL2TtRyVwgPN6KQySJM9s7iKm64pSJF1CgcCZL1_oypi7L_sc" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="798" data-original-width="1807" height="282" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-pys5JLv3Pc8sa4HV4NoVPsxgwJLn_poF03L2gc7hnjzbNJYZuhLyJ6cwjnPN0fh6n8ig4NRVmKsB8uALlaMd-fuHG28PaPMPMV_myVvxtiA0930vQH5cZkXItjMmRCOP_Hm0C0JHGZgL2TtRyVwgPN6KQySJM9s7iKm64pSJF1CgcCZL1_oypi7L_sc=w640-h282" title="さっそくゼロからアプリケーションを作成してみました" width="640" /></a></div><p>HCL Nomad Designer は、HCL Nomad Web 1.0.10 の新機能です。<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0090739" target="_blank">リリース情報</a></p>実はこれまでの HCL Nomad Web でもアプリケーションを作成することは可能でしたが、指定したテンプレートの設計をそのまま使用できるだけで、HCL Domino Designer を使用しなければちょっとした設計変更もできませんでした。<p></p><p>HCL Nomad Designer を使えば、サーバー上にあるアプリケーションはもちろんのこと HCL Nomad Web のローカルに作成したアプリケーションの設計変更も Designer をインストールすることなく可能です。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi3-WOLMw0_beSZtmtkyLmREeDasioZXi8W4jDUzCsiiwT_DaKuaHgos-vaEvjBOnPOK5zp_O4Amm4cK7py1UR8LGaHM5_0jxRvPOtm8WvnUqH7ItqsS_jtk6sfhQ_OB2v_yTPahGLcaxOdATiHOcmAvSoKU_mH3Hgvc1TAfFwygkTZCqg-F3EwwcJK6cU" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="1406" data-original-width="2143" height="420" src="https://blogger.googleusercontent.com/img/a/AVvXsEi3-WOLMw0_beSZtmtkyLmREeDasioZXi8W4jDUzCsiiwT_DaKuaHgos-vaEvjBOnPOK5zp_O4Amm4cK7py1UR8LGaHM5_0jxRvPOtm8WvnUqH7ItqsS_jtk6sfhQ_OB2v_yTPahGLcaxOdATiHOcmAvSoKU_mH3Hgvc1TAfFwygkTZCqg-F3EwwcJK6cU=w640-h420" title="ローカルに作成したアプリを Nomad Designer で開き、設計要素のプロパティを表示" width="640" /></a></div><br />とはいえまだ最初のリリースということもあり ACL が設定できないとか慣れたキー操作ができないとかでお世辞にも完璧とか快適とは言えません。<p></p><p>そして Domino Restyle もそうですが、HCL Nomad Designer もブラウザの言語設定を英語にしなければメニューに表示されません。</p><p style="text-align: center;">←日本語 英語→</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhhrZV1L7_0uGlZjX8YDJCKi_1SbR213CoiMInJtFCak0q_oQ19gqytTdI9I6bQUcPw4i9IfU1GlGN9F5BMOEXIhcMmdsoV6UDIrgnOvVW7D-jlQZfSNsT1AIppG7UsC1XI9WRgmAqDkDn1OjiqIz8J9buRFzOuB17oTpR40f7kxZ60xVTDfONLUPVdEKA" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="1142" data-original-width="2434" height="300" src="https://blogger.googleusercontent.com/img/a/AVvXsEhhrZV1L7_0uGlZjX8YDJCKi_1SbR213CoiMInJtFCak0q_oQ19gqytTdI9I6bQUcPw4i9IfU1GlGN9F5BMOEXIhcMmdsoV6UDIrgnOvVW7D-jlQZfSNsT1AIppG7UsC1XI9WRgmAqDkDn1OjiqIz8J9buRFzOuB17oTpR40f7kxZ60xVTDfONLUPVdEKA=w640-h300" width="640" /></a></div><br />普段の操作でメニューやメッセージは日本語で使いたいけれど、Designer や Restyle を使うときだけ言語設定を英語に切り替えるのは面倒ですよね。<p></p><p><br /></p><p>そこで、常に英語の言語設定で Nomad Web を開くためのショートカット・アイコンを作ってみました。</p><p>以下は、私が通常使用しているブラウザである Google Chrome での作成方法です。</p><p><br /></p><p>まず、Chrome ウィンドウの右上ある現在のプロファイルのアイコンから「追加」をクリックします。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgzbF-S4XRap8iPdumk2HiHxaFoRSakO73L72yJ_W0O0r0dkT8Aa5C16RwrGy3VVDfsajOOE11xy5yzvo7I3CYKxBN9z7xrK3mxnf5Sa9QMB_L35K5dPCYd7DVwXm2O4bvAl4ocbg-6DiVApzfyWQzI_akmf-YcBO1qqhD_K1fheamrBXkqBaqSiNP4Fto" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="978" data-original-width="732" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEgzbF-S4XRap8iPdumk2HiHxaFoRSakO73L72yJ_W0O0r0dkT8Aa5C16RwrGy3VVDfsajOOE11xy5yzvo7I3CYKxBN9z7xrK3mxnf5Sa9QMB_L35K5dPCYd7DVwXm2O4bvAl4ocbg-6DiVApzfyWQzI_akmf-YcBO1qqhD_K1fheamrBXkqBaqSiNP4Fto" width="180" /></a></div><br />「新しい Chrome プロファイルの設定」では「アカウントなしで続行」をクリックします。<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-uwt-YQthDtlqaEyJq5aIeZd4xYLktTmnETVeKvKElZFitBOTroERL93QPCYYqY-xPftRLQxwlDL3zT5WE4pR2ORqbQ7BXJfIHUERbobMlJr1Mkic6aWxYwIkLOB_TlsiJCsKZLkXlGEzorfZv1fqjaAxDqXVx8oxF6g4Eaxw7nOYrewWiiUwQ3KGeWc" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="1249" data-original-width="1948" height="410" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-uwt-YQthDtlqaEyJq5aIeZd4xYLktTmnETVeKvKElZFitBOTroERL93QPCYYqY-xPftRLQxwlDL3zT5WE4pR2ORqbQ7BXJfIHUERbobMlJr1Mkic6aWxYwIkLOB_TlsiJCsKZLkXlGEzorfZv1fqjaAxDqXVx8oxF6g4Eaxw7nOYrewWiiUwQ3KGeWc=w640-h410" width="640" /></a></div><br />プロファイルの名前を入力(下図では "English" としました)し「完了」をクリックします。<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiX7S0sXatmVdWLTurISLVYfWon3jRLMnxytbU0EpMsgBVk-Da2QdyHNldnQdb-0evPalXwcMd7ODc2Eo0UC3_C2QbngTMkmFfFSQ8e5cpaAWbsRtO3L_xFSgn_Zs-VWvaL8G6lqUGloJPfiV-adInkjiw6WtKCiIPUQflYmkm04I0_QAvNZxAkkwW8WNA" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="1218" data-original-width="1105" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEiX7S0sXatmVdWLTurISLVYfWon3jRLMnxytbU0EpMsgBVk-Da2QdyHNldnQdb-0evPalXwcMd7ODc2Eo0UC3_C2QbngTMkmFfFSQ8e5cpaAWbsRtO3L_xFSgn_Zs-VWvaL8G6lqUGloJPfiV-adInkjiw6WtKCiIPUQflYmkm04I0_QAvNZxAkkwW8WNA=w363-h400" width="363" /></a></div><br />プロファイルを作成したら、再び Chrome ウィンドウの右上にあるプロファイルのアイコンをクリックします。すると、追加したプロファイルの名前(下図では "English")が表示されますので、それをクリックします。<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh-5Lr7uUpMvAnHGo8qUAi_nk4HDK_YQe5T5H77udK9QhpSKEtZFTIU8iWdxJJXEFPK7cxacl_h8E5YO_mSMnyQYjy3SzFGxE6MmJD1HEF-D-rDB0cv69fgRCE6DXxcg-D5SkTW7kN5NYGJUulCwaSWMsPe8P_J3o3e_SCWdCsOEyAjUg940-rCtLDFwDU" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1064" data-original-width="633" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEh-5Lr7uUpMvAnHGo8qUAi_nk4HDK_YQe5T5H77udK9QhpSKEtZFTIU8iWdxJJXEFPK7cxacl_h8E5YO_mSMnyQYjy3SzFGxE6MmJD1HEF-D-rDB0cv69fgRCE6DXxcg-D5SkTW7kN5NYGJUulCwaSWMsPe8P_J3o3e_SCWdCsOEyAjUg940-rCtLDFwDU" width="143" /></a></div><p>Chrome のアドレスバーで chrome://settings/languages と入力して優先言語のリストにある「英語」の右端にある三点リーダをクリックして「トップに移動」をクリックします。するとリストの最上部が「1.英語」にかわります。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEho8wwWDICN5eFxeWvdFtB7LlLjQ3eEcL0d18qZMankYiD5_wXT0JhOmf-vm5RH9BOHJcyrB-AC8PuvZOUSo2C3uApBPCzzn04ZrR7IlxIv9g6ZPzK9HZEsctPNP4eEAV2dbjVcu2Bef6PkxiTC-F7R9TpLxndszBXASb5oqLwMSYtw6NTyfBMJIFdkGqU" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="807" data-original-width="1484" height="348" src="https://blogger.googleusercontent.com/img/a/AVvXsEho8wwWDICN5eFxeWvdFtB7LlLjQ3eEcL0d18qZMankYiD5_wXT0JhOmf-vm5RH9BOHJcyrB-AC8PuvZOUSo2C3uApBPCzzn04ZrR7IlxIv9g6ZPzK9HZEsctPNP4eEAV2dbjVcu2Bef6PkxiTC-F7R9TpLxndszBXASb5oqLwMSYtw6NTyfBMJIFdkGqU=w640-h348" width="640" /></a></div><p>言語設定はここまでです。</p><p>次に、ブラウザの起動時に Nomad Web の画面を開く設定を追加します。</p><p>Chrome のアドレスバーで chrome://settings/onStartup と入力します。</p><p>「起動時」にある「特定のページまたはページセットを開く」で「新しいページを追加」をクリックします。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhufzNEr-w6jhuOvuO8BErTt0OjLsPR1yfbEdOa2-e197MFWHZYBASFekxBSe-b3vhOxo-9I8IA6uibgMfHt6kqlAW5WF8lvrA_ciijLuZ0VevAdnlceqWLnE1RWBA_bAqJfKKmvnrp8lVrRHzM-B1QrByPzvKCyQIFYq2n42duKOLrRCbLXdFWUYh7cMI" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="1066" data-original-width="1489" height="458" src="https://blogger.googleusercontent.com/img/a/AVvXsEhufzNEr-w6jhuOvuO8BErTt0OjLsPR1yfbEdOa2-e197MFWHZYBASFekxBSe-b3vhOxo-9I8IA6uibgMfHt6kqlAW5WF8lvrA_ciijLuZ0VevAdnlceqWLnE1RWBA_bAqJfKKmvnrp8lVrRHzM-B1QrByPzvKCyQIFYq2n42duKOLrRCbLXdFWUYh7cMI=w640-h458" width="640" /></a></div><br />「新しいページを追加」にある「サイトのURL」へ Nomad Web のアドレスを入力し「追加」をクリックします。<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhagxM-sjsc6hIlj-uBxXn0LjVgCYUrxozJRn0IdLiHrTrV1L8VdvKf5dPJ3vBIguO_iQUV9OwNFtLp8WpiY2YyfQ9qqGhBDBJ9HWzalmQxEdfYPD93ud7cntxtO33SNhtfMatmdwuKTIjePNo7D-keHIWgfjrGzSJJAS7SGrObXwL-GfuOQafUXy9i10o" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="422" data-original-width="1087" height="155" src="https://blogger.googleusercontent.com/img/a/AVvXsEhagxM-sjsc6hIlj-uBxXn0LjVgCYUrxozJRn0IdLiHrTrV1L8VdvKf5dPJ3vBIguO_iQUV9OwNFtLp8WpiY2YyfQ9qqGhBDBJ9HWzalmQxEdfYPD93ud7cntxtO33SNhtfMatmdwuKTIjePNo7D-keHIWgfjrGzSJJAS7SGrObXwL-GfuOQafUXy9i10o=w400-h155" width="400" /></a></div><p>起動時の設定も終わったので Google Chrome の設定は以上です。</p><p><br /></p><p>次にデスクトップへショートカットを作成します。</p>まずは Chrome の実行ファイルのパスと、作成したプロファイルのパスを確認するため、作成したプロファイルに切り替わっている状態で、Chrome のアドレスバーで chrome://version を入力します。<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjLfHfv7UwnkIgR9OQ14sXk4dOqLbth9iw9YR_vhZsTM7jNf54yoxGzVqFxWrK2DFOPkNeuKUkqE2vvkbSsaEizzwq-BegfGcWnL_FD8CimJ1T5AZ7wAnSrHaxgDGNiSs1DAh4nKOdpAMARMXFLRVwA2VsSNJLob8raHTGHMeQ3HrSHPRdq1145anPgbMs" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="764" data-original-width="1805" height="270" src="https://blogger.googleusercontent.com/img/a/AVvXsEjLfHfv7UwnkIgR9OQ14sXk4dOqLbth9iw9YR_vhZsTM7jNf54yoxGzVqFxWrK2DFOPkNeuKUkqE2vvkbSsaEizzwq-BegfGcWnL_FD8CimJ1T5AZ7wAnSrHaxgDGNiSs1DAh4nKOdpAMARMXFLRVwA2VsSNJLob8raHTGHMeQ3HrSHPRdq1145anPgbMs=w640-h270" width="640" /></a></div><br />「実行ファイルのパス」にある chrome.exe へのパス(上の図の場合、"C:\Program Files\Google\Chrome\Application\chrome.exe")と、<p></p><p></p><p></p><p></p><p>「プロフィールのパス」にある文字列の最も右にある円マークの右にあるフォルダ名(上の図の場合 "Profile 5")を、</p><p>次のように組み合わせます。</p><p style="text-align: center;">"実行ファイルのパス" --profile-directory="プロフィールのパス"</p><p>上の図から組み合わせると次のようになります。<br /></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiumaYDMQ7QSFBufgMeFTzA_21ATa8sh4GnrldXnXlP_Q0tpRBDv7xvpXIZ0EG1DtKl5rQVmQZpQ7jW8N1JAYojvBBMd6fXmhXaKFLHvheL3G602qxFVfaPaLbvKxoZ61rMhn4NkOX9jIskLFb1_T936GSHb1xiZth6uyuDp24CbUm7MzTT4i_mVXh6ALY" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="71" data-original-width="1954" height="24" src="https://blogger.googleusercontent.com/img/a/AVvXsEiumaYDMQ7QSFBufgMeFTzA_21ATa8sh4GnrldXnXlP_Q0tpRBDv7xvpXIZ0EG1DtKl5rQVmQZpQ7jW8N1JAYojvBBMd6fXmhXaKFLHvheL3G602qxFVfaPaLbvKxoZ61rMhn4NkOX9jIskLFb1_T936GSHb1xiZth6uyuDp24CbUm7MzTT4i_mVXh6ALY=w640-h24" width="640" /></a></div></div><br /><p></p><p>この文字列をショートカット作成時に「項目の場所」へ入力します。</p><p>では Windows デスクトップ上で右クリックして「新規作成 - ショートカット」をクリックします。</p><p>「項目の場所を入力してください」の欄へ先ほど組み合わせた文字列を指定して「次へ」をクリックします。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgA-H8ZhsDTxsgs8T4CJ9GyCLkpL8nw7RjmVP4yblTD4lEZE1Axo6u-NVvwRiJb0zsm3t14Keu5mPyOFpbhLoy4MyaiDqDj3EVZLqc8DPGvLjSE0-WbSgnD3ljiLiOfAKqEfIWYkxHWgRHvsX8_VI_nbhNtu8EpH1HgepFvP9HW6xJLFGqdIbuQ93umOME" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="618" data-original-width="1151" height="215" src="https://blogger.googleusercontent.com/img/a/AVvXsEgA-H8ZhsDTxsgs8T4CJ9GyCLkpL8nw7RjmVP4yblTD4lEZE1Axo6u-NVvwRiJb0zsm3t14Keu5mPyOFpbhLoy4MyaiDqDj3EVZLqc8DPGvLjSE0-WbSgnD3ljiLiOfAKqEfIWYkxHWgRHvsX8_VI_nbhNtu8EpH1HgepFvP9HW6xJLFGqdIbuQ93umOME=w400-h215" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">「このショートカットの名前を入力してください。」の欄へ HCL Nomad Web などとわかりやすい名前を付けて「完了」をクリックします。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgc4-PkyPFQfRuKN7PZcE4RrQB4pjtkg4V-XItzwcHyGv0a1CHsBUt88GPQqv0c6GUd2xY1QCNLTkNnlTIX98wQb84GLOMOLWqa07YYf_guGIBf0pZQgZMhpaflU784K8dLx1T8-MlwLe_dmg6fx0NCq_5ytkZ47PwhdoScR3HDEbP9n7K9snRVVVDIjMY" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="496" data-original-width="841" height="236" src="https://blogger.googleusercontent.com/img/a/AVvXsEgc4-PkyPFQfRuKN7PZcE4RrQB4pjtkg4V-XItzwcHyGv0a1CHsBUt88GPQqv0c6GUd2xY1QCNLTkNnlTIX98wQb84GLOMOLWqa07YYf_guGIBf0pZQgZMhpaflU784K8dLx1T8-MlwLe_dmg6fx0NCq_5ytkZ47PwhdoScR3HDEbP9n7K9snRVVVDIjMY=w400-h236" width="400" /></a></div>デスクトップに作成されたショートカットをダブルクリックして開いてみます。<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhXn7w14Jubhgw0TLawyc5vFTpkNDpjyXLj882gt1dG022cnYGs8CB18KOoVlGTnqZywNLbq0qdDEVvgGJl5gJbDTg1LdS6lI2eCMEpWfCY374E10kpg1kkNapA5B0X32cfXxfeb1XZxz_cZ7fUYbgPNJvqR4A45rs01IZ56rLXv9eQ3470sutfu2OY--U" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="156" data-original-width="220" height="142" src="https://blogger.googleusercontent.com/img/a/AVvXsEhXn7w14Jubhgw0TLawyc5vFTpkNDpjyXLj882gt1dG022cnYGs8CB18KOoVlGTnqZywNLbq0qdDEVvgGJl5gJbDTg1LdS6lI2eCMEpWfCY374E10kpg1kkNapA5B0X32cfXxfeb1XZxz_cZ7fUYbgPNJvqR4A45rs01IZ56rLXv9eQ3470sutfu2OY--U=w200-h142" width="200" /></a></div><br />すると Nomad Web のログイン画面が表示されました。※ログイン画面のページの前にいくつかの確認のための画面が表示されるかもしれません<p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiGKPMVem3I9cq3vpjTLqjHAx0A_lZnu0vWSssPj1prgy0bHrvBcHV7RfQBrrjkV1U8TjhoG_mJPZtyPj7BAhstqTOAdAxaUsm-nsXzeqjRmNH0bqZPTKxABz-QrkbglqFj0qaaWwnhqcYUJUSKs3-yIsGOPwZQjY9gWbgFxO0K466qr_ietyBlUc5DN1Q" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="1048" data-original-width="2103" height="318" src="https://blogger.googleusercontent.com/img/a/AVvXsEiGKPMVem3I9cq3vpjTLqjHAx0A_lZnu0vWSssPj1prgy0bHrvBcHV7RfQBrrjkV1U8TjhoG_mJPZtyPj7BAhstqTOAdAxaUsm-nsXzeqjRmNH0bqZPTKxABz-QrkbglqFj0qaaWwnhqcYUJUSKs3-yIsGOPwZQjY9gWbgFxO0K466qr_ietyBlUc5DN1Q=w640-h318" width="640" /></a></div><br />以上です。<p></p><p><br /></p><p>まだ試してませんが Edge でも同様にプロファイルを作成できて、そのプロフィール情報の格納場所 <span face="-apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Hiragino Kaku Gothic ProN", メイリオ, meiryo, sans-serif" style="background-color: white; font-size: 15px;">"%LOCALAPPDATA%\Microsoft\Edge\User Data\" に "Profile 1" といった</span>フォルダ名で作成されるそうで、起動のショートカットには</p><p>"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --profile-directory="Profile 1"</p><p></p><p>といったように指定するらしいです。</p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-46228200591765500212023-12-17T13:40:00.005+09:002023-12-23T14:05:44.177+09:00フィールドが大きすぎる(32K) の改善を Notes V14.0 で確認してみた<p>2023年12月7日に HCL Domino/Notes V14.0 がリリースされましたね!</p><p> 私もさっそくダウンロードしてインストールしてセットアップして起動することを確認しました!</p><p>「ところで、V14.0 の新機能ってなんなの?」という方は<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0108952" target="_blank"><b>こちらのリリース情報</b></a>を確認していただきたいのですが、今回のテーマは V14.0 で改善(というかバグフィックス)された機能です。</p><p><br /></p><p>バージョン 9.0.1 FP8 では文書内のサマリーフィールドの合計サイズが 64K から 16 M へ拡張され、バージョン 10.0 ではひとつのサマリーフィールドのサイズが 32K から 64K へ拡張されています。</p><p>拡張を有効にするには、ODSバージョンを 52 以降にすることと、<a href="https://help.hcltechsw.com/domino/14.0.0/admin/admn_increase_document_summary_data_limit.html" target="_blank">compact コマンドを -LargeSummary on オプションを有効にして実行する</a>といった作業が必要です。</p><p>この拡張機能は、Notes ユーザーがよく目にするエラーの一つに「フィールドが大きすぎる(32K)、または...」がありますが、これを発生しにくくするものです。</p><p><ご参考></p><p></p><blockquote><a href="https://speakerdeck.com/harunakano/da-kisugiruhuirudonidui-ying-sitajian" target="_blank">大きすぎるフィールドに対応した件</a></blockquote><p></p><p><br /></p><p>実はこの機能改善については、過去のエントリで触れました。</p><p><過去のエントリ></p><p><a href="https://harunakano.blogspot.com/2020/02/blog-post_19.html" target="_blank"></a></p><blockquote><a href="https://harunakano.blogspot.com/2020/02/blog-post_19.html" target="_blank">サマリーフィールドの制限を緩和するには</a></blockquote><p></p><p><br /></p><p>しかしながら多少問題が残っていたのです。</p><p><問題について触れている公式文書></p><p></p><blockquote><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0104821" target="_blank">LargeSummary が有効化されたデータベースでも「フィールドが大きすぎる(32K)」エラーが発生する</a></blockquote><p></p><p><br /></p><p>V14.0 がリリースされた後、この問題に関連するアイデアポータルに投稿されていたアイデアで "Shipped" (= 出荷済み)のステータスに変わったものがありました。</p><p><テキストフィールドの 32K 制限の削除についてのアイデア></p><p></p><blockquote><a href="https://domino-ideas.hcltechsw.com/ideas/DDXP-I-5" target="_blank">Remove 32k limit for text-fields</a></blockquote><p></p><p><br /></p><p>確かに Fix List では、上の問題は V14.0 で<a href="https://ds-infolib.hcltechsw.com/ldd/fixlist.nsf/5c087391999d06e7852569280062619d/c1ef74d414ded59e852589bd004fcc98?OpenDocument" target="_blank"><b>解決しているようでした</b></a>が、公式文書は今日(2023/12/17)時点でまだ更新されていません。</p><p><br /></p><p>そこで今回は、Notes V14.0 日本語(製品版)で問題が解消していることを確認します。※V14.0 の Notes は 32 bit版が無く、64 bit版のみリリースされてます(2023/12/23現在)</p><p>確認するアプリケーションの ODS バージョンは 55、compact コマンドを -LargeSummary on オプションを有効にして実行済みです。</p><p><br /></p><p>まずテキストフィールドへタイプ中、以前は 32762 文字目をタイプしたところで発生したエラー「フィールドが大きすぎる(32K)...」は、V14.0 では表示されません。</p><p>32K をこえる 32770 文字をタイプしてもエラーなく保存できましたし、この文書を開きなおしても、フォーム上で表示が崩れるといったことは発生しなくなりました。</p><p>新たに気付いたことですが、文書のプロパティでフィールドの値を見ると、文字列の最後にあるべきダブルコーテーションが表示されていません。ビューからこの文書のプロパティを表示して、プロパティ画面上に表示された 32770 バイトのテキストフィールドにあるすべての文字列をコピーしてテキストエディタへ貼り付けてみると、15806 バイトしかありませんでした。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUeO8fTTrMuHFjd472DJD1d1Crn2AYTzoItuQld6WPaBOZcyQZCsolYWYeARvxQUU3FZoW_dp1mP5y9VZGzKa5rH8xb1bGzuaJwtfFWRFgQgv2CJQQfmdqSFdeIK51v8ir30oM-yt9wVythHCXI5dQJ3eP5j07ue9rmT5QE2CY_q_msamzp20895UAmao/s960/field32770byte_Property.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="960" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUeO8fTTrMuHFjd472DJD1d1Crn2AYTzoItuQld6WPaBOZcyQZCsolYWYeARvxQUU3FZoW_dp1mP5y9VZGzKa5rH8xb1bGzuaJwtfFWRFgQgv2CJQQfmdqSFdeIK51v8ir30oM-yt9wVythHCXI5dQJ3eP5j07ue9rmT5QE2CY_q_msamzp20895UAmao/w320-h130/field32770byte_Property.png" title="値の最後にダブルコーテーションが無い" width="320" /></a></div><p>けれど同じ文書を「拡張プロパティ」で表示すると(サイズが 32772 と多く表示されるものの)最後のダブルコーテーションもありますし、テキストエディタへペーストした文字数は 32770 で問題ありません。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7BWGUmPgns5F4E0-SbA5gplYUQpZO0ZKBvV3A4nG0ZIzfK5e7kU8TBUjYZWWsu8DEkkaNcAsTRtDumjN4k3IGQHeGJofeBBOiO55PGrkP6e3wRlf3u9r0FJueEdatlP4OlPru4KcFGSlRc17_VfZeTJpnswHrpPrlTjElqJom9_3fdEwHj9_xLrEm6PQ/s1658/field32770byte_extendedProperty.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1101" data-original-width="1658" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7BWGUmPgns5F4E0-SbA5gplYUQpZO0ZKBvV3A4nG0ZIzfK5e7kU8TBUjYZWWsu8DEkkaNcAsTRtDumjN4k3IGQHeGJofeBBOiO55PGrkP6e3wRlf3u9r0FJueEdatlP4OlPru4KcFGSlRc17_VfZeTJpnswHrpPrlTjElqJom9_3fdEwHj9_xLrEm6PQ/s320/field32770byte_extendedProperty.png" width="320" /></a></div><br /><p>次に、フォームを開いてテキストフィールド上に入力できる文字数を確認します。</p><p>まず限界値を超えた場合のメッセージですが「フィールドが大きすぎる(64K)か、またはビューの列と選択式が大きすぎます」でした。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBBaPeitVSnQIstTz3axiPbwGC2TrIIwd_KZCgIYI0OYHeuB_GjK2v8Vo8IAiV5L9BQ-eixG_45e7U0jSuHSAgnCo1bjrh58Wt71m5NXMgvd0d_1gdVKThZmbGPu6NoqsiETFfREAPrABZomHYW8WGk6snGy-Ibo6G_2R0EFNbsz3FoaNjdGVO_KyDDsA/s803/field63974byteOver_ErrorMewsage.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="341" data-original-width="803" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBBaPeitVSnQIstTz3axiPbwGC2TrIIwd_KZCgIYI0OYHeuB_GjK2v8Vo8IAiV5L9BQ-eixG_45e7U0jSuHSAgnCo1bjrh58Wt71m5NXMgvd0d_1gdVKThZmbGPu6NoqsiETFfREAPrABZomHYW8WGk6snGy-Ibo6G_2R0EFNbsz3FoaNjdGVO_KyDDsA/w400-h170/field63974byteOver_ErrorMewsage.png" width="400" /></a></div><div><br /></div><div>そして、フォーム上で1つのテキストフィールドに入力できたのは 63974 バイトでした。63975 バイト目をタイプしたところで上のメッセージが表示されました。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGvJ7Ae8ai-vWRaD-MGfauMliQrJPNb3311zVPrPI103xLlgFzOpbLyjZpDpFF7SUnhJUhRW-sEx9VcFUbdI6-Cx5yiwoCL-X36viaURMv1_yyF4pE-UPm2VVxZ3C8Ec_fRcWr13xw-B8jEpb7eGsp7tqXdi37cMGY_mWH_MYcXozp2reD3BfAkpw-0pw/s951/field63974byte_Property.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="389" data-original-width="951" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGvJ7Ae8ai-vWRaD-MGfauMliQrJPNb3311zVPrPI103xLlgFzOpbLyjZpDpFF7SUnhJUhRW-sEx9VcFUbdI6-Cx5yiwoCL-X36viaURMv1_yyF4pE-UPm2VVxZ3C8Ec_fRcWr13xw-B8jEpb7eGsp7tqXdi37cMGY_mWH_MYcXozp2reD3BfAkpw-0pw/w400-h164/field63974byte_Property.png" width="400" /></a></div><div><br /></div>64K ですから 65535 付近かと思いきや 63975 バイトでしたが、これは LotusScript ではどうなるのでしょうか。<div>次のようなコードを書いてみました。 <br /><pre>Dim ss As New NotesSession
Dim doc As NotesDocument
Dim str32k$
Dim i%
Const str100$ = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Set doc = New NotesDocument(ss.Currentdatabase)
doc.Form = "topic"
For i = 1 To 654
str32k = str32k & str100
Next
doc.subject = str32k
Call doc.save(True, False)</pre></div><div><br /></div><div>上のコードでは、100バイトの定数を654回コピーして 65400 バイトの値を作り、subject へ転記して文書を保存します。このコードはエラー無く終了しました。</div><div><br /></div><div>ところが、作成した文書のプロパティをビューから開くと subject アイテムの表示が崩れました(下図)。※この場合も「拡張プロパティ」では問題なく表示できました。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcKDKXHwYcjUoaMqmqchKDy4nD_fROpC29Tue2bkEGQj3wKAYhy63mlSVGZeriMIZU_ty8TYfZF3O6z4-ddH4TNZZMgL78rge14TwTjasRxC9dTyOKsJnzYyq73gibr1KAM2ajmkkgpBiAEgj5L7458XEmpYmyTVX7lCopOxDjgnVEYnQwe3yrBwk-X_8/s961/LS%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E6%96%87%E6%9B%B865400%E3%83%90%E3%82%A4%E3%83%88%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E8%A1%A8%E7%A4%BA.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="384" data-original-width="961" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcKDKXHwYcjUoaMqmqchKDy4nD_fROpC29Tue2bkEGQj3wKAYhy63mlSVGZeriMIZU_ty8TYfZF3O6z4-ddH4TNZZMgL78rge14TwTjasRxC9dTyOKsJnzYyq73gibr1KAM2ajmkkgpBiAEgj5L7458XEmpYmyTVX7lCopOxDjgnVEYnQwe3yrBwk-X_8/s320/LS%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E6%96%87%E6%9B%B865400%E3%83%90%E3%82%A4%E3%83%88%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E8%A1%A8%E7%A4%BA.png" width="320" /></a></div><div><br /></div>また、ビューからこの文書をダブルクリックすると表示モードでは開くものの Ctrl + E やダブルクリックで編集モードへ遷移できません。<div>ビューで選択した文書を Ctrl + E で開くと編集モードで開くものの、Esc キーで閉じようとすると「段落やフィールドは 64K より大きくはできません」とメッセージを表示しますが、タブの × ボタンでは閉じることができました。怪しい動きしますね...</div><div><br /></div><div>先ほどのコードで For ループにある 654 を 655 に変えて実行すると、subject へ転記するところで「フィールド %1 を作成できませんでした。」とメッセージが表示されました。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRzA_oQFSv4O08_YyHsJAr_dpn_1HTukSsMJTi9WLEIblmfiOOqEDHk7s9DXo1z8E60-PyVCRgRotoDTvVl3Ydo7uEn0znmGkyJuBJIQDCgnkTq8G8PFe5d-7tWzgIlpFIqAqFAY0jO24exS6nKk3O1-3300Ub3IZXVG_x4n65YxBiR-K6FaVwprRmbJg/s524/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%EF%BC%851%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="347" data-original-width="524" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRzA_oQFSv4O08_YyHsJAr_dpn_1HTukSsMJTi9WLEIblmfiOOqEDHk7s9DXo1z8E60-PyVCRgRotoDTvVl3Ydo7uEn0znmGkyJuBJIQDCgnkTq8G8PFe5d-7tWzgIlpFIqAqFAY0jO24exS6nKk3O1-3300Ub3IZXVG_x4n65YxBiR-K6FaVwprRmbJg/s320/%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%EF%BC%851%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F.png" width="320" /></a></div><div><br /></div>エラー処理を追加してみたところ、エラーコードは 4078 でした。<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEZRQpoYqEi4iuJaUM47KGI4IQWQht7nKBDhlo8MauhQH46Dy4hmxQIqk-N1ST-NpPllD2n6FeOpWuOyaQttXbpCxcU6ragVDyJpn0Rz7cRzXTpFuh_cvLRdM70P2nB5j_wnTVqvi1W8skXKMlvRpZhWU1oWqFi6_Cu17esUHpWc7PfB_W5DIsgNwJZrY/s604/4078%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%EF%BC%851%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="467" data-original-width="604" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEZRQpoYqEi4iuJaUM47KGI4IQWQht7nKBDhlo8MauhQH46Dy4hmxQIqk-N1ST-NpPllD2n6FeOpWuOyaQttXbpCxcU6ragVDyJpn0Rz7cRzXTpFuh_cvLRdM70P2nB5j_wnTVqvi1W8skXKMlvRpZhWU1oWqFi6_Cu17esUHpWc7PfB_W5DIsgNwJZrY/s320/4078%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%EF%BC%851%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F.png" width="320" /></a></div><div><br /></div>ということで、LotusScript では 65400 から 65500 未満あたりまで保存できそうだということがわかりました。<div><br /></div><div>確認は以上となりますが、公式文書の問題は解消されているものの、1つのテキストフィールドのサイズが 64KB に近いと Notes クライアントの挙動が怪しくなる、という結果となりました。</div><div><br /></div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-19414253040001335852023-03-11T10:31:00.005+09:002024-02-15T19:23:39.125+09:00HCL Domino 12.0.2 で日本語のテキストファイルが検索できますか?<p> 2023/3/9 (木) は「のの会 第49回」に参加しました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://connpass-tokyo.s3.amazonaws.com/thumbs/6f/ed/6fed9310adef35b4dcc4ce6b821a59a5.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="249" data-original-width="660" height="249" src="https://media.connpass.com/thumbs/8a/68/8a680b8a3ec8dbcf65c59ce825fbc375.png" width="660" /></a></div><br /><p>今回は、全文検索機能が参照する「全文索引」に添付ファイルを含めた場合、日本語のテキストファイルを正しく検索できるかどうかを検証してみた、という内容でお話しました。</p><p>のの会で使ったスライドを共有します。</p><p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" src="https://speakerdeck.com/player/4dbb17418d1c4b93bc24a3deb1a401f1" style="aspect-ratio: 560 / 314; background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: auto; margin: 0px; padding: 0px; width: 100%;" title="添付された日本語テキストファイルを全文検索でヒットさせる方法"></iframe></p><p><br /></p><p>実はこのテーマは、コンバージョンフィルタがバージョン 10.0 で KeyView から Apache Tika に変わったときに Shift-JIS のテキストファイルがヒットしなくなるという検証結果がありました。</p><p><br /></p><p>そして最近、Shift-JIS のテキストファイルが検索できない問題は 11.0.1 FP3 で解消されたという<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0076353" target="_blank">技術文書</a>を見かけ、また <a href="https://help.hcltechsw.com/domino/12.0.2/admin/wn_tika_full_text_search_improvements.html" target="_blank">12.0.2 で Apache Tika のアップグレード</a>(主に Log4j の脆弱性への対応)があったことをもあり、再度検証してみたところ、オンラインヘルプの記載と異なる挙動を示したためサポートへ問合せ、解消する方法があったのでその報告もかねて今回のお話の内容となりました。</p><p><br /></p><p>HCL Domino 12.0.2 を使った検証で分かったことがいくつかあります。</p><p></p><ul style="text-align: left;"><li>デフォルトでは全文検索に Shift-JIS のみヒットし、UTF-8 はヒットしない</li></ul><p></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">デフォルトではファイル内の文字列の抽出に Apache Tika ではなく Brute Force が使用されました(Brute Force は Domino 側の機能らしい)。文書に添付した Shift-JIS と UTF-8 のファイルには全く同じ文章が書かれていますが、抽出されたテキストのサイズは Shift-JIS が 1432 text bytes、UTF-8 が 94 text bytes と大きく異なっていました。このことから Brute Force にはテキストファイルの文字コードによって正しく抽出できない問題があることがわかります。</p></blockquote><p></p><ul style="text-align: left;"><li>文字の抽出に Apache Tika を使うための修正版が存在する</li></ul><p></p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;">メーカーサポートへ UTF-8 が検索にヒットしないと問合せたところ Domino へ適用できる HF(ホットフィックス)の提供がありました。この HF を適用し、なおかつ notes.ini へ設定を追加すると、文字の抽出に Brute Force ではなく Apache Tika が使われ、抽出されたテキストのサイズは Shift-JIS が 1431 text bytes、UTF-8 が 1423 text bytes とほぼ同じになり、全文検索に UTF-8 もヒットするようになりました。抽出に Apache Tika が使われれば Shift-JIS と UTF-8 のどちらも同じように実施されるようです。※追記も参照ください</blockquote><p><br /></p><p>なお、HF をインストールするときに Notes/Domino を終了しているにもかかわらず「まだ実行中」と叱られる件は、セーフモードで起動した OS (Windows 11) で HF のインストーラを実行することで解決しました。</p><p><br /></p><p>以上が Domino(サーバー側)での検証結果となります。</p><p><br /></p><p>ところで Notes や Nomad のローカル(端末側)にあるアプリケーションの全文索引では添付にある日本語が検索にヒットするのでしょうか。</p><p>試してみたところ、現状では次のとおりでした。</p><p></p><ul style="text-align: left;"><li>Notes 12.0.2 Standard 64 bit Japanese ..... 添付は Shift-JIS の.txtと .pdf はヒットする</li><li>Nomad Web 1.0.7 ..... すべての添付がヒットしない</li><li>Nomad Mobile 1.0.28 (iOS) ..... すべての添付がヒットしない</li></ul><p></p><p>改善に期待しています。</p><p><br /></p><p>【2023/4/20 追記】</p><p>先日リリースされた HCL Domino 12.0.2 の FP1 を適用後に全文索引を再構築して挙動を確認したところ、notes.ini に「FT_USE_MY_ATTACHMENT_BRUTE_LIST=1」を追加した状態で Shift-JIS と UTF-8 の両方のテキストファイルが検索にヒットしました。これは次の Defect Article にも反映されています。</p><p><b>Tika Engine failed to perform indexing and search for characters in attachments with Unicode Shift-jis and UTF-8</b><br />https://support.hcltechsw.com/csm?id=kb_article&sys_id=f505d6f5db92299455f38d6d1396190f</p><p><br /></p><p>この問題は、Notes クライアントにもありますが、現時点では HCL Notes 12.0.2 FP1 のうち「64bit Standard版」は 不具合が解消されてます。</p><p>ですが「32bit Standard版」と「Basic版」については Defect Article が更新されておらず不明です。</p><p><b>Attached files from local full-text indexed databases are not searchable in HCL Notes 12.0.2 Standard (32-bit)</b><br />https://support.hcltechsw.com/csm?id=kb_article&sys_id=96eded1c1bc2e990f37655352a4bcb01</p><p><b>Attached files from local full-text indexed databases are not searchable in HCL Notes 12.0.2 Basic</b><br />https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0104109</p><p><br /></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-18692003616595622872023-02-10T08:48:00.002+09:002023-02-11T17:44:11.537+09:0012.0.2 ビュー索引更新の改善<p> 2023年最初の「<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0069193" target="_blank">テクてくLotus技術者夜会</a>」が1月20日に開催されました。</p><p>今回のテーマは「<span face=""Segoe UI", "Helvetica Neue", "Apple Color Emoji", "Segoe UI Emoji", Helvetica, Arial, sans-serif" style="background-color: white; color: #252423; font-size: 16px;"> </span><strong style="background-color: white; box-sizing: border-box; color: #252423; font-family: "Segoe UI", "Helvetica Neue", "Apple Color Emoji", "Segoe UI Emoji", Helvetica, Arial, sans-serif; font-size: 16px;">HCL Ambassador for Digital Solutions 2023年選出のお祝い & ライトニングトーク</strong>」ということで、私はライトニングトークで参加しました。</p><p>私のライトニングトークのテーマは、HCL Domino 12.0.2 の新機能として実装されるはずだった「ビュー索引更新の改善」です。</p><p>はずだった?!というところが引っ掛かりますよね?</p><p>そこからお話します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLWENznKwHOJzGb_F0gf6uWq00kv46lU_QDqkUc8ZbfsAfEKh-0pnPJlFHXPAH-p0k4DGZ3rAlTwTEtc-h3axajYnLH8ein-kyBWLNykvxEyhaECI_k4a-IQYBcPymZtMwhFOCIG0h6FYHCkSqgsp2lkYbu_IWHyURy-ao79kj_UZdzpSUhQ2BGs5c/s2048/%E3%83%93%E3%83%A5%E3%83%BC%E7%B4%A2%E5%BC%95%E6%9B%B4%E6%96%B0%E3%81%AE%E6%94%B9%E5%96%84.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="ビュー索引更新機能の改善" border="0" data-original-height="2048" data-original-width="2048" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLWENznKwHOJzGb_F0gf6uWq00kv46lU_QDqkUc8ZbfsAfEKh-0pnPJlFHXPAH-p0k4DGZ3rAlTwTEtc-h3axajYnLH8ein-kyBWLNykvxEyhaECI_k4a-IQYBcPymZtMwhFOCIG0h6FYHCkSqgsp2lkYbu_IWHyURy-ao79kj_UZdzpSUhQ2BGs5c/w200-h200/%E3%83%93%E3%83%A5%E3%83%BC%E7%B4%A2%E5%BC%95%E6%9B%B4%E6%96%B0%E3%81%AE%E6%94%B9%E5%96%84.jpg" title="AIが「ビュー索引更新機能の改善」をイラスト化" width="200" /></a></div><p>HCL Domino Ideas Portal に投稿された、ビュー索引更新改善のアイデアがあります。</p><p>https://domino-ideas.hcltechsw.com/ideas/DOMINO-I-175</p><p><br /></p><p>HCL の J さんという開発者が 12.0.2 の Early Access Program (公開ベータ)の期間中、「ビュー索引更新の改善」についてご自身のツイッターアカウントで発信し、彼個人のブログではより詳細な情報が公開されました。</p><p>12.0.2 Early Access Program (以下EAPと呼称)のディスカッションフォーラムには、「View rebuild improvements」として EAP の Drop 2 と Drop 5 の What's New ページに記載がありました。またJさんのブログのリンクを示して「有効化できる?」「試してみて!」というやりとりもありました。</p><p>そして 12.0.2 製品版がリリースされたのですが、この機能改善については製品ドキュメントに記載が見つからなかったのです。</p><p>あれほど宣伝されていた機能改善だし、ベータフォーラムでは不具合報告も見られないのに、製品版に搭載されなかったなんてことあります??</p><p>ちなみに、この機能改善は、もともとアイデアポータルに<a href="https://domino-ideas.hcltechsw.com/ideas/DOMINO-I-175" target="_blank">投稿されている要望</a>が元になっており、Jさんのツイートにもそのスクリーンショットがありますが、そのステータスは当時「Assessment」でした。これが現在は出荷済みを示す「Shipped」に変わっているのです。これでは機能改善は実装されたと認識しますよね?</p><p><br /></p><p>という疑問から、この機能改善の有無について調べてみようと思いました。</p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" mozallowfullscreen="true" src="https://speakerdeck.com/player/078ed4532a2c40408fce43bab58a4bf2" style="background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: 314px; margin: 0px; padding: 0px; width: 560px;" title="12.0.2 ビュー索引更新の改善" webkitallowfullscreen="true"></iframe><p>テクてくLotus技術者夜会でのお話はここまでです。</p><p><br /></p><p>テクてくが終わったその晩に J さんからお返事がありました。</p><p>どうやら機能改善自体は実装されている模様です。</p><p><br /></p><p>テクてくの後、HCL サポートへ確認した結果は以下のとおりです。</p><div class="separator" style="clear: both;">Q1. ビュー索引更新の改善はありましたか?</div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">はい、Domino 12.0.2では、標準的なハードウェアで動作する、数百万の文書を含んでいる複数のビューがある特定のアプリケーションデータベースにおいて、ビューの再構築時間が5~10%改善されました。</div></div></blockquote><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Q2. この改善はデフォルトで有効になりますか?</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">この機能はV12.0.2のデフォルトで有効になっており、iniパラメータ("ENABLE_VIEW_MIN_UNTIL=1")で有効にする必要がありません。データベースにて複数のビューを同時に更新して開く場合、ビューが開放されるまでの時間が改善されました。</div></div></blockquote><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Q3. Notes 12.0.2 もローカルデータベースに対して同様の改善がありますか?</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">はい、上記の最適化のためにビュー索引に改善があり、これはローカルデータベースのみならず、Dominoサーバーにも適用されます。</div></div></blockquote><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Q4. 本改善に関する文書は公開されましたか?</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">ビューの再構築のパフォーマンス向上については、製品文書に記載されています。詳細については、以下の文書をご参照ください。 </div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">タイトル: Administration features URL: https://help.hcltechsw.com/domino/12.0.2/admin/wn_administration_features.html#wn_administration_features__section_elm_chq_y5b</div></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">大変申し訳ございません、上記の技術文書は英語のみになっております。</div></div></blockquote><p> </p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">※上記技術文書の記載は、問い合わせの後に追加されたようです。日本語へも反映されるといいですね。</p></blockquote><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Q5. 古いODSバージョンでも機能しますか?</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">開発チームは、ODSのバージョンが55未満のアプリには、有効な改善がされないことを 確認致しました。新機能を利用するためには、最新のODSバージョンをご使用いただくことをお勧め致します。 大変ご迷惑をおかけいたしますが、下位のODSバージョンとの連携によるパフォーマンスの向上はございませんので、ご了承ください。</div></div></blockquote><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Q6. 本改善の無効化は可能?方法は?</div></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: left;">Domino V12.0.2 の内蔵機能のため、この機能を無効にしてビュー索引を改善することは出来ません。</div></div></blockquote><div class="separator" style="clear: both;"><div><br /></div></div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-55133774380263464262022-12-09T08:11:00.002+09:002022-12-09T08:30:46.643+09:00のの会「大忘年会 及び 裏 DominoHub 2022」に参加しました<p> 昨日(2022/12/8)は「のの会 第46回」に参加しました。</p><p>別で開催中のイベント「DominoHub 2022」のパブリックビューイング会場となっていたアクセル社に朝からお邪魔させてもらい、その続きで「のの会」が開催されました。</p><p>今年最後の開催ということで「大忘年会 及び 裏 DominoHub 2022」と題されました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkmgufnKUyo9zcXSD49sUegm01riFV5Cm4gl2ONAZ558ZQy0bGwtKZ7cfKV4E8qHNZiTIH4GspqMvPZNDF3iEFEKlbAWdcXa74Z8U78Mzsm6b_HNE3qhliyHXuXi-AU7q5Dpugl4Ttk4UMrll3vt3JmTl5IX7z8Vm1MiUsg_HWktdKPn8mi7pJr2vK/s1689/notesknows20221208.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="899" data-original-width="1689" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkmgufnKUyo9zcXSD49sUegm01riFV5Cm4gl2ONAZ558ZQy0bGwtKZ7cfKV4E8qHNZiTIH4GspqMvPZNDF3iEFEKlbAWdcXa74Z8U78Mzsm6b_HNE3qhliyHXuXi-AU7q5Dpugl4Ttk4UMrll3vt3JmTl5IX7z8Vm1MiUsg_HWktdKPn8mi7pJr2vK/w400-h213/notesknows20221208.png" width="400" /></a></div><div><br /></div><div>DominoHub の12/8のセッションがすべて終了した後、大忘年会の会場への移動を始めるまで雑談を決め込んでいたのですが、だいぶ時間があるし集まった方々の話も落ち着いてきたかな?というところを狙って、テクてくLotus技術者夜会(12月開催は DominoHub に合流されました)のライトニングトークのために用意していたネタをお披露目することにしました。</div><div>内容は UNK テーブルに関するものです。</div><div><br /></div><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" mozallowfullscreen="true" src="https://speakerdeck.com/player/67cc5695d3144aa18296b70c4b95a6ee" style="background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: 314px; margin: 0px; padding: 0px; width: 560px;" title="UNKテーブル" webkitallowfullscreen="true"></iframe><div><br /></div><div>UNK テーブルはフォームやサブフォーム等の設計要素と文書にあるフィールドと、その型に関する情報を保持するデータベース内にあるものです。</div><div>文書にあるフィールド(アイテムと言った方が適切?)と設計要素にあるフィールドの型が違っている場合、UNK テーブルにはそのフィールドを持つ設計要素と文書から最も古い方の型の情報を保持してしまうようです。設計要素と文書の noteid を比較してより小さいほうのフィールドの型を確認すれば、通常は UNK テーブルで保持している型と一致するはずです。</div><div>ご存知のとおり noteid はレプリカごとに異なる場合がありますので、アプリケーションのレプリカIDが同じでも UNK テーブルの内容は異なることがあります。UNK テーブルは全文検索で使用されるため、レプリカによって検索結果が違ったり一方でだけエラーが表示される、といったことがあります。そんな不具合に遭遇したときに上の資料が何かの参考になるかもしれません。</div><div><br /></div><div>こんなお話をした後、「大忘年会 及び 裏 DominoHub 2022」の会場へ移動して、パーティーを楽しみました。下の写真は DominoHub 等などのために新幹線でかけつけてくださった<a href="https://www.tanuchi.com/" target="_blank">HCL Ambassador 萩原さん</a>との一コマです。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5hF2XmsGy-0ghSNcatUGkG1Fe773xZfM-SVt6BSYorGQxW8yS73ZKzBGLXP8MyFEubrjxQapjtKGNlWxvPXw_My8SeeD2EAXbaXt34he8UcEwmu2u0k7yDCZHDPrI7dWzzH2qdwqTgu2ZtdarRZJvWVVyLXOJ4jd-QdRbIZKZo52vzkw6z9IM-n_z/s2048/notesknows_ambassador_hagihara.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2048" data-original-width="1536" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5hF2XmsGy-0ghSNcatUGkG1Fe773xZfM-SVt6BSYorGQxW8yS73ZKzBGLXP8MyFEubrjxQapjtKGNlWxvPXw_My8SeeD2EAXbaXt34he8UcEwmu2u0k7yDCZHDPrI7dWzzH2qdwqTgu2ZtdarRZJvWVVyLXOJ4jd-QdRbIZKZo52vzkw6z9IM-n_z/s320/notesknows_ambassador_hagihara.jpg" width="240" /></a></div><div><br /></div>昨日は同席になった Domino ユーザーの方々ともお話できて本当に貴重な場でした。Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-73151238155087823652022-12-09T07:22:00.001+09:002022-12-09T07:22:55.832+09:00DominoHub 2022 でお話したこと<p> 昨日(2022/12/8)と今日の2日間で開催している Notes と Domino のイベント「DominoHub 2022」に参加しています。 <a href="http://dominohub.net">dominohub.net</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq_DYB8XfnHeSUSF3RCwrVZVQvXtQBE27p72GNpiugFtuAzEuidgSNmo3vF1AVs-ACBGcFFzf8mbgdG9YirllnP4PWN_j-Yse44Z96Fq6SIyLmgRMmSohZvBiFgpzVBGWRzCSktF2o2x52PPlgt-Pq7camGqUX_bRWVB_6DK0FQv1NnLG_cRAB7nIi/s2631/DominoHub2022.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1399" data-original-width="2631" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq_DYB8XfnHeSUSF3RCwrVZVQvXtQBE27p72GNpiugFtuAzEuidgSNmo3vF1AVs-ACBGcFFzf8mbgdG9YirllnP4PWN_j-Yse44Z96Fq6SIyLmgRMmSohZvBiFgpzVBGWRzCSktF2o2x52PPlgt-Pq7camGqUX_bRWVB_6DK0FQv1NnLG_cRAB7nIi/w400-h213/DominoHub2022.png" width="400" /></a></div><p><br /></p><p>私は一つのセッションを担当しました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsFPsEGnl3iF2fwhukDibNDLFJdKJB4F2-oHEBCt4J6H0lCIjwnptLK0FcxtT6ixtoQL3H8U6-HaMo5wFyg8glcaGuyAh21jUYEtI_n5JLlmfgt1VCXQzK9p8wIBa1Jrx6GzAd70BmGDuWKCAYG6ZZFgeIvomMXsFb_dQwIu_22_GGIHDnUqIQpKMU/s1601/DominoHub2022table.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1368" data-original-width="1601" height="341" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsFPsEGnl3iF2fwhukDibNDLFJdKJB4F2-oHEBCt4J6H0lCIjwnptLK0FcxtT6ixtoQL3H8U6-HaMo5wFyg8glcaGuyAh21jUYEtI_n5JLlmfgt1VCXQzK9p8wIBa1Jrx6GzAd70BmGDuWKCAYG6ZZFgeIvomMXsFb_dQwIu_22_GGIHDnUqIQpKMU/w400-h341/DominoHub2022table.png" width="400" /></a></div><br /><p><br />ざっくり内容をお伝えすると、LotusScript (と Java) を使って Notes から AWS のサービスへ API オペレーションでアクション要求を送信し、その応答から要求の成否を判断する、といったものです。</p><p>この内容は<a href="https://harunakano.blogspot.com/2022/04/aws-api.html" target="_blank">以前書いたエントリ</a>でもご説明したものを含みますが、その後わかったことなどをちょっとだけ付け足しています。</p><p>セッション中で使用した資料を公開しましたので、そのリンクを下に置いておきます。</p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" mozallowfullscreen="true" src="https://speakerdeck.com/player/f3aad20a689d4fd1b00f490b5d644345" style="background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: 314px; margin: 0px; padding: 0px; width: 560px;" title="HCL Notes で管理する AWS リソース" webkitallowfullscreen="true"></iframe><p><br /></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-44706392243940525602022-08-17T14:21:00.004+09:002022-08-19T18:24:27.519+09:00Domino REST API のチュートリアルを試してみた<p>2022年8月の「<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0069193" target="_blank">テクてくLotus技術者夜会</a>」に参加予定なのですが、アジェンダにある「<span face=""Segoe UI", "Helvetica Neue", "Apple Color Emoji", "Segoe UI Emoji", Helvetica, Arial, sans-serif" style="background-color: white; color: #252423; font-size: 16px;">Project KEEP (REST API)</span>」について予習しておこうと思い、この記事「<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099449" target="_blank">Domino Rest API (KEEP) のチュートリアル</a>」のとおり進めたところ、ハマりどころがいくつかありましたので、ここで共有したいと思います。</p><p>これからチュートリアルを進める方の参考になれば幸いです。</p><p>このエントリを書いている時点では、Domino REST API は最新ベータ版は 2022年7月版 EAP(Early Access Program)として Docker イメージで提供されています。私はこれを使用しました。</p><p><br /></p><p><span style="font-size: medium;">ハマりどころ(1):パーミッション</span></p><p>Docker イメージを使うには、それを動かすホストマシンが必要です。私は自前のPC(Windows 10) に Docker Desktop を導入しているので最初はそちらで進めていました。</p><p>ところがチュートリアルの「<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099449#keepconfigui" target="_blank">Domino REST APIの管理画面での操作</a>」でホストマシンにダウンロードした Demo.nsf のパーミッションを変えてコンテナへコピーするところで、ホストマシンが Windows のためにパーミッション変更する方法が分からず一旦中断となりました。結局のところ、WSL2(Windows Subsystem for Linux) に Ubuntu をインストールし、そこに Docker をインストールして Docker イメージを使用することで Demo.nsf のパーミッション変更ができ、先に進むことができました。</p><p>実は Docker Desktop 上でパーミッション変更せずに先に進めたところ、問題が発生してしまいました。みなさんはパーミッションを変更できるホストマシンから操作するようにしてほしいと思います。</p><p><br /></p><p><span style="font-size: medium;">ハマりどころ(2):誤り</span></p><p>まだベータ版ということであるあるかとも思いますが、チュートリアルに記載のとおりにコマンドを叩いてもエラーになることがあります。</p><p>今回はチュートリアルの「<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099449#runrestapi" target="_blank">curl もしくは postman でREST APIの操作</a>」に誤り(バージョンがあがって仕様が変わったかも?)があり、ハマりました。</p><p>「文書を作成する」</p><p>チュートリアルには次のように GET と書かれていますが POST が正しいです。</p><p><span style="background-color: white; color: #4b4b4b; font-family: "courier new", courier; font-size: 14px;">GET /api/v1/document?dataSource=<スコープ名></span></p><p><br /></p><p>「文書を取得する」</p><p>チュートリアルには</p><p><span style="background-color: white; color: #4b4b4b; font-family: "courier new", courier; font-size: 14px;">/api/v1/document/<文書の UNID>/default?dataSource=<スコープ名></span></p>と書かれていますが、これでは「404 This is not the URL you seek」となります。これを<p><span style="background-color: white; color: #4b4b4b; font-family: "courier new", courier; font-size: 14px;">/api/v1/document/<文書の UNID>?dataSource=<スコープ名></span></p><p>のように "/default" を除去することで文書を取得することができました。</p><p><br /></p><p>「文書を削除する」</p><p>こちらも「文書を取得する」と同じく "/default" を除去することで文書を削除することができました。</p><p><br /></p><p><span style="font-size: medium;">ハマりどころ(3):削除権限の反映</span></p><p>チュートリアルでは、「文書を削除する」で文書を削除できる設定に変えるため、Demo.nsf に作成されるリソースファイル「REST/<スキーマ名>.json」を編集するよう指示されています。私はこのとおり編集してみたものの「403 You are not allowed to delete the document at this mode」のエラーが出続けました。私の環境では Docker コンテナを再起動したところ反映されました。コンテナあるいは Domino を再起動するのではないにしろ、変更した設定を反映するのに何かアクションしなければならないのかもしれません。</p><p><br /></p><p>ハマりどころ(4):リソースファイルにビューが反映されないことがある</p><p>チュートリアルの「<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099449#keepconfigui" target="_blank">Domino REST APIの管理画面での操作</a>」に従って操作し、手順16で[Activated Views]にビューが追加されているにもかかわらずリソースファイル「REST/<スキーマ名>.json」に追加した内容が反映されておらず、REST APIでビュー一覧を取得できない、ということがありました。管理画面からビューの追加や削除をしながらリソースファイルの内容を確認する、といったことをしていると反映されることがあり、そのタイミングで REST API を実行すればビュー一覧を取得することができました。変更した設定内容がキチンと反映してほしいな、と思いました。</p><p><br /></p><p>以上です。</p><p>なお、今回の問題解決に大いに役に立ったのは下の情報です。こちらのほうが仕様変更があった場合に速やかに反映されるかもしれません。</p><p>https://opensource.hcltechsw.com/domino-keep-docs/</p><p><br /></p><p>今回のチュートリアルにある文書の操作などを行うため、先に取得した認証トークンを使用します。認証トークンの文字列は長いので覚えることができないし、いちいち控えておくのも面倒ということもあって、下の様な LotusScript でエージェントを作ってテストを進めていました。以下のコードは試行錯誤した履歴を含むので見づらいと思いますが、現時点で(私の環境では)きちんと動作しました。※サーバー停止は動きません</p><pre>%REM
Agent DominoRESTAPI
Created 2022/08/16 by administrator
Description: Domino Rest API サンプル環境を利用した学習
本エージェント実行前にやる事
1. Docker Windows の起動、restapiコンテナの起動
restapiコンテナ以外のコンテナが起動する場合、終了しておく
2. ipconfig でWSLのIPアドレス確認、HOSTS修正
REQ_TARGET_HOST のホストのIPアドレスがHOSTSと異なる場合、修正する
%END REM
Option Public
Option Declare
Sub Initialize
Dim ss As New NotesSession
Dim req As NotesHTTPRequest
Dim nav As NotesJSONNavigator
Dim elm As NotesJSONElement
Dim arr As NotesJSONArray
Dim obj As NotesJSONObject
Dim url$, data$, token$, unid$
Dim headers
Const USER_NAME = "Administrator"
Const USER_PASSWORD = "password"
Const REQ_PROTOCOL = "http://"
Const REQ_TARGET_HOST = "himawari.noteslab.local:8880"
Const ADMIN_HOST = "himawari.noteslab.local:8889"
Const REQ_API = "/api/v1"
Set req = ss.Createhttprequest()
req.Preferjsonnavigator = True
'認証トークンの取得
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/auth"
req.Setheaderfield "Content-Type", "application/json"
data = |{"password":"| & USER_PASSWORD & |","username":"| & USER_NAME & |"}|
Set nav = req.Post( url, data )
If InStr( req.Responsecode, "200" ) = 0 Then Exit Sub
Set elm = nav.Getelementbyname( "bearer" )
If elm Is Nothing Then Exit sub
token = elm.Value
Print "[DEBUG PRINT] token = " & token
'DB一覧の取得
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/admin/access"
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
data = |{"checkAllNsf": true,"onlyConfigured": false}|
Set nav = req.Post( url, data )
If InStr( req.Responsecode, "200" ) = 0 Then Exit Sub
Set arr = nav.Getelementbyname( "databases" ).Value
Set elm = arr.Getfirstelement()
While Not elm Is Nothing
Set obj = elm.Value
If obj.Getelementbyname( "path" ).Value = "Demo.nsf" Then
Set obj = obj.Getelementbyname( "activeConfigurations" ).Value
Print "[DEBUG PRINT] activeConfigurations.demodbscope = " & obj.Getelementbyname( "demodbscope" ).Value
End If
Set obj = Nothing
Set elm = arr.Getnextelement()
Wend
'データベース内のビューを確認する
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/lists?type=views&dataSource=demodbscope"
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
Set nav = req.Get( url )
If InStr( req.Responsecode, "200" ) = 0 Then Exit Sub
Print nav.Stringify()
'文書を作成する
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/document?dataSource=demodbscope"
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
data = |{"first_name": "George","last_name": "Branthwaite","email": "gbranthwaite0@nba.com","gender": "Male","ip_address": "91.254.204.27","Form": "Customer"}|
Set nav = req.Post( url, data )
If InStr( req.Responsecode, "200" ) = 0 Then Exit Sub
Print nav.Stringify()
Set elm = nav.Getelementbyname( "@unid" )
unid = elm.Value
'文書を取得する
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/document/" & unid & "?dataSource=demodbscope"
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
Set nav = req.Get( url )
If InStr( req.Responsecode, "200" ) = 0 Then
Print "文書の取得に失敗しました。 responseCode = " & req.Responsecode
Print nav.Getelementbyname( "message" ).Value
'Exit Sub
End If
Print nav.Stringify()
'文書を削除する
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/document/" & unid & "?dataSource=demodbscope"
'※メモ
'Demo.nsf をDesignerで開き、リソースにあるファイル「REST/demodbschema.json」の
'「/forms/formModes/deleteAccessFormula/formula」の値を @trueにしたが削除できず、
'それでも"not allowed to delete"になるので、Dockerコンテナを再起動したところ、削除できた。
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
Set nav = req.Deleteresource( url )
If InStr( req.Responsecode, "200" ) = 0 Then
Print "文書の削除に失敗しました。 responseCode = " & req.Responsecode
Print nav.Getelementbyname( "message" ).Value
'Exit sub
End If
Print nav.Stringify()
'ログアウトする
url = REQ_PROTOCOL & REQ_TARGET_HOST & REQ_API &_
"/auth/logout"
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
data = |{"logout": "Yes"}|
Set nav = req.Post( url, data )
If InStr( req.Responsecode, "200" ) = 0 Then
Print "ログアウトに失敗しました。 " & req.Responsecode
Print nav.Stringify()
'Exit Sub
End If
Print nav.Stringify()
'サーバーを停止する
url = REQ_PROTOCOL & ADMIN_HOST &_
"/shutdown"
'bearerトークンを残す意味で直上のログアウトをせずに実行してみたものの動作せず、
'結果は「401 Unauthorized, boiling TAR」となった。
Call req.Resetheaders()
req.Setheaderfield "Content-Type", "application/json"
req.Setheaderfield "Authorization", "Bearer " & token
data = |{"shutdownkey" : "The End is near!!","StopServer" : true}|
Set nav = req.Post( url, data )
If InStr( req.Responsecode, "200" ) = 0 Then
Print "サーバー停止に失敗しました。 " & req.Responsecode
'Exit Sub
End If
Print nav.Stringify()
End Sub</pre>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-74866362675269562152022-08-14T18:58:00.009+09:002023-06-26T21:45:48.283+09:00Nomad Web 1.0.5 ベータ版の試用環境をワンタッチセットアップで構築してみた<p>Domino のアプリケーションを Notes クライアント無しで Web ブラウザから利用できる「HCL Nomad Web」は、事例も公開されましたし本格的に導入を検討される企業も多いのではないでしょうか。</p><p>事例にもある現行バージョンの 1.0.4 では、Web ブラウザと Domino サーバーの間に Nomad Web Proxy と呼ばれる SafeLinx サーバーを設置しなければなりません。SafeLinx がポート番号 443 から 1352 へとその逆の変換を行います(この SafeLinx 環境の構築がなかなか難しい...)。</p><p>Notes クライアントに相当する「HCL Nomad Web」は、PWA (Progressive Web App)という技術が用いられており、以前のバージョンから存在する「Notes ブラウザ・プラグイン」とは全く異なるものです。HCL Nomad Web は、いったんブラウザで Domino へログインできればアプリとしてインストールすることも可能です。</p><p><br /></p><p>現在 <a href="https://www.hcljapan.co.jp/software/blog/hcl-nomad-server-1-0-5-beta-program-released" target="_blank">Nomad Server 1.0.5 ベータ版</a>が公式サイトからダウンロードできます。</p><p>Nomad Server は、SafeLinx を代替するタスク「nomad」をDomino 上で稼働させることで、これまで必要だった SafeLinx サーバーを不要にします。※不要でよいかどうかは環境によるかもしれません</p><p><br /></p><p>さて今回はこの新しい Nomad Server 1.0.5 ベータ版を使った Nomad Web の試用環境を Domino 12.0 の新機能を活用しながらなるべく手数を少なく実現することができるか?というテーマでチャレンジしてみます。今はお盆休みですので「夏休みの自由研究」といったところですね。ちなみに今回使用する Domino は 12.0.2 のベータ版ですが、既に日本語言語パックのベータ版もあるんです。</p><p><br /></p><p>サーバー環境ですが、Windows 10 の Hyper-V 上に作成した、CPU x 2、メモリ 8GBの仮想環境に試用版の Windows Server 2022 を導入しています。</p><p>そのローカルドライブ「c:\work」へあらかじめダウンロード等しておいた次のファイルをコピーしました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Whgm-H0UjExeYclfherOgGWwve-Os6KFKCBCwdISU9GBHGZJr40zjBv1LfZISw1JQ_tEolbHw28LY-dWnSBPZhXo9ea4VsnTM6nnkw0wquw3Pm7WZ6eD4JMxBl269fiIbcXphluZDkZBxHFrCLiZWqTon5JJtr6i3Om4FxKIug_P941r7Xf_ABl8/s1280/nw%2301.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="380" data-original-width="1280" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Whgm-H0UjExeYclfherOgGWwve-Os6KFKCBCwdISU9GBHGZJr40zjBv1LfZISw1JQ_tEolbHw28LY-dWnSBPZhXo9ea4VsnTM6nnkw0wquw3Pm7WZ6eD4JMxBl269fiIbcXphluZDkZBxHFrCLiZWqTon5JJtr6i3Om4FxKIug_P941r7Xf_ABl8/w640-h190/nw%2301.png" width="640" /></a></div><ol style="text-align: left;"><li>7-Zip のインストーラ(tar 形式で提供される言語パックの解凍用として)</li><li>Google Chrome のインストーラ(Nomad Web がサポートするブラウザ)</li><li>HCL Domino 12.0.2 Windows English ベータ版(Early Access Program 3)</li><li>HCL Domino 12.0.2 日本語 言語パック ベータ版(Early Access Program 3)</li><li>HCL Nomad Server 1.0.5 Windows 12.0.2用 ベータ版(後述)</li><li>ワンタッチセットアップで使用する json ファイル(後述)</li></ol><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><div style="text-align: left;">※12.0.2 のベータ版には、Designer と Admin クライアントを含む Notes クライアントの64ビット版(!)もあります。ここでは Notes クライアントを使用しませんが、もし Notes クライアントをインストールする場合、事前に DigiCert の証明書(上図では DigiCertで始まる2つの .crt ファイル)をインストールしておく必要があります 【<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099624" target="_blank">参考 KB0099624 DigiCert Trusted Root G4 Cert のインストール</a>】</div></blockquote><div><p><br /></p><p>また Web ブラウザに Domino のホスト名を指定するとローカルの Domino へアクセスするように hosts ファイルへ次の1行を追加しています。</p></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"><p style="text-align: left;">127.0.0.1<span> himawari.noteslab.local<span> himawari</span></span></p></blockquote><div><p><br /></p><p>コピーしたファイルをリストの順にインストールします。ここでは1~4のインストール手順を割愛します。Domino はワンタッチセットアップを行うため、ここではまだセットアップを起動しません。</p><p><br /></p><p>Nomad Server 1.0.5 は、zip 形式のファイルで提供されています。zip ファイル内にある1つのフォルダと2つのファイルを、Domino プログラムディレクトリ( Windows のデフォルトでは "C:\Program Files\HCL\Domino")へコピーします(下図)。Nomad Server のインストールはこれだけです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmcK2XE4mXk_3D3T1YQavZ5DWUwRVuR_aGrOx3K_QPxutXfzIkxi5vdVJnQnUWcFuRG4QE2YHzpa0288QzgR_WxgahPMTWn_kQWtmyql1nw8hQU_DVpQLr4PpZdjUg4hBAUII-gnAH8R3I_nKeBj49fzihbY_Ti9k9jZqfgqXBabrmp8V8eNbvy4O9/s1220/nw%2302.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="246" data-original-width="1220" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmcK2XE4mXk_3D3T1YQavZ5DWUwRVuR_aGrOx3K_QPxutXfzIkxi5vdVJnQnUWcFuRG4QE2YHzpa0288QzgR_WxgahPMTWn_kQWtmyql1nw8hQU_DVpQLr4PpZdjUg4hBAUII-gnAH8R3I_nKeBj49fzihbY_Ti9k9jZqfgqXBabrmp8V8eNbvy4O9/w640-h130/nw%2302.png" width="640" /></a></div><br /><p><br /></p><p>続いて Domino をセットアップします。セットアップは Domino 12.0 の新機能である「ワンタッチセットアップ」を利用しました。ワンタッチセットアップでは、GUI のセットアップウィザードで設定できる項目の他にも様々な設定をセットアップと同時に実施することができます。設定する内容はファイルに記載します。ファイルは json 形式と環境変数の2通り利用できますが、今回は json 形式のファイル setup.json として作成しました。</p><p>json ファイルの内容は次のとおりです。</p><pre>{
"serverSetup": {
"server": {
"type": "first",
"name": "himawari",
"domainName": "noteslab",
"title": "testing nomad server"
},
"network": {
"hostName": "himawari.noteslab.local"
},
"org": {
"orgName": "noteslab",
"certifierPassword": "password"
},
"admin": {
"lastName": "Administrator",
"password": "password",
"IDFilePath": "noteslab.admin.id"
},
"notesINI": {
"ServerTasks": "Update,Replica,Router,AMgr,Adminp,HTTP,nomad",
"LOG_REPLICATION": "1",
"LOG_SESSIONS": "1",
"CREATE_R12_DATABASES": "1",
"DisableLDAPOnAdmin": "1",
"NOMAD_WEB_HOST": "himawari.noteslab.local"
},
"security": {
"ACL": {
"prohibitAnonymousAccess": true,
"addLocalDomainAdmins": true
},
"TLSSetup": {
"method": "dominoMicroCA",
"CAKeyType": "ECDSA",
"CAExpirationDays": 365,
"TLSKeyType": "RSA2048",
"certExpirationDays": 90
}
},
"registerUsers": {
"defaults" : {
"saveIDToPersonDocument": true,
"password": "password",
"mailTemplatePath": "mail12.ntf",
"enableFullTextIndex": true,
"certificateExpirationMonths": 36
},
"users": [
{
"firstName": "Hideki",
"middleName": "",
"lastName": "Masui",
"shortName": "HMasui",
"mailFilePath": "mail/HMasui.nsf",
"IDFilePath": "HMasui.id",
"internetAddress": "hideki.masui@noteslab.local"
}
]
}
},
"IDVault": {
"name": "O=noteslabVault",
"description": "noteslab Vault",
"IDFile": "noteslabVault.id",
"IDPassword": "noteslabPassword",
"passwordReset": {
"helpText": "sample help text"
},
"securitySettingsPolicy": {
"name": "noteslab Vault Security Settings Policy",
"description": "noteslab Vault Security Settings"
},
"masterPolicy": {
"description": "noteslab Vault Master Policy Description"
}
},
"appConfiguration": {
"databases": [
{
"filePath": "names.nsf",
"action": "update",
"documents": [
{
"action": "update",
"findDocument": {
"Type": "Server",
"ServerName": "CN=himawari/O=noteslab"
},
"computeWithForm": true,
"items": {
"HTTP_SSLKeyFile": "himawari.noteslab.local",
"HTTP_SSLMode": "1"
}
}
]
}
]
}
}</pre><p>json のパラメータ等は<a href="https://help.hcltechsw.com/domino/12.0.0/admin/inst_onetouch_preparing_json.html" target="_blank">こちらのオンラインヘルプ</a>を見ていただくこととして、構築する環境について簡単に説明します。</p><p>Domino は既存の Domino と切り離すため「最初のサーバー」とします。サーバー名は夏っぽく「himawari」とし、ドメイン名と組織名は「noteslab」としました。</p><p>Domino 起動時に自動起動したいので notes.ini の「ServerTasks」に、Web ブラウザからアクセスさせるため HTTP タスクと、Nomad Server タスク「nomad」を追加しています。</p><p>Web ブラウザが Nomad Server へアクセスする際の FQDN を「NOMAD_WEB_HOST」というパラメータで notes.ini へ追加しています。</p><p>Nomad Server へのアクセス(というか PWA の要件?)に https でのアクセスが必要になるため、Domino 側に証明書を用意する必要があります。そこで Domino 12.0 の新機能である証明書ストアを利用し、さらに 12.0.1 の新機能である MicroCA を利用することで自己署名証明書を作成しています。json では "serverSetup/security/TLSSetup/" の部分です。</p><p>さらに、Domino サーバーが証明書ストアに用意した証明書を使用できるようにするためサーバー文書を更新しています。json では "appConfiguration/databases/documents/" の部分です。"items" で2つのフィールドを置換します。ひとつは「TLS キーファイル名(HTTP_SSLKeyFile)」です。デフォルトではキーリングファイル名 "keyfile.kyr" が設定される部分ですが、これを証明書ストアにある TLS証明書文書のホスト名を指定します。もうひとつは「TLS ポートステータス(HTTP_SSLMode)」です。このデフォルト値は"無効"ですがこれを"有効"にします。json ファイルには自己署名証明書を持つTLS証明書を作成するような記述がありませんが、「serverSetup/network/hostName」で指定したホスト名と同じ名前で自動でTLS証明書文書が作成されました。</p><p>Nomad Web でログインするユーザーのアカウントの ID ファイルが ID ボールトに登録されていることが必要です。そこで json では、ユーザー1名の追加とIDボールトを作成する記述を追加しています。ID ボールトを作成する場合、ユーザーの ID ファイルは自動で ID ボールトへ登録されます。</p><p><br /></p><p>この json ファイルを使用して Domino のワンタッチセットアップを行います。</p><p>セットアップの起動は、コマンドプロンプトから次のコマンドを投入しました。オプション -autoconf に json ファイルを指定します。</p></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><p>cd \program files\hcl\domino</p></div></blockquote><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><p>nserver.exe -autoconf c:\work\setup.json</p></div></blockquote><div><p><br /></p><p>上のコマンドを投入してから Domino が起動するまでの<a href="https://youtu.be/SFyHZxrmlAc" target="_blank">動画</a>を撮ってみました。初めから 0:24 あたりまで Domino のセットアップ処理が実行されます。</p><p>0:28 に Domino が起動して 0:50 あたりでコンソールのスクロールがいったん落ち着きます。</p><p>その後起動しているタスクを確認したあと(特に理由はありませんが)Domino を再起動します。再起動が完了したあたりで動画が終わります。</p><p><br /></p><p>これで Domino は完了です。Dominoのセットアップに加えて、IDボールトの作成+ユーザー登録+notes.ini の編集+自己署名証明書作成+サーバー文書の編集がまさにワンタッチで完了しました。</p><p><br /></p><p>いよいよ Nomad サーバーへ Google Chrome を使ってアクセスします。</p><p><br /></p><p>この環境は、Domino が自己署名証明書(通称:オレオレ証明書)を使用するため(?)3つの問題があります。</p><p>1つめは、Google Chrome を使って最初にアクセスしたとき「この接続ではプライバシーが保護されません」が表示されることです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCOIFojYi0HulQOGXjdqtfPnugc-gOo8zgobOtBQkYkKfMusTAs_21sBIlJgJLYduoSPUP083Dsax5FDXdjq_qe9SEKsJ0IKeEtMUqe_WqcysZsyO5LSntdcG4Xv3PUjwtoxWz903uaPo0cWdSbCKA0lOxO7XxYWzeZmnRhedNK0Qh9yK65m-6vRy7/s833/nw%2303.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="682" data-original-width="833" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCOIFojYi0HulQOGXjdqtfPnugc-gOo8zgobOtBQkYkKfMusTAs_21sBIlJgJLYduoSPUP083Dsax5FDXdjq_qe9SEKsJ0IKeEtMUqe_WqcysZsyO5LSntdcG4Xv3PUjwtoxWz903uaPo0cWdSbCKA0lOxO7XxYWzeZmnRhedNK0Qh9yK65m-6vRy7/s320/nw%2303.png" width="320" /></a></div><p>このメッセージは、アドレスバーへ Nomad サーバーのURLを投入すると表示されます。アクセスするには、[詳細情報]から「himawari.noteslab.local にアクセスする(安全ではありません)」をクリックします。</p><p>2つめは、Google Chrome では Nomad の画面でユーザー名を指定した後「サービスワーカーの登録に失敗しました。[更新]をクリックして再試行してください。」と表示されることです。更新をクリックするとこの画面が繰り返し表示されます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5v1LUv2tMlPMfF8hqchyyz_Ob6gQF3EwR8bVBKwg50_zVz7Yxm2d44brETPGGgb36wdN2zXs3kYVW13b-NVWSylrKucX1qGL5b-YOK3UgyMh52JlZnnJFfFN-q-Wt4eL5ZldbDXUluhJ6u2Bj7dKGyKfEia2wsJTusfvBbuZEQCgzaNwW93COzeoG/s562/nw%2304.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="427" data-original-width="562" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5v1LUv2tMlPMfF8hqchyyz_Ob6gQF3EwR8bVBKwg50_zVz7Yxm2d44brETPGGgb36wdN2zXs3kYVW13b-NVWSylrKucX1qGL5b-YOK3UgyMh52JlZnnJFfFN-q-Wt4eL5ZldbDXUluhJ6u2Bj7dKGyKfEia2wsJTusfvBbuZEQCgzaNwW93COzeoG/s320/nw%2304.png" width="320" /></a></div><div><br /></div>どうやら Nomad Web(PWA?)が使用するサービスワーカーという仕組みが、local または「自己署名証明書でない証明書を使用した」https でないと動作しないらしいのです。Domino の FQDN を local として指定できればいいのでしょうけれど、残念ながら私はまだ解決法を見つけることができていません。</div><div>現状では、私はこれを回避するためコマンドプロンプトからオプションを指定して Google Chrome を起動しています。コマンドは次のとおりです。</div><div><blockquote>"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\Users\Administrator" --unsafely-treat-insecure-origin-as-secure="https://himawari.noteslab.local:9443/nomad/" --ignore-certificate-errors</blockquote><br /><p><br /></p><p>上記の2点の問題をクリアして Nomad Web の画面を表示することができました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbH67pXB9vsFxTJGja0-GcvmbsRq_0O7lj9IYnVzRoyyApgGOCXXCju10QK4_L18iyoMqo2pg5F70Orwx0EtHIFx4f89nNLsbvkW28WgHQc2Icz4eP8zcpSp0mPovIe0kD5_dpJNjqGFsaLGKEahf8_ShHQRLfN4Pkx36JdAGKRrn0uqxrSSlsHTYy/s2047/nw%2305.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1299" data-original-width="2047" height="406" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbH67pXB9vsFxTJGja0-GcvmbsRq_0O7lj9IYnVzRoyyApgGOCXXCju10QK4_L18iyoMqo2pg5F70Orwx0EtHIFx4f89nNLsbvkW28WgHQc2Icz4eP8zcpSp0mPovIe0kD5_dpJNjqGFsaLGKEahf8_ShHQRLfN4Pkx36JdAGKRrn0uqxrSSlsHTYy/w640-h406/nw%2305.png" width="640" /></a></div><div><br /></div>一旦 Google Chrome で起動してしまえば、アドレスバーの右側にあるアイコンからアプリをインストールできます。アプリをインストールすると Windowsデスクトップにアイコンが追加されます。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlIPiiIxSTnUjnJcnQ0irlfgb8GSBOLMxWc57JAzpWWziloLJBOplFRxKnkppBMHbraN8A5tAYqby2iXwcDOuG6TdJ7tDUJrUAUsubokGGaxBQlJ7JY9fs_DzdfVdvii3j4tjYTpX1Hptn7DVfYTXKzFHhC2LtlMGUYdRFJ10RSm-I-3PIWGqubEG3/s787/nw%2306.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="787" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlIPiiIxSTnUjnJcnQ0irlfgb8GSBOLMxWc57JAzpWWziloLJBOplFRxKnkppBMHbraN8A5tAYqby2iXwcDOuG6TdJ7tDUJrUAUsubokGGaxBQlJ7JY9fs_DzdfVdvii3j4tjYTpX1Hptn7DVfYTXKzFHhC2LtlMGUYdRFJ10RSm-I-3PIWGqubEG3/s320/nw%2306.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCHcd9MQPrske3a_lf-LfkPiVpaZBX4lUzFCD6O4BKb52dK0szDOFaGMI5u5f214OeAipi3qkgmHSDoWArbbDULHz46eN0T1UZ7SOCoeyXz9s7hYsuy3LK1fZ-pzI_DW0_AqOpZS0dIGVj9Bv488VWNh-WXtZNGh2o04PQRCyX7a2HGgdsoGo7rfFl/s835/nw%2307.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="470" data-original-width="835" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCHcd9MQPrske3a_lf-LfkPiVpaZBX4lUzFCD6O4BKb52dK0szDOFaGMI5u5f214OeAipi3qkgmHSDoWArbbDULHz46eN0T1UZ7SOCoeyXz9s7hYsuy3LK1fZ-pzI_DW0_AqOpZS0dIGVj9Bv488VWNh-WXtZNGh2o04PQRCyX7a2HGgdsoGo7rfFl/s320/nw%2307.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3vq2RDklHY8MZujp9H-efi0CI-ODn0Y81DuXgFE2XszFe7bCAXkD4Z4rg55Fflo9PrGVS4dwPbLInGkQF5Bu9jH3Y9yOczedaBNF1OH0lDc8HCjhntPJcJZrWmusutBMfshAqtWkR5V1KzwW3dYIU1SgPfcXEJKvugF9SeIXVpoLI52VRuW2oCUOQ/s213/nw%2308.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="213" data-original-width="212" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3vq2RDklHY8MZujp9H-efi0CI-ODn0Y81DuXgFE2XszFe7bCAXkD4Z4rg55Fflo9PrGVS4dwPbLInGkQF5Bu9jH3Y9yOczedaBNF1OH0lDc8HCjhntPJcJZrWmusutBMfshAqtWkR5V1KzwW3dYIU1SgPfcXEJKvugF9SeIXVpoLI52VRuW2oCUOQ/w199-h200/nw%2308.png" width="199" /></a></div></div><br /><div>ここで3つ目の問題が発生しました。私の環境では、アプリのインストール直後は Nomad Web で Domino サーバー上のアプリケーションを開くことができたのですが、アプリと Google Chrome を終了し再度アプリを起動すると Domino サーバーへ接続することができなくなってしまいました(ローカルにある names.nsf はキチンと開きました)。おそらくは Chrome 起動時のオプションが無いからではないかと推測していますが、自己署名証明書を使用する(サポート外の)環境でありメーカーへ問い合せもできないため深追いしないことにします。<br /><p><br /></p><p>このエントリを参考にされる皆さんは、自己署名証明書ではなく外部CAが発行した証明書を使ってください。私は3つの問題にずいぶん時間を使ってしまいましたので...</p><p><br /></p><p>なお、動画ではユーザーが2名追加されていますが、上に示した json では1名削除しました。ユーザーの切り替えなどテストする場合は2名以上登録したいですね。</p><p><br /></p><span><a name='more'></a></span><p>2022/8/23 追記</p><p>Domino 12.0.2 EAP4 と Nomad Server 1.0.5 ベータの次のバージョン(450?)が公開され、以前より話題になっていた「Restyle」が実装されたとのことでしたので早速検証環境を構築してみました。</p><p>こちらは証明書ストアとCertMgr 以外を One-Touch セットアップで実施し、TLS証明書は Let's Encrypt と CloudFlare という外部DNSプロバイダを使って取得しました。Let's Encrypt には証明書を発行する環境が2つあり、本番で使用可能な証明書を発行可能な Production と、そうではない Staging です。私の検証環境では、Staging で発行した証明書を使用すると、Nomad Web でアカウント名を入力した後、パスワード入力画面が表示されず先へ進めませんでしたが、Production で発行しなおした証明書では何の問題もありませんでした。</p><p>Restyle ですが、Nomad Web を Google Chrome の言語設定を日本語で使用するとファイルメニューに Restyle のアイテムが表示されません。現在のところ言語設定を英語にしなければならないようです。</p><p>手持ちの Notes アプリケーションを幾つか Restyle してみたところ、3つは Complete でしたが1つはエラーとなりました。エラーの詳細がどこにあるのか不明ですし、メニューから再度 Restyle しようにもこのアプリではメニューアイテムに Restyle が表示されなくなりました。試される場合は、データベースのバックアップあるいは設計のコピーを取るなどしてやり直しがきくように対策しましょう。</p><p>もともと背景色を濃い青、ボタンの文字色を白に設定していた割とイマドキのデザインのページを Restyle にかけたところ、文字色が白のまま背景色も明るい色になってしまい、なんのボタンか分かりづらくなってしまう場合がありました。こういった細かいところは今後に期待したいです。</p><p><br /></p></div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-11511358130520255472022-08-05T10:08:00.002+09:002023-02-20T23:00:42.900+09:00半角英数字以外を削除する<p>フィールドに入力された文字列にある半角英数字だけ残し、改行やタブを含む「記号」と「全角文字」を削除したいことがありまして、次のようなコードを書いてみました。</p><pre>Function allowChar_azAZ09( inputStr$ ) As String
Dim compareChr$, removeChr$()
Dim strLen&, i%, j%
allowChar_azAZ09 = inputStr<br /> strLen = Len( inputStr )
If strLen = 0 Then Exit Function
j = 0<br /> For i = 1 To strLen
compareChr = Mid( inputStr, i, 1 )
If compareChr Like "[!a-zA-Z0-9]" Then
Redim Preserve removeChr$( j )
removeChr( j ) = compareChr
j = j + 1
End If
Next
If j > 0 Then
allowChar_azAZ09 = Replace( inputStr, removeChr, "" )<br /> End If
End Function<br /></pre><p>このファンクションの引数にフォーム上に入力された文字列を与えると、半角英数字だけの文字列を返します。</p><p>残したい文字が半角英数字だけなので Like 演算子に [!a-zA-Z0-9] を指定しています。</p><p></p><blockquote><p>ちなみに Like 演算子を使う上で注意するべきことが次の Article に書かれています。念のため (Options) に Option Compare Binary を指定した上で大文字小文字のどちらも Like 演算子に明示的に指定しました</p><p><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0025874" target="_blank">LotusScript の like 演算子が常に大文字・小文字を同一とみなす</a><br /><span style="font-size: xx-small;">https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0025874</span></p></blockquote><p></p><p>入力された文字列の最初から1文字ずつ順に取り出し、取り出した文字が削除の対象ならその文字をいったん配列に追加します。入力された文字列を最後の文字まで比較しおわったら、入力された文字列に含まれる配列中の文字を "" に置換して戻します。</p><p><br /></p><p>フォームから上のコードを呼び出してテストした結果が次のスクリーンショットです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhajK3wzKDzFMTYkOaQihKgieOeX_smwk5JtbfjStD4sVgf7pLJCm18b_Yt9TNokELFrf9c_SvrZSGT6zlZLY1zMyCiveZbVoQiRQBn_-p8DhXhpucMCnQw1l1Ri0Y-mFrzNFyzJVcLX6_uJRC3I2bufVZf4ep2CMbZxd0ocOmJGA2cYxqYEspSlJ9L/s1178/%E3%83%86%E3%82%B9%E3%83%88%231.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="246" data-original-width="1178" height="84" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhajK3wzKDzFMTYkOaQihKgieOeX_smwk5JtbfjStD4sVgf7pLJCm18b_Yt9TNokELFrf9c_SvrZSGT6zlZLY1zMyCiveZbVoQiRQBn_-p8DhXhpucMCnQw1l1Ri0Y-mFrzNFyzJVcLX6_uJRC3I2bufVZf4ep2CMbZxd0ocOmJGA2cYxqYEspSlJ9L/w400-h84/%E3%83%86%E3%82%B9%E3%83%88%231.png" width="400" /></a></div><p>左枠に文字列を入力して真ん中の矢印ボタンをクリックすると上のコードを呼び出し、戻り値を右枠にセットします。</p><p>左枠にある「"あ"、ドット、改行文字、全角スペース、タブ文字、ハイフン、半角スペース、アットマーク、括弧閉じ」が削除されています。</p><p><br /></p><p>こういったコードは過去に開発したDBで書いた記憶があるのですが実は Like 演算子を使うことは稀で、残したい文字全部を定数に指定しておいて inStr 関数を利用して文字探しすることが多いように思います。上のコードにある Like 演算子の行が次のように置き換わるイメージです。残す文字全部を定数「allowChar」に指定しています。</p><blockquote><p>If Instr( 1, allowChar, compareChr, 0 ) = 0 Then</p></blockquote><p>Like 演算子を使わない理由は一目で理解できないことがあるからですが、コードをシンプルにしたい場合は積極的に使いたいと考えています。どちらのコードがパフォーマンス良いのでしょうね。機会があったら調べてみようっと。</p><p>なお、Like 演算子でもなければ LotusScript でもなく@関数ですが、文字の種類を調べるヒントが次の Article に紹介されています。Like 演算子でも使えそう?なのでリンクをおいておきます。</p><p></p><blockquote><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0028663" target="_blank">@関数を使用して半角文字や全角文字を判別する方法</a><br /><span style="font-size: xx-small;">https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0028663</span></blockquote><span style="font-size: xx-small;"></span><p></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-3507595223577975702022-07-31T18:55:00.003+09:002022-07-31T18:55:57.304+09:00JSONの名前が文字化けする<p>Notes/Domino の LotusScript で JSON を扱うためのクラスはバージョン10で実装されました。※ちなみに現時点の最新バージョンは 12.0.1 FP1 で、以下の挙動はこのバージョンで確認したものです</p><p>NotesJSONElement クラスにエレメントの名前を扱う Name プロパティがあります。</p><p>先日この JSON を扱うプログラムを開発していて Name プロパティの不具合に「再び」遭遇しました。</p><p>Name プロパティにある日本語の値が文字化けするのです。</p><p>バージョン10で実装された2年前に私は本件をメーカーサポートへ報告しています。後に2つのメジャーリリースがありますから修正される機会はあったように思います。しかしながら優先度低いと認定されてしまっているのか、いまだに修正されていない状態です。ノーツってやつぁ...</p><p>以下にどのような不具合なのか示します。</p><p>下の画面ショットは、実際のコードをデバッグモードで実行しているときのものです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhye-zams1G4EwEHwR6R8KOMUBIqWzBLyCgw9ekIV77G6yXd60V4LMLKHMKf5HnSW2GYcgt_D8V97tcZMBAxxpKP_YU0qJKiWKQD7Ky6z8vvyDXw9iH5c0G8r0HdcDa4n9Ax0PerFHZI5nBP2dKtLRUdIz-w6dgSQ-41BeY-4Qub6YVQV-MdQIosbTB/s1119/jsonelement%231.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1119" data-original-width="1087" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhye-zams1G4EwEHwR6R8KOMUBIqWzBLyCgw9ekIV77G6yXd60V4LMLKHMKf5HnSW2GYcgt_D8V97tcZMBAxxpKP_YU0qJKiWKQD7Ky6z8vvyDXw9iH5c0G8r0HdcDa4n9Ax0PerFHZI5nBP2dKtLRUdIz-w6dgSQ-41BeY-4Qub6YVQV-MdQIosbTB/s320/jsonelement%231.png" width="311" /></a></div><br /><p>AppendElement メソッドで追加するエレメントの名前を日本語で"言語"としました。このメソッドを実行した直後のデバッグ画面の「変数」タブで NotesJSONElement オブジェクト「ELM」の Name プロパティで値の表示が文字化けしていることがわかります。</p><p>ただし VALUE プロパティの値は文字化けしていませんね。</p><p>このコードには続きがあります。</p><p>AppendElement メソッドで追加したエレメントの名前 "言語" を指定して NotesJSONElement オブジェクトを作ります。そして NotesJSONElement クラスの Name プロパティの戻り値を Print 命令で出力してみました(下図)。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-IIsW-BcbyYJA3_5Cl9AwgnpPbCKGlIhf06yVRQDfvBcF01KBYdl6sKFX_Nww_zDSIeJbnRB25bbXVCBuPNfqlDq2AFfryt65yEuju7Qp2OcG7NkPjSzPBQlaubQfnSrIrkOTmiwEDemZB5sDMcL2zBfWa5ZI628cJGeO4uKD3KLnJzL0n9OEWAUG/s919/jsonelement%232.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="469" data-original-width="919" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-IIsW-BcbyYJA3_5Cl9AwgnpPbCKGlIhf06yVRQDfvBcF01KBYdl6sKFX_Nww_zDSIeJbnRB25bbXVCBuPNfqlDq2AFfryt65yEuju7Qp2OcG7NkPjSzPBQlaubQfnSrIrkOTmiwEDemZB5sDMcL2zBfWa5ZI628cJGeO4uKD3KLnJzL0n9OEWAUG/s320/jsonelement%232.png" width="320" /></a></div><br /><p>エレメントの呼び出しに日本語の使用は可能のようですが、デバッガでの表示と Print 命令で出力すると文字化けしました。</p><p>Value プロパティの戻り値も同様に出力してみましたが、こちらは文字化けしません(下図)</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMxGMoMGsq8Ls2Il37EiijpUkTt4Ed9vmkJe5VkkPszuMq0E4nXXWYu9GM02iAU8PFEbekknTbmYGZ-zOV8fqweyK8bCcaiCQSVi7zQQsQ8JVWfmo2JIgoaT5-ly5dbrAHmwer1VUpFAFZdL9VaJdcCmc0Qt-oDD9yp6VW_kdCpOHcptfzKoHJ3Wx_/s913/jsonelement%233.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="557" data-original-width="913" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMxGMoMGsq8Ls2Il37EiijpUkTt4Ed9vmkJe5VkkPszuMq0E4nXXWYu9GM02iAU8PFEbekknTbmYGZ-zOV8fqweyK8bCcaiCQSVi7zQQsQ8JVWfmo2JIgoaT5-ly5dbrAHmwer1VUpFAFZdL9VaJdcCmc0Qt-oDD9yp6VW_kdCpOHcptfzKoHJ3Wx_/s320/jsonelement%233.png" width="320" /></a></div><br /><p>JSON をテキスト文字列にする NotesJSONNavigator クラスの Stringify メソッドの出力は文字化けしません(下図)。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUf1zzNJEqX6XW04TCSCTazmfAmA6YIS5On131H4AHKSfJOvm__HIgt_Ld2lHLxeA_X5QrUVQmAR_NlDsWB7Uabpwn6YiP_XnoH8Z13T-IZ1e0RtE6oyLBmOIl0ln3hh539_Rxp58RRMYqIff9dB2rV4b6m3gv7Pl0UhDIMUuPkn1XHRylQxEGaR4N/s903/jsonelement%234.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="683" data-original-width="903" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUf1zzNJEqX6XW04TCSCTazmfAmA6YIS5On131H4AHKSfJOvm__HIgt_Ld2lHLxeA_X5QrUVQmAR_NlDsWB7Uabpwn6YiP_XnoH8Z13T-IZ1e0RtE6oyLBmOIl0ln3hh539_Rxp58RRMYqIff9dB2rV4b6m3gv7Pl0UhDIMUuPkn1XHRylQxEGaR4N/s320/jsonelement%234.png" width="320" /></a></div><div><br /></div><p>よくわかりませんがJSONエレメントの名前を日本語にするなんてことはあまりないことなのかもしれませんが、私が今回開発していたプログラムは、JSONを自動生成するようなものでした。この手の処理では、生成元の文字列で日本語の入力を禁止するといったことをすればよいのでしょうが、そんなことすれば日本人のユーザーにとって使いづらいシステムとして認定されることでしょう。</p><p>という訳で本件メーカーサポートへ「再び」報告しました。そうして発行された Article が <a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099167" target="_blank">KB0099167</a> です。</p><p></p><blockquote><p>NotesJsonElement name attributes containing double-byte characters can't be parsed correctly</p><p>https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0099167</p></blockquote><p></p><p>もしこの問題がこれから開発しようとしているプログラムに影響がありそうでしたら Subscribe しておくと、修正されたバージョンなどが追記されるなどして Article が更新されたタイミングで通知してくれると思います。</p><p><br /></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-57077468940637200302022-07-15T21:08:00.001+09:002022-07-15T21:11:26.872+09:00TLS証明書のCAへの申請~証明書ストアへの登録までの手順<p> 昨晩はのの会に参加しました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://connpass-tokyo.s3.amazonaws.com/thumbs/d9/7f/d97fad0113422d7b7fbd9ebe1b0ebdc4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="237" data-original-width="659" height="237" src="https://connpass-tokyo.s3.amazonaws.com/thumbs/d9/7f/d97fad0113422d7b7fbd9ebe1b0ebdc4.png" width="659" /></a></div><br /><p>前回と前々回に引き続き HCL Domino バージョン12 の新機能である 証明書ストア + CertMgr タスクに関連したお話をしました。</p><p><br /></p><p>これまで TLS 証明書管理の自動化にフォーカスした話題が多めでしたが、今回は認証機関へ申請して受領した証明書を証明書ストア(CertStore.nsf)へ取り込むという、ACME プロトコルを使用しない手順を、実際に操作した際のスクリーンショットを順を追って紹介しています。</p><p>下の資料を見ていただくと、申請からの一連の操作の流れは把握できるのではないかと思います。</p><iframe class="speakerdeck-iframe" frameborder="0" src="https://speakerdeck.com/player/9adb953d4dbf409dbd7845489ff9f24f" title="TLS証明書の手動管理" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" style="border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 560px; height: 314px;" data-ratio="1.78343949044586"></iframe><p></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-64980986342776442002022-06-15T21:04:00.001+09:002022-06-15T21:14:23.563+09:00NotesForm.GetFieldType が返す数値について<p>ノーツの文書にあるアイテムの型を調べるときは NotesItem クラスの Type プロパティを参照しますが、文書ではなく設計要素の「フォーム」から直接フィールドの型を調べるときは NotesForm クラスの GetFieldType メソッドが使えます。</p><p><br /></p><p>標準テンプレート等にあるフォーム上の「Subject」フィールドのタイプは通常「テキスト」です。</p><p>テキスト型の場合、次のコードにある form.Getfieldtype("Subject") は 1280 を返します。</p><pre>Sub Initialize
Dim ss As New NotesSession
Dim form As NotesForm
Set form = ss.Currentdatabase.Getform("MainTopic")
msgbox form.Getfieldtype("Subject")
End Sub</pre><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKPUFEeAbmfqeupmTMjQ3FXsRus7ry2RiNuu2NTIrMga8tPpRqq2wBrsnnW10yu54RfD2nDVbcfwYqf6iIKzXvW98u_wY0NNUuicLYjWeN_tqk_gCf_1s_q_TJ3pL5j_lzbby8Ypi4uTEA-Xpky2oTe_XIr83iQAqJm4pdque8JUyksC7oqFXv5AnO/s370/msgbox%231.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="370" data-original-width="297" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKPUFEeAbmfqeupmTMjQ3FXsRus7ry2RiNuu2NTIrMga8tPpRqq2wBrsnnW10yu54RfD2nDVbcfwYqf6iIKzXvW98u_wY0NNUuicLYjWeN_tqk_gCf_1s_q_TJ3pL5j_lzbby8Ypi4uTEA-Xpky2oTe_XIr83iQAqJm4pdque8JUyksC7oqFXv5AnO/w161-h200/msgbox%231.png" width="161" /></a></div><br /><p>GetFieldType メソッドが返す値について、<a href="https://help.hcltechsw.com/dom_designer/11.0.1/basic/H_GETFIELDTYPE_METHOD_FORM.html" target="_blank">オンラインヘルプ</a>に次のような一文があります。</p><blockquote><p>Integer. The type of the field as specified in Type in NotesItem.</p></blockquote><p>そして文の "Type" のところに設定されていたリンクをクリックしたところ、NotesItem クラスの <a href="https://help.hcltechsw.com/dom_designer/11.0.1/basic/H_TYPE_PROPERTY_ITEM.html" target="_blank">Type プロパティについて書かれたヘルプ文書</a>が開きました。</p><p>開いたヘルプ文書には、テキスト型の値の説明として次のように書かれています。</p><blockquote><p>TEXT (1280) means text or text list.</p></blockquote><p>「text or text list」とあるので複数値を許可したフィールドも 1280 を返すようです。</p><p><br /></p><p>そこで「複数値も可」にチェックをつけたフィールド「MultiValueSubject」をフォームに追加して、どんな値が返ってくるか確認しました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBuCXp1SqX1wUWcu5iMzqMyCLUfVzBUWtxZQ-HB_KdOU5eAUzyQ0VnRp80hNmQNaqCytCXn_yZlZXaQwndJR3Mf_sXHdhbjmMc-tGAyCm6_KXMF-CxEwxVjtOQgquaZVfwMeUO5y1dGrD6tKgrs05S2BtvZXoGNy62arR6XjSPDdRacH8zovFqsqja/s1240/form.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="590" data-original-width="1240" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBuCXp1SqX1wUWcu5iMzqMyCLUfVzBUWtxZQ-HB_KdOU5eAUzyQ0VnRp80hNmQNaqCytCXn_yZlZXaQwndJR3Mf_sXHdhbjmMc-tGAyCm6_KXMF-CxEwxVjtOQgquaZVfwMeUO5y1dGrD6tKgrs05S2BtvZXoGNy62arR6XjSPDdRacH8zovFqsqja/s320/form.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">コードのフィールド名も変えます。</div><pre>Sub Initialize
Dim ss As New NotesSession
Dim form As NotesForm
Set form = ss.Currentdatabase.Getform("MainTopic")
msgbox form.Getfieldtype("MultiValueSubject")
End Sub</pre><div><br /></div>するとどうでしょう。<div>1280 ではなく 1 多い 1281 が返りました。<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hwE_EJIe_j98aHm2DwkXuMETNJngyg2BN1SWKBdITAWuTpvqJqJBLTEqFlqU-uAAQmM8PD8CcrrJiMhJhApQClJ04BBqmm_MPv02FmMrmsSA1KG_5Xw5M6zPLcXYNzX2aWdHppF4HWogBhkuYNMNGFz7LuCe_KwFNHh9e7vOJg8O7wIg0SLMXyt9/s370/msgbox%232.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="370" data-original-width="297" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hwE_EJIe_j98aHm2DwkXuMETNJngyg2BN1SWKBdITAWuTpvqJqJBLTEqFlqU-uAAQmM8PD8CcrrJiMhJhApQClJ04BBqmm_MPv02FmMrmsSA1KG_5Xw5M6zPLcXYNzX2aWdHppF4HWogBhkuYNMNGFz7LuCe_KwFNHh9e7vOJg8O7wIg0SLMXyt9/w161-h200/msgbox%232.png" width="161" /></a></div><div>※このコードは 12.0.1 FP1 で実行しています。</div><div><p><br /></p><p>ものは試しと、「テキスト」以外にも「数値」と「日付/時刻」のフィールドを2つずつ追加し、一方は「複数値も可」をチェック「無し」、他方を「有り」にしました。</p><p>すると、チェック「有り」のフィールドに対する戻り値は、「無し」のフィールドのそれより 1 多い値が返りました。</p><p></p><table style="height: 25px; text-align: center; width: 80%;"><tbody><tr><th>フィールドタイプ</th><th>単数値</th><th>複数値も可</th></tr><tr><td>テキスト</td><td>1280</td><td>1281</td></tr><tr><td>数値</td><td>768</td><td>769</td></tr><tr><td>日付/時刻</td><td>1024</td><td>1025</td></tr></tbody></table><br /><p></p></div><div>他にも、読者、作成者、名前の場合の戻り値は「複数値も可」の設定によらず同じであること、フォームではなく「フォームを使って作成した文書」から notesitem.type プロパティを確認すると、こちらは単数値と複数値で戻り値に差は無いことがわかりました。</div><div><br /></div><div>本件をメーカーサポートへ問い合わせたところ、既知の不具合 SPR#BHAS62D6CS として報告されているとのこと。対象のバージョンは 9.0.x から 12.0.x までと幅広い。</div><div><br /></div><div>また、次のリンクで新たに情報を公開したと教えていただきました。</div><div><br /></div><div><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0098934" target="_blank">The return value of "GetFieldType" method is incremented by 1 after enabling the field property "Allow multiple values".</a></div></div><div><br /></div><div>上のリンクにも記載がありますが、「テキスト、数値、日付/時刻」以外では「ダイアログリスト」でも、単数値が 1280 に対して「複数値も可」だと 1281 を返すとのこと。</div><div><br /></div><div>ちょっと厄介かなと思ったのはフィールドタイプを示す定数です。</div><div>例えば、フィールドタイプが「日付/時刻」を示す値 1024 は定数 DATETIMES で表わせますが、「複数値を可」にチェックを付けたフィールドは 1025 を返すため、この定数ではマッチしないのです。</div><div><br /></div><div>以上、 NotesForm.GetFieldType メソッドを使うときに思い出したい情報でしたので共有させていただきました。</div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-37180905794156418722022-06-10T18:36:00.004+09:002022-06-10T18:36:28.126+09:00TLS 証明書管理って何?<p>昨晩はのの会に参加しました。</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://connpass-tokyo.s3.amazonaws.com/thumbs/5f/d3/5fd312098a83adaf87c1eda1cc6be1d0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="233" data-original-width="659" height="233" src="https://connpass-tokyo.s3.amazonaws.com/thumbs/5f/d3/5fd312098a83adaf87c1eda1cc6be1d0.png" width="659" /></a></div><br />のの会は Notes/Domino のユーザーさんの中でも比較的ビギナー向けの内容も扱っています。ということで TLS 証明書を扱ったことが無いとか、これから扱うかもしれないユーザーさんに向けて、Domino バージョン 12.0 で新たに追加された TLS 証明書管理機能についてご紹介しました。<p></p><p><br /></p><p>のの会で使ったスライドを共有しました。参加できなかった方や復習されたい方はこちらからご確認ください。</p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" mozallowfullscreen="true" src="https://speakerdeck.com/player/aa4116060a264de7ba426229a0f63442" style="background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: 314px; margin: 0px; padding: 0px; width: 560px;" title="TLS 証明書管理って何?" webkitallowfullscreen="true"></iframe><p> </p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-3845115896043759882022-06-02T20:33:00.000+09:002022-06-02T20:33:42.546+09:00TLS 証明書を「手動」で設定する<p> HCL Domino 12.0 の証明書ストア(CertStore.nsf)と CertMgr タスクを使うことで TLS 証明書を簡単な操作で取得することができ、さらに TLS 証明書の自動更新もできるようになりました。</p><p>これまで当ブログでは証明書管理の自動化に注目してまいりましたが、実は「手動」で入手する証明書を証明書ストアで管理することにも対応しています。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhkhqUz1hSyLEByNQdrRmFFlWriPBD__hzIQVK3rbOYcaS5B92eOq6Ay9FpLbVeNfPNelojHlgra3AzEOUdtGUFVbfjC5vNmg93CjKY372A5FOGo5f4I64CG2lV98SxoMzvOg5fwCWBDEH7HRM92Vnfnz1jG2Rj8zXQBc6-skWy2-GBbPjhD6xxotr/s514/syudou.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="134" data-original-width="514" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhkhqUz1hSyLEByNQdrRmFFlWriPBD__hzIQVK3rbOYcaS5B92eOq6Ay9FpLbVeNfPNelojHlgra3AzEOUdtGUFVbfjC5vNmg93CjKY372A5FOGo5f4I64CG2lV98SxoMzvOg5fwCWBDEH7HRM92Vnfnz1jG2Rj8zXQBc6-skWy2-GBbPjhD6xxotr/s320/syudou.png" width="320" /></a></div><br /><p><br /></p><p>ところで、キーリングファイルによる証明書管理を行う場合、新たに TLS 証明書を取得してそれが使えるようになるまでの作業手順は次の技術文書に記載があります。</p><p><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0073765" target="_blank">Windows 環境で OpenSSL と KYRTool を利用してサードパーティの認証機関で署名された証明書を作成する</a></p><p></p>この技術文書の作業手順を大まかに書くと次のような感じになります。<br /><ol style="text-align: left;"><li>キーペアと CSR の作成</li><li>認証機関とのやりとり</li><li>キーリングファイルの作成、各種証明書の格納</li><li>ドミノディレクトリへキーリングファイル名の設定</li><li>HTTP タスクの再起動</li></ol><p>上の1と3の作業は OpenSSL(別途インストールが必要) や KYRTool といったツールを使用するコマンド操作です。また証明書を更新する都度、それを反映するために HTTP タスクを再起動する必要がありました。これまでがV11までの標準的な方法でした。</p><p>V12以降、TLS 証明書を証明書ストア(CertStore.nsf)を使い「手動」で管理する場合、ツールをコマンド操作することなく UI での操作が可能です。OpenSSL のインストールも不要です。また初回は HTTP タスクを再起動しますが、TLS 証明書文書の更新時は動的に TLS キャッシュを更新する機能が新たに導入されたため再起動は不要になりました。といった内容の技術文書もあります。</p><p></p><p><a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0095181" target="_blank">Domino 12 環境でサードパーティの認証機関で署名された証明書を作成する方法</a></p><p><br /></p><p>今回は、上の技術文書の手順10で作成した CSR を使い <a href="https://www.fujissl.jp/" target="_blank">FujiSSL</a> のWebページから証明書を申し込み、その後どのように証明書を取り込んだか、というお話です。</p><p><br /></p><p>実は当初 セコムトラストシステムズ社のテスト証明書を申し込もうとしていたのですが、扱っている証明書のタイプがOVとEVだけでDVは扱っていないことから諦めました。テスト証明書とは言えOVとEVの発行には会社の存在を確認できることが必要なので、個人では無理とのことでした。</p><p><br /></p><p>気をとりなおして FujiSSL.jp のトップページからお申込みサイトへ。ストアフロントというページにある文書・規約を読み「同意」して次へ進みます。</p><p>「商品選択」では「ドメイン認証」にある "FujiSSL" を選択、そしてあらかじめ証明書ストア(CertStore.nsf)に作成した TLS 証明書文書からコピーしたCSRを「CSR」へ貼り付け、次へ進みます。</p><p>「承認確認情報選択」では「DNS認証」を選択して次へ進みました。</p><p>「申請情報入力」へ名前や役職などもろもろ入力して次へ進みます。</p><p>「確認・お支払い」へクレジットカード情報を入力して注文を確定します。</p><p>申し込みはこれで完了です。</p><p><br /></p><p>申し込みの後すぐに DNS へ追加する TXT レコードの文字列がメールで届きました。「DNS認証」を選択した場合、ドメインを管理している DNS プロバイダへ TXT レコードを追加しなければなりません。</p><p>今回私が CSR 作成時に指定したFQDNは「daos.dominov12beta.work」でした。</p><p>TXT レコードはこの「daos.dominov12beta.work」に加え、サブドメイン(と表現されているのでちょっと分かりづらいのですが)無しの「dominov12beta.work」も追加しておく必要があるとのことで、2 つの TXT レコードを追加しました。</p><p>しばらく待っていると、zip 圧縮された証明書を添付したメールが届きました。下図は zip ファイルの内容です。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDlVt_BG8bJF8l1WsSKaovVscL-qVUQJekAs7QLSNWDlZu5QSxh1dbwmIG9Kavd-V7VCQKoQWmFGedWe0pWsnA-oAsd6ZOGdnuVAEfcH7TrDmfwhe-0s5jUqWzWkjwJBTfmTJLTg5gAKunkcTdXSQQnR3F4MVKH-St2fdl8Ejtb5ycHd1wErzoXkAL/s1280/certinzip.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="454" data-original-width="1280" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDlVt_BG8bJF8l1WsSKaovVscL-qVUQJekAs7QLSNWDlZu5QSxh1dbwmIG9Kavd-V7VCQKoQWmFGedWe0pWsnA-oAsd6ZOGdnuVAEfcH7TrDmfwhe-0s5jUqWzWkjwJBTfmTJLTg5gAKunkcTdXSQQnR3F4MVKH-St2fdl8Ejtb5ycHd1wErzoXkAL/w640-h229/certinzip.png" width="640" /></a></div><br /><p>証明書と一緒にzip圧縮されている ca-bundle.ca は中間証明書です。この中間証明書は、証明書ストア(CertStore.nsf)の「信頼するルート」ビューから追加しておきます。</p><p>中間証明書を追加するには「信頼するルートの追加」ボタンをクリックした後、テキストエディタ等で中間証明書の内容をクリップボードへコピーした上で「証明書の貼り付け」ボタンをクリックして「要求の送信」ボタンをクリックします。</p><p>このあと CertMgr タスクが処理を行うと信頼するルートのビューに追加されます。</p><p><br /></p><p>中間証明書を追加できたら、証明書(zipファイルにある、拡張子が .crt のファイルの内容)を貼り付けます。</p><p>証明書を貼り付けるには、CSRのコピー元である TLS 証明書文書を開き、テキストエディタ等で証明書(.crt ファイル)の内容をクリップボードへコピーした上で「証明書の貼り付け」ボタンをクリックして「要求の送信」ボタンをクリックします。</p><p>このあと CertMgr タスクが処理を行い、TLS 証明書文書のステータスが "発行" になれば証明書は完成です。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjcGkNli3p3X_Qpd0Fp16MfNYtAGMvtkG0tJc7T7YjXxmO-aiVfDKmEt1r8T9Pl0vYODVQmL_zaP3kL4lMy77mDu0ILyjv2DiCwkigwJfbz6Cv-vcLhXa0wbVgrJ7FtvGG_AuCfJvr_NrKs-ScSgNoa1y1ar4UqxWA4DcU_PcRhOB0sQIlKGx2mmDZ/s665/status_hakkou.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="307" data-original-width="665" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjcGkNli3p3X_Qpd0Fp16MfNYtAGMvtkG0tJc7T7YjXxmO-aiVfDKmEt1r8T9Pl0vYODVQmL_zaP3kL4lMy77mDu0ILyjv2DiCwkigwJfbz6Cv-vcLhXa0wbVgrJ7FtvGG_AuCfJvr_NrKs-ScSgNoa1y1ar4UqxWA4DcU_PcRhOB0sQIlKGx2mmDZ/s320/status_hakkou.png" width="320" /></a></div><br /><p>あとはドミノディレクトリで、キーリングファイル名の代わりにホスト名「daos.dominov12beta.work」を指定して http タスクを再起動すると、この証明書が有効になります。</p><p><br /></p><p>キーリングファイルで証明書を扱う場合、証明書を更新するたびに http タスクの再起動が必要です。</p><p>証明書ストアで TLS 証明書を管理する場合、更新した証明書が TLS キャッシュへ自動で反映されるため http タスクの再起動が不要になりました。</p><p>ますます便利になりますね。</p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-56971235875894428032022-05-15T11:37:00.008+09:002022-06-01T09:43:31.842+09:00CertMgr の Let's Encrypt を ZeroSSL に変えてみた<p> HCL Domino V12 の新機能「TLS証明書管理(CertMgrタスク+証明書ストア CertStore.nsf)は、Let's Encrypt を標準でサポートしています。</p><p><a href="https://help.hcltechsw.com/domino/12.0.0/ja/admin/secu_le_configuring_acme_accounts.html" target="_blank">オンラインヘルプ</a>によると、正式にはサポートされていないけれども、ACMEプロトコルをサポートする Let's Encrypt 以外の CA (認証局)に証明書を要求できるとのこと。</p><p>そこで ACME プロトコルに対応した CA である ZeroSSL に切り替えて証明書の取得が可能なのかどうか試してみました。</p><p><br /></p><p>Let's Encrypt は非営利団体ですが、ZeroSSL には Pricing Plan があり、Free(無償)での利用も可能です。Free プランでも 90日間有効な証明書の自動発行/更新に対応しています。</p><div class="separator" style="clear: both; text-align: center;"><span style="margin-left: 1em; margin-right: 1em;"><a href="https://zerossl.com/pricing/" target="_blank"><img alt="ZeroSSL Pricing Plan" border="0" data-original-height="1653" data-original-width="2015" height="526" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipcNU_BbUr5H0vd_4QTJTEZbplpKK2JrdEw9rZmzIfTmvoMf7vXelSvdmwB2sI_8L9PqYqoxD83rc4lh-H4Srlac_5e_KpKKp6kHgNGi-Va6N-ny-AI4Dc3x7jYG87KwpvyJJxSdidhgOV_ml3mlbvZXYeKUiiwB9GTRnCJg1tUOi0ZHfOcb2kHy3x/w640-h526/zerossl_pricingPlan.png" title="ZeroSSL Pricing Plan" width="640" /></a></span></div><br /><p>Free プランでは「<b>3</b> 90-Day Certificates」と記載されています。この「3」の部分が、他の有償プランでは「<b>∞</b>」となっており、Free プランでは取得できる証明書が 3 つまでに制限されているように見えます。まあテストするには問題ありません。</p><p>「テスト」と言えば、Let's Encrypt にはテスト用途の「ステージング」環境がありますが ZeroSSL にはそれがありません。</p><p><br /></p><p>まず最初に ZeroSSL のWebサイトの右上にある「Get Free SSL」をクリックして Free Account を作成します。作成が完了して「Get Started」ページが開いたら、サイドメニューから「Developer」をクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio0kHE0jjBfNtbGo0AClDrwpjKXRHehSNm3DpwND16aBIYeqvEWdkRxxEcdEeHilgRyHvRTUuEgzOrq74EDKamX6FtafJY0tl5aJ0RROFdClcMSOmO8yuzX9N_Q849nFR-3an20aKTNh1chbOXYTx51StgRpb7cvm2hhLnpzW9UWA7DvtUx7xv7QaX/s2070/zerossl_getstarted.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="845" data-original-width="2070" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio0kHE0jjBfNtbGo0AClDrwpjKXRHehSNm3DpwND16aBIYeqvEWdkRxxEcdEeHilgRyHvRTUuEgzOrq74EDKamX6FtafJY0tl5aJ0RROFdClcMSOmO8yuzX9N_Q849nFR-3an20aKTNh1chbOXYTx51StgRpb7cvm2hhLnpzW9UWA7DvtUx7xv7QaX/w640-h262/zerossl_getstarted.png" width="640" /></a></div><br /><p>「Developer」ページの下部にある「EAB Credentials for ACME Clients」で「Generate」をクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0jcrok3wqtJkaOFXvapT30PtbahxiZTXvOqda4Gx0z3Ke9TZOXXN3f5lIM7Ol_qXY-n2NOzrdS1GpLIZt7YLjNr00zw3ga3RVpIl_spSna_fclrPONW-HGUj-PTG8WdNiwLr7iWBwLp75kHjWdJwaD9gz6ctrC2qK1oUqy1rK-22u9KOa55zE6XX8/s1768/zerossl_GenerateEAB.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="368" data-original-width="1768" height="134" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0jcrok3wqtJkaOFXvapT30PtbahxiZTXvOqda4Gx0z3Ke9TZOXXN3f5lIM7Ol_qXY-n2NOzrdS1GpLIZt7YLjNr00zw3ga3RVpIl_spSna_fclrPONW-HGUj-PTG8WdNiwLr7iWBwLp75kHjWdJwaD9gz6ctrC2qK1oUqy1rK-22u9KOa55zE6XX8/w640-h134/zerossl_GenerateEAB.png" width="640" /></a></div><br /><p>すると「EAB KID」と「EAB HMAC Key」に文字列が表示されるので、これを控えておきます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK6JIqDI99CKGZyFPUMTZr5Skz40kBF0Rd6UzuRcsHEzlgTJQtrt_thumBHsi32nR4h8RmvN0lsjkLuj8XPeC6bBR5h8oU3M-zGgLX5k6tcsyobxpAXPwEggr3JNn2kRXb-NO1baPJVjOfatcIsS3Ty9Sf_wU96nnmsfc-aliAwU2K9uGrrJEvAWLt/s1001/zerossl_EABcredentials.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="986" data-original-width="1001" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK6JIqDI99CKGZyFPUMTZr5Skz40kBF0Rd6UzuRcsHEzlgTJQtrt_thumBHsi32nR4h8RmvN0lsjkLuj8XPeC6bBR5h8oU3M-zGgLX5k6tcsyobxpAXPwEggr3JNn2kRXb-NO1baPJVjOfatcIsS3Ty9Sf_wU96nnmsfc-aliAwU2K9uGrrJEvAWLt/s320/zerossl_EABcredentials.png" width="320" /></a></div><br /><p>次は Domino 側の設定です。</p><p>証明書ストア(CertStore.nsf)を開き、サイドメニューから「設定 - ACME アカウント」をクリックします。※証明書ストアは CertMgr タスクの初回起動時に自動作成されます。</p><p>ここで開くビューには、デフォルトでは LetsEncryptProduction と LetsEncryptStaging という2つの文書が表示されます。今回はここに ZeroSSL のために文書を追加するのでビュー上部にある「アカウントの追加」ボタンをクリックします。</p><p>「ACME アカウント」文書の項目は下図のように埋めました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkBQm46iP7ixIsqY3SGgvFMqQqN6k1GmtOYN8EygFchQG7gCHu6exjailVh1rJBSFqOhgTuvB7aYVOJ5MBIdSPyA6Zo_gGXwUi_usFa2rjttztSQIQPRwZVbFXTo38QdD13RgSdv3OV81fYXj9c0l0AgfU7PUJ0JKrlVHhpzu9K09hc7AQErWS9Gyt/s2055/certmgr_zerossl_acmeaccount.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1353" data-original-width="2055" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkBQm46iP7ixIsqY3SGgvFMqQqN6k1GmtOYN8EygFchQG7gCHu6exjailVh1rJBSFqOhgTuvB7aYVOJ5MBIdSPyA6Zo_gGXwUi_usFa2rjttztSQIQPRwZVbFXTo38QdD13RgSdv3OV81fYXj9c0l0AgfU7PUJ0JKrlVHhpzu9K09hc7AQErWS9Gyt/w640-h422/certmgr_zerossl_acmeaccount.png" width="640" /></a></div><br /><p>「ACME ディレクトリ URL」には<a href="https://zerossl.com/documentation/acme/" target="_blank">こちら</a>にある「ACME Server URL」の値をセットしました。</p><p>「E メールアドレス」は空欄のままでも TLS 証明書の要求は動作はするようで、空欄のままにすることによる影響の有無はよくわかりません。</p><p>「利用規約の了承」にあるチェックボックスにはチェックマークを付けておく必要があります。チェックマークが無いまま TLS 証明書を要求すると、ステータスに「エラー The terms of service MUST be agreed to (401) Unexpected HTTP Status when generating new ACME account」と記録されました。</p><p>また「外部アカウントバインディング」には先に控えておいた「EAB KID」と「EAB HMAC Key」の値をそれぞれセットしました。</p><p>ここまでで「ACME アカウント」文書を一旦保存して閉じます。</p><p><br /></p><p>次に証明書ストア(CertStore.nsf)のサイドメニューから「TLS 証明書 - ホスト名別」をクリックして、ビュー上部にある「TLS 証明書の追加」ボタンをクリックします。</p><p>「TLS 証明書」文書の項目は下図のように埋めました。</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9aqv90axHhKlvu7afbbprjdaJO82oAjiH1eIKP3DXLF7O10wJw8KJ-Zf0IjL_E4oxA6BiowuxpD77Mt8GfCb68aIrFb8WAVex1REwuYTtglMVfGCgJIapz9XF7jK_iVPYArIo2y_pQ66JkUdqGPwAJwediBof52WAJjaDz40gQjjfNSA5gfHtjhY0/s1579/certmgr_new_tlscertdoc%232.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1193" data-original-width="1579" height="484" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9aqv90axHhKlvu7afbbprjdaJO82oAjiH1eIKP3DXLF7O10wJw8KJ-Zf0IjL_E4oxA6BiowuxpD77Mt8GfCb68aIrFb8WAVex1REwuYTtglMVfGCgJIapz9XF7jK_iVPYArIo2y_pQ66JkUdqGPwAJwediBof52WAJjaDz40gQjjfNSA5gfHtjhY0/w640-h484/certmgr_new_tlscertdoc%232.png" width="640" /></a></p>「ホスト名」は、TLS 証明書の SAN へ設定する名前をタイプします。<div>(別のブログエントリに記載しているのでここでは説明を省略しますが、私の環境では上図で指定したホスト名で検索可能なDNSプロバイダの設定文書を証明書ストア内に作成済みです)<div>「ACME アカウント」には、上で作成した「ACME アカウント」文書の「アカウント名」へセットした名前「ZeroSSL」を選択します。これが ACME プロトコルに対応した CA の切り替えを意味します。ここで選択した「ACME アカウント」文書の設定を元に ZeroSSL へアクセスするようになります。<br /><p>この状態でフォーム上部にある「要求の送信」ボタンをクリックします。</p><p>CertMgr が処理を行い、証明書の取得が完了し、この「TLS 証明書」文書の1つ目のステータスが「発行」に変われば成功です。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaCDK2FnR7D8eagQ2HxdvZRwziXCCrRxpYuCnqDJd88ocst4YQOEyWk0GrZvWQ7W5UCD4VKRbcVKt2fcofsxblMfJS69cy899WqCsRG-dd3IfFt76eioeZnpdDqfBicRGMQ4w3ip2iQi0igtJ-ybZnGag0z6ZKM8gaZUNuuCFokKNXR1jdweHnT6CV/s984/certmgr_success_tlscertdoc.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="661" data-original-width="984" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaCDK2FnR7D8eagQ2HxdvZRwziXCCrRxpYuCnqDJd88ocst4YQOEyWk0GrZvWQ7W5UCD4VKRbcVKt2fcofsxblMfJS69cy899WqCsRG-dd3IfFt76eioeZnpdDqfBicRGMQ4w3ip2iQi0igtJ-ybZnGag0z6ZKM8gaZUNuuCFokKNXR1jdweHnT6CV/s320/certmgr_success_tlscertdoc.png" width="320" /></a></div><br /><p><br /></p><p>ところで上図の「TLS 証明書」には、「ステータス」欄が2つあります。</p><p>実は最初に実行したとき、2つ目のステータスに「警告 - Last cert in chain is NOT self signed - No root found」と表示されました。No root found とありますが、これは証明書ストア(CertStore.nsf)内に対応するルート証明書の登録が無い場合に表示されるようです。</p><p>取得できた証明書のルート証明書を調べるには、「TLS 証明書」文書を開いて、フォーム上部にある「証明書の調査」ボタンをクリックします。</p><p>表示される「Examine Internet Certificates」ウィンドウで「証明書の発行者」にあるリストの最後が「ルート」です。今回の証明書では、リストの最後が「CN=AAA Certificate Services/O=Comodo CA Limited/L=Salford/ST=Greater Manchester/C=GB」でした。</p><p>これをググると pem 形式でダウンロードできるWebサイトがヒットしました。ダウンロードした pem ファイルをテキストエディタで開くと、"-----BEGIN CERTIFICATE-----" で始まる文字列があります。</p><p>証明書ストアのサイドメニューで「設定 - 信頼するルート」をクリックしてビュー上部にある「信頼するルートの追加」ボタンをクリックすると「信頼するルート」の編集画面が開きます。一旦 pem ファイルに戻り、文字列全体をクリップボードへコピーした後、「信頼するルート」の編集画面に戻って「証明書の貼り付け」ボタンをクリックします。表示されるメッセージにOKをクリックして「要求の送信」ボタンをクリックします。この後 CertMgr が処理を行うと下図赤枠内のとおりルート証明書が追加できました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho6L7_g0b02Pgnvl2WGBvtIZFeyBlZwABCnxObERQ8TQFcKALz2Ztebnc3HVG4eBTvlcTTvOvkIgEyhu-OUugAMJT7G2PrxUnAQPIkjsC2Eiv9DCAFRSqzGP_gMnLJD1MtuYOzsgEorK_gTZ21ylyhyivVT1fTMnFbr5HQtupY2AQkWUsKYT_hl9w5/s2523/certmgr_trasted_root.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="826" data-original-width="2523" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho6L7_g0b02Pgnvl2WGBvtIZFeyBlZwABCnxObERQ8TQFcKALz2Ztebnc3HVG4eBTvlcTTvOvkIgEyhu-OUugAMJT7G2PrxUnAQPIkjsC2Eiv9DCAFRSqzGP_gMnLJD1MtuYOzsgEorK_gTZ21ylyhyivVT1fTMnFbr5HQtupY2AQkWUsKYT_hl9w5/w640-h210/certmgr_trasted_root.png" width="640" /></a></div><div><br /></div>この後、「TLS 証明書」文書を開いて再度「要求の送信」を行うことで、2つ目のステータス欄は CertMgr の処理後に「有効」に変わりました。</div><div><br /></div><div><br /></div><div>ちなみに、ZeroSSL のダッシュボードでは発行した証明書の数を確認することができるのですが「5」と表示される箇所と「0/3」と表示される箇所がありました。1つの「TLS 証明書」文書で何度も「要求の送信」を行ったせいか、Issued にある証明書の数は成功した「要求の送信」の回数「5」と同じ数になっていました。「要求の送信」の都度新たな証明書を発行するように見えます。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1kboi97E9S8_S5vZRYfLomYEcEW2DHBiawyBEFJzdie6j_vUFDBzaidJFNeZHoWvBMJoqPcivbOkD1JP4Ek4n0DL0q11L4AMvnVDSBJdyVEB5uqdhUYxUKa84BWe9bGXfoi_ki9g6gZGh2GPhZf92fhq88bYK9mUly4B9MJiJSDYb5eSBNP4QSwD8/s2179/zerossl_dashboard.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="556" data-original-width="2179" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1kboi97E9S8_S5vZRYfLomYEcEW2DHBiawyBEFJzdie6j_vUFDBzaidJFNeZHoWvBMJoqPcivbOkD1JP4Ek4n0DL0q11L4AMvnVDSBJdyVEB5uqdhUYxUKa84BWe9bGXfoi_ki9g6gZGh2GPhZf92fhq88bYK9mUly4B9MJiJSDYb5eSBNP4QSwD8/w640-h164/zerossl_dashboard.png" width="640" /></a></div><br /><div>Free プランでは証明書が 3 つに制限されているように思うのですが、ダッシュボード上は 5 となっています。5つともホスト名が同じだからかもしれませんが特にエラーが発生する訳でも無く問題ないかどうかは現状よくわかっていません。「0/3」と表示されている部分についても何を表しているのかよくわかっていません。いずれにしても、そのままにしておいて後でごたごたしても面倒なので、きちんと削除しておきたいと思っています。</div><div><br /></div></div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-11145630655655217242022-05-13T09:20:00.000+09:002022-05-13T09:20:00.725+09:00Named Document って何?<p>昨晩は <a href="https://notesknows.connpass.com/event/245273/" target="_blank">#のの会</a> に参加しました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://connpass-tokyo.s3.amazonaws.com/thumbs/43/e5/43e50d300757285fbfdcc0612f70ec60.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="237" data-original-width="660" height="237" src="https://connpass-tokyo.s3.amazonaws.com/thumbs/43/e5/43e50d300757285fbfdcc0612f70ec60.png" width="660" /></a></div><br /><p>第35回の「のの会」で<a href="https://speakerdeck.com/harunakano/purohuiruwen-shu-tutehe" target="_blank">プロフィール文書についてお話しました</a>が、今回はその続編として Named Document についてお話しました。</p><p>Named Document はプロフィール文書を機能的に置き換えるものです。</p><p>「名前付き文書」と翻訳していますが、この文書にはそれを呼び出すときに指定するキーとしての「名前」を指定して作成します。</p><p>作成する、と書きましたが、現状では NamedDocument 作成を想像できるCreateNamedDocument といったような名前のメソッドがありません。これはプロフィール文書と同様ですが、名前を指定して文書を呼び出す際、名前に一致する文書がなければ自動で作成する仕様になってます。</p><p>こういった内容を下のスライドにまとめました。</p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" mozallowfullscreen="true" src="https://speakerdeck.com/player/aaa4ea7d0a2749afa0bee3c442b18f85" style="background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: 314px; margin: 0px; padding: 0px; width: 560px;" title="Named Document って何?" webkitallowfullscreen="true"></iframe><p> </p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-32102770449608867252022-04-23T21:08:00.003+09:002022-05-11T10:49:44.040+09:00入れ子グループのループを見つける<p>ドミノディレクトリに登録するグループでは、そのメンバーに他のグループ名を指定することができます。</p><p>グループ文書のメンバー欄は他のテキストフィールドと同様に文字数制限があります。その制限を超えて多くのメンバー名を登録したい等の理由でグループから別のグループを参照する「グループの入れ子」を行うことがあります。</p><p>分かりづらいですが、次に例を示します。「Grp1」のメンバーに「Grp2」を指定しています。そして「Grp2」のメンバーに「Grp3」を指定、「Grp3」のメンバーに「Grp4」を指定...と続きます。</p><p>Grp1<br />└Grp2<br /> └Grp3<br /> └Grp4<br /> ├Grp2<br /> └Grp5<br /> └Grp6</p><p>入れ子のグループ自体は結構なのですが、気が付くと2つのグループが互いに参照しあって、参照のループを起こしていることがあります。</p><p>上の例では「Grp4」のメンバーに「Grp2」を指定していて、Grp2 から Grp4 の間で参照のループを起こしています。</p><p>私はこういった参照のループが運用上問題になることは最近はほとんど経験していません。が、新機能のベータ版で不具合を引き起こしたことがありました。</p><p>そんなときに参照のループをチェックするツールが欲しいな、ということで作ったコードがありますのでご紹介します。</p><p><br /></p><p></p><pre>Dim nab As NotesDatabase
Dim vw As NotesView
Dim groupsInThread% List
Dim loopGroups$ List
Sub Initialize
Dim ss As New NotesSession
Dim dc As NotesDocumentCollection
Dim currentGroup As NotesDocument
Dim searchFormula$
Set nab = New NotesDatabase( ss.Currentdatabase.Server, "names.nsf" )
Set vw = nab.Getview( "Groups" )
searchFormula = |Form="Group"|
If Not nab.Isopen Then Call nab.Open("", "")
Set dc = nab.Search( searchFormula, Nothing, 0 )
Set currentGroup = dc.Getfirstdocument()
While Not currentGroup Is Nothing
Call isLoop( currentGroup, 0 )
Erase groupsInThread
Set currentGroup = dc.Getnextdocument( currentGroup )
Wend
ForAll o In loopGroups
Print ListTag( o ), o
End ForAll
End Sub
Function isLoop( currentGroup As NotesDocument, nestLevel% ) As String
Dim childGroup As NotesDocument
Dim members, groupName$, loopingMember$
isLoop = ""
groupName = currentGroup.Getfirstitem( "ListName" ).Text
'Existing check for group name
If IsElement( loopGroups( groupName ) ) Then Exit Function
If IsElement( groupsInThread( groupName ) ) Then
loopGroups( groupName ) = ""
isLoop = groupName
Exit Function
Else
groupsInThread( groupName ) = False
End If
'Check group members
If "" = currentGroup.Getfirstitem( "Members" ).Text Then Exit Function
members = currentGroup.Getfirstitem( "Members" ).Values
ForAll member In members
If "cn=" <> LCase( Left( member, 3 ) ) Then
Set childGroup = vw.Getdocumentbykey( member, True )
If Not childGroup Is Nothing Then
loopingMember = isLoop( childGroup, nestLevel + 1 )
if "" <> loopingMember Then
If groupName <> loopingMember Then
isLoop = loopingMember
End If
If Not IsElement( loopGroups( member ) ) Then
loopGroups( member ) = loopingMember
End If
End If
End If
End If
End ForAll
Erase groupsInThread( groupName )
End Function</pre><p></p><p><br /></p><p>これをエージェントにして実行すると、参照のループが始まるグループ(上の例では Grp2)はそのグループ名だけ表示します。そして、参照のループの途中にあるグループ(Grp4)と参照のループの最後のグループ(Grp5)には、そのグループ名に加えて参照のループが始まるグループ名を一緒に表示します。</p><p>下図は私の環境でテストした結果です。print文の出力が Notes クライアントの通知ウィンドウ内に表示されています。参照のループが始まっているのは「Nested Group 05」と「Nested Group 15」です。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDkd5iIDx4Y4sK3Gr-bXfRf11NKuvgeJEl84Eg8ThmVQ-PohxkHH0aCCAcBIoffhyZXPaccGscTfYFJ_HQkvt4Azp2k44JGlx5xQ7L9lAIM-hDYkOEdwL26UrqbMi-pvXCCNlz_cLkOU2ULzi1zoXMzJ9ZjK_meKvBmuMqqa7WQDRQM-RBiUx2fIiE/s1047/groupnest.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1047" data-original-width="1014" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDkd5iIDx4Y4sK3Gr-bXfRf11NKuvgeJEl84Eg8ThmVQ-PohxkHH0aCCAcBIoffhyZXPaccGscTfYFJ_HQkvt4Azp2k44JGlx5xQ7L9lAIM-hDYkOEdwL26UrqbMi-pvXCCNlz_cLkOU2ULzi1zoXMzJ9ZjK_meKvBmuMqqa7WQDRQM-RBiUx2fIiE/s320/groupnest.png" width="310" /></a></div><br /><p>HCL Domino 12.0 に「Entitlement Scan」という機能があります。この機能でサーバー上にあるアプリケーションを定期的にスキャンするのですが、そのときグループに参照のループがあるとコンソールにメッセージ「Groups cannot be nested more than 100 levels deep.」を記録します。このメッセージにグループ名は記録されません(下図)。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFZ3984j1J2jz5N1Lvi0M1ELPyOkhqBCFeEJbdBlg_NSab-m2IDXgMnBwVHkhMQVlNOOaB2Y1bd-qvSjiOTEPseQ9kcNScwp0hCKlbVRdQmTeX3ljM_0jeogVbZCIZoxVGczafSUwWpAhY4zVxwEol2JwGoZnPqYlswNzNIJbvFPKGC5aZlDHD1KxM/s3145/es_groupnested.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1251" data-original-width="3145" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFZ3984j1J2jz5N1Lvi0M1ELPyOkhqBCFeEJbdBlg_NSab-m2IDXgMnBwVHkhMQVlNOOaB2Y1bd-qvSjiOTEPseQ9kcNScwp0hCKlbVRdQmTeX3ljM_0jeogVbZCIZoxVGczafSUwWpAhY4zVxwEol2JwGoZnPqYlswNzNIJbvFPKGC5aZlDHD1KxM/w640-h254/es_groupnested.png" width="640" /></a></div><br /><p>このメッセージが表示される場合、上のようなコードを使って参照のループを調べてみてはいかがでしょうか。</p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-39322590696518121672022-04-19T15:01:00.190+09:002022-04-20T16:22:34.738+09:00AWS を API リクエストで操作したい?できますよ!ノーツならね。私はこれまで AWS マネジメントコンソールや AWS CLI (以下、CLI と呼びます)を使って Route53 等の <a href="http://aws.amazon.com/" target="_blank">AWS</a> のサービスを<a href="https://harunakano.blogspot.com/2021/07/aws-cli-tls.html" target="_blank">操作していました</a>。<div><br /></div><div>CLI は比較的簡単に操作できるのでコマンドプロンプトや PowerShell から操作する場合にはお勧めではあるのですが、LotusScript から AWS CLI を使う場合、<div><ul style="text-align: left;"><li>予めプラットフォーム(OS)に CLI のインストールが必要</li><li>ディレクトリの操作などでプラットフォーム(OS)の違いを気にしなければならないことがある</li><li>コマンドのレスポンスが直接 LotusScript に返らない</li><li>コマンドのレスポンスを取得するためファイルへリダイレクトした場合にファイルから結果を得られるようになるまでにタイムラグがあり、数秒の待ち時間を挿入しなければならない場合がある</li></ul></div><div>といったような場面に遭遇することがあり扱いづらさを感じています。</div><div><br /></div><div>そこで、Notes/Domino V10 で追加されている NotesHTTPRequest クラスを使って AWS のサービスを操作できないかと試行錯誤していたのですが、ようやく動くものができましたのでここに記録しておきます。</div><div><br /></div><div>CLI の代わりに LotusScript でリクエストを送信できるようになったことで、プラットフォームの違いを気にしなくて良くなったし、コマンドに対するレスポンスを直接受け取れるようになったことで、これまでのようにリダイレクトで作成されるファイルを待つ時間もなくなりました。</div><div><br /></div><div>AWS へリクエストを送信するために、必要なクエリーパラメータを URL へ追加したり、リクエストヘッダーにセットするための署名を作ったりしなければなりません。</div><div><br /></div><div>クエリーパラメータは AWS のサービスごとに用意されている API Reference ページにまとまっているようでした。例えば EC2 なら <a href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Operations.html" target="_blank">こちら</a> です。</div><div><br /></div><div>クエリーパラメータの指定はまだ単純なのですが、面倒だったのは署名作成がらみのタスクです。タスク(署名の作り方)については、次の4つのリンクに説明がありました。</div><div><br /></div><div><div><a href="https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4-create-canonical-request.html" target="_blank">タスク 1: 署名バージョン 4 の正規リクエストを作成する</a></div><div><a href="https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4-create-string-to-sign.html" target="_blank">タスク 2: 署名バージョン 4 の署名文字列を作成する</a></div><div><a href="https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4-calculate-signature.html" target="_blank">タスク 3: AWS 署名バージョン 4 の署名を計算する</a></div><div><a href="https://docs.aws.amazon.com/ja_jp/general/latest/gr/sigv4-add-signature-to-request.html" target="_blank">タスク 4: HTTP リクエストに署名を追加する</a></div></div><div><br /></div><div>パラメータ名でソートしなきゃならなかったり、文字列を小文字に変換したり、改行を挿入する/しないの違いがあったりといったように、レスポンスがエラーで返ったはいいけどプロセスが多すぎて間違いを発見しづらく、非常に神経使いました。もうへとへとです。</div><div><br /></div><div>上の説明に従い AWS へ API リクエストを送るまでが下のコードです。下のコードでは AWS の CloudFormation というサービスで ListStacks というアクションを実行しています。このコードを参考にして AWS の(CloudFormation 以外の)サービスを使いたいときに書き換えが発生する部分はそれほど多くない(きちんと確認したわけではありませんが Const で始まる定数で定義している箇所と2つの変数 CanonicalQueryString と CanonicalHeaders あたりと、req.Get メソッド前後あたり?)と思います。</div><div>なおハッシュ値を求める箇所は Java のスクリプトライブラリ(このコードも下部に記載)で対応しましたので『「ほぼ」 LotusScriptで操作』ということになりますがご勘弁ください。</div><div><br /></div><div><br /></div><div>LotusScript のエージェント「ListStacks」</div><div><pre>UseLSX "*javacon"
Use "SignatureAndHash"
Const regionName = "us-east-1" '米国東部(バージニア北部)
Const serviceName = "cloudformation"
Const serviceEndPoint = "cloudformation.us-east-1.amazonaws.com"
Const Algorithm$ = "AWS4-HMAC-SHA256"
Const accesskeyid$ = "SAMPLEACCESSKEYID"
Const secretaccesskey$ = "SAMPLEACCESSKEY"
Sub Initialize
Dim js As New javasession
Dim jc As JavaClass
Dim jo As JavaObject
Dim ss As New NotesSession
Dim req As NotesHTTPRequest
Dim nav As NotesJSONNavigator
Dim ndt As New NotesDateTime( Now )
Dim HashedCanonicalRequest$, HTTPRequestMethod$, CanonicalURI$
Dim CanonicalQueryString$, SignedHeaders$, RequestPayload$, payload$
Dim CanonicalHeaders$ List, CanonicalHeadersString$
Dim CanonicalRequest$, ISO8601Time$, gmtDate$
Dim StringToSign$, RequestDateTime$, CredentialScope$
Dim signature$, authheaderValue$
Dim headers, ret, gmtTime
Set jc = js.Getclass("signatureandhash")
Set jo = jc.Createobject
gmtTime = Split( ndt.Gmttime, " " )
gmtDate = Join( Split( gmttime(0), "/" ), "" )
ISO8601Time = gmtDate & "T" & Join( Split( gmttime(1), ":" ), "" ) & "Z"
'-------------------
'1. 署名バージョン 4 の正規リクエストを作成する
'-------------------
'リクエストメソッド
HTTPRequestMethod = "GET"
'正規URIパラメータ
CanonicalURI = "/"
'正規クエリ文字列(パラメータ名は文字コードでソート)
CanonicalQueryString = _
"Action=ListStacks" &_
"&StackStatusFilter.member.1=CREATE_IN_PROGRESS" &_
"&StackStatusFilter.member.2=DELETE_COMPLETE" &_
"&Version=2010-05-15"
'正規ヘッダー(ヘッダーは文字コードでソート)
CanonicalHeaders( "Content-Type" ) = "application/x-www-form-urlencoded; charset=utf-8"
CanonicalHeaders( "Host" ) = serviceEndPoint
CanonicalHeaders( "X-Amz-Date" ) = ISO8601Time
'署名付きヘッダー(小文字化、重複するスペースと前後のスペースを除去)
CanonicalHeadersString = ""
ForAll o In CanonicalHeaders
CanonicalHeadersString = CanonicalHeadersString & _
LCase$( FullTrim( ListTag( o ) ) ) & ":" & FullTrim( o ) & |
|
If SignedHeaders <> "" Then
SignedHeaders = SignedHeaders & ";" & LCase( FullTrim( ListTag( o ) ) )
Else
SignedHeaders = LCase( FullTrim( ListTag( o ) ) )
End If
End ForAll
'ペイロードのハッシュ値をとる
payload = ""
RequestPayload = jo.getHashedString( payload )
'正規リクエストの作成
CanonicalRequest = _
HTTPRequestMethod & |
| & CanonicalURI & |
| & CanonicalQueryString & |
| & CanonicalHeadersString & |
| & SignedHeaders & |
| & RequestPayload
'正規リクエストのハッシュ値をとる
HashedCanonicalRequest = jo.getHashedString( CanonicalRequest )
'-------------------
'2. 署名バージョン 4 の署名文字列を作成する
'-------------------
CredentialScope = _
gmtDate & "/" & regionName & "/" & serviceName & "/aws4_request"
StringToSign = _
Algorithm & |
| & ISO8601Time & |
| & CredentialScope & |
| & HashedCanonicalRequest
'-------------------
'3. 署名バージョン 4 の署名を計算する
'-------------------
'署名キーを取得して署名を計算する
signature = jo.getHashedSignature(secretaccesskey, gmtDate, regionName, serviceName, StringToSign)
'-------------------
'4. HTTP リクエストに署名を追加する
'-------------------
Set req = ss.Createhttprequest()
req.Preferjsonnavigator = True
'リクエストヘッダーをセット
ForAll o In CanonicalHeaders
req.Setheaderfield ListTag(o), o
End ForAll
'リクエストヘッダーへ署名をセット
authheaderValue = _
Algorithm &_
" Credential=" & accesskeyid & "/" & CredentialScope &_
", SignedHeaders=" & SignedHeaders &_
", Signature=" & signature
req.Setheaderfield "Authorization", authheaderValue
'リクエストを送信
Set nav = req.Get( "https://" & serviceEndPoint & CanonicalURI & "?" & CanonicalQueryString )
'リクエストの結果
If 0 = InStr(req.Responsecode, "200") Then
Print "失敗しました。 return code = " & req.Responsecode
Exit sub
End If
Print nav.Stringify()
headers = req.Getresponseheaders()
If IsArray( headers ) Then
ForAll header In headers
Print header
End ForAll
End If
Exit Sub
ERRORTRAP:
Print Erl, Err, Error
Exit sub
End Sub</pre></div><div><br /></div><div>Java の スクリプトライブラリ「SignatureAndHash」</div><div><pre>import java.math.BigInteger;
import java.security.MessageDigest;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class signatureandhash {
static byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm="HmacSHA256";
final SecretKeySpec keySpec = new SecretKeySpec(key, algorithm);
final Mac mac = Mac.getInstance(algorithm);
mac.init(keySpec);
return mac.doFinal(data.getBytes("UTF-8"));
}
static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception {
byte[] kSecret = ("AWS4" + key).getBytes("UTF-8");
byte[] kDate = HmacSHA256(dateStamp, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256("aws4_request", kService);
return kSigning;
}
public static String getHashedSignature(String key, String dateStamp, String regionName, String serviceName, String stringToSign) throws Exception {
String signature = "";
byte[] signatureKey = getSignatureKey(key, dateStamp, regionName, serviceName);
byte[] signatureByte = HmacSHA256(stringToSign, signatureKey);
BigInteger bi = new BigInteger(1, signatureByte);
signature = String.format("%0" + (signatureByte.length << 1) + "x", bi);
return signature;
}
public static String getHashedString( String orgString ) throws Exception {
String hashedStr = "";
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(orgString.getBytes());
byte[] cipher_byte = md.digest();
StringBuilder sb = new StringBuilder(2 * cipher_byte.length);
for(byte b: cipher_byte) {
sb.append(String.format("%02x", b&0xff) );
}
hashedStr = sb.toString();
return hashedStr;
}
}</pre></div><div><br /></div></div><div>私が試したサービスでは AWS へのリクエストの結果が JSON で返ってきました。エラーも JSON で返りました。ただ、別のサービスではひょっとすると XML を返すかもしれず、その場合は req.Get の行で「型が違う」といったエラーになるように思います。req.Get でエラーになる場合は req.Preferjsonnavigator に False をセットした上で 「set nav = req.Get...」を「ret = req.Get...」に書き換え、 nav.stringfy() のかわりに ret を出力すれば対応できそうです。</div><div><br /></div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-82360134030151683702022-04-08T12:12:00.000+09:002022-04-08T12:12:12.973+09:00画面の幅と高さを知るには<p>多くの Notes アプリケーションは Nomad Mobile というアプリを使うことで iPhone, iPad, Android でも設計変更することなしに利用することができます。</p><p>ただスマートフォンを縦にして使う場合には、画面の幅が狭いことからフォームやビューの右側が隠れてしまうこともあります。(縦スクロールに比べて横スクロールは意外と面倒)</p><p>ビューやフォームを開くときに画面のサイズが分かれば、スマートフォンでは必要のない箇所(フォーム上の項目やビューの列、アクションボタンなど)を非表示に設定することができそうです。</p><p>Notes のバージョン 12 では、画面サイズを返す関数が新たに追加されました。</p><p>まずは下のスクリーンショットをご覧ください。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkPDTGu37U0SZ8BiOPtbhjeW3NP-9BFiFXiO_HJa_42u74V9LrOubIFKTmvQ5XCyi9kMovPtO7QhHrwCymhY9lCM2h_Q09HpOqhg0dgACqRau8m0gZKg2WZuCb4a5Nn8aYdlShr2Gzg6OP9mYjrT7TIuCaZAvg86wrimGBuPC5RPGzGuyYKSSqBbT9/s1280/V12.Resolution.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkPDTGu37U0SZ8BiOPtbhjeW3NP-9BFiFXiO_HJa_42u74V9LrOubIFKTmvQ5XCyi9kMovPtO7QhHrwCymhY9lCM2h_Q09HpOqhg0dgACqRau8m0gZKg2WZuCb4a5Nn8aYdlShr2Gzg6OP9mYjrT7TIuCaZAvg86wrimGBuPC5RPGzGuyYKSSqBbT9/w640-h360/V12.Resolution.gif" width="640" /></a></div><br /><p>上は バージョン 12 の Notes クライアントを使い、フォームに設定した新しい関数を試している様子です。「ピクセル」の値がウィンドウサイズにあわせて変化すると同時にアクションボタンが見え隠れします。</p><p>このスクショは Twitter で紹介したものです。</p><p><br /></p><blockquote class="twitter-tweet"><p dir="ltr" lang="ja">Notes V12 画面サイズの変化でフォーム上のアクションボタンの表示を制御する様子です<a href="https://twitter.com/hashtag/dominoforever?src=hash&ref_src=twsrc%5Etfw">#dominoforever</a> <a href="https://t.co/zKybX7cHy0">pic.twitter.com/zKybX7cHy0</a></p>— Haruyuki Nakano (@harunakano) <a href="https://twitter.com/harunakano/status/1400057730287636488?ref_src=twsrc%5Etfw">June 2, 2021</a></blockquote> <script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script><p><br /></p><p>このフォームには、画面の幅を取得する @ResolutionWidth と、画面の高さを取得する @ResolutionHeight の2つの関数を設定したフィールドがあります。この関数は、実行した時点のサイズ値を返すだけなので、これだけではスクショにあるように動的に値を変化させることはできません。</p><p>スマホの画面の向きを変えたり、Windowsアプリの端をドラッグしたりしてアプリの画面サイズが変化するタイミングで値を更新するためには、画面サイズが変わったことを検知するイベントが必要になります。そのイベントが、フォームやビューに新たに追加された OnSize イベントです。このイベントへ RelayoutWindow @Command というこれも新たに追加されたコマンドを式に設定することで、上のスクショにあるような動的に画面サイズの数値が変化したりアクションボタンやビューにある列の表示/非表示を切り替える仕組みを実装することができます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ODhT93sFWN5S4Zgq1XtyuidcnIUAowgTetoBVujOqYlfr1Ga8woLF8pKKddaHwVCMDWdlZSGbZkn_sdwmn77D3vZB3pmwR2UBkkEqA1uACd1UoT3J3WM4n4Hk_4rV9PU-_RwZyAsqT2Wd64I_pVoIyNZDn3Bsf2Pnlyxmr75zdwqqnUBwIuR4mJy/s1526/event_onsize.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="329" data-original-width="1526" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ODhT93sFWN5S4Zgq1XtyuidcnIUAowgTetoBVujOqYlfr1Ga8woLF8pKKddaHwVCMDWdlZSGbZkn_sdwmn77D3vZB3pmwR2UBkkEqA1uACd1UoT3J3WM4n4Hk_4rV9PU-_RwZyAsqT2Wd64I_pVoIyNZDn3Bsf2Pnlyxmr75zdwqqnUBwIuR4mJy/w640-h138/event_onsize.png" width="640" /></a></div><div><br /></div><br /><span><a name='more'></a></span><p>昨晩の「のの会」では予定していた2つの話題が早くにおわり、その後に相談会(雑談)がありました。私が画面に表示していたフォームの設計から Onsize イベントを見つけた方がおり、バージョン12の新機能で画面サイズが取得できるようになったんですよーという話の流れから別の参加者が、これから Notes/Domino のバージョンアップを考えているけどバージョン12かなあ新しい機能も知りたい、みたいに切り出してくださいました。また別の参加者からは、TLS証明書管理やバックアップといった目玉機能を使おうにもメーカーの資料が充実してない、とも。それじゃあ次回以降は新機能を紹介しましょうかねーと私が発言しました(内容は未定)。のの会では参加者の興味本位でのご相談(雑談)を歓迎しています。もしご興味あれば参加してみてはいかがでしょうか。</p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-10055555912340564502022-03-19T01:04:00.010+09:002022-04-19T17:47:12.614+09:00NotesQueryResultsProcessor で「最寄り」を得るには<p>HCL Nomad Mobile では、LotusScript を使用してスマートフォンのGPSセンサーから現在地の緯度経度などの情報を得ることができます。→<a href="https://harunakano.blogspot.com/2020/06/hcl-nomad-gps-tools.html" target="_blank">参考</a></p><p>以前からこの機能を何かノーツで活用できるものは無いかと思案していました。</p><p>例えば「都内駐車場」というノーツアプリケーションがあったとします。ここに保存されている緯度経度と現在地の緯度経度から距離を算出して最寄りの駐車場を返す機能を考えてみます。</p><p>現在地の緯度経度の値は変化するので、現在地からの距離も当然のことながら変わります。</p><p>現在の時刻や現在地の緯度経度といったような「都度変化する値」をビューの選択式や列式へ埋め込んでおくことは、ビュー索引のメンテナンスのコストを考えると「通常」やりません。機能を呼び出すたびにすべての文書(またはビューエントリ)を読み込んで現在地の緯度経度の値とともに距離を求める式に値をあてはめて計算する、といった手法をとるように思います。このときすべての文書(またはビューエントリ)の数が少なければ全件読み込んでも構いませんが、都内駐車場の数のように万を超えてくると話はかわります。</p><p>さらに距離が最も近いものを返すには、算出した値のソートも必要です。ビューでソートするには算出した距離を列にセットする必要があります。</p><p><br /></p><p>さて、Notes/Domino バージョン 12 の LotusScript と Java に、NotesQueryResultsProcessor クラス(長いので以降 "QRP" と呼びます)が加わりました。</p><p>QRP はアプリケーションから取得した文書セットを計算・ソートし、その結果をビューや JSON へ出力することが可能です。</p><p>JSON出力ならばビューのメンテナンスコストの心配は不要ですし、仮にビューへ出力したとしても、そのビューは短期間(デフォルトで24時間)で削除される仕様のため、「通常」ならやらない「都度変化する値」も扱いやすいのが特徴のひとつと思います。</p><p>2022年3月のテクてくLotus技術者夜会で QRP を紹介したときのスライドを共有します。</p><iframe allowfullscreen="true" class="speakerdeck-iframe" data-ratio="1.78343949044586" frameborder="0" mozallowfullscreen="true" src="https://speakerdeck.com/player/d15995c8d4834452ac76e1702dcd053f" style="background: padding-box padding-box rgba(0, 0, 0, 0.1); border-radius: 6px; border: 0px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; height: 314px; margin: 0px; padding: 0px; width: 560px;" title="NotesQueryResultsProcessor クラス" webkitallowfullscreen="true"></iframe><p><br /></p><p>それから、今回は都内駐車場ではなく県庁所在地ですが、最寄りの所在地を返す LotusScript のサンプルを共有します。</p><p>このコードがあるアプリケーションには都道府県ごとの文書(データ)があり、それぞれの文書には県庁所在地の緯度と経度が lat と lng というフィールド名で保存されています。コードの Initialize にある getNearestTopX の引数に現在地の緯度と経度(コードでは固定値をセットしています)を渡すと、現在地からの距離が最も近い県庁所在地から順に配列要素の数だけ返します。</p><table style="background-color: black; color: white;"><tbody><tr><td><pre>> <span style="color: #fcff01;">tell amgr run "latlngdata.nsf" 'NearestTop3'</span>
[2760:0009-8360] 2022/03/20 09:39:58 AMgr: Start executing agent 'NearestTop3' in 'latlngdata.nsf'
[2760:0009-8360] 2022/03/20 09:39:59 ビューの再構築 - コンテナまたは索引がありません。 (読み込み C:\IBM\Domino\data\latlngdata.nsf ビュー 文書 '(distance)')
[2760:0009-8360] 2022/03/20 09:39:59 Agent Manager: Agent printing: <span style="background-color: #45818e;">No1: 栃木県</span>
[2760:0009-8360] 2022/03/20 09:39:59 Agent Manager: Agent printing: <span style="background-color: #45818e;">No2: 埼玉県</span>
[2760:0009-8360] 2022/03/20 09:39:59 Agent Manager: Agent printing: <span style="background-color: #45818e;">No3: 東京都</span>
[2760:0009-8360] 2022/03/20 09:39:59 AMgr: Agent 'NearestTop3' in 'latlngdata.nsf' completed execution</pre></td></tr></tbody></table><p>サンプルには JSON とビューの2つのパターンを用意しました。上のコンソールコマンドはビューのほうを実行したときの結果ですが、下に示すサンプルでは getTopXFromView の呼び出しをコメントアウトしてますので、必要に応じて getTopXFromJson のほうをコメントアウトして getTopXFromView の呼び出しを有効にしてください。</p><p>qrp の ExecuteToなんとかメソッドのパフォーマンスはいずれ検証したいとは思っていますが現状では未確認です。ここでは qrp を使ったコードのサンプルのひとつとしてご覧いただければと思います。</p>
<pre>Option Public
Option Declare
Sub Initialize
Dim lat!, lng!
Dim no1$, no2$, no3$
Dim topX(1 To 3) As String
Dim counter%
lat! = 36.2929247 '緯度
lng! = 139.6049848 '経度
<span>
</span><span> </span>Call getNearestTopX( lat, lng, topX ) '緯度, 経度, 最寄り
ForAll o In topX
counter = counter + 1
Print "No" & counter ": " & o
End ForAll
End Sub</pre><pre>Sub getNearestTopX( lat!, lng!, topX As Variant )
</pre><pre> Dim ss As New NotesSession
Dim db As NotesDatabase
Dim dql As NotesDominoQuery
Dim qrp As NOTESQUERYRESULTSPROCESSOR
Dim col As NotesDocumentCollection
Dim query$, formula$
Const viewname$ = "distance"
Set db = ss.Currentdatabase
Set qrp = db.Createqueryresultsprocessor()
Set dql = db.Createdominoquery()
query = |@All|
Set col = dql.Execute( query )
Call qrp.Addcollection( col, "allDocs")
<pre> '2地点間の距離を算出する式
formula = |@Sqrt(@Power((| & CStr(lat!) & | - lat) / 0.0111; 2) + @Power((| & CStr(lng!) & | - lng) / 0.0091; 2))|
Call qrp.Addcolumn( viewname, "", formula, SORT_ASCENDING, False, False ) '距離を昇順にソート
<span> </span> Call qrp.Addcolumn( "pref", "", "", SORT_UNORDERED, False, False ) '都道府県名</pre>
'Call getTopXFromView( db, viewname, qrp, topX ) '結果ビューを使用するパターン
Call getTopXFromJson( qrp, topX ) 'JSONを使用するパターン
End Sub
Sub getTopXFromView( db As NotesDatabase, viewname$, qrp As NOTESQUERYRESULTSPROCESSOR, topX As Variant )
Dim view As NotesView
Dim nav As NotesViewNavigator
Dim ent As NotesViewEntry
Dim i%
Set view = db.Getview( "(" & viewname & ")" )
If Not view Is Nothing Then Call view.Remove() '結果ビューが残っていたら削除する
Set view = qrp.Executetoview( viewname ) '結果ビューの生成、デフォルトでは24時間で削除される
Set nav = view.Createviewnav()
Set ent = nav.Getfirst()
For i = 1 To UBound( topX )
topX( i ) = ent.Columnvalues( 1 ) '2列目(都道府県名)
Set ent = nav.Getnext(ent)
Next
End Sub
Sub getTopXFromJson( qrp As NOTESQUERYRESULTSPROCESSOR, topX As Variant )
Dim nav As NotesJSONNavigator
Dim elm As NotesJSONElement
Dim i%
Dim pointer$
Set nav = qrp.ExecuteToJson() 'JSONナビゲータオブジェクトの生成
For i = 1 To UBound( topX )
pointer = |/StreamResults/| & i - 1 & |/pref|
Set elm = nav.Getelementbypointer( pointer )
topX( i ) = elm.Value
Next
End Sub</pre>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-87128225168278456432022-03-13T01:19:00.002+09:002022-03-13T08:40:25.214+09:00どのサーバーにあるデータベース?<p>フィールドの種類を「ダイアログリスト」にしてプロパティボックスの「制御」タブにある「選択」で "[ビュー] ダイアログから選択" を選ぶと、データベースのリストが表示されます(下図)。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhNX1tmBN0jTBG5Xwgvk1lszAMJ7-TWVCRkenUZzwpnEuc3y4BiAhHQwBWotrroOmBzf0plq2jMgT_zBJDkxm4Gr2U0xhc_t4GfF1EcU3nRv83Gb7iO7V2_9-_X_T299-M3KF1ZBIGPIFiFYBbBhRFfWHmQBQ76oG0BcF-bfXZFZ6G3hRcc2aT1TF1W=s1194" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1152" data-original-width="1194" height="309" src="https://blogger.googleusercontent.com/img/a/AVvXsEhNX1tmBN0jTBG5Xwgvk1lszAMJ7-TWVCRkenUZzwpnEuc3y4BiAhHQwBWotrroOmBzf0plq2jMgT_zBJDkxm4Gr2U0xhc_t4GfF1EcU3nRv83Gb7iO7V2_9-_X_T299-M3KF1ZBIGPIFiFYBbBhRFfWHmQBQ76oG0BcF-bfXZFZ6G3hRcc2aT1TF1W=s320" width="320" /></a></div><br /><p>このデータベースのリストは開発者のノーツのワークスペースにあるデータベースがリストされている(と思っている)のですが、ワークスペースにレプリカが複数あるデータベースは、このリストにも複数表示されます。上の図では、リストに4つの Monitoring Configuration が並んでいいますが、このリストにはサーバー名は表示されません。</p><p>これではサーバーにあるデータベースをリストから選びたかったのに、実際はローカルのものを選んでいた、なんてこともあるように思います。まあどれを選んでもノーツ君がうまいことアクセス可能なデータベースに自動で切り替えてくれるんじゃないか、と期待してますが、なんだかモヤモヤします。</p><p>私はこのモヤモヤを解消するために、次のようなコードを使ってフォームの設計をファイルへ書き出し、選んだデータベースがどこにあるものなのかを調べることがあります。</p><pre>Sub Initialize
Dim ss As New NotesSession
Dim stream As NotesStream
Dim nc As NotesNoteCollection
Dim exporter As NotesDXLExporter
Dim filename As String
filename = "c:\temp\exportform.txt"
'ファイルの関連付け
Set stream = ss.Createstream()
If Not stream.open( filename ) Then Exit Sub
Call stream.Truncate()
'出力するノートの選択
Set nc = ss.Currentdatabase.Createnotecollection(False)
nc.Selectforms = True
Call nc.Buildcollection()
'DXLの出力
Set exporter = ss.Createdxlexporter(nc, stream)
Call exporter.Process()
End Sub</pre><p>下は、書き出したファイル(DXL形式)をフィールド名で検索し、field タグの内容を抽出したものです。</p><p></p><blockquote><p><field choicesdialog='view' <span style="background-color: #fcff01;">viewdatabase='CN=xps13/O=v10!!MealReservation'</span> view='Menu' viewcolumn='1' lookupeachchar='false' lookupaddressonrefresh='false' type='keyword' kind='editable' name='categories'><keywords columns='1' ui='dialoglist'/></field></p></blockquote><p></p><p>黄色の背景色を付けた箇所に "CN=xps13/O=v10" とありますが、これがサーバー名です。ローカルにあるデータベースを選んでいた場合はこの部分が次のようになります。</p><blockquote><p>viewdatabase='MealReservation'</p></blockquote><p>ローカルの場合はサーバー名とそのすぐ右側にあった「!!」がありません。</p><p>もっとスマートに調べる方法をご存知でしたら教えてくださると嬉しいです。</p><p><br /></p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-80800878375377112702022-03-03T19:00:00.002+09:002022-03-03T19:02:07.225+09:00MicroCA からのTLS証明書の取得<p>Domino 12.0.1 の証明書ストア(CertStore.nsf)では、認証機関 としてローカルの MicroCA を指定できるようになりました。</p><p>これは自前の証明書発行機関、いわゆる「オレオレ認証局」になります。</p><p>仮にブラウザから MicroCA で発行したTLS証明書を使っている Domino サーバーへアクセスすると、ブラウザは「信頼された証明機関から発行された証明書ではない」と警告を表示します。</p><p>そういった訳で MicroCA はテスト用途で利用できるもの、と理解しています。</p><p>MicroCA のポイントは、DNS プロバイダとか外部からの HTTP アクセスといったものを気にすることなく証明書を作成できることです。</p><p>ちなみに Domino 12.0.1 では One-Touch セットアップも機能拡張され、この MicroCA を CertMgr が使えるようセットアップすることで、セットアップが完了した時点でそのサーバー用の TLS証明書 が作成された状態になっていました。ただしサーバー文書等の設定は別途変更する必要がありました。</p><p><br /></p><p>さて、今回は One-Touch セットアップではなく手動でセットアップした Domino に CertMgr タスクを起動して証明書ストア(CertStore.nsf)を作成した状態から MicroCA を使えるようにします。</p><p><br /></p><p>証明書ストアを開いて、ナビゲーションから「設定 - 認証機関」とクリックして[アカウント追加]ボタンをクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgtlNgqOEgdX0JVstF5KvLoxHH_EG8c9wUfiZ7URdJJMSS7mSfxeyl9W-3P5eY1loIg1u6FGXmZUl65MJ4T3riP0F71adFunyZUQaoXlr0kTYfyG44LUaXGcU8DmbPIwzkSyI70keTZnapiLcMmgGcbZGmcjvo6uAbPxo3_OB6aUbFbuFcYnLTZRuiq=s1219" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="448" data-original-width="1219" height="148" src="https://blogger.googleusercontent.com/img/a/AVvXsEgtlNgqOEgdX0JVstF5KvLoxHH_EG8c9wUfiZ7URdJJMSS7mSfxeyl9W-3P5eY1loIg1u6FGXmZUl65MJ4T3riP0F71adFunyZUQaoXlr0kTYfyG44LUaXGcU8DmbPIwzkSyI70keTZnapiLcMmgGcbZGmcjvo6uAbPxo3_OB6aUbFbuFcYnLTZRuiq=w400-h148" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div>認証機関文書が開いたら、<u>ステータスを空のまま</u>にして「名前:」を入力し、種類に "MicroCA" を選択したら[保存して閉じる]ボタンをクリックします。下の画像では名前に "dominoMicroCA" と入力しています。<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjyLI8ISpdYvnTzK5ksBZlJQMaKwh6sMrr6oGIvKSKqjxyoYhLHcJgRJZFrlKkL8q4tVaSWI0--jZYpSOBDdIYpVacuUEytlmMtJ17a1isfEKXHp7WmZm_QUuz3g4j4lZ87zkv9Nf71kW3DE_2m0rjIE_6-gNYWRhlKoZl1U_mCJaS4wQpzIGPjZA3Y=s769" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="660" data-original-width="769" height="275" src="https://blogger.googleusercontent.com/img/a/AVvXsEjyLI8ISpdYvnTzK5ksBZlJQMaKwh6sMrr6oGIvKSKqjxyoYhLHcJgRJZFrlKkL8q4tVaSWI0--jZYpSOBDdIYpVacuUEytlmMtJ17a1isfEKXHp7WmZm_QUuz3g4j4lZ87zkv9Nf71kW3DE_2m0rjIE_6-gNYWRhlKoZl1U_mCJaS4wQpzIGPjZA3Y=s320" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div>しばらくすると CertMgr が認証機関「MicroCA」を作成します。作成が完了すると、サーバーの log.nsf に次のように記録されました。<blockquote><div>2022/02/28 13:15:44 CertMgr: Created MicroCA [dominoMicroCA]</div></blockquote><p> そして認証機関文書のステータスは "有効" に変わりました。</p><blockquote><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhL5DQvNvz8MYmPRTmPVQ_YRk8A58E-RJWgj_FFyPdahXJebfFX86EQ1647LZaFvVTUMfsyhwLlsgs02iVqtHIETfT9q48uCwqS2BUJPzizPq26S7IjqDYTlP_qLETF2eo_DsD35IbbtUKauK7uH7IiBKs2CX6XWvYGnTVSBw207tmB2XZCjISyI7s2=s730" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="514" data-original-width="730" height="225" src="https://blogger.googleusercontent.com/img/a/AVvXsEhL5DQvNvz8MYmPRTmPVQ_YRk8A58E-RJWgj_FFyPdahXJebfFX86EQ1647LZaFvVTUMfsyhwLlsgs02iVqtHIETfT9q48uCwqS2BUJPzizPq26S7IjqDYTlP_qLETF2eo_DsD35IbbtUKauK7uH7IiBKs2CX6XWvYGnTVSBw207tmB2XZCjISyI7s2=s320" width="320" /></a></div></blockquote><div class="separator" style="clear: both; text-align: left;"><br /></div>認証機関文書の「ローカルCA」タブに切り替えると、最下部の「認証チェーン」に"-----BEGIN CERTIFICATE-----" から "-----END CERTIFICATE-----" で区切られた証明書が追加されました。<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjn9RgQjxQKTVGMvZlemOvxo448kbL_9xE9XoT7sl-wV9_-Ufbp9O4Erv4g8M3bvxAOXrhLGjBqB3iwh7yfQiBuO86PjdJ_cy3HJC0nT5lwA9VZg6Ekq8IE1xhdhZKx0xlgEnVe5O5zs6zBTWzbtCjkBAMrKmuJikfczM2rNYgTEMfY6YPcZ9MbvJRr=s1447" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1447" data-original-width="1137" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEjn9RgQjxQKTVGMvZlemOvxo448kbL_9xE9XoT7sl-wV9_-Ufbp9O4Erv4g8M3bvxAOXrhLGjBqB3iwh7yfQiBuO86PjdJ_cy3HJC0nT5lwA9VZg6Ekq8IE1xhdhZKx0xlgEnVe5O5zs6zBTWzbtCjkBAMrKmuJikfczM2rNYgTEMfY6YPcZ9MbvJRr=s320" width="251" /></a></div>これで MicroCA は完成です。<div><br /></div><div>では TLS 証明書を作成して MicroCA を指定してみます。</div><div><br /></div><div>TLS 証明書のビューを表示して[TLS 証明書の追加]ボタンをクリックします。<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgnu3JtH_bgeECievmLI4uDGnpKtQsoSHHx84FLxG7A55tmf2cnyKjUNq1RrThbcKdIvaLhtOqHlB17dfSbwZaxmipEr8dgFcE5pwVXCQO_vs75JFlQojVux3uUzAdh2Or8QCYP6MbANai8k31gPSXn_oQYU-W9gqJ9IwemNia_ZGA9fkL3TL7CAPHC=s1080" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="505" data-original-width="1080" height="188" src="https://blogger.googleusercontent.com/img/a/AVvXsEgnu3JtH_bgeECievmLI4uDGnpKtQsoSHHx84FLxG7A55tmf2cnyKjUNq1RrThbcKdIvaLhtOqHlB17dfSbwZaxmipEr8dgFcE5pwVXCQO_vs75JFlQojVux3uUzAdh2Or8QCYP6MbANai8k31gPSXn_oQYU-W9gqJ9IwemNia_ZGA9fkL3TL7CAPHC=w400-h188" width="400" /></a></div><div><br /></div><div>TLS 証明書文書が開きます。今回はテスト用途ですので、「ホスト名」には現在のサーバーの FQDN をタイプして、「アクセスできるサーバー」は現在のサーバー名を選択しました。</div><div>「証明書プロバイダ」には "MicroCA" を選択します。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjgg-cV2hx8lee98I_nQYc41r5XmhgkRn1ISCfe9phXuJLT6wD10OgIimx4fclSwhQ_422VUNA3kdaFxo2Z4IEmangYHuYSHYpcn5AT9nPHcj3V5k6oUi9t6C6Z1hfGnkWRoCoSG-Nv6HK8D9ug55CzTb5FZx9M4DC-A7g0j37MJdyGv-gmA1wW2_5E=s1120" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="809" data-original-width="1120" height="231" src="https://blogger.googleusercontent.com/img/a/AVvXsEjgg-cV2hx8lee98I_nQYc41r5XmhgkRn1ISCfe9phXuJLT6wD10OgIimx4fclSwhQ_422VUNA3kdaFxo2Z4IEmangYHuYSHYpcn5AT9nPHcj3V5k6oUi9t6C6Z1hfGnkWRoCoSG-Nv6HK8D9ug55CzTb5FZx9M4DC-A7g0j37MJdyGv-gmA1wW2_5E=s320" width="320" /></a></div><br /><div><br /></div><div>「認証機関」には今回作成した "dominoMicroCA" を選択します。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgh-z0gJ1peUK5YX160bBs-qt-Ptv-TP-TVJzIocbEDdtCibry_yz6FVMRAlyuTB5sMxqFcgFrJnDIrAHNxBi1fEoA6MWWlQL6tDJRX0knFlGfstSrzSHmTFG931Z2hi5Bj7LHXJCmCStJv9RRhhmZY_0Q0DoipWploQLsNeQU6TxKy0pzjTIqZACVg=s985" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="708" data-original-width="985" height="230" src="https://blogger.googleusercontent.com/img/a/AVvXsEgh-z0gJ1peUK5YX160bBs-qt-Ptv-TP-TVJzIocbEDdtCibry_yz6FVMRAlyuTB5sMxqFcgFrJnDIrAHNxBi1fEoA6MWWlQL6tDJRX0knFlGfstSrzSHmTFG931Z2hi5Bj7LHXJCmCStJv9RRhhmZY_0Q0DoipWploQLsNeQU6TxKy0pzjTIqZACVg=s320" width="320" /></a></div><div><br /></div><div>「キータイプ」や「曲線名」は(グローバル文書で設定済みの)デフォルトのまま、[要求の送信]ボタンをクリックしました。</div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhbObedl2eIe6ym5YkZEDnSDlUl4l3I95yHAgK-SyONgTabIFC4Zv68fmO47bkfV1IXDRjJoeualGaVMVwhc715VS2UfMzxZMiCruzXI8AETNC5QS1OWMRtJ5MuRE6gjLrqDA3Evnyq8II_n2uMgfREB1osaq7zvQgitNDsTjzKpdCeN5ms1FKhr539=s793" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="793" data-original-width="784" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEhbObedl2eIe6ym5YkZEDnSDlUl4l3I95yHAgK-SyONgTabIFC4Zv68fmO47bkfV1IXDRjJoeualGaVMVwhc715VS2UfMzxZMiCruzXI8AETNC5QS1OWMRtJ5MuRE6gjLrqDA3Evnyq8II_n2uMgfREB1osaq7zvQgitNDsTjzKpdCeN5ms1FKhr539=s320" width="316" /></a></div><div><br /></div>一旦 TLS 証明書文書が閉じて画面はビューに戻りましたが、すぐさま TLS証明書が更新されてステータスは "発行" となりました。<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjRaLauSd9aTvnxJcfVTrhVBbpPeC1OFAbIK--ng9d4Dr6m6O5lbRodjIuS9BIRaez4I4O14Sc8V_NnuwPqi8aH7YlaBHR8hUWoli-uS_JvNYYWc5H8VNQUud6gE6my3b-EiYSZ4FcZq6N_n0qoMJ35DrYqKc9mxLpcbJiuGYsgXnJFOcGyH31QEZaq=s725" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="479" data-original-width="725" height="211" src="https://blogger.googleusercontent.com/img/a/AVvXsEjRaLauSd9aTvnxJcfVTrhVBbpPeC1OFAbIK--ng9d4Dr6m6O5lbRodjIuS9BIRaez4I4O14Sc8V_NnuwPqi8aH7YlaBHR8hUWoli-uS_JvNYYWc5H8VNQUud6gE6my3b-EiYSZ4FcZq6N_n0qoMJ35DrYqKc9mxLpcbJiuGYsgXnJFOcGyH31QEZaq=s320" width="320" /></a></div><br /><div>認証の有効期限は約1年間でした。</div><div><br /></div><div>テスト用とはいえ OpenSSL 無しでここまでできるなんて便利になりましたね。</div><div><br /></div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-71647878891851338522022-02-28T19:40:00.020+09:002022-05-13T22:53:18.074+09:00Let's Encrypt で取得したマルチドメインでワイルドカードなTLS 証明書をエクスポートしてみた<p>バージョン 12 のTLS証明書管理が 12.0.1 でさらに拡張されて使いやすくなりました。</p><p>12.0 では、既存のTLS証明書を証明書ストアへインポートすることはできましたが、TLS証明書を Domino 以外のサーバーで使いたいときにエクスポートすることができなかったのです。</p><p>12.0.1 ではTLS証明書のエクスポートも可能になりました。</p><p>このTLS証明書のエクスポートについては、既に<a href="https://support.hcltechsw.com/csm?id=kb_article&sysparm_article=KB0091457" target="_blank">技術ウェビナー</a>でも紹介されてますし、CertMgr開発者であるダニエル先生の<a href="https://blog.nashcom.de/nashcomblog.nsf/dx/how-to-create-exportable-tls-credentials-with-domino-12.0.1.htm?opendocument&comments#anc1" target="_blank">ブログエントリ</a>でも紹介されていますので、詳しくはそちらをご確認ください。</p><p><br /></p><p>今回私が想定するシナリオは次のケースです。</p><p></p><ul style="text-align: left;"><li>複数のWebサーバーを複数のドメイン名で運用していて、TLS証明書の数が多い</li><li>新たに構築するWebサーバーのためにTLS証明書を取得することになった</li><li>この機会に既存の証明書をワイルドカード証明書にして証明書の数を減らしたい</li><li>複数のドメイン名をまとめてマルチドメイン証明書にしたい</li></ul>これらを Domino の証明書管理機能でどう解決できるのでしょうか。<p></p><p style="text-align: left;">ここでは、既存サーバーにはまだ有効期限内のTLS証明書があったかもしれないですが、それは新たな証明書で置換するものとします。</p><p>まずは証明書ストア(CertStore.nsf)のTLS証明書のビューにある [TLS証明書の追加]ボタンをクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-l-0h9prCQnQ3b0B0b_BvhVq7Ren-Lfa4VIFW94PJWClr4ZELs39jBNiBpLmDaShJuVG_l0AkUa8mboZ5EdVjfHAPxzGKqiXpTp6o-4fKMmrednjFVNs9D2RwxLYlZZo9QaaCcyYIH1sC6odTo1Bglp1Xlh_EiIpozsCkBp5FqoLNC9XxlXDU7dfz=s1653" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="687" data-original-width="1653" height="166" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-l-0h9prCQnQ3b0B0b_BvhVq7Ren-Lfa4VIFW94PJWClr4ZELs39jBNiBpLmDaShJuVG_l0AkUa8mboZ5EdVjfHAPxzGKqiXpTp6o-4fKMmrednjFVNs9D2RwxLYlZZo9QaaCcyYIH1sC6odTo1Bglp1Xlh_EiIpozsCkBp5FqoLNC9XxlXDU7dfz=w400-h166" width="400" /></a></div><div><br /></div>まっさらなTLS証明書文書が開いたら、上部にある[エクスポート可能キーの作成]をクリックします。<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhFaTkocmC_VMc6rkeA4NqgVu-i6gN0HNhctWmybw6RdKH075SbCbQ25fNK2eI81HsbaSz-2_MzjvtCLrmUdO-e7PDPTOauiLoV-egyWGki5kfD2HVKnaNp9eH9lgfuolzg5-wIZ8S58P8Z9LgcNtog47MnP-vrb9BmkVoHd2X6cND-Sw1A-qXXtFNj=s1641" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="722" data-original-width="1641" height="176" src="https://blogger.googleusercontent.com/img/a/AVvXsEhFaTkocmC_VMc6rkeA4NqgVu-i6gN0HNhctWmybw6RdKH075SbCbQ25fNK2eI81HsbaSz-2_MzjvtCLrmUdO-e7PDPTOauiLoV-egyWGki5kfD2HVKnaNp9eH9lgfuolzg5-wIZ8S58P8Z9LgcNtog47MnP-vrb9BmkVoHd2X6cND-Sw1A-qXXtFNj=w400-h176" width="400" /></a></div><div><br /></div>エクスポート可能キーはTLS証明書の取得後に作成することができないため、初めの段階で作成します。パスワードをタイプするとパスワードクオリティが表示されるのですが、"弱"や"中"では[OK]ボタンをクリックしてもエラーが表示されます。これが"強"になるまで先に進めません。<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiesc_stjHD4fbZWgNt_BxXF3FJJBZvFGmSWtCfYe0wZl8JKmOBZSS_li8ANci6dSu0Bez8L7_QY0yT69_Nx_6Z1C2oa61hcxZI3W7nNFFLQJF-77BHdHdHCer96OmE__2aMlEN77kqK9_ZwJoIRyvyd6urvB5XPyTEKKyf-9Rk_gplLjAnR5aJk88x=s1578" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="713" data-original-width="1578" height="181" src="https://blogger.googleusercontent.com/img/a/AVvXsEiesc_stjHD4fbZWgNt_BxXF3FJJBZvFGmSWtCfYe0wZl8JKmOBZSS_li8ANci6dSu0Bez8L7_QY0yT69_Nx_6Z1C2oa61hcxZI3W7nNFFLQJF-77BHdHdHCer96OmE__2aMlEN77kqK9_ZwJoIRyvyd6urvB5XPyTEKKyf-9Rk_gplLjAnR5aJk88x=w400-h181" width="400" /></a></div><div><br /></div>エクスポート可能キーが作成できると、「セキュリティ/キー」タブの最下部に「エクスポート可能秘密鍵」が追加されます。<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj8FhNVWaLbhaWYJ08lXFJoWslqRCdM8LhT428j3W-2NK5oi97BfgswfmDWiRlMYBkf4Xb5Yq0deWK3niLSIXoGNp6t9f-aTMkPdtl-trT_0BCn6LyeXZ1UsfKHD6u9DJ2TMrGas1-4jC1b8mDIqNVU1L8byPOw6CWJxmMql6g--YQRE5U_CJ_cszSQ=s1303" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1303" data-original-width="1047" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEj8FhNVWaLbhaWYJ08lXFJoWslqRCdM8LhT428j3W-2NK5oi97BfgswfmDWiRlMYBkf4Xb5Yq0deWK3niLSIXoGNp6t9f-aTMkPdtl-trT_0BCn6LyeXZ1UsfKHD6u9DJ2TMrGas1-4jC1b8mDIqNVU1L8byPOw6CWJxmMql6g--YQRE5U_CJ_cszSQ=s320" width="257" /></a></div><div><br /></div>TLS証明書をエクスポート可能にするために必要な準備はこれだけです。<div><br /></div><div>あとは「メイン」タブにある「ホスト名」や「アクセスできるサーバー」などの必要項目を埋めて[要求の送信]ボタンをクリックする、というマニュアル通りの操作を行い、TLS証明書を作成します。ここでは「ホスト名」に2つの異なるドメイン(v1.dominorestapi.work と dominov12beta.work)をワイルドカードで指定しました。「ACME アカウント」にはテストということで "LetsEncryptStaging" を選択しました。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgfgHcT5x7Uy4zyEXMr9-IZR3kFmc79GIMD_-AZ7Hne-QvSAkibeul9iPRWZNyLq9YraeFs8JCYqUDaTyFrP9OMdxOQGXH1SQ-Y4dVqyOff9IUa40mQKhrnkp-sWpzTmnZ8BwDpzGXkH26d25BHxCXf6Qi_0ng6goVDyvFJ_Hy76Uee9D3VZUgQhJ_b=s1236" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1236" data-original-width="1162" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEgfgHcT5x7Uy4zyEXMr9-IZR3kFmc79GIMD_-AZ7Hne-QvSAkibeul9iPRWZNyLq9YraeFs8JCYqUDaTyFrP9OMdxOQGXH1SQ-Y4dVqyOff9IUa40mQKhrnkp-sWpzTmnZ8BwDpzGXkH26d25BHxCXf6Qi_0ng6goVDyvFJ_Hy76Uee9D3VZUgQhJ_b=s320" width="301" /></a></div><div><br /></div>以前に CertMgr で Let's Encrypt からTLS証明書を取得した実績のあるドメインでしたので、無事に証明書が取得できました。<div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiXAfDxasc0rMuj1fiKRGSty62TG6S847Mo2a9hvWtVJJazNj6dQaYK_Ve64ol6PKIWNVsNdJRPOWWUvBYlMrGsZeb8X0Y0cFLfnLlVYga9iKbJEb0DSnN_OBjk9ZNs1M1S0r4Z0-PDfr3zaQcUhNmBfgCtrwtBplEP_QSL0ziD2HsnYtxrvxOfz-Sh=s931" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="931" data-original-width="909" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEiXAfDxasc0rMuj1fiKRGSty62TG6S847Mo2a9hvWtVJJazNj6dQaYK_Ve64ol6PKIWNVsNdJRPOWWUvBYlMrGsZeb8X0Y0cFLfnLlVYga9iKbJEb0DSnN_OBjk9ZNs1M1S0r4Z0-PDfr3zaQcUhNmBfgCtrwtBplEP_QSL0ziD2HsnYtxrvxOfz-Sh=s320" width="312" /></a></div><div><br /></div><div>ちなみにワイルカード証明書は DNS-01 チャレンジでのみ取得できます。ホスト名に指定した2つのドメインですが、ドメインを管理する DNS プロバイダを一方は <a href="https://harunakano.blogspot.com/2021/07/aws-cli-tls.html" target="_blank">AWS Route53</a>、他方は <a href="https://harunakano.blogspot.com/2022/01/lets-encrypt-dns-01-tls.html" target="_blank">CloudFlare</a> としており、どちらも ACME DNS-01 チャレンジを行うよう証明書ストア(CertStore.nsf)に「DNS プロバイダアカウント」文書と「DNS プロバイダ設定」文書を作成済みです。DNS プロバイダも異なる複数のドメインを一つのTLS証明書文書で一元管理できるなんて素晴らしいことです。</div><div><br /></div><div>そして「TLS証明書のエクスポート」というボタンが表示されました。このボタンをクリックします。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiYxKNwZZP47HI0SKukrRRJl0QK5BG070tu6GiCL1KgKV3u54mzk_kxh-ZWK6MH6DQraJIzU3z2V-Dhi5t2aXt5MIQPPZiRoLFNeQ4iG_o3NWSy6a4IGpzlZDe8z6T-rc9EtOyLomveIUI00Oyq5NZicQozbl4AQq3-x_3UJ2zjgUt23U2wAdG3NlMR=s1360" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="466" data-original-width="1360" height="138" src="https://blogger.googleusercontent.com/img/a/AVvXsEiYxKNwZZP47HI0SKukrRRJl0QK5BG070tu6GiCL1KgKV3u54mzk_kxh-ZWK6MH6DQraJIzU3z2V-Dhi5t2aXt5MIQPPZiRoLFNeQ4iG_o3NWSy6a4IGpzlZDe8z6T-rc9EtOyLomveIUI00Oyq5NZicQozbl4AQq3-x_3UJ2zjgUt23U2wAdG3NlMR=w400-h138" width="400" /></a></div><div><br /></div>エクスポートできる形式は、PKCS12 と PEM がサポートされていました。試しに PEM 形式でファイルを出力してみます。<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiT2jVWX1ms1voFb4rlf2XkApznkmOF8FErYfL8VpeC7Znm0CrMIifc5S-r8OryjFrr5V5QlCgSCyq1uomj0SUWK7sZZCAI0_DHGS7AjQK6IqGgIctUYCtRJ7gjOl50Ggdnax1nCyVzpmQZPBhfNJKIrHrjlhIWuiyVchSAJ39HmwNKXUuVoYO9o7MI=s1578" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1158" data-original-width="1578" height="294" src="https://blogger.googleusercontent.com/img/a/AVvXsEiT2jVWX1ms1voFb4rlf2XkApznkmOF8FErYfL8VpeC7Znm0CrMIifc5S-r8OryjFrr5V5QlCgSCyq1uomj0SUWK7sZZCAI0_DHGS7AjQK6IqGgIctUYCtRJ7gjOl50Ggdnax1nCyVzpmQZPBhfNJKIrHrjlhIWuiyVchSAJ39HmwNKXUuVoYO9o7MI=w400-h294" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div>出力したファイルをテキストエディタで開いてみると、暗号化された秘密鍵と証明書のチェーンが入っていました。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi8YMvC4II7Fs8yMFjzGt7efizV2CZQlBM7kZchRiQ-zZZ-kQNutbdy9XPcAVSciZCBTUY3Svlz18KPnB5cJDFSy0EV6g_8tbyNKLnT9z-z_kW1-Ixeasi6freNDXVhbJQnQawJY1QelOfBqkvoCtP94smBYYtnU7uydmPsV8-tBXLcLa_4CmhI5mnm=s1225" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1225" data-original-width="1079" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEi8YMvC4II7Fs8yMFjzGt7efizV2CZQlBM7kZchRiQ-zZZ-kQNutbdy9XPcAVSciZCBTUY3Svlz18KPnB5cJDFSy0EV6g_8tbyNKLnT9z-z_kW1-Ixeasi6freNDXVhbJQnQawJY1QelOfBqkvoCtP94smBYYtnU7uydmPsV8-tBXLcLa_4CmhI5mnm=w353-h400" width="353" /></a></div><br /><div>このファイルを OpenSSL コマンドで確認します。※OpenSSLは別途インストール必要</div><div><br /></div><div>まずは秘密鍵です。アルゴリズムに ECDSA(楕円曲線暗号)を指定しているので、コマンドを「openssl ec -text -noout -in ファイル名」とします(※ec を rsa としてしまうと "Not an RSA key" と言われました)。コマンドを投入するとパスフレーズを聞かれますので、エクスポートした時に指定したパスワードをタイプします。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj6DuoohR7K44Dablut6qoNsXeAgE279loYH9asQe-6pd33RQFN_Z9_A_rNedC7qhXiGBpbxQGLAuucmw2laNIp8H8byCDsp1Wu5wkt7ZIEBE1ZfyeXqIQi5JdbqSf12kbJ43BsRGhjh6JbGjEfoyJpgkp02IJ3HWpjAKEUBt29fQGK9ABNZ8cYkzEE=s1638" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1093" data-original-width="1638" height="268" src="https://blogger.googleusercontent.com/img/a/AVvXsEj6DuoohR7K44Dablut6qoNsXeAgE279loYH9asQe-6pd33RQFN_Z9_A_rNedC7qhXiGBpbxQGLAuucmw2laNIp8H8byCDsp1Wu5wkt7ZIEBE1ZfyeXqIQi5JdbqSf12kbJ43BsRGhjh6JbGjEfoyJpgkp02IJ3HWpjAKEUBt29fQGK9ABNZ8cYkzEE=w400-h268" width="400" /></a></div><br /><div>次に証明書です。コマンドは「openssl x509 -text -noout -in ファイル名」とします。こちらはパスワードを聞かれません。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiLe-Ka5W1lJtPEgf9Exu6F8-ye_zsoCLliBINxmnFz2sV96O3mArqcLC7gnovgXd9KJzfjAqOOJqepzmdOrqx-_4Rc3RF0QwJTSL8zoVu4FoMa6L9e1FRl71c-kG40zemxH8odGJC4Ibo4OGAEcySmbj5kmPdPQaIfoRIrpSz_1rBCuohhu_FJBEN2=s954" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="954" height="303" src="https://blogger.googleusercontent.com/img/a/AVvXsEiLe-Ka5W1lJtPEgf9Exu6F8-ye_zsoCLliBINxmnFz2sV96O3mArqcLC7gnovgXd9KJzfjAqOOJqepzmdOrqx-_4Rc3RF0QwJTSL8zoVu4FoMa6L9e1FRl71c-kG40zemxH8odGJC4Ibo4OGAEcySmbj5kmPdPQaIfoRIrpSz_1rBCuohhu_FJBEN2=w400-h303" width="400" /></a></div><div><br /></div><div>上のコマンドの結果のうち SAN(サブジェクト代替名) だけ拡大したのが次のスクショです。 </div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEigQ556Mq1e-tPb-RM7TfSZtbJef7qC4Gmi7cOWxFq0geRKbA7mKR5Occ60xeWiUGapkkooWgJsH9MaG_iiS26zAnYhLDja5xP5nGHqaiF1DVuxFaComUZYLy8Q-Rll72teP0QgrTmXWscSV3urnkHTC6HC71f_Ni2jgApw03PdM3re3W_vsqTrwWVP=s1247" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="97" data-original-width="1247" height="50" src="https://blogger.googleusercontent.com/img/a/AVvXsEigQ556Mq1e-tPb-RM7TfSZtbJef7qC4Gmi7cOWxFq0geRKbA7mKR5Occ60xeWiUGapkkooWgJsH9MaG_iiS26zAnYhLDja5xP5nGHqaiF1DVuxFaComUZYLy8Q-Rll72teP0QgrTmXWscSV3urnkHTC6HC71f_Ni2jgApw03PdM3re3W_vsqTrwWVP=w640-h50" width="640" /></a></div><div><br /></div>ワイルドカードで2つのドメインが追加されています。<br /><div><br /></div><div>ファイルに問題は無いように見えますので、ひとまずエクスポートは完了です。</div><div><br /></div><div><br /></div><div>さて実際の運用を想像すると、CertMgr が定期的に更新するTLS証明書を更新のたびに証明書ストアを開いて手動で PEM ファイルへエクスポートして、それを Domino 以外の Web サーバーで置換しなければならないのかな?思うと、証明書が一つになって期限切れの管理が多少楽になるとは言え、もっと簡単にしたいと思います。</div><div><br /></div><div>証明書ストア(CertStore.nsf)には、エクスポートの操作を実行するときに呼び出される「ImportExport」という LotusScript のスクリプトライブラリがあり、この中にあるファンクションから API をコールしてファイルへのエクスポートを行っていました。</div><div>もし TLS証明書をエクスポートするエージェントを作りたい場合にはこの「ImportExport」が参考になりそうです。</div><div><br /></div></div><div>とは言え、証明書ファイルを Domino 以外のサーバーへコピーして証明書を置換できてもそれを反映するためにサーバーを再起動しないといけないとかありそうですから、ケースバイケースで考えないとだめですね。</div><div><br /></div><div>【2022/3/3 追記】</div><div>TLS証明書文書の「アクセスできるサーバー」という項目は、自Dominoドメインのサーバーだけ選択が可能ですし、他Dominoドメインのサーバーをタイプすると「CertStore: Cannot get public key for server」とメッセージを吐いてエラーになります。他のDominoドメインのサーバーとCertStore.nsfを複製しつつTLS証明書を共有できるかどうかをメーカーサポートへ確認したところ、CertMgr は ドメイン内の証明書を管理する仕組みであるため、基本的にはドメインごとにレプリカを管理することになる、と回答がありました。TLS証明書を他Dominoドメインでインポートするか、他ドメインはワイルドカードにしない、といった運用になりそうです。CertStore.nsfが他Dominoドメインと共有できるようになるといいですね。</div>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0tag:blogger.com,1999:blog-6551049208804691080.post-70346890886924369752022-02-09T18:50:00.005+09:002022-02-09T18:50:52.988+09:00MyDNS.jp を使用した TLS 証明書の取得<p>今回も証明書ストア(CertStore.nsf)と CertMgr(タスク)の話題です。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg0CpNp4_Ah89RI1kiM85wrmpfTA0GzTfECcesjoF4E3oyWt3ywZ7BBhOx05tEHwxapsGb0ozdX5dIapS3KdBwpEbuC70CcR-qgzliC1iMnIvxAwL3oBOHLyTDtleKDNLFncj_ZnWcSnX6PQpJNpXbtZVSAzIvUEZp-oYA5f6-zMS_kxmJCGBxbJyge=s333" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="309" data-original-width="333" height="186" src="https://blogger.googleusercontent.com/img/a/AVvXsEg0CpNp4_Ah89RI1kiM85wrmpfTA0GzTfECcesjoF4E3oyWt3ywZ7BBhOx05tEHwxapsGb0ozdX5dIapS3KdBwpEbuC70CcR-qgzliC1iMnIvxAwL3oBOHLyTDtleKDNLFncj_ZnWcSnX6PQpJNpXbtZVSAzIvUEZp-oYA5f6-zMS_kxmJCGBxbJyge=w200-h186" width="200" /></a></div><br /><p>CertMgr がベータ版で登場した頃に私が利用していた <a href="https://www.mydns.jp/">MyDNS.jp</a> という DDNS(ダイナミック DNS)がウリの DNS プロバイダは、<a href="https://github.com/disco-v8/DirectEdit" target="_blank">Certbot 用に PHP のもとで動くスクリプト</a>を提供しているものの REST API 仕様の公開は無く、Domino の CertMgr では使いづらいと感じていました。まあ DDNS を本番環境には採用しないだろうと想像するとこのエントリは趣味寄りあるいは検証向けではあるように思います。</p><p><br /></p><p>先日、このスクリプトを Python で書き換えて利用している方のブログ記事を拝見して「これはいけるかも」と思い立ちチャレンジしてみたところ、証明書の取得に成功しました。</p><p>とは言えまだまだ MyDNS.jp と CertMgr の仕組みや設定について私の理解が足りない部分があるような気がしていて、もしかするともっと良い設定方法があるかもしれませんが、現時点での成功例としてここに残しておきたいと思います。</p><p><br /></p><p>今回は dominocertmgr.site というドメインにある certmgrtest というホスト名の TLS証明書を取得する、というシナリオです。FQDNは certmgrtest.dominocertmgr.site です。</p><p>以下、設定内容です。</p><p><br /></p><p>まずは、MyDNS.jp です。</p><p>まずは、MyDNS.jp へアクセスして JOIN US から新規登録します。登録が完了するとメールで Master ID と Password が通知されます。この Master ID を使って LOG IN します。</p><p>ログインできたら USER INFO の画面に切り替え、パスワード欄の下にある「追加する子IDの数」の数字を 0 から 1 に書き換えて[確認]ボタンを押します。</p><p>追加が完了するとメールで Child ID と Password が通知されます。</p><p>DOMAIN INFO の画面に切り替え、「Domain」欄へ dominocertmgr.site をタイプします。「Hostname, Type, Content, Target ID」欄へ下表の様に入力(または選択)します。Target ID は、Type が CNAME のほうに Master ID を、Type が DELEGATE のほうに Child ID をそれぞれ選択します。</p><table style="border-collapse: collapse; border: 2px solid rgb(200, 200, 200); letter-spacing: 1px;"><thead style="background-color: #3f87a6; color: white;"><tr>
<th style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">Hostname</th>
<th style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">Type</th>
<th style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">Content</th>
<th style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">Target ID</th>
</tr></thead><tbody><tr>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">_acme-challenge</td>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">CNAME</td>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">certmgrtest.dominocertmgr.site</td>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">mydns12345</td>
</tr><tr>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">certmgrtest</td>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">DELEGATE</td>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;"><br /></td>
<td style="border: 1px solid rgb(190, 190, 190); padding: 5px 10;">mydns54321</td>
</tr></tbody>
</table><p>※ここでは TLS 証明書取得に無関係のレコードタイプを省略しています</p><p>MyDNS.jp の API では、ドメイン名の頭に "_acme-challenge." を付加した TXT レコードの追加は可能ですが、FQDN の頭に "_acme-challenge." を付加したものを追加しようとすると 307 エラーが返ってくることから、CNAME で別名として参照させることで回避しました。</p><p>そして certmgrtest というホスト名(サブドメイン)を Child ID へ移譲(DELEGATE)する設定(にしたつもり)です。そんな訳で TXT レコードは Child ID のほうへ追加される想定です。</p><p>MyDNS.jp の設定は以上です。</p><p><br /></p><p>続いて「証明書ストア」アプリケーション(CertStore.nsf)です。</p><p>証明書ストアを開き、左側のナビゲーションメニューから「DNS 設定」をクリックしてビューが表示されている状態で、Notes ウィンドウ上部の「アクション - DXL のインポート」をクリックし、<a href="https://app.box.com/s/urnpuy2yj0k5y6mvxow6z6791kc4j8fk" target="_blank">こちら</a>からダウンロードした DXL ファイルをインポートします。</p><p>すると MyDNS.jp の DNS プロバイダ設定文書が作成されます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj2V-BG-4vDiM2PKPiXrzHk7dDUdAhXiGKmQJJxwSNpx3lJjNtVyWphsr0iOHHL0nlzUvh7tj-8XsiYsa6oCdp6gtB9nvEXAvMfQirmwUon3rYRps0wPETp4En7QW5-3HPdIP3QNaazV1B1dm6n9iWkV19Sha29ZrWtMnGQriomYlliaEq6DAq-kkVl=s1487" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1368" data-original-width="1487" height="368" src="https://blogger.googleusercontent.com/img/a/AVvXsEj2V-BG-4vDiM2PKPiXrzHk7dDUdAhXiGKmQJJxwSNpx3lJjNtVyWphsr0iOHHL0nlzUvh7tj-8XsiYsa6oCdp6gtB9nvEXAvMfQirmwUon3rYRps0wPETp4En7QW5-3HPdIP3QNaazV1B1dm6n9iWkV19Sha29ZrWtMnGQriomYlliaEq6DAq-kkVl=w400-h368" width="400" /></a></div><div><br /></div><div>下図は、インポートして作成された「DNSプロバイダ設定」文書の「操作」タブの内容です。</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgb9gO-V7frJf1UfJihT8AuCG03m_WkXywnp-dvaD0gNbT5f2VTtyjC4kVdfr3JY_QHP_2z4jJv9vHXoxz6dFS6L382gLOWFMiPvsZcKk9xdJtG4IYm0F2j8-m0hISzuRNGIu_Glpg9R4PpiNBVN2PIG-h7CIbiBT2x8nxszegJS8A_d2r59I0yVgyI=s2184" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1519" data-original-width="2184" height="279" src="https://blogger.googleusercontent.com/img/a/AVvXsEgb9gO-V7frJf1UfJihT8AuCG03m_WkXywnp-dvaD0gNbT5f2VTtyjC4kVdfr3JY_QHP_2z4jJv9vHXoxz6dFS6L382gLOWFMiPvsZcKk9xdJtG4IYm0F2j8-m0hISzuRNGIu_Glpg9R4PpiNBVN2PIG-h7CIbiBT2x8nxszegJS8A_d2r59I0yVgyI=w400-h279" width="400" /></a></div><br /><div>脱線して少し説明します。</div><div>「操作」タブの「投稿データ式:」に次のような式があります。3つのパラメータをアンパサンド「&」で区切っています。</div><div>"EDIT_CMD=REGIST&CERTBOT_DOMAIN=" + param_RegisteredDomain + "&CERTBOT_VALIDATION=" + param_DnsTxtValue</div><div><br /></div><div>EDIT_CMD には、TXTレコードの追加なら "REGIST"、削除なら "DELETE" を指定します。</div><div>CERTBOT_VALIDATION には、TXTレコードへセットする文字列が生成されている param_DnsTxtValue の値がセットされるようにします。</div><div>CERTBOT_DOMAIN の値は、当初 FQDN を設定すると 307 が返り Redirect のエラーになりました。この値が MyDNS.jp の「Domain」欄に指定する名前 "dominocertmgr.site" と異なるとエラーになり、名前と同じだと "_acme-challenge" というホスト名のTXTレコードが追加されたのです。しかしながら TXT レコードは「"_acme-challenge." + ホスト名 + ドメイン名」でないと認証に失敗します。そこで DNS へ Type に CNAME と DELEGATE の2つのレコードを設定して「ホスト名+ドメイン名」を Child ID へ移譲することで回避することにしました。MyDNS.jp では Type に NS を選択できないのでこの Type の組み合わせとしています。</div><br /><p>話を戻します。</p><p>次にナビゲーションメニューの「DNS プロバイダ」をクリックして、画面右側に開いたビューの上部にある「アカウントの追加」ボタンをクリックします。</p><p>「DNS プロバイダアカウント」文書が編集モードで開いたら、「基本」タブの「DNS アカウント」のエリアにある「登録済みドメイン」へ FQDN(certmgrtest.dominocertmgr.site)を入力、「DNS プロバイダ設定」に MyDNS.jp を選択します。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjr9qmv4tIcBzUwwe8v7zdb8GaYQj0brXLT1OzPZAWk8Zlv0SchhAvaLLYXJTtpEC2uJ12t59VUxmz9p1multkED62HnUJ-iWBO2FWQ78NeS467SxDu7X0LH14UV31RO-eODtJIsifXUFZW5-UlfBxCoJlbNaBzdEF77s0Ks6rny0AmXfj4VKMeTFPu=s996" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="551" data-original-width="996" height="177" src="https://blogger.googleusercontent.com/img/a/AVvXsEjr9qmv4tIcBzUwwe8v7zdb8GaYQj0brXLT1OzPZAWk8Zlv0SchhAvaLLYXJTtpEC2uJ12t59VUxmz9p1multkED62HnUJ-iWBO2FWQ78NeS467SxDu7X0LH14UV31RO-eODtJIsifXUFZW5-UlfBxCoJlbNaBzdEF77s0Ks6rny0AmXfj4VKMeTFPu=s320" width="320" /></a></div><br /><p>そして「基本」タブの「設定値」のどこかに認証情報を設定します。認証情報とは、MyDNS.jp へ TXT レコードを追加/削除できるアカウントの情報です。</p><p>Certbot 用に PHP のもとで動くスクリプトでは、MyDNS.jp へ要求を POST するときにヘッダーへ追加する "Authorization: Basic " に、IDとパスワードをコロン「:」で区切った文字列をbase64エンコードしたものを続けて指定していました。仮に ID が "MyUserID" でパスワードが "Password" の場合、base64エンコードした文字列は "TXlVc2VySUQ6UGFzc3dvcmQ=" となり、ヘッダーには最終的に次のようになるよう式を組み立てます。</p><p style="text-align: center;">Authorization: Basic TXlVc2VySUQ6UGFzc3dvcmQ=</p><p>今回は「certmgrtest.dominocertmgr.site」の TXT レコードを MyDNS.jp の Child ID で管理するほうへ追加することを想定しているので、Child ID とそのパスワードをコロン「:」でつなげた文字列を base64 エンコードしたものになります。</p><p>文字列の base64 エンコードは残念ながらヘッダー式の中で実行できないため、Windows のコマンドプロンプトから certutil -encode コマンドを利用したり、<a href="https://www.nsftools.com/tips/Base64v14.lss" target="_blank">nsftools で公開されている LotusScript のコード</a>などを利用してあらかじめ生成しておきます。</p><p>base64エンコードして生成した文字列を、今回は「基本」タブの「設定値」にある「カスタム値」フィールドへ設定しました。「カスタム値」の値は、先にインポートした「DNS プロバイダ設定」文書の「ヘッダー式」の中で cfg_CustomValue というフィールド名で参照しています。</p><p>「DNS プロバイダアカウント」文書では、上の画像にあるフィールドの他はこの「カスタム値」フィールドだけ設定して保存します。</p><p><br /></p><p>最後はナビゲーションメニューの「TLS 証明書 - ホスト名別」をクリックして、表示されたビュー上部にある「TLS 証明書の追加」ボタンをクリックします。</p><p>「TLS 証明書」文書では、「ホスト名」と「共通名(CN)」に FQDN を、「アクセスできるサーバー」に TLS 証明書を使う Domino サーバー名を(、その他の項目は私があらかじめ設定しておいたグローバル設定のまま)入力したら「要求の送信」ボタンをクリックします。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiaycKTslvSqRXdFnBPNTK2_Iy3E0JdMlY8ugTY8ig2mV9pe2iOeonGgc-2WZ0JfJvhDU-aip15R6MkoQuuEfEjN-DO5YX-GUYTxmOT1fpcX9-7gMQEHQd0tu3vDFdBz4VG8i9A6aDrxmCz2JmfbRGNPoYsTlYrF8K7D0vv-hwWd9ditZWTfW6DUlRo=s1324" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1324" data-original-width="1027" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEiaycKTslvSqRXdFnBPNTK2_Iy3E0JdMlY8ugTY8ig2mV9pe2iOeonGgc-2WZ0JfJvhDU-aip15R6MkoQuuEfEjN-DO5YX-GUYTxmOT1fpcX9-7gMQEHQd0tu3vDFdBz4VG8i9A6aDrxmCz2JmfbRGNPoYsTlYrF8K7D0vv-hwWd9ditZWTfW6DUlRo=s320" width="248" /></a></div><br /><p>(CertMgr タスクが起動していれば)しばらく待つと TLS 証明書文書が更新されてステータスが「発行」になりました。こうなれば成功です。</p><p>成功した TLS 証明書を開き、フォーム上部にあるボタン「証明書の調査」をクリックすると、証明書の発行者と有効期限などを確認できます(下図)。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg9pKKbxewdwDtMgnKwR4f2UH0KeAP6-YZ3Dr6ty5YXgvUpEEfRKWmnz_JHSy8rR56gATafbBaO0n_-sBGBx2i9tPfbV1so1K1kwSFlLXQgeLhhO8x-t3nwMN1Ot13UNPARKKMfPnDx8U4bQjHyjjrOgKnyWLpX5pSmfkQpWgzT1OxomsiDPVCKr74e=s2501" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1461" data-original-width="2501" height="234" src="https://blogger.googleusercontent.com/img/a/AVvXsEg9pKKbxewdwDtMgnKwR4f2UH0KeAP6-YZ3Dr6ty5YXgvUpEEfRKWmnz_JHSy8rR56gATafbBaO0n_-sBGBx2i9tPfbV1so1K1kwSFlLXQgeLhhO8x-t3nwMN1Ot13UNPARKKMfPnDx8U4bQjHyjjrOgKnyWLpX5pSmfkQpWgzT1OxomsiDPVCKr74e=w400-h234" width="400" /></a></div><div><br /></div><div><br /></div>DXLからインポートして作成した「DNS プロバイダ設定」文書の詳細にはあまり触れませんでしたが、もしご興味があれば DXL ファイルをインポートして作成される文書を確認してみてください。<br /><p>ネットで検索してみると PHP のもとで動くスクリプトではワイルドカードの証明書も取得できるようでした。もう少し試してみようと思います。</p>Haruyuki Nakano (中野 晴幸)http://www.blogger.com/profile/07482042055279390396noreply@blogger.com0