廊下の電灯を自動でOn / OffするデバイスのプログラムをF#で書き直した

前にRaspberry Piで動くデバイスのプログラムをF#で書き直した。

locaq.hatenablog.com

locaq.hatenablog.com

ソースコードは上の記事にリンクがあるのでそこから見られる。

理由

自分はどうも動的型付け言語は苦手みたいで中々モチベーションが湧かなくて静的型付け言語で書き直したくなったのが理由で、F#を選んだのは関数型言語を勉強したかったのと、Visual Studioで開発ができるから。

.NETからGPIOを扱うためのライブラリもいくつかあるので要求は今のところ満たせてる。

GitHub - locatw/WiringPi.Net: A simple C# wrapper for Gordon's WiringPi library.

raspberry-sharp (Raspberry#) · GitHub

Raspberry#はオブジェクト指向な設計になっていてC#と馴染む感じだけれど開発があまり活発でないのが気になる。raspberry-sharp-ioはPWMをまだサポートしていない(将来される予定らしい)ので自分がやりたいことができるか確認してから使うのがいい。raspberry-sharp-systemはRaspberry Piのモデルの種類やファームウェアのバージョンなんかのシステム情報が取得できるので、ライブラリを作るときに便利なんじゃないかと思う。

自分が作ったデバイスはサーボを動かすのにPWMを使っているので今回はWiringPi.Netを使った。ただ、こっちも開発がほぼ止まっていて(最近のissueに返信はあったけど)ビルドエラーが出て使えない状態だったので、フォークして修正したものを公開した。

Qiitaに記事を書いたので詳しくはそっちを参照。

qiita.com

感想

GPIOなんかのRaspberry Piに依存する部分以外はWindowsで実行できるので、Intellisenseやデバッグが快適で気に入ってる。(PythonVisual Studio用の拡張があって状況は同じはずなんだけど、いまいちうまく動かなくてあまり快適ではなかった。)

気になるのは、数あるセンサーを使うときに.NET用のライブラリが提供されるのは少なそうなところ。C言語用のライブラリがあればラッパーを書けるので.NETからでも使えるけど、ラッパーを書く分の手間はかかるので、そこはPythonとかの方が有利かなぁと思う。

あと、F#はまだ身についたわけではないから正しいか分からないけれど、デバイス用のプログラムを書くのに適しているかというと内容によるかなーという感じ。デバイスの状態を扱うならオブジェクト指向言語の方が適しているかもしれない。ただ、F#でも当然状態は扱える(クラスも書ける)し、関数型言語はロジックを書くのに適してる(と現時点では思ってる)ので、その比重が高くなれば特徴が生かせるんじゃないかと思う。

とはいえF#とC#だったらできないことの差はないので好きな方を使うのが一番快適だと思う。

それとPythonについては自分は使うのをやめることにしたけど、言語の優劣ではなく自分との相性と開発環境周りが理由なのでPython好きな人は気を悪くしないでほしい。自分でもこんなに相性や開発環境の影響があるとは思ってなかったのでびっくりしてる。

今後

F#で書き直したので今度はAzureのIoT Hubを使ってみようかと思って今勉強中&構成を考えてる。Azureなので.NET系言語との相性は良さそう。