LoginSignup
4
4

More than 5 years have passed since last update.

RubyCocoaでCPU温度を取得する

Last updated at Posted at 2014-04-05

背景

この前、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で同様の実装をする際の参考になりそう。

関連記事

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4