@znz blog

ZnZ の memo のようなもの

第 8 回 RubyMotion もくもく会 in Osaka に参加した

| Comments

第 1 回から第 7 回にも参加した RubyMotion もくもく会 in Osaka の 第 8 回 RubyMotion もくもく会 in Osaka に参加してきました。

次回の 第 9 回 RubyMotion もくもく会 in Osaka は 3/19(水) になりました。

話に出たもの

話に出てきたサイトなどのメモです。

もくもく

ブラウザを開くのに open コマンドを経由から NSWorkspaceopenURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers: 経由に変更しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
  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 のシークレットウインドウを直接開く機能はなくしました。

1
2
3
4
5
6
7
8
9
10
11
12
13
  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 でコンパイルされるタイミングでリンクできていないメソッドは呼び出せないということなのかと思いました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(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 の返り値がおかしいという話がありました。

1
2
3
4
(main)> NSDate.distantFuture
=> 1677-09-21 09:12:43 +0900
(main)> NSDate.distantPast
=> 1677-09-21 09:12:43 +0900

Comments