2012年4月25日 星期三

Objective C 學習隨記(二)

objC 跟C 雖然是很類似的程式語言, 但是用慣了C 寫一些firmware的人要轉學objC 還是有一些觀念要適應一下! 下面介紹的就是一個objC專有的語法, 如果能靈活運用, 將省去不少重複的程式

同名異式

動態型別

動態連結

其實這三個觀念都環繞著一個特殊的資料型態 "id"

最根本的原因是objC裡, object type並不是在compiling type決定,而是在runtime決定

一個以id 宣告為type的物件, 它的type內容是可變的
例如


id mathobj;

Fraction *aFrac = [Fraction alloc] init];

Complex *bComp = [[Complex alloc] init];
mathobj = aFrac;
[mathobj print];
mathobj = bComp;
[mathobj print];

因為有繼承這個objC主要功能的關係, 很多物件都相互有同名的method, 當然內容可能各不一樣, 就可以用id這種型態, 動態呼叫不同的物件同名method

這部分又衍生一些檢查的功能
例如檢查這個class 的selector (method) 是否存在
selector是以SEL為type的物件
運用方法如下例

SEL action;
id graphicobject
...
action = @selector(draw)
...
[graphicobject performSelector: action];

也就是說selector可以動態選擇要執行的method


Try & Catch 例外處理

objC的exception 處理方式:
把有可能發生exception的程式段以
@try{
...
}
包起來

後面在撰寫處理程序
@catch(NSException exception){
...
}

@finally 是不管有沒有丟出exception都會執行的程式區

@throw可以自己丟出exception


2012年4月22日 星期日

Objective C 學習隨記(一)

最近因為Iphone4s 很熱, 開始對這Apple劃時代的產品產生興趣, apple跳脫舊科技公司產品的思維, 賣的不只是冰冷的硬體, 他還創造了一個ecosystem方便軟體工程師可以很方便的從開發環境到測試最後到線上銷售, 一條龍不需要太大的進入門檻, 這無疑讓軟體設計師可以不需要自組一個公司處理銷售服務, 完全只需要發揮創意! 想想台灣雖然身為科技島, 但是全都偏向代工, 對於創新的產業著墨不深, 當apple 和 google相繼開發出軟體開發平台, 這無疑的對台灣產業轉型, 提供一個最佳的機會, 畢竟創意才是科技的根本 

Ok 轉回主題, 不管是iphone還是ipad, 都是在apple公司開發的iOS上跑, 而iOS是從MacOSX 針對embedded device最佳化修改成的OS, 等同於Android是google基於linux 架構針對embedded device修改而成, 當然apple為了增加它應用程式(俗稱apps)的多樣性, 它徹底揚棄Microsoft對於開發人員設定的門檻, 這不得不說MS的失策, MS早在2000年初就進入smartphone的市場, 當時smartphone幾乎是MS獨佔, MS對每隻smartphone收的loyalty 超高, 加上MS對於Visual Studio收費真是高的嚇人, 所以會去開發它win ce apps的很少, 造成買了device卻沒甚麼apps可用的窘境, 一直到現在window mobile還在垂死掙扎, 就不多批評了.

不管iOS或Mac OSX應用程式都是用同一套開發工具,是免費的Xcode, 現在最新版本是4.0 , 使用的程式語言是objective C 這系列主要就是我讀一本書 "Programming in Objective-C" 4th edition的一些筆記 

objective-C 應該說是C的進化物件導向版本, 觀念非常像C++ class inherit 的觀念

 class宣告 

@interface Classname : NSobject //:NSObject 代表繼承於NSObject 
@property int a,b; //
@property代表 a跟b的 setter 和 getter由compiler自動產生, 要和implementation理加@synthesize a,b; 
-(return type) methodname:(type)para1:(type)para2;
@end 

class定義 

@implementation Classname
@synthesize a,b;
-(type) methodname: (type)para1:(type)para2 

 //statements 
}
 @end

 一般在實做class時要先allocate,再init 格式是
[[classname alloc] init] [classname alloc]會回傳一個class instance, 再呼叫class instance的init功能 也可以用 [classname new] 取代上述

2012年3月5日 星期一

Blt function in GOP driver

Blt function is one of the three functions defined in UEFI GOP driver spec. And it is the only function that actually perform the draw operations. It has 4 operation modes.

  1. EfiBltVideoFill: Fill the rectangle of (DestinationX,DestinationY) to (DestinationX+Width,DestinationY+Height) wih BltBuffer pixel (0,0), only 1 pixel in BltBuffer is used.
  2. EfiBltVideoToBltBuffer: Read data from Video Buffer to BltBuffer (delta is used here)
  3. EfiBltBufferToVideo: Write data from BltBuffer to Video Buffer
  4. EfiBltVideoToVideo: Copy data from a rectangle in the VideoBuffer to another position in the VideoBuffer (BltBuffer and delta not used) 
One thing need to pay attention: Before doing memory operation, should raise TPL to avoid interrupted by timer event)

2012年2月13日 星期一

LTV > CPA ?

Mr.Jamie 提到的一個觀念 創業最重要的公式 LTV > CPA
提高LTV
降低CPA
LTV (life time value) 代表的是每一個customer 在你的服務期間的總和花費, 如果你提供的是一個有形的產品, 那期間就代表產品的生命週期, value就是產品的價格, 如果提供的是一種服務, 那期間就代表服務的期限, value就是服務的收費


CPA (cost per acquisition) 代表爭取到一個客戶所要的花費, 這不只是產品的生產成本, 還包括廣告行銷投入的成本與客戶回應比率


而在創業期間第一優先的目標就是 LTV > CPA , 達到這條件之後, 每多一個customer得到的profit才是正的, 爭取更多的客戶才有意義

2012年2月10日 星期五

EFI GOP Driver

GOP (Graphic Output Protocol) driver 是 EFI架構下取代傳統VBIOS 黑箱的 EFI Driver, 另外for embedded system bootloader 上的graphic driver叫EPOG(embedded Pre-OS Graphic).

GOP Driver 的共有GUID
#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
  {0x9042a9de,0x23dc,0x4a38, \
  0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a}
Protocol 主要包含3個function 及 1個data structure

typedef struct EFI_GRAPHICS_OUTPUT_PROTCOL {
  EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode;
  EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE   SetMode;
  EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT        Blt;
  EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE       *Mode;
} EFI_GRAPHICS_OUTPUT_PROTOCOL;


  1. QueryMode: Returns information for an available graphics mode that the graphics device and the set of active video output devices supports.(是詢問graphic controller 和 系統所有接上的顯示器所支援的顯示模式)
  2. SetMode:Set the video device into the specified mode and clears the visible portions of the output display to black. 則是設定顯示裝置一個特定的顯示模式
  3. Blt:Software abstraction to draw on the video device’s frame buffer.則是直接透過寫入framebuffer  畫矩形圖片

取材UEFI spec 2.3 chap. 11.9 


2012年2月9日 星期四

SVN branch and merge

前一陣子在ubuntu server上架了svn server 當做自己一些文件及程式版本控管的工具,不過只會用幾個簡單的功能, check out, import , ls commit 而且都是用shell command line下指令, 剛看到一個blog  記一下網址
svn branch and merge

2012年2月7日 星期二

C 語言 macro 應用

C 語言用了十幾年, 卻很少用到macro 來簡化程式, 先記下連結慢慢復習
C language MACRO in depth