こちらでは、Ruby + GTK+ツールキットを利用したプログラミングのためのメモを掲載しています。

Tips、サンプルスクリプト、ライブラリ

wassru - 投稿専用Wassr/Twitterクライアント

wassru(わさる) - ver 2009.05.21
Ruby + Ruby-GNOME2 + Glade2で作った投稿専用Wassrクライアントです。Twitterにも投稿できます。

動作確認環境 & 開発環境
Windows XP Home SP3
・ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] (One-Click Ruby Installer for Windows) - http://rubyinstaller.rubyforge.org/
・ruby-gnome2-0.16.0-1-i386-mswin32 (バイナリパッケージ版) - http://sourceforge.net/project/showfiles.php?group_id=53614&package_id=48093
Ubuntu 8.10
・ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
・ruby-gnome2 0.17.0~rc1-6ubuntu1
・glade 2.12.2-0ubuntu3
・libglade2-0 1:2.6.3-0ubuntu1
※ 参考サイト: Ruby-GNOME2 Project Website -- Ruby-GNOME2公式サイト

インストール
Windows
アーカイブを解凍し、wassru.rbを含むファイル一式が入ったフォルダを任意の場所に移動します。
Linux
1. アーカイブを解凍し、wassru.rbを含むファイル一式が入ったディレクトリをプログラムの検索パスに含まれている場所に移動します。(例:~/bin)
2. 必要であれば、ファイル一式のパミッションを適宜設定します。
3. 添付のシェルスクリプト(wassru.sh)をディレクトリの外側(プログラムの検索パスに含まれている場所)に移動します。
注意
アーカイブに含まれているすべてのrbファイルとgladeファイルは同じフォルダに置いておく必要があります。

アンインストール
インストールしたすべてのファイルとディレクトリを削除するだけでOKです。

起動方法
wassru.rbがあるフォルダに作業フォルダ(カレントディレクトリ)を移動した状態で、コマンドラインのロングオプションへの引数としてWassrまたは(および)TwitterのログインIDとパスワードを指定してwassru.rbを実行します。
・Linuxでは、wassru.shに上記の処理のひな型が既に書かれているので、それをカスタマイズしてwassru.shを実行するのが簡単です。(ちなみにUbuntuでは「アプリケーションの実行」ダイアログからwassru.shを実行することで、端末のウィンドウを表示せずに(=パスワードなどを画面に表示せずに)wassruを起動することができます)
・Windowsでも同様に、wassru.batをカスタマイズしてそこから起動するのが簡単です。
・いずれにしても、作業フォルダを適切にセットした上で下記の書式のコマンドラインが実行できれば、どのような形でもかまいません。

コマンドライン書式

rubyw wassru.rb [--wassrid=WASSRLOGINID] [--wassrpass=WASSRPASSWORD] [--twitterid=TWITTERLOGINID] [--twitterpass=TWITTERPASSWORD] [-i|--iconify]
・少なくともWassrかTwitterどちらかのログイン情報を必ず指定してください。
・起動直後と投稿後に自動でウィンドウを最小化したい場合は、引数なしの-iまたは--iconifyオプションを指定して下さい。

使い方

1. テキスト入力欄に投稿内容を入力します。
2. コンボボックスでWassrの投稿先チャンネル名を選びます。public timelineに投稿する場合は"(public)"。
3. 画像を添付する場合は、[Ctrl+I]キー or [Image]ボタン or [Command]->[Attach Image]メニューで表示されるダイアログで画像ファイルを選択します。
4. [Ctrl+Enter]キー or [Post]ボタン or [Command]->[Post]メニューで投稿します。

・画像選択ダイアログでは拡張子が".gif",".png",".jpg",".jpe",".jpeg"のもののみ表示されます。
・102400バイトまでのサイズの画像のみ添付できます。
・Twitterへの画像投稿はできません。(テキストのみ送信されます)
・"(public)"以外のチャンネルを選択している場合、Twitterへの投稿内容の先頭にチャンネル名が付加されます。
・[Web]メニュー内の項目を選択すると、ブラウザでそれぞれのページが開かれます。(Windowsのみ)
・[Option]メニュー内の項目のチェックをはずすと、一時的に投稿先を制限できます。
・Wassrのレス投稿はできません。

スクリプト、その他ファイルの使用条件
基本的にこのプログラムはRubyライセンスで公開しますが、一部のファイルで扱いを変えていただく必要があります。

simplejson.rb
このスクリプトの内容は、Chihiro Itoさん作のJSONデータとRubyオブジェクトを相互変換するためのライブラリです。RubyForge?にsnippetとして登録されていて、特にライセンスなどは設定されていないのですが、下記のページに作者ご本人による説明がありますので、一度読んでみることをおすすめします。
simplejson.rbではオリジナルの内容の冒頭にバージョン番号を追加しています。
http://webos-goodies.jp/archives/51019710.html
http://webos-goodies.jp/archives/51071565.html

readme.txt
改変したアーカイブの配布時にこのファイルの内容を転用する場合は、改変した旨を明記した上で、改変者の名前(またはハンドル)をそれとわかるように追加していただくようにお願いします。

ライセンス文書(gpl-2.0.txt、LICENSE.txt、LICENSE_en.txt)
このプログラムの内容に合わせて編集している部分がありますので注意して下さい。まったく別のプログラム向けに転用することはおすすめしません。

作者について
chrono
http://wassr.jp/user/kitachro
http://twitter.com/kitachro

ダウンロード
wassru.zip

Wassr APIの画像投稿機能について

・送信データフォーマット

APIパラメータの送信方法としては、送信データがテキストのみを含む場合は、HTTPのGETメソッド利用時におけるリクエストURLのパラメータ部分をHTTPボディにセットするだけでいいのだが、画像付きステータスを送信する場合、HTTPヘッダのContent-Typeにmultipart/form-data...を指定し、画像データを含む各パラメータはMIMEのマルチパートデータのフォーマットでHTTPボディにセットする必要がある。

multipart/form-dataについてはhttp://www.kanzaki.com/docs/html/htminfo32.html#enctype(神崎正英さん)に簡単な説明がある。

マルチパートデータの画像データパートのヘッダにはContent-LengthやContent-Transfer-Encoding: binaryを加えた方がいいかもしれない。

Windows XPにRubyとRuby-GNOME2をインストールする

つぶやき

2008/12/24 - 21:08:40

WindowsでGTK+やQtのアプリ(Ruby製)を起動すると、ちょっとした物でもメモリ使用量が20MB以上になってしまうのが気になる。(2009/02/15追記:使用しているウィンドウを一度最小化して元に戻してやると5〜10MB程度に減る。どういう仕組みになってるんだろう)

起動速度も.NETと比較する意味がありそうな程度には遅い。ただOSと一緒に起動して常駐させておくタイプのプログラムなら気にならないだろうけど。GTK+はWindows版とLinux版の互換性が高いし、Linuxでは起動速度も普通。

2009/01/24 - 13:37:41

Windwos XP上でプログラミングしている時、ステータスバーに文字列をpushしても、それ以降のコードがある程度実行された後でしかその文字列が表示されないことがある、という問題に遭遇した。

なぜそういうことが起こるのか? いろいろ試してみた上での推測だが、シグナルハンドラの中でpushした場合、そのハンドラを抜けてからでないと、ステータスバーの表示が更新されないようだ。

# シグナルハンドラの例。実行はきちんとできるスクリプトの一部だと思って下さい
 def on_button_activate(widget)
   @statusbar.push(context, '先に表示したい文字列')
   sleep 5
   @window.title = '後で表示したい文字列'
   sleep 5
   # 画面の見た目上、ウィンドウタイトルの更新が先に実行されてしまっているように見える
 end

ではpushした文字列の表示を先に行うことを保証できる方法はないのか? バッドノウハウっぽい気もするが、とりあえず下のようなコードを書くことによって可能なようだ。

def on_button_activate(widget)
   Thread.new(){
     sleep 0.1
     @statusbar.push(context, '先に表示したい文字列')
     sleep 5
     @window.title = '後で表示したい文字列'
     sleep 5
     # 順番どおりに実行されているように見える
   }
 end

要するに、別スレッドを作り、そこにpushの実行を含む処理を逃がし、スレッド内の処理の実行をある程度の時間遅らせることによって、先にシグナルハンドラを抜けさせてしまう。(自分の場合、newに渡すブロックの中身をさらにメソッドとしてくくり出した形でうまく行った)

2009/05/03 - 09:55:57

signal_connectメソッドで、ブロックのかわりにシンボルor文字列(=メソッド名)でシグナルハンドラを設定する方法。

# ブロックで設定 #
@widget.signal_connect('changed') { |widget|
  # 'changed'シグナルが発生した時の処理
}
----------
# シンボルor文字列(=メソッド名)で設定 #
@widget.signal_connect('changed', &method(:on_widget_changed))

#(同じクラス内の別の場所)
def on_widget_changed(widget)
  # 'changed'シグナルが発生した時の処理
end
methodメソッドはObjectクラスが持っています。

リンク

Ruby-GNOME2 Project Website -- Ruby-GNOME2公式サイト
Ruby-GNOME2について書きたいことがある方は、Ruby-GNOME2 Project Websiteの編集に参加することを検討してみて下さい。制限なく編集したいのでログインアカウントがほしいという方は、ruby-gnome2-devel-ja 案内ページからメーリングリストに入会してその旨の投稿をすれば、管理者の方から返答がもらえると思います。

日本GNOMEユーザー会 -- GNOME/GTK+開発者向けサイト

The GNOME Development Site -- GNOME/GTK+開発者向けサイト(英語)

プログラミング工房