そろそろオープンデータを無秩序に管理するのは卒業したいので📦データを管理するパッケージマネージャを開発した【ツール開発】 

　今回は[**dim**(オープンデータパッケージマネージャ)](https://github.com/c-3lab/dim) v1.0のリリースに伴って開発したツールの紹介をしたいと思います。
　
　オープンデータもパッケージマネージャ(apt、npm、gem、pipなど)と同じように`npm install xxxxx`のような形でオープンデータをインストールして管理すると良いのではないかという話です。

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

* 以前のバージョンに関しては以下の記事で紹介
[【個人開発】パッケージマネージャーの考えを流用してオープンデータ管理ツールを作ってみた話](https://qiita.com/ryo-ma/items/bb64c62d335c6e6bc923)


* 以前の記事を読んでいてv1.0からの変更点に関して読みたい方
[dim v1.0 変更点](#v10変更点)

# オープンデータを無秩序に管理するのはやめたい
　ソフトウェアやライブラリの管理は世の中様々な体系化された方法が確立されつつあります。ソフトウェアであればaptやbrewなど、ライブラリであれば言語ごとにnpmやgemなどが存在します。しかし、データに関しては私の知る限りそこまで存在していないように感じております。

　もし、あなたが何らかのオープンデータを使って地図上に可視化を行う課題を出された場合、どのような流れでデータの準備しますでしょうか？ 

以下のような流れはよくある一例です。
1. Googleから欲しいデータを検索
2. 欲しいデータを見つけたらブラウザからダウンロード
3. データを確認し、データの不備や欲しかったデータではなかったら**1**に戻る
4. 活用するためにオープンデータを加工(文字コード変換、フォーマット変換)
5. プロジェクトのディレクトリ or データベース にオープンデータを保存

　とりあえず利活用するだけであればこれで十分な場合もありますが、以下のようなプロジェクトの場合は**オープンデータに関する諸元(データそのものに関する情報など)を保持**したいことがあります。

* 複数人で開発するプロジェクト
* 中長期で保守するプロジェクト
* 汎用性のあるプロジェクト(OSSとしてGitHubに公開など)
など

## オープンデータを使う際に必要と考えられる諸元(データそのものに関する情報など)

　様々なサイトからオープンデータを取得して加工処理などを実施した場合に、**どこから取得してきたデータ**なのか**どのような加工処理を実行した**のかわからなくなる場合がありますのでこのような諸元を保持しておくとより便利になると考えております。

* データの取得元URL
* データの最終更新日
* データのバージョン
* データを使うために必要な後処理(文字コード変換などの加工を行う場合)
* データのhash値
など


　また、複数人で開発している場合はこのような**諸元を体系的に管理して共有を行う**必要があると考えられます。


# 解決アプローチ
　オープンデータも**パッケージマネージャ**(apt、npm、gem、pipなど)と同じように
`npm install xxxxx`
のような形でオープンデータをインストールできて
`package.json`
`package-lock.json`
のようにインストールされたデータの諸元情報を管理できると便利だと思いオープンデータのパッケージマネージャを開発しました。



## リリースしたツール 
https://github.com/c-3lab/dim

コマンドライン上で実行可能です。
![8bket-vzuiv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/423a98d3-ce4c-ce12-307b-dfba7009b9b8.gif)
※ gif動画はv1.0未満のバージョンであり、表示などが異なる場合があります

### 特徴

#### ⑴ データ検索/取得/処理/記録の一連プロセスに対応
　dimはデータ検索/取得/処理/記録の機能に対応しています。また、対話型コマンドによって一連の動作を１つのコマンドで実行する機能にも対応しています。

![スクリーンショット 2022-09-28 10.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/de8f0503-7ad4-eb78-54e3-60ec6cdff604.png)

#### ⑵ データ利活用するために便利なデータ加工処理を搭載
　dimはオープンデータを扱う際によく使う加工処理を搭載しています。
　実行した加工処理は対象のデータに紐づけられ記録され再現することが可能です。また、自作で作成したスクリプトをdimの記録対象として登録することも可能です。
![スクリーンショット 2022-09-28 10.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/b856b3eb-d6d9-669c-4346-a84348c1ed75.png)

#### ⑶ 既存のデータ諸元ファイルより1stepでデータ準備

　すでに記録が行われたデータ諸元ファイルを使うことで1stepでデータを準備することが可能です。
　データ諸元ファイルに基づいて自動で必要なファイルのダウンロードとそれに対応した加工処理を実行することが可能です。
　用途としてはデータ諸元ファイルをGitHubに公開するなどしてオープンデータ本体をリポジトリに含まずとも必要な情報をシェアができます。
(package.jsonなどをGitHubに公開するノリと同じです)
![スクリーンショット 2022-09-28 10.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/4bb55979-b2e5-39f2-f9b4-e191b3e65405.png)

#### ⑷ AI(GPT-3)によるデータの加工処理/可視化処理などのコード自動生成

![スクリーンショット 2023-02-08 16.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46662/f4fda3df-e0f6-704a-61fd-be7b53c89943.png)
※ 2023/2/7: GPT-3を使った新たな機能を追加しました。詳細は以下の記事をご覧ください。

https://qiita.com/ryo-ma/items/6bf20057f53a6fe41851

### 開発環境について
* 言語：TypeScirpt
* 実行環境：Deno
* 主なDenoライブラリ
    * Cliffy - コマンドラインツールを作るためのライブラリ
* CI/CD：GitHub Actions
    * CI：テスト・Lint・Type Check・カバレッジ
    * CD：タグを切ることで自動でリリース発行、dimのバイナリ作成&アップロード

　Node.jsの置き換えとして期待されている[Deno](https://deno.land/)を使用しています。Denoはバージョンアップのスピードも早く仕様の変更が激しいです。また、Deno本体および周辺ライブラリにおいてもまだまだ成熟しきっていない点でも細かいところで引っかかることが多々あります。

　しかし、今回は以下のような内容において評価し、Denoを採用しております。
* 設定がシンプルでプロジェクトを開始しやすい
* Lintやフォーマッターが標準機能として備わっている
* TypeScriptがそのまま実行できる
など

### dimのインストール
OSごとにバイナリを用意しています。curlでダウンロード可能です。
保存先は適宜変更してください。

[aarch64-apple-darwin](https://github.com/c-3lab/dim/releases/latest/download/aarch64-apple-darwin-dim)

```
curl -L https://github.com/c-3lab/dim/releases/latest/download/aarch64-apple-darwin-dim -o /usr/local/bin/dim
```

[x86_64-apple-darwin](https://github.com/c-3lab/dim/releases/latest/download/x86_64-apple-darwin-dim)

```
curl -L https://github.com/c-3lab/dim/releases/latest/download/x86_64-apple-darwin-dim -o /usr/local/bin/dim
```

[x86_64-pc-windows-msvc](https://github.com/c-3lab/dim/releases/latest/download/x86_64-pc-windows-msvc-dim.exe)

```
curl https://github.com/c-3lab/dim/releases/latest/download/x86_64-pc-windows-msvc-dim.exe -o C:\Users\user-name\dim.exe
```

[x86_64-unknown-linux-gnu](https://github.com/c-3lab/dim/releases/latest/download/x86_64-unknown-linux-gnu-dim)

```
curl -L https://github.com/c-3lab/dim/releases/latest/download/x86_64-unknown-linux-gnu-dim -o /usr/local/bin/dim
```

#### 実行権限の付与

```
chmod u+x /usr/local/bin/dim
```

### dimの使い方

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

dimを使うためにプロジェクトを初期化として必要なファイルが生成されます。

```
dim init
```
生成されるファイルは以下です。
* `dim.json` (package.json相当)
* `dim-lock.json`(package-lock.json相当)
* `data_files`(node_modules相当)

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

インストールすると`dim.json`および`dim-lock.json`に記録がされていきます。

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

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

```
$ dim install https://example.com -n "example" -p unzip
```

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

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

```
$ dim install https://example.com -n "example" -p "encode utf-8"
```

#### ダウンロード後にxlsxからcsvに変換するインストール
```
$ dim install https://example.com -n "example" -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)
※ gif動画はv1.0未満のバージョンであり、表示などが異なる場合があります

#### そのほかのコマンド

以前の記事に記載しているのと最新情報はリポジトリのUsageに記載しています。

https://qiita.com/ryo-ma/items/bb64c62d335c6e6bc923#%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E6%A9%9F%E8%83%BD

https://github.com/c-3lab/dim#command-usage

### v1.0変更点

#### 1. 検索機能

　データを探すという最初のフェーズからサポートしたいという思想のもと検索機能を実装を行いました。オープンデータの検索は[データカタログ横断検索システム](https://search.ckan.jp/)のAPIによって実現しております。
　検索キーワードを引数に渡すことで検索結果のデータにおけるメタデータを一覧で取得できます。

```
$ dim search 避難所
```

#### 2. 対話型コマンド 検索-取得-処理-記録 の実施

検索-取得-処理-記録の一連プロセス実行を対話型で入力できるコマンドを実装しました。

```
$ dim search -i "東京 避難所"
```

実行すると以下のようなオープンデータの検索結果一覧が取得できます。その後、以下のように対話型で情報の入力が求められます。
```
132098_東京都_町田市_公園・スポーツ施設
  - Catalog URL        : https://www.geospatial.jp/ckan/dataset/13209-014
  - Catalog Description: ####公園・スポーツ施設のデータです。...
  - Catalog License    : クリエイティブ・コモンズ 表示
    1. スポーツ施設
      * Resource URL        : https://www.geospatial.jp/ckan/dataset/c6ff6e51-e213-4a55-8b19-c363fe7ead5d/resource/fd2e2728-c9ad-4139-ab9b-44020e690fe4/download/13209sportshisetsu.csv
      * Resource Description: ####スポーツ施設...
      * Created             : 2018-02-01T09:53:23.816309
      * Format              : CSV
    2. 公園・レクリエーション施設
      * Resource URL        : https://www.geospatial.jp/ckan/dataset/c6ff6e51-e213-4a55-8b19-c363fe7ead5d/resource/9bfc87de-1ff4-4d1a-92b5-12fd4b759336/download/13209kouen.csv
      * Resource Description: ####公園・レクリエーション施設...
      * Created             : 2018-02-01T09:53:25.679611
      * Format              : CSV

131091_東京都_品川区_文化・スポーツ施設・公園
  - Catalog URL        : https://www.geospatial.jp/ckan/dataset/13109-104
  - Catalog Description: ####東京都品川区のオープンデータです。...
  - Catalog License    : クリエイティブ・コモンズ 表示
    3. 文化・スポーツ施設・公園
      * Resource URL        : https://www.geospatial.jp/ckan/dataset/f05a8fce-3a3d-4c2e-8e1d-1a66211219e5/resource/55619dbb-5c8a-4bbd-92a3-4ee28547b928/download/culturesportspark.csv
      * Resource Description: ####更新日：2017/7/31
      * Created             : 2018-03-15T08:54:40.133147
      * Format              : CSV
    4. 文化・スポーツ施設・公園
      * Resource URL        : https://www.geospatial.jp/ckan/dataset/f05a8fce-3a3d-4c2e-8e1d-1a66211219e5/resource/c494eb2f-be74-49ba-afc5-0c2760afa1a5/download/culturesportspark.rdf
      * Resource Description: ####更新日：2017/7/31
      * Created             : 2018-03-15T08:54:41.909045
      * Format              : RDF
```

(1) ダウンロードしたいデータの検索結果に書かれている番号を入力
```
? Enter the number of data to install > 1
```

(2) 記録する際のデータ名を入力 (デフォルトでは検索結果で取得されたリソース名が入ります)
```
? Enter the name. Enter blank if want to use CKAN resource name. > 
```

(3) 後処理を入力
```
? Enter the post-processing you wish to add. Enter blank if not required. > xlsx-to-csv
```

(4) 後処理を追加したい場合は Y そうでなければ n を入力
```
? Is there a post-processing you would like to add next? (Y/n) > No
```

入力内容に基づいてデータを取得、後処理を実行、記録が行われます。
```
Convert xlsx to csv.
Installed to .......
```

#### 3. 別ディレクトリに存在するdim.jsonを指定してインストール

　installコマンドを使って一括でデータをインストールする場合、デフォルトではカレントディレクトリの`dim.json`を参照します。もし他のディレクトリにある`dim.json`を参照してインストールを行いたい場合は `-f`によって指定することが可能になりました。

```
$ dim install -f ./path/dim.json
```

#### 4. インターネット上に存在するdim.jsonのURLを指定してインストール

　インターネット上に存在する`dim.json`を指定して一括インストールを行う機能も追加されました。GitHubなどで誰かがオープンデータのセットを`dim.json`として公開してくれている場合はURLで参照することが可能です。

```
$ dim install -f https://raw.githubusercontent.com/xxxx/xxxx/main/dim.json
```

#### 5. headerを指定してインストール

　インストール時にHTTPヘッダーを指定することが可能になりました。ヘッダーによる認証がかけられた基盤に対してアクセスする場合にも対応可能です。ヘッダーに指定した内容は`dim.json`、`dim-lock.json`にも記録されます。
```
$ dim install https://example.com -n "example" -H "Authorization: 1234567890abc" -H "Fiware-Service: example"
```

#### 6. 同一URLからのインストール禁止と強制インストール機能
　基本的に一度インストールし`dim.json`に記載されているオープンデータ(同一URL)に対して再びインストールを実行することを禁止としました。提供者によってオープンデータが利用者に知らされず変更が行われた際にアプリケーショなどに想定外のバグが発生する可能性があると考えたためです。今後はデータのhash値やe-tagなどの比較により変更を検知する機能を実装する予定です。
　ただし、意図してデータの更新を行いたい場合もあるので`-F`を使うことでこの制限を回避する方法を用意しました。またはupdateコマンドを使うことでデータの更新を行うことができます。
```
$ dim install https://example.com -n "example" -F
```


#### 7. 非同期インストール
　デフォルトのインストールではdim.jsonに書かれた順に実行されます。`-A`を使うことで非同期的にデータのインストールを実施することが可能です。実装としてはDenoのasync(シングルスレッド非同期処理)によって実現されています。
```
dim install -A
```

# まとめ
　パッケージマネージャのようにオープンデータを管理するオープンデータパッケージマネージャdimのバージョンv1.0のリリースを行いました。検索機能やインターネット上の管理ファイル(`dim.json`)からのデータ取得にも対応しました。
　まだまだ追加したい機能はたくさんあり、[issue](https://github.com/c-3lab/dim/issues)が溜まっていくばかりです。**もし、課題間に共感し一緒にissueを解決してくれる方がいましたら大歓迎いたします。**

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