RubyCocoa で Ruby/twitter ライブラリに GUI を付けてみた
とりあえず何かに GUI を被せることから始めるのが簡単そうだったのでやってみた。
RubyCocoa 入門を2度ほどやってみて、なんとなく理解した。
sender が何なのか分かりづらい場合は
p sender
でクラスを見てやると良いかも。
Interface Builder での delegate とか dataSource はまだよく分かっていないorz
についてはこちらを見ると良い => http://journal.mycom.co.jp/column/objc/066/index.html
post でメッセージ投稿、update でtwitt を取りに行く(だけ)。
Interface Builder でボタンを作って、それに ruby の method を紐付けて起動させるイメージ。
# # AppController.rb # hajimete1 # # Created by mako on 07/12/11. # Copyright (c) 2007 __MyCompanyName__. All rights reserved. # # 参考にしたサイト # http://limechat.net/rubycocoa/tutorial/ # http://mono.kmc.gr.jp/~yhara/d/?date=20071215#p02 # http://exdesign.jp/wordpress/?p=89 # http://www.namaraii.com/rubytips/?%C6%FC%C9%D5%A4%C8%BB%FE%B9%EF # 参考になるサイト # http://mono.kmc.gr.jp/~yhara/w/?RubyTwitterJa # http://cureblack.com/20071120.html # To do #1. 保持してるデータから時刻を判定して新しいものだけ取ってくる #2. @items に直接ではなくて、sqlite にデータと時刻をしまっておいて、activerecord で取り出す require 'osx/cocoa' require 'rubygems' require 'twitter' require 'kconv' require 'parsedate' $KCODE = 'u' class AppController < OSX::NSObject ib_outlet :window, :message, :table include OSX def initialize @items = [] # @last_updated = Time.now とかでいつか作る @twit = Twitter::Base.new("Twitter に登録したメールアドレス", "パスワード") end def awakeFromNib @window.alphaValue = 1.0 end # Update your twitt ib_action :post def post(sender) @twit.update(@message.stringValue.to_s) end def decode_utf(str) str.gsub(/&#([\d]{4,5});/){ [$1.to_i].pack "U" } end def string_to_time_obj(string) # string => "Fri Jan 04 12:09:20 +0000 2008" ary = ParseDate::parsedate(string) t = Time::local(*ary[0..-3]) end ib_action :update def update(sender) ret = [] @twit.timeline(:friends).sort{|a,b| string_to_time_obj(b.created_at) <=> string_to_time_obj(a.created_at)}.each do |s| ret << [s.user.screen_name, decode_utf(s.text), s.created_at] end @items = ret @table.reloadData end # NSTableView dataSource def numberOfRowsInTableView(sender) @items.length if @items end def tableView_objectValueForTableColumn_row(sender, col, row) case col when @table.tableColumns.to_a[0] @items[row][0] when @table.tableColumns.to_a[1] @items[row][1] when @table.tableColumns.to_a[2] @items[row][2] end end end
あ、とりあえずの練習として作ったのものなので To do とかは実装する予定ないです。。