hazisarashi's blog

メインブログでは技術的な話はあまりかかないので、こっちは技術的な話をかいてます。 main -> http://hazisarashi.com/

Titanium Desktop で スレッド?

前回に引き続き Titanium Desktop。

ちょい前回まで作ったものと、今日進めた部分を記録しようと github にリポジトリを作るようにしました。

https://github.com/hazisarashi/NiconamaWidget/

これでツッコミ入れてくれる優しい人が、いたらきっと入れてくれる!!

 

TCPSocket

昨日の記事を見て、そもそもSocketが対応してないってのは考えにくいんじゃないか?というツッコミを頂き、色々試して見るもののダメ…。検索してもそれっぽい情報がヒットしない…。英語の記事で見逃してるものがあるかもしれないので、今度再度調べてみます。

 

Ruby

今日は主にRubyでのチャレンジを。

前回バックグラウンドうんぬんの話をしたら、スレッドがあるじゃないか。ということに気づき挑戦してみました。

Rubyでスレッド → JSのメソッドを実行

これはダメでした。スレッド内から、jsのメソッドを実行しても反応がありません…

jsでsetTimeout → Rubyを実行 → jsのメソッドを実行

ちょっと分かりづらいですが、

setTimeout ( "rubyFunction()", 100 ) として、Rubyのメソッドを実行できます。setTimeoutは単に実行するだけの場合必須じゃないですが、念のため。

その後、Ruby側で Socket接続を行い、Socketで返ってきた値を jsFunction( data ) という形でRubyからjsに渡してあげます。

これはOK!! ただし、ずっと同期でRubyを実行してる状態なので、Rubyのメソッドが死ぬまで画面が固まります orz

jsでsetTimeout → Rubyを実行 → jsのメソッドをTitanium.API.runOnMainThread経由で実行

よくよく調べてみると、Titanium.API.runOnMainThreadTitanium.API.runOnMainThreadAsyncなるメソッドが。

これは上記のブロックを防ぐためのメソッドらしい。これを使えば間違いなくいけるだろう!!と思ってやってみたのですが、このメソッドを1回実行するだけならOKだが、2回目を実行しようとすると…

Error: "First argument to runOnMainThread was not a function"

こんなエラーが…なんなんだろう…。前回の処理が終わるまで待たないといけないのかな?

まとめ

Titanium.API.runOnMainThread をうまく使えば、RubyでのSocket通信のデータをjsに渡せそう。

なんでエラーが出るのかを突き止めて対応を検討!

頑張れ俺!

Titanium Desktopでニコ生アラート開発は無理?!

OS X Widgetの開発ツール Dashcodeがついに、新規作成しただけのプロジェクトすら一度保存して、開き直すとクラッシュする問題が発生!さらに最新版のXcode入れたらDashcodeが消えた!!

ということで、長い間開発していた Widgetである ニコ生Widget の開発を中止した。

じゃあ、これでおしまい。と、しようかとも思ったのだが、このWidgetがそれなりにユーザーが居て(最新版は5000ダウンロードを超えてる)、それに変わるものを開発したいなぁと思って、Titanium Desktopを触って作成に取り組んだので、その内容をメモ的に書いていくことに。

Titanium Desktop

appcelerator Product page - Titanium Desktop

Titanium Desktop Guides

Titanium Desktop API Docs

TCPSocket

ニコ生のアラートソフトは基本的に socket 通信を使用して、ニコ生の放送開始情報をリアルタイムに受信する必要がある。OSX WidgetはSocket通信用のAPIなんてなかったので、ヘムスさん (@HemusAran)にお願いして、Obj-C書いていただいたりしてたんだけど、Titaniumには Titanium.Network.createTCPSocket なるものがあり、これを使うことに。

TCPSocketを作成すると、TCPSocket Objectが帰ってきてそいつを元に、データの受信やら送信を行える。

参考までにこんなソース

function(){
    nnw.viewConsole("Socket Connect start...");

    // Socket connect
    var socket = Titanium.Network.createTCPSocket( set.nicovideo.alertServer.addr, set.nicovideo.alertServer.port );
    socket.onError(function(error){
        console.debug("socket onerror : " + error);
        socket.close();
    });
    socket.onRead(function(buf){
        console.debug("length : " + buf.length + " buffer : " + buf);
        //nnw.viewConsole( 'socket buffer : ' + buf );
    });

    try{
        // connect
        socket.connect();
        nnw.viewConsole("socket connect.");

        // push data
        var message = "<thread thread=\""+ set.nicovideo.alertServer.thread + "\" version=\"20061206\" res_from=\"-1\"/>\0";
nnw.viewConsole("socket push data : " + message); socket.write( message ); }catch(error){ console.debug( 'socket conected error : ' + error ); nnw.viewConsole( 'socket conected error : ' + error ); setTimeout ( function(){ nnw.alertserverConnect() }, 1000 ); } }

こいつを実行するとどうなるかというと…

[17:17:58:380] [Titanium.API] [Debug] socket conected error : Socket is not writable
[17:17:59:381] [Titanium.API] [Debug] socket conected error : Socket is not writable
[17:18:00:383] [Titanium.API] [Debug] socket conected error : Socket is not writable
[17:18:01:384] [Titanium.API] [Debug] socket conected error : Socket is not writable    

使えない…。

Ruby

だが、諦めの悪い俺は気づいてしまった…

Titanium Desktopといえば、RubyPythonとWebテンプレートエンジン(PHP)が使える。これを使えばSocket通信なんてもう朝飯前じゃないか!!

ということで、Ruby 1.8 の実行環境を改めて用意し(rbenv install ...)、コピペコードで適当に作成。

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

できた!よし!実行!!

 世の中そんなに甘くなかった。

まとめ

ということで色々やってみたが、ニコ生アラートをTitanium Desktopで作成するのはちょっと難しい。

うまい方法があったら是非教えて下さい!!

ちなみに今俺が考えられる方法はこれぐらい

  • テキストファイルかなんかをRubyで作りまくってそれを読みに行く(でも、バックグラウンドでRuby動かすにはどうしたらいいんだ?
  • SQLiteファイルにRubyで書き込みまくって、TitaniumAPIでそれを読みに行く(でも、バックグラウンドでRubyうgry
  • Titanium.Network.createHTTPServer使ってサーバー立てて、それに対してRubyでデータを流しこむ(でmry

とにかく、バックグラウンドでRubyを実行出来ればなんとかできそう

OS X Lion TerminalからSnow Leopard へSSH接続すると、なんか変な件について

OS X Lion にしてからというもの、Snow Leopardのマシンへ接続するとき、鍵を使ったssh接続でもパスワードが求められたり、Deleteキーがうまく動かなかったり、なんか変だなぁ。と思っていたら今日 top コマンドがエラーで実行出来なくなっていることが発覚。

$ top
Error opening terminal: xterm-256color.

xtermの宣言がどうやらLionから変わっていたらしい。

Terminal > 環境設定 > 設定 > 詳細 を開き、ターミナルの宣言方法を xterm-256color から、 xterm-color にしたら、問題なく今まで通り使えるように!

ちなみに、Terminalの設定はいくつもプリセットを作って置けるので、 Pro 256 という xterm-256color の物をデフォルトにして、 Pro というサブの設定を作った。

Terminalを開いてから、Cmd + i で設定は切り替えられるが、ターミナルの宣言は変わらない見たい。なので、別の設定のTerminalを開く時は シェル > 新規ウィンドウ から設定を指定してウィンドウを作ればOK。

メモ : Mac OS X Server 10.6 Wikiのテーマファイルをいぢる

Mac OS X ServerのWikiのテーマファイルの段落の幅とか、色々細かいところが気にくわなくて、触りたくなったので、改造することに。

色々見てたら結構探すのに手間がかかったので、メモ。 

Wikiテーマのコピー方法

テーマの設定ファイル等が入っているディレクトリ(直接のテーマデータが入ってる訳じゃなさそう)

% cd /Library/Application\ Support/Apple/WikiServer/Themes/

適当に元となるテーマファイルをコピーする

% sudo cp -r horizon.blue.banner.wikitheme my.horizon.blue.banner.wikitheme

新しく作ったテーマの設定の実際のテーマファイル(CSS等のファイル)へのリンクを変える

% cd my.horizon.blue.banner.wikitheme
root % cat ../horizon.blue.banner.wikitheme/theme.plist | sed 's/com.apple.horizon.blue.banner/com.apple.my.horizon.blue.banner/' > theme.plist
root % cat ../horizon.blue.banner.wikitheme/screen.css | sed 's/horizon.blue.banner/my.horizon.blue.banner/' > screen.css
root % cat ../horizon.blue.banner.wikitheme/compressed/theme.plist | sed 's/com.apple.horizon.blue.banner/com.apple.my.horizon.blue.banner/' > compressed/theme.plist
root % cat ../horizon.blue.banner.wikitheme/compressed/screen.css | sed 's/com.apple.horizon.blue.banner/com.apple.my.horizon.blue.banner/' > compressed/screen.css

あ、テーマファイル名も変えてね。これは普通にエディタでいじった。plistの中に書いてある。

終わったら適当にアクセス権限も直しておく

% cd ..
% sudo chown -R _teamsserver:_teamsserver my.horizon.blue.banner.wikitheme
% sudo chmod g+w my.horizon.blue.banner.wikitheme 

で、実際のCSSファイル(screen.css内に書いてあるのはリンクのみ)の場所はこっち

% cd /usr/share/collaboration/themes
% sudo cp -r horizon.blue.banner my.horizon.blue.banner

あとは、好きにCSSファイルをいじる。
テーマファイルはもうシステム側に反映されているはず。もしダメだったらWebサーバーを再起動すれば、テーマファイルが読み込まれる。