ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Omeka Sの詳細検索画面で絞り込み項目を限定する

Omeka Sの詳細検索画面で絞り込み項目を限定する

概要 Omeka Sで構築したサイトごとの詳細検索画面において、ユーザがプロパティを選択した上で、特定の値などで検索することができます。 この機能について、デフォルトの設定では、Omeka Sに登録されているすべてのプロパティが表示されてしまうため、利用しづらいことがあります。 この課題に対して、以下のように、選択肢として表示するプロパティを限定する方法について紹介します。 本記事は、Omeka Sのversion 4.0.4を対象にしています。 マニュアル 以下に記載があります。 https://omeka.org/s/docs/user-manual/sites/site_settings/#:~:text=Advanced search vocabulary members 最新ではないですが、機械翻訳によって作成した日本語版マニュアルでは、以下に記載があります。 https://nakamura196.github.io/omeka-s-enduser/ja/sites/site_settings/#:~:text=選択できます。-,高度な検索語彙メンバー,-では、プロパティと 方法 以下にアクセスして、設定 タブを選択します。 /admin/site/s/<サイト名> 検索 という見出しを持つ箇所において、Advanced search vocabulary members という項目があります。 このフォームを使って、詳細検索に使用するプロパティを限定することができます。 まとめ Omeka Sのバージョンによって一部操作方法が異なる可能性がありますが、参考になりましたら幸いです。

Omeka Sの一括登録用モジュール: Bulk Importの使い方(2024-02版)

Omeka Sの一括登録用モジュール: Bulk Importの使い方(2024-02版)

概要 Omeka Sのアイテムやメディアの一括登録用モジュールとして、Bulk Importがあります。 https://github.com/Daniel-KM/Omeka-S-module-BulkImport 継続的な更新が行われており、色々と便利になっていたので、備忘録です。 インストール 通常の方法でインストールできます。ただし、Logモジュールを事前にインストールしておく必要があります。 https://github.com/Daniel-KM/Omeka-S-module-Log 使い方 ここでは、CSVファイルを使った登録例を紹介します。 設定 まず、以下にアクセスして、編集アイコンをクリックします。 /admin/bulk/importer “Importer"タブの"Mapper"項目について、“マニュアル/Manual"を選択します。これにより、CSVのカラム名とOmeka Sの項目の手動での対応付けが可能になります。 次に、“Processor"というタブに移動します。ここでの設定はあとから(CSVファイルをアップロード後)でも変更可能ですが、ここでデフォルト値を設定しておくと、間違いや設定漏れがなくなり、効率的かと思います。 設定例として、例えば"Action"を"Revise data of resouces"にします。これにより、部分的な更新(PATCH)が可能になります。具体的には、CSVのカラムにないOmeka Sの項目があった場合、Omeka Sでは当該項目の値が残り、CSVにあるカラムに対応するOmeka Sの項目のみが更新され、比較的安全な更新方法かと思われます。 その他、“Action on unidentified resources"を"Create a new resource"にしておくと、既存のリソースがあれば更新され、ない場合には新規作成される、といった処理になります。この 既存のリソースがあれば を判断する基準として、“Identifier to use for linked resources or update"を設定します。例えば、dcterms:identifierに識別子を与えている場合、その値に基づき、既存リソースの有無がチェックされます。 また、“可視性"を"非公開"にしておくと、新規登録されたリソースは非公開の設定になり、後から個別に公開/非公開を切り替えることができます。 インポート 以下にアクセスして、“CSV - Items"をクリックします。(Mediaなど、他のリソースを登録する場合には、該当するタイプを選択します。) /admin/bulk/bulk-import Step 2/4: Mapper 次の画面でCSVファイルをアップロード後、“Step 2/4: Mapper"画面に遷移します。ここで、CSVファイルとOmeka Sの項目のマッピングを行います。 上記では、visibilityのような予約語が一部使われていますが、これらは以下のファイルで確認できます。 https://github.com/Daniel-KM/Omeka-S-module-BulkImport/blob/master/data/mappings/fields_to_metadata.php 例えば、以下のように設定されており、visibilityまたはpublicは、Omeka Sのo:is_publicにマッピングされる、ということがわかります。 'visibility' => 'o:is_public', 'public' => 'o:is_public', 上記のようなルールに当てはらないカラムについては、手動でOmeka Sの項目とマッピングを行うことができます。 ...

Next.jsを用いたTEI/XMLファイルの簡易ビューアを作成しました

Next.jsを用いたTEI/XMLファイルの簡易ビューアを作成しました

概要 TEI/XMLファイルの内容を表示する簡易なビューアを作成しました。 https://github.com/utda/tei-viewer 校異源氏物語のTEI/XMLを対象とした表示例は以下です。 https://utda.github.io/tei-viewer/?u=https://kouigenjimonogatari.github.io/tei/01.xml&v=true 使い方 最低限の機能として、IIIFマニフェストファイルが関連付けられている場合には、Miradorビューアが表示されるようにしました。関連付けの方法としては、以下のフォーマットをベースとしています。 https://github.com/TEI-EAJ/jp_guidelines/wiki/IIIF画像とのリンク またpbタグのn属性が与えられている場合は、ページ番号が表示される機能を提供します。さらに日本語への対応として、クエリパラメータにv=trueを与えた場合、縦書きテキストが表示されます。 https://github.com/utda/tei-viewer/blob/main/src/app/components/Ceteicean.tsx その他 フレームワークにはNext.js、TEI/XMLの表示スタイルにはCETEICeanを使用しました。 https://github.com/utda/tei-viewer/blob/main/src/app/CETEIcean.css そのほか、以下の記事を参考に、GitHubリポジトリとZenodoの連携を試行しています。 改善の余地があるかと思いますが、以下のコマンドを使って、新しいリリースを作成しています。 "release": "npm version patch && git push origin --tags && VERSION=$(node -pe \"require('./package.json').version\") && gh release create \"v$VERSION\" --title \"Version $VERSION\"" 今後 pbタグとMiradorビューアの画像表示が対応する機能を追加したいと思います。 まとめ TEI/XMLファイルの可視化にあたり、参考になりましたら幸いです。

ArchivematicaでAmazon S3を処理対象およびAIPの保存先に設定する

ArchivematicaでAmazon S3を処理対象およびAIPの保存先に設定する

概要 Archivematicaにおいて、Amazon S3上のファイルやフォルダを処理対象として、さらに処理結果であるAIPをS3に保存する方法に関する備忘録です。 S3をストレージとして利用することにより、他のシステムとの連携の容易化や、AIPの長期保存に関する選択肢が増えると考えられます。 ウェルカムコレクションの以下の記事が参考になりました。 https://docs.wellcomecollection.org/archivematica/administering-archivematica/bootstrapping Amazon S3の設定 バケットを作成します。今回、us-east-1リージョンに、archivematica.aws.ldas.jpというバケットを作成しました。 そして処理対象のファイルなどを格納する「transfer_source」、処理結果であるAIPを格納する「aip_storage」というフォルダを作成しておきます。これらの名前や階層は任意で、後述の過程でどのフォルダを使用するか設定できます。 Archivematica Storage Serviceの設定 Dockerを使ってArchivematicaをインストールした場合、以下のようなURLでArchivematica Storage Serviceにアクセスできます。 http://127.0.0.1:62081/ ログイン後、以下にアクセスします。「Create new space」リンクをクリックします。 /spaces/ 「Create Space」の画面で、以下のように入力します。「Access protocol」にS3を選択し、Access Keyなどを入力します。 Staging pathについてはよくわからず、以下の記事の値を入力します。 https://docs.wellcomecollection.org/archivematica/administering-archivematica/bootstrapping#step_7 Spaceを作成後、「Create Location here」を押して、ロケーションを作成します。2つリンクがありますが、どちらも同じでした。 ここで、2つのロケーションを作成します。一つは、以下のような、Purposeを「Transfer Source」とするロケーションです。 Relative Pathについては、「Browse」ボタンから、先に作成したフォルダから選択します。 また上記ではPipelineがひとつですが、複数のPipelineを作成している場合には、関連づけるものを選択することになると思います。 もう一つは、以下のような、Purposeを「AIP Storage」とするロケーションです。 それぞれの画面で、「Set as global default location for its purpose:」という項目がありますが、これをチェックしておくと、後述するデフォルト設定などが不要になります。 確認 ここまでの設定により、/spaces/にアクセスすると、デフォルトのAccess Protocolが「Local Filesystem」のスペースに加えて、Access Protocolが「S3」のスペースが追加されていることが確認できます。 さらに、/locations/にアクセスすると、追加した2つのロケーションが追加されていることが確認できます。 Archivematica Dashboardの設定 Dockerを使ってArchivematicaをインストールした場合、以下のようなURLでArchivematica Dashboardにアクセスできます。 http://127.0.0.1:62080/ AIPの格納先の設定 そして以下にアクセスして、例えばプロセスautomatedを編集します。 /administration/processing/ ...

Universal Viewerにおける画像のコマ指定方法の一例

Universal Viewerにおける画像のコマ指定方法の一例

近年、博物館や図書館、文書館などにおいて、画像共有のための国際的な枠組みであるInternational Image Interoperability Framework(IIIF)を用いた画像公開が一般的になりつつあります。 https://iiif.io/ このIIIF画像の公開にあたり、MiradorやUniversal Viewerなどのビューアが使用されます。 https://projectmirador.org/ https://universalviewer.io/ 特に後者のUniversal Viewerが採用されたデジタルアーカイブシステムにおいては、「#?cv={画像のコマのインデックス}」を与えることで、コマを指定したURLを取得できることが多いです。 注意点として、インデックスは0からスタートしますので、2コマ目を指定したい場合には1を指定します。 「京都大学貴重資料デジタルアーカイブ」の例は以下です。 https://rmda.kulib.kyoto-u.ac.jp/item/rb00000125#?cv=1 「同志社大学デジタルコレクション」の例は以下です。 https://dgcl.doshisha.ac.jp/digital/collections/MD00000380/#?cv=1 ビューアがカスタマイズされている場合など、上記のパラメータが使用できない場合もありますが、コマ数を指定した画像共有のためのURL取得にあたり、参考になりましたら幸いです。

Docker版のCantaloupeを試す

Docker版のCantaloupeを試す

概要 TEI PublisherのDocker版を試していたところ、docker版のcantaloupeが使用されていたので、それを単体で使用できるリポジトリを作成しました。 https://github.com/nakamura196/docker_cantaloupe 使用方法は上記リポジトリのREADMEに記載しております。 以下のDocker imageを使用しています。 https://hub.docker.com/r/islandora/cantaloupe 参考:Cantaloupeで配信可能な画像 以下のページで説明されています。 https://cantaloupe-project.github.io/manual/5.0/images.html 高解像度の画像については、JPEG2000またはTIFFのPyramidal Tiledが推奨されています。 一方、解像度が比較的小さい画像の場合は、JPEGやPNGファイルをそのまま配信できるようでした。 http://localhost:8182/iiif/2/baby_role_towel_utsubuse.png/200,200,200,200/full/0/default.jpg (いらすやの画像を使用しています。) iiifというフォルダに画像を格納するだけで、IIIF Image APIの挙動を確認することができます。 まとめ CantaloupeやIIIF Image APIの挙動の確認にあたり、参考になりましたら幸いです。

Drupal: FeedsモジュールでURLからファイルを登録する

Drupal: FeedsモジュールでURLからファイルを登録する

概要 Feedsモジュールを使って、URLからファイルを登録する方法です。以下が参考になりました。 https://www.drupal.org/docs/contributed-modules/feeds/feeds-howtos/importing-files 方法 ドロップダウン リストからファイル フィールドを見つけて、ファイルまたは画像フィールドのマッピング ターゲットを作成します。 「ファイルID」には、完全な URL (http/https プレフィックスを含む) へのマッピングを指定します。 「Reference by」で「ファイルID」を選択します。 フィードが既存のファイルを処理するようにアクションを構成します。 これらの変更を構成した後、マッピングを保存します。 CSV 以下のようなCSVファイルを用意して登録します。 title url オタクのイラスト https://1.bp.blogspot.com/-EGQiXxfkfQA/U5gFr1g8qHI/AAAAAAAAhDM/17wwYnxWmHE/s800/otaku.png 結果、以下のように登録されました。 まとめ Feedsモジュールを用いたファイルの登録にあたり、参考になりましたら幸いです。

Drupalでファイルを一括削除する方法

Drupalでファイルを一括削除する方法

Drupalでファイルを一括削除する方法のメモです。以下が参考になりました。 https://www.drush.org/12.x/commands/entity_delete/ drush entity:delete file Drupal\Core\File\Exception\InvalidStreamWrapperExceptionなどが発生し、ファイルが閲覧できなくなってしまった際などの対処法として参考になりましたら幸いです。

Omeka Sで非公開ファイルを扱う

Omeka Sで非公開ファイルを扱う

概要 Omeka Sでは、リソース(アイテムセット、アイテム、メディアなど)単位で公開/非公開の設定を行うことができますが、メディア等に紐づけられた画像などのファイルについては、非公開の設定が適用されていても、ファイルのURLを知っていれば誰でもアクセスすることができます。通常、以下のようなURLになります。 <Omekaのインストールディレクトリ>/files/original/<ハッシュ値>.jpg メディアに非公開の設定が適用されていれば、このファイルのURLが知られることは稀かと思いますが、「リンクを知っている全員」がアクセスできてしまう状況を避けたいケースがあります。 上記に対応するモジュールとして、「Access」がありました。 https://omeka.org/s/modules/Access/ 本記事では、本モジュールについて簡単に紹介します。 参考: Drupalの場合 Drupalにおいては、Private filesを使って、上記の問題に対応することができました。この実現にあたっては、以下の記事が参考になりました。 https://wheelercreek.com/blog/how-configure-private-files-directory-drupal-9-10 ファイルをPrivate filesとして登録し、 Access Content や Field Permissions モジュールと組み合わせて、匿名ユーザによるPrivate filesへのアクセスを制限することができました。 Accessモジュールの使い方 本モジュールはIPアドレスによるアクセス制御や Guest モジュールとの組み合わせによる匿名ユーザによるアクセス制御など、多様な設定を行うことができるようです。 今回は、単純な設定として、original(オリジナル)およびlarge(オリジナルより小さいサイズの画像)、medium(ラージよりも小さい画像)などについて、匿名ユーザはoriginalおよびlargeの画像は閲覧できないが、medium以下の画像は閲覧できるようにしてみます。 つまり、非ログインユーザは、大きな画像は閲覧できないが、比較的小さな画像のみ閲覧できる環境を構築します。 インストール 通常の方法でインストールできます。 ウェブサーバの設定 この点が少し面倒かもしれません。以下に記載があります。 https://github.com/Daniel-KM/Omeka-S-module-Access?tab=readme-ov-file#configuration-of-the-web-server 以下、Apacheの例ですが、.htaccessファイルのRewriteEngine Onに後に、以下を追記します。 # Set rule for original and selected derivative files (usually at least large thumbnails). RewriteRule "^files/(original|large)/(.*)$" "/access/files/$1/$2" [P] 上記は、ドメインまたはサブドメインのルートにOmeka Sがインストールされている場合です。その他の方法でインストールされた場合の設定例についても、上記のマニュアルに記載されています。 上記により、<Omekaのインストールディレクトリ>/files/original/<ハッシュ値>.jpgなどにアクセスすると、<Omekaのインストールディレクトリ>/access/files/original/<ハッシュ値>.jpgというURLに書き換えられます。 書き換えられた後のURLはOmeka Sが動的に作成するもので、IPアドレスやログイン状態などを考慮して、画像を返却するかを決定するようです。 先に紹介したDrupalにおいては、Public filesがファイルが格納されているパス、Private filesがDrupalが動的に生成するURLになるようなので、このような切り替えをOmeka Sでも実現していることになります。 設定 モジュールのインストール後、以下のような設定画面が表示されます。今回の用途では、全てのチェックを外しておきます。 本モジュールを有効にすることにより、リソースごとにAccess levelを設定できるようになります。今回の用途では、禁止を与えます。 「いらすとや」さんの画像を利用しています。Access statusがforbiddenになっていますが、ログインユーザは当該画像を閲覧できています。 一方、非ログインユーザで画像を閲覧した際には、鍵のアイコンが表示されるようになりました。オリジナル画像等にアクセスできていないことが確認できます。 ...

Amazon Lightsail上に立てたOmeka SからAmazon SESでメールを送信する

Amazon Lightsail上に立てたOmeka SからAmazon SESでメールを送信する

概要 Amazon Lightsail上に立てたOmeka Sからメールを送るには、メールの送信設定が必要なようです。今回は、Amazon SESを使用する方法を紹介します。 https://aws.amazon.com/jp/ses/ 以下のフォーラムでのやりとりが参考になりました。 https://forum.omeka.org/t/configuring-sendmail-or-smtp-for-omeka-s-on-amazon-lightsail/19335/1 Amazon SESの設定 以下のサイトなどを参考にして、Amazon SESの設定を行います。 https://qiita.com/Shun_konno/items/f51ae599b68e0d2d36ea Omeka Sの設定 Omeka S の local.config.php ファイルを以下のように編集します。 <?php return [ 'logger' => [ // ログ設定(必要に応じて) ], 'mail' => [ 'transport' => [ 'type' => 'smtp', // SMTP を使用 'options' => [ 'name' => 'ses-smtp-user', // 任意の名前 'host' => 'email-smtp.us-east-1.amazonaws.com', // SES SMTP サーバーエンドポイント 'port' => 587, // SES がサポートするポート(例: 587) 'connection_class' => 'plain', // 認証タイプ 'connection_config' => [ 'username' => 'your-ses-smtp-username', // SES SMTP ユーザー名 'password' => 'your-ses-smtp-password', // SES SMTP パスワード 'ssl' => 'tls', // SSL タイプ('tls' 推奨) 'use_complete_quit' => true, ], ], ], ], // その他の設定... ]; host には、使用している AWS リージョンに応じた Amazon SES SMTP サーバーのエンドポイントを指定してください。例では us-east-1 リージョンのエンドポイントを使用していますが、必要に応じて変更してください。 username と password は、Amazon SES で生成した SMTP クレデンシャルを使用してください。 まとめ Amazon Lightsailを用いたOmeka Sの利用にあたり、参考になりましたら幸いです。 ...

Omeka Sのテーマの一覧を視覚的に確認するページを作成しました。

Omeka Sのテーマの一覧を視覚的に確認するページを作成しました。

概要 Omeka Sのテーマの一覧を視覚的に確認するページを作成しました。 https://satoru196.notion.site/satoru196/6f898ed1352e4c9fa013eee635cbabf4?v=02cab757b6cf4df6bfbedfeb85eca0a5 Omeka Sのテーマを探す際は、以下のサイトが便利です。 https://daniel-km.github.io/UpgradeToOmekaS/omeka_s_themes.html しかし、テーマの見た目やスター数を一覧できたほうがさらに便利かと思い、本サイトの以下のソースを利用させていただき、今回新たにページを作成しました。 https://github.com/Daniel-KM/UpgradeToOmekaS/blob/master/_data/omeka_s_themes.csv 作成方法 GitHub GitHub APIをリポジトリの最終更新日とスター数を取得しました。GitHub APIの使用にあたっては、Personal Access Token(PAT)を作成しました。 https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens またOmeka Sのテーマのサムネイル画像はtheme.jpgというファイルが該当するため、その有無を調べて、存在する場合には取得するようにしました。 https://omeka.org/s/docs/developer/themes/theme_functions/ 結果、以下のようなJSONデータを作成しました。 [ { "name": "1972_theme_omekaS", "last_updated": "2022-01-04T09:48:25Z", "stars": 0, "url": "https://github.com/marlara/1972_theme_omekaS", "description": "A theme based on \"The Daily\" in Omeka S, for the digital exhibition \"1972. Moda, storia e design\"", "theme_url": "https://raw.githubusercontent.com/marlara/1972_theme_omekaS/master/theme.jpg" }, { "name": "AgileBaseOmekaTheme", "last_updated": "2023-12-01T11:51:13Z", "stars": 2, "url": "https://github.com/agile-humanities/AgileBaseOmekaTheme", "description": null }, ... ] Notion ウェブページの作成にはNotionを利用しました。 https://www.notion.so/ja-jp/help/public-pages-and-web-publishing REST APIを使い、上記のJSONデータを元に、データベースを更新しました。 https://developers.notion.com/docs/working-with-databases APIの利用にあたっては、API secretを作成する必要がありました。 https://developers.notion.com/docs/create-a-notion-integration データベースはフィルターや並び替え、レイアウトの切り替えなど、とても便利でした。以下はタイムラインビューを使い、テーマ(リポジトリ)の最終更新日を表示した例です。 今後 定期更新 GitHub Actionsを使用して、定期的な更新を行いたいと思います。 ...

DrupalのSocial Auth GitHubモジュールを試す

DrupalのSocial Auth GitHubモジュールを試す

概要 DrupalのSocial Auth GitHubモジュールを試します。 https://www.drupal.org/project/social_auth_github/ 本モジュールは以下のように説明されています。 Social Auth GitHub allows users to register and login to your Drupal site with their GitHub account. (日本語訳)Social Auth GitHubは、ユーザーがGitHubアカウントを使用してDrupalサイトに登録およびログインすることを可能にします。 以下のように、GitHubアカウントを使用してログインできるようにすることを目指します。 インストール composer.phar require 'drupal/social_auth_github:^4.0' vendor/bin/drush en social_auth_github 上記のインストールにより、social_authとsocial_apiも有効化されます。 設定 以下のページを参考に設定を進めます。 https://www.drupal.org/project/social_auth_github/ Drupal 以下にアクセス /admin/config/social-api/social-auth さらに、以下にアクセス /admin/config/social-api/social-auth/github Authorized redirect URLの値をコピーしておきます。 GitHub OAuth Appsを作成します。以下のような入力を行います。 Drupal 以下に戻り、Client IDやClient secretを入力します。 /admin/config/social-api/social-auth/github この結果、/user/login/githubにアクセスすると、GitHubのログイン画面が表示され、成功すると、Post login pathで指定したページに戻ります。 (参考)ブロックの追加 以下のように、ログイン画面にGitHubへのログインブロックを設置してみます。 /admin/structure/blockにアクセスし、「ブロックを配置」を押します。 「Social Auth Login」の「ブロックを配置」を押します。 ...

Drupal REST & JSON API Authenticationモジュールの調査

Drupal REST & JSON API Authenticationモジュールの調査

概要 以下の記事を参考に、JWT認証を試してみます。 https://www.drupal.org/docs/contributed-modules/api-authentication/jwt-authentication ただ試してみた結果、JWT認証を行うには、有料プランに加入する必要がありそうで、そこで調査が止まりました。 前提条件: ダウンロードとインストール 以下の2つのモジュールをインストールして有効化します。 https://www.drupal.org/project/rest_api_authentication https://www.drupal.org/project/restui composer.phar require 'drupal/rest_api_authentication:^2.0' composer.phar require 'drupal/restui:^1.21' vendor/bin/drush en rest_api_authentication JWT ベースの API 認証を構成する手順 以下の説明に従って、APIを有効化して、JWTベースのAPI認証をセットアップします。 https://www.drupal.org/docs/contributed-modules/api-authentication/jwt-authentication#s-steps-to-configure-jwt-based-api-authentication しかし、メソッドを選択する場面で、以下に示すように、JWTを選択するには、プレミアムという有料プランに加入する必要がありそうでした。 まとめ 現在調査中のため、情報が不正確かもしれませんが、JWT認証を行うモジュールとして、以下があるようです。 https://www.drupal.org/project/jwt また、OAuth2を使用するモジュールとして、以下があるようです。 https://www.drupal.org/project/simple_oauth 次は、上記の2つのモジュールの使用方法について調査します。

Drupalモジュール開発: 異体字を考慮した検索を行う

Drupalモジュール開発: 異体字を考慮した検索を行う

概要 Drupalを用いたシステム開発にあたり、異体字を考慮した検索を行う必要がありましたので、それを実現するためのカスタムモジュールを作成しました。(すでに同様のことを行うことができるモジュールがあるかもしれませんが、私のほうでは見つけることができませんでした。) 以下のリポジトリで公開しています。 https://github.com/nakamura196/Drupal-module-itaiji 使い方 設定 /admin/configにアクセスして、検索とメタデータの項目にあるItaijiのリンクをクリックします。 Conversion Rulesというフォームに、original1, original2 => convertedのような形式で変換ルールを入力します。 検索API search_apiモジュールを使って作成したインデックスのプロセッサーにアクセスします。 /admin/config/search/search-api/index/{INDEX_NAME}/processors Itaijiという項目を有効化します。 上記により、インデックス登録およびクエリの前処理として、変換ルールに基づいた変換が行われ、異体字を考慮した検索を行うことが可能になります。 注意点とまとめ Search APIのBackendとして、データベースを選択した場合でのみ、動作確認を行なっています。また、Drupalに関する開発経験が乏しいため、他の不具合を多々見られるかと思います。ご利用にあたっては、十分にご注意ください。 DrupalのSearch APIを使った検索システムの開発にあたり、参考になりましたら幸いです。

DrupalでJSON:API Search APIを使用する際のページネーションエラー

DrupalでJSON:API Search APIを使用する際のページネーションエラー

DrupalでJSON:API Search APIを使用していた際、page[limit]などをクエリパラメータを追加した際にエラーが発生しました。 https://www.drupal.org/project/jsonapi_search_api 具体的には、以下のエラーメッセージが表示されました。 Input value “page” contains a non-scalar value. 調べてみたところ、これは以下のIssuesでも言及されていました。 https://www.drupal.org/project/jsonapi_search_api/issues/3403107 Development version(開発版)の8.x-1.x-devでは修正済みということで、以下に差し替えました。 https://www.drupal.org/project/jsonapi_search_api/releases/8.x-1.x-dev 結果、エラーが解消しました。 開発版のモジュールを使用するか要検討ですが、同様の不具合でお困りの方の参考になりましたら幸いです。

Allmapsを使ってジオリファレンスを行う

Allmapsを使ってジオリファレンスを行う

概要 今回は、Allmapsを使ったジオリファレンスを試します。 https://allmaps.org/ Allmapsは以下のように説明されています。 Allmaps makes it easier and more inspiring to curate, georeference and explore collections of digitized maps. (機械翻訳) Allmaps を使用すると、デジタル化された地図のコレクションを整理、地理参照、探索することがより簡単かつ刺激的になります。 今回は、「東京大学農学生命科学図書館」が所蔵する「東京帝國大學本部構内及農學部建物鳥瞰圖」を使用します。 https://da.dl.itc.u-tokyo.ac.jp/portal/assets/187cc82d-11e6-9912-9dd4-b4cca9b10970 以下のような成果物を作成します。 https://viewer.allmaps.org/?url=https%3A%2F%2Fannotations.allmaps.org%2Fimages%2F2e1d3f991aad6cb4 https://www.youtube.com/watch?v=G0CcXfqo6rs 方法 以下にアクセスします。 https://editor.allmaps.org/#/ 今回は、2枚目の画像を使用するので、以下のURLをフォームに入力します。 https://iiif.dl.itc.u-tokyo.ac.jp/iiif/agriculture_re/nou_tatemonochokanzu/0002.tif 以下のようなページで、「Georeference」ボタンを押します。 以下のように、画像と地図が並列に表示されるページに遷移します。画像と地図で対応する箇所をポイントしていきます。 その後、「Results」ボタンを押して、以下の「View current image」リンクをクリックします。 結果、以下のようなビューアのページに遷移します。 作成されるデータ Editor画面で、作成されるJSONデータをコピー、またはダウンロードすることができます。以下のようなJSONデータが作成されました。 { "type": "AnnotationPage", "@context": [ "http://www.w3.org/ns/anno.jsonld" ], "items": [ { "id": "75912f7214324ea9", "type": "Annotation", "@context": [ "http://www.w3.org/ns/anno.jsonld", "http://geojson.org/geojson-ld/geojson-context.jsonld", "http://iiif.io/api/presentation/3/context.json" ], "motivation": "georeferencing", "target": { "type": "Image", "source": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/2/agriculture_re%2Fnou_tatemonochokanzu%2F0002.tif/full/full/0/default.jpg", "service": [ { "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/2/agriculture_re%2Fnou_tatemonochokanzu%2F0002.tif", "type": "ImageService2" } ], "selector": { "type": "SvgSelector", "value": "<svg width=\"18415\" height=\"12911\"><polygon points=\"0,0 0,12911 18415,12911 18415,0\" /></svg>" } }, "body": { "type": "FeatureCollection", "purpose": "gcp-georeferencing", "transformation": { "type": "polynomial", "order": 0 }, "features": [ { "type": "Feature", "properties": { "pixelCoords": [ 6690, 7517 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7623182, 35.7151233 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 8846, 9181 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7612649, 35.7129321 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 11626, 8624 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7622949, 35.7109037 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 12761, 9476 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7618816, 35.7097492 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 7540, 8365 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7618343, 35.7143244 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 10681, 5983 ] }, "geometry": { "type": "Point", "coordinates": [ 139.764372, 35.7123118 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 9304, 5659 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7645652, 35.7135689 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 3826, 10219 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7594158, 35.7166753 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 8044, 9859 ] }, "geometry": { "type": "Point", "coordinates": [ 139.76062, 35.7134203 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 10517, 7862 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7627108, 35.7121183 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 8892, 9831 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7607901, 35.7126873 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 14667, 9708 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7620234, 35.7081704 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 2354, 8506 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7608678, 35.7184833 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 10054, 8713 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7620034, 35.7122089 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 5594, 10678 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7593041, 35.7151585 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 13028, 6647 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7642327, 35.7102509 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 10685, 10444 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7605725, 35.7111428 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 4438, 9181 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7606565, 35.7165095 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 8840, 10491 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7602447, 35.7126024 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 4667, 10202 ] }, "geometry": { "type": "Point", "coordinates": [ 139.759576, 35.7159457 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 6762, 10060 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7600401, 35.7144106 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 8587, 8135 ] }, "geometry": { "type": "Point", "coordinates": [ 139.762299, 35.7134381 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 7967, 10465 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7600601, 35.7133129 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 6466, 8313 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7616346, 35.7150937 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 7569, 7471 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7625263, 35.7143713 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 10111, 10099 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7607835, 35.7116287 ] } }, { "type": "Feature", "properties": { "pixelCoords": [ 12606, 10162 ] }, "geometry": { "type": "Point", "coordinates": [ 139.7611825, 35.7096128 ] } } ] } } ] } まとめ IIIF対応画像に対するジオリファレンスを行うにあたり、参考になりましたら幸いです。 ...

Universal Viewer v4を使ったページの作成例

Universal Viewer v4を使ったページの作成例

概要 以下のように、ページ全体にUniversal Viewerが表示されるページを作成しましたので、その備忘録です。Universal Viewer v4を使用しています。 https://nuxt3-demo-nine.vercel.app/uv/?manifest=https://dl.ndl.go.jp/api/iiif/3437686/manifest.json ソースコード 以下のソースコードを参考にしてください。 https://github.com/nakamura196/nuxt3-demo/blob/main/public/uv/index.html 以下のページにある https://github.com/UniversalViewer/universalviewer/wiki/UV-Examples 以下のサンプルを参考に、ページのリサイズに応じて、ビューアのサイズも変更されるようにしています。 https://codesandbox.io/s/uv-url-adapter-example-9d6x8 また、manifestというクエリパラメータを受け取る記述も含めています。 参考 以下を参考に、cdnを利用しない形でのNuxt3への導入を試みましたが、うまく動作させることができませんでした。こちらについては、引き続き調査を行いたいと思います。 https://codesandbox.io/s/uv-vite-example-9ie3rh まとめ 以下のページで、v3を用いた全画面表示の例が公開されていますが、本記事執筆時点では、v4の例が見当たりませんでした。 https://universalviewer.io/examples/uv/uv.html#?manifest=https://dl.ndl.go.jp/api/iiif/3437686/manifest.json 参考になりましたら幸いです。

Drupal: Feeds Tamperモジュールを使った複数の値の登録とスキップ処理

Drupal: Feeds Tamperモジュールを使った複数の値の登録とスキップ処理

概要 DrupalのFeedsモジュールを使って、以下のようなCSVの登録を試みました。 id title target xxx あああ 9600023 このように、一つのフィールドに複数の値を登録したい場合には、Feeds Tamperモジュールが使用できました。 https://www.drupal.org/project/feeds_tamper 以下の記事が参考になりました。 https://acret.jp/drupal/articles/456 以下のように設定することで、複数の値を一括登録できました。 ただし、以下のように、target列が空の行を含む場合、 id title target xxx あああ 以下に示すエラーが発生しました。 ResponseText: The website encountered an unexpected error. Please try again later.Drupal\tamper\Exception\TamperException: Input should be a string. in Drupal\tamper\Plugin\Tamper\Explode->tamper() (line 72 of /bitnami/drupal/modules/contrib/tamper/src/Plugin/Tamper/Explode.php). 対処法 以下のように、「Skip tampers」を選択しました。 さらに、「Skip tampers」を「Explode」の前に移動します。 結果、空の文字列が含まれていても、エラーを回避できました。 まとめ 同様のことでお困りの方の参考になりましたら幸いです。

Drupal: UUIDを表示する

Drupal: UUIDを表示する

概要 以下のように、コンテンツのUUIDを表示する方法の備忘録です。 モジュールのインストール 以下のモジュールを使用しました。 https://www.drupal.org/project/uuid_extra 使い方 UUIDを表示したいコンテンツタイプの「Manage display」タブを選択し、以下のように、UUIDを移動させます。 まとめ 参考になりましたら幸いです。

TEI ODDから変換可能なスキーマについて:RNG、XSD、DTDなど

TEI ODDから変換可能なスキーマについて:RNG、XSD、DTDなど

概要 以下の記事でODDの作成を試しました。 上記ではRomaというツールを使用していますが、作成したODDについて、以下に示す出力フォーマットがあることがわかります。 具体的には、「RELAX NGスキーマ」「RELAX NGコンパクト」「W3Cスキーマ」「文書型定義」「ISO Schematron制約」が挙げられます。 そこで、これらの違いについて、GPT-4に問い合わせてみたので、その結果を共有します。誤った内容も含まれるかもしれませんが、参考になりましたら幸いです。 Relax NG(RNG)とW3C XMLスキーマの違い Relax NG(RNG)とW3C XMLスキーマは、どちらもXML文書の構造と内容を定義するためのスキーマ言語ですが、いくつかの重要な違いがあります: 表記法 : RNG : 2つの構文を提供します。一つはXMLベースのもので、もう一つはよりコンパクトな非XMLの構文です。 W3C XMLスキーマ : XMLベースの構文のみを提供します。 柔軟性と明瞭性 : RNG : RNGは非常に柔軟で、人が読みやすい設計になっています。パターンベースのアプローチを取り、より直感的なモデリングが可能です。 W3C XMLスキーマ : より厳格で形式的なアプローチを取り、型システムが複雑ですが、これにより強力なデータタイピングが可能になります。 データタイピング : RNG : データタイプはDatatype Libraryを介してサポートされていますが、W3C XMLスキーマほど多様ではありません。 W3C XMLスキーマ : 豊富なビルトインデータタイプを提供し、正確なデータ型制約を設定できます。 拡張性 : RNG : 簡潔さと柔軟性により、スキーマ自体を容易に拡張できます。 W3C XMLスキーマ : 拡張性はありますが、より複雑な構造のため、理解と実装が難しくなる場合があります。 普及度 : RNG : シンプルさと強力なモデリング機能にも関わらず、W3C XMLスキーマほど広くは採用されていません。 W3C XMLスキーマ : より一般的に使用されており、多くのXML処理ツールやライブラリで標準的にサポートされています。 これらの違いにも関わらず、どちらの言語もXML文書の構造を定義し、文書の妥当性を検証するという共通の目的を持っています。選択はしばしば個々のプロジェクトのニーズや開発者の好みに依存します。 DTD(Document Type Definition)との関係は? DTD(Document Type Definition)は、XML文書の構造を定義するための一つの仕様で、W3C XMLスキーマやRelax NG(RNG)よりも歴史が古く、制約を記述する方法が限られています。DTDは非常にシンプルで、XMLの初期から使われている標準的な方法ですが、名前空間やデータ型などのより高度な概念をサポートしていません。 W3C XMLスキーマやRNGに比べて、DTDは次のような制約があります: ...