ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
IIIFマニフェストファイルからOCR結果を含むTEI_XMLファイルを作成するプログラム

IIIFマニフェストファイルからOCR結果を含むTEI_XMLファイルを作成するプログラム

概要 IIIFマニフェストファイルからOCR結果を含むTEI_XMLファイルを作成するプログラムを作成しました。このプログラムの使用方法について説明します。 仕組み IIIFマニフェストファイルのURLを指定して、NDL古典籍OCR-LiteによるOCR結果を含むTEI/XMLファイルを作成します。 https://github.com/ndl-lab/ndlkotenocr-lite 使い方 以下のノートブックにアクセスしてください。 https://colab.research.google.com/github/nakamura196/000_tools/blob/main/IIIFマニフェストファイルからTEI_XMLファイルを作成するプログラム.ipynb そして、一つ目の再生ボタンを押します。 完了したら、「実行」という部分のmanifest_urlとoutput_dirの値を更新して、セルを実行します。 output_dirに、OCR結果を含むTEI/XMLファイルが出力されます。 出力例 以下のように、ページおよび行ごとのOCR結果を含むファイルが作成されます。 <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title>OCR結果: https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/0f11a3ed-18c2-7322-6340-19ed3f0d966e/manifest</title> </titleStmt> <publicationStmt> <publisher>NDL古典OCR</publisher> <date>2025-01-29</date> </publicationStmt> <sourceDesc> <bibl> <ptr target="https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/0f11a3ed-18c2-7322-6340-19ed3f0d966e/manifest"/> </bibl> </sourceDesc> </fileDesc> </teiHeader> <text> <body> <ab n="1" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/002/A05_4_002_0001.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-1">国外</seg> <lb/> <seg type="本文" n="3" corresp="#zone-3">空せみ二</seg> <lb/> <seg type="本文" n="4" corresp="#zone-4">ゆふかほ</seg> </ab> <ab n="2" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/002/A05_4_002_0002.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-1">あつたい</seg> <lb/> <seg type="本文" n="2" corresp="#zone-2">・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・</seg> <lb/> <seg type="本文" n="3" corresp="#zone-3">中川ノ中川宿にて之源氏十六才</seg> <lb/> <seg type="本文" n="4" corresp="#zone-4">住ぬ</seg> <lb/> <seg type="本文" n="5" corresp="#zone-5">ねられ給はぬまゝに。われはかく人に</seg> <lb/> <seg type="本文" n="6" corresp="#zone-6">にくまれてもならはぬを。こよひなん</seg> <lb/> <seg type="本文" n="7" corresp="#zone-7">はじめてうしと世を思ひ知ぬれば</seg> <lb/> <seg type="本文" n="8" corresp="#zone-8">はつかしうてながらふまじくこそ思ひ</seg> <lb/> <seg type="本文" n="9" corresp="#zone-9">なりぬれなどの給へば。なみたをさへ</seg> <lb/> <seg type="本文" n="10" corresp="#zone-10">こぼしてふしたり。いどらうたしと</seg> <lb/> <seg type="本文" n="11" corresp="#zone-11">おぼすてさぐりのほそくちいさき</seg> <lb/> <seg type="本文" n="12" corresp="#zone-12">ほどがみのいとながからざりしけ</seg> <lb/> まとめ 不完全な点もあるかと思いますが、参考になりましたら幸いです。 ...

Nuxt3と@sidebase/nuxt-authを使って、Drupalの認証を行う

Nuxt3と@sidebase/nuxt-authを使って、Drupalの認証を行う

概要 Nuxt3と@sidebase/nuxt-authを使って、Drupalの認証を行う方法です。 背景 以下の記事で、GakuNin RDMの認証を行う方法を紹介しました。 また、以下の記事で、Next.jsからDrupalのOAuthを利用する方法を紹介しました。 これらを参考にして、Nuxt3からDrupalのOAuthを利用します。 方法 ソースコードは以下のリポジトリでご確認いただけます。 https://github.com/nakamura196/nuxt-rdm 具体的には、以下です。 https://github.com/nakamura196/nuxt-rdm/blob/main/server/api/auth/[…].ts { id: "drupal", name: "Drupal", type: "oauth", clientId: useRuntimeConfig().drupalClientId, clientSecret: useRuntimeConfig().drupalClientSecret, authorization: { url: process.env.DRUPAL_AUTH_URL, params: { scope: process.env.DRUPAL_SCOPE, response_type: "code", redirect_uri: `${ useRuntimeConfig().nextAuthUrl }/api/auth/callback/drupal`, }, }, token: { async request(context) { const body = new URLSearchParams({ client_id: useRuntimeConfig().drupalClientId, client_secret: useRuntimeConfig().drupalClientSecret, code: context.params.code || "", grant_type: "authorization_code", redirect_uri: `${ useRuntimeConfig().nextAuthUrl }/api/auth/callback/drupal`, }); const res = await fetch(process.env.DRUPAL_TOKEN_URL || "", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, body, }); const json = await res.json(); // Parse the response body once if (!res.ok) { throw new Error(`Token request failed: ${res.statusText}`); } return { tokens: json }; }, }, profile(profile) { return { id: profile.sub, // "sub" をユーザーの一意のIDとして利用 name: profile.name || profile.preferred_username || "Unknown User", // 名前の優先順位を設定 email: profile.email || "No Email Provided", // メールがない場合のフォールバック image: profile.profile || null, // プロファイルURLを画像として使用(必要に応じて調整) }; }, }, まとめ 間違っている点もあるかもしれませんが、参考になりましたら幸いです。 ...

Omeka S: Advanced Searchモジュールに対応したテーマを探す

Omeka S: Advanced Searchモジュールに対応したテーマを探す

概要 Omeka SのAdvanced Searchモジュールに対応したテーマを探す方法の一例について紹介します。 背景 Omeka SのAdvanced Searchモジュールを用いることで、以下の記事などで紹介しているように、Omeka Sの検索画面をカスタマイズすることができます。 特に、ファセットなどを追加できる点に利点があります。 一方、使用しているテーマがこのAdvanced Searchモジュールに対応していない場合、一部表示が崩れてしまうケースがあります。テーマ側でAdvanced Searchモジュールに対応しているかどうかを判断する方法の一例として、以下のように、テーマのフォルダの「view/common」の下に「advanced-search」の有無を確認する方法があります。 https://github.com/omeka-s-themes/freedom/tree/master/view/common/advanced-search この方法に基づいて、GitHubで公開されているOmeka Sのテーマのうち、Advanced Searchモジュールに対応しているものを探す方法を紹介します。 方法 以下の記事で紹介したサイトを使用します。 URLは以下です。 https://satoru196.notion.site/satoru196/6f898ed1352e4c9fa013eee635cbabf4?v=02cab757b6cf4df6bfbedfeb85eca0a5 特に、本記事の目的のため、「各テーマがAdvanced Searchモジュールに対応しているか」のフラグを追加しました。加えて、リポジトリのownerの情報も加え、各テーマが誰によって提供されているかを確認できるようにしました。 具体的には、以下の図に示すように、スター数で降順として、さらに「has_advanced_search」にチェックが入っているテーマのみに限定します。 この結果、「freedom」というテーマが「omeka-s-themes」というOmekaの公式Teamによって提供されており、相対的にスター数が多く、Advanced Searchモジュールにも対応していることがわかります。 https://github.com/omeka-s-themes/freedom まとめ Omeka Sのテーマの探し方の一例について紹介しました。Omeka Sの利用にあたり、参考になりましたら幸いです。

AppSheetを使ってデジタルコレクションを構築する

AppSheetを使ってデジタルコレクションを構築する

概要 AppSheetを使ってデジタルコレクションを試作してみましたので、備忘録です。 対象データ 以下の記事と同じデータを利用しています。 具体的には、『東京帝國大學本部構内及農學部建物鳥瞰圖』(東京大学農学生命科学図書館所蔵)をサンプルデータとして使用します。 https://iiif.dl.itc.u-tokyo.ac.jp/repo/s/agriculture/document/187cc82d-11e6-9912-9dd4-b4cca9b10970 成果物 以下のURLからアクセスいただけます。 https://www.appsheet.com/start/092a3ff4-1074-4e27-bbd1-f4820da77511 画像の一覧機能や、 地図へのマッピング機能、 簡単な集計機能を提供します。 作成方法 アプリの初期設定 アプリを作成します。 データソースとして、Google Sheetsを選択します。ちなみに、「AppSheet Database」を使用した場合、Free Planではデプロイできませんでした。 結果、デフォルトで地図表示、およびデータの一覧を表示するページ(View)を作成してくれました。 データ 「データ」タブに移動して、設定を行います。 例えば、使用しない項目には、「SHOW?」列のチェックを外します。また、「KEY?」と「LABEL?」に対して、「identifier」と「title」を割り当てました。 次に、「DISPLAY NAME」で、アプリ上で表示する名称を入力します。 さらに、検索に使用したい項目にのみ、「SEARCH?」列にチェックを入れます。 加えて、今回はデータの閲覧のみを行うため、「Read-Only」の設定を行います。 Views(マップ) Views(マップ)はデフォルトのまま使用しました。 Views(main) ここでは、View nameを「Browse」に変更して、View typeとして「card」を選択して、Positionには「next」を与えました。Positionについては、メニューにおいて「Browse」が「Map」の左にくるようになります。 さらに、レイアウトについて、それぞれの要素に割り当てるカラムを設定します。例えば以下では、画像を表示する列として、「_image_url」を指定しています。 結果、一覧画面が以下のように表示されます。 Views(chart) 以下のように、新規にViewを追加します。 そして、「Chart columns」に、ここではカテゴリが格納されたカラムを設定しました。結果、画面右部のように表示が変わります。 その他 その他、アプリの見た目を変更します。 設定 > Theme & Brand から、例えば、ヘッダーにロゴなどが表示されるように変更します。 また、今回の初期設定では「Map」Viewがはじめに開いてしまうので、「Browse」が表示されるように、「Views」の設定を変更します。 Preview ここまでのところでプロトタイプはほぼ完成です。Previewモードで確認することができます。デフォルトで、各レコードの詳細画面も表示されます。 ...

Kompakkt Standalone Viewerを試す

Kompakkt Standalone Viewerを試す

概要 Kompakkt Standalone Viewerを試す機会がありましたので、備忘録です。 以下のように説明されています。 This repository hosts a JavaScript file which can be included on any website to use the Kompakkt Viewer without needing to use the Kompakkt Repository or the Kompakkt Server. (機械翻訳)このリポジトリには、Kompakkt Viewerを使用するためのJavaScriptファイルが含まれており、このファイルをウェブサイトに組み込むだけで、Kompakkt RepositoryやKompakkt Serverを使用せずにビューアを利用することができます。 リポジトリ 以下で公開されています。 https://github.com/Kompakkt/StandaloneViewer またGitHub Pagesでビューアにアクセスすることができます。 https://kompakkt.github.io/StandaloneViewer/ 表示例 以下のように、3Dモデルとアノテーションを表示することができました。 https://kompakkt.github.io/StandaloneViewer/?state=eyJyZXNvdXJjZSI6Imh0dHBzOi8vc3VraWxhbS5hd3MubGRhcy5qcC9maWxlcy9vcmlnaW5hbC8yNTNlZmRmMzQ0Nzg0NTk5NTRhZTA0ZjZiM2JlZmE1ZjM4MjJlZDU5LmdsYiIsImFubm90YXRpb25zIjpbeyJfaWQiOiI2NzcwYTE1NDRjZTFmZDAyMzQ4OGVkODAiLCJib2R5Ijp7InR5cGUiOiJhbm5vdGF0aW9uIiwiY29udGVudCI6eyJ0eXBlIjoidGV4dCIsInRpdGxlIjoibXkgdGl0bGUiLCJkZXNjcmlwdGlvbiI6Im15IGRlc2NyaXB0aW9uIiwicmVsYXRlZFBlcnNwZWN0aXZlIjp7ImNhbWVyYVR5cGUiOiJhcmNSb3RhdGVDYW0iLCJwb3NpdGlvbiI6eyJ4IjoyLjI5NzE5OTgyNzA3MzIxLCJ5IjoxLjA0NjMzMzI0ODg4Njk0LCJ6IjoxLjYzNjAwODMyNDk5NDF9LCJ0YXJnZXQiOnsieCI6MS4wMTMxMDUwMzQ4MjgxOSwieSI6MS4xNzkwMzM5OTQ2NzQ2OCwieiI6MS4wMTQ0NDIwMjY2MTUxNH0sInByZXZpZXciOiJwcmV2aWV3cy9hbm5vdGF0aW9uLzY3NzBhMTU0NGNlMWZkMDIzNDg4ZWQ4MC5wbmcifX19LCJjcmVhdGVkIjoiMjAyNC0xMi0yOVQwMTowOTo0MC4yODZaIiwiY3JlYXRvciI6eyJ0eXBlIjoicGVyc29uIiwibmFtZSI6IlNhdG9ydSBOYWthbXVyYSIsIl9pZCI6IjY3NWE5Y2U0N2QxZmIyNDUzZjBmYjNjMSJ9LCJnZW5lcmF0ZWQiOiIyMDI0LTEyLTI5VDAxOjA5OjQyLjk3NFoiLCJnZW5lcmF0b3IiOnsidHlwZSI6InNvZnR3YXJlIiwibmFtZSI6IktvbXBha2t0IiwiX2lkIjoiNjc1YTljZTQ3ZDFmYjI0NTNmMGZiM2MxIiwiaG9tZXBhZ2UiOiJodHRwczovL2dpdGh1Yi5jb20vS29tcGFra3QvS29tcGFra3QifSwiaWRlbnRpZmllciI6IjY3NzBhMTU0NGNlMWZkMDIzNDg4ZWQ4MCIsImxhc3RNb2RpZmljYXRpb25EYXRlIjoiMjAyNC0xMi0yOVQwMToxMToyNC4zNjBaIiwibGFzdE1vZGlmaWVkQnkiOnsiX2lkIjoiNjc1YTljZTQ3ZDFmYjI0NTNmMGZiM2MxIiwibmFtZSI6IlNhdG9ydSBOYWthbXVyYSIsInR5cGUiOiJwZXJzb24ifSwibW90aXZhdGlvbiI6ImRlZmF1bHRNb3RpdmF0aW9uIiwicmFua2luZyI6MSwidGFyZ2V0Ijp7InNvdXJjZSI6eyJyZWxhdGVkRW50aXR5IjoiNjc3MDllODYwY2I4ZDA2NGZhMDc1NWI3IiwicmVsYXRlZENvbXBpbGF0aW9uIjoiIn0sInNlbGVjdG9yIjp7InJlZmVyZW5jZVBvaW50Ijp7Il9pc0RpcnR5Ijp0cnVlLCJfeCI6MC40MzI0MjIyMjQwNDc5MDksIl95IjoxLjY3NDQzMTE3MTYxNjA1LCJfeiI6MS42NTQ2MTgxODc1NDE1OH0sInJlZmVyZW5jZU5vcm1hbCI6bnVsbH19LCJ2YWxpZGF0ZWQiOnRydWV9XX0%253D ただし、アノテーションに日本語が含まれているとエラーが発生してしまいました。 また、アノテーションが3Dモデル上に表示されないなど、使用方法に誤りが含まれるようでした。 補足 入力するアノテーションのフォーマットとして、Kompakktで付与したアノテーションをエクスポートしたものが利用できるようでした。 例えば、以下です。 [ { "_id": "6770a1544ce1fd023488ed80", "body": { "type": "annotation", "content": { "type": "text", "title": "aaa", "description": "bbb", "relatedPerspective": { "cameraType": "arcRotateCam", "position": { "x": 2.29719982707321, "y": 1.04633324888694, "z": 1.6360083249941 }, "target": { "x": 1.01310503482819, "y": 1.17903399467468, "z": 1.01444202661514 }, "preview": "previews/annotation/6770a1544ce1fd023488ed80.png" } } }, "created": "2024-12-29T01:09:40.286Z", "creator": { "type": "person", "name": "Satoru Nakamura", "_id": "675a9ce47d1fb2453f0fb3c1" }, "generated": "2024-12-29T01:09:42.974Z", "generator": { "type": "software", "name": "Kompakkt", "_id": "675a9ce47d1fb2453f0fb3c1", "homepage": "https://github.com/Kompakkt/Kompakkt" }, "identifier": "6770a1544ce1fd023488ed80", "lastModificationDate": "2025-01-04T22:47:44.949Z", "lastModifiedBy": { "_id": "675a9ce47d1fb2453f0fb3c1", "name": "Satoru Nakamura", "type": "person" }, "motivation": "defaultMotivation", "ranking": 1, "target": { "source": { "relatedEntity": "67709e860cb8d064fa0755b7", "relatedCompilation": "" }, "selector": { "referencePoint": { "_isDirty": true, "_x": 0.432422224047909, "_y": 1.67443117161605, "_z": 1.65461818754158 }, "referenceNormal": null } }, "validated": true } ] ただし、Kompakktでも3Dモデル上にアノテーションが表示されず、使用方法のどこかに誤りがありそうです。 ...

Aleph 3D viewerを試す

Aleph 3D viewerを試す

概要 3D object viewerの一つであるAlephを試してみましたので、備忘録です。 https://github.com/aleph-viewer/aleph 菊池市デジタルアーカイブで公開されている「石淵家地球儀」の3Dデータを使用しています。 https://adeac.jp/kikuchi-city/catalog/e0001 背景 IIIF対応の3Dビューアを調査する過程で、以下の記事を見つけました。 https://pro.europeana.eu/post/iiif-for-3d-making-web-interoperability-multi-dimensional こちらで紹介されているビューアの一つとして、Alephを知りました。 使い方 GitHubリポジトリをForkして、Vercelにデプロイしました。 https://aleph-coral.vercel.app/ 初期表示は以下です。 画面左部の入力フォームにあるglbファイルへのURLを変更することで、指定した3Dモデルが表示されました。 まとめ 3Dビューアの調査にあたり、参考になりましたら幸いです。

ndlocr_cli(NDLOCR(ver.2.1)アプリケーションを試すことができるGradioアプリを作成しました。

ndlocr_cli(NDLOCR(ver.2.1)アプリケーションを試すことができるGradioアプリを作成しました。

概要 ndlocr_cli(NDLOCR(ver.2.1)アプリケーションを試すことができるGradioアプリを作成しました。 以下のURLからお試しください。 https://ndlocr.aws.ldas.jp/ 補足 現在は1枚の画像アップロードのみに対応しています。今後、PDFのアップロード機能などのオプションも追加したいと思います。 Azureで使用可能なVMである「NC8as_T4_v3」に搭載されている「NVIDIA Tesla T4 GPU」を使用しています。 まとめ いつまでこの形で提供できるかはわかりませんが、ndlocr_cli(NDLOCR(ver.2.1)アプリケーションの精度の確認などにあたり、ご利用いただけますと幸いです。

CollectionBuilderを使ってみる

CollectionBuilderを使ってみる

概要 CollectionBuilderを使ってみる機会がありましたので、備忘録です。 https://collectionbuilder.github.io/ 以下のように説明されています。 CollectionBuilder is an open source framework for creating digital collection and exhibit websites that are driven by metadata and powered by modern static web technology. (機械翻訳)CollectionBuilderは、メタデータを基盤とし、最新の静的ウェブ技術によって動作するデジタルコレクションや展示ウェブサイトを作成するためのオープンソースフレームワークです。 成果物 以下がCollectionBuilderを用いて試作したサイトです。 https://nakamura196.github.io/collectionbuilder-gh/ リポジトリは以下です。 https://github.com/nakamura196/collectionbuilder-gh 以下の記事と同じデータを利用しています。 具体的には、『東京帝國大學本部構内及農學部建物鳥瞰圖』(東京大学農学生命科学図書館所蔵)をサンプルデータとして使用します。 https://iiif.dl.itc.u-tokyo.ac.jp/repo/s/agriculture/document/187cc82d-11e6-9912-9dd4-b4cca9b10970 感想 メタデータ(demo-metadata.csv)の変更のみで、上記のようなサイトを構築することができました。 地図やタイムライン、ファセットやタグクラウドなど、豊富な機能も提供されていました。 またマークダウンファイルによるカスタマイズ性の高さも感じました。 まとめ Omekaのような動的サイトではなく、静的サイトとしてデジタルコレクションを構築する手段として、有用なツールだと感じました。 使いこなせていない点も多いですが、参考になりましたら幸いです。

「れきちず」を使ってみる

「れきちず」を使ってみる

概要 「れきちず」を使う方法を調べましたので、備忘録です。「れきちず」は以下のように説明されています。 「れきちず」は、「現代風の地図デザイン」の歴史地図を閲覧できるサービスです。 https://rekichizu.jp/ 背景 以下の会議に参加し、「れきちず」について教えていただきました。「れきちず」を開発してくださっている関係者の皆様、会議を開催してくださった皆様、また使用方法を教えてくださった北本朝展先生に感謝いたします。 http://codh.rois.ac.jp/conference/linked-pasts-10/ 以下のように、CODHのサービスでも導入されています。 http://codh.rois.ac.jp/news/ 2024-05-01 江戸マップ「れきちず」データセットを公開しました。また、edomi マップおよびedomi 災害に「れきちず」を導入し、現代デザインの歴史地図上で、edomiの歴史ビッグデータが閲覧できるようになりました。 使用方法 以下に、最低限の機能を実現するためのソースコードを格納しました。 https://github.com/nakamura196/rekichizu/blob/main/docs/index.html 以下でデモをご確認いただけます。 https://nakamura196.github.io/rekichizu/ 以下は地形とともに、富士山を表示した例です。 なお、地形については、以下の点にご注意ください。 江戸時代後期(1800〜1840年ごろ、文化・文政・天保年間)を想定した地図になります。関東・中部以外の地方についても順次拡大していく予定です。 地形の3D表示については現在の地形を表示しています。そのため、当時とは異なる地域があります。 https://rekichizu.jp/ 参考 ライブラリ 本アプリケーションの構築にあたっては、Leafletではなく、MapLibre GL JSを使用します。 https://maplibre.org/maplibre-gl-js/docs/ 以下のサイトにおいて、MapLibre GL JSは、Mapboxのオープンソースフォーク版と説明されていました。 https://qiita.com/asahina820/items/66cd78a4462db86578a4 当初、Mapboxでの使用を前提に、アカウント登録やトークンの発行等を行いましたが、MapLibre GL JSを使用する場合は、このような手続きは不要でした。 地形の有効化/無効化時にピッチを変更 地形の有効化/無効化時にピッチを変更するにあたり、以下のような記述によって実現できました。 map.on("terrain", () => { const terrain = map.getTerrain(); const duration = 1000; // アニメーションの持続時間(ミリ秒) map.easeTo({ pitch: terrain ? 60 : 0, // 地形が有効になったときのピッチ duration, }); }); 当初、map.setPitch(60)などを使用していましたが、map.easeToを使用することにより、スムーズにピッチが変更されるようになりました。 ...

Omeka SのIIIF Serverモジュールで、表示方向を指定する

Omeka SのIIIF Serverモジュールで、表示方向を指定する

概要 Omeka SのIIIF Serverモジュールで、表示方向を指定する方法です。 IIIFでは、viewingDirectionプロパティを使用し、マニフェストやキャンバスの表示方向を指定することができます。 モジュールの設定 /admin/module/configure?id=IiifServer IIIFサーバモジュールの設定画面において、「viewing direction」の項目を探します。 Property to use for viewing directionでプロパティを指定できる他、デフォルトの表示方向を指定することもできます。 上記の例では、sc:viewingDirectionプロパティを指定していますが、任意のプロパティを設定可能です。 メタデータの追加 上記で指定したプロパティに対して、表示方向の値を入力します。 結果 以下のように、IIIFマニフェストファイルにおいても、viewingDirectionが設定され、左送りが実現できます。 参考 https://iiif.io/api/cookbook/recipe/0010-book-2-viewing-direction/ 以下、ChatGPTによる回答です。 viewingDirection プロパティには以下の4つの値を指定できます: left-to-right 左から右への表示(英語などの横書き言語に適しています)。 right-to-left 右から左への表示(アラビア語やヘブライ語、縦書きの日本語に適しています)。 top-to-bottom 上から下への表示(主に縦書きの言語に適しています)。 bottom-to-top 下から上への表示(特殊な用途向け)。 まとめ Omeka SのIIIF Serverモジュールの利用にあたり、参考になりましたら幸いです。

NDL古典籍OCR-Lite(ndlkotenocr-lite)をMac OSで使用する

NDL古典籍OCR-Lite(ndlkotenocr-lite)をMac OSで使用する

概要 2024年11月26日にNDLラボから、NDL古典籍OCR-Liteが公開されました。 https://lab.ndl.go.jp/news/2024/2024-11-26/ 本記事ではMac OSでの使用方法について紹介します。 使用方法(動画) https://www.youtube.com/watch?v=NYv93sJ6WLU 使用方法(テキスト) 以下にアクセスします。 https://github.com/ndl-lab/ndlkotenocr-lite/releases/tag/1.0.0 一覧からmacosを含むものを選びます。またチップについても、合致するものを選択します。 リンクをクリックすると、以下のように、「ndlkotenocr-lite_v1.0.0_macos_m1.tar.gz」がダウンロードされます。 ダブルクリック等で展開すると、macosというフォルダの中に、「NDLkotenOCR-Lite」というアプリケーションが展開されます。 「NDLkotenOCR-Lite」というアプリケーションをダブルクリックして起動します。 ただし、初回実行時は、以下のような警告と共に開くことができません。 「プライバシーとセキュリティ」に移動して、「このまま開く」を押すことで、アプリケーションを開くことができます。 結果、以下が起動します。 処理対象と出力先を選択して「OCR」ボタンを押すことで、以下のように認識されました。 ここでは『源氏物語』(東京大学総合図書館所蔵)を使用しています。 出力結果としては、txt, json, xmlファイルが生成されました。 まとめ 現時点ではNDL古典籍OCR ver.3と比較すると、読み取り精度が平均して約2%程度低下するとのことですが、GPUがなくとも軽量なOCR処理が可能となった点は大きなメリットだと思います。 開発者および公開に関わった方々に感謝いたします。

Archivematicaのtransferにおいて、processing_configを使う

Archivematicaのtransferにおいて、processing_configを使う

概要 Archivematicaのtransferにおいて、processing_configの使用方法について説明します。 背景 Archivematicaのtransferにおいて、processing_configを選択することができます。以下では、「automated」「default」「mdx」の3つから選択できることがわかります。 これは、「Administration」メニューにおける「Processing configuration」において設定することができます。 例えば以下は、mdx.jpのs3互換ストレージとやりとりすることを前提とした設定例です。 以下のように、「Store AIP location」に対象ストレージを選択することで、このprocessing configurationを選択した際には、当該ストレージにAIPが保存されることになります。 APIからの利用 APIからもこの設定を利用することができます。 以下のBETA版として提供されているものになりますが、/api/v2beta/packageを利用することができます。 https://www.archivematica.org/en/docs/archivematica-1.16/dev-manual/api/api-reference-archivematica/#package processing_configオプションを設定することで、APIからの利用においても、入力データごとに、AIPやDIPの出力フォルダを変更することができます。 まとめ Archivematicaの利用にあたり、参考になりましたら幸いです。

GakuNin RDMとfigshareを接続する

GakuNin RDMとfigshareを接続する

概要 GakuNin RDMとfigshareを接続する機会がありましたので、備忘録です。 figshareでの作業 GakuNin RDMとの連携対象のフォルダを作成します。 まずプロジェクトを作成します。以下では「My First Project」というプロジェクトを作成します。 GakuNin RDMとは、ここで作成したプロジェクト単位に連携ができるようでした。 GakuNin RDMでの設定 GakuNin RDM側で作成したプロジェクト(ここでは「My First Project」)を選択します。 GakuNin RDMでのアップロードと閲覧 接続設定を行った後は、他のストレージと同様に、フォルダの作成やファイルのアップロードができました。 注意点として、他のストレージサービスとは異なり、フォルダは1階層しか作成することはできませんでした。これはGakuNin RDM側の「フォルダ」の単位が、figshare側の「Item」という単位に対応するためと考えられます。 figshare側での閲覧 GakuNin RDM側で作成したフォルダは、figshare側では「Item」という単位で登録されました。 ファイルはその「Item」というデータセットの中の1ファイルとして、以下のように扱われるようでした。 参考 参考までに、figshare側でアイテムを作成する方法をメモします。 作成したプロジェクト内で「Item」を作成します。以下では「My First Folder」というアイテムを作成しています。 結果、以下のように、Project「My First Project」内に作成したアイテム「My First Folder」が作成されました。 まとめ GakuNin RDMとfigshareの連携にあたり、参考になりましたら幸いです。

GakuNin RDMをNext.jsから使用する

GakuNin RDMをNext.jsから使用する

概要 GakuNin RDMをNext.jsから使用する備忘録です。 背景 以下の記事で、NextAuth.jsを使って、GakuNin RDMの認証を行う方法を紹介しました。 この延長で、GakuNin RDMのデータをロードするNext.jsのアプリを試作します。 デモ GakuNin RDMの認証が使用できる方に限られますが、以下からお試しいただけます。 https://rdm-app.vercel.app/ 例えば以下は、接続したストレージの一覧を確認するページです。 選択したストレージ(ここではosfstorage)におけるフォルダやファイルの一覧です。 以下は、figshareに登録したファイルを参照している例です。 osfstorageやfigshare、GitHubなど、さまざまなストレージに格納されたデータを共通のAPIから利用できる点は便利だと感じました。 GitHubのリポジトリは以下です。 https://github.com/nakamura196/rdm_app まとめ 現時点(データをロードするだけ)においては、本アプリを使用する利点はありませんが、今後、他のアプリとの連携などを通じて、GakuNin RDMのデータを活用できればと思います。 参考になりましたら幸いです。

GakuNin RDMのAPIを使って、ファイルのアップロードなどを行う

GakuNin RDMのAPIを使って、ファイルのアップロードなどを行う

背景 GakuNin RDMのAPIを使って、ファイルのアップロードなどを行う方法の備忘録です。 参考 以下でPAT(パーソナルアクセストークン)の取得方法などを説明しています。 また以下では、OAuth (Open Authorization)を使った方法を紹介しています。Webアプリなどから使用される場合には、こちらが参考になりましたら幸いです。 方法 nbdevを使って、以下のリポジトリを作成しました。 https://github.com/nakamura196/grdm-tools 以下でドキュメントを確認できます。 https://nakamura196.github.io/grdm-tools/ プロバイダ(osfstorage)とフォルダのID(6735a92e6dc8e1001062ac08)は変更する必要がありますが、以下のようなスクリプトにより、特定のフォルダにファイルをアップロードできます。 from grdm_tools.api import GrdmClient import os client = GrdmClient( token=os.environ.get('GRDM_TOKEN') ) project_id = "ys86g" file_path = "./sample.png" url = f"https://files.rdm.nii.ac.jp/v1/resources/{project_id}/providers/osfstorage/6735a92e6dc8e1001062ac08/?kind=file" client.upload_file(file_path, url) ソースコードは以下からご確認いただけます。 https://nakamura196.github.io/grdm-tools/api.html#grdmclient.upload_file まとめ GakuNin RDMのAPI利用にあたり、参考になりましたら幸いです。

OldMaps Onlineを使ってみる

OldMaps Onlineを使ってみる

概要 OldMaps Onlineを使用する機会がありましたので、備忘録です。 https://www.oldmapsonline.org/ 登録 Googleアカウント等でログインします。無料アカウントでは1つのプライベート画像を登録できました。 今回は、「東京帝國大學本部構内及農學部建物鳥瞰圖(東京大学農学生命科学研究科・農学部)」を対象にします。 https://da.dl.itc.u-tokyo.ac.jp/portal/assets/187cc82d-11e6-9912-9dd4-b4cca9b10970 以下のマニフェストファイルを使って画像を登録します。 https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/187cc82d-11e6-9912-9dd4-b4cca9b10970/manifest その後、メタデータを登録する画像が表示されました。 メニュー 以下に示すように、「This map」「Georeference」「Transcribe」「Compare」の機能が提供されています。「This map」は上述のページに遷移します。 以下、その他の機能について確認します。 Georeference ジオリファレンスを行う機能です。 Side by sideによる表示や、 Overlayによる表示機能がありました。 今回は、35点をポイントしてみました。 Transcribe 翻刻機能も提供されていました。以下のように画像の一部を選択し、そのテキストを入力することができます。 Compare ジオリファレンスした結果を閲覧する機能です。 Gridによる表示や、 Swipeによる表示、 Spy glassによる表示など、さまざまなインタフェースが提供されていました。 結果 今回作成した地図は以下からご確認いただけます。 https://www.oldmapsonline.org/compare#map/5523c467-3744-4099-a6fe-61fc63c2ee9d まとめ 古地図の活用にあたり、参考になりましたら幸いです。

Knight LabのTimelineJSやStoryMapJSをNext.jsから利用する

Knight LabのTimelineJSやStoryMapJSをNext.jsから利用する

概要 Knight LabのTimelineJSやStoryMapJSをNext.jsから利用する方法のメモです。 背景 Knight LabのTimelineJSやStoryMapJSは、デジタルストーリーテリングのためのオープンソースツールです。 https://knightlab.northwestern.edu/ データ 以下で公開されている『渋沢栄一伝記資料』のテキストデータを利用します。 https://github.com/shibusawa-dlab/lab1 リポジトリ 以下で公開しています。 https://github.com/nakamura196/shibusawa ストーリーマップ 以下のようなコンポーネントを用意することで、Next.jsからも利用することができました。 https://github.com/nakamura196/shibusawa/blob/main/src/components/Storymap.tsx TypeScriptの利用にあたり、以下の型定義ファイルも作成しました。 https://github.com/nakamura196/shibusawa/blob/main/src/global.d.ts 以下のように表示することができました。 https://shibusawa.vercel.app/storymap/1868-08-02 タイムライン ストーリーマップ同様、タイムラインについても以下のようなコンポーネントを作成しました。 https://github.com/nakamura196/shibusawa/blob/main/src/components/Timeline.tsx 以下のように表示することができました。 https://shibusawa.vercel.app/timeline/1868 ただし、タイムラインについては、以下でES6 modules/webpackが公開されていることに後から気がつきました。こちらの使い方について、別途調査したいと思います。 https://www.npmjs.com/package/@knight-lab/timelinejs まとめ デジタル・ヒューマニティーズ(DH)の分野で広く活用されているTimelineJSやStoryMapJSについて、データの視覚化や物語の構築を行う際の参考になりましたら幸いです。 なお、これらのツールはプログラムを介さず、Googleスプレッドシートを入力として、可視化アプリを作成することもできます。こちらも参考になりましたら幸いです。 https://timeline.knightlab.com/ https://storymap.knightlab.com/

Omeka Sの特定のvocabularyのプロパティ一覧を取得する

Omeka Sの特定のvocabularyのプロパティ一覧を取得する

概要 Omeka Sの特定のvocabularyのプロパティ一覧を取得する方法です。 方法 以下を対象にします。 https://uta.u-tokyo.ac.jp/uta/api/properties?vocabulary_id=5 次のプログラムにより、プロパティ一覧をMS Excelに書き込みます。 import pandas as pd import requests url = "https://uta.u-tokyo.ac.jp/uta/api/properties?vocabulary_id=5" page = 1 data_list = [] while 1: response = requests.get(url + "&page=" + str(page)) data = response.json() if len(data) == 0: break data_list.extend(data) page += 1 remove_keys = ["@context", "@id", "@type", "o:vocabulary", "o:id", "o:local_name"] for data in data_list: for key in remove_keys: if key in data: del data[key] # DataFrameに変換 df = pd.DataFrame(data_list) df.to_excel("archiveshub.xlsx", index=False) 結果 以下のようなMS Excelが得られます。 o:label o:comment o:term Maintenance Agency A repository responsible for the maintenance of the archival finding aid. archiveshub:maintenanceAgency Is Maintenance Agency Of An archival finding aid for which the repository is responsible for the maintenance. archiveshub:isMaintenanceAgencyOf Encoded As An EAD document that is an encoding of the archival finding aid. archiveshub:encodedAs Encoding Of An archival finding aid of which the EAD document is an encoding. archiveshub:encodingOf Administers A resource which the agent manages. archiveshub:administers Is Administered By An agent that manages the resource. archiveshub:isAdministeredBy Provides Access To A resource to which the agent provides access. archiveshub:providesAccessTo Access Provided By An agent that provides access to the resource. archiveshub:accessProvidedBy Is Publisher Of A resource which the agent makes available. archiveshub:isPublisherOf Level An indicator of the part of an archival collection constituted by an archival resource. archiveshub:level Is Represented By A resource which represents the archival resource, such as an image of a text page, a transcription of text, an audio or video clip, or an aggregation of such resources. archiveshub:isRepresentedBy Origination An agent responsible for the creation or accumulation of the archival resource. archiveshub:origination Is Origination Of An archival resource for which the agent is responsible for the creation or accumulation. archiveshub:isOriginationOf Has Biographical History A narrative or chronology that places archival materials in context by providing information about their creator(s). archiveshub:hasBiographicalHistory Is Biographical History For An archival resource that the narrative or chronology places in context by providing information about their creator(s). archiveshub:isBiographicalHistoryFor Associated With A concept adjudged by a cataloguer to have an association with an archival resource which they consider useful for the purposes of discovering that resource. archiveshub:associatedWith Members Members archiveshub:members Country Code The ISO 3166-1 code for the country of the repository. archiveshub:countryCode Maintenance Agency Code The ISO 15511 code for the repository. archiveshub:maintenanceAgencyCode Body A literal representation of the content of the document. archiveshub:body Date created or accumulated The date, represented as a string, of a time interval during which the archival resource was created or accumulated. archiveshub:dateCreatedAccumulatedString Date created or accumulated The date, represented as a typed literal, of a time interval during which the archival resource was created or accumulated. archiveshub:dateCreatedAccumulated Date created or accumulated (start) The start date, represented as a typed literal, of a time interval during which the archival resource was created or accumulated. archiveshub:dateCreatedAccumulatedStart Date created or accumulated (end) The end date, represented as a typed literal, of a time interval during which the archival resource was created or accumulated. archiveshub:dateCreatedAccumulatedEnd Date of Birth The date of birth of the person. archiveshub:dateBirth Date of Death The date of death of the person. archiveshub:dateDeath Extent The size of the archival resource. archiveshub:extent Custodial History Custodial History archiveshub:custodialHistory Acquisitions Acquisitions archiveshub:acquisitions Scope and Content Scope and Content archiveshub:scopecontent Appraisal Appraisal archiveshub:appraisal Accruals Accruals archiveshub:accruals Access Restrictions Access Restrictions archiveshub:accessRestrictions Use Restrictions Use Restrictions archiveshub:useRestrictions Physical and Technical Requirements Physical and Technical Requirements archiveshub:physicalTechnicalRequirements Other Finding Aids Other Finding Aids archiveshub:otherFindingAids Location of Originals Location of Originals archiveshub:locationOfOriginals Alternate Forms Available Alternate Forms Available archiveshub:alternateFormsAvailable Related Material Related Material archiveshub:relatedMaterial Bibliography Bibliography archiveshub:bibliography Note Note archiveshub:note Processing Processing archiveshub:processing Name Name archiveshub:name Dates Dates archiveshub:dates Location Location archiveshub:location Other Other archiveshub:other Surname The surname of a person who is the focus of the concept archiveshub:surname Forename The forename of a person who is the focus of the concept archiveshub:forename Title The title of a person who is the focus of the concept archiveshub:title Epithet Epithet archiveshub:epithet Archival Box A number of archival boxes archiveshub:archbox Metre A number of metres archiveshub:metre Cubic Metre A number of cubic metres archiveshub:cubicmetre Folder A number of folders archiveshub:folder Envelope A number of envelopes archiveshub:envelope Volume A number of volumes archiveshub:volume File A number of files archiveshub:file Item A number of items archiveshub:item Page A number of pages archiveshub:page Paper A number of papers archiveshub:paper まとめ Omeka Sの利用にあたり、参考になりましたら幸いです。 ...

Omeka SのCustom Vocabモジュールを使って、他のアイテムを関連づける

Omeka SのCustom Vocabモジュールを使って、他のアイテムを関連づける

概要 Omeka SのCustom Vocabモジュールを使って、他のアイテムを関連づける機会がありましたので、備忘録です。 背景 以下の記事で、カスタム語彙の使い方を説明しました。 今回は、文字列やURIsでなく、アイテムを関連づけてみます。 アイテムセットの作成 まず、関連付け対象とするアイテムを格納するアイテムセットを作成します。 今回は、「二次利用条件表示」というアイテムセットを作成します。 「二次利用条件表示」に関するアイテムの作成 以下のように、アイテムを作成しました。 ここのアイテムは、以下のように、タイトルや内容記述、識別子などを与えます。 カスタム語彙の作成 以下のように、カスタム語彙を作成します。ポイントとして、Vocab typeにおいて「アイテム」を選択し、アイテムにおいて、前のステップで作成したアイテムセット「二次利用条件表示」を選択します。 リソーステンプレートの作成 リソーステンプレートを作成して、データタイプにおいて、作成したカスタム語彙を選択します。 任意のアイテムの作成 任意のアイテムの作成において、先に作成したリソーステンプレートを選択します。結果、以下のように、設定したアイテムセットのアイテムから値を選択するようになります。 利点 今回説明したような方法を採用することで、指定した項目から値を選択する形式になり、表記揺れを防ぐことができます。また、その値をアイテムとして設定することで、メタデータの管理を一元化することが可能です。例えば、二次利用条件表示の内容を更新したい場合は、該当する二次利用条件表示のメタデータのみを更新すればよく、関連付けた複数のアイテムを個別に更新する必要はありません。 これは、Drupalにおけるタクソノミーのような使い方に該当します。 まとめ Omeka Sの利用にあたり、参考になりましたら幸いです。

XSLTを使ってIIIFとTEIの対照表示を実現する

XSLTを使ってIIIFとTEIの対照表示を実現する

概要 XSLTを使ってIIIFとTEIの対照表示を実現してみる機会がありましたので、備忘録です。 結果は以下からご確認いただけます。「校異源氏物語テキストDB」を利用しています。 https://kouigenjimonogatari.github.io/xml/xsl/01.xml 背景 TEI/XMLの可視化にあたって、これまでは、TEI XMLをHTMLに変換してブラウザ上で表示するためのJavaScriptライブラリであるCETEICeanを使うことが多かったです。 これらの取り組みではJavaScriptのフレームワークと合わせて、柔軟な開発が可能でした。 しかし、この方法ではTEI/XMLとは別に、ビューアのデプロイが必要であるなど、課題を感じる点もありました。 対策 そこで、XSLTを使ったIIIFとTEIの対照表示に取り組みました。以下のXSLファイルを用意しました。実装にあたっては、ChatGPTを利用しました。 https://github.com/kouigenjimonogatari/kouigenjimonogatari.github.io/blob/master/xsl/mirador.xsl そして、XMLファイルからは、以下のように参照します。相対パスとなっている点は、適宜読み替えてください。 <?xml version="1.0" ?> ... <?xml-stylesheet type="text/xsl" href="../../xsl/mirador.xsl"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title>校異源氏物語・きりつぼ</title> <author>池田亀鑑</author> ... これにより、以下のようなXMLファイルをブラウザで表示すると、 https://kouigenjimonogatari.github.io/xml/xsl/01.xml 以下のように、IIIFとTEIの対照表示を実現することができました。ページのリンクやMiradorビューアの前後ボタンのクリックにより、テキストと画像が同期します。 このようにXSLTによる可視化を行うことにより、別途のビューア開発やデプロイが不要となり、またxslファイルの更新による容易なカスタマイズを実現することができました。 考察 Next.jsのようなフレームワークとCETEIceanを組み合わせてビューアを作成する方法と、本記事で紹介したようなXSLTを使った可視化方法について、ChatGPTに使い分けを聞いてみました。 結果、以下のように、比較的単純な可視化ではXSLT、高度なインタクラションが求められる場合はCETEIcean、を選択するのがよさそうでした。 1. 高度なインタラクションが必要な場合: Next.js + CETEIcean Next.js はReactベースのフレームワークで、クライアントサイドレンダリングやサーバーサイドレンダリング、APIの統合などを柔軟に行えます。Next.jsを使うと、複雑なUIや状態管理、ナビゲーション、動的なデータ処理が必要なアプリケーションの構築が簡単です。 CETEIcean は、TEI XMLをそのままHTMLにレンダリングするためのライブラリで、特にクライアントサイドでTEIを動的に表示したい場合に便利です。CETEIceanを使うと、JavaScriptを使ってTEI要素を直接操作できるため、ユーザーがクリックした際に特定のページに遷移したり、アノテーションの追加など、インタラクティブな機能を実装できます。 利点 : リッチなインタラクション(ページナビゲーション、フィルタリング、ユーザーの操作に応じた動的なUIの更新など)が容易。 コンポーネントベースの設計が可能で、保守性が高く再利用性も高い。 さまざまなJavaScriptライブラリやプラグイン(Mirador、Annotoriousなど)との統合が容易。 2. 単純な表示や静的な構造でよい場合: XSLT XSLT は、XMLデータをHTMLなどに変換するためのテンプレート言語で、サーバーサイドまたはクライアントサイドでの静的な表示に適しています。XSLTを使用すると、TEI XMLをシンプルなHTMLとして表示できます。 利点 : 軽量で設定がシンプル。ブラウザがXSLTをサポートしていれば、特別な環境を必要とせずに、直接HTML表示が可能。 HTMLとして生成されるため、CSSによるスタイルの適用が容易で、簡単なナビゲーションや静的なページリンク程度なら実装も比較的簡単。 静的なレポートや閲覧専用のデータの表示に最適。 判断基準のまとめ 高度な機能やインタラクティブな要素が求められる :Next.js + CETEIcean 例:クリックやスクロールに応じて動的にデータをロード、複数のナビゲーションや検索機能の提供、アノテーションや画像ビューワーの統合。 単純な表示がメイン :XSLT 例:TEIドキュメントをただ表示するだけ、特定の要素にスタイルを適用して閲覧しやすくする、シンプルなページナビゲーション。 まとめ ビューアを使用せずに、TEI/XMLファイルとXSLファイルのみで閲覧環境を実現することは、管理や運用コストの低減にもつながるように思いました。 ...