Saturday, January 19, 2008

RubyCocoaでスクリーンセーバを作る

MacOSでは ScreenSaverView クラスを実装して.saverという名前のbundleに格納すればスクリーンセーバになる。 RubyCocoaでスクリーンセーバを書く方法を こちらに解説しておいた。

Sunday, January 13, 2008

自前のCプログラムをRubyCocoaから呼ぶ

Objective-CのメソッドをRubyCocoaから呼ぶのはとても簡単である。
πを計算する以下のようなクラスが存在するとき、
#import <Cocoa/Cocoa.h>

@interface Pi : NSObject
- (double)calc:(id)param;
@end

@implementation Pi
- (double)calc:(id)param
{
  // すごい方法でπを計算
  return 3.14159265358979;
}
@end
Xcodeを使ってこれからPi.frameworkを作成し、 /Library/Frameworksとかに置いておけば 以下のように簡単にRubyから呼び出すことができる。
require 'osx/cocoa'
include OSX

NSBundle.bundleWithPath("/Library/Frameworks/Pi.framework").load
ns_import :Pi

class Pi < NSObject
  addRubyMethod_withType('calc', 'v@:@')
end

pi = Pi.alloc.init
puts pi.calc(nil)
自前のCプログラムをすぐにRubyから使えるので便利である。

Tuesday, January 08, 2008

10桁ISBNのチェックディジットの計算

def add_checksum(isbn)
  v = 0
  (0..8).each { |i|
    v += isbn[i,1].to_i * (i+1)
  }
  v %= 11
  checksum = (v == 10 ? 'X' : v.to_s)
  isbn + checksum
end

Monday, January 07, 2008

AppleRemoteをRubyで使う

Tim Burks氏の Use your Apple Remote from Rubyというサイトに AppleRemote(最近のMacに付属してくる赤外線リモコン)をRubyで使う方法が載っている。 Martin Kahr氏が作った AppleRemote用ライブラリを framework化してビルドしてRubyから呼べばよいらしい。

現在(2008/1)のKahr氏のシステムは、 ソースコードの構成やライブラリの引数がBurks氏の記事とは異なっているが、 必要そうなものを全部まとめてframework化して以下のようにコードを少し変えると 無事動かすことができた。

require 'osx/cocoa'
include OSX

NSBundle.bundleWithPath("/Library/Frameworks/AppleRemote.framework").load
ns_import :AppleRemote

class AppleRemoteDelegate < NSObject
  addRubyMethod_withType('sendRemoteButtonEvent:pressedDown:remoteControl:', 'v@:ii@')

  def sendRemoteButtonEvent_pressedDown_remoteControl(buttonIdentifier, pressDown, remoteControl)
    puts "button #{buttonIdentifier}, pressed #{pressDown}"
  end
end


appleRemoteDelegate = AppleRemoteDelegate.alloc.init
appleRemote = AppleRemote.alloc.initWithDelegate(appleRemoteDelegate)
appleRemote.startListening self

NSApplication.sharedApplication.run

Leopard上でのOpenGL/GLUT

昔のUnixMagazine記事で OpenGLによるクロスプラットフォーム開発の話を書いたのだがMacは含まれていなかった。 OSXにはOpenGLとGLUTがFrameworkとして標準装備されているので、 以下のようにリンクするだけで簡単にビルドすることができる。
-framework GLUT -framework OpenGL