DrupalとAmazon OpenSearch Serviceを接続する

概要 DrupalとAmazon OpenSearch Serviceを接続する機会がありましたので、その備忘録です。以下の記事が参考になりました。 https://www.acquia.com/jp/blog/intergration-with-drupal-and-elasticsearch モジュールのインストール drupal/search_apiとdrupal/elasticsearch_connectorに加えて、nodespark/des-connectorをインストールする必要がありました。 (バージョンの指定方法など、改善の余地があるかもしれません。) composer require "nodespark/des-connector:^7.x-dev" composer require 'drupal/search_api:^1.29' composer require "drupal/elasticsearch_connector ^7.0@alpha" 続けて、以下で有効化します。 drush pm:enable search_api elasticsearch_connector DrupalをElasticsearchに接続する クラスタ 以下にアクセス /admin/config/search/elasticsearch-connector 「Add cluster」をクリックします。 そして、以下のように値を入力します。Amazon OpenSearch ServiceでBasic認証をかけている方法を前提としています。注意点として、「Server URL」に入力する値の末尾に、:443が必要でした。 Elasticsearchサーバーへの接続が成功すると、Cluster Statusに yellow や green と表示されます。 インデックス 次に、任意の作業ですが、インデックスを作成します。「Add index」ボタンを押して、nameだけ入力してみます。結果、以下のようにインデックスが作成されました。 Search APIの設定 今度は、Search API側の設定を行います。以下にアクセスします。 /admin/config/search/search-api サーバの追加 「Add Server」ボタンを押します。特に、BackendにElasticsearchを選択して、Clusterに先程作成したクラスタを選択します。 インデックスの追加 以下の画面には出ていませんが、「Datasources」のところで、「Content」を選択しています。また「Server」で、上記で作成したサーバを選択しています。 次に、末尾の「Save and add fields」ボタンをクリックします。 フィールドの追加 今回は最低限のフィールドとして、Titleを追加しておきます。 追加したフィールドに対するFulltext検索を可能とするために、「Type」を変更します。これらの設定は適宜変更してください。 再インデクシング 「Save changes」を押すと、以下のように、reindexingへのリンク(黄色)が表示されます。 ...

2023年4月13日 · 更新: 2023年4月13日 · 1 分 · Nakamura

DrupalでGraphQLを試す

概要 DrupalでGraphQLを試してみましたので、その備忘録です。以下の文書が参考になりました。 https://drupal-graphql.gitbook.io/graphql/ Amazon LightsailにインストールされたDrupalを前提とします。 モジュールのインストール 以下のモジュールをインストールします。 https://www.drupal.org/project/graphql ただし、以下のモジュールを事前にインストールする必要がありました。 https://www.drupal.org/project/typed_data 結果、以下により、インストールができました。 cd /home/bitnami/stack/drupal composer require 'drupal/typed_data:^1.0@beta' composer require 'drupal/graphql:^4.4' GUIからのモジュールインストール 関連する以下の3つのモジュール全てにチェックを入れて、インストールしました。 設定 以下にアクセスします。 /admin/config/graphql 「Create server」で、以下のように設定しました。test_serverという名前にしました。 Explore 以下にアクセスします。 /admin/config/graphql/servers/manage/test_server/explorer 以下のような画面に遷移します。 以下のクエリを投げてみます。 { articles { total } } 以下のような結果が得られます。 { "data": { "articles": { "total": 5054 } } } まとめ 今後、独自のスキーマを用いた使用方法についても調査してみたいと思います。参考になりましたら幸いです。

2023年4月12日 · 更新: 2023年4月12日 · 1 分 · Nakamura

StrapiにGraphQLを追加する

概要 以下の記事で、StrapiをAmazon Lightsail上に立ち上げました。 今回は、GraphQLを追加して、使用してみます。 GraphQLプラグインのインストール 以下を実行しました。backendなどのパスは適宜読み替えてください。 cd /opt/bitnami/apache2/htdocs/backend yarn add @strapi/plugin-graphql そして、アプリを起動します。 yarn develop そして、/graphqlにアクセスすると、以下のような画面が表示されます。 今回、servicesというコンテンツタイプを作成し、titleというフィールドを作成済みでした。なので、以下のようなクエリを発行することで、その一覧やメタデータを取得できました。 # Write your query or mutation here query getServices { services { data { id attributes { title createdAt updatedAt } } } } 以下が結果です。 { "data": { "services": { "data": [ { "id": "1", "attributes": { "title": "Cultural Japan", "createdAt": "2023-04-10T21:59:08.768Z", "updatedAt": "2023-04-10T21:59:12.752Z" } } ] } } } まとめ 次は、Next.jsなどとの連携を試してみたいと思います。

2023年4月12日 · 更新: 2023年4月12日 · 1 分 · Nakamura

Google Colabを用いたNDL古典籍OCRチュートリアルの不具合の修正および機能追加を行いました。

概要 以下の記事で紹介している、Google Colabを用いたNDL"古典籍"OCRアプリのチュートリアルを作成しています。 今回、以下の更新を行いました。 利用条件の追加 不具合の修正 IIIF Presentation API v3のマニフェストファイルの入力への対応 更新したノートブックは、これまでと同じ以下のURLでアクセスいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/NDL古典籍OCRの実行例.ipynb 利用条件の追加 ノートブック自体はCC0でご利用ください。ただし、「NDL古典籍OCRアプリケーション」は国立国会図書館がCC BY 4.0ライセンスで公開するものですので、クレジットの表示をお願いいたします。また、OCR適用対象の資料の利用条件などについても、それぞれご確認ください。 不具合の修正 OCR結果が出力されない不具合が発生していました。また、ライブラリのインストールにも長い時間がかかるようになっていました。これらの2点を修正しています。 IIIF Presentation API v3のマニフェストファイルの入力への対応 これまで、IIIF Presentation API v2のマニフェストファイルの入力のみに対応していました。 今回、v3への対応を行いました。この検証にあたり、以下の記事で紹介したIIIF Presentation API v3のマニフェストファイルを使用しました。 まとめ この間、不具合が発生しており申し訳ありません。NDL古典籍OCRの活用に役立つことができれば幸いです。

2023年4月12日 · 更新: 2023年4月12日 · 1 分 · Nakamura

Omeka Sを用いて、IIIF Presentation API v3のマニフェストファイルを作成する

概要 IIIF Presentation API v3のマニフェストファイルを作成する必要がありましたので、Omeka Sを用いて作成する方法について紹介します。 Omeka SとIIIF Serverモジュールのインストール 以下などを参考にインストールしてください。 https://zenn.dev/nakamura196/books/f4f87f9730e12e Omeka Sでのアイテム作成 今回は国立国会図書館で公開されている、以下の画像を対象にします。 https://dl.ndl.go.jp/api/iiif/2585098/R0000003/full/full/0/default.jpg アイテムの新規作成を行い、適当なタイトルを与えます。 次に、「メディア」タブを選択して、続けて、画面右のメニューで「URL」を選択します。そして、「URL」に画像のURLを入力します。 そして、画面右上の「追加」ボタンをクリックして、アイテムを登録します。 IIIFマニフェスト 今回は、https://omekas.aws.ldas.jp/omeka4/というサイトに対してアイテムを作成し、Omekaの内部IDとして19が与えられました。 v2 このとき、以下のURLでIIIF Presentation API v2のマニフェストファイルにアクセスできます。 https://omekas.aws.ldas.jp/omeka4/iiif/19/manifest またはAPIのバージョン/2を追加して、以下のURLでもアクセスできます。 https://omekas.aws.ldas.jp/omeka4/iiif/2/19/manifest v3 上記の/2となっている箇所を/3に変更することで、IIIF Presentation API v3のマニフェストファイルにアクセスできます。 https://omekas.aws.ldas.jp/omeka4/iiif/3/19/manifest または、IIIF Serverモジュールの設定画面において、デフォルトのバージョンを3に変更することで、バージョンを指定しない場合に、v3のマニフェストファイルが生成されます。 まとめ IIIF Presentation API v3(および Image API v3)の生成において、参考になりました幸いです。

2023年4月12日 · 更新: 2023年4月12日 · 1 分 · Nakamura

Pythonを使ってDrupalのタクソノミーの登録とコンテンツへの追加

概要 以下のシリーズの続きです。 今回は、タクソノミーの登録とコンテンツへの追加を行います。 タクソノミーの登録 事前に、ne_classというタクソノミーをGUIを通じて作成しました。以下のようなURLで一覧できます。 /jsonapi/taxonomy_term/ne_class 以下、新しいタクソノミーを登録するプログラムです。host, username, passwordは適宜設定してください。 payload = { "data": { "type": "taxonomy_term--ne_class", "attributes": { "name": "干瀬", } } } _type = "ne_class" url = f"{host}/jsonapi/taxonomy_term/{_type}" r = requests.post(url, headers=headers, auth=(username, password), json=payload) r.json() 以下のような結果が得られます。 {'jsonapi': {'version': '1.0', 'meta': {'links': {'self': {'href': 'http://jsonapi.org/format/1.0/'}}}}, 'data': {'type': 'taxonomy_term--ne_class', 'id': '17c70bd6-e6fc-46e2-bb5d-2377ba9c8ab8', ... コンテンツへの追加 事前に、PlaceというコンテンツタイプをGUIを通じて作成しました。また、field_ne_classを作成して、上記のタクソノミーne_classを値の候補として設定しました。 relationshipsのidに先程取得したタクソノミーのidを指定しています。 payload = { "data": { "type": "node--place", "attributes": { "title": "xxx" }, "relationships": { "field_ne_class": { "data": { "type": "taxonomy_term--ne_class", "id": "17c70bd6-e6fc-46e2-bb5d-2377ba9c8ab8", } } } } } _type = "place" url = f"{host}/jsonapi/node/{_type}" r = requests.post(url, headers=headers, auth=(username, password), json=payload) r.json() まとめ タクソノミーの追加やコンテンツへの関連付けも機械的に行うことができそうです。他のよりよい方法もあるかと思いますが、参考になりましたら幸いです。 ...

2023年4月11日 · 更新: 2023年4月11日 · 1 分 · Nakamura

Pythonを使ってDrupalのコンテンツを更新・削除する

概要 以下の記事で、コンテンツの新規登録の方法を記載しました。 今回は、既存のコンテンツの更新・削除を試みます。 アイテムの絞り込み 以下のようなプログラムにより、登録済みのコンテンツを取得することができます。今回は、titleが「更新前のタイトル」のコンテンツを取得しました。res["data"]は配列になります。 username = "xxx" password = "xxx" host = "xxx" query = { "title": "更新前のタイトル" } item_type = "article" filters = [] for key, value in query.items(): filters.append(f'filter[{key}]={value}') filter_str = '&'.join(filters) endpoint = f'{host}/jsonapi/node/{item_type}?{filter_str}' r = requests.get(endpoint, headers=headers, auth=(username, password)) res = r.json() len(res['data']) 更新対象のコンテンツのID取得 730f844d-b476-4485-8957-c33fccb7f8acのようなIDが得られます。 item = res['data'][0] item_id = item['id'] 更新 typeとidを指定して更新します。 ...

2023年4月11日 · 更新: 2023年4月11日 · 1 分 · Nakamura

Pythonを使ってDrupalにコンテンツを追加する

概要 Pythonを使ってDrupalにコンテンツを追加する機会がありましたので、その備忘録です。以下の記事を参考にしました。 https://weimingchenzero.medium.com/use-python-to-call-drupal-9-core-restful-api-to-create-new-content-9f3fa8628ab4 Drupalの準備 Amazon Lightsailに作成しました。以下の記事などが参考になります。 https://annai.co.jp/article/use-aws-lightsail モジュール 以下をインストールします。 HTTP Basic Auth JSON:API RESTful Web Services Serialization JSON:APIの設定変更 以下にアクセスして、設定を変更します。 </admin/config/services/jsonapi> Python {ipアドレス or ドメイン名}、{パスワード}を適宜設定してください。 Amazon Lightsailの場合、初期ユーザ名はuserです。またパスワードは以下のコマンドで確認します。 cat ~/bitnami_application_password import requests from requests.auth import HTTPBasicAuth endpoint = 'http://{ipアドレス or ドメイン名}/jsonapi/node/article' u = 'user' p = '{パスワード}' headers = { 'Accept': 'application/vnd.api+json', 'Content-Type': 'application/vnd.api+json' } payload = { "data": { "type": "node--article", "attributes": { "title": "What's up from Python", "body": { "value": "Be water. My friends.", "format": "plain_text" } } } } r = requests.post(endpoint, headers=headers, auth=(u, p), json=payload) r.text その他 以下のようにnote_typeの登録も試みました。 payload = { "data": { "type": "node_type--node_type", "attributes": { "title": "テスト", "description": "node_typeのテストです。" } } } url = f"{host}/jsonapi/node_type/node_type" r = requests.post(url, headers=headers, auth=(username, password), json=payload) r.json() 結果、以下のように、Method Not Allowedとなりました。 ...

2023年4月11日 · 更新: 2023年4月11日 · 1 分 · Nakamura

Amazon LightsailでStrapiを動かす(SSL, 独自ドメイン)

概要 Amazon LightsailでStrapiを動かす機会がありましたので、その備忘録です。以下の記事を参考にしました。 https://zenn.dev/holykzm/articles/1e54cc25207657 インスタンス Node.jsを選択します。 メモリは1GB以上のものを選択してください。Lightsail上でビルドする場合、メモリ不足でエラーが発生します。 SSL、独自ドメイン 以下を参考にしてください。 https://zenn.dev/nakamura196/articles/5772d6c918508a#独自ドメインの付与 Static IPを付与して、Route 53で独自ドメインを設定し、以下を実行します。 sudo /opt/bitnami/bncert-tool ProxyPassの設定 (より適切な記述箇所があるかと思いますが、)以下を追記します。 /opt/bitnami/apache2/conf/httpd.conf # 末尾に以下を追加 ProxyPass / http://localhost:1337/ ProxyPassReverse / http://localhost:1337/ apacheの再起動 sudo /opt/bitnami/ctlscript.sh restart apache Strapi のインストール cd /opt/bitnami/apache2/htdocs/ npx create-strapi-app@latest backend --quickstart アプリが起動するので、Ctrl+Cなどで一旦停止します。 pm2 pm2のインストール sudo npm install pm2 -g server.jsの作成 cd /opt/bitnami/apache2/htdocs/backend vi server.js /opt/bitnami/apache2/htdocs/backend/server.js const strapi = require('@strapi/strapi'); strapi(/* {...} */).start(); ビルド cd /opt/bitnami/apache2/htdocs/backend NODE_ENV=production npm run build サーバの起動 NODE_ENV=production pm2 start server.js --name strapi 以下のように、strapiを起動できました。 ...

2023年4月11日 · 更新: 2023年4月11日 · 1 分 · Nakamura

【Omeka S テーマ開発】Bootstrap 5を用いたOmeka Sテーマを更新しました。

Bootstrap 5を用いたOmeka Sテーマを以下で公開しています。 https://github.com/ldasjp8/Omeka-S-theme-Bootstrap5 今回ご提案をいただき、以下に示すような作成日/更新日を追加しました。 また以下のように、Omeka Sのversion 4が公開されましたので、そちらに対応しました。 https://forum.omeka.org/t/omeka-s-version-4-0-0/16502 ただ、version 3からversion 4への更新にあたり、両versionで共通に使用できないメソッドが存在したため、version 3向けのリリースと、version 4向けのリリースをそれぞれ作成しました。 version 3向け https://github.com/ldasjp8/Omeka-S-theme-Bootstrap5/releases/tag/3.0.0 version 4向け https://github.com/ldasjp8/Omeka-S-theme-Bootstrap5/releases/tag/4.0.0 今後、基本的にはversion 4向けに改修を加えていくことを考えていますが、参考になりましたら幸いです。

2023年4月10日 · 更新: 2023年4月10日 · 1 分 · Nakamura

IIIFを中心としたデジタルアーカイブ関連ツールを作成しました。

概要 IIIFを中心としたデジタルアーカイブ関連ツールを作成しました。以下のURLからお試しいただけます。 https://nakamura196.github.io/viewer/ 現在、以下の2つの機能を提供しています。 Mirador 3による画像比較 コマ数の指定ツール Mirador 3による画像比較 https://nakamura196.github.io/viewer/input 比較したいマニフェストファイルのURLやCanvasのURIを指定します。例などをお試しください。 以下のように、画像を比較することができます。 コマ数の指定ツール https://nakamura196.github.io/viewer/canvas IIIF対応のビューアにおいて、{url}?manifest={manifest}&canvas={canvas}のような形でコマ数を指定することが多いです。 ただこのcanvasのURIを取得するのが難しい場合があるため、マニフェストファイルとコマ数を指定すると、canvasのURIを自動取得するツールを作成しました。 必要項目を入力して「URLを作成」ボタンをクリックすると、canvasのURIを含むURLが表示されます。わかりにくいと思いますので、画面下部の「例」などをお試しください。 まとめ IIIF Presentation APIのv2のみへの対応ですが、お役に立ちましたら幸いです。

2023年4月6日 · 更新: 2023年4月6日 · 1 分 · Nakamura

ExcelからRDFを作成する

概要 RDFデータの作成にあたり、Excelで作成したデータから、RDFデータに変換するPythonライブラリを試作しました。まだまだ中途半端な状態ですが、備忘録です。 ノートブック 以下のノートブックから試用いただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ExcelからRDFデータを作成する.ipynb 変換元のExcelデータ 以下のようなExcelファイルを作成します。 https://docs.google.com/spreadsheets/d/16SufG69_aZP0u0Kez8bisImGvVb4-z990AEPesdVxLo/edit#gid=0 上記の例では、「prefix」という名前のシートに、使用するprefixの情報をまとめています。 また、「target」というシートに、具体的なデータを入力しています。Omeka SのBulk Importの仕様を参考にして、言語ラベル「@ja」や、type「^^uri」などを指定します。 上記のデータの作成方法については、改めて説明ページを用意したいと思います。 変換処理 上記のノートブックを参考にしてください。prefixの情報を格納したシートと、処理対象のデータを含むシートを指定して、RDFデータへの変換処理を実施します。 まとめ 同様のニーズに答える既存のツールが多々あるかと思いますが、参考になりましたら幸いです。

2023年4月3日 · 更新: 2023年4月3日 · 1 分 · Nakamura

ShExファイルを作成してみる

概要 ShExは、wikipediaにおいて、以下のように説明されています。 Shape Expressionsは、Resource Description Frameworkを検証および記述するためのデータモデリング言語 このShExファイルの作成を試みましたので、その備忘録です。 shexファイルを作成する 今回、data/tmp/merged.ttlにあるRDFデータを起点とします。shexerを用いて、RDFデータからshexファイルを作成します。 pip install shexer RDFデータ内のクラスの一覧を取得する from rdflib import Graph input_nt_file = "data/tmp/merged.ttl" graph = Graph() graph.parse(input_nt_file, format="turtle") knows_query = """ SELECT DISTINCT ?cls WHERE { ?a a ?cls }""" qres = graph.query(knows_query) target_classes = [] for row in qres: target_classes.append(f"{row.cls}") target_classes 取得したクラスを対象に、処理を行う。 from shexer.shaper import Shaper from shexer.consts import NT, SHEXC, SHACL_TURTLE, TURTLE shaper = Shaper(target_classes=target_classes, input_format=TURTLE, graph_file_input=input_nt_file) output_file = "data/tmp/shapes.shex" shaper.shex_graph(output_file=output_file, acceptance_threshold=0.1) print("Done!") 結果、以下のようなshexファイルが作成されました。 :教育メタデータ { exp:指導要領コード IRI +; # 100.0 % # 12.307692307692308 % obj: IRI. Cardinality: {7} rdf:type [data:教育メタデータ] ; # 100.0 % schema:geo IRI +; # 100.0 % # 21.53846153846154 % obj: IRI. Cardinality: {1} # 12.307692307692308 % obj: IRI. Cardinality: {3} # 12.307692307692308 % obj: IRI. Cardinality: {6} # 10.76923076923077 % obj: IRI. Cardinality: {2} exp:学年 @:学年 +; # 100.0 % # 21.53846153846154 % obj: @:学年. Cardinality: {5} # 16.923076923076923 % obj: @:学年. Cardinality: {1} # 10.76923076923077 % obj: @:学年. Cardinality: {6} # 10.76923076923077 % obj: @:学年. Cardinality: {4} # 10.76923076923077 % obj: @:学年. Cardinality: {3} exp:教科 @:教科 +; # 100.0 % # 18.461538461538463 % obj: @:教科. Cardinality: {8} # 15.384615384615385 % obj: @:教科. Cardinality: {3} # 12.307692307692308 % obj: @:教科. Cardinality: {6} # 12.307692307692308 % obj: @:教科. Cardinality: {4} # 10.76923076923077 % obj: @:教科. Cardinality: {5} rdfs:label xsd:string ; # 100.0 % exp:学習指導案 IRI ; # 100.0 % exp:時代 @:時代 *; # 96.92307692307692 % obj: @:時代. Cardinality: + # 23.076923076923077 % obj: @:時代. Cardinality: {2} # 15.384615384615385 % obj: @:時代. Cardinality: {1} # 15.384615384615385 % obj: @:時代. Cardinality: {3} # 13.846153846153847 % obj: @:時代. Cardinality: {4} # 12.307692307692308 % obj: @:時代. Cardinality: {6} ... shexをTurtle形式に変換する ここから、上記で作成したshexファイルをTurtle形式に変換してみます。 ...

2023年4月3日 · 更新: 2023年4月3日 · 3 分 · Nakamura

w3id.orgを用いた永続識別子の取得とSnorqlへのリダイレクト

概要 以下のようなRDFデータの公開ページを作成しました。 https://sukilam-educational-metadata.github.io/ 特に、以下のページから、SPARQLおよびSnorqlを用いたRDFデータに対する検索を行うことができます。Snorqlの利用にあたっては、「Snorql for Japan Search」を利用させていただいています。画面下部のクエリ例からお試しください。 https://sukilam-educational-metadata.github.io/snorql/ 本ページの公開にあたり、w3id.orgを用いた永続識別子の取得とSnorqlへのリダイレクトを行いましたので、その備忘録です。 SPARQLエンドポイントの準備 Dydraを用いてSPARQLエンドポイントを構築しました。 Snorqlの準備 Snorql for Japan Searchについては、以下を参考にしてください。 https://www.kanzaki.com/works/ld/jpsearch/snorql_ldb-about Snorqlのダウンロードについては、以下などを参考にしてください。 https://nakamura196.pages.dev/ja/posts/6b7c5484b2f161/#snorqlの設定 またSnorqlのカスタマイズ方法については、以下などを参考にしてください。 公開ページの準備 今回は、GitHub Pagesを用いた公開ページの作成を行いました。まず、以下の組織アカウントを作成しました。 https://github.com/sukilam-educational-metadata そして以下のリポジトリを作成しました。 https://github.com/sukilam-educational-metadata/sukilam-educational-metadata.github.io GitHub Pagesを有効にすることで、以下URLから公開ページにアクセスできます。 https://sukilam-educational-metadata.github.io/ 先に準備したSnorqlも設定することで、以下のURLから、Snorqlにアクセスできます。 https://sukilam-educational-metadata.github.io/snorql/ w3id.orgを用いた永続識別子の取得 最後に、w3id.orgを用いた永続識別子の取得について説明します。w3id.orgの使用にあたっては、以下などを参考にしました。 https://www.jstage.jst.go.jp/article/jkg/68/7/68_361/_pdf まず、以下のサイトをForkします。 https://github.com/perma-id/w3id.org そして、以下のプルリクエストを送りました。 https://github.com/perma-id/w3id.org/pull/3126/files 以下のように記述することで、https://w3id.org/sukilam-educational-metadata/学年/小6にアクセスすると、https://sukilam-educational-metadata.github.io/snorql/?describe=https://w3id.org/sukilam-educational-metadata/学年/小6に転送されます。 RewriteRule ^(.*) https://sukilam-educational-metadata.github.io/snorql/?describe=https://w3id.org/sukilam-educational-metadata/$1 [R=302,L] (※この記述内容については、改善の余地が多いと思います。) 考察 Snorql(SPARQLエンドポイント)を用いたリダイレクトを行うことで、URI毎のページを動的に生成できることが利点です。一方、SPARQLエンドポイント(今回はDydra)に依存することになります。したがって、より安定した長期的な運用を目指す場合には、URI毎に静的なページを用意する方法のほうが適していると考えられます。 用途や運用環境に応じて、適切な手段を選択するのがよさそうです。 まとめ RDFやLODの公開にあたり、本取り組みが参考になりましたら幸いです。

2023年4月2日 · 更新: 2023年4月2日 · 1 分 · Nakamura

vue3とbabylon.jsの双方向のやりとり例(その2)

概要 以下の記事で、vue3とbabylon.jsのやりとりを行うプログラムを作成しました。 今回は上記の発展版として、sceneに渡すmeshをvueから指定しています。以下のリンク先で内容をご確認いただけます。(途中、meshをうまく削除できていない箇所があります。今後修正予定です。) https://youtu.be/-dyQp-QX42I デモサイト https://nakamura196.github.io/nuxt3-babylonjs/10 ソースコード https://github.com/nakamura196/nuxt3-babylonjs/blob/main/pages/10/index.vue まとめ 参考になりましたら幸いです。

2023年3月29日 · 更新: 2023年3月29日 · 1 分 · Nakamura

Nuxt3 x babylon.jsで.glbファイルをロードする

概要 Nuxt3 x babylon.jsにおいて、.glbファイルのロードを試みた際にエラーが発生しましたので、その備忘録です。 エラーの内容 以下のエラーが発生しました。 Unable to load from ./models/test.glb: importScene of undefined from undefined version: undefined, exporter version: undefinedimportScene has failed JSON parse 対応内容 以下を追加でインストールすることで対応できました。 npm install @babylonjs/loaders 結果、以下のようなjsファイルで表示することができました。 import { Engine, Scene, FreeCamera, Vector3, HemisphericLight, SceneLoader, } from "@babylonjs/core"; import "@babylonjs/loaders/glTF"; const myScene = { engine: null, scene: null, // シーンを作成する関数 createScene: function (canvas) { // エンジンとシーンの初期化 const engine = new Engine(canvas); const scene = new Scene(engine); myScene.engine = engine; myScene.scene = scene; // カメラの設定 const camera = new FreeCamera("camera1", new Vector3(0, 5, -10), scene); camera.setTarget(Vector3.Zero()); camera.attachControl(canvas, true); // 光源の設定 new HemisphericLight("light", Vector3.Up(), scene); // GLBモデルの読み込み SceneLoader.Append( "./models/", "test.glb", scene, function (/*newMeshes*/) { // const mesh = scene.meshes[0]; // シーン内のカメラとライトを作成または更新 scene.activeCamera = null; scene.createDefaultCameraOrLight(true); scene.activeCamera.attachControl(canvas, false); } ); // レンダリングループ engine.runRenderLoop(() => { scene.render(); }); }, }; export default myScene; まとめ 同様のエラーでお困りの方の参考になりましたら幸いです。 ...

2023年3月29日 · 更新: 2023年3月29日 · 1 分 · Nakamura

vue3とbabylon.jsの双方向のやりとり例

概要 vue3とbabylon.jsの双方向のやりとりを行うプログラムを試作しました。以下のリンク先で内容をご確認いただけます。 https://youtube.com/shorts/BIdj-3T2_z8 デモサイト https://nakamura196.github.io/nuxt3-babylonjs/9 ソースコード https://github.com/nakamura196/nuxt3-babylonjs/blob/main/pages/9/index.vue まとめ 参考になりましたら幸いです。

2023年3月29日 · 更新: 2023年3月29日 · 1 分 · Nakamura

IIIF Curation Viewerのアノテーションの色を変更する

概要 IIIF Curation Viewerで付与したアノテーションの色を変更したい、というご要望をいただいたので、その方法の一例を紹介します。 アノテーションのマーカーの種類に関する説明は以下などにまとめられています。 http://codh.rois.ac.jp/software/iiif-curation-viewer/annotation.html#マーカーの種類 JSONデータを手動または機械的に修正して実現することも可能ですが、今回はGUIを使った変更方法をご紹介します。 動画 作業の流れを動画にしました。参考にしてください。『百鬼夜行図』(東京大学総合図書館所蔵)を使用しています。 https://www.youtube.com/watch?v=fbfdQVxHTgs 作業内容 IIIF Curation Viewerでアノテーションを付与する この部分までは、以下の記事などを参考に進めてください。 https://zenn.dev/nakamura196/books/f4f87f9730e12e 結果、以下のように、青色の矩形でアノテーションが表示されます。この矩形の色を変更してみます。 独自ツールを用いた編集 矩形の色の変更にあたり、独自のツールを作成しました。以下のURLから編集画面にアクセスできます。 https://ndl-ocr.vercel.app/icv Curation URIを入力すると、以下のような編集画面に遷移します。 https://ndl-ocr.vercel.app/icv/editor?curation=https://mp.ex.nii.ac.jp/api/curation/json/bfb7d80e-4e51-44fb-97d2-94e7c5acb2fd まず、「1. ダウンロード」を押して、編集前のデータをローカルにダウンロードしてください。念の為、以後の作業前のデータをバックアップしておきます。 次に、動画を参考に、以下のように、ColorやCharsを編集します。 そして、「3. コピー」を押して、編集内容のjsonデータをコピーします。 あとは、動画を参考に、IIIF Curation Editorを開き、JSONデータを更新し、IIIF Curation Viewerのアノテーションモードで変更内容を確認します。以下のように、矩形に色が付き、charsに指定した文字列が合わせて表示されます。 まとめ IIIF Curation Viewerのアノテーションモードにおいて、矩形の色などを変更されたい場合の参考になりましたら幸いです。

2023年3月28日 · 更新: 2023年3月28日 · 1 分 · Nakamura

Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリ

概要 Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリを作成しました。以下でお試しいただけます。画像アップロードして、1分程度すると、OCR結果のテキストとJSONデータが表示されます。 https://huggingface.co/spaces/nakamura196/ndl_kotenseki_ocr 本アプリの作成にあたっては、以下の記事を参考にさせていただきました。 https://qiita.com/relu/items/e882e23a9bd07243211b 使い分け NDL古典籍OCRを試す環境として、Google Colabを用いたチュートリアルを別途用意しています。 上記では無料でGPUを使用することができるため、高速なOCR処理が可能です。一方、ノートブックの初回起動時に、関連するライブラリやモデルのダウンロードを行うため、4分程度のセットアップ時間がかかってしまう点等に課題があります。 一方、今回Hugging Face Spaceを用いた作成したアプリケーションでは、72時間連続して使用されない(2023年2月時点)限り、OCR処理を即座に実行することが可能です。さらに、Web APIによる利用も可能といった点が挙げられます。(APIによる利用については後述します。)ただし、無料枠ではGPUが使用できないため、1画像あたり1分程度の処理時間がかかる点が課題です。(有料枠でGPUを使用することもできます。) APIによる利用 APIによる利用例を試すことができるノートブックを用意しました。504 Gateway Time-outというエラーが発生してしまう場合もありますが、参考になりましたら幸いです。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/GradioのAPIを用いたNDL古典籍OCRの例.ipynb まとめ NDL古典籍OCRの精度(≠速度)を試してみる場合など参考になりましたら幸いです。

2023年3月27日 · 更新: 2023年3月27日 · 1 分 · Nakamura

NDL古典籍OCRをAmazon EC2のCPU環境で実行する

概要 NDL古典籍OCRをAmazon EC2のCPU環境で実行してみましたので、その備忘録です。高額になりがちなGPU環境を用意せずに実行できる点が利点ですが、1画像あたり30秒から1分程度の時間がかかりますので、ご注意ください。 本環境の構築にあたり、以下の記事を参考にしています。 https://qiita.com/relu/items/e882e23a9bd07243211b インスタンス クイックスタートのUbuntuを選択します。 インスタンスタイプについえは、t2.medium以上をおすすめします。それより小さいインスタンスだと、エラーが発生しました。 サーバ内での設定 sshでログインし、以下を実行します。 sudo apt-get update && sudo apt-get upgrade -y sudo apt -y install build-essential sudo apt -y install libgl1-mesa-dev libglib2.0-0 sudo apt -y install unzip sudo apt install -y python3-pip sudo apt install -y python3.10-venv python3 -m venv app source app/bin/activate pip install --upgrade pip git clone https://github.com/ndl-lab/ndlkotenocr_cli.git cd ndlkotenocr_cli vi requirements.txt requirements.txtを開き、scikit-imageのバージョンを除く。また、torchとtorchvisionを追加する。 click lmdb==1.2.1 natsort==7.1.1 nltk==3.6.6 numpy==1.22.4 albumentations==1.2.1 opencv-python==4.6.0.66 protobuf==3.19.6 pyyaml scikit-image # scikit-image==0.16.2 scipy==1.7.3 lightgbm==3.3.2 transformers==4.19.1 pandas==1.3.5 mmcls==0.23.1 mmdet==2.25.0 datasets==2.2.1 jiwer==2.3.0 wheel torch torchvision 引き続き以下を実行する。 ...

2023年3月27日 · 更新: 2023年3月27日 · 1 分 · Nakamura