きっかけ
ロシア語を勉強する学生が必ずといっていいほどお世話になるものがひとつあり、東京外国語大学のロシア語辞書がそれだ。このインターネット時代、そのへんを探せばオンライン単語帳くらいごまんとありそうなものだが、ロシア語に関してはあんまりない。というかこれしか有用なのがない。ゆえに誰もが(たぶん)使っている。紙の辞書? 研究社露和辞典をどうぞ。1
さてこの辞書、学外で使わせていただいているという立場上本来なら文句をつけるのも筋違いなわけだが、不満がないわけではない。ちょっとアクセスしてもらえばわかるだろう。Enter
キーで検索ができないとか、ゼロ年代インターネットっぽい要素配置とか、SSL未対応とか(これはもうどうしようもない)、それもそのはず、ページ最下部に煌めく "2005" の文字。マジで?
包み隠さずにいうと、ユーザー体験があまりよろしくない。とはいえ、なにか高度なインターフェースが必要なたぐいのものでもない。私としては、ささっとコマンドラインから単語が検索できて、結果が綺麗に表示されればそれで構わない。ちょうどなにか CLI ツールを作りたいと思っていたこともあり、これを題材にできないか考えてみた。
しかしこの辞書、APIが公開されているわけもなく、適当にJSONかなにかでデータを引っ張ってくることはできない。そこでURLを見てみる。単語 "русский" を検索した結果のURLが以下だ。
文字をデコードして必須要素を並べると以下のようになる。
だいぶわかりやすいクエリパラメータが見えてくる。少なくとも「検索したい単語」serchTxt
(原文ママ)と「検索方法」searchWayID
から URL を生成して問い合わせれば、望んだ単語の検索結果は取得できそうだ。
あとは取得したHTMLを適当にパースしてターミナルに出力すればよく、この程度の作業ならどんな言語でも実装できる。そういうわけでRustで書いた。
中身
なお、以下のクレートを切り貼りしたようなものなので、とくに付け加えることはない。
使ったクレート
- ureq
- clap
- コマンドライン引数のパーサ。簡単に引数が取得できて、
--help
やらの出力設定も勝手に行われる。今回のような軽い用途にはやや過剰の感もある。
- tl
- HTML のパーサ。何と比べればいいのかよくわからないが、少なくとも今回の処理で速度上の問題を感じることはなかった。
- tabled
- struct をいい感じに整形してターミナルに出力してくれる。
できたもの
感想
Rust自体というよりも、パッケージマネージャのCargoがおそろしく便利だった。ライブラリを引っ張ってくるのに手間がかからないので、初心者にも参入しやすい。こういうツールを軽く作るにはかなり良いかもしれない。