iOS使用UIWebview與Javascript整合的範例

1. 先將UI透過Builder拉好

2. 將控制項都對應到CODE(按住CTRL直到CODE中)

3. 輸入相對應的CODE。


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initView];
}

- (void) initView {
//Field init

//Behavior Binding
self.webView.delegate = self;

//Other init logic
NSString * filePath = [[NSBundle mainBundle] pathForResource:@"home" ofType:@"html"];

NSURL * url = [NSURL fileURLWithPath:filePath];
NSURLRequest * req = [NSURLRequest requestWithURL:url];

[self.webView loadRequest:req];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (void)dealloc {
[_webView release];
[super dealloc];
}
@end

4. 此時需要調整Build Phase的一些設定,把Jquery.js從Compile Sources移到下方的Copy Bundle Resources

5. 這時JavaScript就可以Works了

6. 最後再處理下方的BUTTON對應Js的CODE(剛好都有overview的div)

(home.html 相對應的HTML)

AWS Cloud Kata 得獎心得 + Kindle 開箱文

日期: 2013年10月24日
活動: AWS Cloud Kata for Start-Ups and Developers
地點: 台大醫院國際會議中心

我們公司有不少的應用程式都搬上了AWS,所以這次難得Amazon到台大辦了一場研討會,就決定出席參加,研究看看還有甚麼服務是我不熟悉的。參加的另外一個原因是研討會中也有好幾個主題是跟Start-Ups相關的。本人是Start-Ups的一份子,當然要湊一腳聽聽啦~聽了幾個Session後主辦單位就開始宣傳在下午4點會舉辦一個現場Coding Challenge大賽,邀請大家在一個小時內寫出一個Photo Sharing的應用程式,參加的人都可以獲得USD50的AWS Credit。

參加就有錢拿,當然就邀了同行的阿里一起來玩玩。

比賽很快就開始了,主辦單位把題目公開給大家看。

有沒有從這個題目裡面看出一些玄機?一個小時內要寫出完整的應用程式是不可能的,主辦單位的主軸其實是站在「巨人的肩膀上」(我記得SESSION中Fandora的主講者也有放了進擊的巨人的照片),可以使用線上所有的第三方外掛。這就有趣了,要比的不是誰演算法最好最快,而是誰最厲害找外掛。就這樣,我的基本應用程式-Photo Sharing完成了。並且趕在很短的時間內的用FTP給上到了我新開設的EC2上(事先裝了LAMP的基本配備,來不及裝PhpMyAdmin)。

在這個比賽獲勝需要掌握幾個技巧,可以跟大家分享:

  1. 時間很短, 網路不快, 你不可能在短時間內上傳太多的外掛到SERVER, 所以一切都要精簡
  2. 能用third-party的software就盡量用, 但基本的功能要先在本機的環境測好再上(才不會被網路害死)
  3. 一開始就要布局整個時間的應用,我環境架設+上傳檔案的時間是半小時, coding的時間是半小時
  4. LAMP的環境要熟悉, 我都是用yum install的方式去安裝了httpd, php, mysql-server, php-mysql, php-gd
  5. 縮圖的功能使用WideImage, 順利將圖片等比例縮小, 不需要另外寫gd相關的函數(因為來不及呀)
  6. 獲勝的關鍵是使用了ADDTHIS, 上面充滿了不同社群網站的外掛,一個外掛+10分,所以我就這樣破表了(Joe Ziegler事後說他是故意這樣做的, 看看有沒有會發現這個破綻)

就這樣, 時間到了, 宣布冠軍, 很意外得分最高的竟然是我自己>.<

雖然得到的不是現金,但對於公司來說可以省了不少錢呢,除此之外還意外獲得了Kindle,真是太開心啦~哈哈哈。

P/S 之前就有聽說Amazon有出自己的平板,後來才知道其實他是個不傷的眼閱讀器。
以下是Kindle開箱文:


開啟盒子後可以看到上方有一張使用說明卡


使用說明卡


電源線


Kindle背部


單手拿剛剛好


使用的過程中很難感覺他是一個電子產品, 因為他沒有面板的反光(不像IPAD可以調整亮度大小)


內容物都可以透過Amazon的商店購買


在設定裡面還有一個實驗功能, 是Kindle自己的瀏覽器喔!

使用心得: 優點是看久了眼睛不容易疲勞(就像看書一樣), 缺點是沒辦法觸控, 所有EVENT都需要透過下方的控制盤去處理, 少了直覺的快速操作. 我想我會下載(購買)一本書來試玩看看~

最後附上這次活動的AGENDA,我想會有人有興趣 (其是這次的研討會的內容有很多東西值得討論,我有空會再跟大家分享)

使用 PhoneGap 建立iOS/Android專案

PhoneGap Tutorial

Windows 方法

Android
1. 找到/PhoneGap/lib/android

2. 開啟「Eclipse」確定其中已安裝Android SDK,並找出安裝路徑
3. 在PATH環境變數中加入(以下的變數請按照使用者的實際環境做調整, 勿照抄):
…;/Android SDK/platform-tools;/Android SDK/tools;C:\ANT\bin;
4. 執行「cmd」,並切換路徑至/PhoneGap/lib/android/bin
5. 執行建立專案的指令:
create.bat ~/Desktop/app/HelloWorld_android com.test.HelloWorld HelloWorld

6. 從「Eclipse」建立新專案對應到剛到剛才建立的專案並測試執行

iOS專案
在Windows上建立iOS專案後還是得去MAC作打包的動作,所以乾脆直接在MAC OS建立吧。

MAC OS 方法

How to Create Android Project?
1. 終端機上
export PATH=${PATH}:/Users/username/android-sdks/platform-tools:/Users/username/android-sdks/tools

2. cd ~/Desktop/app/phonegap-2.9.0/lib/android/bin

3. ./create ~/Desktop/app/AppName_android com.test.appname Appname

————

How to Create iOS Project?

1. 終端機上
cd ~/Desktop/app/phonegap-2.9.0

2. ./create ~/Desktop/app/AppName_ios com.test.appname Appname

Objective C 學習筆記 (part 2): @property的使用

@property 的使用

在物件導向設計方法中我們會使用封裝來保護類別成員(成員亦包含了attribute與method),我們通常會寫method來存取attribute,命名為getter與setter,以下示範objective C的getter setter作法:

A.h

#import <Foundation/Foundation.h>

@interface A : NSObject {

int attr;

}

-(int)attr; //習慣上objective C不會在getter寫上get, 而是直接使用attribute作為getter

-(void)setAttr:(int)a;

@end

A.m

#import "A.h"

@implementation A

- (int)attr {

return self->attr; //原則上不加self也可以, 加了就可以跟method內的變數作區隔

}

-(void)setAttr: (int) a {

self->attr = a;

}

@end

當你使用以上的寫法作為getter與setter時,您在程式中使用實體物件時,就可以用”.”的方式來作存取, 方在 assignment的左邊代表setter, 在右邊代表getter,示範如下:

main.m

#import <Foundation/Foundation.h>

#import "A.h"

int main(int argc, const char * argv[]) {

A *a = [A alloc];

[a.attr 30]; // assign 30 給這個物件的attribute

printf("The attribute of A is %d", a.attr); //取出a.attr的值, 會印出The attribute of A is 30

[a release];

}

是不是每次都要用傳統的作法才能達成”.”的取用呢? 其實Objective C安排了一個比較簡單的作法,就是@property,那為甚麼要先介紹上面的做法呢?很簡單因為使用任何捷徑都應該先知道他的原理吧?知道了原理未來才不會在debug中苦哈哈。使用@property的寫法如下:

A.h

#import <Foundation/Foundation.h>

@interface A : NSObject {

int attr;

}

@property int attr; //這樣就會自動建立gettery與setter

@end

A.m

#import "A.h"

@implementation A

@synthesize attr; // 舊版的xcode需要成雙寫property與synthesize,新版的只要寫property其實就可以了,

//synthesize可以讓你改property的名字, 寫法是 @synthesize attr = ppp; (就改成ppp了)

@end

main.m

#import <Foundation/Foundation.h>

#import "A.h"

int main(int argc, const char * argv[]) {

A *a = [A alloc];

[a.attr 30]; // 一樣可以使用

printf("The attribute of A is %d", a.attr); //取出a.attr的值, 會印出The attribute of A is 30

[a release];

}

基本上使用@property 會自動作三件事情:

  1. 建立了 setPropertyName (setter)
  2. 建立了 propertyName (getter)
  3. 建立了 propertyName (attribute)
*這些method是可以被override的, 所以使用了@property後, 你也可以改寫成自己想用的方式。
@property的設定 //用來設定property的參數
讀寫控制
  1. readwrite (預設): 可以讀寫,setter和getter方法都會自動加入
  2. readonly: 只能讀, 只會加getter的方法

setter相關部分

  1. assign(預設): 用於只會和可量度的數值作用的情況, _abc = b;
  2. retain/strong 在指定時會呼叫物件的retain指令, 然後前一個數值會release掉
  3. copy: 在指定時會呼叫物件的copy指令, 然後前一個數值會release掉 (一定要實作NSCopy的Protocol, 否則會掛點)
atomicity (單一性)
  1. atomic (預設): 會讓屬性有執行緒安全(thread-safe)的特性
  2. nonatomic: synthesize的存取者會直接回傳數值

Objective C 學習筆記 (part 1): 基礎

基礎

  1. Objective C其實是C的superset,所有之前學過的C語言語法在Objective C裡面都可以使用,而Objective C為C增加了一些功能。
  2. 學習Objective C有個要注意的地方,它不像.NET與JAVA那樣會有系統作Garbage Collection,一切記憶體管理都要自己來。
  3. 建議在建立Objective C專案的時候不要使用Automatic Reference Counting,因為他並不是像Garbage Collection那麼的自動化,純粹只是在編譯的時候幫你加一些跟記憶體相關的statement而已,處理不好可能還會造成memory的問題。
  4. 為甚麼Objective C的NSString,NSOject這些物件前面都有”NS”? 其實NS的是”NeXtStep” 的縮寫, 由這家公司所開發的程式語言。
  5. Nil 與 Null的差別?Nil是一個物件,他可以被操作[nil message],但NULL就是一個空物件,操作空的物件程式會死掉,但nil不會。
  6. include的部分 < … > 與 “”…”” 的差別? 前者是系統提供的.h檔,後者是使用自己建立的。
  7. NSLog 與 printf 的差別? NSLog 是真的會寫進程式日誌檔,所以如果只是平常程式debug其實可以用printf (如果不是寫iOS的話)
  8. NSString 的表示方法 @”…” 與 C的char array 用法完全不同, 不能當成同一種東西。
  9. 變數的命名要有意義,原則上如果程式碼寫得夠好,它本身就是一個註解。

使用方法 Method

  1. [myObject someMethod:argument];
  2. 它不像JAVA是用 “.” (如 myObject.someMethod), “.” 在Objective C有別的意義存在,稍後會解釋。
  3. Method的參數寫法相當特別,它的原意是希望整個Method念起來就像一個句子一樣,參數之間用空格間隔,格式如下:
    -(void)setBrand:(NSString *)brandname isA:(NSString *)type whichcost:(int) price;

Header File

  1. 用來宣告這個物件/協定有哪些成員(如attribute與method),記得在Objective C中不能制定初值(慣性上會在init裡面作初值的指定)
  2. 格式如下:(import後面不需要分號), attribute都是包在{ }之間,method寫在{}之後,”-” 代表的是實體方法。”+”代表的是靜態方法
#import <Foundation/Foundation.h>
@interface A : NSObject {
NSString *brand;
CGFloat size;
BOOL power;
NSDate *creationDate;
}
-(void)ma;
@end
補充: 一般上我們的認知是void是一種不會回傳東西的方法,但事實上(void)本身就是一個型態,回傳的也是void。

建立實體物件的方式

  1. 儘量不要用 new, 用 alloc, 因為 new 其實包含了兩個動作: alloc 加 init, 並不是所有的物件都會以init開始, 可能會initWithXXX, 所以與其這樣不如就自己alloc之後再挑init的方法,我們常看到的寫法就會這樣:
A *a = [[A alloc] init];
[a release]; //物件都要記得release, 他們會成對出現

我該如何選購 婚禮APP / 婚紗APP 呢?

婚禮APP提供新人更多的便利性

舉辦婚禮是新人一輩子最重要的事,從過去的婚禮佈置、婚禮相簿、婚禮MV、到婚禮小物,都是新人在婚禮中不可或缺的籌備項目之一。在行動市場逐漸擴大的同時,婚禮APP也即將成為新人的焦點。香港藝人周家蔚就曾在婚禮中花費港幣20萬元量身訂作自己的婚禮APP,提供給自己的親友使用。現在行動應用正夯,在台灣與香港已經有廠商陸續推出與婚禮有關的行動APP,打算搭上這波智慧型手機普及率節節攀高的趨勢。在台灣作婚禮APP的廠商主要有三家,在截稿為止(三大廠商都有可能在日後做變動或更新),我們可以來比較看看這三家的差別,新人消費者應該如何作選購?

享幸福典藏APP 愛婚享 inWedding
產品定位 電子喜帖 相簿 賓客統計 互動 電子相簿 電子喜帖 相簿 互動
iPhone 支援 支援 支援
Android 支援 支援 支援 4.x 以上
iPad 支援 支援 支援
Android Pad 支援 支援 部分支援
PC網頁瀏覽 支援 支援 不支援
親友下載方式 Appstore, GooglePlay, 官網下載, 掃描QRCODE安裝, 可公開/新人可決定是否要輸入密語 掃描QRCODE安裝後輸入關鍵字 Appstore, GooglePlay安裝後輸入關鍵字
相簿功能 照片分類彈性大 相簿模板變化較多 照片分類固定
照片數量 相簿15本,相片750張 35張 52張+30張自我介紹照
留言數量 不限 無法留言 9999篇
大頭貼照相 支援 不支援 不支援
賓客統計功能 支援 不支援 不支援
地圖導覽 支援 不支援 支援
婚禮倒數 支援 不支援 不支援
現場刮刮樂 不支援 不支援 支援
婚禮現場即時訊息 支援 不支援 支援
照片和活動內容可隨時更改增刪 透過瀏覽器即可編輯 不支援 需要另外下載Ourinwedding App做編輯
離線瀏覽 不支援 支援 支援
贈品 桌卡20張/捧花/謝卡200張 選一 謝卡200張 支援
網站公布售價* NT3999 NT1999 NT3999

*視促銷方案而定

理想中的創業夥伴

有人說尋找創業夥伴就如找夫妻,你每天都會跟他朝夕相處待在同一個空間,完成一個共同的目標。有些人會找跟自己背景相似的人來創業,這樣討論起來容易互相理解,也可以一起解決問題;亦有一些人會找跟自己背景不同的人,以補足自己缺乏的知識領域。兩種模式沒有好壞,完全看創辦人本身的個性。

就我個人而言我理想中的創業夥伴應該要具有以下的特徵:

1. 創業的過程一定會有很多的pivot,所有關於公司營運方向的想法都能與夥伴們討論,非擅自作主,最重要是要集體達成共識,創業團隊的價值觀要一致,在短,中,長的目標能夠達成統一。最好是能夠以商業模式圖作為共同的語言。

2. 創業過程一定會遇到誘惑:如曝光的合作機會,其他公司的外包等等。如果公司是以開發自己的平台為目標就應該專注在公司的產品上,而非花費過多的時間去幫助其他公司開發產品。

3. 意見相左也應該聆聽夥伴的意見,如果夥伴中的組長無法接受其他組員的意見,往往會造成其他夥伴失去了提供意見的動力。多向你的夥伴問:「你的看法如何?」他一定會覺得你尊重他。

4. 創業夥伴能在處事風格之間互補,如深謀遠慮人才與執行力人才;分別在技術,市場,營運等環節能獨當一面:必須先是一個優秀的經理人,才能做好創業者的角色。
5. 大家的貢獻要能夠讓彼此感到平衡;不能某人做比較多,某人做比較少;這樣就很容易造成團隊的不平衡。我知道有些東西是很難用「看」跟「感覺」去衡量的,所以每周報告自己對團隊的貢獻就變得很重要了,如果每次會議都保持沉默,誰會知道你對團隊付出了甚麼?

6. 團隊各司其職,各自扮演好自己的角色,最好能先完成給團隊一個榜樣看,證明自己的能力後再進行管理;不應該甚麼事情都請別人處理,尤其指派一些重要的任務其他人去負責,或制定一些不可能達成的KPI,只會讓其他人對公司愈感灰心。

7. 不會公器私用:公司的員工也是公司的財產,若指派公司的員工來處理自己的私事(尤其在上班時間)更會讓其他創業夥伴覺得很不可靠。

其實在沒有共同經歷創業的艱苦磨合之前,是很難真正判斷一個創業夥伴是否適合自己,很多時候往往是不經一事,不長一智。創業者需要做出決定和選擇,有時候需要先「同居」,往後的日子互相磨合後考慮是再「結婚」。

KTV點唱系統的User Experience

到KTV唱歌是現代人不可或缺的娛樂之一,好朋友三五成群到KTV唱歌就是想好好展現自己的歌喉或是宣洩平日在工作上的壓力。到KTV唱歌最重要的就是點歌系統了,KTV從過去的翻簿子點歌到後來的數位點歌幫助了人們可以快速找到新歌,也讓業者有新歌可以直接上傳到系統即可,不需要花太多錢在印刷上。

數位點歌還有很多優點。你可以看到你點過的歌曲,可以隨時插播,可以快速的透過歌手名字找到歌曲,可以看到點播率最高的熱門歌曲等等。

在台灣去好樂迪點播歌曲時,我們的搜尋順序是 歌手 > 男女歌手 > 筆畫 > 歌曲。要找歌手時得一邊用手畫在腿上,一邊口中碎碎念出筆畫的順序,這樣做可以找到我們要找的歌手,但有時候筆畫算出來後未必能夠直接找到我們要找的歌手,因為很多姓氏的筆畫數是相同的。好樂迪還有一個最令我困擾的功能是插播,一旦進入要播放的前三首歌曲,你就不能預先取消或插播 (可是明明就還沒到這個歌曲,為甚麼不能取消),可見點播系統跟播放系統的同步作業是有很大的時間差的。往往我們不小心點錯的歌曲都必須得在播放的時候再按下”切歌” 來切換下一首。(但這樣就浪費了一些時間啦)

不久後台北出現了星據點,除了吃的部分有更多的選擇外,對於客戶點歌的便利性有考量到更多,你可以在房間的周邊看到小小的觸控螢幕,方便其他的USER不用越過重重人群,只為了跑到點歌系統前點歌,增加了點播的便利性。不過在,在找歌手點歌的部分還不是最佳的。

今年過年回到了馬來西亞新山的KTV 大嘴叭消費,發現大嘴叭的點播系統真的太強大了(比起去年看到的系統更新了不少)。搜尋歌曲的方式除了維持傳統的歌星搜尋外,亦增加了歌手的分類,讓你可以直接分類華人歌手,國外歌手等等;如果不想要一個個瀏覽,你可以使用輸入的方式來搜尋歌曲,我們就不用再大費周章算筆畫啦!你可以用漢語拼音或直接在觸控式螢幕上手寫輸入你要找的歌手或歌曲。(手寫輸入真的很讚,將搜尋歌手的時間降得更低)

一個系統的使用者介面可以看出業者對於客戶的用心。好樂迪也許是最先進入KTV市場的業者,由於系統太久都沒有更新,所以很容易就被後起之秀追過了。星據點在餐飲的服務上有幫消費者考量更多,點歌系統的功能亦比好樂迪更強更友善。大嘴叭的UI背景雖然FANCY了一些(介面的按鈕很多,可能對於很多人來說會很雜亂),但是我用得最友善,最容易找到我想找的點播系統。

每個行業都應該為自己的客戶提供更棒服務,才有辦法提升整體的服務品質,去年與今年兩次到大嘴叭消費我看到明顯的進步,很高興看到馬來西亞的KTV業者有這樣的成長。