28 June '2007 - 20:46 | 技術動向 RubyCocoa で IOKit を使う
まだよく分かっていないくせに、もしくは、よく分かっていないから、とりあえず RubyCocoa で IOKit を使ってみることにした。初心者なので、なにも怖いもがない。
というわけで、二日ほど格闘した成果が ioservice.rb、smc.rb、sms.rb、mach.m、myIOKit.bridgesupport の五つのファイル。
順番に説明すると、まず、ioservice.rb は、IOService クラスを定義。一部の関数を簡単に使えるようにするクラスで、たとえば、IOConnectMethodStructureIStructureO とかを使える。レベルが低すぎ。これを ruby でやるのかと。
つぎに、smc.rb と sms.rb は、それぞれ IOService クラスの継承クラスである SystemManagementControl と SuddenMotionSensor クラスを定義。これをみれば ioservice.rb の使い方がよく分かるという仕組み。
いちおう、両方とも、単体で実行できるようにしてあって、
$ ruby smc.rb
CPU-1: 56.50 C
CPU-2: 52.00 C
Motion: X(0.070) Y(0.000) X(0.863)
Fans: 2
0: 2796.00 RPM
1: 2795.00 RPM
$ ruby sms.rb
X: 20 Y: 3 Z: 221
みたいに動く。ruby でこれができるというのは、なかなか嬉しい。って、ぼくだけか。
ちなみに、sms.rb は、sms.rb all とパラメータをあたえて起動すると SMC で使えるキーをぜんぶ列挙する。なにがなんだか分からないし、どこにドキュメントされてるのかも分からないけれど。
mach.m は、mach.bundle のソース。mach_task_self() はフレームワークのなかにないので、仕方なく bundle でお茶を濁すことにした。これ、IOService では必須の関数なので、IOKit が BridgeSupport でサポートされる日が来たら、RubyCocoa のどっかにぜひ入れて欲しいと思うなあ。
最後に、myIOKit.bridgesupport は名前が示す通り、野良 bridgesupport ファイル。IOKit は BridgeSupport でサポートされてないし、QUICKDRAW がどうとか文句を言われて簡単にはコンパイルできそうもなかったので、使いたい関数の定義だけ適当にでっち上げておいた。C の関数定義関数を ruby から叩けたら、このファイルを捨てられるんだけど、いまのところそれは無理。今後も無理だと思う。レベルが低すぎる。
なお、まったく、誰の何の役にも立たないことをやっているかと思いきや、これで遊んでいる時に OSX::ObjcPtr の動作に不便なところを見つけたので、さくっとパッチを書いてメーリングリストに投げたら採用されたので、少しは世の中の役に立ってるっぽい。
他にも、ObjcPtr#clear ObjcPtr#length などもあったら便利なところだけれど、どうかなあ。こんなの誰も使わないだろうしなあ。
ということで、上の成果は RubyCocoa の trunk じゃないと動かないので、あしからず。暇な人は、svn up して、試してみるべし。