2011/06/06 | 18:58 pm

Optimus Pad に apk をインストール

動作確認したアプリがあったけど、ストア公開する前のベータ版なので、USB経由でインスコをトライ。
Windows では LG のウェブに正式な USB ドライバがあるのですが、Mac は無いみたいなので、自力でどうにかすることに。。
今日日、StarCraft 2 にも Mac 版があるのに、Windows 用のドライバしかないのはけしからんと思う。
(要:Mac OS 10.5 以降、MicroB to A-Type USBコネクタ)

まず「Android File Transfer」をダウンロード。

optimus_install-01

次に Optimus Pad で Android Market を起動して「File Expert」をインストール。

optimus_install-02

その後、USB で Mac と Optimus Pad を接続して、先ほどインストールした Android File Transfer を起動する。
それから事前に「設定 -> アプリケーション -> USB デバッグ」のチェックを外しておかないとデバッグモードになるため「Andoird搭載端末が見つかりません」と表示されます。
ちゃんと接続できていると、タイトル部分が「L-06C」となり、色んなフォルダが表示されます。

optimus_install-03

適当なフォルダ(自分のときは Download に入れました)に用意した .apk ファイルをドラッグ&ドロップでファイル共有します。
そしたら、Optimus Pad で File Expert を起動して、ドラッグ&ドロップしたフォルダを見るとファイルがあると思いますので、選択してインストールすると完了です。
※ 事前に「設定 -> アプリケーション -> 提供元不明のアプリ」のチェックボックスにチェックをつけておかないと無理のようです。

COMMENT

CATEGORY

POSTED

jam

2011/05/31 | 13:58 pm

Fontable

こーゆーのが置いてある事務所とかあったら、とってもかっこいいのではないか。
自宅には、、、ちょっと無理かな。。


Alessandro and Andrea, Fontable – outdoorz gallery

aa_font_AD

aa_font_AAA

aa_font_1

COMMENT

CATEGORY

POSTED

jam

2011/05/30 | 11:59 am

stats.js

フレームレートを計る Stats.as を作られた Mr.doob 氏作成の JavaScript 用の「Stats.js」が GitHub に公開されてた。
仕事早いなー


mrdoob / stats.js – GitHub

COMMENT

CATEGORY

POSTED

jam

2011/05/25 | 17:28 pm

Facebook OAuth flowでハマタ

Facebook のアプリ登録でサイトURLを「www.brooklyn.jp/」で登録して、そのアプリIDを使った php で OAuth 認証を「brooklyn.jp/」でアクセスした状態ですると、許可してませんって言われます。

そう言えば、Flash開発してたときにも、crossdomain 指定で www 付きと無しでは別もののサイトとして認識されていて困ったの思い出した。
専有サーバーでドメイン割当のときもそうだったの思い出した。

それを思うと妥当なミスでした。

iPad_capture

COMMENT

CATEGORY

POSTED

jam

2011/05/24 | 12:54 pm

Anatomy of Mashup

HTML5 によるビジュアライザー、楽曲がダフトパンクなとこがさらにかっこいい。
自作の Flash アプリで mp3 から audio spectrum の JSON データを吐き出すのを作ったそうです。
4MB 分の JSON データを手で書くのは無理だそうで。。。


Anatomy of a Mashup: Definitive Daft Punk visualised

COMMENT

CATEGORY

POSTED

jam

2011/05/16 | 14:55 pm

Text Editor on Mac

さっき使い始めたテキストエディター Fraise
フリーのエディターでは歴代 mi → Smultron → CotEditor → Fraise(今ここ) ときましたが、そろそろ落ち着くかと。

Smultron がとっても使いやすいかな、と思っていたけどまさかの開発中止で他のエディタを使う事にして、となりの席のコーダー君&向かいの席の元バックエンドプログラマ君が CotEditor 良いですよ! というので使い始めるものの、タブ機能が無いので断念。。

それで、Snow Lepard オンリーだけど Smultron の後継者的な Fraise を導入(アイコンの系統も一緒 w)。
割と使いやすいけど、シンタックスカラーが甘いのが難点。
CSS はそれほど気にならないけど、 ActionScript、JavaScript、Objective-C に関しては、文字列とキーワードくらいしかカラーリングされてないんじゃないかしら? ってくらいテキストカラーが多い。

とりあえず、もうちょっと様子見で使い続けてみる。
無料であれば今のところ Fraise が有力候補です。
ただ、これを言ったら元も子もないけど有料の Coda が一番良いと思う。あれ最強ですね。

COMMENT

CATEGORY

POSTED

jam

2011/05/09 | 21:36 pm

atSceneDescend で到着シーンを取得

久々にウェブサイトのオーサリングで、Progression 4を使ったら、みごとはまる。

グローバルメニューなどで、シーン移動時にアクションがある場合、直リンでアクセスされたときにメニューが全然動かない状態になった。
そんなときの Progression 4 での到着シーンのID取得方法。

[ IndexScene.as ]

// 下記を追加する
/**
 * シーン移動時に目的地がシーンオブジェクトの子階層であり、かつ出発地ではない場合に、自身が移動を中継した瞬間に送出されます。
 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
 */
override protected function atSceneDescend():void {
	if( manager.destinedSceneId.toString() == "/index/scene_a" ) {
		// scene_a の場合の処理
	} else if( manager.destinedSceneId.toString() == "/index/scene_b" ) {
		// scene_b の場合の処理
	} else if( manager.destinedSceneId.toString() == "/index/scene_c" ) {
		// scene_c の場合の処理
	}

	addCommand(
		// なにか処理する場合はここに記述
	);
}

っと、atSceneDescend() でいきなり子シーンにアクセルするときのイベントを取得できるので、
このときに、manager.destinedSceneIdでシーンのnameで設定しておいたString型がとれる。
それに応じて処理を変えていく。

SceneObjectクラスにそーゆーのがあるかと思ってずっと探してたら、Progressionクラスにありました。なるほど、管理してるクラスに任せるのは理にかなってる、さすがです。


[追記]
間違えました(と言うか、付け忘れてました。。)
manager.destinedSceneId は SceneId が戻り値なので、String型じゃありません。
toString() を加えるか、String型でキャストしないと等価演算子がまともに機能しませんのです。

COMMENT

POSTED

jam

2011/05/09 | 17:55 pm

Quadcopters ping-pong

動体センサーとかで認識してるっぽい
失敗したときが人間っぽくて愛らしい w

>

COMMENT

CATEGORY

POSTED

jam

2011/05/02 | 13:56 pm

iPad2 simulator by HTML5

これはすごい。

MapsとSafari、Notes、Timezonesが動くことを確認。
とくに感動したのが、マルチタスクとAppの編集(←アイコン長押し)
頑張れば、iPodとかもつくれるかも。

いや、頑張ってください。

simulator


iPad2 simulator /w Css3, Jquery and HTML5 (alexw.me)
via dotHTML5

COMMENT

CATEGORY

POSTED

jam

2011/04/28 | 18:58 pm

UIScrollView で視差をつける

ここ半年以上、ウェブから離れていたので、その間に溜め込んだTIPSのメモ。
Objective-Cは厳格だけど楽しいです。あとXcode4からデバックが相当楽になりました。

と、余談は置いといて、UIScrollView でスクロールしたときに、表示されているそれぞれに視差をつけて動かすとき、真ん中を基準にして単純に可動範囲の横幅を足すのが一番楽でした。

explanation

iPadだと、実際の横幅は1024pxになるところを、表示させているOBJECT_Aには、可動域を1280pxとして動かす。
こうすると、OBJECT_Aが背景と同期していないように動いて、まるで視差があるように見えます。
何個かオブジェクトを配置して、別々の値を設定しておくと、なかなか面白い動きをしてくれます。
多分、GUINNESS WORDL RECORDSのアプリとかに近い動きになるはず。

今回やった方法は、UIScrollViewをベースのUIViewに配置して、UIScrollViewDelegateからscrollViewDidScrollで吐き出される値をそれぞれのオブジェクトに渡すというもの。

[ BaseView.h ](← UIViewControllerにaddSubview:されたUIViewと想定)

#import 

@interface BaseView : UIView  {
	// 基本となるUIScrollView
	UIScrollView	*scrollView;
	NSMutableArray	*pages;
}

- (void)initObject;
- (int)currentPage;

@end

[ BaseView.m ]

#import "BaseView.h"
#import "PageView.h"

#define NUM_OF_PAGES	5	// 5ページあると想定

@implementation BaseView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
		[self initObject];
    }
    return self;
}

- (void)initObject {
	CGRect rect = CGRectMake( 0.0f, 0.0f, 1024.0f, 768.0f );

	scrollView = [[UIScrollView alloc] initWithFrame:rect];
	scrollView.pagingEnabled = YES;
	scrollView.delegate = self;
	scrollView.contentSize = CGSizeMake( NUM_OF_PAGES * rect.size.width, rect.size.height );
	[self addSubview:scrollView];

	pages = [[NSMutableArray alloc] initWithCapacity: NUM_OF_PAGES];
	for( int i = 0; i < NUM_OF_PAGES; i++ ) {
		PagaView *page = [[UIPageView alloc] initWithFrame:rect];

		if( page.superview == nil ) {
		CGRect viewFrame = page.frame;
		viewFrame.origin.x = viewFrame.size.width * i;
		viewFrame.origin.y = 0;

		page.frame = viewFrame;

		[pages addObject:page];
		[scrollView addSubview:page];
	}
}

- (int)currentPage {
	CGFloat pageWidth = scrollView.frame.size.width;
	int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

	return page;
}

- (void)scrollViewDidScroll:(UIScrollView *)sv {
	int page = [self currentPage];

	if( page < 0 ) return;
	if( page >= NUM_OF_PAGES ) return;

	PageView *view = [pages objectAtIndex:page];
	if( view.superview != nil )
		[view adjustObjectPosition:sv.contentOffset.x pageIndex:page];	// この値を元に視差をつける
}

[ PageView.h ]

#import 

@interface PageView : UIView {
	// 今回は、それぞれのオブジェクトに画像を当てはめる想定
	UIImageView		*aImage;
	UIImageView		*bImage;
	UIImageView		*cImage;
}

- (void)setupPageObject;
- (void)adjustObjectPosition:(float)xpos pageIndex:(int)index;
- (UIImageView *)makeImageView:(CGRect)rect withImageName:(NSString *)imageName

@end

[ PageView.m ]

#import "PageView.h"

// それぞれの差異の値を設定
#define DIFF_A	500.0f
#define DIFF_B	300.0f
#define DIFF_C	100.0f

@implementation UIPageView

- (void)setupPageObject {
	CGRect aRect = CGRectMake( 90.0f, 140.0f, 815.0f, 510.0f );
	CGRect bRect = CGRectMake( 80.0f, 100.0f, 450.0f, 190.0f );
	CGRect cRect = CGRectMake( 300.0f, 20.0f, 160.0f, 90.0f );

	aImage = [self makeImageView:aRect withImageName:@"aImage.png"];
	[self addSubview:aImage];
	bImage = [self makeImageView:bRect withImageName:@"bImage.png"];
	[self addSubview:bImage];
	cImage = [self makeImageView:cRect withImageName:@"cImage.png"];
	[self addSubview:cImage];
}

- (void)adjustObjectPosition:(float)xpos pageIndex:(int)index {
	float pos = xpos - ((page + 1) * 1024.0f);

	// 真ん中を基点としたそれぞれのX座標の差異
	float moveValue_a = -((pos / 1024.0f) * DIFF_A) - (DIFF_A - 90.0f);
	float moveValue_b = -((pos / 1024.0f) * DIFF_B) - (DIFF_B - 80.0f);
	float moveValue_c = -((pos / 1024.0f) * DIFF_C) - (DIFF_C - 300.0f);

	// 各画像にX座標を適応
	aImage.frame = CGRectMake( moveValue_a, 140.0f, 815.0f, 510.0f );
	bImage.frame = CGRectMake( moveValue_b, 100.0f, 450.0f, 190.0f );
	cImage.frame = CGRectMake( moveValue_c, 20.0f, 160.0f, 90.0f );
}

- (UIImageView *)makeImageView:(CGRect)rect withImageName:(NSString *)imageName {
	NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@""];
	UIImage *img = [[UIImage alloc] initWithContentsOfFile:path];

	UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect];
	imgView.image = img;

	[img release];

	return imgView;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self setupPageObject];
    }
    return self;
}

- (void)dealloc {
	[aImage removeFromSuperview];
	[aImage release];
	aImage = nil;

	[bImage removeFromSuperview];
	[bImage release];
	bImage = nil;

	[cImage removeFromSuperview];
	[cImage release];
	cImage = nil;

	[super dealloc];
}

@end

こーゆーのは、Flashで培ったごまかしの技術が生かされる気がします。

COMMENT

CATEGORY

POSTED

jam

JUN NAKAJIMA
Tokyo, Japan.
member of Onawatobi.
contact@brooklyn.jp