【ツール開発】パッケージマネージャーの考えを流用してオープンデータ管理ツールを作ってみた話

本記事で言いたいことはオープンデータも `npm install xxxxxxx`みたいな感じでインストールできてpackage.json(package-lock.json)のようにインストールした情報が管理されている方がいいよねということです。

# できたもの
![8bket-vzuiv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/423a98d3-ce4c-ce12-307b-dfba7009b9b8.gif)

[Deno](https://deno.land/)を使ってdimというオープンデータの管理としてインストール、アップデート等を行えるコマンドラインツール作りました。
現在はバイナリを配布しています。
https://github.com/c-3lab/dim#install-the-dim

https://github.com/c-3lab/dim

# モチベーション
オープンデータの活用における期待が高まっている昨今では、オープンデータを活用したデータ分析やアプリケーション開発が盛んに行われはじめています。
また近年になって各自治体におけるオープンデータ提供のルールや管理における仕組においても行政が課題感を感じており検討が積極的に進められていたりします。

このように提供側の整備が進みつつあるものの***利用者側におけるオープンデータ管理***においては私の知る限りそこまでの検討が及んでいないように感じました。

そこで今回はオープンデータ提供側の管理が進んだ先に検討が必要となってくるであろう、オープンデータ利用側の管理について考えて、管理用のツールを試しに作ってみることにしました。

# データ利用者側で求めれるオープンデータ管理について

まず***オープンデータ利用者側の管理***というのはソースコードを含んだプロジェクト内における外部から取得してきたオープンデータの管理を指します。

以下のような項目を管理する必要があると考えました。

* どこから取得したデータなのか
* いつ取得したデータなのか
* データは最新版か
* データは意図したバージョンのものか
* データ取得時に何らかの前処理を行ったか(文字コード変換、ファイル形式変換など)
* 信頼できるデータかどうか

などなど


一般的にエンジニアが自治体に公開されているオープンデータを使う場合以下のような流れになると思います。また、チームとして開発している場合、メンバーに対して上記のような項目を管理し共有する必要があります。

![スクリーンショット 2022-01-07 9.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/acfe0cfe-c80e-e0d0-51f5-db7ae32d59bd.png)



※ 他にこんな管理項目も必要なのではというのがあればコメントなどで教えていただけるとありがたいです。


# アプローチ

先ほどの項目を情報として管理し他開発メンバーが使う際も同じように操作し管理できるツールを検討することにしました。
そこで着目したのが***パッケージマネージャー***の考え方でした。

パッケージマネージャのツール例では ***apt***、***npm***、***pipenv(pypi)***、***gem***などがありライブラリやソフトウェアの管理においては必須のツールになっております。

今回のケースでは管理の対象がライブラリやソフトウェアではなくオープンデータになっただけで管理したい内容はほぼ同じだと考えました。


# 実現について

残念ながら、現状ではデータ提供側のルールや仕組みが自治体ごとにバラバラであったり、npmやpypiのような中央集権型レジストリの仕組みはありません。 
そのため現状の世界ではいくつかの管理機能おいて実現できない項目がでてきました。

* どこから取得したデータなのか
* いつ取得したデータなのか 
* データは最新版か -> ***データのバージョン管理がデータ提供側に必要***
* データは意図したバージョンのものか -> ***データのバージョン管理がデータ提供側に必要***
* データ取得時に何らかの前処理を行ったか(文字コード変換、ファイル形式変換など)
* 信頼できるデータかどうか -> ***信頼を証明する仕組みがデータ提供側に必要***

また、レジストリの仕組みがあればデータ提供者側が決めたユニークなエイリアス名などからオープンデータを指定してインストールするようなこともできたはずです。

まず、今回は未来を見据えて今できるところから試してみることにしました。また、現状実現できる項目だけでも十分便利だと思うので作る価値はありそうだと考えました。

※[CKAN](https://ckan.open-governmentdata.org/)などを使っている自治体であればこれらの一部機能は実現可能です。

# 開発したツール
改めて紹介です。dimというコマンドラインツールを作成しました。

https://github.com/c-3lab/dim

現在はバイナリを配布しています。
https://github.com/c-3lab/dim#install-the-dim

## 作成した機能

### プロジェクトの初期化

必要なファイルが生成されます

```
dim init
```


### データのインストール

インストールするとlockファイルに追記されていきます

```
dim install [open data url] -n [name]
```

### ダウンロード後にunzipするインストール

```
dim install [open data url] -p unzip
```

### ダウンロード後に文字コードをエンコードするインストール

encoding- の後ろにエンコードしたい文字コードを指定します

```
dim install [open data url] -p encoding-utf-8
```

### ダウンロード後にxlsxからcsvに変換するインストール
```
dim install [open data url] -p xlsx-to-csv
```

## dim.jsonから必要なデータを全てインストール

```
dim install
```

既存のdim.jsonがあればその内容に基づいて、必要なデータをダウンロードし、前処理も含めて全て行ってくれます。そのためdim.jsonを他のメンバーに共有すれば一撃でデータの準備ができます。
![r30y7-wcbx7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/15c9fa8d-35db-437f-9f5a-6def0b46f210.gif)



## データのアンインストール

```
dim uninstall [name or url]
```

## インストール済みデータの一覧

```
dim list
```

## インストールしているデータの更新

[name or url]を指定しないと全てのデータをアップデート

```
dim update [name or url]
```

# まとめ
dimというオープンデータを管理するコマンドラインツールを作成しました。現状では基本的なインストール、アンインストール、アップデート等の機能が実装されておりlockファイルに取得情報が記録されます。
私自身もオープンデータを地図上に可視化するプロジェクトなどで実際に利用し、利便性を感じています。

https://github.com/c-3lab/dim

# 今後
今後、[CKAN](https://ckan.open-governmentdata.org/)のサポートをすることでrevisionに対応、自身で作成した前処理(custom-preprocess)が登録できる機能があるとより便利になると考えています。(おそらくデータベースに保存する処理を加えたいなどのニーズがありそう)
また、需要があれば配布方法なども、もう少し考えていきたいと思います。