Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HCL Nomad と OCR

Haruyuki Nakano
September 01, 2022

HCL Nomad と OCR

HCL Nomad を利用して iPad のカメラで撮った写真に写る文字を抽出しようと試みた結果から学んだ記録です。
OCR には GoogleCloud Vision API を利用しています。

2019年10月開催の「のの会 第18回」で使用した資料です。

Haruyuki Nakano

September 01, 2022
Tweet

More Decks by Haruyuki Nakano

Other Decks in Programming

Transcript

  1. 取り組んだきっかけ • NotesHTTPRequest と NotesJSONNavigator の検証 • HCL Nomad(旧DMA)でも動くアプリを作りたい •

    HCL Master 小野様からのヒント ➢「LINE に投稿した画像を OCR できますよ」 たぶん LINE + Node-RED + Google Cloud Vision API で実装?
  2. ローカルへ保存と言うけれど…どこ? • Windows でも iOS でも読み書きできる保存先と言えば…? ✓Notes データディレクトリ • Notes

    データディレクトリの場所を調べるには…? ✓notes.ini の “Directory” ➢iOS では notes.ini から Notes プログラムディレクトリが取得できな い!? Dim ss As New NotesSession dataDir$ = ss.Getenvironmentstring("Directory", True )
  3. ファイルをローカルへ保存する • Body フィールドに添付したすべてのファイルが対象です Dim rtitem As NotesRichTextItem Set rtitem

    = doc.Getfirstitem("Body") ForAll o In rtitem.Embeddedobjects If o.Type = EMBED_ATTACHMENT Then filepath = dataDir & dlm & o.Source o.ExtractFile filepath ‘ここでOCR処理を行う Kill filepath End If End ForAll
  4. 【メモ】区切り文字に注意 • フォルダ名とファイル名の区切り文字がOSによって異なります • Windows: ¥ 円マーク(バックスラッシュで表示されることも) • iOS: /

    スラッシュ Dim ss As New NotesSession Dim platform$, dlm$ platform = LCase( ss.platform ) If platform = "ios" Then dlm = "/" ElseIf platform = "windows/32" Then dlm = "¥" End If
  5. どうして JSON なの? • Slack へファイルを送信する場合は MIME 形式で要求しなけれ ばなりませんが、Google Cloud

    Vision API では JSON で の要求をサポートしています ※ちなみに現状 slack は BASE64 エンコードをサポートしていません
  6. API へリクエストを投げる • 次の JSON にある EncodedText の部分を BASE64 エン

    コードしたものに置換してPOSTします { "requests": [ { "image": { "content": "EncodedText" }, "features": [ { "type": "DOCUMENT_TEXT_DETECTION" } ] } ] } Dim ss As New NotesSession Dim req As NotesHTTPRequest Dim nav As NotesJSONNavigator Set req = ss.Createhttprequest() json$ = |{“requests”: [{“image”:{“content”:”…”},…}]}| req.Timeoutsec = 60 req.Preferjsonnavigator = True req.Setheaderfield "Content-Type", "application/json" Set nav = req.Post( url, json )
  7. レスポンスを得る • テキスト抽出が成功すると、次のような JSON を戻します • description の値に、すべてのテキストがあります { "responses":

    [ { "textAnnotations": [ { "description": "OCR Text" } ] } ] } (他にも結果が入ってそうな箇所があるが…)
  8. レスポンスからOCRの結果を得る(1) • 階層をたどる方法 { "responses": [ { "textAnnotations": [ {

    "description": "OCR Text" } ] } ] } Dim elm As NotesJSONElement Dim obj As NotesJSONObject Dim arr As NotesJSONArray Set elm = nav.Getelementbyname( "responses" ) Set arr = elm.Value Set elm = arr.Getfirstelement() Set obj = elm.Value Set elm = obj.Getelementbyname( "textAnnotations" ) Set arr = elm.Value Set elm = arr.Getfirstelement() Set obj = elm.Value Set elm = obj.Getelementbyname( "description" ) MessageBox elm.Value,,"OCR Text" 探したい値が配列の何番目にある かわからない場合に有効です
  9. レスポンスからOCRの結果を得る(2) • ポインタを指定する方法 { "responses": [ { "textAnnotations": [ {

    "description": "OCR Text" } ] } ] } Dim elm As NotesJSONElement pointer$ = "/responses/0/textAnnotations/0/description" Set elm = nav.Getelementbypointer( pointer ) MessageBox elm.Value,,"OCR Text" 探したい値が配列上のどの位置にある か確定している場合に有効です
  10. 1. OSの違いに注意 Windows iOS フォルダの区切り文字 円マーク スラッシュ Notes.ini から 取得可能なディレクトリ

    プログラム・ディレクトリ、 データ・ディレクトリ データ・ディレクトリ
  11. 2. タイムアウト • Notes クライアント:問題なし • Nomad: ときどきタイムアウトする • NotesHTTPRequest

    のTimeoutsec プロパティが効かない? • HCL Nomad の制限:10秒でタイムアウトする • Timeoutsec のデフォルト値は 30(秒)。プロパティへ 60 をセットしても iOS では 10 秒でタイムアウトする • タイムアウトすると、エラーコード:4846 「HTTP request timeout」となる • ネットワークの帯域幅や混雑状況の影響を受ける
  12. 3. 新機能の不具合(1) • 写真に写る文字数が少ない(=OCRからのレスポンスのサイズが小さ い)場合、Nomadでもうまくいく!? • 文字数が多い場合、エラーコード:4842 「Unable to Parse

    JSON string: Missing a name for object member: offset 1」でエラーと なる傾向があった ➢Notes 10.0.1 FP2、HCL Nomad 1.0.4 で不具合が解消\( ‘ω’)/
  13. 【参考】Notes 10.0.1 FP2 新機能の問題が多く修正されています! • DCONB8VMAV - NotesJSONNavigator is unable

    to parse JSON content > 64k • ASHEB95LFR - Unable to parse JSON string: Missing a name for object member, offset 1 • DCONB8F6JV - bad character conversion happening in NotesHTTPRequest response • ASHEB95LFR - NotesJSONNavigator unable to navigate a string which contains new lines and carriage returns • DCONBB2KNR - NotesJSONNavigator experiencing severe issues when parsing packages with empty string values • JCORBB2KWU - Unable to Post > 64K String in NotesHTTPRequest • DCONBB44T4 - Creating a NotesJSONNavigator from nulled response causes crash Limitations of NotesHTTPRequest and NotesJSONNavigator with future considerations https://www.ibm.com/support/pages/limitations-noteshttprequest-and-notesjsonnavigator-future-considerations
  14. 【参考】 HCL Nomad 1.0.4 • Notes 10.0.1 FP2 相当の修正が適用された(気がする) •

    1.0.4 は現状 TestFlight でのみ提供 • アプリが変わりました! 1.0.3 まで ➢IBM Domino Mobile Apps 1.0.4 以降 ➢HCL Nomad
  15. 3. 新機能の不具合(2) • OCRからのレスポンス(JSON)に”Ⓡ”や”・”を含む場合にパース できない • NotesJSONNavigator へセットしようとすると、エラーコード:4842 「Unable to

    Parse JSON string: Missing comma or ‘}’ after object member. offset ??」でエラーとなる ➢Notes 10.0.1 FP2、Notes V11 Beta1、HCL Nomad 1.0.4 で不具合を確 認 ➢回避する方法あり〼(下表) エラーとなるコード 回避するコード set req = ss.CreateHTTPRequest() req.Preferstrings = True json = req.Post( url, body ) Set nav = ss.Createjsonnavigator( json ) ‘ここでエラー set req = ss.CreateHTTPRequest() req.Preferjsonnavigator = True Set nav = req.Post( url, body )