Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Apple
NSWindow の level / setLevel: に使用する Window Level の値です。
Objective-C からは定数を参照すべきですが、そうでない場合は直値が必要なので、調べてみました (Mac OS X 10.8.4)。
KeyValue
NSNormalWindowLevel0
NSFloatingWindowLevel3
NSSubmenuWindowLevel3
NSTornOffMenuWindowLevel3
NSMainMenuWindowLevel24
NSStatusWindowLevel25
NSModalPanelWindowLevel8
NSPopUpMenuWindowLevel101
NSScreenSaverWindowLevel1000
NSDockWindowLevel20
Category: Apple
今さら知ったのですが、OS X に iTunes v11.0 をインストールすると iTunes Library Framework というフレームワークが追加されるそうです (リファレンス)。
今まで外部アプリが iTunes のライブラリ情報にアクセスするには iTunes Music Library.xml という仕様非公開の XML ファイルをパーズしなければならなかったところ、ようやく API 経由で情報が取得できるようになりました。ただしアクセスは read-only なので書き込み (iTunes ライブラリに曲を追加するとか) はできません。また、アクセスするアプリはコード署名が必要とのことです。
Category: Xojo
Xojo の Cocoa アプリ開発。ちょっと込み入ったことをすると Declare を連発する訳ですが、その際にコントロールの View の階層構造が欲しくなることがあります。その方法は以下の通り。
Soft Declare Function subtreeDescription Lib "Cocoa" Selector "_subtreeDescription" (id As Integer) As CFStringRef
MsgBox(subtreeDescription(Me.Handle))
非公開 API なので、Mac App Store アプリにこのコードを残さないようにしましょう :)

あと、Xojo API のメソッドなどもちょっと調べてみたのでメモとして書いておきます。
Soft Declare Function NSClassFromString lib "Cocoa" (aClassName as CFStringRef) as Ptr
Soft Declare Function class_copyMethodList Lib "Cocoa" (cls As Ptr, ByRef outCount As UInt64) As Ptr
Soft Declare Function method_getName Lib "Cocoa" (method As Ptr) As Ptr
Soft Declare Function sel_getName Lib "Cocoa" (sel As Ptr) As CString

Dim count As UInt64 = 0
Dim methods As Ptr

methods = class_copyMethodList(NSClassFromString("XOJListboxView"), count)

Dim mb As MemoryBlock = methods
For i As Integer = 0 To count - 1
MsgBox(sel_getName(method_getName(mb.Ptr(i * 4)))) // 32-bit
Next
まぁ、Runtime で頑張らずとも CocoaFramework.dylib を読めば OK という話でもあります。
$ otool -oV "/Applications/Xojo 2013 Release 2/Xojo.app/Contents/Resources/Frameworks/CocoaFramework.dylib"
Category: Jubatus
Jubash は機械学習エンジンである Jubatus のサーバに接続して、各種の API リクエストをコマンドラインから送信することができるシェル環境です。
プログラムを書かずに Jubatus API の動作を試してみたい、シェルスクリプト/パイプで整形したログデータなどを直接流し込みたい、などのケースで役に立ちます。

昨年末に作って GitHub 上で公開していたのですが、今日突然 Softpedia (の Mac アプリのカテゴリ) に掲載されたらしいので :) このタイミングでご紹介してみます。

Jubash のインストール

Jubash を使用するためには Python 2.7 以降に加え Jubatus Python Client が必要です。pip install jubatus ないし easy_install jubatus などでインストールを行ってください。
Jubash 自体のインストール作業は特に不要です。以下のように
wget "https://raw.github.com/kmaehashi/jubash/master/jubash"
などで取得し、お好きな場所に置いてください。

Jubash の使い方

./jubash
のように起動すると、Jubatus サーバ (デフォルトでは localhost:9199) に接続され、API を叩くための専用の対話型シェル環境が立ち上がります (Jubatus サーバは事前に起動しておく必要があります)。
接続先の Jubatus サーバの種類は自動認識されます。例えば分類器 (jubaclassifier) であれば、
[Jubatus:classifier<>@127.0.0.1:9199] # train male height 170 weight 60
[Jubatus:classifier<>@127.0.0.1:9199] # train male height 185 weight 65
[Jubatus:classifier<>@127.0.0.1:9199] # train female height 150 weight 50
[Jubatus:classifier<>@127.0.0.1:9199] # train female height 155 weight 45
[Jubatus:classifier<>@127.0.0.1:9199] # classify height 140 weight 40
female: 1.0111604929
male: 0.0962741076946
のように利用します (# から行末までがユーザ入力です。ここでは、身長と体重から性別を推定させています)。
使用できるコマンドセットは help コマンドで確認できます。また、Tab 補完も使えます (readline 対応環境のみ)。

シェルスクリプトと組み合わせて Jubatus に学習させる例としては、例えば「パケット数から異常を検知する」というタスクを想定して、ifconfig から秒間パケット数を切り出して Jubatus 異常検知エンジン (jubaanomaly) に投入するサンプル がこちらにあります。なお、Jubash はあくまでカジュアルにお試しするためのツールですので、実践投入する際は各言語版の Jubatus クライアントを利用してプログラムを作成されることをお勧めします。
Category: Jubatus
タイトルの通り、Jubatus を Mac OS X の Universal Binary (i386 / x86_64) でビルドする必要に迫られたので。

Jubatus をソースからビルドする場合は jubatus-installer というシェルスクリプトを使用すると便利です。
通常用途ではそのまま問題なく動きますが、Universal Binary 化するには若干の修正が必要だったので、手を入れたコードを置いておきます

手順は以下の通りです。Jubatus 0.4.5 / Mac OS X 10.8.3 で動作を確認しました。なお、今後このブランチのメンテを行うかどうかは未定です。
# Universal Binary ビルド対応版 jubatus-installer を取得
git clone https://github.com/kmaehashi/jubatus-installer.git
cd jubatus-installer
git checkout osx-universal-biniary

# ビルドする (PREFIX はお好みで指定)
./install.sh -p ${HOME}/jubatus-ub

UB でビルドできているかどうかは file コマンドで確認できます。
$ file ${HOME}/jubatus-ub/bin/jubaclassifier
.../bin/jubaclassifier: Mach-O universal binary with 2 architectures
.../bin/jubaclassifier (for architecture i386): Mach-O executable i386
.../bin/jubaclassifier (for architecture x86_64): Mach-O 64-bit executable x86_64

$ file ${HOME}/jubatus-ub/lib/libjubacommon.dylib
.../lib/libjubacommon.dylib: Mach-O universal binary with 2 architectures
.../lib/libjubacommon.dylib (for architecture i386): Mach-O dynamically linked shared library i386
.../lib/libjubacommon.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64

起動は以下の要領です。
source ${HOME}/jubatus-ub/share/jubatus/jubatus.profile
jubaclassifier -f ${HOME}/jubatus-ub/share/jubatus/example/config/classifier/arow.json