ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
RSS English
Omeka Sのカスタムオントロジーを用いて作成した語彙を更新する

Omeka Sのカスタムオントロジーを用いて作成した語彙を更新する

概要 Custom Ontologyは、LOV、schema.org、W3Cといった標準的なオントロジーが利用できないときに、独自の語彙を追加することができるモジュールです。以下で使用方法を紹介しています。 https://nakamura196.hatenablog.com/entry/2021/07/24/235050 上記の記事では語彙の作成までを扱っていますが、既存の語彙の更新方法については扱っていませんでした。本記事では、既存の語彙の更新方法について説明します。 語彙の作成 例として、以下の語彙を作成します。 https://omekas.aws.ldas.jp/omeka4/ns/myprefix/ 上記にアクセスすると、以下のttlファイルがダウンロードされます。今回、myprefix:mySpecificPropertyという独自のプロパティを追加しています。 @prefix dcterms: <http://purl.org/dc/terms/> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#> . @prefix o: <http://omeka.org/s/vocabs/o#> . @prefix myprefix: <https://omekas.aws.ldas.jp/omeka4/ns/myprefix/> . <https://omekas.aws.ldas.jp/omeka4/ns/myprefix/> a owl:Ontology ; dcterms:title "My label" ; dcterms:description "A specific ontology for my documents." . myprefix:mySpecificProperty a rdf:Property ; rdfs:label "My specific property" ; rdfs:comment "A property to use for my specific documents." ; rdfs:domain o:Resource ; vs:term_status "experimental" . 語彙の更新 今回、myprefix:mySpecificPropertyのラベルを私のプロパティに変更してみます。 ...

Nuxt 3でLeaflet Marker Clusterを試す

Nuxt 3でLeaflet Marker Clusterを試す

Nuxt 3でLeaflet Marker Clusterを試す機会がありました。実装例は以下です。 https://nuxt3-demo-nine.vercel.app/map-cluster 本実装にあたり、以下のページを参考にさせていただきました。 https://codesandbox.io/s/ns238 ソースコードは以下です。 https://github.com/nakamura196/nuxt3-demo 2023年3月時点においては、POC(Proof of Concept)の段階のようです。参考になりましたら幸いです。

nbdevを使用する際の備忘録

nbdevを使用する際の備忘録

概要 Pythonでパッケージを作成する際、nbdevを使用しています。 https://nbdev.fast.ai/ nbdevは以下のように説明されています。 Write, test, document, and distribute software packages and technical articles — all in one place, your notebook. (機械翻訳) ソフトウェア パッケージや技術記事の作成、テスト、文書化、配布をすべて 1 か所のノートブックで行います。 本記事では、nbdevを使用する際の備忘録です。 インストール 以下のチュートリアルのページが参考になります。 https://nbdev.fast.ai/tutorials/tutorial.html 以下、かいつまんで流れを説明します。 関連するツールをインストールした後、GitHubリポジトリを作成し、クローンした先で以下を実行します。 nbdev_new その後、以下も実行しておきます。 nbdev_install_hooks そしてnbsフォルダの中の00_core.ipynbなどを編集して、本ノートブックの最後のセルにある以下を実行します。 import nbdev; nbdev.nbdev_export() その結果、Pythonモジュールが自動的に作成されます。 パッケージをインストールする 同一フォルダ内 以下を実行します。 pip install -e '.[dev]' 別のフォルダから 一例ですが、絶対パスを指定してインストールします。 例: /Users/hogehoge/tei_xml_tools の場合 pip install -e /Users/hogehoge/tei_xml_tools -eオプションを付けることで、開発中にパッケージに加えられた変更をすぐに使用できます。 ライブラリの使用 以下のように%を使用することで、開発中の内容を反映することができました。 # %load_ext autoreload %reload_ext autoreload %autoreload 2 from tei_xml_tools.core import * まとめ その他、ドキュメントのプレビューやpypiにアップロードを行うためのコマンドも提供されています。機会があれば、nbdevの使い方全般についても記事にしたいと思います。

Fuse.jsを使用した完全不一致検索の部分的な実現

Fuse.jsを使用した完全不一致検索の部分的な実現

概要 Fuse.jsはJavascript製の検索エンジンです。 https://fusejs.io/ フロントエンドのみで完結するアプリを作成する際の検索エンジンとして重宝しています。 今回、Fuse.jsを用いた完全不一致検索を実現するにあたり、クエリを工夫する必要があったため、その備忘録です。 高度な検索 Fuse.jsでは、完全・部分一致、部分不一致など、多様な検索が可能です。以下のページに記載があります。 https://fusejs.io/examples.html#extended-search また、以下の記事で日本語訳が公開されています。 https://qiita.com/Sashimimochi/items/4972b3dc333c6e5fb866#より高度な検索 ただし、完全不一致検索については、クエリを工夫する必要がありました。 完全不一致検索 例えば、labelというフィールドに「悪党」という文字列を持たない検索は、以下のようなクエリで部分的に実現できました。「悪党で始まらない」または「悪党で終わらない」を検索しています。 { "$or": [ { "label": "!^悪党" # 「悪党で始まらない」 }, { "label": "!悪党$" # 「悪党で終わらない」 } ] } ただし、上記のクエリは完全ではなく、「悪党と悪党」といった値を持つものも除外してしまう点に注意が必要です。 まとめ 誤った理解をしている点もありそうですが、参考になりましたら幸いです。

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

概要 これまで、Google Cloud PlatformやGoogle Colabを用いたNDL OCR及びNDL古典籍OCRのチュートリアルを作成してきました。 今回は、Amazon SageMaker Studioを用いたNDL古典籍OCRの実行方法について説明します。なお、今回の方法では、実行の際に費用が発生しますのでご注意ください。 Amazon SageMaker Studioの説明は以下です。 https://aws.amazon.com/jp/sagemaker/studio/ ドメインの設定など ドメインの設定などは以下の記事などを参考にしてください。 https://dev.classmethod.jp/articles/how-to-walk-around-amazon-sagemaker-studio-new-ui/ 今回は以下のように作成済みのユーザープロファイルから「起動」→「Studio」を選択したところから説明します。 Studioでの操作 ノートブックの起動方法はいくつかありますが、ここでは、「File」→「New」→「Notebook」で起動してみます。 その後、以下のようなダイアログが表示されるため、今回は「ml.g4dn.xlarge」を選択します。 !nvidia-smiを実行すると、Tesla T4が表示されます。 ノートブックの実行 以下のファイルをノートブックをダウンロードし、SageMakerにアップロードしてください。 https://github.com/nakamura196/ndl_ocr/blob/main/sagemaker_ndl_kotenseki_ocr.ipynb ノートブックの作成にあたっては、@blue0620さんのノートブックを参考にしています。 https://github.com/blue0620/NDLkotenOCR-GoogleColabVersion/blob/main/NDLkotensekiOCR_googlecolabversion.ipynb 上記からの大きな差分として、まず、以下を実行しています。これらを行わないと、ライブラリのインストール時に、error: command 'gcc' failed with exit status 1といったエラーが発生します。 !apt update !apt -y install build-essential !apt -y install libgl1-mesa-dev libglib2.0-0 以下のように、OCR処理が実行されます。 インスタンスの削除 実行後は、忘れずにインスタンスの削除を行います。例えば、画面左部の「Running Terminals and Kernels」から「Running Instances」にあるインスタンスをシャットダウンします。 まとめ Amazon SageMaker Studioを用いたNDL古典籍OCRの実行方法について説明しました。

【Babylon.js x Vue】click eventをvueにわたす

【Babylon.js x Vue】click eventをvueにわたす

概要 以下のように、Babylon.jsでクリックしたmeshの名前を取得する方法を調査しました。 以下のチュートリアルを参考にしました。 https://doc.babylonjs.com/communityExtensions/Babylon.js+ExternalLibraries/BabylonJS_and_Vue/BabylonJS_and_Vue_2#passing-data-from-babylonjs-to-vue-using-callbacks デモページは以下です。 https://nakamura196.github.io/nuxt3-babylonjs/8/ ページのソースコードは以下です。 https://github.com/nakamura196/nuxt3-babylonjs/blob/main/pages/8/index.vue 実装方法 以下の箇所で、createSceneにcallback変数を渡しています。fpsCallbackの名前は修正したほうがよいかもしれません。 https://github.com/nakamura196/nuxt3-babylonjs/blob/5c33d2e6bcd1681df17f3f12fea3cd68fc645157/components/Scene8.vue#L10-L13 そして、createScene関数において、onPointerDownの結果を渡すようにしています。 https://github.com/nakamura196/nuxt3-babylonjs/blob/5c33d2e6bcd1681df17f3f12fea3cd68fc645157/scenes/Scene8.js#L44-L49 まとめ よりよい実装方法があるかもしれませんが、参考になりましたら幸いです。

Babylon.jsでVueを使用するチュートリアルをNuxt3で試す

Babylon.jsでVueを使用するチュートリアルをNuxt3で試す

概要 以前、Babylon.jsとNuxt3を組み合わせたリポジトリを作成しました。 一方、Babylon.jsでVueを使用するチュートリアルが以下で公開されています。 https://doc.babylonjs.com/communityExtensions/Babylon.js+ExternalLibraries/BabylonJS_and_Vue 今回は、上記サイトにある以下のチュートリアルをNuxt3で実装しました。 https://doc.babylonjs.com/communityExtensions/Babylon.js+ExternalLibraries/BabylonJS_and_Vue/BabylonJS_and_Vue_2 デモサイトは以下です。 https://nakamura196.github.io/nuxt3-babylonjs/ ソースコードは以下です。 https://github.com/nakamura196/nuxt3-babylonjs チュートリアル Passing data from BabylonJS to Vue using callbacks (日本語訳)これは、最も冗長ですが、最も安全で、最も拡張性と再利用性のあるアプローチです。基本的には、BabylonJSのシーンコードでメソッドを作成し、それに応じてエクスポートすることで、Vueコンポーネントにインポートし、それぞれを呼び出すことができるようになります。 https://nakamura196.github.io/nuxt3-babylonjs/third/ Passing data from BabylonJS to Vue using an exposed Engine object (日本語訳)ここでの大きな変更は、createSceneメソッドがEngineとSceneオブジェクトを返すことで、それらがVueコンポーネントに公開され、コンポーネントが直接それらにアクセスできるようになったことです。この2つのオブジェクトは、後でアクセスできるようにVueコンポーネントに保存されます。その直後に、FPSの値を1秒ごとに親のApp.vueコンポーネントに送信するインターバルを作成します。BabylonJS EngineのオブジェクトからFPSの値を直接Vueコンポーネントに取り込みます。 Sending data from Vue to BabylonJS with loose coupling and without exposing the BabylonJS objects to Vue (日本語訳)すでに書いたように、アクセスや操作が必要なものすべてに、メソッドを作成するだけです。(中略)BabylonJSのシーンファイルを修正し、これらのメソッドをエクスポートして、Vueコンポーネントでインポートできるようにします。 https://nakamura196.github.io/nuxt3-babylonjs/4/ Sending data from Vue to BabylonJS and vice versa with an exposed BabylonJS Vector3 object (日本語訳)この例では、公開されたBabylonJSのオブジェクトを使った通信を紹介します。最後のメソッドでは、EngineとSceneオブジェクトを公開します。公開できるのは、ごくわずかです。例えば、Scene全体を公開するよりも、Vector3だけを公開する方が、はるかに良い方法です。 ...

Amazon LightsailにArchivesSpaceを立てる

Amazon LightsailにArchivesSpaceを立てる

概要 ArchivesSpaceは、アーカイブ、マニュスクリプト、デジタルオブジェクトを管理し、Webアクセスを提供するためのオープンソースのアーカイブス情報管理アプリケーションです。 https://archivesspace.org/ このArchivesSpaceをAmazon Lightsailに立てる機会がありましたので、その備忘録です。 以下のページにインストール方法が記載されています。 https://archivesspace.github.io/tech-docs/readme_implement.html インスタンス Ubuntu 20.04 LTSを選択しました。 以下のような記載がありましたが、2GBのメモリでは動作が重たかったため、4GBを選択しました。 At least 1024 MB RAM allocated to the application; at least 2 GB for optimal performance. インストール まず、ArchivesSpaceをダウンロードします。 cd /home/ubuntu/ sudo apt-get -y update sudo apt-get -y upgrade いったん確認が求められます。 sudo apt-get -y install openjdk-11-jdk # ダウンロード wget https://github.com/archivesspace/archivesspace/releases/download/v3.3.1/archivesspace-v3.3.1.zip -O /home/ubuntu/archivesspace-v3.3.1.zip # unzipのインストール sudo apt -y install unzip # 展開 unzip /home/ubuntu/archivesspace-v3.3.1.zip Solrのインストール cd /home/ubuntu/ # ダウンロード wget -O solr.tgz https://www.apache.org/dyn/closer.lua/lucene/solr/8.11.2/solr-8.11.2.tgz?action=download -O /home/ubuntu/solr-8.11.2.tgz tar zxf /home/ubuntu/solr-8.11.2.tgz cd /home/ubuntu/solr-8.11.2 # confフォルダの作成 mkdir -p /home/ubuntu/solr-8.11.2/server/solr/configsets/archivesspace/conf/ cp /home/ubuntu/archivesspace/solr/* /home/ubuntu/solr-8.11.2/server/solr/configsets/archivesspace/conf/ cd /home/ubuntu/solr-8.11.2 # コアの作成 bin/solr start bin/solr create -c archivesspace -d archivesspace MySQLのインストール sudo apt install -y mysql-server mysql-client sudo service mysql status sudo mysql -uroot 以下、ログイン後に実行 ...

Next.jsでジャパンサーチのウェブパーツを使う

Next.jsでジャパンサーチのウェブパーツを使う

概要 ジャパンサーチでは、ジャパンサーチ内で使われている画面の構成要素を、部品としてジャパンサーチ以外のウェブサイトでも利用できる機能であるウェブパーツを提供しています。 https://jpsearch.go.jp/static/developer/webparts/ja.html 今回、Next.jsで本機能を使用する機会がありましたので、その備忘録です。 使用例 以下のページでご確認いただけます。 https://jps-2023-next.vercel.app/jps ソースコード 以下で公開しています。 https://github.com/nakamura196/jps_2023_next 以下のように、Scriptタグを使ってjsファイルを読み込むことで、うまく表示させることができました。 <Layout> <Script src="https://jpsearch.go.jp/assets/js/wp.bundle.js"></Script> <Container sx={{ my: 5, }} > <p> 東京大学「総合図書館バーチャルミュージアム」を改変して作成しています。 </p> <div className="jps" data-lang="ja" data-cur={data}></div> </Container> </Layout> まとめ ジャパンサーチのウェブパーツを同様の環境でお使いになられる際の参考になりましたら幸いです。

ArchivematicaのAPIを試す(Storage Service API)

ArchivematicaのAPIを試す(Storage Service API)

概要 ArchivematicaのStorage Service APIについては、以下のページに記載があります。このAPIをいくつか使ってみましたので、その備忘録です。 https://www.archivematica.org/en/docs/archivematica-1.13/dev-manual/api/api-reference-storage-service/ 以下、ベーシック認証が求められた場合には、以下の情報をお使いください。 ユーザ名:demo パスワード:Nd4Ev3XJ PACKAGE A package is a bundle of one or more files transferred from an external service; for example, a package may be an AIP, a backlogged transfer, or a DIP. Each package is stored in a location. 以下のURLからAIPやDIPの一覧を確認することができます。デフォルトではXML形式のデータが返却されましたが、format=jsonを与えることで、JSON形式のデータをダウンロードできました。 http://18.215.157.75:8001/api/v2/file/?format=json { "meta": { "limit": 20, "next": null, "offset": 0, "previous": null, "total_count": 2 }, "objects": [ { "current_full_path": "/var/archivematica/sharedDirectory/www/AIPsStore/8dfd/b901/9cb1/44be/bfde/e872/15df/9813/test-8dfdb901-9cb1-44be-bfde-e87215df9813.7z", "current_location": "/api/v2/location/b9661f20-63fa-4843-98aa-05f8c6228c1e/", "current_path": "8dfd/b901/9cb1/44be/bfde/e872/15df/9813/test-8dfdb901-9cb1-44be-bfde-e87215df9813.7z", "encrypted": false, "misc_attributes": { }, "origin_pipeline": "/api/v2/pipeline/e395113a-2885-4163-bf5a-a2786dad948e/", "package_type": "AIP", "related_packages": [ "/api/v2/file/65f81712-399b-4edb-a1a7-1b841a738fc1/" ], "replicas": [ ], "replicated_package": null, "resource_uri": "/api/v2/file/8dfdb901-9cb1-44be-bfde-e87215df9813/", "size": 61495776, "status": "UPLOADED", "uuid": "8dfdb901-9cb1-44be-bfde-e87215df9813" }, { "current_full_path": "/var/archivematica/sharedDirectory/www/DIPsStore/65f8/1712/399b/4edb/a1a7/1b84/1a73/8fc1/test-8dfdb901-9cb1-44be-bfde-e87215df9813", "current_location": "/api/v2/location/f403aa21-749c-4d93-b71e-b95635d8ce14/", "current_path": "65f8/1712/399b/4edb/a1a7/1b84/1a73/8fc1/test-8dfdb901-9cb1-44be-bfde-e87215df9813", "encrypted": false, "misc_attributes": { }, "origin_pipeline": "/api/v2/pipeline/e395113a-2885-4163-bf5a-a2786dad948e/", "package_type": "DIP", "related_packages": [ "/api/v2/file/8dfdb901-9cb1-44be-bfde-e87215df9813/" ], "replicas": [ ], "replicated_package": null, "resource_uri": "/api/v2/file/65f81712-399b-4edb-a1a7-1b841a738fc1/", "size": 30175868, "status": "UPLOADED", "uuid": "65f81712-399b-4edb-a1a7-1b841a738fc1" } ] } package_typeがAIPとなっているリソースにアクセスしてみます。 ...

Nuxt3のSSRをVercelでホスティングする(+ CORSの有効化)

Nuxt3のSSRをVercelでホスティングする(+ CORSの有効化)

Nuxt3のSSRをVercelでホスティングする機会がありましたので、その備忘録です。 ビルド設定について、以下のように、Output Directoryを.output/serverに設定する必要がありました。 またCORSを有効化するにあたり、以下の記事が参考になりました。 https://vercel.com/guides/how-to-enable-cors 具体的には、プロジェクトのルートに以下のフォルダを置くことで対応できました。 { "headers": [ { "source": "/api/(.*)", "headers": [ { "key": "Access-Control-Allow-Credentials", "value": "true" }, { "key": "Access-Control-Allow-Origin", "value": "*" }, { "key": "Access-Control-Allow-Methods", "value": "GET,OPTIONS,PATCH,DELETE,POST,PUT" }, { "key": "Access-Control-Allow-Headers", "value": "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version" } ] } ] } 間違った記述もあるかもしれませんが、参考になりましたら幸いです。

Babylon.jsとNuxt3とVuetifyを組み合わせて使用する

Babylon.jsとNuxt3とVuetifyを組み合わせて使用する

Babylon.jsとNuxt3とVuetifyを組み合わせて使用する機会がありましたので、その備忘録です。 構築したサイトは以下でご確認いただけます。 https://nakamura196.github.io/nuxt3-babylonjs/ ソースコードは以下です。 https://github.com/nakamura196/nuxt3-babylonjs 今回の組み合わせでアプリを開発される際の参考になりましたら幸いです。

IIIF Presentation Validatorのローカル環境で利用方法

IIIF Presentation Validatorのローカル環境で利用方法

概要 IIIF Presentation Validatorは、その名の通り、IIIFプレゼンテーションAPIの検証を行うためのツールです。 https://presentation-validator.iiif.io/ 以下の記事で、その使い方を説明しています。 今回、以下の記事で紹介するIIIF Presentation API v3に対応したマニフェストファイルの作成にあたり、ローカル環境での検証が必要になりました。 そこで、本ツールのローカル環境へのインストールを行いましたので、その備忘録です。 インストールの方法 以下に説明がありますが、Step oneを実行するとうまくいきませんでした。(こちらのIssueも上がっていました。) https://github.com/IIIF/presentation-validator#local-installation そこで少し方法を変えて、以下のように実行することで、ローカル環境でうまく実行できました。 git clone https://github.com/IIIF/presentation-validator.git cd presentation-validator pip install -r requirements.txt python iiif-presentation-validator.py 上記により、localhost:8080 で本ツールが起動します。 ローカル環境のマニフェストファイルの検証方法 (よりよい方法があるかもしれませんが…) 検証したいマニフェストファイルを格納したディレクトリで、ローカルサーバを起動します。例えば、以下のように実行します。 python -m http.server これにより、localhost:8000 でローカルサーバが起動しますので、http://localhost:8000/manifest.jsonといったURLでマニフェストファイルにアクセスできます。 このURLを以下のようにツールに登録することで、マニフェストファイルの検証が可能です。 エラー等が生じた場合には、マニフェストファイルを編集して、再度上記の「Go!」ボタンをクリックすることで、再度検証することができます。 その他 以下のようなURLにアクセスすることによっても検証を行うことができます。この場合、検証結果はjsonで返却されます。 http://localhost:8080/validate?version=3.0&url=http://localhost:8000/manifest.json { "okay": 1, "warnings": [ ], "error": "", "errorList": [ { "title": "Resolve Error", "detail": "The manifest id (https://dl.ndl.go.jp/api/iiif/2585098/R0000003/full/full/0/default.jpg) should be the same as the URL it is published at (http://localhost:8000/manifest.json).", "description": "", "path": "/id", "context": "{ 'id': '...'}" } ], "url": "http://localhost:8000/manifest.json" } まとめ IIIFマニフェストファイルを検証する際の参考になりましたら幸いです。 ...

Google Colabを用いたNDL

Google Colabを用いたNDL

概要 Google Colabを用いたNDL"古典籍"OCRアプリを作成しました。以下のURLからお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/NDL古典籍OCRの実行例.ipynb NDL古典籍OCRの説明は以下です。 https://github.com/ndl-lab/ndlkotenocr_cli また、ノートブックの作成にあたっては、@blue0620さんのノートブックを参考にしています。ありがとうございます! https://twitter.com/blue0620/status/1617888733323485184 今回作成したノートブックでは、入力フォーマットの追加や、Googleドライブへの保存機能などを追加しています。 使い方 NDLOCRアプリの使い方とほぼ同様です。以下の動画を参考にしてください。 https://youtu.be/46p7ZZSul0o 工夫 工夫した点として、認識結果をIIIFマニフェストの形に変換し、Miradorビューアで閲覧できるようにしました。具体的には、以下のような出力が得られます。 後者のリンクをクリックすることで、以下のようなMiradorビューアが表示され、認識結果を確認することができます。 このIIIFマニフェストファイルも、Googleドライブに格納しています。 参考 NDLOCRのチュートリアルについては、以下を参考にしてください。

JPCOARスキーマを用いたxmlファイルのバリデーション

JPCOARスキーマを用いたxmlファイルのバリデーション

概要 JPCOARスキーマでは、XMLスキーマ定義を以下のリポジトリで公開してくださっています。スキーマの作成およびデータの公開を行っていただき、ありがとうございます。 https://github.com/JPCOAR/schema 本記事では、上記のスキーマを使ったxmlファイルのバリデーションを試してみたので、その備忘録です。(今回のようなバリデーションは初めてのため、不正確な用語や情報を含む可能性があります。申し訳ありません。) Google Colabのノートブックも用意しました。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/JPCOARスキーマを用いたxmlファイルのバリデーション.ipynb 準備 リポジトリのクローン cd /content/ git clone https://github.com/JPCOAR/schema.git ライブラリのインストール pip install xsd-validator xsdファイルのロード(v1) from xsd_validator import XsdValidator validator = XsdValidator('/content/schema/1.0/jpcoar_scm.xsd') v1を試す OKな例 <?xml version="1.0" ?> <jpcoar:jpcoar xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:jpcoar="https://github.com/JPCOAR/schema/blob/master/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://github.com/JPCOAR/schema/blob/master/1.0/jpcoar_scm.xsd"> <dc:title>JPCOARスキーマを用いたxmlファイルのバリデーション</dc:title> <dc:type rdf:resource="http://purl.org/coar/resource_type/c_6501">article</dc:type> </jpcoar:jpcoar> validator.assert_valid("/content/ok.xml") # エラーなし NGな例 dc:typeの後にjpcoar:subjectを置くことによるエラー? <?xml version="1.0" ?> <jpcoar:jpcoar xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:jpcoar="https://github.com/JPCOAR/schema/blob/master/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://github.com/JPCOAR/schema/blob/master/1.0/jpcoar_scm.xsd"> <dc:title>JPCOARスキーマを用いたxmlファイルのバリデーション</dc:title> <dc:type rdf:resource="http://purl.org/coar/resource_type/c_6501">article</dc:type> <jpcoar:subject subjectScheme="Other">テスト</jpcoar:subject> </jpcoar:jpcoar> validator.assert_valid("/content/ng.xml") XsdValidationErrorWithInfo: /content/ng.xml: line 9 column 41: cvc-complex-type.2.4.a: Invalid content was found starting with element ‘{"https://github.com/JPCOAR/schema/blob/master/1.0/":subject}’. One of ‘{"https://schema.datacite.org/meta/kernel-4/":version, “http://namespace.openaire.eu/schema/oaire/":version, “https://github.com/JPCOAR/schema/blob/master/1.0/":identifier, “https://github.com/JPCOAR/schema/blob/master/1.0/":identifierRegistration, “https://github.com/JPCOAR/schema/blob/master/1.0/":relation, “http://purl.org/dc/terms/":temporal, “https://schema.datacite.org/meta/kernel-4/":geoLocation, “https://github.com/JPCOAR/schema/blob/master/1.0/":fundingReference, “https://github.com/JPCOAR/schema/blob/master/1.0/":sourceIdentifier, “https://github.com/JPCOAR/schema/blob/master/1.0/":sourceTitle, “https://github.com/JPCOAR/schema/blob/master/1.0/":volume, “https://github.com/JPCOAR/schema/blob/master/1.0/":issue, “https://github.com/JPCOAR/schema/blob/master/1.0/":numPages, “https://github.com/JPCOAR/schema/blob/master/1.0/":pageStart, “https://github.com/JPCOAR/schema/blob/master/1.0/":pageEnd, “http://ndl.go.jp/dcndl/terms/":dissertationNumber, “http://ndl.go.jp/dcndl/terms/":degreeName, “http://ndl.go.jp/dcndl/terms/":dateGranted, “https://github.com/JPCOAR/schema/blob/master/1.0/":degreeGrantor, “https://github.com/JPCOAR/schema/blob/master/1.0/":conference, “https://github.com/JPCOAR/schema/blob/master/1.0/":file}’ is expected. ...

RELAX NGスキーマを操作するライブラリjingtrangを試す:rngファイルの作成編

RELAX NGスキーマを操作するライブラリjingtrangを試す:rngファイルの作成編

概要 以下の記事で、jingtrangおよびrngファイルを用いたxmlファイルの検証を行いました。 このjingtrangライブラリでは、xmlファイルからrngファイルを作成できるということで、試してみます。 Google Colabのノートブックも用意しました。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/jingtrangを試す:作成編.ipynb rngファイルを作成する rngファイルを作成する元ファイルとして、以下を用意しました。 <root><title>aaa</title></root> 上記のファイルに対して、以下を実行します。 pytrang base.xml base.rng 結果、以下のファイルが作成されました。 <?xml version="1.0" encoding="UTF-8"?> <grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <start> <element name="root"> <element name="title"> <data type="NCName"/> </element> </element> </start> </grammar> このrngファイルに対して、以下のようにテストしてみました。 OK:テキストが異なるもの <root><title>bbb</title></root> pyjing base.rng ex1.xml NG:titleがない <root><aaa>bbb</aaa></root> pyjing base.rng ex2.xml /content/ex2.xml:1:12: error: element "aaa" not allowed anywhere; expected element "title" /content/ex2.xml:1:28: error: element "root" incomplete; missing required element "title" NG: 属性がある <root><title lang="en">aaa</title></root> pyjing base.rng ex3.xml /content/ex3.xml:1:24: error: found attribute "lang", but no attributes allowed here まとめ 上記のような形で、あるxmlファイルから、rngファイルを作成することができました。rngファイルの記述方法についてはさらなる勉強が必要ですが、今回のような具体例から試行錯誤ができる仕組みは有効かと思います。 ...

RELAX NGスキーマを操作するライブラリjingtrangを試す:検証編

RELAX NGスキーマを操作するライブラリjingtrangを試す:検証編

概要 あるスキーマに従ったXMLファイルを作成する機会があったのですが、そのスキーマに合致したXMLファイルを作成できているか、確認する必要がありました。 上記の要件に対して、RELAX NGスキーマを操作するライブラリjingtrangを使ってみましたので、その備忘録です。 https://pypi.org/project/jingtrang/ Google Colabのノートブックも用意しました。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/jingtrangを試す.ipynb Validationを試す # ライブラリのインストール pip install jingtrang # rngファイルのダウンロード(tei_allを使用) wget https://raw.githubusercontent.com/nakamura196/test2021/main/tei_all.rng # validation対象のXMLファイルの用意(校異源氏物語テキストのダウンロード) wget https://kouigenjimonogatari.github.io/tei/01.xml OKな例 以下のように実行すると、何も出力されませんでした。 pyjing tei_all.rng 01.xml NGな例 一方、TEIのスキーマに合致しない以下のようなxmlファイルを用意しました。 <a>bbb</a> その実行結果は以下です。a要素ではなく、TEIまたはteiCorpus要素が必要と出力されました。このように、スキーマに合致するか否かのチェックができました。 pyjing tei_all.rng ng.xml /content/ng.xml:1:4: error: element "a" not allowed here; expected element "TEI" or "teiCorpus" (with xmlns="http://www.tei-c.org/ns/1.0") まとめ 無事に検証を行うことができました。 ただ今回のニーズはTEI/XMLの以外のスキーマに適合するかを検証する必要がありましたので、このrngファイルの作成方法や内容について、別の記事にまとめたいと思います。

OpenSeaに画像を登録してみる

OpenSeaに画像を登録してみる

概要 OpenSeaに画像を登録してみたので、その備忘録です。 作成したアイテムのページは以下です。 https://opensea.io/assets/ethereum/0x495f947276749ce646f68ac8c248420045cb7b5e/10640296615676167047199551942164304992363478966543389627838835760480269631489 OpenSeaへのアップロード OpenSeaへの画像のアップロードは簡単に行うことができました。 一方、それまでのMetaMaskやOpenSeaのアカウント作成などに少し時間がかかりました。この手順についてはたくさんの記事がありましたので、そちらを参考にしてください。 bitFlyerからMetaMaskへの送金 bitFlyerで保有して0.005ETHをMetaMaskへ送金しました。この送金手数料に0.005ETH($7.72, 990.48円)かかりました。(高い…笑) メタデータの凍結 編集画面の「凍結」メニューから、メタデータの凍結を試みました。この凍結にも以下のガス代がかかりました。 0.00185631883313057 Ether ($2.87) 凍結が完了したところ、以下のように、Metadataが「Frozen」と表示されます。 そのリンクをクリックしてみると、以下のjsonファイルがダウンロードされます。 { "image_url": "ipfs://bafybeic27xyqz2zk4bgqlyc7tpmvcl6itfmvkyw2jdnv2b757t3z7ifuby/image", "name": "kunshujo", "description": "『捃拾帖』九五(東京大学総合図書館所蔵)を改変", "external_url": "https://uv-v4.netlify.app/#?manifest=https://ipfs.io/ipfs/QmWMWHAwvPLinD8aDZf9HXfy14u3SNdZRTzbqgMQJ95Q3b" } さらにimage_urlの値から、URLにアクセス、またはIPFSのデスクトップアプリでbafybeic27xyqz2zk4bgqlyc7tpmvcl6itfmvkyw2jdnv2b757t3z7ifubyをBrowseすると、画像を閲覧することができました。 これらのメタデータ(json)および画像がIPFSで管理されていることが確認できます。 まとめ OpenSeaへの画像アップロードと、メタデータや画像の凍結について経験することができました。 デジタルアーカイブにおけるコンテンツ管理への応用に向けて、引き続き色々と試してみたいと思います。

Romaを用いてカスタマイズしたrngファイルを作成する:使用するTEIタグを限定する

Romaを用いてカスタマイズしたrngファイルを作成する:使用するTEIタグを限定する

概要 本記事では、Romaというウェブアプリケーションを用いて、 TEI ODD (One Document Does-it-all) のカスタマイズを試みます。 https://romabeta.tei-c.org/ TEI ODDについては、以下の公式サイトをご確認ください。勉強不足により、私自身も十分に理解できておりません。 https://wiki.tei-c.org/index.php/ODD ただ一つの用途として、TEIを用いたプロジェクトにおいて、使用する(具体的には、補助や検証を行う?)タグを限定することができます。 これにより、大量に用意されたTEIのタグに悩んでしまう、といった課題を軽減することができそうです。 今回は、以下で紹介した、ExcelからTEI/XMLを作成するフローで使用するタグを想定して、Romaを用いたodd/rngファイルのカスタマイズを行ってみます。 使用するタグ 本ユースケースでは、以下のタグを使用します。 テキスト関連 pb ab lb seg choice orig note reg 画像関連 facsimile surface label zone 上記のタグに限定したodd/rngファイルを作成します。 Romaの使用 Romaにアクセスします。 https://romabeta.tei-c.org/ 「SELECT ODD」において、「TEI Minimal」を選択してみます。 設定画面において、Titleなどを修正します。特に、Language関係の2項目を日本語に設定することをお勧めします。 例えばabタグなど、各プロジェクトで使用するタグのみを選択していきます。 編集が完了したら、「RelaxNG schema」を選択してダウンロードします。 合わせて「Customization as ODD」もダウンロードしておくことをお勧めします。このODDファイルをRomaのトップ画面のフォームからアップロードすることにより、追加の編集ができました。 XMLファイルへの追加 ダウンロードしたtei_excel.rngファイルを、編集対象とするXMLファイルと同じ階層に置いた場合には、以下のように<?xml-model ... ?>を追記します。 <?xml version="1.0" encoding="utf-8"?> <?xml-model href="tei_excel.rng" schematypens="http://relaxng.org/ns/structure/1.0" type="application/xml"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> ... </teiHeader> ... </TEI> 一方、githubなどのサーバにアップロードした場合には、以下のように、URLの形式で指定することもできます。 ...

Nuxt3のssrでIIIF viewerを導入する

Nuxt3のssrでIIIF viewerを導入する

概要 Nuxt3のssrでIIIF viewerを導入する方法の備忘録です。 Canvas Panel 以下のビューアの導入です。 https://iiif-canvas-panel.netlify.app/ インストール npm i @digirati/canvas-panel-web-components page 以下を参考にしてください。 https://github.com/nakamura196/nuxt3-iiif-viewer/blob/main/pages/canvas-panel/index.vue 表示例 https://nakamura196.github.io/nuxt3-iiif-viewer/canvas-panel Tify 以下のビューアの導入です。 https://github.com/tify-iiif-viewer/tify インストール npm i tify page 以下を参考にしてください。 https://github.com/nakamura196/nuxt3-iiif-viewer/blob/main/pages/tify/index.vue ssrの場合、document is not defined.のエラーが発生したため、pluginsに以下のファイルを追加しています。 https://github.com/nakamura196/nuxt3-iiif-viewer/blob/main/plugins/tify.client.js 表示例 https://nakamura196.github.io/nuxt3-iiif-viewer/tify まとめ 他のビューアについても適宜追加していきたいと思います。 導入方法について、誤りやよりよい方法があるかもしれませんが、参考になりましたら幸いです。