背景
この前、21世紀のパソコンサンデーを聞いた感想をツイートしたらご本人にフォぼられるというプレッシャーから書いてます。
RubyCocoa で IOKit を使う - ぼんやりと考えたこと
なんでLinuxと違って、WinやOSXはCPUの温度すらコマンドラインで取れないの?
そんな素朴な疑問から初代MacBook AirのKernel task問題に苦しめられる以前の、ページを見つけるも、デスマーチに巻き込まれて触らずじまいで、気がついたらイクメンやってる状況でした。
Mavericksで動かすには
APIの変更が必要
IOConnectMethodStructureIStructureOからIOConnectCallStructMethodに
Firefoxの以下のページが分かりやすかった
mozilla-central: changeset 33086:aae349de03be
ioservice.rb
def structure_io(cmd, isize, osize, i, o)
#return OSX::IOConnectMethodStructureIStructureO(@conn.int, cmd, isize, osize, i, o)
return OSX::IOConnectCallStructMethod(@conn.int, cmd, i, isize, o, osize)
end
myIOKit.bridgesupport
<function name='IOConnectMethodStructureIStructureO'>
<arg type='I'/>
<arg type='I'/>
<arg type='I'/>
<arg type='^I' type_modifier='N'/>
<arg type='^[' type_modifier='n'/>
<arg type='^[' type_modifier='o'/>
<retval type='I'/>
</function>
を、以下のように変更
<function name='IOConnectCallStructMethod'>
<arg type='I'/>
<arg type='I'/>
<arg type='^[' type_modifier='n'/>
<arg type='I'/>
<arg type='^[' type_modifier='o'/>
<arg type='^I' type_modifier='N'/>
<retval type='I'/>
</function>
MavericksでRubyCocoaを動かす
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby smc.rb
動かしてわかったこと
当時のMacBook Proに依存したコードだった
HDDを保護するGセンサーはSSDな時代のMacBook Proには
無いですし、うまく取得できない項目がnilとして扱われて怒られたりで、
smc.rbを適当にコメントアウトして、動いたり動かなかったりでした。
まとめ
OSXのブリッジサポートの仕組みに触れることが出来た。
C言語版をこの作業中に見つけることが出来た。
こちらは、自分の環境では安定して動いた。
NodObjCで同様の実装をする際の参考になりそう。