Colaboratoryでwgrib2を使えるようにした

#はじめに
この記事はGoogleColaboratoryでwgrib2を使用できるようにしたときの備忘録です。
（既に似た記事があるかも知れませんが、私は見つけられなかったので、とりあえずここに置いておきます。）

#wgrib2とは
こんな項目を用意してみたものの、この記事に到達する人は大半がwgrib2を知っているかと思います。が、念のため簡単に（誤解があるかもしれませんが）説明すると、grib2形式ファイルをgrads形式やcsv形式等の使いやすいものに変換してくれるありがたいコマンド（実行プログラム）です。

多くの気象データがこのgrib2形式になっており、気象データを使ってアレコレしたい人にとっては、wgirb2が使える環境が必要です。

#なんでColaboratoryにwgrib2?
ブラウザ上で気象データを弄り倒すのはロマンです。

気象データの活用とは無縁の畑から育つと、（あぁ...環境設定面倒だなぁ。ちょちょいと弄れる楽なツール無いかなぁ...）なんて思うわけです。で、調べてみると結局色々自分でやるしかないようです。（PATHを通す? /usr/localの下に...?なんて言葉が万人に通じるわけないじゃない。）ローカル環境に依存したくない。そういうことです。

となると、環境が誰でも（ほとんど）同じでライブラリとかが最初から諸々入っている`Colaboratory`に行きつきますよね？

ただ当然`wgrib2`なんてデフォルトでColaboratoryに入っているはずもなく。でもColaboratoryでwgrib2使えたらGoogleDriveに直接データ吐き出せるしいいよなぁ...。と悩んだ結果、入れました。（結局、筆者は自分で入れているので楽できていないですが。せめてこの記事に到達した方が楽できれば幸いです。）

#方針
Colaboratoryの欠点としてインストールした諸々が12時間を超えて(colaboratory内では)保存できないことが挙げられます。無料サービスなので受け入れるしかありません。ただ、毎回wgrib2をダウンロード・展開等するのは流石に脳筋すぎます。

なので、wgrib2のインストール先はGoogleDrive内として（GoogleDrive内にwgrib2の実行プログラムを置いて）、Colaboratory側からはエイリアスをDrive内の実行プログラムに紐付けてしまいます。そうすればwgrib2を使いたいときに自らのドライブをマウントし、エイリアスを生成するだけでwgrib2が使えてしまうのでは?と言った感じです。（シンボリックリンクでも良いと思うのですが、どうもColaboratory内だと不安定なんですよね...）

#必要なもの
・Googleアカウント
・200MBほどの空き容量があるGoogleDrive
・（Colaboratoryの使い方は<a href="https://qiita.com/kogetaenoki/private/1bcd0d5535edb6f0d895">こちらの記事</a>で説明しています。）

#スクリプト
all-in-one的なスクリプトは本記事の末尾に掲載しておきます。ちゃっちゃと済ませたい人はそこからコピぺ、実行してください。
以下には詳細を順に説明します。

##wgrib2(圧縮ファイル)のダウンロード
wgrib2はNCEP/NOAAからダウンロードします。以下のURLから様々なversionのwgrib2圧縮ファイルを取得することが出来ます。
<a href="https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/">https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/</a>
今回は投稿日(2021年6月14日)現在で最新のv3.0.2を導入することにします。また、先ほどの方針にもあるように、ドライブ内にwgrib2実行プログラムを落とすため、予め作業(カレント)ディレクトリをドライブ内に移してしまいます。

```python
wgrb2_dir = "/content/drive/MyDrive/lib/wgrib2"
if not os.path.exists(wgrb2_dir): os.makedirs(wgrb2_dir)
%cd $wgrb2_dir
```

(今回はマイドライブ配下にlib/wgrib2というディレクトリを用意しましたが、別にどこでも構いません。)

で、ダウンロードします。（今回はwgetを使用しました）

```bash
!wget https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz.v3.0.2
```
(Colaboratory内でもwget等のbash環境は`!`や`%`を接頭に付けることで使用できます)


##wgrib2(圧縮ファイル)の展開
次にダウンロードした圧縮ファイルを展開します。

```bash
!tar -zxvf wgrib2.tgz.v3.0.2
```
(展開後に生成されるフォルダがgrib2となり、wgrib2じゃないの?と不安になりますが大丈夫です。問題ありません。)

##make
いよいよwgrib2実行ファイルを生成させます。grib2フォルダに移動し、makeのために環境変数を設定し、makeします。

```bash
%set_env CC gcc
%set_env FC gfortran
!make
```

無事に終了すると、grid2フォルダの下に、wgrib2というフォルダがあり、さらにその下にwgrib2という実行プログラムが生成されているはずです。

##Drive内のwgrib2をColaboratoryから呼び出す
さて、wgrib2をドライブ内に用意できたのであとはColaboratoryから簡単に呼び出せるようにするだけです。正直、先ほど確認したwgrib2を実行さえできれば何でもいいので、直接呼び出しても問題はありません。ただ、深いところにあるので、単に面倒です。
なので今回はエイリアスを生成させることにしました。（.bashrc等に環境設定をしてもいいのですが、（僕だけかも知れませんが安定しないんですよね...））
また、どうやらColaboratoryでは再ログインなどで実行権限を失ってしまうことがあるので、wgrib2コマンド本体の実行権限を設定します。

```bash
%alias wgrib2 "/content/drive/MyDrive/lib/wgrib2/grib2/wgrib2/wgrib2"
!chmod a+x "/content/drive/MyDrive/lib/wgrib2/grib2/wgrib2/wgrib2"
```

以上でwgrib2コマンドが使用できるようになったはずです。
今後は（ドライブをマウントした上で）直上の2行を実行すれば直ぐにwgrib2が実行できます。

じゃんじゃんgrib形式ファイルを展開していきましょう！
（容量にはお気をつけください）

##all-in-one(楽したい人はここだけ)
Colaboratoryのコード入力欄に以下のものをコピペ、「ユーザー毎の設定」を編集後、実行するだけで基本的にはOKです。（保存先とかどうでもいいや、使えれば。って人はコピペ＆実行だけです。）

```python
from google.colab import drive
import os, time

#==================================
#ユーザー毎の設定（ここから）
# - - - - - - - - - - - - - - - - - 
#wgrib2のバージョン
wgrb_ver = "wgrib2.tgz.v3.0.2"
#保存先（MyDrive配下）
wgrb2_dir = "lib_add/wgrib2"
# - - - - - - - - - - - - - - - - - 
#ユーザー毎の設定（ここまで）
#==================================

#以下は基本的に無編集でOK

#ドライブのマウント
drive.mount('/content/drive')

#ディレクトリの設定
drive_home = "/content/drive/MyDrive"
wgrb2_dir = f"{drive_home}/{wgrb2_dir}"
if not os.path.exists(wgrb2_dir): os.makedirs(wgrb2_dir)
%cd $wgrb2_dir
wgrb_file = f"{wgrb2_dir}/{wgrb_ver}"

# URL（固定部）の設定
url_root = "https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/"

# 指定バージョンのwgrib2の有無を判断＆ダウンロード
if not os.path.exists(wgrb_file):
  url = f"{url_root}{wgrb_ver}"
  !wget $url
else:
  print ("wgrib2 download: PATH")

# 指定バージョンのwgrib2ファイルの解凍の有無を判断＆解凍
grb2 = f"{wgrb2_dir}/grib2"
if not os.path.exists(grb2):
  !tar -zxvf $wgrb_ver
else:
  print ("wgrib2 unzip: PATH")

# 指定バージョンのwgrib2ファイルのコンパイルの有無を判断＆コンパイル
%cd $grb2
wgrb2 = f"{grb2}/wgrib2/wgrib2"
if not os.path.exists(wgrb2):
  %set_env CC gcc
  %set_env FC gfortran
  !make
else:
  print ("wgrib2 compile: PATH!")

# wgrib2コマンドの実行権限の設定
# (再ログイン時等に実行権限を失っている場合があるため)
%ls -l $wgrb2
!chmod a+x $wgrb2
%ls -l $wgrb2

# wgrib2コマンドの登録(%wgrib2 で呼び出せるようにする)
%alias wgrib2 $wgrb2
print ("wgrib2 is available!")
time.sleep(3)
%cd /content/
```

#参考
https://ods.n-kishou.co.jp/tech/blog/detail/1923