naru Pt. 1: 最初の導入とコードの全体像

[OpenStreetMap Data Extracts](https://download.geofabrik.de/) からベクトルタイルを生産・配信・設計・最適化する工程を技術移転する [naru](https://github.com/unvt/naru) の解説の１回目です。

今回は、最初のソフトウェア導入を行い、コードの全体像を説明してみます。

# ソフトウェアの導入
## 国連ベクトルタイルツールキット(UNVT)の導入
まず、国連ベクトルタイルツールキット本体を導入します。今回はワンライナーインストーラの [equinox](https://github.com/unvt/equinox) を使用して、次のようにします。Raspberry Pi で動作している Raspbian で実行することを想定していますが、その他の Unix 環境でも結構動くかもしれません。

```zsh
curl -sL https://unvt.github.io/equinox/install.sh | bash -
```

equinox が使えない場合には、例えば Docker コンテナイメージの [nanban](https://github.com/unvt/nanban) で代用することもできます。

## 技術移転教材（naru）の導入
ファイルを作って良いディレクトリ（例えばホーム）に移動して、次のコマンドを実行すると、教材が導入されます。

```zsh
git clone https://github.com/unvt/naru.git
cd naru
rake inet:install
```
以下、技術移転中の作業は、この `naru` というディレクトリの中で進めることになります。

`rake` は、オブジェクト指向スクリプト言語 Ruby で書かれたビルドツールです。国連ベクトルタイルツールキットは、主に（１） C++ で書かれた Tippecanoe、(2) Node.js で書かれた budo や vt-optimizer を主要素とするのですが、ビルドツールについては、ポータビリティが高くて少ないストレスで書けるツールが C++ にも Node にもないように思ったので、 `rake` を採用しています。

`rake inet:install` の `inet:install` は、あなたが実行した**タスク**の名前です。これは、この教材に必要なソフトウェアをダウンロードするタスクです。

このタスクは教材の一部として書かれています。具体的には [naru のRakefile の最初の方](https://github.com/unvt/naru/blob/3e55c793442a6cb4262711feeeb3a5c120f6b0ce/Rakefile#L8-L10) に次のとおり書いています。

```ruby
  task :install do
    sh "yarn"
  end
```

これは、 install という名前のタスクの中身を記述するもので、タスクの中身は `sh "yarn"` です。これは「yarn というコマンドを実行する」という意味です。

`yarn` は Node.js で書かれたパッケージマネージャです。コマンドラインオプションを付けずに `yarn` と実行した場合、このディレクトリにあるプロジェクトのためのライブラリをダウンロードしてインストールします。

`inet:` という接頭辞をつけるために、`Rakefile` の中では `namespace` を付けて次のようにしています。

```ruby
namespace :inet do 
  desc 'install extra software for naru'
  task :install do
    sh "yarn"
  end
```

`naru` は原則としてインターネット接続なしに一通りの技術移転ができるように設計しています。ウェブ技術はインターネットなしでも利用可能なのです。しかし、インターネット上にあるライブラリを導入するタスクについては、どうしてもインターネット接続が必要です。このようにインターネット接続が必要なタスクについては、`inet:`を接頭するようにして区別しています。

`desc 'install extra software for naru'` は、`inet:install` タスクに対する説明テキストとして `install extra software for naru` というテキストを付加するものです。

# コードの全体像
これから `naru` を使って OSM ベクトルタイルを生産・提供・設計・最適化する技術移転を行いますが、まずは全体像をみていきましょう。

## タスクの一覧
`rake -T` を実行することで、現在準備されているタスクの一覧を見ることができます。

```zsh
$ rake -T                                                                                                                                            [~/naru]
rake host           # host the site
rake inet:download  # download source geospatial data to the place
rake inet:fonts     # TODO: clone and build fonts, and copy to docs
rake inet:install   # install extra software for naru
rake inet:mbgljs    # TODO: clone and build mapbox-gl-js, and copy to docs
rake inet:sprite    # TODO: clone and build maki, and copy to docs
rake js             # TODO: build JavaScript code using rollup
rake optimizer      # TODO: run vt-optimizer
rake style          # build style.json from HOCON descriptions
rake tiles          # build tiles from source data
```

これから使っていく順に解説していくと、次の通りです。

### inet:download
これは、[OpenStreetMap Data Extracts](https://download.geofabrik.de/) から、必要な地理空間情報をダウンロードするタスクです。

どこの地理空間情報をダウンロードするかは、`Rakefile` の冒頭に書いてある `REGION` 及び `AREA` を書き換えることで変更できます。

### tiles
これは、ダウンロードした地理空間情報をベクトルタイルに変換するタスクです。

変換の設定は、[modify.js](https://github.com/unvt/naru/blob/master/modify.js)及び[osmium-export-config.json](https://github.com/unvt/naru/blob/master/osmium-export-config.json)で変更できます。また、ソースデータの形式を osm.pbf から Shapefile などの形式に変更することも可能です。この場合には、呼び出すコマンドを `osmium` から `ogr2ogr` に変更することになります。

### style
これは、[`hocon` ディレクトリ](https://github.com/unvt/naru/tree/master/hocon)に格納された、人間に扱いやすいように最適化されたスタイル記述を、Mapbox GL JS 用のスタイルファイルにコンパイルするタスクです。

### host
これは、生産したタイルやコンパイルしたスタイルを、ライブラリやフォント、スプライトの情報を合わせてサイトとしてホストするタスクです。

### その他
残るタスクである、`inet:fonts`, `inet:mbgljs`, `inet:sprite`, `js`, `optimizer` については、`naru` の中では 2020-05-06 時点では未実装です。これらのタスクの実行結果にあたるファイルは、 UNVT のこれまでの成果からコピーして置いてあります。

これらのタスクを実装することにより、`naru` はより自己完結したものになりますが、当面は、`inet:download`, `tiles`, `style`, `host` の４つの基本タスクを分かりやすく伝えることに注力します。

## naru の実装に当たって留意している原則
- パイプライン。UNVT は Unix のカルチャーへの敬意に基づいて実装しており、「1つだけの仕事をうまくやる、道具のようなソフトウェアをパイプで組み合わせる」ことをしています。