Amazon EC2にArchivematicaを立てる

概要 Archivematicaはデジタルデータの長期保存のためのオープンソースソフトウェアです。 https://www.archivematica.org/en/ このArchivematicaをAmazon EC2に立てる機会がありましたので、その備忘録です。 インストール 以下のページにインストール方法が記載されています。 https://www.archivematica.org/en/docs/archivematica-1.13/admin-manual/installation-setup/installation/installation/ いくつかの選択肢がありますが、今回は以下の「CentOS 7 64-bit、Installing Archivematica on CentOS/Red Hat」を試してみます。 https://www.archivematica.org/en/docs/archivematica-1.13/admin-manual/installation-setup/installation/install-centos/#install-pkg-centos EC2のインスタンス CentOS 7と指定されていましたので、以下のAmazon マシンイメージ(AMI)を選択しました。 以下にハードウェアの要件が記載されていますが、「Recommended minimum production requirements」であるメモリ4GBである「t2.medium」、200GBのストレージを選択しました。 https://www.archivematica.org/en/docs/archivematica-1.13/admin-manual/installation-setup/installation/installation/#hardware インストール EC2の起動後は、上記のサイトに記載されていたコマンドをすべて実行します。以下をコピー&ペーストすることがでインストールできます。 sudo yum -y update # Allow Nginx to use ports 81 and 8001 sudo semanage port -m -t http_port_t -p tcp 81 sudo semanage port -a -t http_port_t -p tcp 8001 # Allow Nginx to connect the MySQL server and Gunicorn backends sudo setsebool -P httpd_can_network_connect_db=1 sudo setsebool -P httpd_can_network_connect=1 # Allow Nginx to change system limits sudo setsebool -P httpd_setrlimit 1 sudo yum install -y epel-release sudo -u root rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch sudo -u root bash -c 'cat << EOF > /etc/yum.repos.d/elasticsearch.repo [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF' sudo -u root bash -c 'cat << EOF > /etc/yum.repos.d/archivematica.repo [archivematica] name=archivematica baseurl=https://packages.archivematica.org/1.13.x/centos gpgcheck=1 gpgkey=https://packages.archivematica.org/1.13.x/key.asc enabled=1 EOF' sudo -u root bash -c 'cat << EOF > /etc/yum.repos.d/archivematica-extras.repo [archivematica-extras] name=archivematica-extras baseurl=https://packages.archivematica.org/1.13.x/centos-extras gpgcheck=1 gpgkey=https://packages.archivematica.org/1.13.x/key.asc enabled=1 EOF' sudo -u root yum install -y java-1.8.0-openjdk-headless elasticsearch mariadb-server gearmand sudo -u root systemctl enable elasticsearch sudo -u root systemctl start elasticsearch sudo -u root systemctl enable mariadb sudo -u root systemctl start mariadb sudo -u root systemctl enable gearmand sudo -u root systemctl start gearmand sudo -H -u root mysql -hlocalhost -uroot -e "DROP DATABASE IF EXISTS MCP; CREATE DATABASE MCP CHARACTER SET utf8 COLLATE utf8_unicode_ci;" sudo -H -u root mysql -hlocalhost -uroot -e "DROP DATABASE IF EXISTS SS; CREATE DATABASE SS CHARACTER SET utf8 COLLATE utf8_unicode_ci;" sudo -H -u root mysql -hlocalhost -uroot -e "CREATE USER 'archivematica'@'localhost' IDENTIFIED BY 'demo';" sudo -H -u root mysql -hlocalhost -uroot -e "GRANT ALL ON MCP.* TO 'archivematica'@'localhost';" sudo -H -u root mysql -hlocalhost -uroot -e "GRANT ALL ON SS.* TO 'archivematica'@'localhost';" sudo -u root yum install -y python-pip archivematica-storage-service sudo -u archivematica bash -c " \ set -a -e -x source /etc/sysconfig/archivematica-storage-service cd /usr/lib/archivematica/storage-service /usr/share/archivematica/virtualenvs/archivematica-storage-service/bin/python manage.py migrate"; sudo -u root systemctl enable archivematica-storage-service sudo -u root systemctl start archivematica-storage-service sudo -u root systemctl enable nginx sudo -u root systemctl start nginx sudo -u root systemctl enable rngd sudo -u root systemctl start rngd sudo -u root yum install -y archivematica-common archivematica-mcp-server archivematica-dashboard sudo -u archivematica bash -c " \ set -a -e -x source /etc/sysconfig/archivematica-dashboard cd /usr/share/archivematica/dashboard /usr/share/archivematica/virtualenvs/archivematica/bin/python manage.py migrate "; sudo -u root systemctl enable archivematica-mcp-server sudo -u root systemctl start archivematica-mcp-server sudo -u root systemctl enable archivematica-dashboard sudo -u root systemctl start archivematica-dashboard sudo -u root systemctl restart nginx sudo -u root yum install -y archivematica-mcp-client sudo -u root sed -i 's/^#TCPSocket/TCPSocket/g' /etc/clamd.d/scan.conf sudo -u root sed -i 's/^Example//g' /etc/clamd.d/scan.conf sudo -u root systemctl enable archivematica-mcp-client sudo -u root systemctl start archivematica-mcp-client sudo -u root systemctl enable fits-nailgun sudo -u root systemctl start fits-nailgun sudo -u root systemctl enable clamd@scan sudo -u root systemctl start clamd@scan sudo -u root systemctl restart archivematica-dashboard sudo -u root systemctl restart archivematica-mcp-server sudo -u archivematica bash -c " \ set -a -e -x source /etc/default/archivematica-storage-service || \ source /etc/sysconfig/archivematica-storage-service \ || (echo 'Environment file not found'; exit 1) cd /usr/lib/archivematica/storage-service /usr/share/archivematica/virtualenvs/archivematica-storage-service/bin/python manage.py createsuperuser "; 最後のコマンドで、archivematica-storage-serviceのユーザを作成します。ユーザ名やパスワードを指定します。 ...

2023年2月8日 · 更新: 2023年2月8日 · 3 分 · Nakamura

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" } ] } ] } 間違った記述もあるかもしれませんが、参考になりましたら幸いです。

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

Headless CMSを使ってIIIFマニフェストファイルを作成する

概要 Headless CMSの学習のため、CMSに登録した情報からIIIFマニフェストを生成する試みを行いました。 以下がその結果です。(といっても、以下のアプリからはサーバ側の処理内容は見えないです。) https://iiif-headless-cms.vercel.app/ 本記事は上記の取り組みの備忘録です。 Contentful https://www.contentful.com/ 以下のようなiiifというContent modelを作成しました。画像データ(url, width, height)の紐付けには、フィールド「JSON object」と「Reference」が使用できそうでしたが、ここでは「Reference」を選択し、画像データの情報を管理するimageというContent modelを別途作成しました。 IIIFマニフェストの形式に変換して返却するAPIについては、Nuxt3を用いて作成しました。 https://github.com/nakamura196/iiif-headless-cms/blob/main/server/api/iiif/contentful/[id]/manifest.ts 以下のライブラリを使用することで、簡単に接続することができました。 https://www.npmjs.com/package/contentful microCMS https://microcms.io/ microCMSにおいても同様のスキーマ作成を行いました。 以下のような画像データを格納するカスタムフィールドを作成しました。 このカスタムフィールドを繰り返しありの形でiiifスキーマに追加することで、以下のように、画像に関する情報を格納できるようになりました。 スキーマをエクスポートしたデータは以下です。 { "apiFields": [ { "idValue": "ZRdeXxiWOB", "fieldId": "label", "name": "ラベル", "kind": "text", "isUnique": false }, { "fieldId": "image", "name": "画像", "kind": "repeater", "customFieldCreatedAtList": [ "2023-02-03T00:42:08.118Z" ] } ], "customFields": [ { "createdAt": "2023-02-03T00:42:08.118Z", "fieldId": "iiif_image", "name": "iiif画像に関するフィールド", "fields": [ { "idValue": "Y1B3C_tC1c", "fieldId": "url", "name": "URL", "kind": "text" }, { "idValue": "kS9afBRRHr", "fieldId": "width", "name": "幅", "kind": "number" }, { "idValue": "SpLhBEapVh", "fieldId": "height", "name": "高さ", "kind": "number" } ], "position": [ [ "Y1B3C_tC1c", "kS9afBRRHr", "SpLhBEapVh" ] ], "updatedAt": "2023-02-03T00:45:50.426Z", "viewerGroup": "H7Y" } ] } IIIFマニフェストの形式に変換する処理は以下です。 ...

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

Omeka Sへの画像一括登録用プログラム

概要 Omeka Sでメタデータ(Omeka用語でアイテム)や画像(Omeka用語でメディア)を一括する場合、Bulk Importモジュールなどを使用することが多いです。 https://github.com/Daniel-KM/Omeka-S-module-BulkImport 一方、Omeka Sが提供するREST APIを介して登録することも可能です。 今回は、本APIを用いた画像の一括登録用プログラムを作成しましたので、その紹介です。 開発した理由 最新のBulk Importモジュールでは、エラーが発生した際に、停止するか継続するか等を選択できますが、古いバージョンのモジュールでは、この設定ができません。そのため、画像を一括登録した際に、画像の取得に失敗する都度、その画像が抜けてしまうケースがありました。 そこで、上記への対応のため、APIを用いた画像の一括登録用プログラムを作成しました。 使い方 以下のノートブックでサンプルをご確認いただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/Omeka_Sへの画像一括登録用プログラム.ipynb まず、登録用のcsvファイルを作成します。本プログラムのIIIF画像の一括登録のみを対象としており、Media Urlには、IIIF画像のURL(info.jsonを含む)を指定します。 Item Identifier Media Url post_226 https://nakamura196.github.io/iiif_static/files/tile/kunshujo/info.json Google Colabで実行する場合には、csvファイルをアップロードします。 次にAPIの認証情報やエンドポイントのURLを設定します。 property_idの値については、上記csvのItem Identifierで指定した値をもつプロパティのIDを指定します。ここでは、dcterms:identifierを使用するため、そのOmekaの内部IDにあたる10を指定します。 処理内容 入力したcsvファイルと数の齟齬がある場合のみ、登録を行います。 例えば、アイテムに2件のメディアを紐づけるようにcsvファイルで指定されているにも関わらず、Omeka上では1件のメディアしか紐づいていないアイテムがあった場合、当該アイテムの紐づいたメディアを削除し、再度csvファイルの内容に基づいて登録します。 これにより、メディアの新規の一括登録や、登録漏れが発生していたメディアの修正等を行うことができます。 まとめ BulImport以外での画像の一括登録方法として、参考になりましたら幸いです。

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

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

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

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

IIIF Image API level 0による画像公開方法

概要 IIIF Image API level 0は、事前に作成した静的なタイル画像を用いて画像配信を行います。これにより、GitHub PagesやAmazon S3といった静的ファイルのホスティングサービスのみでの画像公開が可能となります。一方、任意の範囲の画像切り出しができないといった欠点も挙げられます。 本記事は、IIIF Image API level 0を用いた画像公開の一例について紹介します。 ツール 以下のノートブックでお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/IIIF_Image_API_静的ファイル作成ツール.ipynb 本ノートブックは、以下のスクリプトを参考にしています。 https://github.com/zimeon/iiif/blob/main/iiif_static.py 公開例 GitHub Pagesで公開するタイル画像を表示している例です。 https://www.kanzaki.com/works/2016/pub/image-annotator?u=https://nakamura196.github.io/iiif_static/files/tile/kunshujo/info.json まとめ 静的なファイルのみでIIIF Image API(のlevel 0)に対応する方法について紹介しました。 本手法の利点と欠点を考慮したうえで、ご活用いただけますと幸いです。

2023年1月30日 · 更新: 2023年1月30日 · 1 分 · Nakamura

app要素を含むTEI/XMLファイルに対して、編集距離を算出するプログラムを作成しました。

概要 app要素を含むTEI/XMLファイルに対して、編集距離を算出するプログラムを作成しました。 以下のGoogle Colabからご利用いただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/編集距離を算出するプログラム.ipynb XMLファイルをアップロードすると、witness間の類似度を算出します。 例 以下のXMLファイルをアップロードしてみます。 https://tei-eaj.github.io/koui/data/nakamura.xml 結果、以下のようなExcelファイルが得られます。witness間の類似度を一覧できます。 index name1 name2 distance ratio 0 中村式五十音 中村式五十音又様 10 0.85 1 中村式五十音 中村式五十音欠損本 7 0.8947368421052632 2 中村式五十音又様 中村式五十音欠損本 8 0.868421052631579 類似度の算出には、以下を使用しています。 https://pypi.org/project/python-Levenshtein/ まとめ テキストの比較方法については色々と検討の余地がありますが、witness間の定量的な比較の一例として参考になりましたら幸いです。 参考 以下で紹介している「二つのテキスト間の差分を抽出するプログラム」にも本機能を追加しました。

2023年1月26日 · 更新: 2023年1月26日 · 1 分 · Nakamura

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マニフェストファイルを検証する際の参考になりましたら幸いです。 ...

2023年1月25日 · 更新: 2023年1月25日 · 1 分 · Nakamura

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のチュートリアルについては、以下を参考にしてください。

2023年1月25日 · 更新: 2023年1月25日 · 1 分 · Nakamura

【Omeka S モジュール紹介】BulkExport:データの一括エクスポート

概要 Omeka Sでデータの一括エクスポートを行うためのモジュールとして、BulkExportがあります。 https://github.com/Daniel-KM/Omeka-S-module-BulkExport 本記事では、本モジュールの使い方について説明します。 インストール 他の一般的なモジュールと同様、標準的な方法でインストールできます。 以下のURLから最新のzipファイルをダウンロードします。 https://github.com/Daniel-KM/Omeka-S-module-BulkExport/releases インストール時に、以下のように、Logモジュールを事前にインストールする必要があります。 使い方 管理画面左部の「BulkExport」をクリックし、エクスポートアイコンをクリックします。 次の画面でエスクポート内容の設定を行うことができます。デフォルトのままでもかまいません。 続く画面でエクポートを実行すると、以下のように、エクスポートの結果を確認できます。Get fileボタンから、エクスポート結果をダウンロードすることができます。 エクスポート結果の例は以下です。 o:id o:resource_template o:resource_class o:is_public o:item_set[o:id] o:item_set[dcterms:title] o:media[o:id] o:media[file] dcterms:title dcterms:rights dcterms:isPartOf 1 dctype:Image true parent 3 2 dctype:Image true child http://creativecommons.org/licenses/by/4.0/ 1 3 dctype:Collection true top データ数が多い場合 データ数が多い場合は、以下のように、バックグラウンドジョブとして実行されます。ジョブが完了すると、上記のダウンロードボタンが表示されます。 まとめ Omeka Sに格納されたデータの一括エクスポートを行う場合の参考になりましたら幸いです。 ...

2023年1月22日 · 更新: 2023年1月22日 · 1 分 · Nakamura

Visual Studio Live Shareを用いてTEI/XMLファイルを共同編集する(xmlでなくても可)

概要 Visual Studio Live Shareはリアルタイムの共同開発を可能にするVSCodeの拡張機能です。 https://visualstudio.microsoft.com/ja/services/live-share/ 今回は本拡張機能を使って、TEI/XMLファイルをリアルタイムに共同編集してみます。 デモ動画 共同編集の様子を動画にしました。 https://youtu.be/DzyuJAtzl90 画面右はローカル環境でVSCodeを使用しているユーザ(nakamura196)、画面左はVisual Studio Live Shareによって招待されたユーザ(Guest User)がオンラインのVSCode(vscode.dev)を用いて編集している例です。 1行目はローカルのユーザ(nakamura196)が編集し、1行目はオンラインの共同編集者(Guest User)が編集しています。以下で紹介したTEI/XMLのプレビュー画面も同期されています。 https://zenn.dev/nakamura196/articles/d2733cc49d1239 使い方 Visual Studio Live Shareの使い方は、以下のページを参考にしてください。とても簡単な操作で、共同編集環境を作成することができます。またユーザ毎に「閲覧のみ」「編集可」といった権限の設定ができるので、いろいろな使い方ができます。 https://learn.microsoft.com/en-us/visualstudio/liveshare/quickstart/share 簡単に使い方を紹介します。 招待する側 Visual Studio Live Shareをインストールし、以下のように、画面左のタブから「Live Share」を選択して、「Share」ボタンを押します。 「Invite participants」を押すと、以下のようなリンクがコピーされます。 https://prod.liveshare.vsengsaas.visualstudio.com/join?7D0781A4301C45E7669D4D32CCE870AEBE2B 招待される側 上記のURLにアクセスします。すると、以下のように、ユーザ設定に関するポップアップが右下に表示されます。匿名ユーザとして参加する、すでにアカウントをお持ちであればログインする、などを行います。 その後、以下のように、ホストの承認を待つステータスになります。 ホストが権限を設定することで、招待されたユーザが閲覧または共同編集できるようになります。 上記のデモでは、オンラインのユーザが拡張機能「TEI Japanese Editor」をインストールすることで、プレビュー画面も表示しています。 気づき 別の記事で以下のようなコメントを書きました。 なお、https://github.dev/ など、web版のVSCodeを使用することで、各ユーザが環境のセットアップを行う必要がなくなり、より簡便に編集環境を用意することができそうです。ただし、2023年1月時点ではScholarly XMLなどの拡張機能がweb版に非対応となっており、現時点でこのような環境を使用することは難しいです。 ただ今回の方法を用いると、ローカル環境のユーザ側ではScholarly XMLによるValidationを行うことができ、招待されたユーザはオンラインのVSCodeを使って簡単にセットアップができる、という形になったので、上記の課題を解決する一つの方法になり得るかもしれません。(もちろん、Scholarly XMLがweb版に対応すると解決しますが。) まとめ 今回はTEI/XMLを対象にしましたが、これに限るものではありません。 Visual Studio Live Shareはとても便利な拡張機能です。TEIの学習の際などにも有用な環境になると思います。 TEI/XMLなどの共同編集にあたり、参考になりましたら幸いです。

2023年1月19日 · 更新: 2023年1月19日 · 1 分 · Nakamura

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. ...

2023年1月19日 · 更新: 2023年1月19日 · 1 分 · Nakamura

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ファイルの記述方法についてはさらなる勉強が必要ですが、今回のような具体例から試行錯誤ができる仕組みは有効かと思います。 ...

2023年1月18日 · 更新: 2023年1月18日 · 1 分 · Nakamura

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ファイルの作成方法や内容について、別の記事にまとめたいと思います。

2023年1月18日 · 更新: 2023年1月18日 · 1 分 · Nakamura

WordをTEI/XMLに変換する

概要 WordをTEI/XMLファイルに変換する機会がありました。調べてみたところ、TEIGarage ConversionなどのTEI公式のツールに加えて、以下のTEI Publisherでの変換例が見つかりました。 https://teipublisher.com/exist/apps/tei-publisher/test/test.docx.xml 上記の例では、Wordのスタイル情報を中心に、TEIのタグに変換しているようだったので、この方法を試してみました。なお今回は、TEI Publisherとは独立して使用することを目的として、python-docxライブラリを使用しました。 Wordファイル 以下のようなWordファイルを試作しました。いずれも仮ですが、「tei:persName」や「tei:warichu」といったスタイルを作成し、色などのスタイルを変更しました。スタイルを当てていくことで、簡易な構造化を行う仕組みです。 TEI/XMLへの変換 上記のようなWordファイルを入力として、スタイル情報を中心に、TEI/XMLに変換するスクリプトを作成しました。いずれpipなどを使って共有したいと考えています。 変換したTEI/XMLの例は以下です。まだまだ改善が必要ですが、validなTEI/XMLファイルに変換することができました。 <lb/> <seg> ワードの入力サンプル </seg> <lb/> <lb/> <seg type="dateline"> 日付の行にスタイル「dateLine」を使用してください。先頭に2文字の空白が入ります。 </seg> <lb/> <seg type="personline"> 名前の行にスタイル「personLine」を使用してください。末尾に2文字の空白が入ります。 </seg> <lb/> <seg> <ruby> <rb> 中村 </rb> <rt> なかむら </rt> <rt place="left"> さとる </rt> </ruby> の形で両側ルビを記述します。緑色が左ルビです。 </seg> <lb/> <lb/> <seg> <seg type="red"> 朱書 </seg> はスタイル「 <seg type="red"> red </seg> 」を使用してください。 </seg> <lb/> <lb/> <seg> 文字のサイズについては検討中です。 </seg> <lb/> <lb/> <seg> <persName> 中村覚 </persName> のような人名には、スタイル「 <persName> persName </persName> 」を使用してください。 </seg> <lb/> <lb/> <seg> 割注は <note type="割書"> あああああ <milestone unit="wbr"/> いいい </note> のように入力してください。正しく改行されるまで、全角スペースを入力してください。 <note type="割書"> こんな <milestone unit="wbr"/> スタイル </note> もあります。「こんな」の後に全角スペースを入れています。 </seg> <lb/> <lb/> <seg type="dateline"> 二〇二三年一月十七日 </seg> <lb/> <seg type="personline"> 作成:中村覚 </seg> <lb/> 別途開発中のTEI/XMLビューアで表示した例が以下です。<rt place="left">や朱書などのスタイルがまだ適用できていませんが、人名や割書などは再現することができました。 ...

2023年1月17日 · 更新: 2023年1月17日 · 1 分 · Nakamura

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への画像アップロードと、メタデータや画像の凍結について経験することができました。 デジタルアーカイブにおけるコンテンツ管理への応用に向けて、引き続き色々と試してみたいと思います。

2023年1月16日 · 更新: 2023年1月16日 · 1 分 · Nakamura

画像とIIIFマニフェストをipfsに追加してみる

概要 以下のツイートを参考に、画像とIIIFマニフェストをipfsに追加してみました。 https://twitter.com/edsilv/status/1400221815369355267 ipfsへの追加については、上記のツイートでも言及されているFleekを使用しました。 https://fleek.co/ Fleekの使い方は以下のサイトが参考になりました。 https://i-407.com/blog/m10/ ソースコード ソースコードは以下です。 https://github.com/nakamura196/fleek_test 手順 画像のアップロード まず、上記のリポジトリに以下の画像をアップロードしました。 https://github.com/nakamura196/fleek_test/blob/main/kunshujo_400.jpg 先のサイトを参考に、本リポジトリをfleekに接続しました。その結果、以下のURLでアクセスできました。 https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg 参考 またIPFSのデスクトップアプリをダウンロードして、「QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo」を入力したところ、以下のように表示することができました。 さらに、以下のGoogle Chromeの拡張機能をインストールしました。 https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch 上記のデスクトップアプリを起動した状態で、先のURL(https://ipfs.io/ipfs/…)を入力すると、以下のURLに変換されました。 http://bafybeigepsc4mwgbur7y7tao5v26oeqgi3bkial2rrbuudlaf3z43iyquq.ipfs.localhost:8080/kunshujo_400.jpg マニフェストファイルのアップロード 次にマニフェストファイルを作成します。以下のようなマニフェストファイルを作成しました。 { "@context": "http://iiif.io/api/presentation/2/context.json", "@id": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg", "@type": "sc:Manifest", "attribution": "sample", "description": "Manifest file of My first IIIF and IPFS", "label": "My first IIIF and IPFS", "metadata": [ { "label": "keyword", "value": "ipfs" } ], "sequences": [ { "@id": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg/sequence/normal", "@type": "sc:Sequence", "canvases": [ { "@id": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg/canvas/p1", "@type": "sc:Canvas", "height": 289, "images": [ { "@id": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg/annotation/p1-image", "@type": "oa:Annotation", "motivation": "sc:painting", "on": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg/canvas/p1", "resource": { "@id": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "height": 289, "width": 400 } } ], "label": "[1]", "thumbnail": { "@id": "https://ipfs.io/ipfs/QmbZekG5x834rwGKVZntBefkbNfL5auH171m4c26TZmCAo/kunshujo_400.jpg" }, "width": 400 } ] } ] } その結果、以下のURLでアクセスできるようになりました。 ...

2023年1月16日 · 更新: 2023年1月16日 · 1 分 · Nakamura

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の形式で指定することもできます。 ...

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

ExcelからTEI/XMLを作成するフローの一例を作成しました。

概要 Excelで作成したデータから、TEI/XMLを作成するフローの一例を作成しました。 以下のようなTEI/XMLファイルが出力されます。pbタグを使ったページ区切り、lbタグを使った行IDの指定、choice・orig・regタグを使った複数表記、noteタグを使った注釈、およびIIIF画像との関連づけ、などに対応します。 <?xml version="1.0" encoding="utf-8"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title/> </titleStmt> <publicationStmt> <ab/> </publicationStmt> <sourceDesc> <ab/> </sourceDesc> </fileDesc> </teiHeader> <text> <body> <pb corresp="#page_22"/> <ab> <lb xml:id="page_22-b-1"/> <seg> いつれの御時にか女御更衣あまたさふらひ <choice> <orig> 給ける <note corresp="#page_22-b-1-20" type="校異"> 給けるーたまふ河 </note> </orig> <reg> たまふ </reg> </choice> なかにいとやむことなきゝは </seg> </ab> </body> </text> <facsimile source="https://dl.ndl.go.jp/api/iiif/3437686/manifest.json"> <surface source="https://dl.ndl.go.jp/api/iiif/3437686/canvas/22" xml:id="page_22"> <label> [22] </label> <zone lrx="1126" lry="1319" ulx="1044" uly="895" xml:id="page_22-b-1-20"/> </surface> <surface source="https://dl.ndl.go.jp/api/iiif/3437686/canvas/23" xml:id="page_23"> <label> [23] </label> </surface> </facsimile> </TEI> 上記のTEI/XMLデータの可視化の一例を以下に示します。画像、テキスト(original)、テキスト(Regularization)、注釈を同一画面上に表示しています。 なお注意点として、今回は校異源氏物語のテキストを用いていますが、校異情報を記述する際にはapp要素のほうが適切です。あくまでフローを説明するためのサンプルデータとしてご理解ください。 Excel 作成するExcelのサンプルデータは以下です。image, text, notesの3つのシートを持ちます。それぞれについて説明します。 ...

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

TEIビューアでの利用を想定したCustom OpenSegDragon Viewerを作成しました。

概要 TEIビューアでの利用を想定したCustom OpenSegDragon Viewerを作成しました。 背景 以下のようなTEIとIIIFを対応させたビューア開発において、次に示す機能を持ったビューアが必要でした。 https://www.hi.u-tokyo.ac.jp/collection/digitalgallery/wakozukan/tei/ IIIFのマニフェストファイルを読み込むことができる。 ビューアコンポーネント側でのコマ送りを、コンポーネント外で把握することができる。 画像の部分領域をハイライトすることができる。 上記の要件を全てを満たす既存のIIIF対応ビューアを見つけることができなかったため、独自のビューアの開発を試みました。合わせて、npmパッケージとして公開することも試みました。 開発したビューア ドキュメンテーション等がまだ不十分ですが、以下のページで公開しています。このページで、ソースコードへのリンクも掲載しています。 https://www.npmjs.com/package/@nakamura196/osd-custom-viewer vue3とviteを使ったコンポーネントの開発およびnpmでの公開にあたっては、以下のサイトを参考にしました。 https://blog.egmond.dev/vue-component-to-npm-package 使用例 以下のページで導入例をご確認いただけます。 https://nakamura196.github.io/nuxt3-iiif-viewer/custom-osd コンポーネント内外からのコマ送りが可能です。これにより、例えばIIIF画像とTEIテキストの並列表示を行った際、TEIテキスト側からのコマ送りや、画像のコマ送りによる当該テキストへのスクロールなどを行うことができます。 またハイライト機能用いることで、あるテキスト行に対応した画像の部分領域をハイライトさせる、といったことが可能です。 使用例のソースコードは以下です。 https://github.com/nakamura196/nuxt3-iiif-viewer/blob/main/pages/custom-osd/index.vue ssrでの公開にあたり、pluginsフォルダに以下を追加しています。 https://github.com/nakamura196/nuxt3-iiif-viewer/blob/main/plugins/custom-osd.client.js まとめ ドキュメンテーションの充実や、IIIF v3への対応など、多くのTODOが残っていますが、参考になりましたら幸いです。

2022年12月26日 · 更新: 2022年12月26日 · 1 分 · Nakamura