blog.Ring.idv.tw

Articles

Accelerometer in iPhone

上圖是iPhone所俱備三維空間的加速度感應器,在App Store有許多的小遊戲都是用它來控制的,使用的方法很簡單,不過筆者不太喜歡用Interface Builder來學習iPhone上的開發技巧,所以此範例都是純手工。

主要程式

UIAccelerometer *acc = [UIAccelerometer sharedAccelerometer];
acc.updateInterval = 1.0f/20.0f;
acc.delegate = self;

由於UIAccelerometer class是一個Singleton pattern,所以需要透過「[UIAccelerometer sharedAccelerometer]」的方式來取得,在Java上就是一些「getInstance()」的方法。

這裡需要設置兩個property,它們分別為:updateInterval、delegate

updateInterval:代表加速度感應器更新的頻率。

delegate:用來註冊哪一個class有實作「UIAccelerometerDelegate」Protocol

UIAccelerometerDelegate

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration 
{
	xx.text = [NSString stringWithFormat:@"%f",acceleration.x];
	yy.text = [NSString stringWithFormat:@"%f",acceleration.y];
	zz.text = [NSString stringWithFormat:@"%f",acceleration.z];
}

此範例純粹將X, Y, Z三個軸的值顯示出來。

範例下載

2010-06-18 14:57:02 | Add Comment

Polymorphism in Objective-C

最近開始試著熟悉一些Objective-C的語法,不過其實一開始蠻排斥Obj-C,因為覺得它的語法和其它程式語言差異太多了.... 要熟悉需要花一段時間,而現在和它妥協了,或者應該是說被Steve Jobs強迫學習,而且也被強迫要買一台Mac機器... Orz (謎之音:這應該才是Steve Jobs的主要目的,因為要開發iphone/ipad/ipod touch... 請先來買一台Mac機器唷!)

本文只是筆者試著將Java的一些OO觀念套用在Obj-C,看看多型(Polymorphism)操作是如何用Obj-C來實現:

Human.h

定義一個Human Protocol,相當於Java中的Interface,裡頭只定義一個sayHello method。

@protocol Human
-(void) sayHello;
@end

Shen.h

定義一個Shen class,它繼承NSObject且會遵從Human這個Protocol (很奇怪吧~ 明明是個class卻是用interface的字眼)

#import "Human.h"
@interface Shen : NSObject <Human>
@end

Shen.m

實作Shen class的程式碼,sayHello方法只透過NSLog印出一些字串。

#import "Shen.h"
@implementation Shen
-(void) sayHello
{
	NSLog(@"Hello, I'm Shen.");
}
@end

Jack.h

另一個遵從Human Procotol的Jack class。

#import "Human.h"
@interface Jack : NSObject <Human>
@end

Jack.m

#import "Jack.h"
@implementation Jack
-(void) sayHello
{
	NSLog(@"Hello, I'm Jack.");
}
@end

YourDelegate.m

分別建立Shen和Jack這兩個物件,並傳給「say:(id<Human>)」這個方法來進行多型操作。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

	Shen *shen = [[Shen alloc] init];
	if([shen conformsToProtocol:@protocol(Human)] == YES)
	{
		NSLog(@"Shen conforms to Human\n");
	}
	[self say:shen];
	Jack *jack = [[Jack alloc] init];
	[self say:jack];

	[shen release];
	[jack release];

	[window makeKeyAndVisible];
	return YES;
}
-(void) say:(id<Human>) n
{
	[n sayHello];
}

輸出結果:

Shen conforms to Human
Hello, I'm Shen.
Hello, I'm Jack.

在這個範例中,筆者還用了一個NSObject的「conformsToProtocol」方法,可以使用它來判斷該物件是否有遵從特定的Protocol。

2010-06-15 09:40:38 | Add Comment

[心得] 2010 新一代設計展

今天的新一代設計展其實還不賴~ 讓我印象比較深刻的有「嶺東科大數位媒體設計系」和「南台科大」,因為筆者的背景是多媒體設計~ 所以自然會對這些領域的東西深感興趣~

在「嶺東科大數位媒體設計系」方面讓我印象最深刻的是「封之青焰 - 桃轅傳」這一款完成度頗高的RPG遊戲,重點在於整個遊戲的引擎是用Flash AS開發的,並結合3D、2D美術設計,還有用AE做魔法特效效果,而且整個遊戲在執行上仍相當順暢~ 所以可能心有戚戚焉的緣故~ 就買了一片遊戲光碟來支持一下! ^^ 畢竟這從討論到實作完成品的過程,只要有一個環節沒有抓好就一定無法完成,隨便想想就有一大堆事要做~ 從手繪、3D建模、特效製作、背景音樂、人物配音、場景設計等等... Orz 真希望我也能參與這樣的一個團隊可以來做這些事 XD

另外「南台科大」印象比較深刻的是有一組用iPhone來開發小遊戲,重點就在於整個會場我只看到有這一組是展示iPhone的成果(還是有其它我沒看到的?),有興趣的朋友可以到它們團隊的facebook看遊戲展示(KALA7 Games)。

還有值得一提的是「復興商工美工科」依然保持該校的傳統... 底子真是紮實到個不行!

而就應用工具面來看~ 有一些學校做的3D遊戲都採用「Torque 3D」,也有用「Virtools」還有「GameMarker」,還有看到一個賽車體驗互動遊戲直接用C#結合DirectX來開發~ 還有一些做擴增實境的應用等等。

題外話,下午離開新一代展的時候.. 居然在新光三越看到星光六-陳曼青在街頭表演打鼓!! 真帥!

2010-05-24 01:23:14 | Add Comment

HBase/Hadoop RPC

基本上HBase的RPC設計是採用Hadoop的RPC並做一些更動而寫成的(HBase/RoadMaps),而如果要用一句話來解釋HBase/Hadoop的RPC設計可以這麼說:它是透過Dynamic Proxy Pattern + Reflection + NIO(Multiplexed, non-blocking I/O)所構成的,中間溝通的物件會透過序列化(serialization)的方式來傳遞,所以都需要實作Hadoop的Writable介面,下述是筆者利用HBase/Hadoop的RPC設計來自訂一個Hello, Java範例:

RPCInterface

自行定義一個「say()」方法供RPC呼叫。

package hbase.rpc;

import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;

public interface RPCInterface extends HBaseRPCProtocolVersion
{
	public String say();
}

Message

實作RPCInterface介面的Message類別,純粹回傳一個「Hello, Java」字串。

package hbase.rpc;

import java.io.IOException;

import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;

public class Message implements RPCInterface
{
	public String say()
	{
		return "Hello, Java";
	}
	
	@Override
	public long getProtocolVersion(String protocol, long clientVersion) throws IOException
	{
		return HBaseRPCProtocolVersion.versionID;
	}
}

TestRPCServer

該程式會透過「HBaseRPC.addToMap()」來註冊自行定義的方法(Method Registry),而內部就是利用Reflection來取得該類別所擁有的方法(Method),它會給予每個方法一個特定的ID,而該ID是一個整數值。

由於HBase/Hadoop的Server是採用Multiplexed, non-blocking I/O方式而設計的,所以它可以透過一個Thread來完成處理,但是由於處理Client端所呼叫的方法是Blocking I/O,所以它的設計會將Client所傳遞過來的物件先放置在Queue,並在啟動Server時就先產生一堆Handler(Thread),該Handler會透過Polling的方式來取得該物件並執行對應的方法,下述範例預設為10個Handler(HMaster/HRegionServer預設都為25個,根據"hbase.regionserver.handler.count"設定)。

package hbase.rpc;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HServerAddress;
import org.apache.hadoop.hbase.ipc.HBaseRPC;
import org.apache.hadoop.hbase.ipc.HBaseServer;

public class TestRPCServer
{
	private HBaseServer server;
	private final HServerAddress address;
	static{HBaseRPC.addToMap(RPCInterface.class, (byte)37);}
	
	public TestRPCServer()
	{
		this.address = new HServerAddress("localhost:56789");
	}

	public void start()
	{
		try
		{
			Message msg = new Message();
			this.server = HBaseRPC.getServer(msg, address.getBindAddress(), address.getPort(), 10, true, new HBaseConfiguration());
			this.server.start();
			while (true)
			{
				Thread.sleep(3000);
			}
		} catch (Exception e)
		{
			e.printStackTrace();
		}

	}
	public static void main(String[] args)
	{
		new TestRPCServer().start();
	}
}

TestRPCClient

這裡的「HBaseRPC.getProxy()」就是採用Dynamic Proxy Pattern + Reflection來設計,有興趣的朋友可以去研究它的Source Code。

package hbase.rpc;

import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.ipc.HBaseRPC;
import org.apache.hadoop.hbase.ipc.HBaseRPCProtocolVersion;


public class TestRPCClient
{
	protected RPCInterface server;
	static{HBaseRPC.addToMap(RPCInterface.class, (byte)37);}
	@SuppressWarnings("unchecked")
	public TestRPCClient()
	{
		try
		{
			server = (RPCInterface) HBaseRPC.getProxy(RPCInterface.class, HBaseRPCProtocolVersion.versionID, new InetSocketAddress("localhost", 56789), new HBaseConfiguration());
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public String call() throws IOException
	{
		return server.say();
	}

	public static void main(String[] args) throws IOException
	{
		TestRPCClient client = new TestRPCClient();
		System.out.println(client.call());
	}
}

玩玩看吧!

2010-05-09 01:46:58 | Add Comment

九份.夜景

和朋友去九份夜拍... 可惜不是黃昏時刻,不然玩玩黑卡效果應該也不錯!

2010-05-05 00:26:47 | Add Comment

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 切換內文字級 :::

::: 分類 :::

::: 搜尋 :::

Ching-Shen Chen

::: 文件歸檔 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment

::: 人氣指數 :::

今日人氣:6

累積人氣:896993


::: 線上人數 :::

counter