2010年2月15日月曜日

GoogleBuzz

Buzzにとても興味があるが、まだどんな感じで使っていったらいいのかが分からずいるaqubiです。こんにちは。

APIもまだ全て公開されておらず、クライアントを作成することが出来ない状態なのが残念ですね。
が、情報収集はしておこう...と思っている日々です。

ということで今まで知った事をメモ。

Gmailで本名を入れている場合は、その名前が公開されます。
ニックネームがでればよかったんですけどねー。
Google バズ を快適にお使いいただくために

Emailを使ってBuzzに投稿するには、buzz@gmail.comに送る
ちょっとしたマークアップが使える
*word* = 太字
_word_ = 斜体
-word- = 打ち消し線
-- = 全角ダッシュ

Buzzのエントリは、label:buzz のラベルがつく。

twitterサービスを除いたものは -twitter でいけるらしい。 Stefan Svartlingのバズより

Buzzの検索

is:buzz - Type this while searching from your Inbox to find Buzz posts that were emails.
has: [link/video/image] - finds all posts with either a link, video, or image.
author: - finds all posts in your stream authored by the person whose name you enter.
commenter: - finds all the posts in your reading stream that that person commented on.


FeedBurnerを使った連携 - Google Buzz と Twitter の連携について

TwitterとBuzzとの同時ポスト - BuzzTweep
Twitterアプリから送られたメールを、Gmailの転送機能を使って、buzz@gmail.comに送信してるっぽい。
• • •

2010年2月7日日曜日

空うさぎのBTSをBacklogに移行しました

空うさぎのソース管理、チケット管理をBacklogに移行しました。

場所は Backlog-空うさぎ です。
guest/guestで入ればチケットが見れます。

実装予定はあんのー? とか気になった時とか、よければ見て下さい。
Twitterで #sora_usagi のハッシュ付きでつぶやいてくれても反応しますので、それでもいいんですが。

guestの権限では、残念ながらソースコードは見れないです。
オープンソースのプロジェクトでも使えるように、ログイン無しで 課題とソースコードを見れるような設定がほしー!と要望はしておいたので、今後その機能が実装されることを期待。

Backlogにはスペースという概念があって、1スペース毎の契約になります。
契約内容により、プロジェクトがいくつ作成できるかが決まります。

スペース名を「sorausagi」にしちゃったんですが、他のプロジェクトをたてることも考えたら、違う名前にした方がよかったかも。。失敗。
まぁ、他のアプリを作るときにも「空うさぎシリーズ」にしてしまったらいいのか!

空うさぎという名前、うさぎクラスタの方々の反応がとてもよいです。
名前でひっかかって試してくれた方もいるみたいー。うれしいですねー。

TwitterのTLもうさぎアイコンの方が増えていい感じ!

空うさぎのページも更新しなくっちゃなぁー。
日本語だけじゃなく、英語ページも作りたいんだけど、作りやすい良いツールないですかね?
Google Translate ToolKitみたいなUIで翻訳作業できたら便利でいいんだけどなぁー。
Google Translate Toolkit の メニュー>共有に「ソース ページに公開」ってあるんだけど、これを自分のページへの設定ができたらいいのになぁ。。
• • •

AdobeAIRで常駐アプリを作る

FriendFeed,Twitter,RSSのクライアントとして作成中の空うさぎですが、どこから皆さん見つけてきているのかが分からないのですが、新しいバージョンのダウンロード数が336件になりましたー。
有り難うございまっす。

んで、前から要望のあった常駐化対応をやっている最中です。

やりたい動きとしては
- メイン画面を閉じてもアプリは終了せず常駐する
- Windowsの場合はタスクトレイ、Macの場合はDocを表示し、アイコンをクリックしたらメイン画面を復帰

メイン画面を閉じてもアプリは終了せず常駐する

画面の×ボタンを押されたタイミングで画面のvisibleをfalseにすればよさそう。
mx:WindowedApplication の closingのタイミングで以下のコードを書く。

/* WindowをCloseするタイミングでの処理 */
public function onWindowClosing(e:Event):void {
visible = false;
e.preventDefault();
}

closingのタイミングであれば、処理をキャンセルすることができるので、e.preventDefault(); で画面終了処理をキャンセルしてます。

Windowsの場合はタスクトレイ、Macの場合はDocを表示し、アイコンをクリックしたらメイン画面を復帰


if (NativeApplication.supportsMenu) {
// Mac用のDocを作成する処理
} else {
// Windows用のタスクトレイを作成する処理
}

でまずは処理を切替。

/* DocIconの設定 */
private function setDockIcon(menu:NativeMenu):void {
var doc:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
doc.bitmaps = [new icon128x128()];
doc.menu = menu;
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, systemTrayIconClickHandler);
}

/* SystemTrayの設定 */
private function setSystemTrayIcon(menu:NativeMenu):void {
var tray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
tray.bitmaps = [new icon32x32(), new icon16x16()];
tray.menu = menu;
tray.tooltip = applicationName;
tray.addEventListener(MouseEvent.CLICK, systemTrayIconClickHandler);
}

/* タスクトレイ、Docをクリックした時の処理 */
private function systemTrayIconClickHandler(event:Event) :void {
if (!mainWindow.visible || mainWindow.nativeWindow.displayState == NativeWindowDisplayState.MINIMIZED) {
if (!mainWindow.nativeWindow.visible) {
mainWindow.nativeWindow.visible = true;
}
mainWindow.nativeWindow.restore();
mainWindow.activate();
mainWindow.setFocus();
}
}

で、Docとシステムトレイを作成します。

クリックのタイミングを拾うには、Windowsではタスクトレイに対して addEventListener(MouseEvent.CLICK, handler); をすれば拾えるっぽいのですが、MacのDocは拾えないみたい。
Docの場合は、マウスをクリックすると、NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, handler); が呼ばれるようなので、これで対応。

これで今の所、動いている感じ。。
• • •

2010年2月1日月曜日

Flexで重複チェックする

FlexでのチェックはValidatorを使えます。

このサブクラスとして既に実装されているValidatorは
CreditCardValidator, CurrencyValidator, DateValidator, EmailValidator, NumberValidator, PhoneNumberValidator, RegExpValidator, SocialSecurityValidator, StringValidator, ZipCodeValidator があります。

これ以外のValidatorって自作する場合、どう作るんだろう? と思い作成してみました。

今回欲しかったのは、重複チェックのValidator。
複数のObjectを登録できるが、名前は重複させたくない という場合の時に使うためのものです。

- ArrayCollectionの中にAオブジェクトが複数入っている。
- Aオブジェクトには name という属性がある。
- 新規追加する時は、ArrayCollectionの中に同じnameが入っていたらエラー。
- 更新する時には、更新対象オブジェクト以外でチェックする。(excludeの設定)
- 必須入力の項目でもある

という前提だと、


var validator:Validator = new DuplicateValidator(arrayCollection, "name", excludeObject);
validator.source = txtName;
validator.property = "text";
validator.required = true;

ように設定するものになります。


/**
* リストの中に重複がないかチェックする
* @author ogawa
*/
package org.sorausagi.air.ui.setting.rss {
import mx.validators.Validator;
import mx.validators.ValidationResult;
import mx.collections.ArrayCollection;

public class DuplicateValidator extends Validator {
/* 元々のリスト */
private var list:ArrayCollection;

/* リスト内オブジェクトの名前 */
private var listName:String;

/* 除外するオブジェクト */
private var excludeObject:Object;

/* このValidatorのErrorMessage */
private var _fieldError:String = "既に使われている名前です";

public function DuplicateValidator(list:ArrayCollection, listName:String, excludeObject:Object = null) {
this.list = list;
this.listName = listName;
this.excludeObject = excludeObject;
}

public function set fieldError(message:String):void {
this._fieldError = fieldError;
}

public function get fieldError():String {
return _fieldError;
}

override protected function doValidation(value:Object):Array {
var results:Array = super.doValidation(value);
var val:String = value ? String(value) : "";
if (results.length < 0 || ((val.length == 0) && !required)) {
return results;
}
return validateDuplicate(this, value, null);
}

public function validateDuplicate(validator:Validator, value:Object, baseField:String):Array {
var results:Array = [];
for each (var item:Object in list) {
if (excludeObject != null && excludeObject == item) {
continue;
}
if (item[listName] == value) {
results.push(new ValidationResult(
true, "","deplicated",
fieldError));
break;
}
}
return results;
}
}
}


使ってみた画面はこんな感じ。
• • •