先月末の為替レートを取得するコマンド

## やりたいこと

かれこれ3年半ほどベトナム駐在員やってますが、毎月の経費精算でJPY-VND為替レートをググって調べるのが面倒なので、簡単に取得できるようにしたい。コマンドで（病気）。

## 方針

EXCHANGE-RATES.ORG さんのデータを curl で取得してゴニョゴニョする。
EXCHANGE-RATES.ORG さんの過去レートの URL のフォーマットは、

https://..../JPY/VND/YYYY-MM-DD

なので、先月末の日付けを取得し、それをくっつけて curl して加工すれば良い。データとしては、1円、100円、1万円、100万円のデータが少数点以下2桁で四捨五入されて提供されている。月々の経費精算なんて、所詮数万円レベルなので、1万円のものを使っておけば良いが、可能な限り正確に一点の曇りもなくやりたいので、一番数字が入ってる100万円のヤツを使う。

VND のところは、USドルならUSD、ユーロなら EUR、タイバーツなら THB などと適当に変換したいものを入れてください。


### 先月末の日付けを取得する（Mac）

[bash date のよく使う例まとめ - 6VOX](http://blog.6vox.com/2014/03/bash-date.html,bash date のよく使う例まとめ - 6VOX) を参考に。

```
date -v1d -v-1d +'%Y-%m-%d'
```

これだけ。閏月とかは気にしなくても勝手にやってくれる。date コマンドが Mac は微妙に違うので、他の人は、d オプションとかでなんとかしてください。

```bash
$ date +'%Y-%m-%d'
2018-06-26
$ date -v1d -v-1d +'%Y-%m-%d'
2018-05-31
```

3月にして、ホントに大丈夫か確認。

```bash
$ date +'%Y-%m-%d'
2018-0３-３１
$ date -v1d -v-1d +'%Y-%m-%d'
2018-02-28
$ date +'%Y-%m-%d'
2020-03-31
$ date -v1d -v-1d +'%Y-%m-%d'
2020-02-29
```

問題なし。


### curl して必要なものだけを取り出す

ソースコード見ながら、どうするか検討。

```
curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96
```

もっとスマートにやれそうな気がプンプンするけど、見直すのが面倒なので、これで。
何をやっているかをざっと説明すると、

- date コマンドで取得した先月末日を URL にくっつけて curl
- 進行状況は必要ないので、消す -s
- 必要なデータのある行を取得 grep '1 JPY'
- 取得したい数字の先頭に「、」がくっついているので削除し、 cut コマンドで処理するために半角スペースに変換 sed -e 's/、/ /g'
- 数字に「,」が入っていると計算できなくなるので、削除 sed -e 's/,//g'
- 半角スペースで区切って96個目？の要素を抽出 cut -d ' ' -f 96


```bash
$ curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96
209624755.30
```

100万円を変換したベトナムドンが取得できた。取れなくなったら、サイトの構造か何かが変わったはずなので、見直す。

### 計算する
100万円だと使いづらいので、100円にする。うちの経費精算のレート入力は、100円だし。計算するときに、入力も出力も整数ではなく、普通に計算できないので、echo で計算式を作って bc に渡すようにする。

```bash
$ echo "scale=6; 209624755.30/10000" | bc
20962.475530
```

こんな感じになれば良い。

### 完成

```bash
echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc
```

USD などで、100円が1ドル未満になるような場合、bc コマンドでの計算は .91927 などとなってしまうので、0.91927 などと表示したければ、以下のようにすると良い。

```bash
echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/USD/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc | sed -e 's/^\./0\./g'
```

```
$ echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/USD/`date -v1d -v-1d '+%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc
.919271
$ echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/USD/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc | sed -e 's/^\./0\./g'
0.919271
```

こんなの毎月打ってられないので、関数として登録。（関数にするなら、ワンライナーである必要はないのでは？）

```bash:~/.bashrc
+ vndrate() {
+     echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d '+%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc
+ }
```

えい。

```bash
$ source ~/.bashrc
$ vndrate
20962.475530
```
pbcopy するかは好きにしてください。

なお、「良いよ、そんな細かい端数なんてどうでも」という場合は、-f 54 で取れるので、計算しなくて良い。

```bash
$ curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 54
20962.48
```

来月の経費精算時に、こんなものを作ったことを忘れてそう。