2011年12月31日 星期六

Year of Apple


不知道是習慣還是大圍氣氛的影響, 在一年的最後一天來個總結已變得理所當然。無論如何,自我反省確能認清當前所處的位置,修正向目標邁進的方向。

2011 年犯太歲之年再次讓我有突破性的發展。今年由打工一族轉為創業一族,由為別人打工到為自己打工。亦能讓太太全身投入照顧女兒。

公司成立了 9 個月,開發了 18 個 Apps,收支仍未平衡,與目標仍有差距。當中有為了爭取知名客戶而殺價,亦有自家 Apps 生產量不足,收入低乎預期之緣故。客戶數目方面,除了原本關係內的客戶之外,只增加了 4 位客戶,當中 3 位是由我引入。成績不好,但總算是有個交代。 始終我的時間是放在技術開發而不是市場開發。 明年繼努力。

管理方面,每周一次例會的習慣已經確立。每月一次評分的制度亦得以實行。是以 Lakoo 的打分制為藍本的在地化改良機制。分數不影響當月收入,只作為花紅分配的基準,另加入對同事當月的評語。目前運作順利。同事們亦漸趨成熟,能勝任較大的工作。因此公司安排了一筆花紅分派給同事,以表達一點心意。還有加薪。

在技術方面,HTML5, WebSocket, 圖案辨識,藍芽連線,PNG 解密,Windows Server 安裝,ASP.Net 編程,GPS 推送通知等都是今年學到的東西。 是收獲不差的一年。

機體開發方面,只在 Mac 機上成功以藍芽連線,機乎沒有進度。今年白過。

總括來說,在「Year of Apple」之年投放了大部份時間給蘋果,學到很多新鮮事,識到很多新鮮人,是之前打工生涯沒有涉及的範疇。

2011年12月30日 星期五

iDemo + ScreenSplitr

幾天前網遊時發現了一段踢爆「iWiFiHack 騙局」的 YouTube 影片,當中能在 Lion 上顯示一個類似 iPhone 4 模擬器的東西,而畫面竟然是真機的畫面。在好奇之下向影片上傳者查詢,原來他是在 Mac 機上使用 iDemo 及在 iPhone 上使用 ScreenSplitr,利用 USB 線把手機畫面傳到 Mac 機上。我立即安裝軟件試試,結果成功了。可是畫面的幀數比較低,是美中不足之處。不過這個方法能有助把 BeyondZ 作品拍成影片,上傳到 YouTube 內。

2011年12月29日 星期四

iExplorer

最近發現了一個好用的程式。它的名字是「iExplorer」。透過 USB 來瀏覽 iOS 裝置上的檔案。無論是 JB 與否一樣能用,只是 JB 機能查看所有檔案內容。對於開發人員來說,也是一個很好的除錯工具。除此之外,用來黑 Apps 也是十分好用。

2011年12月28日 星期三

在舊式 Mac mini 啟動 AirDrop

Enable AirDrop on Old Mac mini

我一直都很奇怪,為何家中的 Mac mini 找不到 AirDrop。今晚終於明白,原來不是所有的 AirPort 卡都支援 AirDrop 功能。不過,網友們提供了一個打開 AirDrop 的方法。啟動 Terminal 後輸入:

defaults write com.apple.NetworkBrowser BrowseAllInterfaces 1
killall Finder

2011年12月27日 星期二

iWiFiHack 騙局

今天網遊時發現一個叫「iWiFiHack」的 iPhone App,聲稱能在 iPhone 上破解 WEP 密碼。好奇的我當然找來一試。在 iPhone 4 運行這個 App 時覺得奇怪,當時用 iPod touch 4G 跑 WiFi Analyzer 能搜出來的 WiFi 熱點,竟然在 iWiFiHack 找不到。倒找到了幾個不在列的熱點。晚然找到了熱點,那不妨嘗試一下。誰不知五個熱點中有四個都沒有反應,只有一個能選。點選後,程式表示要收集 75000 份數據才能破解密碼。原本打算把它閣在一旁時,卻在數到 100 時畫面便轉為分析中,不一會還顯示出密碼來。

在驚訝效能奇高的同時,我感覺到有點不對勁,於是立即嘗試連接。結果失敗了。其後我把 iPhone 的 WiFi 關掉再試,竟然能搜出相同的熱點,亦同樣能收集數據,更能破解密碼!豈不神奇乎?當刻便知道 iWiFiHack 是一個騙局。用戶在下載前要完成一份資料,作者就是憑這些資料來賺錢...。

2011年12月25日 星期日

MacBook Air - BlueTooth - ATmega128

整理 Servo 資源期間,發現之前購買了 14 隻 ES08A,另加雜牌細 Servo 4 隻,共 18 隻細 Servo。這些 Servo 都是用來製作 Amigo Mini 二足步行機械人,打算在 2012 年繼續。

至於 MCU 板的話,手頭上有 ATmega-128 x2, Renesas x2, NEC V850 x4, Fujitsu FR60 x2。當中運算能力最強的是 FR60。不過體積較大,留待大機體才使用。迷你級別的機體會使用最細小的 ATmega-128。

硬體確認好了,輪到軟件。五年前製作機體時,用的是 Windows XP 平台的 Fujitsu 手提電腦;現在是 MacBook Air。兩個完全不同的平台。我最希望能在 MacBook Air 上完成編程及操控。首先測試了操控方面。原本用 USB to Serial 接線,可是沒有 Lion 的驅動程式。嘗試過其他牌子的 Lion 驅動卻不成功,於是嘗試另一個方式。接駁的方法是利用 MacBook Air 內置的藍芽跟一塊藍芽模塊無線連接。藍芽模塊的 UART 有線接到 ATmega-128 的 UART 接口。由於 2010 年時已編寫好 Servo 操控程式並儲存在 ATmega-128 之內,所以能直接測試及觀看數據。另外,在 Lion 內安裝 ZTerm 來觀看 MCU 的輸出,設定為 38400/8/N/1。打開電源,看到 2010 年 5 月所寫的程式輸出;再試試輸入 a 鍵能列出數值,一切正常!確認能使用 MacBook Air 操控。

2011年12月23日 星期五

機體資源整理

近來有點興致,想花點時間製作一部六足。整理過手頭上的資源,發現有 22 隻 Futaba Servo 及 10 隻 TowerPro MG995。我打算用 18 隻 Futaba Servo 製作。上次做了一點便放棄了,希望今次能完成一台!

2011年12月20日 星期二

Dissection of iFighter 1945

得到 Lakoo 高總的通知,上周六第一次踏進《創業公社》參與「Dissection of iFighter 1945」研討會。iFighter 是 EpicForce 公司在 iOS 上一個出色的射擊遊戲。而這個會就是製作人分享從公司的管理、遊戲開發的工具、營銷的策略上的分享。

最吸引我的是「公司管理」方面的心得。EpicForce 以發展目標是「貴精不貴多」,他們確實做到了。在過去二年時間開發出四款遊戲,全部都曾被 Apple 推薦過,而且銷量也很好。他們的 CEO Stanly 指出公司的同事都是有經驗、有能力、有態度的人。當然這樣的人才也要得到相對的回報才能留得住。加上有競爭力的公司文化,確實是一間很有熱誠的公司。籍著 2011 年的尾聲,也讓我重新思考一下 BeyondZ 在 2012 年應該往哪個方向走。

有興趣的朋友不妨回重溫一下當日的分享:
http://www.youtube.com/watch?v=xQVrzK97ol8

2011年12月16日 星期五

UIActionSheet 新貌

UIActionSheet New Look
今日無意之中看到一個新的介面。好奇之下追尋一下介面的名稱。這個介面是在 Album > Photo Stream > Picture > Export 中得來的。那個位置原本是 UIActionSheet 介面,相信是因為選項太多而自動變成這個樣子。我做了一個小實驗,加入 8 個選項,結果證明了這個是 UIActionSheet 來的。

2011年12月13日 星期二

ASP.NET 的 Connection String

之前替客戶開發了一個基於 ASP + ASP.NET 環境下的「推送通知」服務器;但她們的電腦部為了方便日後的發展,要 BeyondZ 把結構改為只使用 ASP.NET。對於不喜歡 Microsoft 的我,實在是一個折磨。在改版的過程中,一直卡在 MSSQL 的連接上面。Google 了很多很多,無論是連接的方法,以至 Connection String 的內容都有不同版本,變化萬千而且不完整。無法拿來即用。我把原本 ASP 使用的設定套到 ASP.NET 卻無法成功。最後原來在 Web.config 內的 SqlConnectionString 設定以下數值便可:

Server:WINDOWS_SERVER\SQLEXPRESS; Database=beyondz_db; Uid:user_sa; Pwd=12345678;

ASP.NET 的代碼為:
//  Get device token from MSSQL
String strSQLConn = System.Web.Configuration.WebConfigurationManager.AppSettings["SqlConnectionString"];
SqlConnection sqlConnection = new SqlConnection(strSQLConn);
sqlConnection.Open();

SqlCommand cmd = new SqlCommand("SELECT * FROM deviceTokenTable", sqlConnection);
SqlDataReader reader = cmd.ExecuteReader();

String deviceTokenList = "";
while (reader.Read()) {
deviceTokenList += reader["deviceToken"] + ", ";
}

2011年12月8日 星期四

《中國神馬天氣》上架

China Whats Weather
兩個星期前開始進入《聖誕提交高峰期》,平日七天內的審批、三天內的重審,變成八九天的審批、八九天的重審。最近有幾個 App 提交了,都需要很長時間才能通過審批。期間被拒絕了的更花上超過 20天時間才能通過。

今天最新上架的《中國神馬天氣》就是經過長時間審批的一個作品。這個 App 是免費下載的,有興趣的朋友不妨試試。如有任何意見,歡迎給我們留言指教指教。

http://itunes.apple.com/hk/app//id479136416?mt=8

2011年12月7日 星期三

Device Token

BeyondZ 旗下使用 Push Notifications 的 App 開始多起來,是時候整頓統一一下。在整理的過程中,突然想到一個疑問:在同一部 iPhone 上如果有兩個 App 都使用 Push Notifications 的話,那它們傳回的 Device Token 是一樣的嗎?雖然我做了數個含有推送通知的 APP,連推送服務器都有 PHP 及 ASP 版本。可是由於數據都是儲存在不同客戶的服務器,而且代碼中的設定不同,暫時無法印證。

根據我的認知,Device Token 是跟 App 的,亦即是說不同 App 在同一台機上是會生成不同的 Device Token。在網上搜了一下,分別有兩個說法:一是跟機,另一是跟 App;甚至是兩者皆有。使用開發證書的是跟機,使用正式推送證書的是跟 App。就此我向有經驗的朋友 Tommy 查詢。他是現時負責《帝國》正體版、簡體版、英文版的項目經理。他指出《帝國》這三個版本都含有推送通知,而這三個版本當然是使用不同的 App ID。結果是 Device Token 也不一樣。有了這樣的實證,我想不用做實驗也能放心地相信吧。

2011年12月6日 星期二

打開光碟機門

Open DVD Tray with Non-Mac Keyoboard

如果你的 Mac 機使用非 Mac 鍵盤,而又要打開光碟機門的話,可以利用 Finder 到 System/Library/CoreServices/Menu Extras 找一個名為 Eject.menu 的檔案,雙擊它便可。

2011年12月3日 星期六

Base 64 to NSData

今日嘗試了破解 Snoopy 遊戲,發現它的數據是以 NSUserDefaults 來儲存,而且用 Base64 來編碼。為此寫了以下代碼:

+ (NSData *)dataWithBase64String:(NSString *)string {
NSString *alphabet = @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-";

NSString *encodedString = [string stringByPaddingToLength:(ceil([string length]/4)*4) withString:@"A" startingAtIndex:0];
NSUInteger base64Length = [encodedString length];
int rawLength = (base64Length*3)/4;

char *dataByte = (char *)malloc(rawLength);
memset(dataByte, 255, rawLength);

int offset = 0;
for (int i=0; i<base64Length; i+=4) {
char a = [alphabet rangeOfString:[encodedString substringWithRange:NSMakeRange(i+0, 1)]].location;
char b = [alphabet rangeOfString:[encodedString substringWithRange:NSMakeRange(i+1, 1)]].location;
char c = [alphabet rangeOfString:[encodedString substringWithRange:NSMakeRange(i+2, 1)]].location;
char d = [alphabet rangeOfString:[encodedString substringWithRange:NSMakeRange(i+3, 1)]].location;

UInt32 value = ((UInt32)a<<18)+((UInt32)b<<12)+((UInt32)c<<6)+((UInt32)d<<0);

dataByte[offset++] = (value>>0)&0xff;
dataByte[offset++] = (value>>8)&0xff;
dataByte[offset++] = (value>>16)&0xff;
}

NSData *decodedData = [NSData dataWithBytes:dataByte length:rawLength];
free(dataByte);

return decodedData;
}

2011年12月2日 星期五

樹狀選單的處理方法

Develop Tree Menu by Using isKindOfClass

今日要製作一個介面,當中有一個 UIButton。點選按鈕後會出現一組清單。清單是以 UIActionSheet 的形式出現。點選 UIActionSheet 後會再出現相應的 UIActionSheet 或完結整個選擇過程。這種分枝再分枝的結構,我稱之為樹狀選單。

為了方便改動,我把所有數據以 Plist 方式儲存。這樣就容易作出修改及加減層次。

在程式開始時載入 Plist 備用。當 UIActionSheet 傳回 clickedButtonAtIndex 後,只需要讀取所選中的層次,如果是 NSDictionary 的話,代表還有下一層;如果是 NSNumber 便是完結。
 NSString *key = [brandKeyArray objectAtIndex:buttonIndex];
id brandValue = [brandDictionary objectForKey:key];

// If value is NSNumber then it is end of levels
if ([brandValue isKindOfClass:[NSNumber class]]) {
...
return;
}

// Otherwise, keep dig into next level
if ([brandValue isKindOfClass:[NSDictionary class]]) {
NSDictionary *dictionary = (NSDictionary *)brandValue;

NSString *string = [key substringFromIndex:2];
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:string delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

NSArray *array = [dictionary allKeys];
NSArray *sortedArray = [array sortedArrayUsingFunction:keySort context:NULL];

for (NSString *brandNameWithSortingKey in sortedArray) {
NSString *brandName = [brandNameWithSortingKey substringFromIndex:2];
[actionSheet addButtonWithTitle:brandName];
}
self.brandDictionary = dictionary;
self.brandKeyArray = sortedArray;

[actionSheet showInView:self.view];
[actionSheet release];
}

2011年12月1日 星期四

訊號生成

Pulse Generation

自有 iPhone 以來都很想製作利用 iPhone 進行操控的機體,可是實在有太多東西需要學習,一直都沒有實行。單單要利用 iPhone 的 UART 接口跟 MCU 進行溝通,便要使用 Open Toolchain;也要找到合適的硬件接口。我曾到過黃金商場、鴨寮街及售賣 iPhone 配件的店舖,找到的 USB 接口都只有 4-5 條針的接線,而 TX 及 RX 針是沒有。所以無法使用坊間的 USB 接頭來改裝。外國網上有出售這樣的接頭,但連運費的整體成本卻十分之高。就算這個問題得到解決,Open Toolchain、Jailbreak、編程都各有障礙。

除了 UART 接口外,其實還可以用耳機接口來達成。這個相對地來得簡單,所以便著手嘗試。這個方式是利用程式生成所需要的訊號,利用 MCU 的 A2D 接口把訊號數值化,再進行控制。為了能快速實作,會先以車型機體作測試。

我選了《訊號生成》作為第一項工作。在網上找到一個音頻生成的程式,稍為改裝便能使用。可是阻礙出現了。我需要生成像方波般的訊號,可是數值正確,但波形則不是想要的模樣...。

2011年11月29日 星期二

iPhone 4S


我的 iPhone 4S 64GB 終於到達,代表了 iPhone 4 的退役。今次購買 iPhone 4S 的目的完全是為了 Siri。不過第一次使用時,Siri 卻無法幫忙...。

2011年11月28日 星期一

AudioToolBox 在 iPad 2 上失聲「鳥」

AudioToolBox is not working on iPad 2

過往的 iOS 作品中,我會使用 AudioServicesCreateSystemSoundID 來載入及播放音樂音效;但最近發現在 iOS 5.0.1 的 iPad 2 上,音效卻無法播放。試過把音效的取樣及頻律改變都無法把情況改變過來,最後改用了 OpenAL 才能成功。

2011年11月22日 星期二

好爸媽好幫手

Good Parents

最近替 ING 開發的「好爸媽好幫手」已經推出,這是一個免費的軟件,適合為人父母的 iPhone 用戶使用。有興趣的可以到 http://itunes.apple.com/hk/app//id479184649?mt=8 下載。

2011年11月17日 星期四

最好一講

為了「How can developers build free apps that still earn?」這個演講,今天再到會展一趟。雖然專程過去,但沒有抱持甚麼期望。演講開始時,講者 Manav Gupta 把現時 App 的營運分為五個種類:Free, Paid, Freemium, Datafeed,還有一個不記得了,是類似 High class 之類有貴賓感覺的內容。對我來說則只有 Free, Paid 及 Freemium 三種。他提出了免費軟件跟私穩資料方面的取得要有一個平衡,因為大多數的免費軟件都會獲取用戶一定程度的資料,要如何不過火位就要邊做邊試,但最重要是要讓用戶有選擇的權利。這個概念很好,有助最近一個軟件的設計。另一個重點是要把握重點,去除不必要的東西,也令我從不同的角度去思考。總的來說,我認為這個演講是兩天中最好的一個。

2011年11月16日 星期三

App Planet 2011

今天出席了 App Planet 首天 4 個的講座。最令我期待的是 Angry Birds 開發公司 Rovio 亞洲區 SVP Henri Holm 的演講。SVP (Senior Vice President) 是我第一次接觸而且感到其怪的詞語。Vice President 不是最大的頭頭麼,為何會有 Senior?是不是還有 Junior 呢?

是次演講的內容主要是圍繞營運 Angry Birds 的思路及心得。我自己不喜歡 Angry Birds,但眼見它一個又一個的版本,一個又一個打進 AppStore 排行榜,想必當中的營銷技巧十分之了得。Henri Holm 以「無限大」符號來形容營運 Angry Birds 品牌及 Fans 的情況,實在有很多值得學習的地方。那段 Angry Birds HamOWeen 動畫真的很精彩!從中能學到引入新角色的技巧。有興趣可以到 http://www.youtube.com/watch?v=xD_m8jKJQg0 觀看。

2011年11月14日 星期一

iPhone 4S 8GB Black...

每年的 11 月都是我情緒上的低谷時間,今期不是遺失了信用卡,就是身體有點毛病。醫生叮囑我要多點休息,少一點對著電腦。那我只好對著 iPhone 4。拿起 Apple Store App 把玩,無意中發電了 iPhone 4S 8GB 黑色版。以我的認知,iPhone 4S 最小容量為 16GB,想必這個 8GB 是樓下的 iPhone 4 吧。希望 Apple 人員快點修正。

2011年11月11日 星期五

活用 Automator


我很喜歡把事情交由電腦處理。例如在開發 iOS 軟件時,把高清圖轉換成標清圖的工序,就是交由電腦處理。這個工序只是把圖像讀進來,縮小 50% 後儲存。有些朋友可能會使用 Photoshop 內的 Action;但若沒有 Photoshop 的話,其實可以使用 Mac 內建的 Automator。

啟動 Application 內的 Automator 後,解立新 Workflow,把圖檔拖到右方的區域;再在左方點選 Photos。把 Scale Images 拖拉到右方。這時會多了一個工序。把「To Size」改為「By Percentage」,在後方方格填上 50。點選右上角的「Run」便會立即把選擇了的檔案縮小成 50%。這個 Automator 還有很多功能,大家慢慢嘗試。

2011年11月10日 星期四

語系化的開始畫面

前陣子下載了 Facebook Messenger。第一次執行這個 App 時,那個日本語的開始畫面讓我感覺到有點不對勁。一直以來的開始畫面只有一個,像 Facebook 這樣全球化的 App 理應使用英語;而且在香港 AppStore 下載的更不可能是日本語。我的 iPhone 是使用日本語作為介面。有這樣的情況,意味著 Default.png 都語系化了。

爆開 IPA 一看,證明了我的假設成立;再翻查網上的舊聞,原來這個功能早在 2010 已經出現,只是我沒有留意到。原來除了 Default.png 外,Icon.png 也語系化了。這個小小的功能卻是十分的體貼呢!

2011年11月9日 星期三

取得 IP 地址

Get IP Address

最近 BeyondZ 的一個開發項目需要把多台 iOS 裝置連線。我的想法是透過 IP 地址來定位,以下是在 iPhone 取得 IP 地址的方法:

- (NSString *)getIPWithNSHost  {
NSArray *addressArray = [[NSHost currentHost] addresses];

for (NSString *address in addressArray) {
if (![address hasPrefix:@"127"] && [[address componentsSeparatedByString:@"."] count] == 4) {
return address;
}
}
return @"IPv4 address not available";
}

2011年11月8日 星期二

LEGO NXT Remote


星期日那天砌好的 LEGO NXT 車,還欠編程部份便能走動。昨天在網上找到了一個名為 LEGO NXT Remote 的 Mac 用軟件,用戶可以利用它來對 NXT 進行操控。我試過了果然簡單地便能使用。這樣我便不需要自行編寫程式,女兒便能享受原本星期日所帶來的樂趣。

2011年11月7日 星期一

來年目標


每年的生日,我都為自己訂下未來一年內達成的目標。上年的目標是增加一倍收入,而且要是穩定的收入,讓太太可以成為全職媽媽。這個目標達到了。由於兩位女兒都開始長大,可以去較遠的地方,所以很想擁有一台轎車。來年將會是這個目標。要達成這個目標,收入將要提升 HK$10,000 才可以。對於現時的情況,確實有點難度,希望一年後能達成。

之前有好幾年的目標都是完成一隻二足步行機械人,硬件上是完成了,軟件上也算完成了,但卻不能好好步行,電池續航力也只有 10 分鐘,需要好好改進。我也希進能好好完成這個多年的目標。

P.S.: 多謝同事們為我搞的生日會 ^_^)v

2011年11月6日 星期日

創新科技嘉年華

InnoCarnival 2011

今天參觀了「創新科技嘉年華 2011」,在「小童群益會」的攤位設置了兩台利用手提電腦遙控的 LEGO 車。我的大女兒感到興趣,於是排隊試玩。可惜剛輪到她的時候,我們已經夠鐘離開。爸爸承諾回家後做一架出來作為補償。參考了今天拍攝的相片,花了半小時把它製作出來。結構有 80% 相似,加點自己的設計。硬件方面已經準備就緒,只欠編寫程式便大功告成。

2011年11月5日 星期六

Apple eMac を入手しました

這台 eMac 已經投標了一個星期,今天才能跟賣家交收。由於低估了 eMac 的重量,徒手把它從鰂魚涌搬回公司,實在極之吃力。可能年紀已過巔峰之齡,機能開始下降,要多做點運動補救補救。

花了 HK$800 購入的 eMac 保養得很好,開機很快,亦沒有上一台 iMac G4 的畫面問題;跟機的原裝 Apple Keyboard 已經買不到,再加上 Apple Mouse 總共三件產品,感覺很值得。對這件收藏品十分滿意。

2011年11月4日 星期五

iPhone 4S

今天是 iPhone 4S 在香港預購的日子。等了一晚 Apple 網頁都沒有更新,最終在早上 8:12 在 Apple Store App 內首先開賣。當我完成所有交易之後,網頁還沒有更新。不久,iPhone 4S 版面出現,之後連 iPhone 版面也掛上 iPhone 4S 的內容,正式可以購買。到早上 9:06 分,所有顏色及型號的 iPhone 4S 都已經銷售一空...。歷時差不多一小時,跟以往 iPad 2 推出時的情況一樣。

2011年10月28日 星期五

Apple iMac G4 を入手しました


一直以來都很想添置一台 Apple iMac G4。因它的外觀設計特別吸引。然而一直都沒有行動。一來是金錢的考慮,二是 G4 已經是多年前的產品,不知道從何入手。幸而,在十月初購入的股票,在兩星期後出售而有點收穫,加朋友 Simon 的明燈指引,終於踏上了尋找 G4 之旅。

最後,我選擇跟一位 Yahoo 賣家以 HK$800 交易。產品亦在今天到手。雖然它的價錢不是最平的 HK$600,但比最貴的 HK$1000 來說,是中等的價位,而且產品的保養尚算不錯,性價比最高。原本對於用來收藏的產品,應該是選保養最好的那台。但對於我來說,花 HK$800 購買一台不會用的機器,實在是一種揮霍...。我的目標是購入 iMac G3, iMac G4, iPhone 3G 及 iPhone 3GS,現在 iMac G4 已經到位,並跟它的 iMac 後輩一起生活。希望其餘的機器能在今年內集齊吧!

2011年10月25日 星期二

Zombie in Xcode 4


進入 Xcode 4 後很少用 NSZombieEnabled 這個功能,今天在升級「Rate My Pics」時需要用上。但在 Xcode 4 下改變了位置,需要按下 Command-Option-R 鍵,在 Run - Diagnostics 中打勾。

2011年10月24日 星期一

PNGDecrypter

花了點時間優化了我的「PNGDecrypter」,令它更方便使用。這個工具能把 IPA 內的 PNG 解碼還原。整個項目的源碼已經上傳到 Google Code。一如以往,這個作品同時支援 iPhone, iPhone 4, iPad 及模擬器。安裝好後,只需要利用 iTunes 把 PNG 拷到 PNGDecrypter 的資料夾,執行 PNGDecrypter 並點選右上方的 (+) 鍵。便會把所有 PNG 解碼。解碼後的 PNG 會儲存在 output 目錄內。

有興趣的朋友可到 http://code.google.com/p/iphone-png-decrypter/ 下載 ZIP 包;或者用 SVN 也可以。如有任何意見,歡迎賜教。

2011年10月23日 星期日

LEGO 轉盤


公司在廣交會上展出的 3D 硬件得到矚目關注,我們決定要為它拍攝介紹影片。我很想拍下 360 度的產品圖,所以利用了 LEGO MINDSTORM NXT 組裝了一個轉盤,以協助拍攝的工作。

2011年10月22日 星期六

Gundam AW


今天在日本 AppStore 下載了幾個優秀的 App,其中一個是「ガンダムAW」。我發現遊戲內的 3D Model 做得不錯,於是拿它來了一次 Reverse Engineering。在 IPA 內儲存了很多 PNG 圖檔,我慣常使用 iPhonePNGApp 來把 PNG 解碼還原,不過這個軟件並不能解開所有的 PNG,有些時候解不到,有些時候則能解開一半。我是追求卓越的人,實在不容許有這個情況存在。在了解過解碼不是困難的事之後,花了 15 分鐘寫了一個解碼程式,幸好一切運作正常,亦能解開所有 PNG 圖檔作為參考。

2011年10月19日 星期三

又是 M$ 惹的禍(三)

The M$ Problems Part 3

又是 M$ 的問題,不知為何 M$ 老是把簡單事情複雜化。我想在 SQL SELECT 的同時,加入一欄日期比較結果數字,若是內容未過期為 0,已過期則為 1。在 MySQL 下十分簡單:

SELECT *, expiryDate <= now() AS expired FROM newsTable ORDER BY launchDate DESC

在 MSSQL 下卻變得複雜:

SELECT *, (CASE WHEN expiryDate <= GETDATE() THEN 1 ELSE 0 END) AS expired FROM newsTable ORDER BY launchDate DESC

要是拿內容來作運算的話,那 MSSQL 的語句能否處理都成問題…。

2011年10月18日 星期二

「走奶風暴」的啟發

由日本公司 NAVER Japan Corp. 開發的「LINE」於上周在香港迅速竄紅,成為免費榜人氣 No.1。更在我的朋友圈中極速取代 WhatsApp 成為預設吹水工具;甚至在 Facebook 隨處可見 LINE 的 QRCode。可惜不到兩天,這個勢頭又被 WhatsApp 奪回。

事緣由一篇誇張的報導引起。加上 LINE 本身的設計不良,以及在 Facebook 上的收費傳聞所拖累。使得大眾對 LINE 的信心大減。由於信心受到打擊,LINE 已經在我的朋友圈中快速及徹底地消失,再次投入 WhatsApp 懷抱。還將 LINE 最吸引的表情符號及貼紙移植到 WhatsApp 之中。

今次的事件可以說峰迴路轉,見識了「來匆匆,去也匆匆」的實證。也學到了:
  • 要超越既有的強敵,只需要捉到一個關鍵的需求
  • 一個傳聞,足以扭轉局面
  • 需要即時及時的危機處理
  • 介面設計要簡單清楚,弄巧可以成拙
  • 不要隨便使用 SMS,尤其是對用戶沒有好處的部份
  • 讀取個人資訊時要讓用戶知道
  • 需要顧及使用者的私隱保護
  • 2011年10月17日 星期一

    談創意

    很多從事創作的公司都崇尚工作自由的空間,認為有助創意思維;BeyondZ 也是走這條路線。不過,我也認為「嚴緊」及「局限」的環境也能激發創意。我自小時的社區經常有毒友出沒,所以父母禁止外出,要求留在家中。在缺乏趣味的生活中,我激發出創意,創作出不同玩意自娛,也從而找到了目標,要成為一位遊戲設計師。在當時沒有互聯網、沒有遊戲課程、沒有遊戲設計書籍、沒有多少遊戲公司的年代,要進入遊戲界基本上是沒途徑。就是因為有沒有途徑,才會嘗試不同的方法。而這個目標卻在我十八歲時達成了,一做便做了十八年。

    2011年10月16日 星期日

    二手 Mac 價


    聽聞新高登是二手 Mac 機的集散地後到此一遊,發現真的有很多 Mac 機的蹤影,尤其是 iMac。至於我最希望添置的檯燈 Mac 就發現在三家店中出現,其中兩家只作陳列,並不割愛。剩餘的一間則售 HK$1000。由於機身較黃及殘舊,加上在 Yahoo 拍賣場的都打理得比較好,所以最終都沒有出手收購...。

    2011年10月15日 星期六

    ASP.NET 指令筆記

    ASP.NET Commands

    在編寫 ASP.NET 指令時要留意大小寫,例如 String.Length 寫成 String.length 便會發生問題。
     
  • 以 GET 形式取得 URL 參數
    String tokenString = Request.QueryString["token"];
     
  • 以 POST 形式取得 URL 參數
    String tokenString = Request.Form["token"];
     
  • 取得字串長度
    String username = "Steve Jobs";
    int stringLength = username.Length;
     
  • 把字串轉換成數字
    int value = Convert.ToUInt16(string);
     
  • 防止出錯
    On Error Resume Next
  • 2011年10月14日 星期五

    又是 M$ 惹的禍(二)

    The M$ Problems Part 2

    每一次在 M$ 環境下工作都特別多問題,今次的受害者是 Facebook App。之前在 IE 中已經出現特別多問題,本來整個 App 已經完成。但由於客戶十分著重保安,我們的 App 在經過 IRM 掃瞄後而不獲通過。其中一點是要加入 Session ID 檢查來減低被黑的風險。改動後的版本在 Safari, Chrome, Firefox 這些大品牌瀏覽器都能運作正常,唯獨是 IE 卻出現問題。原因是在 iframe 下的頁面,其 Session ID 每次都會不同,造成無法比對。

    經過同事的研究,發現跟 W3C 的 Platform for Privacy Preferences 有關。最後找到解決方法是在每頁的開頭部份加入:
    HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

    2011年10月13日 星期四

    Lion vs NAS

    又自從升級到 Lion 之後,便間中無法連到公司的 NAS 伺服器,實在很不方便。原來 Lion 不再支援「DHCAST128」協議。這個正正就是大多數 NAS 採用的協議,所以公司的 QNAP NAS 也難逃一劫。不過,由於 DHCAST128 的保安程度不夠高才會被 Apple 所取締,對使用者來說也是多一點保護。

    但是無法連接 NAS,我便無法工作。幸好今天在網上 http://www.alexanderwilde.com/2011/04/os-x-lion-connection-error-with-afp-and-workaround/ 找到了情報,提供了解決方法。
  • 啟動 /Applications/Utilities/Terminal
  • 輸入 sudo chmod o+w /Library/Preferences 然後拍一下 Return 鍵
  • 輸入 defaults write /Library/Preferences/com.apple.AppleShareClient afp_host_prefs_version -int 1 然後拍一下 Return 鍵
  • 重新開機
  • 在 Finder 中選 Connect to Server
  • 輸入 NAS 伺服器的地址,然後按 Connect
  • 啟動 /Applications/Utilities/Terminal
  • 輸入 sudo defaults write /Library/Preferences/com.apple.AppleShareClient afp_disabled_uams -array “Cleartxt Passwrd” “MS2.0″ “2-Way Randnum exchange” 然後拍一下 Return 鍵
  • 輸入 sudo chmod o-w /Library/Preferences 然後拍一下 Return 鍵
  • 重新開機
  • 2011年10月12日 星期三

    Steve Jobs 的八字

    時間過得十分之快,今日就是 Steve Jobs 的頭七。原來 Steve Jobs 已經離開了七日,事情就像昨天發生一樣。聽我一個篤信鬼神的姑姐說,指她曾到過另一個世界,那裡已經是有電腦系統。我希望真的如她所說,這樣 Steve Jobs 就能在另一個世界再次大展拳腳,造福那個世界的生命。

    對於 Steve Jobs 的一生,我嘗試在八字層面,用我有限的功力來了解一下。
    Steve Jobs 生於 1955 年 2 月 24 日。轉換成八字是:

    X 日 食 印
    O 丙 戊 乙
    O 辰 寅 未
    X 食 偏 傷

    由於沒有出生時間資料,所以留空。而出生當天的 12 時辰為:
    戊子、己丑、庚寅、辛卯、壬辰、癸已、
    甲午、乙未、丙申、丁酉、戊戌、己亥

    死於 2011 年 10 月 5 日早上 3 時左右。轉換成八字是:

    甲 癸 丁 辛
    寅 已 酉 卯

    2011 年虛齡為 57 歲,剛剛轉入十年壬申大運。意味著是轉運而死。看看八字的解說。丙火日生於寅月,木旺之月。乙寅木透,木火通明,木及火的威力大增。火炎土燥之命,所以脾氣非常利害。食神透出,乃聰明之象。木為桃花,位置在年柱,於 30 歲前受人愛戴,但 30 歲後不見桃花,理應不及 30 歲前的程度。既然事實是 30 歲後也受歡迎,則可以假設時柱也見桃花。那麼會得出以下兩組八字:

    財 日 食 印 | 印 日 食 印
    辛 丙 戊 乙 | 乙 丙 戊 乙
    卯 辰 寅 未 | 未 辰 寅 未
    印 食 偏 傷 | 傷 食 偏 傷

    前者寅卯辰木局,時干辛金,在癸酉及壬申二運時能令金透,增加金的威力。後者則似乎沒有導致喪命的伏線。再以兄弟姊妹數目來印證,前者是 1 或 2;後者是 1 或 4;而事實是 2。而子女數目,前者是 1 或 4;後者是 1 或 5;事實是 4。初步印證了 Steve Jobs 是生於早上 5 至 7 時之間。

    30 歲時正值乙亥運的一半,即是由乙轉亥的時間,Steve Jobs 被 Apple 公司解僱,進入人生低潮,可以假設 Steve Jobs 是忌「水」。乙亥運中的乙是桃花,所以由 25-30 歲時受人歡迎。順帶一提,蘋果五行也是木,桃花也;而電腦行業屬火,證明 Steve Jobs 五行喜木火吧。那 56 歲起的壬申大運中,壬是大河江水,給了致命一擊。不過,亥也是壬水的化身,為何 30 歲時卻沒事?我估可能是因為乙亥運的乙在幫忙,水生木之緣故,減弱了水的威力之餘,亦加強了木氣,繼而生火。而在壬申運則剛好相反,申為金,時干辛金透出,金的威力增強。金生水,再生旺了壬水的威力。加上身故時辛卯流年,丙辛化水,連自己都化成水;酉月金又生水。忌水者見大水,豈不發生大事!但 10 月 4 日是壬辰,水的量度比癸已日多,為何不是前一天出事?以我的功力則解答不了。而上一個大運癸酉也是金生水,為何不是早十年出事?以我估計,是因為月干戊土跟癸水合化成火吧。沒錯,又是火。冥冥中自有主宰。

    2011.10.12 更新
    找到網上討論,似乎小弟全部錯晒。
    http://forum.juxian.com.hk/viewthread.php?tid=5980&extra=&page=1

    2011年10月11日 星期二

    ASP.NET 下的推送通知(二)

    Push Notification Using ASP.NET Part 2

    雖然上一次能令 Windows Server 執行 .asp 及 .aspx,可是當我行用 SharpDevelop 建立一個新的 ASP.NET Web Application 後,這個新的項目卻無法執行。原來需要在 IIS 中為網頁建立 Application Name。設定後執行卻發現錯誤。解決方法是在 IIS 中加入 .NET Framework 4.0。終於能夠執行 SharpDevelop 的示範程式了。確認沒問題後,我加入了從網上找到的 Push Notification 代碼。編譯一切正常!下一步便是加入 deviceToken 來進行實際操作。
    Macintosh
    1. Open "Keychain Access"
    2. Select "Apple Development IOS Push Services: 9B6T95NAS2:9B6T95NAS2"
    3. Export a .p12 file
    4. Upload .p12 to server

    Windows Server
    5. Double click on .p12 file to install it
    6. Grant access to ASPNET account:
    DOS> winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "Apple Development IOS Push Services: 9B6T95NAS2:9B6T95NAS2" -a ASPNET
    7. To grant access to Network Service:
    DOS> winhttpcertcfg -g -c LOCAL_MACHINE\MY -s "Apple Development IOS Push Services: 9B6T95NAS2:9B6T95NAS2" -a "Network Service"
    8. To grant access to Authenticated Users:
    DOS> winhttpcertcfg -g -c LOCAL_MACHINE\MY -s"Apple Development IOS Push Services: 9B6T95NAS2:9B6T95NAS2" -a "Authenticated Users"
    9. Make sure port 2195, 2196 was opened on firewall

    2011年10月10日 星期一

    ASP 指令筆記

    ASP Commands
     
  • 取得 URL 列的參數
    Dim udid
    udid = Request.QueryString("udid")
     
  • 執行 SQL 指令
    Dim connection
    Set connection = Server.CreateObject("ADODB.Connection")
    connection.Open "DSN=dsnName; UID=sqlUser; PWD=sqlPassword; Database=database"
    connection.Execute sqlString
     
  • 設定輸出的 Content Type
    Response.ContentType = "text/html"
     
  • 取得當前目錄的檔案清單
    Dim folder
    Dim fileObject
    Dim folderObject
    Dim fileArray

    folder = server.mappath(".")
    Set fileObject = server.createobject("Scripting.FileSystemObject")
    Set folderObject = fileObject.getfolder(folder)
    Set fileArray = folderObject.files
     
  • 把字串分拆成為 Array
    Dim resultArray
    resultArray = split(Contents, ",")
  • 2011年10月9日 星期日

    Think Different


    我很喜歡「Here's to the crazy ones」這支廣告,尤其是 Steve Jobs 旁白演譯那個。很有共鳴、很有感覺。原來一直使用的 OSX 中也出現了這支廣告的蹤影,它就藏在 TextEdit 圖示裡頭。把圖示放大,看到的就是廣告的對白,很有意思。

    2011年10月8日 星期六

    UIImageView to UIImage

    在編寫 App 時,我喜歡把 UIView 以組編列。例如很多時會彈出一些視窗,假設名稱為 windowView。我會把視窗內的所有 UIView 類的東西都放進 windowsView 內,亦即是 [windowView addSubview:uiview]。這樣做方便在改變視窗位置時,其他的 subviews 會自動跟著一起移動,不用再作處理。如果我要把視窗畫面輸出成 UIImage 或 PNG 檔時,亦會變得很方便,只要以下四句指令便能完成。

    // Get image of an UIImageView
    UIGraphicsBeginImageContextWithOptions(photoImageView.bounds.size, YES, 0.0f);
    [photoImageView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    2011年10月6日 星期四

    Missing Steve Jobs


    今天是非常沉重的一天。Steve Jobs 在重陽節離開了我們。世界上失去了一位天才、一位精神領袖。素未謀面的他改變了我的生活、改善了我的收入,也拓闊了我的視野。多謝 Steve Jobs,永遠懷念你。

    2011年10月4日 星期二

    ASP.NET 下的推送通知(一)

    Push Notification Using ASP.NET Part 1

    最近的一個項目需要使用 ASP.NET 來進行「推送通知」。對於改用 Mac 已有三年的我,M$ 方面的產品知識已經變為零,需要重頭學起。不過,越是接觸 M$ 的產品則越不想用;就像今次的「推送通知」,對於 ASP.NET 方面的訊息實在少之又少。

    安裝好 Windows Server 之後,ASP 也能運作,可是某部份的內容卻無法執行。原來那些內容是 .aspx,預設是關閉的,需要在 IIS 下打開才能運作...。而在網上找到的 C# Push Notification 源碼,生成出來的是 DLL 及 EXE。暫時仍找不到使用它的方法。由於時間無多,希望能盡快解決!

    2011年10月3日 星期一

    又是 M$ 惹的禍

    The M$ Problems

    公司正在製作的一個 Facebook App 已經進入尾聲,本來只剩下客人對介面上的微調。可是今日卻發現使用 https 後,在 I.E.8 下會發生幾個問題。一是 A href 方或的 Javascript 無法執行,二是 Facebook 的 Profile 相片無法顯示,三是 A href 到外部網址時,竟然被 Facebook 包著,而內容又被禁止執行。至於其他瀏覽器如:Chrome, Safari, Firefox 則完全運作正常,實在不禁想罵 M$ 一頓!

    2011年9月30日 星期五

    透明 UIWebView

    Transparency UIWebView

    UIWebView 是一個很好用的物件。在《帝國 Online》的對話中,很多時一段對白做要用上數種顏色,就是用 UIWebView 來達成。不過 UIWebView 本身是沒有透明色,就算用上 [webView setBackgroundColor:[UIColor clearColor]] 也無法令它有穿透的效果。有時實在很不方便。原來用以下方法能夠把 UIWebView 設定為透明。首先把 UIWebView 按以下設定:

    [webView setBackgroundColor:[UIColor clearColor]];
    [webView setOpaque:NO];

    然後在 HTML 內把 Body 設定為透明:

    body {
    background-color: transparent;
    }

    設定後會遇到一個問題,就是 UIWebView 變成了透明,但它的影子卻沒有。要把影子也變成透明,我們可以:

    NSArray *array = [webView subviews];
    UIView *shadowView = [array objectAtIndex:0];
    array = [shadowView subviews];
    for (UIView *uiview in array) {
    if ([uiview isKindOfClass:[UIImageView class]]) {
    [uiview setHidden:YES];
    }
    }

    2011年9月29日 星期四

    8 號風球

    早上起來,一直不看新聞的我,因為天色不妥而打開電視,發現已掛上 8 號風球。在香港,天文台在 8 號風球懸掛之下,要求市民留在安全的地方;亦意味著大家有一個假日。不過,在現今網絡時代,像 BeyondZ 這些軟件科技公司,很多工作都可以在家處理,亦可以透過互聯網存取公司檔案。所以即使人不在辦公室,仍然可以工作。

    作為員工,難得遇到 8 號風球,當然不想工作。作為老闆的,當然希望工作進度不受影響。既然公司是行「責任制」,只要員工依時完成工作,即使打風沒所謂,遲到早退也沒有問題。如果同事的在家工作,我是十分感激。但我認為公事私事是要找個平衡點,偏向任何一方都不健康。所以,無論我是打工一族還是老闆一族,我都會落力地工作及準時放工,真是有需要時才在家中工作。

    2011年9月27日 星期二

    滿意的作品

    自從 YSL 的項目完成後,便立即全力以赴製作友人公司的 iPhone App。這個作品花了很多心血製作,是繼 YSL 之後的精緻作品,到目前為此我都十分滿意。從畫面的構圖到色調的運用,從日曆的編程到圖表的繪畫,都花了不少功夫及技巧。當中亦嘗試了新的技術,比起時代廣場的 little diary 有長足的進步。十分多謝時代廣場找我寫 App,給我帶來很多機遇及經驗。

    話說回來,今次這個 App 客戶端部份的開發進度已經完成大半了,相信一個多星期後便能完工;不過還有伺服器端的部份。希望能在十月中完成,十一月中上架吧!

    2011年9月26日 星期一

    BeyondZ 徵才啟示

    BeyondZ Recruitment

    BeyondZ 現正接受第二階段人才招聘。今次招聘的職位是「Mobile Apps Developer」編程方面的人才。如果你是人才、如果你看好手機軟件業發展的前景、如果你想一起成長、如果你想發揮專長、如果你懷才不遇、如果你沒有經驗,都歡迎加入 BeyondZ 的小家庭。把你的履歷及聯絡資料,甚至是過往作品,發信到 job@beyondz.com.hk。合適者會約見面試。不要錯過進入這個產業的最後黃金期!

    2011年9月24日 星期六

    為數字加入逗點符號

    Number Seperator

    在製作 YSL VIP Catalogue 時,我們希望把服裝的售價數字弄大一點而又不想包含 $, NT$ 之類的單位符號。編寫了一段長代碼後,發現 $ 符號沒有了。但若改為台灣地區後,NT$ 仍然會出現,實在摸不著頭腦。最後找到一個簡單有效的方案:

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setGroupingSize:3];
    [formatter setGroupingSeparator:@","];
    [formatter setUsesGroupingSeparator:YES];
    NSNumber *number = [formatter numberFromString:string];
    NSString *commaString = [formatter stringFromNumber:number];
    return commaString;

    2011年9月23日 星期五

    PNGShrink

    進入了 Lion 時代之後,其中一個常用的軟件 PNGCrusher 因不支援而無法使用。經過一輪搜索之後,找到了一個代替方案 PNGShrink。它的用法跟 PNGCrusher 一樣,只是效能更加優勝。有興趣的朋友可以到 http://www.kainjow.com/pngshrink.htm 下載。

    2011年9月21日 星期三

    開發部例會

    每個星期一的早上都是 BeyondZ 開發部舉行例會的時間;一個源自於在 U1 管理企劃部時的習慣。選在星期一的原因有幾個:一是希望在第一個工作天去明瞭該周的工作內容及目標,讓同事有充份的日子作出時間上的安排。二來是提供一個緩衝時間,萬一工作延遲,也能讓同事在星期六及星期日追回進度而不致影響表現。三來希望同事準時返工,萬一遲到便會被大家捉過正著。四來是減低「Monday Morning」效應的影響。在還沒回魂之際,用聽多過用腦就最好了。

    至於開會的內容,主要是檢討上周的進度、提出工作上遇到的情況及處理方法、本周的安排,以及一些事項的公佈。前者進度是讓部門同事了解各個項目的進度,甚至增加相互之間的競爭。提出情況及處理方法則讓同事分享經驗,改善大家的設計及流程,也能讓經驗傳承,這一點對一個企業來說十分重要。本周安排能使同事清楚該周的工作。而最後的事項公佈則令員工明白部門及公司的情況,增加歸屬感。

    初期例會中沒有最後的部份,經過 U1 同事的要求要加入。由於 U1 老闆的決策經常朝令夕改,使得員工們都無所適從,而且多數只有高層得知最新情況,其他同事均一無所知。一個團隊如沒有清𥇦一致的目標是做不出好作品;而且說明多一點,也能令員工明白多一點。雖然有時會因為了解而分開,但未嘗不是一件好事。就例如向員工清楚說明本年度凍薪,可能會造成同事辭職,但總好過支吾以對、吞吞吐吐。同事是知道的。所以我一直坦誠待人。要是同事有好的發展而離開,只好怪公司沒能力挽留。

    2011年9月20日 星期二

    公司願景

    這幾天在看「放膽去闖」,書中作者大前研一先生及柳井正先生都提出經營一家公司需要有一個願景。那麼 BeyondZ 的願景是甚麼?坦白說我們從來沒有想過。恰巧今天收到 SmarTone 跟 Vodafone 分拆的電郵,內文提到了 SmarTone 的願景:

    「數碼通會貫徹一向的策略,透過與別不同的服務及產品定位,以創造及提供無可比擬及更物超所值的客戶體驗。其超卓的網絡表現、獨家服務及貼心的客戶服務於客戶及市場中已備受廣泛認同。」

    作為老闆,我希望公司能「提供客戶優質的服務,創造全新的體驗」。這個只是本人的意願,並不代表 BeyondZ 其他董事的想法。看來需要開個會討論一下。

    2011年9月19日 星期一

    2011年9月18日 星期日

    很忙的一星期

    Busy Week
    今個星期特別忙。一天的中秋節假期,原有的項目開發,加上為「YSL VIP 之夜」的工作,時間實在不夠用,也因此沒有更新 Blog 的內容。今次 YSL 使用了 BeyondZ 兩件作品,其中一件使用了最先進的 WebSocket 技術,能把數十台支援 HTML5 機器的數據同步。為了提供最優質的作品及確保過程一切順利,花了很多時間檢查、測試、除錯、支援及危機處理。由於是晚出席的嘉賓都是上流名人,萬一出錯便會影響到客戶的形象;使得我感到壓力,不容有失。多謝各方同事的配合,當晚的程序運作十分順利。能讓客戶滿意,實在很高興。我也可以放下心頭大石,休息一下之後,又要趕製另一客戶 ING 的兩件作品!

    2011年9月12日 星期一

    自製 iPhone 充電電池(二)

    DIY iPhone Charger Part 2
    應朋友的要求去測試自製充電的耐久力,發電差了 5% 時,iPhone 4 出現無法充電的訊息。我把電池接到 iPhone 及 iPod Nano,它們均能充電。一直充,一直充。最後連 iPod Nano 也無法充了。不是因為沒有電力,而是電壓下降。iPhone 4 的要求比教嚴緊,所以最快出現無法充電的情況...。

    2011年9月11日 星期日

    自製 iPhone 充電電池

    DIY iPhone Charger

    最近 iPhone 4 的電消秏得較快,相信是 WhatsApp 及 Facebook 的用量多了的緣故。有朋友向我推介 Eneloop 差電,它是以 USB 為接口,所以不限定 iPhone 使用,可換性高。我親身試過其效能不錯,可是價格由朋友買的 $499 升至現時 $599,實在有點貴。我決定嘗試自製一個。在網上找到了 iPhone 的接口說明;發現只需要數款電阻便能成事。按著網頁的指示製作,結果成功能進行充電。

    部件一覽:
    AA x4 電池盒連開關 = HK$5
    電阻 33K x2, 22K x2, 25K x1 = HK$2.5
    USB 延長線 = HK$10
    2700MAh 充電池 x4 = HK$78

    2011年9月8日 星期四

    設定 NSLocalizedString 所使用的語言

    Force NSLocalizeString to Use a Specific Language

    平常我們要按 iPhone 的語言設定來讀取相應文字會使用 NSLocalizedString(@"textKey", nil)。要是在英文語言環境下當成正體中文又如何做呢?原來十分簡單,只要以下設定就可以:

    NSString *path = [[NSBundle mainBundle] pathForResources:@"zh-Hant" ofType:@"lproj"];
    mainBundle = [NSBundle bundleWithPath:path];

    之後不用 NSLocalizedString 改用 [mainBundle localizedStringForKey:@"textKey" value:nil table:nil]。所讀取的文字都當系統是中文環境,從而讀進中文字串。不過這個方法要在程式最開頭使用。

    2011年9月7日 星期三

    Windows Server 2003 SP2

    今天找來一位高手表演安裝 Windows Server 2003 SP2。我一直在旁偷師。這次的安裝,緣於一個大公司客戶找 BeyondZ 開發 Facebook App,而她們的伺服器全是 Windows Server 2003 SP2。所以 Facebook App 也順理成章地用 ASP 來撰寫...。當中還用到了 MSSQL 及 SSL。看過高手的示範之後,我在 VirtualBox 內嘗試安裝一次,中間遇到了問題,但最後還是解決了!雖然繳付了高昂的費用,但確確實實上了一課,吸收到了新知識,還能認識多一位朋友,算是不錯!

    2011年8月31日 星期三

    Facebook App

    Facebook App 是其中一樣打算學的技術。剛剛從友人公司中接到訂單,替她們開發一個 Facebook App,正正提供了一個很好的機會給我學習。花了一整天時間,還未能理解到它的運作方式;導致時要 Allow 一時就不用;一時有 Facebook 框架包著,一時就沒有。現在我以 PHP 來製作,稍後便要改用 ASP.NET,看來還有很長的路要走...。

    2011年8月30日 星期二

    伺服器推送(三)

    Push Notification Part 3

    剛剛接到另一個大公司的項目,會使用到伺服器推送。要發出推送,首先要建立一連串的證書才行,步驟如下:

    1) 在 Developer Portal 建立新的 App ID
    2) 完成後點 Configure 設定


    3) 在 Enable for Apple Push Notification service 打勾
    4) 並點選 Development Push SSL Certificate 後方的 Configure 按鈕


    5) 這時會要求你上傳 Mac 機的證書



    6) 打開 Application - Utilities - Keychain Access
    7) 點選 Keychain Access - Certificate Assistant - Request a Certificate from Certificate Authority...


    8) 輸入電郵地址及名稱後,點選 Saved to disk,按 Continue 鈕把證書儲存到桌面


    9) 返回瀏覽器,點選 Choose File 並選擇剛才輸出到桌面的證書,然後按 Generate


    10) 推送證書便能成功生成,點 Continue 繼續


    11) 點 Download 下載推送證書


    12) 雙擊桌面上的 aps_developer_identity.cer 把它匯入到 Keychain Access
    13) 返回 Keychain Access,點選 Login, My Certificates
    14) 在 Apple Development IOS Push Services 上右擊後選 Export "Apple Development IOS Push Services"


    15) 設定一個密碼後選 OK
    16) 把證書以 aps_development_cert.p12 命名
    17) 展開 Apple Development IOS Push Services 並點選你的 Private Key,右擊後選 Export


    18) 把密匙以 aps_development_key.p12 命名
    19) 有了以上兩個 p12 檔後,便要把它們轉換成 PEM 格式
    20) 打開 Terminal 並跳轉到桌面目錄
    21) 輸入 openssl pkcs12 -clcerts -nokeys -out aps_development_cert.pem -in aps_development_cert.p12
    22) 輸入 openssl pkcs12 -nocerts -out aps_development_key.pem -in aps_development_key.p12


    23) 輸入 openssl rsa -in aps_development_key.pem -out aps_development_key_noencrypt.pem 生成一個沒有加密的版本


    24) 輸入 cat aps_development_cert.pem aps_development_key_noencrypt.pem > aps_development.pem 輸出最終證書檔


    25) 證書製作完成