2013年7月30日 星期二

網址列中出現的文字串

Session Path

在開發 ASP.Net 的網頁應用時,發現網址列中會出現一串文字(紅字部份)。原來那是系統自動生成的 Session 目錄。若不想它出現,就要把 Web.config 內 sessionState 的 cookieless 設定為「false」。

2013年7月29日 星期一

重整證書需要一天時間?

跟客人一起提交改版後的《好爸媽好幫手》時,遇到組譯除錯版時沒有問題,當一組譯正式版時則出現問題。找到了是 Distribution 證書過期引起。試過把整張證書刪除後再重新製作,問題仍然沒得到解決。最終是等上一天時間,證書便由紅色轉回綠色。可是另一問題又來了...,出現「Architectures」問題。

我吩咐客人把「Architectures」增加「armv6」及「Valid Architectures」改為「armv6」。前者無法被修改,而後者則沒有問題。假如在這個時候組譯,會出現 Icon 0x0 問題。最終發現是要求的 iOS 版本太舊,把它由 4.0 改為 4.3 則沒有問題!其餘部份不用改也能組譯。

2013年7月26日 星期五

HandBrake


最近一個網頁項目需要自動播放影片,而這個網頁更需要支援 iPad。因此不能使用 Flash 的播放器,最好是使用 HTML5。同事發現了一件奇怪的事,花了一天時間也解決不來,於是我親自出馬。

在 AfterEffects 輸出的影片,在相同的設定下,有些能在 iPad 上播放,有些則不能。這似乎是關於影片壓縮方法或編碼問題。在網上找來一套叫《HandBrake》的免費軟件,發玩能解決手上的問題。用它轉換出來的影片,終於能在 iPad 上播放了!

2013年7月25日 星期四

修正兌換碼問題

Fixing Codes Problem

客戶的兌換碼出了問題。原本小寫英文字母在真正的擦擦卡上的位置有所出入,像圖中的「g0155a4q」看上去是「90155a4q」。所有穿底的字母都往上移,造成使用者分辨不出 9, g, q 的分別,從而無法增加積分。為了方便使用者,解決方法最好是自行把兌換碼中凡是出現 9, g, q 的地方都換上 9, g, q,看看新增的兌換碼會否跟原有的相同。測試後證實沒有一個相同。這樣就能用以上方法解決問題。最簡單的是把新兌換碼匯入到數據庫,程式也不用改,避免出現問題。但這個做法會把原先的 56000 個兌換碼暴升至 158086 個。是原來的三倍,不是最好的方法。於是,想出了另一個較為可行的方案。當使用者輸入兌換碼後,計算出可能的新兌換碼,然後以這些碼一拼更新到數據庫。由於所有新兌換碼都不會在數據庫出現,因此只有原先正確的兌換碼才能更新到數據庫中,從而解決問題。還有另一個更簡單的方法,就是把所有 g 改為 9。做過測試,修改後的兌換碼同樣沒有跟數據庫的兌換碼相撞,所以這個方法也是可行。


No result

No result

2013年7月24日 星期三

在 CentOS 安裝 HAProxy

Installing HAProxy on CentOS

因為零成本及教學資源豐富,公司使用 Linux 作為服務器的平台。經過兩年多的成長,已經有很多項目接上服務器的 Port 80 及 443,一直都運作順暢。

最近遇到一個問題希望能夠解決。客人公司使用 Windows Server,為了能方便給她們測試網頁項目,特地設定某個 Port 給她們連接。不幸地,她們的 IT 關口很高,服務器只對外開放幾個常用的接口,像是 80, 443。造成無法成功連接,往往要客人回家後才能進行測試,實在不便。

向朋友請教後,發現 HAProxy 能幫到手。它可以按照域名來分派數據流到指定服務器。如:gucci.pacess.com 指向服務器 A;timessquare.pacess.com 指向服務器 B。要安裝 HAProxy 也很簡單,只要 SSH 進服務器後輸入:

yum -y install haproxy

安裝後要知道 HAProxy 的版本,可在 Terminal 下輸入:
/usr/sbin/haproxy -v
haproxy --version

2013年7月23日 星期二

BeyondZ 年度鉅作.二


花了四個月時間開發的動作遊戲,第一關設定在香港的舊城區。控掣方面想過用浮動式十字掣,也想過使用搖桿。但實際操作過後,還是決定使用固定的十字掣。

2013年7月22日 星期一

ASP.Net: 把兩張圖片合而為一

Merge Two Images in ASP.Net

正在洽談的一個項目有需要把兩個圖案合而為一,於是做做實驗。客戶的服務器是 Windows Server 2003 運行 ASP.Net,實驗也是在這個平台上進行。我寫 ASP.Net 經驗寥寥可數,要在網上找點資料才能完成。花了一個小時,完成了測試。以下是 C# 程序:
//  Load coupon master image
var couponImage = Image.FromFile(_ROOT+_OUTPUT_FOLDER+_INPUT_FILE);
using (couponImage)  {

   var width = couponImage.Width;
   var height = couponImage.Height;

   //  Generate a random value
   Random random = new Random((int)DateTime.Now.Ticks);
   int randomNumber = random.Next(10, 99);

   var timeStamp = DateTime.Now.ToString("yyyyMMddhhmmss");
   var outputFile = _PREFIX+timeStamp+randomNumber+".jpg";

   using (var bitmap = new Bitmap(width, height))  {
      using (var canvas = Graphics.FromImage(bitmap))  {

         //  Load code image
         var codeImage = Image.FromFile(_ROOT+_OUTPUT_FOLDER+_INPUT_FILE);

         canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
         canvas.DrawImage(couponImage, new Rectangle(0, 0, width, height),
                          new Rectangle(0, 0, couponImage.Width, couponImage.Height),
                          GraphicsUnit.Pixel);
         canvas.DrawImage(codeImage, _CODE_X, _CODE_Y);
         canvas.Save();
      }

      try  {
         bitmap.Save(_ROOT+_OUTPUT_FOLDER+outputFile, ImageFormat.Jpeg);
      }  catch (Exception ex)  {
         Response.Write("Error...");
         return;
      }
   }

   Response.Write("<img src='"+outputFile+"' /><br>"+outputFile);
}

2013年7月19日 星期五

BeyondZ 年度鉅作


公司正的一套動作遊戲,由兩位程序員及三位美術負責,已經花了四個月時間開發;距離 Alpha 版應有的內容,基本上都差不多了。對於完全版,估計還需要做多兩個月。計起上來即是半年時間。遊戲不算大型,但在現今的手機世界,花半年時間、三位全職人員,以我這小公司來說可算是鉅作。以 HK$10,000 一位來算,單單人工成本已經是 $10000 x3 x6 = $90000。何況不會是 HK$10,000 工資。

原本預計三個月完成的工作,加上經驗有限的同事,不善的管理,最終落得成本大增。要賺回並不容易。雖然時間花得很多,但我對質素很滿意。同事們很用心開發,圖畫畫得很好,也加入了很多香港的元素。希望大家的努力,能得到玩家們的認同。

2013年7月18日 星期四

PixelViewer v1.10


友人有一個圖檔想破解,應該是《Puzzle and Dragon》的檔案。在 HexEdit 打開後,見到重複性很高的數值,意味著圖片沒有被壓縮,能用 Photoshop 以 RAW 格式打開,或者更簡單的用小弟開發的《PixelViewer》來打開。我當然選用後者。單看內容 00 10 00 10 00 4C 00 4C 基本上能確定圖像是 16-bits。可是,試過了所有格式,都沒有一個能完全正確解開。反映了《PixelViewer》的不足。

在 16-bits 格式中,遺留了 ARGB-4444 及 ABGR-4444 這兩款,於是順便加入這兩個格式,也修正了兩個錯誤。更新後的版本為 1.10,同樣放在 Google Code 開放讓人下載。當中有執行檔源碼兩種。適用於 Mac 的 Mountain Lion。新版本能正確地把圖片打開了!

2013年7月17日 星期三

拉闊圖書館.七:拉闊有茶點!


又是每月一次的《拉闊圖書館》時間。由小 Yan 子講解「拉闊有茶點!識茶,泡茶,飲茶!篇!」。多謝 Yan 教了我們茶的知識、泡茶的技巧、飲茶的學問。不說不知原來茶色有這麼多;不品不嘗原來茶可以這麼的香。


品茶要用很熱的水,即煲!


用來清洗茶具的器皿。


茶道原來有這麼多工具。


第三款品嘗的滇茶。


左邊的咸綠豆餅配上茶,真的很好味!


小 Yan 子在清洗用具。


很趣緻的隔茶小工具。


第三次泡出來的普洱。

2013年7月16日 星期二

同 Zebra QLn220 玩遊戲


最近在研究在 iPad 經手提打印機出票。借來了一台 WiFi 版的 Zebra QLn220。在 Zebra 官網下載了 SDK 後嘗試連接,但沒有說明書,搞來搞去也搞不好。奇怪的是公司的無線網絡明明加了密碼,在沒有設定的情況下居然能取得 IP 地址。在機上也找不到設定網絡的地方。後來想到這種玩意可能為減輕成本,可能要接上電線經由電腦設定。在官網查找一會,證明我的想法是對的,而且那個設定程式只有 Windows 版...。介面設計實在太屎,根本不知道如何設定。嘗試了不同的組合,終於成功連接公司網絡,取得 IP 地址。可是,又一個問題發生。

官方的示範程式終於能跟打印機。程式內能示範打印文字、圖片、PDF。通通都能連接成功及傳送數據,在打印機的顯示屏能清楚看到接收數據,但偏偏卻毫無反應。問過專家也不知問題出在哪裡,只好繼續「Try and Error」。

問題今日得到解決。回想打印機的情況,相信它一定收到數據。再回想示範程式,也真的能成功連接。而我留意到一點,就是在成功計接後,會出現「Detecting Printer Language」,並顯示 ZPL。既然有 ZPL,即是意味著有另一程語言。亦可能是因為言語不通而出現問題。翻查示範程式的源碼,發現另一種是 CPCL。我嘗試修改一下程式,輸出 CPCL 指令到打印機。結果真的成功打印了!再翻查官網的 QLn220 頁面,原來也有說明它是使用 CPCL 指令。真的一頭霧水,官方的 SDK 居然出現這樣的大 Bug,實在需要檢討檢討!

2013年7月13日 星期六

同浮點數玩遊戲

Playing Game with Floating Point Number

暑假開始了!女兒沒功課、沒溫習,那就外出玩耍。附近商場上星期新開了 E-Cube Club 兒童遊樂場,雖然一位小童連一位家長要 HK$150 十分昂貴,但快樂一天也不錯,而且女兒有女兒玩耍,我有我在 MacBook Air 上繼續開發《AMIGO Controller》。


今天主力開發「動作編輯器」的編輯功能。花了兩三小時已經完成,但測試時發現數值上有所出入,只好先行除錯。明明算法沒有錯,但結果卻爭一點點。就像圖中的 x 一樣,4x10x20 得出是 799。


如這張 0.9 不等如 0.9。


又例如這張 0.9-0.1-0.8 竟然是 -5.96046e-08。全部都是差一點點。嘗試過很多方法都無效。反正只用上小數點後兩位的數值,最後決定把所有數值改為 int,把原有的數值乘大一百倍來計算。

2013年7月12日 星期五

製作 iOS 7 的圖示遮罩

iOS 7 Icon Mask

打算為新的應用製作 iOS 7 線條的圖示,在網上找到了公式。但如何能把公式變成遮罩圖?原來 Mac OS X 內建的 Grapher 可以達成。Apple 真的很體貼!要是 Microsoft,不是這個功能沒有,就是那個也沒有,個個都要下載或附費。在 Grapher 輸入好公式後,能輸出 .eps 檔案。之後在 Illustrator 之類的線性繪圖軟體中把線變成圖像,便能在 Photoshop 上加工。

2013年7月11日 星期四

MakiBox A6 LT


一直都有關注 MakiBox 的立體打印機的進度,知道量產的日子將近。今日在 Facebook 看到 Maker 網友貼上關於 MakiBox A6 HT 的評論後,認為打印成器質素很好,以一台 US$200 的立體打印機來說,絕無可挑戰的地方。於是立即網上訂購。跟他們溝通過,知道整個七月都要忙於處理之前的訂單;我這張單希望能在八月處理吧!

2013年7月10日 星期三

生產 Code 128 格式的條碼

Generate Code-128 Bar-code

客戶正在製作的一個網頁需要由服務器生產 Code 128 格式的條碼,但負責的 Vender 在技術上無法達成,於是向我求救。經過研究後,找到了一個利用 Javascript 程序的解決方案。有興趣的朋友可參考:https://code.google.com/p/bwip-js/

2013年7月9日 星期二

AMIGO Controller: Hotkey Setting


「動作編輯器」畫面中同時可以設定動作的熱鍵,遇上重要緊急的動作,可以快速使用熱鍵出招!目前容許其他動作設定相同熱鍵,想清楚後可能不接受已使用之熱鍵。

2013年7月8日 星期一

AMIGO Controller: Motion Editor


《AMIGO Controller》中的四個頁面基本上已經完成了三個,剩下最複雜的「動作編輯器」。

我很想用戶只要一台 iPad 便能處理機體所有的動作,包括播放、編輯、上傳、下載,但又不想介面太過豐富,所以花了很多心機盡量令畫面簡潔。上圖是「動作編輯器」中設定「動作按鈕」顏色的部份。使用了 UIPickerView 及 UIPopoverController 來達成。以下是當中的代碼:
- (void)showColorPicker  {
 CGRect rect = CGRectMake(0, 0, 320, 216);
 UIViewController *controller = [[[UIViewController alloc] init] autorelease];
 UIView *uiview = [[UIView alloc] initWithFrame:rect];
 [controller setView:uiview];
 [uiview release];

 UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:rect];
 [pickerView setTag:MOTIONEDITORVIEW_TAG_COLOR];
 [pickerView setDelegate:self];
 [pickerView setDataSource:self];
 [pickerView setShowsSelectionIndicator:YES];
 [pickerView selectRow:_motion.themeID inComponent:0 animated:YES];
 [uiview addSubview:pickerView];
 [pickerView release];
 
 UIPopoverController *popViewController = [[UIPopoverController alloc] initWithContentViewController:controller];
 [popViewController setPopoverContentSize:rect.size animated:NO];
 [popViewController presentPopoverFromRect:_colorButton.frame inView:self.view  permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
 [popViewController setDelegate:self];
 self.popController = popViewController;
 [popViewController release];
}

2013年7月5日 星期五

公主床

Princess Bed with Slider

女兒一直都希望擁有一張公主床,床邊最好有一條滑梯。花了點時間把構想繪畫出來。到深水埗找了三間傢俬店報價,當中兩家為 HK$6000,一家報 HK$5300。到最平那家落訂時,才真正了解我的設計,結果索價 HK$8500。超資,認為不值,覺得店家不專業等各項因素,最終還是放棄。假如香港有數控輸出木板服務,可以自製傢俬,我想一定幫襯!

2013年7月4日 星期四

Robi


網友 R 在 Facebook 介紹了「Robi」給我。他是日本有名機械人設連師「高橋智隆」先生所設計。我很喜歡這種 Cute 版設計。


今次 Robi 將以雙周刊的形式推出,每期 1,990yen,附送 Robi 不同部位的零件。集齊 35 期後能拼出完成的 Robi。詳情可到 http://deagostini.jp/rbi/ 瀏覽。


首七期特價 790yen。計算一下,Robi 的價錢即是 $790x7 + $1990x28 = $61,250,折合約港幣 $4,778。Robi 有聲音認識機能,算是十分便宜的機體。以這種形式出售機體不是第一次。最大的考慮就是某些期數賣斷時,整架機體便不能完成。然而,日本人真的很細心,在網頁上已說明賣斷的商品會再次發行,即是說最多等一下,不會真的斷貨。這樣真的較為安心。目前不接受海外訂閱,有興趣的話只能到誠品,或日本書店訂購。

有一點要留意,以上期數不包括充電座。充電座會在 36-60 期以分拆形式上市。

2013年7月3日 星期三

把 Mountain Lion 的聲音經 AirPlay 輸出到 Apple TV

Sound Output From Mountain Lion To Apple TV via AirPlay

我在家裡主要用 Mac mini 來繪圖及編程;有時也會用 Spotify 播放一下音樂。但 Mac mini 內置的喇叭不夠大聲,所以想尋找解決方案。最簡的方法是接上外置喇叭,但空間不足、音色也不好。正好 Mac mini 附近有一台 Apple TV 接上電視及 5.1 擴音機,可以拿來使用。搜尋過後,發現可以在 Mountain Lion 中透過 AirPlay 把聲音傳到 Apple TV。

蘋果的裝置一向十分容易設定。只要把 Apple TV 及 Mountain Lion 連接到同一個 WiFi 熱點,就可以在設定中的聲音選單,選擇以 AirPlay 作為輸出對像。

2013年7月2日 星期二

《Sita 陳僖儀紀念冊》製作篇

Making Sita Likebook Step by Step

朋友想製作《Sita 陳僖儀紀念冊》,所以我把製作步驟詳細地列出來。


首先,打開瀏覽器並跳轉到 http://www.likebook.me。點選畫面中的「心形 Such a Fan!」圖案。再點選畫面左上角的「How many pages in my Likebook?」。


這時,Likebook 需要連接你的 Facebook 帳號,才能獲取所需資料。點畫面中間的「Connect with your Facebook account」。


如果你還沒有登入 Facebook 的話,登入視窗會彈出來。輸入你的 Facebook 帳號名稱及密碼後,點「Log In」按鈕。


登入後,下一步便是授權 Likebook 讀取自己 Facebook 內的數據。點「OKay」繼續。


現在,Likebook 己經連接到 Facebook。點畫面中間的「Likebook Page/Group」開始製作《Sita 陳僖儀紀念冊》。


今次要製作的是 Sita 陳僖儀 Fan Page 的 Likebook。所以,第一步是點「Fan Page」。


彈出的視窗列出了自己 Facebook 內的 Pages。視窗左下角顯示了頁數。Sita 的 Facebook Page 在我的第二頁。選擇「Sita Chan 陳僖儀」後,點一下「Choose」。


之後,就是選擇需要打印的日子。填好後在「Personal message / Tribute」輸入個人的標題。這個標題會出現在內頁第三頁。


第二步是選擇需要打印的內容。由於 Sita 沒有設定里程碑,可以在「Milestone」前方取消打勾。「Links」方面還是建議打勾,因為 Sita 有加入 YouTube 影片,那些都是連結來的。


接著點「Options」後方的「Edit」,選擇 Likebook 的語言。這裡的語言是日期、時間、目錄、單位文字,所使用的語言。選擇中沒有中文選項,但不用擔心。Likebook 打印的是按 Facebook Page 的內容。所以《Sita 陳僖儀紀念冊》內還是會以中文顯示。留言方面,我選了「50」條。一來想盡量包括所有留言,二來選 20 條便宜不了多少。完成選擇後點「I am editing my book cover!」。


下一步就是設定封面及顏色。我喜歡「Mosaic」這個設計,可以收納七張相片。書面則選擇了「Hardcover」硬皮面,不怕書本變形。顏色則選 Sita 最喜歡的粉紅色。

我不太喜歡 Likebook 選的封面相,所以在封面的相片上點一下。


在這個視窗中,可以在相片上拖動來改變相片位置,也可以點 + 號把相片放大,點 - 號把相片縮小;或點「Change image」選擇其他相片。


彈出的新視窗顯示了 Facebook Page 的相簿。點一下相簿會顯示當中的相片。


點相片後選「Choose」更換相片。


點「Validate」決定使用相片。


這時,大致上的設定已經完成。我在交易後才發現原來可以設定書背。點畫面中間的「See the back」。


跳轉後,點「No text - click to modify」。


輸入你想要的封底文字。


完成後點一下書以外的空間。選「Back」回到之前的設定頁面。


這時,在畫面右方能看到整體的設定、頁數、價錢。點「Add to cart」後便進入付款流程。

2013年7月1日 星期一

創業小心得

我的 App 開發公司已經成立了兩年多,有一點小心得:

  • 單一目標,不要貪心
    公司成立的首年,我們定下了「雙線發展」的方向:一面爭取客戶訂單;一面爭取開發自家應用。有這個想法,是因為客戶訂單能維持生活的開支;營利就要靠自家研發的產品。道理上是正確的,但實行起來卻無法如願。我認同及重視「專注」,但初創公司的同事畢竟也要吃飯,租也是要交,電亦要付費;只好暫時放棄「專注」,尋求「雙線發展」的機遇。

    一年過去了,我發現「雙線發展」的確能養活公司,但僅此而矣。其中一個原因是難得接到客戶的訂單,會把它放在第一位置,盡力完成,盡快買單。而且,天下但哪有不急趕的客戶?我們不急,單就會跑到別家去。造成沒時間開發自家應用,哪何來有營利?基本上我已放棄「雙線發展」。不過,公司不是由我一人話事,我只是極少數。其他董事還是認為要「雙線發展」,那只好繼續下去。

    既然繼續,那就要變陣才有新的結果。我們把同事分為五組:三組負責客戶項目;兩組負責自家應用。不論甚麼情況,都不能抽掉自家應用組的人手。這個做法似乎不錯,但我發現有一個問題。客戶項目多為商業應用,很多時都需要新的技術,如:AR、超聲波、RFID、CMS...等;而自家應用則多為遊戲或平台類,需要不同的技術,如:人工智能、3D 運算、尋路、劇本創作...等。兩者都要付出很多時間去研究及學習,而同事們忙於開發,學習的工作便落在我一人之上。有些時候更需要同時學習新技術,導致甚麼都學得不好。加強了「專注」的觀念。

  • Co-Founder 不要多於兩人
    我公司是由五位年青人合伙而成。人數算是很多。但我比較幸運,董事們都不堅持己見,有商量的空間。所以,爭執較少。但畢竟人數多,有時要花較多的時間才能取得共識。初創公司的一項優勢是「速度」。

  • 找能協助公司成長的 Co-Founder
    為了確保公司能營運至少三年,成立時已找來初創投資者。資金的確為公司提供了一定的保障,但就僅此而矣。公司能否生存下去,全靠自己的本事。Mr.Jamie 說過找投資者應找有人脈或能支持到公司成長的人。現在深感認同。如投資者能帶來技術或人脈,就能在公司起步時得到支持,加強活下來的能力。