GakuNin RDM (以下、GRDM) とは、学術認証フェデレーション (学認) を使ってユーザ認証を行う研究データ管理 (Research Data Management, RDM) サービスです。平たくいうと、研究者向けのクラウド上のファイル置き場のようなものです。
GRDM は基本的にブラウザ上で使うものですが、コマンドラインツール rdmclient も用意されています。私はこれまで全く使ったことが無かったので1、利点は正直よく分かりません。例えば、Linux サーバから直接容量の大きいデータをアップロードまたはダウンロードしたい時などに向いているかもしれません。
rdmclient のインストール方法と主な使い方は 公式のユーザーマニュアル に書いてあります。ここでは個人的に分かりづらかった点を中心に説明します。Linux を想定しています。
インストール
インストール時に注意があります。GitHub の README.rst は無視して下さい。 あれだと動きません。公式のユーザーマニュアルの方を参考にして下さい。
- rdmclient を置きたいフォルダ (特になければホームディレクトリで OK) に移動し、一式をダウンロード
$ cd <rdmclientを置きたいフォルダのパス> $ git clone https://github.com/RCOSDP/rdmclient
- 専用の Python 仮想環境を用意 (普段使いと混ぜない方が良さそう、venv でOK)
$ cd rdmclient $ python3 -m venv venv $ source ./venv/bin/activate
- rdmclient フォルダの中に requirements.txt (関連パッケージ一式のリスト) が入っているので、pip でインストール
$ pip install -r requirements.txt
- rdmclient 本体をインストール (venv だと途中でエラーが出るけど、最後に Successfully と言われるので多分OK)
$ pip install .
- インストールの確認 (バージョンが表示されればOK)
$ osf -v
一度ログアウトやシャットダウンすると仮想環境から抜けるので、2回目以降は再度仮想環境に入る必要があります。
$ cd <rdmclientを置いたフォルダ>/rdmclient
$ source ./venv/bin/activate
パーソナルアクセストークンの取得
ブラウザ上の認証を経ずにコマンドラインから直接 GRDM にアクセスするためには、認証のための長い文字列 (パーソナルアクセストークン) を取得する必要があります。以下に手順を示します。
- GRDM にログイン
- 右上のアカウントのアイコンより「プロフィール」を選択
- 右の方にある「プロフィールを編集」を選択
- 左メニューより「パーソナルアクセストークン」を選択
- 「新規トークン」ボタンを押す
- トークン名は適当で可 (例、rdmclient)、スコープは最低限 "osf.full_read" と "osf.full_write" にチェックを入れて「作成」ボタンを押す
- トークン (とても長い文字列) が表示されるのでコピーする
これを環境変数 OSF_TOKEN に設定します。XXX... の部分は取得したトークンに置き換えて下さい。
$ export OSF_TOKEN=XXXXXXXXXXXXXXXXXXXX
毎回環境変数を設定するのは面倒なので、.bashrc とかに書いてしまうと良いでしょう。
アクセスしたい GRDM プロジェクトの ID を取得
アクセスしたい GRDM のプロジェクトを開いて下さい。そして URL を見て下さい。末尾に 5文字のランダムな文字列 があると思います。これがそのプロジェクトの ID です。例えば、"https://rdm.nii.ac.jp/xxxxx/" なら "xxxxx" の部分です。ユーザーマニュアルで「プロジェクト名」と呼んでいるのはこれのことで、自然言語で書かれたタイトルではないので注意して下さい。
動作確認 & ファイル一覧取得
以下のコマンドを、xxxxx の部分を上で調べたプロジェクト ID に置き換えて (以下、同様です)、実行してみて下さい。ファイルの一覧が表示されれば成功です。コマンドを実行する場所は、rdmclient フォルダの中でなくて構いません。
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx ls
もしうまくいかない場合は以下を確認して下さい。
- rdmclient 用に用意した Python の仮想環境に入っているか?
$ which python
- トークンが環境変数にちゃんと設定できているか?
$ echo $OSF_TOKEN
- トークンの設定で "osf.full_read" にチェックが付いているか?
- 5文字のプロジェクト ID は、プロジェクトのトップページ (左上にWiki、その下にファイルが見えている状態) のものか?
ファイルのダウンロード
一覧表示したとき、GRDM 上では "osfstorage/" の下にファイルやフォルダが置かれていることに気づいたと思います。ダウンロードする際、これは省略可能です。例えば、以下の2つのコマンドはどちらも同じ動作をします。カレントディレクトリにファイルがダウンロードされます。
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx fetch osfstorage/tmp.txt
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx fetch tmp.txt
ややこしいのが、次の引数でファイルの保存先を明示する場合です。普通の cp や mv の感覚で フォルダ名までで止めるとダウンロードしてくれない ので注意して下さい。例えば、以下のコマンドだと失敗します。保存先を "." にしてもダメです。
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx fetch tmp.txt download/
以下のように、ちゃんとファイル名まで書けば動作します。
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx fetch tmp.txt download/tmp.txt
ファイル名の入力ミスを防ぐため、個人的には 保存したいフォルダに予め移動して、そこで宛先を省略して fetch するのが良い と思います。
フォルダのダウンロード
残念ながら、現時点の rdmclient では フォルダ単位でダウンロード出来ない ようです。全データを丸ごと clone することは可能です。
暫定的にシェルスクリプトを書いて、生成 AI に手直しして貰いました。以下の内容を書いた grdm_fetch.sh ファイルを作り、chmod u+x
で実行権限を付けて、第一引数にプロジェクト ID、第二引数にダウンロードしたいフォルダ名を入れれば、フォルダの中身をダウンロード出来ると思います。階層構造がある場合には対応していません。
#!/bin/bash
# Usage: ./grdm_fetch.sh <project_id> <directory>
# Example: ./grdm_fetch.sh abc12 myfolder
# Check for correct number of arguments
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <project_id> <directory>"
exit 1
fi
project_id="$1"
target_dir="$2"
base_url="https://api.rdm.nii.ac.jp/v2/"
# Fetch file list and process each line
osf --base-url "$base_url" -p "$project_id" ls | while IFS= read -r file; do
if [[ "$file" == osfstorage/"$target_dir"/* ]]; then
echo "Fetching: $file"
osf --base-url "$base_url" -p "$project_id" fetch "$file" -U
fi
done
あまりこんなことで時間を使っても仕方ないので、素直にブラウザを使った方が良いかもしれません。 フォルダを選択してから ZIPでダウンロード ボタンを押せば、丸ごとダウンロードできます。
ファイルのアップロード
ダウンロードと同様、osfstorage は省略可能です。ただし、ファイルのアップロードでは 宛先を省略できません。 ダウンロードのときと同じく、 フォルダ名までで止めるとアップロードしてくれない ので注意して下さい。例えば、以下のコマンドだと失敗します。
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx upload tmp.txt .
以下のように、ちゃんとファイル名を書けば動作します。
$ osf --base-url https://api.rdm.nii.ac.jp/v2/ -p xxxxx upload tmp.txt tmp.txt
フォルダのアップロード
良い知らせがあります。rdmclient でフォルダのアップロードは可能です。オプションに -r を付ければできます。ただし、スラッシュの有無で動作が変わる ので注意して下さい。詳細はヘルプに分かりやすく書いてあるので、そちらを見て下さい。
osf upload -h
英語が苦手な方向けに要点だけ書いておくと、次のような感じです。
$ osf <中略> uplaod -r foo bar # bar の下に foo が置かれる
$ osf <中略> upload -r foo/ bar # foo の中身が bar の中に送られる
まとめ
GRDM のコマンドラインツール rdmclient の使い方を説明しました。公式のユーザーマニュアル で分かりにくかった点を補足したつもりです。以下に主なハマりポイントを再掲します。
- GitHub 上の README.rst を読んではいけない
- プロジェクト名とは URL 末尾にある5文字のランダム文字列のこと
- ファイルのアップロードやダウンロードで、cp や mv の感覚で宛先をフォルダ名で止めたら動作しない
- コマンドラインツールでフォルダごとダウンロードはできないが (GUIなら可)、フォルダごとアップロードはできる
- ダウンロードでは保存先を省略可 (カレントディレクトリに持ってくる)、アップロードでは省略不可
最後に一言。コマンドラインツールを使わなければならないほどデータ容量が大きかったりファイル数が多かったりする状況は、データ管理自体に問題があるかもしれません。ちゃんとデータを整理し、それぞれのファイルの意味を理解した上で、本当に他者と共有すべき必要最小限のデータを厳選することを検討してみて下さい。
-
私は2021年3月より GRDM を使い始め、旧アカウントで約4000回、現アカウントで約3700回の作業回数 (ファイルのアップロードや移動など) があります。NII の一部の方からは GRDM のヘビーユーザーと認識されているっぽいです。そんな私でもコマンドラインツールはこれまで使ったことが無く、GUI で全然平気だったという話です。 ↩