ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
【Omeka S モジュール紹介】HistoryLog:変更履歴の記録

【Omeka S モジュール紹介】HistoryLog:変更履歴の記録

概要 2023/07/20時点において、まだベータ版のようですが、Omeka Sで変更履歴を記録するモジュール「Omeka-S-module-HistoryLog」を試す機会がありましたので、備忘録です。 https://github.com/Daniel-KM/Omeka-S-module-HistoryLog インストール 以下に記載がありますが、事前にGenericモジュールをインストールする必要がある場合があります。 https://github.com/Daniel-KM/Omeka-S-module-HistoryLog#installation その他は通常のモジュールのインストール手順と同じです。インストール後、モジュール一覧に以下のように表示されます。 使い方 例えば、特定のアイテムのタイトルを以下のように更新してみます。 保存すると、画面の右下に「History Log」という項目が表示され、最終更新日と更新イベントへのリンクが表示されます。 リンクをクリックすると、変更イベントの一覧が表示され、いつ・誰が・どのような更新を行なったかを確認できます。 まとめ StrapiやDrupalなどのCMSでは標準的な機能ですが、変更履歴を記録できるようになると、さらに便利になるように思います。 まだ開発中のモジュールのため、ご利用される際は注意が必要ですが、参考になりましたら幸いです。

Omeka Classic IIIF Toolkitで使用されているMiradorを2.7にアップデートしました。

Omeka Classic IIIF Toolkitで使用されているMiradorを2.7にアップデートしました。

概要 Omeka Classic IIIF Toolkitで使用されているMiradorを2.7にアップデートしました。以下のページでソースコードをご確認いただけます。 https://github.com/nakamura196/IiifItems また、以下のURLから、zipファイルをダウンロードできます。 https://github.com/nakamura196/IiifItems/releases/download/1.1.1/IiifItems-1.1.1.zip できるようになること Mirador 2.7を使用することにより、IIIFのImage APIに非対応の画像でもビューアに表示することが可能になります。これにより、一般に公開されている画像に対しても、Miradorを用いたアノテーションの付与および管理が可能になります。 この利点を活かして、画像のURLを含むCSVファイルを用意して、Omeka Classicに登録する以下の記事を執筆しています。 まとめ Omeka Classic IIIF Toolkitの利用にあたり、参考になりましたら幸いです。 なお、Omeka Classic IIIF Toolkitを開発してくださったトロント大学図書館の方々に感謝いたします。

Amazon EC2に立てたVirtuosoのヘルスチェックを行う

Amazon EC2に立てたVirtuosoのヘルスチェックを行う

概要 Amazon EC2に立てたVirtuosoのヘルスチェックを行う機会がありましたので、その備忘録です。 具体的には、何らかの不具合で、Virtuoso(https://xxx.zzz/sparql など)がエラーを返すようになってしまった際、その内容をメールで通知します。 方法 以下の記事で、Amazon EC2にVirtuoso RDFストアを構築する方法を紹介しています。 上記では、ELBを使用しています。上記の記事から1点だけ変更を行う必要があります。Health check pathを/に設定していますが、この部分をSPARQLエンドポイントへのパス(例えば/sparql)に変更します。 その後、以下の記事を参考に、CloudWatchやAmazon SNSの設定を行いました。 https://dev.classmethod.jp/articles/elb-healthcheck-monitoring-by-cloudwatch-alarm/ 結果 以下のようにモニタリングを行うことができるようになりました。 またアラート発生時には、以下のようなメールが届くようになりました。 You are receiving this email because your Amazon CloudWatch Alarm "virtuoso-unhealthyhostcount-alarm" in the US East (N. Virginia) region has entered the ALARM state, because "Threshold Crossed: no datapoints were received for 5 periods and 5 missing datapoints were treated as [Breaching]." at "Friday 14 July, 2023 08:05:30 UTC". View this alarm in the AWS Management Console: https://us-east-1.console.aws.amazon.com/cloudwatch/deeplink.js?region=us-east-1#alarmsV2:alarm/virtuoso-unhealthyhostcount-alarm Alarm Details: - Name: virtuoso-unhealthyhostcount-alarm - State Change: OK -> ALARM - Reason for State Change: Threshold Crossed: no datapoints were received for 5 periods and 5 missing datapoints were treated as [Breaching]. - Timestamp: Friday 14 July, 2023 08:05:30 UTC - AWS Account: xxxxxxxxxxxxxx - Alarm Arn: arn:aws:cloudwatch:us-east-1:xxxxxxxxxxxxxx:alarm:virtuoso-unhealthyhostcount-alarm Threshold: - The alarm is in the ALARM state when the metric is GreaterThanOrEqualToThreshold 1.0 for at least 5 of the last 5 period(s) of 60 seconds. Monitored Metric: - MetricNamespace: AWS/ApplicationELB - MetricName: UnHealthyHostCount - Dimensions: [TargetGroup = targetgroup/virtuoso] [AvailabilityZone = us-east-1a] [LoadBalancer = app/virtuoso/yyyyyyyyyyyyyyy] - Period: 60 seconds - Statistic: Minimum - Unit: not specified - TreatMissingData: breaching State Change Actions: - OK: - ALARM: [arn:aws:sns:us-east-1:xxxxxxxxxxxxxx:Default_CloudWatch_Alarms_Topic] - INSUFFICIENT_DATA: まとめ 同様の環境でVirtuosoを運用されている際の参考になりましたら幸いです。 ...

OpenSeadragonでビューポートが設定した制約を満たすようにzoomToを行う

OpenSeadragonでビューポートが設定した制約を満たすようにzoomToを行う

OpenSeadragonのzoomToメソッドを使用した後に、viewport.applyConstraints()を呼び出すことで、ビューポートが設定した制約を満たすように調整されます。これは、ズームやパンの操作がビューポートの制約を超えた場合に有用です。 以下にその例を示します: // `viewer`はOpenSeadragonのインスタンス const zoomLevel = 2.0; viewer.viewport.zoomTo(zoomLevel); viewer.viewport.applyConstraints(); 上記のコードでは、まずビューポートのズームレベルを指定した値に設定します。その後、applyConstraintsメソッドを呼び出すことでビューポートがその制約を満たすように調整されます。つまり、もし指定したズームレベルが設定された制約を超えていた場合、ズームレベルはその制約に合うように調整されます。 この方法は、指定したズームレベルや位置が制約を超えていた場合でも、ビューポートが常に有効な状態を維持できるようにするために有用です。

OpenSeadragon(OSD)の`fitBounds`と`fitBoundsWithConstraints`の違い

OpenSeadragon(OSD)の`fitBounds`と`fitBoundsWithConstraints`の違い

(以下、ChatGPTによる回答です。参考になりましたら幸いです。) OpenSeadragon(OSD)のfitBoundsとfitBoundsWithConstraintsの違いは、制約を適用するかどうかにあります。 OSDは高度なズーム機能とパニング機能を持つJavaScriptライブラリで、深くズーム可能な画像やコンテンツを扱う際に使われます。その中のfitBoundsとfitBoundsWithConstraintsは、ビューポート(表示領域)を特定の境界に合わせるメソッドです。 fitBounds(rectangle, immediately): ビューポートを指定した矩形に合わせます。immediatelyパラメータがtrueの場合、アニメーションなしで即座にビューポートをフィットさせます。falseの場合、アニメーションを伴ってビューポートをフィットさせます。 fitBoundsWithConstraints(rectangle, immediately): fitBoundsと同じ動作をしますが、ビューポートのズームとパンの制約を考慮します。つまり、指定した矩形にフィットさせる前に、最小ズームレベル、最大ズームレベル、画像のパン制約などを確認します。これにより、ユーザーが画像をズームやパンしても、設定した制約を超えることがありません。 つまり、主な違いはfitBoundsWithConstraintsがビューポートの制約を適用することで、その制約を超える動作を防ぎます。これは特に、ユーザーが画像をズームイン/ズームアウトしたり、画像をパン(スクロール)する際の振る舞いを制御するのに重要です。

Omeka Classicでコレクションを一括削除する方法

Omeka Classicでコレクションを一括削除する方法

概要 Omeka Classicでコレクションを一括削除する方法の一例を紹介します。Omeka Classic (Version 3.1.1)では、コレクションを複数選択して削除するGUIは提供されていません。アイテムについては、同機能が提供されています。 そこで、APIを用いてコレクションの一括削除を行います。 APIキーの取得 以下を参考に、APIの有効化とAPIキーの発行を行います。 https://omeka.org/classic/docs/Admin/Settings/API_Settings/ 具体的には、まず以下のページにアクセスします。 /admin/settings/edit-api そして、ユーザ毎のページにアクセスして、「API Keys」のタブを選択します。「New key label」からAPIキーを発行します。 /admin/users/api-keys/1 Pythonスクリプト 以下のようなPythonスクリプトにより、コレクションの一括削除を行うことができます。以下では、アイテム数が0のコレクションのみを削除するように設定しています。 import requests api_key = "<取得したAPIキー>" # 要変更 endpoint = "https://example.org/omeka/api" # 要変更 params = { "key": api_key } # コレクション一覧の取得 url = f"{endpoint}/collections" collections = requests.get(url, params=params).json() for collection in collections: # コレクションに含まれるアイテム数を取得 items_count = collection["items"]["count"] # アイテム数が0の場合 if items_count == 0: url_collection = collection["url"] requests.delete(f"{url_collection}", params=params) まとめ Omeka Classicでコレクションを一括削除する際の参考になりましたら幸いです。

IIIF Mirador2のアノテーション画面の説明

IIIF Mirador2のアノテーション画面の説明

概要 IIIF Mirador2のアノテーション画面の使い方(の一部)を説明します。 四角形アノテーションの作成 https://www.youtube.com/watch?v=jny09nLZvLU パス(多角形)アノテーションの作成 アノテーションを終了する場合には、ダブルクリックします。 https://www.youtube.com/watch?v=4cM-6-rXL9M 既存のアノテーションの修正 https://www.youtube.com/watch?v=HlE36inbgq4 既存のアノテーションの削除 https://www.youtube.com/watch?v=STk2vjLc_-k まとめ IIIF Mirador2を用いたアノテーション付与の際の参考になりましたら幸いです。

ArchivematicaのAPIを用いて、TransferからAIPのダウンロードまでを行う。

ArchivematicaのAPIを用いて、TransferからAIPのダウンロードまでを行う。

背景 ArchivematicaのAPIを用いて、TransferからAIPのダウンロードまでを行うことができましたので、メモします。 以前、ArchivematicaのAPI利用と、Storage ServiceのAPI利用をそれぞれ記事にしました。 今回は、上記を組み合わせて、TransferからAIPのダウンロードまでを行います。 方法 以下のノートブックに方法を記載しました。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ArchivematicaのAPIを使ってみる.ipynb まとめ ArchivematicaのAPI利用にあたり、参考になりましたら幸いです。 今後は、サーバへの処理対象ファイルのアップロードや、上記のAPIを使用したフロントエンドの開発にも取り組みたいと思います。

Omeka Sでアイテムセット毎のページに表示されるアイテムのデフォルトソートを設定する

Omeka Sでアイテムセット毎のページに表示されるアイテムのデフォルトソートを設定する

概要 Omeka Sでアイテムセット毎のページに表示されるアイテムのデフォルトソートを設定する方法について記載します。 具体的には、以下のような画面の初期ソートについてです。デフォルトでは「登録日」「降順」に設定されています。 以下、Omeka v4とv3で方法が異なりますので、それぞれについて説明します。 v4 以下のサイト毎の設定画面にアクセスします。 /admin/site/s/<URLスラッグ>#site-settings そして、以下の「Item browse defaults」で、フィールドと昇順・降順を設定します。 注意として、ここで設定したソートは、アイテムセットのページだけでなく、アイテムの一覧ページの初期ソートも変更されてしまいます。 そこで、以下のように、ナビゲーションのクエリ設定から、アイテム一覧については、別途デフォルトソートを設定することで、それぞれ異なるデフォルトソートを設定することができます。 /admin/site/s/<URLスラッグ>/navigation 他にも良い方法があるかもしれませんが、一つの方法として参考になりましたら幸いです。 v3 v3の場合、以下のモジュールを追加します。 https://github.com/Daniel-KM/Omeka-S-module-Next インストール後、サイト毎の設定画面に以下の項目が追加されます。 /admin/site/s/<URLスラッグ>#site-settings 以下のように説明があります。 Set order for item set, one by row, format “id,id,id property order”. Use “0” for the default. 例えば、0 dcterms:title ascと入力すると、アイテムセットにおけるアイテムのデフォルトソートがdcterms:titleに対する昇順になります。アイテムセット毎に設定を変更したい場合には、当該アイテムセットのIDを指定します。例75532 dcterms:title asc まとめ Omeka Sでアイテムセット毎のページに表示されるアイテムのデフォルトソートを設定する方法について記載しました。より良い方法があるかもしれませんが、一つの方法として参考になりましたら幸いです。

Strapi v4のGraphQLのソートやページネーション

Strapi v4のGraphQLのソートやページネーション

Strapi v4のGraphQLのソートやページネーションの方法を調べました。以下に記載がありました。 https://docs.strapi.io/dev-docs/api/graphql 具体的には、以下のような形で記述することで、ページネーションやソートを行うことができました。 query { blogPosts(pagination: {page: 1, pageSize: 10}, sort: "createdAt:desc") { meta { pagination { total } } data { id attributes { createdAt } } } } 参考になりましたら幸いです。

DrupalでOpenAPIを有効にする

DrupalでOpenAPIを有効にする

概要 DrupalでOpenAPIを有効にする機会がありましたので、その備忘録です。なお、以下のjson:apiモジュールを有効化済みです。 モジュールのインストール 以下の2つのモジュールをインストールします。 https://www.drupal.org/project/openapi https://www.drupal.org/project/openapi_jsonapi 結果、以下のURLで、jsonを取得することができます。 /openapi/jsonapi 以下にアクセスすると、「No UI …」と表示されます。次に、UIを追加してみます。 /admin/config/services/openapi UIの追加 以下の2つのモジュールをインストールします。 https://www.drupal.org/project/openapi_ui https://www.drupal.org/project/openapi_ui_redoc 結果、「Explore」のボタンが表示されます。 ボタンをクリックすると、以下の画面に遷移します。 /admin/config/services/openapi/redoc/jsonapi Swagger UIライクな画面が表示されます。 なお、Redocは、以下のように説明されていました。 Redoc is an open-source tool for generating documentation from OpenAPI (fka Swagger) definitions. https://github.com/Redocly/redoc 参考 以下の「Swagger UI for OpenAPI UI」についてもインストールしてみましたが、私の環境ではエラーが出てしまいました。 https://www.drupal.org/project/openapi_ui_swagger まとめ DrupalでOpenAPIを利用される際の参考になりましたら幸いです。

Nuxt3でOpenSeadragonとOpenSeadragon SVG Overlayを使う

Nuxt3でOpenSeadragonとOpenSeadragon SVG Overlayを使う

概要 Nuxt3でOpenSeadragonとOpenSeadragon SVG Overlayを使う例を作成しました。(鯰に御札を貼る要石)「国立国会図書館 所蔵」の画像を利用しています。 OpenSeadragon https://nuxt3-demo-nine.vercel.app/osd OpenSeadragon SVG Overlay https://nuxt3-demo-nine.vercel.app/osd-svg 方法 ポイントとして、以下のようなプラグインファイルを用意しました。これにより、SSR時に生じる不具合を解消できました。 https://github.com/nakamura196/nuxt3-demo/blob/main/plugins/osd.client.js またsvg overlayに関する記述は以下を参考にしました。 https://github.com/openseadragon/svg-overlay/blob/master/openseadragon-svg-overlay.js まとめ よりよい記述の方法があるかと思いますが、Nuxt3でのOpenSeadragonの利用にあたり、参考になりましたら幸いです。

Disable UI: DrupalをヘッドレスCMSとして使う

Disable UI: DrupalをヘッドレスCMSとして使う

DrupalをヘッドレスCMSとして使う機会があり、UIへのアクセスを管理者等に限定するDisable UIモジュールを試しました。 https://www.drupal.org/project/disable_ui 結果、トップページへのアクセス等は、以下のように表示されました。 一方、有効化したjson:apiなどについては、非ログインユーザもアクセスできました。 /jsonapi/ DrupalをヘッドレスCMSとして使用する際の参考になりましたら幸いです。

さくらレンタルサーバにOmeka Sをインストールする際のimagemagickのパス指定

さくらレンタルサーバにOmeka Sをインストールする際のimagemagickのパス指定

概要 さくらレンタルサーバにOmeka Sをインストールする際、imagemagickのパス指定が必要でした。 以下のように、設定ファイルを修正します。 <?php return [ 'logger' => [ 'log' => false, 'priority' => \Laminas\Log\Logger::NOTICE, ], 'http_client' => [ 'sslcapath' => null, 'sslcafile' => null, ], 'cli' => [ 'phpcli_path' => null, ], 'thumbnails' => [ 'types' => [ 'large' => ['constraint' => 800], 'medium' => ['constraint' => 200], 'square' => ['constraint' => 200], ], 'thumbnailer_options' => [ 'imagemagick_dir' => '/usr/local/bin', # ここを修正 ], ], 'translator' => [ 'locale' => 'en_US', ], 'service_manager' => [ 'aliases' => [ 'Omeka\File\Store' => 'Omeka\File\Store\Local', 'Omeka\File\Thumbnailer' => 'Omeka\File\Thumbnailer\ImageMagick', ], ], ];

StrapiとAmazon OpenSearchを連携する

StrapiとAmazon OpenSearchを連携する

概要 StrapiとElasticsearchとの連携にあたり、以下の記事が参考になりました。 https://punits.dev/blog/integrating-elasticsearch-with-strapi/ ソースコードも公開されています。 https://github.com/geeky-biz/strapi-integrate-elasticsearch ここでは、上記の記事を参考にして、Amazon OpenSearchと連携するなど、一部カスタマイズした内容についてメモします。 カスタマイズしたソースコードは以下です。 https://github.com/nakamura196/strapi-integrate-opensearch 修正点 以下について、記事ではindexing_typeとなっていますが、indexing_request_typeとする必要がありました。 https://github.com/nakamura196/strapi-integrate-opensearch/blob/006c533d4d7882fc9779552db31a7b0e2ada5e57/elastic/cron-search-indexing.js#L16 またElasticsearchではなく、Amazon OpenSearchを使用するにあたり、以下のライブラリをインストールする必要があります。 npm install @opensearch-project/opensearch npm install @aws-sdk/credential-providers 認証の方法はいくつかあると思いますが、ここでは以下のように変更しました。 https://github.com/nakamura196/strapi-integrate-opensearch/blob/006c533d4d7882fc9779552db31a7b0e2ada5e57/elastic/elasticClient.js#L1C1-L30 インデックスへの登録および削除の処理についても、以下のように修正する必要がありました。 https://github.com/nakamura196/strapi-integrate-opensearch/blob/006c533d4d7882fc9779552db31a7b0e2ada5e57/elastic/elasticClient.js#L39-L44 上記のような修正の結果、StrapiとAmazon OpenSearchを接続させることができました。 elastic/elasticClient.js および src/api/search/controllers/search.js を変更することで、APIの出力結果もカスタマイズできました。これにより、ElasticsearchのAggregationsを使用することができるようになりました。(私の調査不足により、Strapi単体でも実現できるかもしれません。) まとめ StrapiとAmazon OpenSearchの連携にあたり、参考になりましたら幸いです。

StrapiのREST APIの設定など

StrapiのREST APIの設定など

概要 StrapiのREST APIの一部設定に関する備忘録です。 検索結果の上限を変更する 以下に記載がありました。 https://docs.strapi.io/dev-docs/api/rest/sort-pagination#pagination 具体的には、以下です。 The default and maximum values for pagination[limit] can be configured in the ./config/api.js file with the api.rest.defaultLimit and api.rest.maxLimit keys. module.exports = { rest: { defaultLimit: 25, maxLimit: 1000, // 100, withCount: true, }, }; STATEがDraftのものも含めて取得する デフォルトではSTATEがDraftのものは取得できませんでした。以下の記事が参考になりました。 https://forum.strapi.io/t/can-i-expose-an-collection-entry-in-draft-mode-in-the-api-for-a-certain-user/895/4 具体的には以下のようなクエリパラメータを追加することで取得できました。 ?publicationState=preview&filters[publishedAt][$null]=true まとめ Strapiの利用にあたり、参考になりましたら幸いです。

IIIFマニフェストファイルからPDFファイルを作成する

IIIFマニフェストファイルからPDFファイルを作成する

概要 IIIFマニフェストファイルからPDFファイルを作成する機会がありました。このソリューションとして、以下のリポジトリが見つかりましたが、うまく動かすことができませんでした。 https://github.com/jbaiter/pdiiif そこで、上記リポジトリはJavaScriptを使用していますが、今回はPythonを用いた変換ツールを作成しました。 使い方 以下のノートブックからお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/iiif2pdf.ipynb 初回インストール時に、img2pdfをインストールしますが、PILのバージョンの関係で、「RESTART RUNTIME」ボタンが表示されますので、クリックの上、再度同じセルを実行してください。 オプションとして、「IIIFマニフェストURLの指定」「画像が格納されているフォルダのパスの指定」「ローカルに存在するIIIFマニフェストファイルのパスの指定」の3種類を用意しています。 注意点として、2023年5月末時点では、IIIF Presentation API v2にのみ対応しています。v3へは今後の対応を検討しています。 まとめ IIIFからのPDFファイルの作成にあたり、参考になりましたら幸いです。

Omeka SでIIIF画像をメディアとして登録する方法

Omeka SでIIIF画像をメディアとして登録する方法

概要 Omeka SでIIIF画像をメディアとして登録する方法を紹介します。外部のIIIF画像サーバ等で公開されている画像をOmeka Sに登録します。 公式のマニュアルでは、以下に記載があります。 https://omeka.org/s/docs/user-manual/content/items/#media 具体的な方法 アイテムの編集画面のメディアの登録画面において、以下のような値を入力します。 /info.jsonで終わるURLを入力する必要があります。以下、国立国会図書館の校異源氏物語を例としています。 https://dl.ndl.go.jp/api/iiif/3437686/R0000001/info.json 結果、以下のように、OmekaからIIIF画像を利用できるようになります。 補足 Omeka S v4から外部のIIIFマニフェストファイルの取り込み機能も提供されています。 https://dl.ndl.go.jp/api/iiif/3437686/manifest.json まとめ IIIF画像の登録にあたり、末尾に/info.jsonを追加する点がポイントです。OmekaでIIIFを利用する際の参考になりましたら幸いです。

Auth0 プロバイダーと Strapi のチュートリアル

Auth0 プロバイダーと Strapi のチュートリアル

概要 Auth0 を使用して Strapi を認証する方法を試しました。以下の記事の通りに進めることで、実現することができました。 https://strapi.io/blog/auth0-provider-and-strapi-tutorial-1 ただし、Allowed Callback URLsを指定する箇所で、http://localhost:1337/connect/auth0/callbackとなっている箇所を、http://localhost:1337/api/connect/auth0/callbackに修正する必要がありました。 (参考)github 上記手順を参考に、githubをプロパイダーとして使用する方法もうまく設定できました。

DrupalでTypeError: array_keys()...への対処

DrupalでTypeError: array_keys()...への対処

graphqlモジュールで以下のエラーが発生しました。 The website encountered an unexpected error. Please try again later. TypeError: array_keys(): Argument #1 ($array) must be of type array, null given in array_keys() (line 40 of /bitnami/drupal/modules/contrib/graphql/graphql.install). そこで、以下の記事を参考に、ソースコードを修正しました。 https://www.drupal.org/project/google_tag/issues/3319621 具体的には、以下のように書き換えることで、エラーが解消しました。 // $negotiation = $languageTypes->get('negotiation'); $negotiation = $languageTypes->get('negotiation') ?? []; 最新のバージョンでは修正されていると思いますが、同様のエラーでお困りの方の参考になりましたら幸いです。