第 1 回から第 7 回にも参加した RubyMotion もくもく会 in Osaka の 第 8 回 RubyMotion もくもく会 in Osaka に参加してきました。
次回の 第 9 回 RubyMotion もくもく会 in Osaka は 3/19(水) になりました。
話に出たもの
話に出てきたサイトなどのメモです。
もくもく
ブラウザを開くのに open
コマンドを経由から NSWorkspace
の openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers:
経由に変更しました。
def openBrowser(app, *args)
r, w = IO.pipe
pid = Process.spawn('open', '-a', app, @text.stringValue, *args, [:out, :err] => w)
w.close
pid, status = Process.waitpid2(pid)
output = r.read
r.close
unless status.success?
alert = NSAlert.new
alert.messageText = "Failed to open #{app}\n\n#{output}"
alert.runModal
end
end
open -b
を使っていれば引数は変わらなかったのですが、 open -a
を使っていたので、引数がアプリケーション名からバンドル ID に変わりました。
open -a 'Google Chrome' http://localhost:4000/ --args -incognito
の -incognito
のような追加引数の渡し方がわからなかったので、 Chrome のシークレットウインドウを直接開く機能はなくしました。
NSWorkspaceLaunchAsync = 0x00010000
NSWorkspaceLaunchAllowingClassicStartup = 0x00020000
NSWorkspaceLaunchDefault = NSWorkspaceLaunchAsync | NSWorkspaceLaunchAllowingClassicStartup
def openBrowser(app_bundle_id)
url = NSURL.URLWithString @text.stringValue
ret = NSWorkspace.sharedWorkspace.openURLs([url], withAppBundleIdentifier: app_bundle_id, options: NSWorkspaceLaunchDefault, additionalEventParamDescriptor: nil, launchIdentifiers: nil)
unless ret
alert = NSAlert.new
alert.messageText = "Failed to open #{app}"
alert.runModal
end
end
Workspace Services Programming Topics: Manipulating Files には openURL:
しか書いてなかったり、 additionalEventParamDescriptor
には何を渡せばいいのかわかりにくかったりして困りましたが、 http://www.lancard.com/blog/2011/05/01/open-url-with-browser-about-mac-app/ のように呼び出せばうまくいきました。
最初に rake
の REPL で試していたら、以下のエラーになるので、しばらく悩んでいましたが、 app/app_delegate.rb
の中に書けば動いたので、 rake
でコンパイルされるタイミングでリンクできていないメソッドは呼び出せないということなのかと思いました。
(main)> url = NSURL.URLWithString("http://www.apple.com")
=> #<NSURL:0x7fcbe8e45060>
(main)> NSWorkspaceLaunchAsync = 0x00010000
=> 65536
(main)> NSWorkspaceLaunchAllowingClassicStartup = 0x00020000
=> 131072
(main)> NSWorkspaceLaunchDefault = NSWorkspaceLaunchAsync | NSWorkspaceLaunchAllowingClassicStartup
=> 196608
(main)> NSWorkspace.sharedWorkspace.openURLs([url], withAppBundleIdentifier: "com.google.Chrome", options: NSWorkspaceLaunchDefault, additionalEventParamDescriptor: nil, launchIdentifiers: nil)
dyld: lazy symbol binding failed: Symbol not found: __ZN9RoxorCore14find_bs_cftypeESs
Referenced from: /Library/RubyMotion/data/osx/librubymotion-repl.dylib
Expected in: flat namespace
dyld: Symbol not found: __ZN9RoxorCore14find_bs_cftypeESs
Referenced from: /Library/RubyMotion/data/osx/librubymotion-repl.dylib
Expected in: flat namespace
================================================================================
The application terminated. A crash report file may have been generated by the
system, use `rake crashlog' to open it. Use `rake debug=1' to restart the app
in the debugger.
================================================================================
NSDate
途中 NSDate.distantFuture
の返り値がおかしいという話がありました。
(main)> NSDate.distantFuture
=> 1677-09-21 09:12:43 +0900
(main)> NSDate.distantPast
=> 1677-09-21 09:12:43 +0900