つぶやきテック

日々のつぶやきアウトプット

つぶやき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

  1. git-anexの導入
$ sudo apt install git-annex
  1. 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と同様に以下のコマンドでいけると思ったが、期待するバージョンにアップデートされなかった

git-annex ppa

$ 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)

このモジュールはあくまでも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]とかのように書いてあげれば良さそう。

(つづく・・かも)