ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Archivematica における非DCメタデータの登録検証 ── source-metadata.csv を使ったEADの組み込み

Archivematica における非DCメタデータの登録検証 ── source-metadata.csv を使ったEADの組み込み

Archivematica では、Dublin Core(DC)以外のメタデータスキーマもAIPのMETS.xmlに組み込むことができます。本ガイドでは、source-metadata.csv を使って EAD や MODS などの非DCメタデータをTransferに含め、AIPに正しく格納されるかをAPI経由で検証します。 目次 背景と目的 source-metadata.csv の仕組み XML Validation 機能 検証1: MODS単独でのメタデータ登録 検証2: EAD + MODS の同時登録 METS.xml における非DCメタデータの格納形式 検証3: Reingest によるメタデータ追加 まとめ 背景と目的 Archivematica の標準的な Transfer では、metadata/metadata.csv に記述した Dublin Core メタデータが METS.xml に <dmdSec> として格納されます。しかし、実際のデジタルアーカイブ運用では、以下のようなユースケースで DC 以外のメタデータスキーマを扱う必要があります。 EAD(Encoded Archival Description) : アーカイブズの階層記述で広く使われる標準 MODS(Metadata Object Description Schema) : 図書館資料の詳細記述に使われるスキーマ LIDO : 博物館・美術館資料の記述標準 MARC21 : 図書館の目録データフォーマット Archivematica は source-metadata.csv というCSVファイルを通じて、任意の XML メタデータを Transfer に紐付け、AIP の METS.xml に <dmdSec> として格納する機能を提供しています。本ガイドでは、この機能を API 経由で実際に検証します。 ...

ArchivematicaのPreservation planningにおいて、Normalizationのルールを追加する

ArchivematicaのPreservation planningにおいて、Normalizationのルールを追加する

概要 ArchivematicaのPreservation planningにおいて、Normalizationのルールを追加する方法の備忘録です。 背景 拡張子が.jpgである画像をArchivematicaに投入した際、以下のようにFormatがJPEGのものに対してtifファイルを保存用に作成するルールを用意しているにもかかわらず、tifファイルが作成されないことがありました。 そこで、以下のような履歴の画面から、タスクの内容を確認しました。 結果は以下です。 具体的には以下のような記載になっており、該当するルールが存在しない、ということが記載されています。 File format: Image (Raster): Exchangeable Image File Format (Compressed): EXIF Compressed Image 2.2.1 (big-endian) (fmt/645) Not normalizing 11ecf05d-8fc6-4704-a6e9-4a26ef98f186.jpg - No rule or default rule found to normalize for preservation そこで、fmt/645に対するルールを追加します。 ルールの追加 「Create new rule」のリンクをクリックします。 そして、以下のように入力します。 今回は以下を「The related format」として指定します。 Image (Raster): Exchangeable Image File Format (Compressed): EXIF Compressed Image 2.2.1 (big-endian) (fmt/645) 結果、以下のようにルールが新規に追加され、以降、保存用のtifファイルが生成されるようになりました。 まとめ ArchivematicaのPreservation planningにおけるルール追加の一例を紹介しました。参考になりましたら幸いです。 ...

Alfrescoのファイルに対して、Archivematicaを使ってAIPを作成する

Alfrescoのファイルに対して、Archivematicaを使ってAIPを作成する

概要 Alfrescoのファイルに対して、Archivematicaを使ってAIPを作成する方法の一例です。 以下が成果物のデモ動画です。 https://youtu.be/7WCO7JoMnWc システム構成 今回は以下のようなシステム構成とします。複数のクラウドサービスを利用していることに特に意味はありません。 Alfrescoは、以下の記事を参考に、Azure上に構築したものを使用します。 Archivematicaとオブジェクトストレージはmdx.jpを使用し、分析環境はGakuNin RDMを使用します。 オブジェクトストレージへのファイルアップロード Alfrescoからファイルをダウンロード Alfrescoからのファイルダウンロードにあたっては、REST APIを使用します。 https://docs.alfresco.com/content-services/6.0/develop/rest-api-guide/ OpenAPIに準拠しており、以下などを参考にしました。 https://api-explorer.alfresco.com/api-explorer/ 例えば以下により、Alfrescoのユーザ名とパスワード、およびホスト名を環境変数から読み込み、メタデータの取得やコンテンツのダウンロードを行うことができました。 # %% ../nbs/00_core.ipynb 3 from dotenv import load_dotenv import os import requests from base64 import b64encode # %% ../nbs/00_core.ipynb 4 class ApiClient: def __init__(self, verbose=False): """Alfresco API Client Args: verbose (bool): デバッグ情報を出力するかどうか """ self.verbose = verbose # .envの読み込み load_dotenv(override=True) # 環境変数の取得 self.user = os.getenv('ALF_USER') self.password = os.getenv('ALF_PASSWORD') self.target_host = os.getenv('ALF_TARGET_HOST') self._debug("環境変数の設定:", { "user": self.user, "password": "*" * len(self.password) if self.password else None, "target_host": self.target_host }) # Basic認証のヘッダーを作成 credentials = f"{self.user}:{self.password}" encoded_credentials = b64encode(credentials.encode()).decode() self.headers = { 'accept': 'application/json', 'authorization': f'Basic {encoded_credentials}' } self._debug("ヘッダーの設定:", { "accept": self.headers['accept'], "authorization": "Basic ***" }) def _debug(self, message: str, data: dict = None): """デバッグ情報を出力する Args: message (str): メッセージ data (dict, optional): 追加のデータ """ if self.verbose: print(f"🔍 {message}") if data: for key, value in data.items(): print(f" - {key}: {value}") def get_nodes_nodeId(self, node_id: str): """ノードIDでノード情報を取得する Args: node_id (str): ノードID Returns: dict: ノード情報 """ url = f"{self.target_host}/alfresco/api/-default-/public/alfresco/versions/1/nodes/{node_id}" self._debug("APIリクエスト:", {"url": url}) try: response = requests.get( url, headers=self.headers, timeout=float(30) ) response.raise_for_status() return response.json() except requests.exceptions.Timeout: self._debug("エラー:", {"type": "timeout", "message": "リクエストがタイムアウトしました"}) return None except requests.exceptions.RequestException as e: self._debug("エラー:", {"type": "request", "message": str(e)}) return None def get_nodes_nodeId_content(self, node_id: str, output_path: str): """ノードのコンテンツを取得する Args: node_id (str): ノードID output_path (str): 出力パス """ url = f"{self.target_host}/alfresco/api/-default-/public/alfresco/versions/1/nodes/{node_id}/content" self._debug("APIリクエスト:", { "url": url, "output_path": output_path }) response = requests.get(url, headers=self.headers) binary_data = response.content os.makedirs(os.path.dirname(output_path), exist_ok=True) with open(output_path, "wb") as file: file.write(binary_data) self._debug("ファイル保存完了:", { "size": len(binary_data), "path": output_path }) オブジェクトストレージにファイルをアップロード boto3と、オブジェクトストレージのENDPOINT_URL、ACCESS_KEY、SECRET_KEYおよびBUCKET_NAMEなどを使用して、ファイルのアップロード(とダウンロード)を行います。 ...

DataverseのデータをArchivematicaで処理する

DataverseのデータをArchivematicaで処理する

概要 DataverseのデータをArchivematicaで処理する流れを確認しましたので、備忘録です。 背景 ArchivematicaではDataverseのデータを入力する機能を提供しています。 https://www.archivematica.org/en/docs/archivematica-1.17/user-manual/transfer/dataverse/ 本機能について、以下の講演会で教えていただいたので、実際に試してみました。 https://www.kulib.kyoto-u.ac.jp/bulletin/1402322 Dataverse 以下の記事でも使用したDemo Dataverseを使用します。 以下のデータをアップロードしました。 https://demo.dataverse.org/dataset.xhtml?persistentId=doi:10.70122/FK2/IHQZL3 ここから画像データそのものと、JSONデータをダウンロードします。Metadataタブに移動し、Export MetadataからJSONを選択します。 以下はJSONファイルの一部ですが、metadataBlocksにメタデータ、filesに画像ファイルの情報が記載されています。 { "metadataBlocks": { "citation": { "displayName": "Citation Metadata", "name": "citation", "fields": [ { "typeName": "title", "multiple": false, "typeClass": "primitive", "value": "nakamura196" }, { "typeName": "author", "multiple": true, "typeClass": "compound", "value": [ { "authorName": { "typeName": "authorName", "multiple": false, "typeClass": "primitive", "value": "Nakamura, Satoru" }, "authorAffiliation": { "typeName": "authorAffiliation", "multiple": false, "typeClass": "primitive", "value": "https://ror.org/057zh3y96", "expandedvalue": { "scheme": "http://www.grid.ac/ontology/", "termName": "The University of Tokyo", "@type": "https://schema.org/Organization" } } } ] }, { "typeName": "datasetContact", "multiple": true, "typeClass": "compound", "value": [ { "datasetContactName": { "typeName": "datasetContactName", "multiple": false, "typeClass": "primitive", "value": "Nakamura, Satoru" }, "datasetContactEmail": { "typeName": "datasetContactEmail", "multiple": false, "typeClass": "primitive", "value": "na.kamura.1263@gmail.com" } } ] }, { "typeName": "dsDescription", "multiple": true, "typeClass": "compound", "value": [ { "dsDescriptionValue": { "typeName": "dsDescriptionValue", "multiple": false, "typeClass": "primitive", "value": "My First Dataset" } } ] }, { "typeName": "subject", "multiple": true, "typeClass": "controlledVocabulary", "value": [ "Arts and Humanities" ] }, { "typeName": "depositor", "multiple": false, "typeClass": "primitive", "value": "Nakamura, Satoru" }, { "typeName": "dateOfDeposit", "multiple": false, "typeClass": "primitive", "value": "2025-01-19" } ] } }, "files": [ { "label": "nakamura196.jpg", "restricted": false, "version": 1, "datasetVersionId": 281093, "dataFile": { "id": 2514724, "persistentId": "doi:10.70122/FK2/IHQZL3/B7JVQS", "pidURL": "https://doi.org/10.70122/FK2/IHQZL3/B7JVQS", "filename": "nakamura196.jpg", "contentType": "image/jpeg", "friendlyType": "JPEG Image", "filesize": 53656, "storageIdentifier": "s3://demo-dataverse-org:1948154820d-63733533ea7c", "rootDataFileId": -1, "md5": "72f08a8b07bacbe3b5cf021910fd26dc", "checksum": { "type": "MD5", "value": "72f08a8b07bacbe3b5cf021910fd26dc" }, "tabularData": false, "creationDate": "2025-01-19", "publicationDate": "2025-01-19", "fileAccessRequest": true } } ] } データの準備 Dataverseのサンプルデータは以下に格納されています。 ...

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の利用にあたり、参考になりましたら幸いです。

ArchivematicaのMETSファイルの内容を可視化するPythonライブラリ

ArchivematicaのMETSファイルの内容を可視化するPythonライブラリ

概要 ArchivematicaのMETSファイルの内容を可視化するPythonライブラリを作成しました。 例えば以下のように、AIPの作成過程で行われた処理(premis:event)の集計結果などを可視化します。 背景 以下の記事で、ArchivematicaのMETSファイルを人間に優しい方法で探索するためのウェブアプリケーションであるMETSFlaskを紹介しました。 今回作成したものは、このMETSFlaskで提供されている機能を、Flask以外からも利用しやすいようにライブラリ化したものです。 リポジトリ 以下で公開しています。README.mdファイルに使用方法を記載しています。 https://github.com/nakamura196/mets_tools GitHub Pagesでもドキュメントを公開しています。 https://nakamura196.github.io/mets_tools/ まとめ ArchivematicaおよびAIPの利用にあたり、参考になりましたら幸いです。

Archivematicaにmdx.jpのオブジェクトストレージを追加する

Archivematicaにmdx.jpのオブジェクトストレージを追加する

概要 Archivematicaにmdx.jpのオブジェクトストレージを追加する機会がありましたので、備忘録です。 背景 以下の記事で、Amazon S3をArchivematicaの処理対象およびAIPの保存先に設定する方法を記載しました。 今回は、この手順をベースとしつつ、mdx.jpのオブジェクトストレージを接続してみます。 設定方法 以下のように設定します。 S3 Endpoint URLには、https://s3ds.mdx.jpを設定します。 Access Key ID to authenticateとSecret Access Key to authenticate withには、以下で得られるアクセスキーと秘密鍵を使用します。 結果 結果、以下のように、mdx.jpのオブジェクトストレージを入出力ストレージとして利用できるようになりました。これにより、AIPやDIPをmdx.jpのオブジェクトストレージに保存することができます。 補足 以下の記事で記載した方法を参考に、GakuNin RDMとmdx.jpのオブジェクトストレージを接続することができます。 これにより、GakuNin RDM上でAIPやDIPの確認が可能となります。これにより、GakuNin RDMのBinderHubを用いたAIPの分析や可視化が可能となります。 可視化例として、ArchivematicaのMETSファイルを人間に優しい方法で探索可能とするMETSFlaskの応用などが考えられます。 まとめ Archivematica, GakuNin RDM, mdx.jpなどの連携にあたり、参考になりましたら幸いです。

GakuNin RDMとAmazon S3を接続し、Archivematicaでファイルを処理する

GakuNin RDMとAmazon S3を接続し、Archivematicaでファイルを処理する

概要 GakuNin RDMとAmazon S3を接続し、Archivematicaでファイルを処理する方法に関する備忘録です。 https://rcos.nii.ac.jp/service/rdm/ 背景 以下の記事で、ArchivematicaでAmazon S3を処理対象とする方法を記載しました。 これにより、指定したバケットにファイルやフォルダをアップロードすることにより、それらをArchivematicaの処理対象として、AIPやDIPを作成することができます。 ただし、このままではプロジェクトのメンバー毎にIAMユーザを作成する必要がありました。 GakuNin RDMの利用 今回はメンバー全員がGakuNin RDMのプロジェクトのメンバーとして登録されていました。 そこで、プロジェクトにAmazon S3を接続して、GakuNin RDMからS3にファイルをアップロードできるようにしてみます。 これにより、IAMユーザの管理が不要になります。 設定方法 アドオンを選択します。 Amazon S3を有効にします。 IAMユーザで作成したアクセスキーIDとシークレットアクセスキーを入力することで、バケットの一覧が表示されます。 結果、GakuNin RDMからAmazon S3にファイルをアップロードできるようになりました。 Archivematicaからも同バケットを以下のように参照できるため、ここからAIPなどを作成することができます。 まとめ GakuNin RDMを利用可能な方に限られてしまいますが、参考になりましたら幸いです。

Archivematicaでフォルダにメタデータを登録する際には、日本語のフォルダ名は避ける

Archivematicaでフォルダにメタデータを登録する際には、日本語のフォルダ名は避ける

概要 Archivematicaでフォルダにメタデータを登録する際には、日本語のフォルダ名は避ける必要がありましたので、その備忘録です。 メタデータ 以下のような/metadata/metadata.csvファイルを用意することにより、AIPにメタデータを含めることができます。 filename dc.type objects/aaa フォルダ objects/aaa/MARBLES.TGA 画像 この時、aaaを日本語で用意すると、当該レコードに関するメタデータが登録されませんでした。 まとめ 同様のことでお困りの方の参考になりましたら幸いです。

Archivematicaのサンプルデータ

Archivematicaのサンプルデータ

概要 Archivematicaのサンプルデータは以下のリポジトリに格納されています。 https://github.com/artefactual/archivematica-sampledata 補足 Archivematicaでは、Standard, Zipped directory, Zipped bagなど、複数の入力タイプをサポートしています。 これらのタイプごとにどのようなファイルおよびフォルダを用意すればよいのか、という際に、上記のリポジトリのデータが参考になります。 例: メタデータを記述したCSVファイルと共に登録する マニュアルの記載箇所は以下です。 https://www.archivematica.org/en/docs/archivematica-1.16/user-manual/transfer/transfer/#transfers-with-metadata 以下にサンプルがあります。 https://github.com/artefactual/archivematica-sampledata/tree/master/SampleTransfers/CSVmetadata 例: Submission documentationと共に登録する マニュアルの記載箇所は以下です。 https://www.archivematica.org/en/docs/archivematica-1.16/user-manual/transfer/transfer/#create-submission 以下にサンプルがあります。「メタデータを記述したCSVファイルと共に登録する」と同じです。 https://github.com/artefactual/archivematica-sampledata/tree/master/SampleTransfers/CSVmetadata まとめ 参考になりましたら幸いです。

ArchivematicaのNormalizationの挙動の確認

ArchivematicaのNormalizationの挙動の確認

概要 ArchivematicaではPreservation planningにおいて、Normalizationなどの設定を行うことができます。この挙動の確認に関する備忘録です。 設定 Normalizationに関する設定は以下で確認できます。 /fpr/fprule/normalization/ 上記では、Purpose がPreservationであるもので、Format がTruevision TGA Bitmapであるものについて、Command に記載があるTranscoding to tif with convertを行う、と指示されています。 実行例 以下を処理の対象とします。 https://github.com/artefactual/archivematica-sampledata/tree/master/SampleTransfers/CSVmetadata 実際にAIPを作成したところ、以下に示すように、入力ファイルはMARBLES.TGAというファイルでしたが、上記の変換ルールに基づき、MARBLES-b9c7a103-220b-4d12-bda5-10cfd892e16a.tifというTIFファイルに正規化されたファイルが含まれていることが確認できます。 まとめ Archivematicaの利用にあたり、参考になりましたら幸いです。

ArchivematicaをDockerで起動する

ArchivematicaをDockerで起動する

概要 Archivematicaの起動にあたっては、Dockerを用いる方法が簡単でした。以下にインストール方法が記載されています。 https://github.com/artefactual/archivematica/tree/qa/1.x/hack 手順通りに進めるとうまくインストールできましたが、失敗した点について備忘録として記載します。 Elasticsearch container Elasticsearchのコンテナ起動にあたり、vm.max_map_countを設定するように指示されています。 https://github.com/artefactual/archivematica/tree/qa/1.x/hack#elasticsearch-container この設定を忘れると、以下のように、Elasticsearchコンテナが起動しませんでした。 docker compose up [+] Running 10/0 ✔ Container am-mysql-1 Running 0.0s ✔ Container am-archivematica-storage-service-1 Running 0.0s ✔ Container am-nginx-1 Running 0.0s ✔ Container am-clamavd-1 Running 0.0s ✔ Container am-elasticsearch-1 Created 0.0s ✔ Container am-fits-1 Running 0.0s ✔ Container am-gearmand-1 Running 0.0s ✔ Container am-archivematica-mcp-client-1 Running 0.0s ✔ Container am-archivematica-dashboard-1 Created 0.0s ✔ Container am-archivematica-mcp-server-1 Running 0.0s Attaching to archivematica-dashboard-1, archivematica-mcp-client-1, archivematica-mcp-server-1, archivematica-storage-service-1, clamavd-1, elasticsearch-1, fits-1, gearmand-1, mysql-1, nginx-1 elasticsearch-1 | [2024-06-18T02:16:40,373][INFO ][o.e.e.NodeEnvironment ] [am-node] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/root)]], net usable_space [11.4gb], net total_space [48.2gb], types [ext4] elasticsearch-1 | [2024-06-18T02:16:40,379][INFO ][o.e.e.NodeEnvironment ] [am-node] heap size [512mb], compressed ordinary object pointers [true] elasticsearch-1 | [2024-06-18T02:16:40,433][INFO ][o.e.n.Node ] [am-node] node name [am-node], node ID [SomtTY5CTF-SfYe3gLBpOw] elasticsearch-1 | [2024-06-18T02:16:40,433][INFO ][o.e.n.Node ] [am-node] version[6.8.23], pid[1], build[default/docker/4f67856/2022-01-06T21:30:50.087716Z], OS[Linux/6.5.0-1018-aws/amd64], JVM[AdoptOpenJDK/OpenJDK 64-Bit Server VM/15.0.1/15.0.1+9] elasticsearch-1 | [2024-06-18T02:16:40,434][INFO ][o.e.n.Node ] [am-node] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseG1GC, -XX:G1ReservePercent=25, -XX:InitiatingHeapOccupancyPercent=30, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -XX:+ShowCodeDetailsInExceptionMessages, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Dlog4j2.formatMsgNoLookups=true, -Djava.io.tmpdir=/tmp/elasticsearch-7162129985120281509, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m, -Djava.locale.providers=COMPAT, -XX:UseAVX=2, -Des.cgroups.hierarchy.override=/, -Xms512m, -Xmx512m, -Des.path.home=/usr/share/elasticsearch, -Des.path.conf=/usr/share/elasticsearch/config, -Des.distribution.flavor=default, -Des.distribution.type=docker] elasticsearch-1 | [2024-06-18T02:16:42,896][INFO ][o.e.p.PluginsService ] [am-node] loaded module [aggs-matrix-stats] elasticsearch-1 | [2024-06-18T02:16:42,897][INFO ][o.e.p.PluginsService ] [am-node] loaded module [analysis-common] elasticsearch-1 | [2024-06-18T02:16:42,897][INFO ][o.e.p.PluginsService ] [am-node] loaded module [ingest-common] elasticsearch-1 | [2024-06-18T02:16:42,898][INFO ][o.e.p.PluginsService ] [am-node] loaded module [ingest-geoip] elasticsearch-1 | [2024-06-18T02:16:42,898][INFO ][o.e.p.PluginsService ] [am-node] loaded module [ingest-user-agent] elasticsearch-1 | [2024-06-18T02:16:42,898][INFO ][o.e.p.PluginsService ] [am-node] loaded module [lang-expression] elasticsearch-1 | [2024-06-18T02:16:42,898][INFO ][o.e.p.PluginsService ] [am-node] loaded module [lang-mustache] elasticsearch-1 | [2024-06-18T02:16:42,899][INFO ][o.e.p.PluginsService ] [am-node] loaded module [lang-painless] elasticsearch-1 | [2024-06-18T02:16:42,899][INFO ][o.e.p.PluginsService ] [am-node] loaded module [mapper-extras] elasticsearch-1 | [2024-06-18T02:16:42,899][INFO ][o.e.p.PluginsService ] [am-node] loaded module [parent-join] elasticsearch-1 | [2024-06-18T02:16:42,900][INFO ][o.e.p.PluginsService ] [am-node] loaded module [percolator] elasticsearch-1 | [2024-06-18T02:16:42,900][INFO ][o.e.p.PluginsService ] [am-node] loaded module [rank-eval] elasticsearch-1 | [2024-06-18T02:16:42,900][INFO ][o.e.p.PluginsService ] [am-node] loaded module [reindex] elasticsearch-1 | [2024-06-18T02:16:42,900][INFO ][o.e.p.PluginsService ] [am-node] loaded module [repository-url] elasticsearch-1 | [2024-06-18T02:16:42,901][INFO ][o.e.p.PluginsService ] [am-node] loaded module [transport-netty4] elasticsearch-1 | [2024-06-18T02:16:42,901][INFO ][o.e.p.PluginsService ] [am-node] loaded module [tribe] elasticsearch-1 | [2024-06-18T02:16:42,902][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-ccr] elasticsearch-1 | [2024-06-18T02:16:42,903][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-core] elasticsearch-1 | [2024-06-18T02:16:42,903][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-deprecation] elasticsearch-1 | [2024-06-18T02:16:42,904][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-graph] elasticsearch-1 | [2024-06-18T02:16:42,904][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-ilm] elasticsearch-1 | [2024-06-18T02:16:42,904][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-logstash] elasticsearch-1 | [2024-06-18T02:16:42,905][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-ml] elasticsearch-1 | [2024-06-18T02:16:42,905][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-monitoring] elasticsearch-1 | [2024-06-18T02:16:42,905][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-rollup] elasticsearch-1 | [2024-06-18T02:16:42,905][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-security] elasticsearch-1 | [2024-06-18T02:16:42,906][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-sql] elasticsearch-1 | [2024-06-18T02:16:42,906][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-upgrade] elasticsearch-1 | [2024-06-18T02:16:42,906][INFO ][o.e.p.PluginsService ] [am-node] loaded module [x-pack-watcher] elasticsearch-1 | [2024-06-18T02:16:42,907][INFO ][o.e.p.PluginsService ] [am-node] no plugins loaded elasticsearch-1 | [2024-06-18T02:16:47,324][INFO ][o.e.x.s.a.s.FileRolesStore] [am-node] parsed [0] roles from file [/usr/share/elasticsearch/config/roles.yml] elasticsearch-1 | [2024-06-18T02:16:48,172][INFO ][o.e.x.m.p.l.CppLogMessageHandler] [am-node] [controller/96] [Main.cc@114] controller (64 bit): Version 6.8.23 (Build 31256deab94add) Copyright (c) 2022 Elasticsearch BV elasticsearch-1 | [2024-06-18T02:16:48,944][INFO ][o.e.d.DiscoveryModule ] [am-node] using discovery type [zen] and host providers [settings] elasticsearch-1 | [2024-06-18T02:16:50,009][INFO ][o.e.n.Node ] [am-node] initialized elasticsearch-1 | [2024-06-18T02:16:50,010][INFO ][o.e.n.Node ] [am-node] starting ... elasticsearch-1 | [2024-06-18T02:16:50,139][INFO ][o.e.t.TransportService ] [am-node] publish_address {172.23.0.3:9300}, bound_addresses {0.0.0.0:9300} elasticsearch-1 | [2024-06-18T02:16:50,190][INFO ][o.e.b.BootstrapChecks ] [am-node] bound or publishing to a non-loopback address, enforcing bootstrap checks elasticsearch-1 | ERROR: [1] bootstrap checks failed elasticsearch-1 | [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] elasticsearch-1 | [2024-06-18T02:16:50,238][INFO ][o.e.n.Node ] [am-node] stopping ... elasticsearch-1 | [2024-06-18T02:16:50,253][INFO ][o.e.n.Node ] [am-node] stopped elasticsearch-1 | [2024-06-18T02:16:50,254][INFO ][o.e.n.Node ] [am-node] closing ... elasticsearch-1 | [2024-06-18T02:16:50,265][INFO ][o.e.n.Node ] [am-node] closed elasticsearch-1 | [2024-06-18T02:16:50,268][INFO ][o.e.x.m.p.NativeController] [am-node] Native controller process has stopped - no new native processes can be started dependency failed to start: container am-elasticsearch-1 exited (78) まとめ Dockerによる起動については、開発者のために設計されている と記載されており、プロダクション環境での使用には注意が必要ですが、Archivematicaの使用にあたり、参考になりましたら幸いです。 ...

Archivematicaの日本語ファイル名変換を修正する

Archivematicaの日本語ファイル名変換を修正する

概要 デフォルト設定のArchivematicaに日本語ファイル名のファイルを入力すると、「ユースケース公募提案書.docx」というファイル名は以下のように変換されます。 yu-suke-suGong_Mu_Ti_An_Shu_.docx このファイル名変換をカスタマイズする方法について説明します。 概要 ファイル名の変換は以下で行われています。 https://github.com/artefactual/archivematica/blob/qa/1.x/src/MCPClient/lib/clientScripts/change_names.py 具体的には、以下です。 decoded_name = unidecode(basename) Google Colabでの実行例は以下です。 https://colab.research.google.com/github/nakamura196/000_tools/blob/main/unidecodeを試す.ipynb カスタマイズ 今回は、pykakasiを使用してみます。 https://codeberg.org/miurahr/pykakasi また、DockerでArchivematicaを起動しているとします。以下の記事を参考にしてください。 まず、以下にpykakasiを追記します。 https://github.com/artefactual/archivematica/blob/qa/1.x/requirements-dev.txt そして、以下のファイルも修正します。 https://github.com/artefactual/archivematica/blob/qa/1.x/src/MCPClient/lib/clientScripts/change_names.py import os import re import shutil from unidecode import unidecode import pykakasi # 初期化 kakasi = pykakasi.kakasi() # テキストをローマ字に設定 kakasi.setMode("H", "a") # 平仮名をローマ字に kakasi.setMode("K", "a") # カタカナをローマ字に kakasi.setMode("J", "a") # 漢字をローマ字に kakasi.setMode("r", "Hepburn") # ヘボン式ローマ字に設定 # コンバーターを作成 converter = kakasi.getConverter() VERSION = "1.10." + "$Id$".split(" ")[1] # Letters, digits and a few punctuation characters ALLOWED_CHARS = re.compile(r"[^a-zA-Z0-9\-_.\(\)]") REPLACEMENT_CHAR = "_" def change_name(basename): if basename == "": raise ValueError("change_name received an empty filename.") # decoded_name = unidecode(basename) decoded_name = converter.do(basename) ... 上記の修正を加えて、Archivematicaを再ビルドした結果、以下のようなファイル名に変換されるようになりました。 ...

METSFlaskを試す

METSFlaskを試す

概要 以下のMETSFlaskを試します。 https://github.com/tw4l/METSFlask 以下のように説明されています。 A web application for human-friendly exploration of Archivematica METS files [機械翻訳] ArchivematicaのMETSファイルを人間に優しい方法で探索するためのウェブアプリケーション 使い方 以下のサイトで試すことができます。 http://bitarchivist.pythonanywhere.com/ METSファイルをアップロードした結果が以下です。今回は、1つのWordファイルのみが格納されていたため、1つのオリジナルファイルに関する情報が表示されます。 Viewボタンをクリックすると、詳細画面に遷移します。 PREMIS Eventsにおいて、METSファイルのmets:digiprovMDセクションの内容が表示されていました。このセクションは、デジタルプロビナンス(デジタルオブジェクトの起源や履歴を追跡する情報)メタデータを扱うようです。 <mets:digiprovMD ID="digiprovMD_8"> <mets:mdWrap MDTYPE="PREMIS:EVENT"> <mets:xmlData> <premis:event xmlns:premis="http://www.loc.gov/premis/v3" xsi:schemaLocation="http://www.loc.gov/premis/v3 http://www.loc.gov/standards/premis/v3/premis.xsd" version="3.0"> <premis:eventIdentifier> <premis:eventIdentifierType>UUID</premis:eventIdentifierType> <premis:eventIdentifierValue>24741142-467a-45da-936e-78e43ab68a6c</premis:eventIdentifierValue> </premis:eventIdentifier> <premis:eventType>ingestion</premis:eventType> <premis:eventDateTime>2024-02-26T03:34:19.082563+00:00</premis:eventDateTime> <premis:eventDetailInformation> <premis:eventDetail/> </premis:eventDetailInformation> <premis:eventOutcomeInformation> <premis:eventOutcome/> <premis:eventOutcomeDetail> <premis:eventOutcomeDetailNote/> </premis:eventOutcomeDetail> </premis:eventOutcomeInformation> <premis:linkingAgentIdentifier> <premis:linkingAgentIdentifierType>preservation system</premis:linkingAgentIdentifierType> <premis:linkingAgentIdentifierValue>Archivematica-1.16</premis:linkingAgentIdentifierValue> </premis:linkingAgentIdentifier> <premis:linkingAgentIdentifier> <premis:linkingAgentIdentifierType>repository code</premis:linkingAgentIdentifierType> <premis:linkingAgentIdentifierValue>test</premis:linkingAgentIdentifierValue> </premis:linkingAgentIdentifier> <premis:linkingAgentIdentifier> <premis:linkingAgentIdentifierType>Archivematica user pk</premis:linkingAgentIdentifierType> <premis:linkingAgentIdentifierValue>1</premis:linkingAgentIdentifierValue> </premis:linkingAgentIdentifier> </premis:event> </mets:xmlData> </mets:mdWrap> </mets:digiprovMD> mets:mdWrapのChatGPT 4による説明は以下のとおりです。 ...

AIPscanを試す

AIPscanを試す

概要 以下のツールを試します。 https://github.com/artefactual-labs/AIPscan 本ツールは以下のように説明されています。 AIPscan was developed to provide a more in-depth reporting solution for Archivematica users. It crawls METS files from AIPs in the Archivematica Storage Service to generate tabular and visual reports about repository holdings. It is designed to run as a stand-alone add-on to Archivematica. It only needs a valid Storage Service API key to fetch source data. AIPscanは、Archivematicaユーザーにより詳細なレポーティングソリューションを提供するために開発されました。それはArchivematicaストレージサービスのAIPからMETSファイルをクロールして、リポジトリ保有物についての表形式および視覚的レポートを生成します。これはArchivematicaへのスタンドアロンアドオンとして実行されるように設計されています。ソースデータを取得するために有効なストレージサービスAPIキーのみが必要です。 Archivematicaのストレージサービスに格納されたAIPの内容を視覚化します。 本記事は、その使い方について説明します。 セットアップ 以下の記載の通りに進めることでセットアップすることができました。 https://github.com/artefactual-labs/AIPscan?tab=readme-ov-file#installation 試す:ストレージサービスの追加 Archivematica Storage Servicesメニューをクリックし、以下にアクセスします。画面下部のNew storage serviceボタンをクリックします。 ...

sphinxを用いた作成されたドキュメントサイトに日本語訳を追加する

sphinxを用いた作成されたドキュメントサイトに日本語訳を追加する

概要 sphinxを用いた作成されたドキュメントサイトに日本語訳を追加することがあり、その備忘録です。 以下を対象にします。 https://github.com/artefactual/archivematica-storage-service-docs 方法 まず、対象リポジトリをForkします。 次に、Cloneします。 git clone https://github.com/nakamura196/archivematica-storage-service-docs cd atom-docs ここでは、Pythonの仮想環境を作成しておきます。 python -m venv .venv source .venv/bin/activate pip install --upgrade pip pip install -r requirements.txt ライブラリの追加 requirements.txtにsphinx-intlを追加して、インストールします。 sphinx sphinx-intl sphinx-autobuild pip install -r requirements.txt (オプション) conf.py conf.pyに言語設定が存在しない場合には、以下のように追加します。 ... # 言語設定 locale_dirs = ['locale/'] # 翻訳ファイルを格納するディレクトリ gettext_compact = False # ファイル名を短くしない language = "ja" そして、gettextビルドを実行します。 make gettext 日本語ディクレトリの作成 以下を実行すると、locale/jaにpoファイルが作成されます。 sphinx-intl update -p _build/locale -l ja 編集 locale/ja以下のpoファイルを編集することで、多言語化を行います。 ...

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

EC2に立てたArchivematicaをHTTPS対応する

EC2に立てたArchivematicaをHTTPS対応する

はじめに 以下の記事で、EC2にArchivematicaを立てる方法を記載しました。 今回は、独自ドメインの設定とHTTPS対応を行います。 独自ドメインの設定 今回、matica.aws.ldas.jpとstorage.aws.ldas.jpいうドメインを<IPアドレス>に割り当てます。Route 53を使用します。 SSL証明書の取得 sudo su yum install epel-release yum install certbot ertbot certonly --webroot -w /usr/share/nginx/html -d matica.aws.ldas.jp -d storage.aws.ldas.jp Webサーバの設定: Nginxのインストール vi /etc/nginx/conf.d/archivematica-and-storage.conf 設定 server { listen 80; server_name matica.aws.ldas.jp; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 80; server_name storage.aws.ldas.jp; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443 ssl; server_name matica.aws.ldas.jp; ssl_certificate /etc/letsencrypt/live/matica.aws.ldas.jp/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/matica.aws.ldas.jp/privkey.pem; location / { proxy_pass http://localhost:81; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { listen 443 ssl; server_name storage.aws.ldas.jp; ssl_certificate /etc/letsencrypt/live/storage.aws.ldas.jp/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/storage.aws.ldas.jp/privkey.pem; location / { proxy_pass http://localhost:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 結果、以下のURLにアクセスできるようになりました。 ...

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を使用したフロントエンドの開発にも取り組みたいと思います。

ArchivematicaでBrowseがうまくできない場合の原因と対応

ArchivematicaでBrowseがうまくできない場合の原因と対応

概要 ArchivematicaでBrowseを押してもフォルダやファイルが閲覧できない不具合に遭遇しました。この原因と対策について紹介します。 /transfer/ 事象 /administration/storage/ Error retrieving locations: is the storage server running? Please contact an administrator. 以下にアクセスすると、以下のjsonが得られました。 /transfer/locations/ { "message": "Error retrieving source directories", "status": "Failure" } 対応 以下にアクセスすると、Storage Seviceにアクセスできないことが示されていました。 /administration/general/ Storage Sevice URLを修正した結果、エラーが解消しました。 まとめ 同様の事象でお困りの方の参考になりましたら幸いです。