Tuesday, June 16, 2009

FireFoxでオープン中のURLを取得する

Cygwinだと以下のような方法でJavaScriptを呼び出すことができたのだが、
cygstart "/cygdrive/c/Program Files/Mozilla Firefox/firefox.exe" \
  "javascript:alert(location.href)"
MacだとAppleScriptを使わないと駄目らしい。 AS Holeのページによれば 以下のようなスクリプトを使うといいらしい。
tell application "Firefox"
  set aURL to «class curl» of window 1
end tell
osascriptというコマンドを使うこともできる。
osascript -e 'tell application "Firefox" to «class curl» of window 1'

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

Wednesday, December 26, 2007

RubyOSA

RubyOSA を使うとRubyからAppleScriptを操作できる。
例えば以下のスクリプトで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)