大気汚染世界一のハノイのAQI, PM2.5の状況をMacのデスクトップにGeekToolで表示する

## 前置き
先日、AirVisual というサービス？が発表する大気汚染ランキングでハノイが世界第1位、ホーチミンが世界第3位を記録したことがニュースで取り上げられ、Facebook 等でも連日話題になっています。ランキングの内容をよく見るに、瞬間最大風速的な話しで、恒常的に大気汚染されているということではないようなので、あまり気にする必要はないのかも知れませんが、会社経営側としては、安全配慮義務的に、大気汚染をどう捉えるべきか考える機会となりました。というわけで、大気汚染の状況をウォッチして行くことにしました。

（参考）

- [空気質指数](https://ja.wikipedia.org/wiki/%E7%A9%BA%E6%B0%97%E8%B3%AA%E6%8C%87%E6%95%B0)
- [AirVisual](https://www.airvisual.com/)
- [ハノイとホーチミンの大気汚染、世界1位と3位に](https://www.viet-jo.com/news/social/190926200116.html)


ただ、アプリや機能拡張をインストールしたり、毎回ウェブサイトにアクセスするほどのモチベーションはなく、気にしなくても見えてるくらいにしたいので、GeekTool でデスクトップに表示することにします。grep とか sed とか正規表現とか、しばらく使わないと忘れるし。

## システム要件

今回はこんな環境でやりました。

|Item|Version|
|:---:|:---|
|OS| MacOS Mojave 10.14.6|
|bash|3.2.57(1)-release (x86_64-apple-darwin18)|
|curl|curl 7.54.0 (x86_64-apple-darwin18.0)|
|grep|2.5.1-FreeBSD|
|sed|不明|
|GeekTool|3.1.1|
（Mac の sed のバージョンってどうやって調べるの？）

## ソースコードを眺めて方針を検討する
[Hanoi Air Quality Index (AQI) and PM2.5...](https://www.airvisual.com/vietnam/hanoi)
欲しい値は、現時点の AQIの値とレベル（Good, Moderate, Unhealthy for Sensitive Groups, Unhealthy, Very Unhealthy, Hazardous）、PM2.5 の濃度の3つです。
ソースコードを開いてみると…あぁ難読ですね。行を抽出しても使えない。しばし眺めてみると、AQIに関しては、h1タグで囲われており、PM2.5 に関しては単位の µg/m³ が特徴的なことが分かります。


- curl でソースコードを取得する
- grep の E オプションを使い正規表現で <h1~µg/m³ を検索し、o オプションで該当箇所を抽出する。
- sed で整形する。


こんな感じにしましょう。

## curl でソースコードを取得する
ここは省略で良いですかね。

```
curl -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X)' --silent https://www.airvisual.com/vietnam/hanoi
```

ホーチミンの場合は、```hanoi``` の部分を ```ho-chi-minh-city``` に変えればOKです。


## grep で抽出する
grep の o オプションは、マッチした箇所だけを抽出するオプションです。ソースコードには改行がほとんどないので、oオプションで抽出します。
E オプションは、正規表現。
試しに、

```
curl .... | grep -oE '<h1(.+)µg/m³'
```

としてみると、PM2.5 の値が繰り返し出てくるため、加工に入るにはまだちょっと長いです。なので、短くします。

```
curl .... | grep -oE '<h1([^µ]+)µg/m³'
```

70%くらいになりました。まぁ良しとします。

## sed で整形する

まずは、h1 の閉じタグから、PM2.5の数値までを正規表現でゴッソリ消したいと思います。

```
curl ... | grep ... | sed -E 's/<\/h1>(.+)\| //g'
```

```...for Sensitive Groups53.7 µg/m³``` こんな感じになりました。改行しましょう。

改行は、````\\n```などと入れればできそうですが、できないので、```'s/xxx/\'$'\n/'``` のように書きます。

```
curl ... | grep ... | sed -E 's/<\/h1>(.+)\| /\'$'\n/g'
```


PM2.5 の文字は消しましたが、必要なので戻したいと思います。オリジナルの表記は、```PM2.5 | 53.7 µg/m³``` で、```|``` がいやなので、```:``` に置換して整えます。改行時についでにやってしまいましょう。

```
curl ... | grep ... | sed -E 's/<\/h1>(.+)\| /\'$'\nPM2.5: /g'
```

結果は、こうなりました。

```
<h1 _ngcontent-sc26="" title="<b>Hanoi</b> air quality index (AQI) and PM2.5 air pollution is 146, Unhealthy for Sensitive Groups"><b>Hanoi</b> air quality index (AQI) and PM2.5 air pollution is 146, Unhealthy for Sensitive Groups
PM2.5: 53.7 µg/m³
```

h1 の title 属性にも同じ文言が入っていて邪魔なので、後方の AQI の値の手前までざっくり消しましょう。行頭から is まで消せば良いですかね。複数の正規表現は、```;``` でつなげましょう。ついでに```AQI: ```も付けときます。

```
curl ...| grep ... | sed -E 's/.../.../g; s/^(.+) is /AQI: /g'
```

指標には、単位を付けたいところですが、AQI の単位が AQI だとしつこいので省略しました。

## スクリプト完成

```
curl -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X)' --silent https://www.airvisual.com/vietnam/hanoi | grep -oE '<h1([^µ]+)µg/m³' | sed -E 's/<\/h1>(.+)\| /\'$'\nPM2.5: /g; s/^(.+) is /AQI: /g'
```

↓

```
AQI: 146, Unhealthy for Sensitive Groups
PM2.5: 53.7 µg/m³
```

## GeekTool に設定
GeekTool の Shell スクリプトでは標準出力とかないので、最初の curl 部分を echo します。


```
echo "`curl -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X)' --silent https://www.airvisual.com/vietnam/hanoi`" | grep -oE '<h1([^µ]+)µg/m³' | sed -E 's/<\/h1>(.+)\| /\'$'\nPM2.5: /g; s/^(.+) is /AQI: /g'
```

Refresh は30分おき、タイムアウトは30秒くらいで良いかな？
<img width="739" alt="GeekTool_AQI.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245908/c0d6851f-7949-0a4c-65a6-2bc63e5a474e.png">

こんな感じになりました。あぁ...Font face......ま、いっか。

ベトナムに来る際は、マスクを忘れずに。→ [Amazon.co.jp: マスク PM2.5](https://amzn.to/2pv4RQ6)

では〜。


### 余談
私が GeekTool で表示しているのは、

- 日付 → デフォルトだと見えないので。
- 時刻 → デフォルトだと小さいので。
- ネットワーク接続速度（DL/UL） → ベトナムだとネットワークの速度は重要なので。
- 接続ネットワーク情報 → VPN 接続したり、あれこれ切り替えるので。

などです。気温や天気は、ホーチミンでは見るまでもないので、私には不要。