Make Desktop Apps

with

TideSDK + Ruby

I am

松本 拓也

@upinetree

http://slid.es/upinetree/tidesdk-and-ruby






Niigata.rb








よい響きですね






Niigata.rb

today's topic




例えば


Rubyで便利なスクリプトを作ったとして


自分だけで使う分には


黒い画面があれば十分ですよね




でも、それを誰かに配ろうとして

ちょっとしたGUI付きのアプリを

作りたくなったことありませんか

TideSDK

  • デスクトップアプリを作るためのツールキット

  • クロスプラットフォーム(Win, Mac, Linux)

  • HTML5, CSS3, Javascriptで書く(WebKit)

  • Ruby, Python, PHPが使用可


http://www.tidesdk.org





というわけで


試しにこんなの作りました

How it works


  1. window.onload時、Rubyに処理をお願いする
  2. Ruby上でmechanizeにログインしてもらう
  3. ログイン後、発行されたURLをJavascriptが受け取る
  4. iframeに読み込む


こんなかんじで

簡単にHTMLやJavascriptと

Rubyを連携させられます


http://github.com/upinetree/kancolle-launcher

index.html


<script type="text/ruby" src="ruby/agent.rb"></script>

<iframe id="game_frame" name='game_frame'></iframe>

<script type="text/javascript">
window.onload = function()
{
var game_frame = document.getElementById('game_frame');
game_frame.src = fetch_game_uri();
}
</script>

ほんとうは


全画面表示機能も実装したかった

でも、swfを受け取るには面倒な壁が…






なんか良い知恵ないですか

  • アプリ側からの取得はセキュリティ的にむり
    (同一ドメインポリシー)
  • APIトークン取得する必要がある
  • mechanizeはJavascript動かさない





苦労話

内蔵Rubyのバージョン


win, osx -> 1.8.7
linux -> 1.9.3


  • クロスプラットフォームだったら、1.8基準か…
  • 既存資産やgemが利用できなくなるケース有
  • いちばんつらい

内蔵Rubyのアーキテクチャ


32bit(i386)でビルドされているっぽい


たとえば、macのSnowLeopardは64bit

nokogiri使うときにmach-oエラー起きる
nokogiri.bundleファイルが64bitになっちゃうので


  対策

sudo env ARCHFLAGS='-arch i386' bundle install 

Gemの使い方


  • ドキュメントなかった


  1. パッケージ化するのでSDK所定フォルダにbundleする
    bundle install --path Resource/ruby/gems

  2. require先のgemsフォルダを登録
    require 'rubygems'
    Gem.use_paths(File.join(Ti.App.getHome, 'Resources/ruby/gems/ruby/1.8'))
    
    require 'mechanize' 

GemのOSによる参照先の違い

OSX: KancolleLauncher.app/Contents/Resources/ruby/gems/ruby/1.8/gems
Win: KancolleLauncher/Resources/ruby/gems/ruby/1.8/gems
※Linuxは試してません

OSごとにフォルダ構成が異なる


なので、こうすると

File.expand_path(File.dirname(__FILE__)) 

こうなる

OSX: KancolleLauncher.app/Contents/MacOS
Win: KancolleLauncher

相対パスが変わるので、require先が一意に追加できない


だからTideSDKのAPIを使う


require 'rubygems'
Gem.use_paths(File.join(Ti.App.getHome, 'Resources/ruby/gems/ruby/1.8'))

require 'mechanize' 


他にもAPIいっぱいあるけど

まだ使いこなせてない

そんなこんなで




やったことの割に予想外に時間かかりました


でも一回躓いておけばあとは大丈夫


次期バージョンが近日公開らしいですよ




http://www.tidekit.com/

今度はモバイルアプリにも対応するとか

Ruby周り強化されているといいなあ

まとめ


  • TideSDKっていうのがあるよ


  • Ruby使えるよ。1.8.7だけど


  • Ruby道には罠があるよ

  • 艦これたのしいよ



おしまい

TideSDK + Rubyでデスクトップアプリ作る

By Takuya Matsumoto

TideSDK + Rubyでデスクトップアプリ作る

  • 5,798