技術メモ: 2010年12月アーカイブ

MacBookAir(11インチ)を買いました。iPhoneアプリのために買ってあったMacMiniが壊れて、どうしようかと思っていたら買い手を捜している人がいたのでありがたくお買い上げ。
Let'sNoteの中でも特に小さいLet'sNoteRからの乗り換えだったので、キーピッチが広すぎて巨人のパソコンを使っているような気分ですが、スペックの割に軽快に動いてくれるし、ファンの音がしないのはとても快適なので、気に入っております。

Windowsから乗り換えた人の常で、Windowsでできたあの機能はどうやるんだ、ということでいろいろググッていたのですが、とりあえず一個便利なのを再現することに成功したのでメモ。具体的には、「日付と時刻をクリップボードにコピー」。

これはWindowsの標準機能ではなくて、もうすでに開発が停止してしまったbluewindとその関連ツールの合わせ技です。自分の場合、alt+bでBlueWindを立ち上げて、dateと入力すると、その時の日付と時間がクリップボードにコピーされるようにしていました。
これがあると、日報とか作業記録を書くのが超便利なのです。

で、これをMacでやる方法。

  • 日付と時刻をクリップボードにコピーするスクリプトを作る
  • spotlightからアプリを起動

日付と時刻をクリップボードにコピーするスクリプトを作る

とりあえず、キーボードから起動するのは後回しにして、立ち上げたら日付と時刻をクリップボードにコピーするアプリをいっこ用意します。

現在の日付時刻をクリップボードにコピーするAppleScript - サンフラットの開発日記
ありがたい事にAppleScriptを書いていただいているので、Apple Script Editorに貼りつけて
scriptEditor.jpg
「名前を付けて保存」でApplicationとして保存してあげれば、
saveAsApp.jpg
立ち上げるだけでその時の日付と時刻をクリップボードにコピーされるアプリケーションが出来上がる。あとで便利なので、Applicationフォルダに保存しておいてね。

spotlightからアプリを起動

これだけでも十分便利なんだけど、もとの使い勝手を考えると、キーボードから手を離さずに同じ機能を実現したい。マウスでアプリを立ち上げるとかまだるっこしいよね。
Mac的には、こういう時はSpotLightを使うらしい。Ctrl+Spaceで立ち上げるあの謎の機能に、「copy..」位まで入力してあげると、さっきのスクリプトが出てくる。
SystemUIServer.jpg
copyDateAndTimeが選ばれている状態でEnterキーを押してあげれば、クリップボードに日付と時刻文字列がコピーされるので、EverNoteでもEmacsでも、どこでも貼り付けることができる。
Evernote.jpg



sxchu_308383_titanium.jpg

TitaniumMobileプログラミングの話。
Windowを生成する時、urlパラメータを使うと、そのWindowは副コンテキストに分割されて動くことになるので、親コンテキストの変数を参照することは出来ません。

Window - titanium-mobile-doc-ja - UIカタログ - Window - Project Hosting on Google blockquote
これを乗り越えるための対策は、上記ドキュメントに書いてあるのですけど、微妙にいろいろ罠があって、実験して分かったことまとめ。


例えば、親コンテキスト(win1)の変数hogeがあって、副コンテキスト(win2)でボタンを押したらhogeをインクリメントしたい、というような場合。

main.jpg sub.jpg

まず、親コンテキストの変数を子コンテキストで参照するには、こういう風にする。

var hoge = 1;
win2.hoge = hoge;
すると、子コンテキスト側からは、
var win2    = Titanium.UI.currentWindow;
Ti.API.debug("hoge:"+win2.hoge);
みたいにして参照することが出来る。
ただし、変数はby value渡しになるので、副コンテキストで値を変更してもメインコンテキストのhogeには反映されません。
なので、
button1.addEventListener('click',function(e){
	win2.hoge = win2.hoge+1;
	label.text = 'hoge:'+ win2.hoge;
});
こういうふうに書いても、main側ではhogeの変更は全く無視されてしまいます。

メインコンテキストに値を反映したい時は、
function update_hoge(value){
	hoge = value;
}
という具合にセッターを用意してあげて、副コンテキストの方から
win2.update_hoge( Titanium.UI.currentWindow.hoge + 1);
という具合にして呼び出してあげると、メインコンテキストで実行されるので、値を反映することが出来ます。

button1.addEventListener('click',function(e){
	win2.update_hoge(win.hoge+1);
	label.text = 'hoge:'+ win.hoge;
});

ただしここにはさらに罠があって。update_hogeを呼んだからといって、副コンテキストが見ているwin2.hogeが勝手にアップデートされたりはしません。
なので、上記コードも、ボタンをクリックしても副コンテキストのhogeの値はちっとも増えないように見える。実際には、メインコンテキスト側のhogeが増えているので、いったんウインドウを閉じて開けば反映されるのですけど。

副コンテキスト側に値を戻してあげるには、update_hogeで反映してあげるしかないみたい。
function update_hoge(value){
	hoge = value;
	win2.hoge = hoge;
}
という具合にして書き戻すようにするか、get_hoge();を作るのがよいみたい。

コンテキストというのがスレッドのことなのかなんなのかによっては、意図しない順番で処理が実行されたりしそうで怖いのですけど、その辺は明日えらい人たちに聞いて勉強してこようと思います。

おまけ

というわけで明日(あ、今日になっちゃった)は はてな技術勉強会 Hackathonです。@masuidriveをはじめ、TitaniumMobile関係えらい人がいっぱい集まるのにもかかわらず、まだ席が空いています!もったいないお化けが出ますので、空いている人ははてなにGO!