Saturday, January 19, 2008
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
Wednesday, December 26, 2007
RubyOSA
RubyOSA
を使うとRubyからAppleScriptを操作できる。
例えば以下のスクリプトでiTunesの中の曲をリストできるので、 Rubyから検索したり自動再生したりできる。
例えば以下のスクリプトでiTunesの中の曲をリストできるので、 Rubyから検索したり自動再生したりできる。
require 'rubygems'
require 'rbosa'
OSA::app('iTunes').sources[0].library_playlists[0].tracks.each { |s|
puts "#{s.name} / #{s.album} / #{s.artist}"
}
この方式だとAppleScript臭が皆無になるのが嬉しいかも。
Sunday, December 23, 2007
RubyでMacの辞書アプリケーションを呼ぶ
アプリケーションのサービスを利用するとMacのアプリケーションの機能を
Rubyから呼び出すことができる。
例えば辞書アプリを以下のように呼び出すことができて便利。
require 'osx/cocoa'
p = OSX::NSPasteboard.generalPasteboard
p.declareTypes_owner([OSX::NSStringPboardType],self)
p.setString_forType("単語",OSX::NSStringPboardType)
OSX::NSPerformService("Look Up in Dictionary", p)
iTunesをRubyで制御する
RubyCocoa経由でAppleScriptを呼ぶことによって
RubyからiTunesなどを制御できるようだ。
屋上屋を重ねる感じだが、とりあえず仕方がないのかも。
require 'osx/cocoa'
script = OSX::NSAppleScript.alloc.initWithSource(%{
tell application "iTunes"
play
end tell
})
errinfo = OSX::OCObject.new
result = script.executeAndReturnError(errinfo)

