潮が気になるすべてのvimmerへ

# はじめに

[第二のドワンゴ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dwango2) 16日目の記事です。
前日の記事は、[2020 年の Ebiten](https://ebiten.org/blog/2020.html) でした。全く関係ありませんが、私は海老天が大好きなので、Ebiten も応援しています。

さて、表題ですが、`潮` で画像検索すると[かんむす](https://www.google.com/search?q=%E6%BD%AE)がでてきますが、もちろん彼女のことではありません。

潮を辞書で引くと、

1. 月や太陽の引力で海水が満ち引きする現象。
2. ある事をするのに適した時。よいころあい。潮時。

とあります。

ここでは、１の意味を指します。

つまり潮汐のことです。

潮汐は非常に重要な自然現象で、潮汐によって船が出港・帰港できなかったり、魚の活性が変わることにより漁獲量や釣果にも影響を与えます。

筆者もvimで釣りイベントの企画を書いているときに潮汐情報を参照したいことがありましたが、Webで潮汐情報を参照するのが面倒臭いことがしばしばありました。

というわけで、vimから直接潮汐情報を参照できると便利じゃね？ということで、vimプラグインを作ることにしました。

# 潮汐情報を取得する

前述したとおり、潮汐情報は経済や安全に大きな影響を与えるため、日本では気象庁が [潮位表](http://www.data.jma.go.jp/kaiyou/db/tide/suisan/) で潮汐情報を公開しています。

過去の潮位と未来の潮位の予測を [潮汐・海面水位に関する診断表、データ](https://www.data.jma.go.jp/gmd/kaiyou/shindan/index_tide.html) から参照することが出来ます。

各地点の潮汐情報は、[潮位表（PDF版・テキストデータ版）フォーマット](https://www.data.jma.go.jp/gmd/kaiyou/db/tide/suisan/readme.html)においてPDFとテキストデータで公開しており、テキストデータについては、`https://www.data.jma.go.jp/gmd/kaiyou/data/db/tide/suisan/txt/{西暦４桁}/{地点記号}.txt`という形式で参照することが出来ます。

地名と地点コードの対応表は、[潮位表掲載地点一覧表]
(https://www.data.jma.go.jp/gmd/kaiyou/db/tide/suisan/station2021.php) から参照することが出来ます。

例えば、2020年の川崎(地点コード: `KW`)の潮位表は https://www.data.jma.go.jp/gmd/kaiyou/data/db/tide/suisan/txt/2020/KW.txt から参照することが出来ます。

# 潮位表フォーマット

潮位表フォーマットは[潮位表（PDF版・テキストデータ版）フォーマット](https://www.data.jma.go.jp/gmd/kaiyou/db/tide/suisan/readme.html)で公開されており、以下のような仕様となっています。

- テキストファイルの改行コードは `LF`
- 毎時潮位データ
    - 1-72カラム
        - 3桁×24時間（0時から23時）
- 年月日	
    - 73-78カラム
        - 2桁×3
- 地点記号
    - 78-80カラム
        - 2桁英数字記号
- 満潮時刻・潮位
    - 81-108カラム
        - 時刻4桁（時分）、潮位3桁（ｃｍ）
- 干潮時刻・潮位
    - 109-136カラム
        - 時刻4桁（時分）、潮位3桁（ｃｍ）
    - 満（干）潮が予測されない場合、満（干）潮時刻を「9999」、潮位を「999」とする

例えば以下の潮位表データは

```
 65 47 39 44 61 8611313715315915414212711210310110812113514614914212710620 1 1KW 9 3159194914999999999999999 2 7 39144210199999999999999
```

- `01:00`時の潮位は `47cm`
- 観測地点は川崎(KW)
- 満潮時刻
    - `09:03` で 潮位は `159cm`
    - `19:49` で 潮位は ``149cm`
- 干潮時刻
    - `02:07` で 潮位は `39cm`
    - `14:42` で 潮位は `101cm`

と読み取ることが出来ます。

# neovimプラグイン

上述のように、潮位表フォーマットの各データは固定長であるため、各データをリーダーから順番に読み込めばいけばいいだけなので、パース処理はとてもシンプルに実装できそうです。

また、vimプラグインとして潮汐情報を取得することにしましたが、vimプラグインからスクレイピングないしはプラグイン側で潮位表データベースを持つことで、潮汐データにアクセスできそうです。

今回はネットワークが使えないところでも動作させたかった事、潮位表データベースをvimプラグイン側で持っても大した容量にはならないので、vimプラグイン側で潮位表データベースを持つ仕様にしました。

そのため、スクレイピングによる潮位表データベース作成バッチを年１回ほど回し、リポジトリに突っ込む実装にしました。

また、あまりVimScriptを書きたくなかったこと、筆者がneovimに完全移行したこと、neovimはPythonのリモートプラグインが書きやすいことから、今回は [pynvim](https://github.com/neovim/pynvim) を使って、プラグインを書くことにしました。

pynvim では Pythonのデコレータを使用することで簡単にリモートプラグインの内部実装を記述することが出来、また pynvim から簡単にneovimのコマンドが呼び出せるため、非常にneovim プラグインが書きやすいです。

以上の仕様と実装を決めて作ったのが [tide-ja.vim](https://github.com/ymizushi/tide-ja.vim) です。

https://github.com/ymizushi/tide-ja.vim

インストール方法や使用方法、表示など詳しい情報は、[README.md](https://github.com/ymizushi/tide-ja.vim/blob/master/README.md)  を参照してください。

参考までにスクリーンショットを載せておきます。
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18977/d2e55ac6-399c-b49e-b6cf-4a4c71843b11.png)

実際に使っている感想としては、インターネットにアクセスせずに、簡単に目的の地点の潮汐情報を取得できるので、重宝しています。
潮汐情報が気になる人は、船乗りだったり釣り人だったりと、限られるとは思いますが、vimmerで潮汐情報が気になる人は使ってみてはいかがでしょうか。

ちなみに、私は休日は [ヤマハシースタイル](https://sea-style-m.yamaha-motor.co.jp/) で ボートを借りてタイラバ[^1]、オカッパリ[^2]ではイカ・タコ釣りに興じることが多いです。

[^1]: タイラバというルアーの一種を使った釣法。詳しくは [鯛ラバとは](https://www.taikabura.com/tairaba#:~:text=%E9%AF%9B%E3%83%A9%E3%83%90%E3%81%AF%E3%80%81%E4%B8%80%E8%AA%AC%E3%81%AB%E3%82%88%E3%82%8B,%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&text=%E9%A4%8C%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E3%83%93%E3%83%8B%E3%83%BC%E3%83%AB,%E9%A4%8C%EF%BC%89%E3%81%AB%E5%A4%89%E5%8C%96%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)を参照。

[^2]: 船を使わない陸での釣りのこと

釣り好きな方の連絡お待ちしております。

# まとめ
- 潮汐情報は気象庁公式ウェブサイトから取得できる
- ある地点の毎時潮位、満潮・干潮の時刻とその時の潮位ががPDF・テキストフォーマットで取得できる
- テキストフォーマットはシンプルなフォーマットなので簡単にパース出来る
- neovim, pynvim を使うと簡単にneovimのリモートプラグインを作ることが出来る
- 釣り好きなかたの連絡をお待ちしております

明日の記事は、[ytanaka](https://qiita.com/ytanaka) さんです。よろしくお願いします。