つぶやきDatalad【調査メモ公開】
今回Dataladという、巨大なバイナリデータおよびそのメタデータのバージョンを管理する技術をがっつり調べたので、そのメモを公開します。マイナーな技術なので、このメモ書きが最初期の日本語記事かも?
もしDataladに触るよーという方がいらっしゃれば、公式のHandbookの補足的にこちらをご覧ください~。インストール等はHandbookの記述が参考になるかと思います。
では、どうぞ。
※以下、少し文体がかわります※
はじめに、参考サイトを
バージョン情報(7.10.2021現在)
- python v3.6.9
- Flask v2.0.1
- datalad v0.13.7
- git v2.32.0
- git-annex v8.20210223-1
Datalad
ローカル環境における見た目は「.gitattributeを配下にもつディレクトリ」。
ちなみに、.gitattributeは「ディレクトリ内のGitの仕様を自分色に着せ替えする」ためのファイル。いうなればバージョン管理のリカちゃん人形だ(うん、わからん笑)。
- Datalad createで作成されたディレクトリを「プッシュ」するには?
- Githubのようなリモートのホスティングサービスとして、ginが利用できる
Datalad as a Python Module
install
- git-anexの導入
$ sudo apt install git-annex
- pipによるdatalad導入
$ python3 -m pip install datalad
※dataladモジュールの利用にはgit2.19.1以上が必要。最新版へのアップデートは以下のコマンドで行える
$ sudo add-apt-repository ppa:git-core/ppa $ sudo apt update $ sudo apt install git
また、git-annexについてもバージョン7.20190503以上が必要となる。 gitと同様に以下のコマンドでいけると思ったが、期待するバージョンにアップデートされなかった。
$ sudo add-apt-repository ppa:kelleyk/git-annex $ sudo apt update $ sudo apt install git-annex $ git-annex version git-annex version: 6.20180409 ←本当は7.20190503以上にアップデートしたい (...)
さらに調査をすすめたところ、neuro.debian.netからgit-annex-standaloneという形でstableなバージョンが導入できそうと判明。ページに案内されたコマンドを入力したが、公開鍵の受信でエラーが起きた
$ wget -O- http://neuro.debian.net/lists/bionic.jp.libre | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list $ sudo apt-key adv --recv-keys --keyserver hkp://pool.sks-keyservers.net:80 0xA5D32F012649A5A9 ←公開鍵と交換するためのフレーズ Executing: /tmp/apt-key-gpghome.eay7BNfhX7/gpg.1.sh --recv-keys --keyserver hkp://pool.sks-keyservers.net:80 0xA5D32F012649A5A9 gpg: 鍵サーバからの受信に失敗しました: 名前がありません
→Ubuntuを再起動し実行すると導入できた。その後インストール完了
CLIからのメタデータ設定、取得
# 指定したkeyとvalueのメタデータを登録 $ git-annex metadata -s name='John' --force metadata cn-xxxxx_%.datalad%metadata%objects%9d%.xz name=John dmp-lastchanged=2021-06-30@05-41-55 lastchanged=2021-06-30@05-41-55 ok (recording state in git...) # 指定したkeyのvalueを取得 $ git-annex metadata -g name John # メタデータ全取得 $ git-annex metadata -A metadata MD5E-s2693891--e61afe4b3c5d76c849c4e61f6547ed03.pdf ok metadata MD5E-s158--1bcead3da7178553bce385a261df4e47 name=John dmp-lastchanged=2021-06-30@05-06-55 lastchanged=2021-06-30@05-06-55 ok
- 上記と同様の動作をpythonで実現するには?
- Datalad revolutionにdatalad.api.meta_extract()などが定義されている。これらを使う?
datalad_metalad (Datalad Revolution)
- GitHub: [Unstable] DataLad extension for semantic metadata handling
- Doc: DataLad extension for semantic metadata handling
このモジュールはあくまでもDataladの拡張機能のような位置づけ。そのため、インポートもfrom datalad import api
というように、dataladモジュール風に指定する。
pipでモジュールをインストール、api.meta_dump()を試したところ空リストが表示された。
$ pip3 install datalad_metalad Defaulting to user installation because normal site-packages is not writeable Collecting datalad_metalad ... Successfully installed datalad-metalad-0.2.1 $ python3 Python 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from datalad import api >>> dataset = api.Dataset('./Datalad-102') >>> api.meta_dump(dataset=dataset, result_renderer='json') []
dumpの前に何か「まとめる」処理が必要なようだ。上に示したドキュメントをみると、api.meta_aggregate()という関数がある。ほうほう。
>>> api.meta_aggregate(dataset=dataset) (aggregateされたJSONが出力される) >>> api.meta_dump(dataset=dataset, result_renderer='json') (メタデータのJSONが出力される)
対話型シェルだと少しみづらいが、ビンゴ。リストに入っているから、たぶん参照・表示の際はdatalad_dict[0]
とかのように書いてあげれば良さそう。
(つづく・・かも)