気付いたら8月です。猛暑というか酷暑というかですが、台風が来てくれると多少熱が持っていかれるので、多少は過ごしやすくなってくれるといいんですが。
少しは別のこともやらんとなぁ、ということで、久し振りにRustを使ってちゃんとしたツールというのを作ってみました。
何を作ったのか
https://github.com/derui/org-roam-protocol-installer
こんなのを作りました。今、個人なナレッジの蓄積としてorg-roamを利用しています。org-modeには、org-protocolという、外部からorg-modeに対してcaptureを行わせることができる仕組みが存在しています。
org-roamにはこれを独自に拡張した、org-roam-protocolというものがあります。これを利用すると、webページとかをお手軽にorg-roamにcaptureする・・・ということができます。
が、リンク先のドキュメントを見てもらえばわかるのですが、ファイルを作ったりなんだりと、別段複雑ではないものの、多少手順が必要だったりして、これはこれでなぁ・・・みたいなことを考えました。特にmacOSがめんどくさい。
ということで、じゃあこれをインストールするだけのツールを作ればいいんでない?ということを思いつき、ついでにRustの勉強(実際には以前使っていたので復習)がてら、Rustで作ってみることにした、という次第です。
使ったcrate
Cargo.tomlを見たらわかりますが、今回はきちんと?crateを利用しました。
- clap
- CLIのフレームワーク。サブコマンドの定義とか色々可能
- dirs
- HOMEとか特殊なディレクトリとかにアクセスするため
- tempfile
- 一時ファイルを適切に作成するため
- ソースは見てないけど、挙動的にdropすると削除されるようになってる
- quick-xml
- 高速な低レベルXMLライブラリ。Info.plistの編集で使ってます
常日頃OCamlをよく利用している側としては、一つの処理に対して色々なcrateがあってすげーなぁ、と思うと同時に、どれを選んだらいいのかわからない問題も起きがちだなぁ、というのはやっぱりありますね。
苦労した点
私はmacOSを個人では保有していないので、macOSでのインストール作業をどう自動化するか?を結構悩みました。
- Script EditorをApplescriptで起動して保存させる・・・?
- ApplescriptをApplicationとして保存しなければならないのですが、そのためにはScript Editorしか使えなさそうに見えた
- そもそもApplescriptで↑ができる・・・?
とか考えましたが、最終的には osacompile
というコマンドの存在を知り、これでええやんってことになりました。このあたり、独自形式を突っ走るmacOSがめんどくさいですね・・・。
所有権とかは苦労していないの?
Rustでよく言われる所有権とかborrow checkerですが、そこまで苦労はしませんでした。というか、普通にプログラムを作っていったら、一つの中で書きこみと読みこみを同時にやる、とか基本的にそこまでしないはずなので。
ライフタイムとかを考え始める = structにオブジェクトを含めるようになると、めんどくさくなるのが目に見えてますが、今回はそこまで必要なかったというのもあります
どちらかというと、 File::open
と File::create
の違い(Cとか他の言語だと、大抵はopenに引数を付けてwriteとかappendとかにする)とか、traitを渡すためにはどうすればいいか、とかの方がよほど苦労しました・・・。
エラーメッセージが大分親切になっているので、そこまで困らなくなったように思います。
あらためてRustでよいなと思った点
Testが統合されている
Rustはtest用のモジュールを、それぞれのモジュールに含めることができるので、かなり細かいテストまで作成できる、という点はやはりよい点ではあります。
ただ、これには負の点もあって、内部実装を細かくテストしすぎると、リファクタリングとかがめんどくさくなります(private methodをテストするのと同様のことができてしまうので)。
ポインタの心配がない
Null dereferenceとかの心配が無いのはよいです。まぁ、その代わりにmutとかborrow checkerとかを確認しなければならない、ということでもあるんですが。
CとかC++とかで生ポインタを触る場合は、super powerを手にしているのと同じようなものなので、注意しなければならない、というのを思い返させてくれますね。
crateが豊富
上でも書きましたが、直近のえらい盛り上がりに比例して、crate数がものすごいことになっています。当然ながらそうなると玉石混交にもなるんですが、やりたいことに対してcrateが見つかるというのは気楽です。
OCamlとかだと、下手したら存在しないから自分で書く羽目になる、とか、メンテナンスが進んでいないやつしかない・・・とかにもなりえます。最近は少なくなってきましたが。
targetを変更してビルドしやすい
OCamlでは結構めんどくさいので、これはうらやましい点ですね。まぁ、前提や設計された時代背景がそもそも違うので、単純に比較するとそれはそれで無知をさらけ出すことになりますが・・・。
解決できていない点
Linuxでは動作を確認できているんですが、macOSにおいては、Gatekeeperを突破する方法がいまいちわからず、ダウンロードしたものをそのまま利用することができない状態です。
正当な手段は、Apple Developer IDを取得してきちんと署名する、ということだと思うんですが・・・。
- 高い
- Macを保有していないし、macOS向けになにをするわけでもないのに年間$99も払えません
- プロセスが複雑になる
とかなので、基本的には色んなところで配布されているCLIを参考にしてバイパスできるようにしようと思います。
ツールを作ることでの学習
久し振りに簡単なツールを作りきりましたが、やはり簡単でもいいので作りきるということは、個人的に進歩するなぁ、という実感があります。
小さいタスクに分割してやっていくようにしたというのもありますが、やはり小さいツールだと全貌が見えやすいので、小さいタスクにもしやすい、という利点もありました。仕事だと大体大きい機能とかを分解するのが難しいなぁ、とか思ってるので、その訓練にもなります?ね。
個人的には世間で喧伝されている場合は一歩引いて見るべき、と思っているので、Rustサイコー!とか言う気はさらさらありません。ですが、安全が重要な場所であれば、Rustはかなりの力を発揮してくれると思います。
shellでやればすぐできるような処理をあえてツール化する、というのは勉強になるなーと思うので、夏休みにいかがでしょう。