2013年12月31日 星期二

2013 回顧

今年的創新是「全新的密碼方法」;把文字訊息以 bit 的形式儲存到相片之內。加入了隱藏訊息的相片在體積上跟原來的一樣。把兩者相片做比較,肉眼是無法分辨出來;就算用 Photoshop 的 Difference 效果來觀看,也極難察覺兩者的分別。這個概念已經製作成 iOS 應用,證明了可行性。目前只支援非失真的影像格式,並應用在記憶密碼方面。只需要記著一個密碼,便能透過《Photo-pass》把指定相片中的訊息解讀出來。

私人的機械人項目正式在 Hong Kong Mini Maker Faire 登場。《AMIGO Controller》的介面及操作方法得到在場人士的讚賞。雖然台灣也有同好使用 Android Tablet 操作機體,但目前還是我的比較先進。這個方面比起日本來得強,為香港爭點小光。

公司方面,今年做得很差。項目不多,而且客人願意付的金額較低;雖則推出了數個自家品牌的遊戲,但在 Apps 的汪洋,基本上沒有見光的機會,成績當然不好。就算力推的《Talkpic》成績也很差,相信是宣傳經費不足及不熟悉推廣的方法。我仍然認為這個概念很有潛力,畢竟連 Google 也看到,正在涉足這個業務。我再一次比 Google 看到機會的發生,只可惜力量不足。新客戶有 4 個,算是進步了。安慰的是,公司有三份一的生意額是我帶來,對自己有點交代。

學習方面,完成了《Introduction to Digital Sound Design》及《Computing for Data Analysis》兩個網上大學課程。今年學了比較多關於服務器的東西,如:ESXi, Virtual Host, Load Balancer, Host Redirect, VPN, Ruby on Rails,...。嘗試了 iBeacon 的開發及一些小測試,還不算白過...。

2013年12月30日 星期一

Javascript OOP


現在的 Javascript 跟我所認識的已經發展出很多的不同,物件導向 OOP 就是其中之一。今天寫了個簡單的程式,以了解它的寫法:
var _heartArray = new Array();

function initObjects()  {
    var windowDiv = document.getElementById("window");
    var centerX = (window.innerWidth/2);
    var centerY = (windowDiv.offsetHeight/2)+100;
    var radius = 180;

    //  Reset icon position
    var elementArray = document.getElementsByClassName("imageDiv");
    var count = elementArray.length;
    var increase = (Math.PI*2)/count;
    var x = 0, y = 0, degree = 0;
    for (var i=0; i<count; i++)  {

        var element = elementArray[i];
        var heart = new Heart(element, centerX, centerY, radius, degree, (Math.PI*2)/176);
        heart.execute();
        _heartArray[i] = heart;

        degree += increase;
    }
    setInterval(runOnce, 1000/60);
}

function runOnce()  {
    var count = _heartArray.length;
    for (var i=0; i<count; i++)  {

        var heart = _heartArray[i];
        heart.execute();
    }
}

function Heart(element, centerX, centerY, radius, degree, stepDegree)  {
    this.element = element;
    this.centerX = centerX;
    this.centerY = centerY;
    this.radius = radius;
    this.degree = degree;
    this.stepDegree = stepDegree;

    this.execute = function()  {
        var iconWidthHalf = 64;
        var iconHeightHalf = 64;

        //  6.2831853 = 360 x radian
        this.degree = this.degree+this.stepDegree;
        if (this.degree > 6.2831853)  {this.degree -= 6.2831853;}
        if (this.degree < 0.0)  {this.degree += 6.2831853;}

        var x = (this.radius*Math.cos(this.degree))+this.centerX-iconWidthHalf;
        var y = (this.radius*Math.sin(this.degree))+this.centerY-iconHeightHalf;

        this.element.style.position = "absolute";
        this.element.style.left = x+"px";
        this.element.style.top = y+"px";
    };
}

2013年12月27日 星期五

年終檢討

Appraisal 2013

年尾這個時候,是跟同事們檢討過去一年成績的機會。平日有為同事打分,成績如何,大家都心中有數。單獨面見,至少也能提出一些想法。今次每人二十分鐘,講些公司情況,聽聽同事未來的發展,也給做得好的同事一個肯定。今年業績很差,沒有花紅。雖然如此,董事會還是決定加薪(同事 only),算是表達一點心意之餘,亦可算是為勢所逼。我們經不起不加薪可能會帶來的後果。加薪幅度因人而異,將會跟據眾人過往的分數而決定加薪比例。我不敢說是公正,但絕對是公平的機制。

一直我都有份 Google Doc 記錄同事每個月的分數,這裡得出有趣的結果。累積分數最低的同事都不其然自行辭職。有些同事已經在被裁的邊沿。不用出手裁員,是個不錯的機制。同事們之間應該不知道對方的分數。當然,辦公室內一定有不聽命令的份子...。

我今年做得很差,沒有得加薪是應該的。就算做得好,也沒有得加,因為另外四位股東還不是受薪。距離在公司能增加收入的路,還是非常非常漫長...。

2013年12月24日 星期二

《AMIGO Controller》開發記錄

《AMIGO Controller》已經是第三次重寫,都是因為之前寫得不好。我不想重寫第四次,所以要把思想記錄下來。

既然所有東西由零開始,倒作一些新嘗試。Xcode 5 新建專案時加入了 Git 代碼管理,也加入了 Unit Test。編寫程序的步驟也改為先完成邏輯,待一切都運作正常後才輪到開發介面。《AMIGO Controller》的設計概念是作為一個通用控制器,能夠控制由 2013 年起我所製作的所有機體。頭兩次的設計,都過於跟 Tri-Robot HR01 綁定,基本上是無法改為非二足類機體之用;所以今次重寫要把這個概念加入。為了達到以上效果,我利用了 Mind map 來輔助,把各個部份連接起來,盡早找出有問題的地方。

2013年12月23日 星期一

jQuery RESTful 插件

jQuery RESTful Plugin

今日嘗試了一個 jQuery 的 RESTful 插件。只需要配合 .htaccess 就能實現 RESTful 接口處理,十分方便易用。以下是 .htaccess 的內容:
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule rest/api/member/(.*)$ rest/api/member.php?request=$1 [QSA,NC,L]
</IfModule>

以下是 Javascript 的內容:
_client = new $.RestClient("rest/api/");
_client.add("member");

var request = _client.member.read(123);
request.done(function(data)  {
 alert("GET rest/api/member/123: ");
});
request.fail(function(data)  {
 console.log(data);
});

PHP 方面使用 $_REQUEST["request"]; 就能取得參數。要留意的是,PHP 端要傳回 application/json 格式,而成功時內容要包含「"success":"true"」否則明明是成功傳回的內容,但 jQuery 會把回應看作 fail() 而不是 done()。

參考:http://stackoverflow.com/questions/7542730/jquery-ajax-returns-error-but-is-success

2013年12月22日 星期日

承諾

昨天,朋友問及我的事業發展如何?我直截了當地說:「很差」。她當然追問下去,我也說明了其他原因。她問我有甚麼打算?除了 Apple 及 Google 兩家公司之外,暫時還不想打工。我喜歡自由,想獨自創業。

她知道我很渴望進入 Apple 工作,問我為何不去見工?我說是原則問題。既然應承了別人要搞公司,那就要履行承諾。假如見工見成了,又不會去做的話,我就不會見。她的丈夫也是我的朋友,在 Apple 工作。原來 Apple 的面見一般都有 18 次,他自己就花了 9 個月才被 Apple 受聘。果然是大機構。有時我會想,好機會不是時時有,若因為承諾而錯失的話,是否很可惜?我相信「是」,但承諾對我來說更為重要。

2013年12月21日 星期六

am730 Downloader v1.10


星期三,各大報紙報導過 Google 2013 本地搜尋之最後,星期四,am730 也列出今年娛樂圈的大事。當然少不了 Sita。這也是納入《陳僖儀補完計劃》的內容。之前寫過的《am730 Downloader》能把報紙頁面以原大尺寸下載但沒有介面,使用起來十分不方便。於是我稍為把程式修改,加入相關介面。現在要下載《am730》報紙頁面就方便得多!

2013年12月20日 星期五

拉闊圖書館・十二:電影欣賞

BeyondZ Library 12

在剛過去的星期三晚,是本年度最後一次《拉闊圖書館》;是次題目為「電影欣賞」。由高總及 CP 同學向大家介紹自己最喜愛的電影。

高總介紹了多齣周星馳的電影,播放了幾段經典的情節。也介始了他鏡頭以外的評價。CP 則介始了《皇上無話兒》,表達了天降大任的國王,在無路可退的情況下剋服口吃的故事。兩位都很用心準備他們的內容,帶給了我們感性的晚上。

2013年12月18日 星期三

已故陳僖儀膺本地女星榜首

Sita Google No.1


恭喜 Sita 再獲 No.1,永遠懷念妳。

2013年12月17日 星期二

在 Mavricks 下安裝 Cocos2d-x 2.2.1

Setup Cocos2d-x 2.2.1 in Mavricks

今日嘗試了《Cocos2d-x》,一個跨平台的開發框架。可是官網及書本所教授的設定方法都不合時宜,所以在這裡記錄一下 2.2.1 版本的安裝步驟:
1. 下載 Cocos2d-x 2.2.1 並解壓到 /Applications/cocos2d-x-2.2.1/
2. 下載 Android SDK ADT Bundle for Mac 並解壓到 /Applications/adt-bundle-mac-x86_64-20131030/
3. 下載 Android NDK 並解壓到 /Applications/adt-bundle-mac-x86_64-20131030/android-ndk-r9b/
4. 打開 Terminal 並輸入以下指令:
   export NDK_ROOT="/Applications/adt-bundle-mac-x86_64-20131030/android-ndk-r9b"
   export ANDROID_SDK_ROOT="/Applications/adt-bundle-mac-x86_64-20131030/sdk"
5. 之後便是建立新專案。在 Terminal 並輸入以下指令:
   cd /Applications/cocos2d-x-2.2.1/tools/project-creator/
   ./create_project.py -project main -package com.beyondz.cocos2dx -language cpp
6. 新建立的專案會儲存在 /Applications/cocos2d-x-2.2.1/projects/main/
7. 如要生成 iOS 版,只要打開 main/proj.ios/main.xcodeproj 直接用 Xcode 組十譯就可以
8. Android 版則較為麻煩。打開 adt-bundle-mac-x86_64-20131030/eclipse 內的 eclipse
9. 在 Eclipse 頂方選單 File > New > Other > Android Project from Existing Code > Browse...
10. 選 cocos2d-x-2.2.1/cocos2dx/platform/android/java 匯入 libcocos2dx 程式庫
11. 在 Eclipse 頂方選單 File > New > Other > Android Project from Existing Code > Browse…
12. 選 cocos2d-x-2.2.1/projects/main/proj.android/
13. 在 Package Explorer 內右擊 main > Android Tools > Add Support Library…
14. 安裝視窗內的程式庫
15. 回到 Terminal 並移至 cocos2d-x-2.2.1/projects/main/proj.android/ 並輸入以下指令:
   ./build_native.sh
16. 回到 Eclipse,在 Package Explorer 內右擊 main > Run As > Android Application

若沒有執行 ./build_native.sh 的話,在模擬器及真機均會出現以下錯誤:

2013年12月16日 星期一

解決 Genymotion 在 Mavericks 的起動問題

Genymotion Mavericks Boot Fix

自從升級到 Mavericks 後,最好用的 Android 模擬器便發生了啟動問題。解決方法是在 Terminal 中輸入指令 「sudo /Library/StartupItems/VirtualBox/VirtualBox restart」,之後便能再次啟動 Genymotion。可是,這個方法需要在每次啟動後重新輸入。

2013年12月15日 星期日

Timelapse 介面

Timelapse Interface

雖然上星期趕不及在 BBQ 前完成,但也沒有放下這個項目。現在的介面加入了更多資訊,一張圖也沒有用,全是程序生成,看起來還不錯。按照目前的設計,這個裝置的功能很簡單~「一個計時功能的開關」,稍後有機會嘗試會加入伺服馬達,拍攝會移動的《縮時攝影》。

2013年12月14日 星期六

受薪董事

幾天前,我在 Facebook 寫了一句:「三年時間快過了,月入都沒有增加過,意味著我倒退了 33.1%」,惹來了某人的回應。我非常介意。這不是第一次被「寸」。他使我覺得作為一個「受薪董事」應該要知足,在其他拍檔還沒有支薪時不要諸多要求。對不起,我是有目標的人。我沒有父蔭、沒有另一家公司在支持我的生活費,現在百物騰貴,有三個家庭需要我供養,不能沒有要求。雖然是「受薪」,但自問努力工作之餘,亦擅長多方面知識,解決不少難題;公司至少有三份一的營業額是由我而來,足夠支付我的薪水。被人把「月入」看成「月薪」,似乎太過低估了我只有「月薪」收入吧!

2013年12月13日 星期五

CocoaPods

既然《AMIGO Controller 2.00》是重新製作,也想順道作新嘗試。朋友之前介紹 AFNetworking Framework 給我,也考慮在這個項目內使用。而在說明中,建議安裝 CocoaPods,指能方便讓 Xcode 項目中使用第三方的程式庫。以下是在 Mac OS X 的 Terminal 內安裝的步驟:
MacBook-Pro-Pacess:~ pacess$ sudo cp /usr/bin/rake /usr/bin/rake.original
Password:
MacBook-Pro-Pacess:~ pacess$ sudo gem install cocoapods
Successfully installed i18n-0.6.9
Fetching: multi_json-1.8.2.gem (100%)
Successfully installed multi_json-1.8.2
Fetching: activesupport-3.2.16.gem (100%)
Successfully installed activesupport-3.2.16
Fetching: nap-0.6.0.gem (100%)
Successfully installed nap-0.6.0
Fetching: json-1.8.1.gem (100%)
Building native extensions.  This could take a while...
Successfully installed json-1.8.1
Fetching: fuzzy_match-2.0.4.gem (100%)
Successfully installed fuzzy_match-2.0.4
Fetching: cocoapods-core-0.28.0.gem (100%)
Successfully installed cocoapods-core-0.28.0
Fetching: claide-0.4.0.gem (100%)
Successfully installed claide-0.4.0
Fetching: cocoapods-downloader-0.2.0.gem (100%)
Successfully installed cocoapods-downloader-0.2.0
Fetching: rake-10.1.0.gem (100%)
rake's executable "rake" conflicts with /usr/bin/rake
Overwrite the executable? [yN]  y
Successfully installed rake-10.1.0
Fetching: colored-1.2.gem (100%)
Successfully installed colored-1.2
Fetching: xcodeproj-0.14.1.gem (100%)
Building native extensions.  This could take a while...
[!] You are using the prebuilt binary version of the xcodeproj gem.
Successfully installed xcodeproj-0.14.1
Fetching: escape-0.0.4.gem (100%)
Successfully installed escape-0.0.4
Fetching: json_pure-1.8.1.gem (100%)
Successfully installed json_pure-1.8.1
Fetching: open4-1.3.0.gem (100%)
Successfully installed open4-1.3.0
Fetching: cocoapods-0.28.0.gem (100%)

CHANGELOG:

## 0.28.0
[CocoaPods](https://github.com/CocoaPods/CocoaPods/compare/0.27.1...0.28.0)
• [CocoaPods-core](https://github.com/CocoaPods/Core/compare/0.27.1...0.28.0)
• [CLAide](https://github.com/CocoaPods/CLAide/compare/0.3.2...0.4.0)

###### Enhancements

* CLAide now supports gem plugins. An example CocoaPods plugin can be found at
  [open\_pod\_bay](https://github.com/leshill/open_pod_bay).

  As of yet there are no promises made yet on the APIs, so try to fail as
  gracefully as possible in case a CocoaPods update breaks your usage. In these
  cases, also please let us know what you would need, so we can take this into
  account when we do finalize APIs.

  [Les Hill](https://github.com/leshill)
  [CLAide#1](https://github.com/CocoaPods/CLAide/pull/1)
  [#959](https://github.com/CocoaPods/CocoaPods/issues/959)

###### Bug Fixes

* Compiling `xcassets` with `actool` now uses `UNLOCALIZED_RESOURCES_FOLDER_PATH`
  instead of `PRODUCT_NAME.WRAPPER_EXTENSION` as output directory as it is more
  accurate and allows the project to overwrite `WRAPPER_NAME`.  
  [Marc Knaup](https://github.com/fluidsonic)
  [#1556](https://github.com/CocoaPods/CocoaPods/pull/1556)

* Added a condition to avoid compiling xcassets when `WRAPPER_EXTENSION`
  is undefined, as it would be in the case of static libraries. This prevents
  trying to copy the compiled files to a directory that does not exist.  
  [Noah McCann](https://github.com/nmccann)
  [#1521](https://github.com/CocoaPods/CocoaPods/pull/1521)

* Added additional condition to check if `actool` is available when compiling
  `xcassets`. This prevents build failures of Xcode 5 projects on Travis CI (or
  lower Xcode versions).  
  [Michal Konturek](https://github.com/michalkonturek)
  [#1511](https://github.com/CocoaPods/CocoaPods/pull/1511)

* Added a condition to properly handle universal or mac apps when compiling
  xcassets. This prevents build errors in the xcassets compilation stage
  particularly when using xctool to build.  
  [Ryan Marsh](https://github.com/ryanwmarsh)
  [#1594](https://github.com/CocoaPods/CocoaPods/pull/1594)

* Vendored Libraries now correctly affect whether a podspec is considered empty.  
  [Joshua Kalpin](https://github.com/Kapin)
  [Core#38](https://github.com/CocoaPods/Core/pull/38)

* Vendored Libraries and Vendored Frameworks now have their paths validated correctly.  
  [Joshua Kalpin](https://github.com/Kapin)
  [#1567](https://github.com/CocoaPods/CocoaPods/pull/1567)

* Gists are now correctly accepted with https.  
  [Joshua Kalpin](https://github.com/Kapin)
  [Core#38](https://github.com/CocoaPods/Core/pull/38)

* The `pod push` command is now more specific about the branch it pushes to.  
  [orta](http://orta.github.io)
  [#1561](https://github.com/CocoaPods/CocoaPods/pull/1561)

* Dtrace files are now properly left unflagged when installing, regardless of configuration.  
  [Swizzlr](https://github.com/swizzlr)
  [#1560](https://github.com/CocoaPods/CocoaPods/pull/1560)

* Users are now warned if their terminal encoding is not UTF-8. This fixes an issue
  with a small percentage of pod names that are incompatible with ASCII.  
  [Joshua Kalpin](https://github.com/Kapin)
  [#1570](https://github.com/CocoaPods/CocoaPods/pull/1570)


Successfully installed cocoapods-0.28.0
Parsing documentation for rake-10.1.0
Installing ri documentation for rake-10.1.0
Parsing documentation for colored-1.2
Installing ri documentation for colored-1.2
Parsing documentation for xcodeproj-0.14.1
Installing ri documentation for xcodeproj-0.14.1
Parsing documentation for escape-0.0.4
Installing ri documentation for escape-0.0.4
Parsing documentation for json_pure-1.8.1
Installing ri documentation for json_pure-1.8.1
Parsing documentation for open4-1.3.0
Installing ri documentation for open4-1.3.0
Parsing documentation for cocoapods-0.28.0
Installing ri documentation for cocoapods-0.28.0
7 gems installed
MacBook-Pro-Pacess:~ pacess$
MacBook-Pro-Pacess:~ pacess$ pod setup
Setting up CocoaPods master repo
Setup completed (read-only access)
MacBook-Pro-Pacess:~ pacess$

2013年12月12日 星期四

AMIGO Controller v2.00


我是個三分鐘熱度的人。新的題目玩三天就會失去熱情。然而,這不代表我放棄;而是享受完另一些玩意後再回來、再走過。冷卻了一段時間的《AMIGO Controller》,再次重拾熱情。我希望重新製作,並加入改良了的介面設計及結構,重新出發。

以前編程的時候,多數立即動手做,邊做邊改。這樣做通常都不會把思想寫下來,導致日後忘記了設計或邏輯。像今次一樣,本來不想重寫,但發現已經忘記了思路。重寫,可能是最好最有效的方法。不過,今次倒想試試寫多一點文件,方便日後回憶思緒。在網上找到一個好用的 Mind Map 應用,寫下了核心的幾個部份。已經足夠由零到編輯成一個完整動作所需的東西。

2013年12月11日 星期三

支援 Retina 的網頁・二

WWW Retina Support - Part 2

上月試過用 Javascript 製作「支援 Retina 的網頁」。今早在瀏覽 YouTube 時發現原來可以用 CSS 的方式達成,於是著手編寫了簡單的 HTML 來測試,證實是可行的。代碼如下:
<html>
 <head>
  <meta charset="utf-8">
  <title>Retina CSS Test version 1.00</title>

  <style>
   *  {
    margin: 0px;
    padding: 0px;

    font-family: "Helvetica Neue", "Verdana";
    font-weight: normal;
    font-size: 14px;
    color: #ffffff;
    text-shadow: 1px 1px #000000;
   }
   body  {
    background-color: #404040;
    margin: 0 0 0 0;
    font-family: "Helvetica Neue", "Verdana";
   }
   a  {
    text-decoration: none;
   }
   a:hover  {
    color: #ff0000;
   }

   #heading  {
    font-family: "Helvetica Neue", "Verdana";
    font-weight: lighter;
    font-size: 40px;
    color: #ffffff;
    text-align: center;
   }
   #description  {
    font-family: "Helvetica Neue", "Verdana";
    font-weight: lighter;
    font-size: 20px;
    color: #ffffff;
    text-align: center;
   }
   #window  {
    background-color: #303030;
    margin: 8 8 8 8;
    padding: 10 10 10 10;
    border-radius: 8px;
    width: 600px;
    text-align: center;
   }
   #window table  {
    margin-left:auto; 
    margin-right:auto;

    font-family: "Helvetica Neue", "Verdana";
    text-align: center;
   }
   #subHeading  {
    font-family: "Helvetica Neue", "Verdana";
    margin-bottom: 10px;
    font-weight: lighter;
    font-size: 10px;
    color: #ffffff;
    text-align: center;
   }
   #imageDiv  {
    width: 300px;
    height: 447px;
    background-image: url("./images/android.png");
    background-image: -webkit-image-set(
     url("./images/android.png") 1x,
     url("./images/android@2x.png") 2x
    );
    background-image: -moz-image-set(
     url("./images/android.png") 1x,
     url("./images/android@2x.png") 2x
    );
    background-image: -image-set(
     url("./images/android.png") 1x,
     url("./images/android@2x.png") 2x
    );
   }
  </style>

  <script type="text/javascript">
  </script>
 </head>

 <body><center>
  <div id="heading">Retina CSS Test</div>
  <div id="subHeading">Version 1.00, written by Pacess, 2013-Dec-11.</div>
  <div id="description">This CSS shows how to load @2x retina image according to the device.</div>

  <div id="window"><center>
   <div id="imageDiv"></div>
  </center></div>
 </center></body>
</html>

2013年12月10日 星期二

Reverse Proxy Settings


今日替客戶修理她的網頁,在 Windows Server 下的 ASP 網頁。以往的做法是,當修改完成後,直接發整個源碼給她,她再找 IT 部門更新到 UAT 測試服務器上進行測試。但這個工序需要一點時間。曾經想過把公司測試服務器上的連結丟給客戶,可是 80 及 443 埠已有幾個項目使用,而且是 Linux 系統的;唯有另開新埠。可是,客戶那邊又怕被黑客攻擊,IT 部門只對外開放 80 及 443 埠,導致這個方法又不可行。然而,上星期在公司設定好 ESXi 後,情況有所改變。

在公司那台 ESXi 包了一個 CentOS 6,我把它設定成 Reverse Proxy。所有數據都先經由那台服務器,再按域名分派到其他主機。這樣,客戶只需要用 80 埠便能接駁到我的服務器,而又不影響到現時運行中的項目。

2013年12月9日 星期一

AMIGO Controller v1.10


《Tri-Robot》快要出貨了!拍檔們都十分努力地趕工,我也得優化一下控制程式。

自從上次出賽台灣之後,得到了一點意見,在 2.00 版本中進行改良。可是總提不起勁修改,到快將出貨的日子,還未能完成 Motion Group 的開發,臭蟲也有很多。為了令第一批客戶能好好享受《Tri-Robot》帶來的樂趣,我只好在 1.00 版本上追加幾項修改,製作成 1.10 版本。剛剛提交到 Apple,希望能順利上架。

下一步就是回到 2.00 版本。由於放低了一段時間,已經不記得系統的設計及結構,加上某些核心問題需要處理,也為《AMIGO Controller》能控制我的 Quadcopter 做準備,似乎要第三次重寫了...。

2013年12月7日 星期六

Automatic Reference Counting


看來還是趕不及完成「Timelapse」的開發!

雖然是個簡單的東西,但這個項目要處理的事情相當多。首先要設計整個裝置的功能、製作電子板、編寫 Arduino 端程式、開發 iOS 端的用戶介面、制訂中間的溝通格式、測試及除錯。這些都不是快手完成的東西。

在開發 iOS 程序時,嘗試了一下「ARC」。對我來說,越自動的東西越容易出錯,我需要全盤了解當中的處理方法,才能夠編寫出優質的程式。所以,一直都不敢用「ARC」這個東西。相反地,我十分清楚哪裡需要 Alloc, Release, Autorelease,掌握了記憶體的使用,要轉換成「ARC」,很怕容易出現狀況。不過,似乎不少文章都指它是未來的必要裝備,應該是個不錯的東西。

在「ARC」之下是不用 Release 及 Autorelease,沒錯是能令編寫時間縮短一點點,但沒有了以往一對一對的 Alloc+Release 配對,實在不習慣。到目前為止沒有洩漏發生,似乎真的不用花心機考慮記憶體問題...。不過,我還是喜歡掌控一切。這才能開發出色的作品。

2013年12月6日 星期五

趕製《縮時拍攝裝置》

Making of Timelapse Device

同事們約好了明天到白石燒烤,那兒風景不錯。很適合拍照;也想再試拍縮時攝影。手上的電子板太大不易携帶,因而想嘗試能否在活動前完成《縮時拍攝裝置》。

這個裝置的設計是由電池驅動,在 iOS 裝置做好設定後,透過低功耗藍牙把資料傳到裝置上,然後進行拍攝工作。在家中找來一塊若干大小的底板,試了位置,能容納所需零件。由於時間實在太短,供電部份暫時由 USB 接口輸入。日後會改為四顆 AAA 電池代替。這裡有個問題,兩塊板子都能接受 5V 輸入,而電池加起來卻是 6V,要確定一下有沒有問題。

電子線路在麵飽板上已經接過,改到小電子板沒有難度;下一步是軟體編寫。這就是目前的設計。點「Focus」即時對焦,按「Shutter」打開快門,放「Shutter」時閉上快門;就好像 B 快門的作用一樣。設定好每張相片的拍攝時間、相片間的等候時間後。紫紅色的是到目前為止的拍攝時間。點中間藍色的大圓形按鈕便會開始拍攝,打算同時顯示拍攝了多少幀,以及輸出影片的長度。整個項目看來簡單,但還是有很多很多工作需要處理才能成事。

2013年12月4日 星期三

偵測 Facebook

Detect If Under Facebook


客人找我們開發的網頁小遊戲,由原本跟 Facebook 沒任何關係,到現在加入了相當多的 Facebook 元素,已經變為一套基本的 Facebook 遊戲。但客人仍然想保留「去 Facebook 化」的版本。作為開發者,管理一套代碼當然比起兩套來得方便;所以某些只在 Facebook 版出現的部份,便要來過檢測。

Facebook 應用一直都是以 iFrame 形式出現。查看了 Facebook 的 Javascript 代碼,發現 iFrame 的名字為「iframe_canvas_fb_https」,只要利用 Javascript 檢查當前的 Window.name 便能判斷是否被 Facebook 包裹著。但為免 Facebook 日後把名字更改而導致失效,還是在檢查上只選出跟 Facebook 有關聯的字眼為好。
var result = "No";

var frameName = window.name;
if (frameName.indexOf("_fb_") >= 0)  {result = "Yes";}
if (frameName.indexOf("facebook") >= 0)  {result = "Yes";}

document.getElementById("resultDiv").innerHTML = "You are under Facebook? "+result;

2013年12月3日 星期二

Virtual Host 設定


一直想將兩個同域名但不同 sub-domain 的網址指著同一台網頁伺服器,可惜失敗了。幾經嘗試後終於成功了,原來只要在 httpd.conf 中簡單設定幾行就可以了。又學到新的東西。

2013年12月2日 星期一

《終極陳僖儀補完計劃》

The Ultimate Sita Chan Completion Project

一直實行的「陳僖儀補完計劃」是把 Sita 的新聞、影片、臉書保存起來。但這似乎還是不夠...。

其實我還有一個最終極的目標,就是把 Sita 的聲音還原。我相信這不是個新的科技,集合現有的技術已能做到。但對於我這個文科生,卻是一大的挑戰。基本上應該做不到。只是,我估計能從 Sita 的聲音數據來還原她的口腔結構,變成立體模型後,便能按模型的活動重現不同的聲音。我不知道這個想法是否可行,但希望機械人技術能把它實現出來。

2013年11月29日 星期五

BLE UUID Creator

這幾天忙著測試 BLE 應用程式,為了方便生成自己的 UUID,因而編寫了這個簡單的 Javascript 程序:

2013年11月27日 星期三

Dropping Test


朋友在開發的網頁小遊戲中,需要把魚兒拖拉到魚缸,假若玩家不是在魚缸中放手的話,魚兒會跳回原位,或者跳入魚缸,視乎哪邊最近。他想知道如何能算出這個動作的路徑,於是我寫了一個 Javascript 程序示範一下。

以前寫遊戲時也有做過類似的運算。我用的是 Sine(0) - Sine(180) 乘以想要的高度作為拋物線的軌道;若兩點不是在同一水平時,會把高差除以步驟數(height/step),再在每次計算好的 Y 值加入這個值來作為位移(offset)。由於今次需要在某個時點改變層次(Layer),同時加入了這個運算,以 Y 值判定是否到頂而需要改變層次。紅色線是上升中,黃色是下降中,綠色是終點。

最後朋友在網上找到了一個的計算路徑的源碼,但效果跟我的差不多。雖然今次沒有用我那段程式,但也不失為一個好的練習機會,讓我更熟悉 Javascript 編程。

2013年11月26日 星期二

陳媽媽聯署,僖儀e-道或復聲

Sita eChannel

還以為不會再有 Sita 陳僖儀的新聞,意想不到地今天竟然出現。

那是《蘋果日報》關於上月陳媽媽發起,希進 e 道沿用 Sita 靚聲的報導。看完報導,當然要把它保存。網頁方面利用 Chrome 的抓圖插件,沒有難度地轉換成 .png;而影片方面,一向使用找出 .flv 的方法已經失效,唯有再鑽研一下。用 WireShark 抓出來的數據,找了很久都找不到影片的真身,找到的地址又顯示沒有文件,似乎是被《蘋果日報》阻止直接訪問。後來嘗試在 Chrome 的記錄去找,幸運地能找出影片的真身!

2013年11月24日 星期日

初試縮時攝影

Time-lapse First Trial

一直很想試試自製的「Arduino 縮時攝影裝置」,整晚都睡得不好。既然睡得不好,就早點起床拍攝。

簡單地用橡膠把電子板固定在相機右面,因另一方要插上接口。連接 USB 供電,板子正常運作。拍攝了十五分鐘後,得出以下成果:

效果看起來不錯。

2013年11月23日 星期六

Arduino 縮時攝影裝置

Arduino Time-Lapse Device

友人 Tony 在 Facebook 貼上他拍的星星照片,實在太靚!引起我對「縮時攝影」的興趣。目前使用的單鏡反光相機是 Canon EOS 450D,快門線也是之前自行製作的;要拍「縮時攝影」的相片,一是購買現成的裝置,一是自行製作。我選擇了後者。

手上有顆體積細小的 Arduino Nano,正好用來作為《縮時攝影裝置》的核心。晚上回家後立即動手連接線路及編程,花了一小時完成。簡單測試過後沒發現問題;但使用時必須要撥為手動對焦,否則有些訊號會沒有反應。這個裝置使用了以下部件:
  • Arduino Nano 一塊
  • 100 Ohm 電阻一顆
  • LED 一顆
  • 4N35 一顆
  • Micro USB 接線一條
  • USB 充電電池

    以下是 Arduino 部份的代碼:


    由於時間緊迫,先製作這個簡化版。最終目標是加入低功耗藍牙及 iPhone 應用程式。在程式內設定好拍攝時間、拍攝時間長度、拍攝照片之間距...等,利用藍牙傳到裝置後進行拍攝。待我的 Makibox A6 LT 到手時,便著手加入外殻及電池箱,放在外置閃燈的位置使用。
  • 2013年11月21日 星期四

    AMIGO Controller 官網登場

    AMIGO Controller Website

    這幾天在製作《AMIGO Controller》的網頁,很想做到如 Apple 般的出色,很喜歡那簡潔的感覺,所以花了很多功夫鑽研如何做得好!

    除了支援 Retina Display 高清圖像外,我認為產品相片的光暗及細節十分重要。我的機體是黑紅為主色,選了黑色作為網頁的主色。Mac Pro 的網頁也是黑色為主調,所以學習了它的用色;亦研究了 Mac Pro 產品相片的光源位置,如何能在黑暗的背景仍能帶出黑色產品的線條。由於缺乏器材,我選了晚上十時後黑漆漆的環境,關掉家中所有的燈光,只亮起一盞小小的枱燈,利用 Canon EOS 450D 及 50mm 定焦鏡頭去拍攝機體。原本想找白色光源,可是家中沒有合用的小頭燈膽。



    好不容易營造出黑色背景,加上僅有的工具,一連拍攝了數十張不同光暗、不同角度、不同距離的相片,希望能找到一兩張可用的素材。最終的確選出一張,在 Photoshop 內稍微加工後,放到網頁內。效果很好,我十分喜歡!除此之外,我很著意細微的地方。因此,網頁除了支援 Retina Display 外,也會因應瀏覽時的裝置,而在內容上有些微的改動。網頁地址是 http://amigo.pacess.com/,大家不妨給我一點意見。

    2013年11月20日 星期三

    支援 Retina 的網頁

    WWW Retina Support

    換了 MacBook Pro with Retina Display 已有一段時間,由於 99.99% 的網頁都沒有 Retina 化,所以在瀏覽時圖片明顯覺得朦朧。最近在製作新網頁,想同時加入 Retina 支持。

    起初以為像 iOS 開發一樣,加入 @2x 圖片就行;可是這個方法是行不通。看完 Apple 的「Serving Images Efficiently to Displays of Varying Pixel Density」後,似乎最適合我的是 Javascript 方法。在網上找到了 retinas.com 提供了一個簡單方便的辦法;不過,在 Retina 裝置上會造成載入兩次的情況(首先載入標清版,之後才載入高清版),加重了服務器的負擔,還是動手寫一個優化版。
    function prepareRetinaImages()  {
    
      //  Find out all <img> object and replace the source name to @2x
      var imgArray = document.getElementsByTagName("img");
      for (var i=0; i<imgArray.length; i++)  {
    
        var imgObject = imgArray[i];
        var retina = imgObject.getAttribute("retina");
        if (retina == null)  {continue;}
    
        if (window.devicePixelRatio < 2)  {
    
          //  Remove @2x if not a retina device
          imgObject.src = retina.replace("@2x", "");
        }  else  {
    
          imgObject.onload = function()  {
            //  TODO: Not sure why apply /2 to height will cause problem
            this.width = this.width/2;
          };
          imgObject.src = retina;
        }
      }
    }
    
    我寫的其實好不了多少,但勝在切合我的需要。

    2013年11月18日 星期一

    Tri Robot 小組第七次會議

    首批《Tri Robot》將要在下個月附運,我們因此召開第七次會議,看看有甚麼事情需要優先完成。

    《AMIGO Controller》2.00 版的開發工作遇到了瓶頸,還在製作中。一來熱情過後,未能重拾興趣,導致進度缺缺;二來重構的「動作編輯器」難度頗高,需要心力去克服;三來在 iOS 7 上產生了一堆問題,花了點時間解決。之前已經預計到有這樣的問題,幸好已上架的 1.00 還能運作。眼見 2.00 未能在出貨日上架,我們決定先改善 1.00 少許的不足,推出 1.10 版本給客戶使用。之後便是收拾 2.00 攤子的工作...。

    2013年11月14日 星期四

    Reflection 在 iOS 7 上失效

    AirPlay Failed on iOS 7 with Reflection

    年尾的工作多起來,有客人找 BeyondZ 開發 iPad 遊戲。既然是有錢賺、又是流動應用、更沒有多困難的技術,就算是在目前人手不足的情況下,還是接了回來。

    每位程序員都忙著自己的項目,我只好扛起開發的工作。一般來說,每個項目都會分 Alpha 及 Beta 版。Alpha 版是能夠體驗應用一部份介面、流暢度、操作方式的版本;而 Beta 則是未完全除錯的完成版。今日完成了 Alpha 版,需要拍片給客戶過目。利用一直以來用開的《Screenflick》拍攝遊戲畫面影片時,發現在運行 iOS 7 的 iPad 上無法把畫面經由《Reflection》傳到運行 Mavericks 的 iMac 上。之前 iOS 6 沒有問題,估計是 iOS 7 不兼容所導致。目前的解決方法是用 iOS 6 的裝置運行遊戲...。

    2013年11月13日 星期三

    拉闊圖書館.十一:Concept of Red Wine

    BeyondZ Library 11

    十一月份的拉闊圖書館題目為《Concept of Red Wine》,由賤多內子主講。由釀酒的過程、選用提子的部份、酒瓶紙的內容、產地、試味時的步驟都有提及。了解到原來白酒跟紅酒在材料上的分別。還有兩款非常不同的紅酒品嘗,確是愉快的一課。

    今次是歷介拉闊圖書館中最準時完結的一課。下一課為《電影欣賞會》,所有同事將會用五分鐘時間介紹自己最喜愛的電影。很期待呢!

    2013年11月11日 星期一

    iPhone 4 降級失敗

    我的 iPhone 4 升級到 iOS 7 後,起初的速度及反應都算是接受。可是用了一段時間之後,開始變得慢。於是這幾天嘗試把它降級到 iOS 6.1.3。

    之前保留了的 SHSH 停留在 iOS 5.1。如果能回到 iOS 5 就更好。不過,花了兩三天時間,試過 redsn0w, iFaith, tiny umbrella 甚至是其他工具,連 hosts 內的 gs.apple.com 也修改過,都在 iTunes 更新韌體時出現問題。網上有留言指就算有 SHSH 也無法降級,幸而,iH8sn0w 卻說是可行,不過目前還沒有說明方法...。

    2013年11月7日 星期四

    Google 的客製化頁面

    Google & Birthday

    今日打開頁面,看到不一樣的 Google 首頁。很好奇哪個大人物跟我同一天出生?把鼠標放到圖案上,出現的竟然是「Pacess,生日快樂!」。沒想到 Google 首頁也會客製化,確實是一個驚喜!

    2013年11月6日 星期三

    Maze Coder


    客人找我寫個 iPad 迷宮遊戲。於是用 PHP 製作了一個簡單的工具,把由網上生成的迷宮圖案轉化成數據;放進 Box2D 內使用。有了這個工具,就能方便地轉換迷宮,從而做出不同的關卡。

    2013年11月5日 星期二

    分數至上

    由《拉闊》帶過來《彼岸石》的打分制實施多時,同事們都沒有提出反對,本以為能有效跟同事反映作為上司對同事工作的評價。但似乎做得不夠...。

    每月都為發給同事一封「打分」電郵,內裡註明了同事上月主要參與的項目(簡單修補或幫忙的不會寫在這裡)、評語、分數明細(做了哪樣事情加分、哪樣減分)、整體分數。跟《拉闊》不同的是分數不會跟月收入掛鈎,只對年度分紅及升職加薪作為參考。原意是讓同事了解我的想法,也避免在年尾時單憑記憶去判斷哪個同事做得出色、哪個勤力、哪個得到客戶評價...的做法較為公平公道;亦能讓同事在年初時已作出修正,不用等到年尾時才知道方向性的錯誤。可是,大家的著眼點都放在分數上。分數的確是一個指標,說明過去發生的事情。但評語更為重要,知道哪裡做得好?甚麼要改善?要向哪個方向發展?以及犯了何錯?

    同事可能對分數或評語有意見,認為自己已很努力仍然得這麼低的分數。我也有想過評分的準則是按成果,還是按過程?最終選擇了成果。就像客人對我們一樣,交不到貨便不會給錢,理你是做一個小時完成,還是通宵達旦。既然非常努力也不達標,也意味著方法或方向上要作出改善,這也是一件好事。顧及到同事的積極性,分數也會著量調整。

    「分數至上」是不是香港教育制度給我們下一代的習慣?既然《打分制》打擊了事氣之餘,又幫倒忙;而我又得花時間逐個同事編寫電郵,何不待年尾才一次性的評估,到時你喜歡的便留低,不喜歡的就拜拜。這樣的做法我更輕鬆。

    2013年11月4日 星期一

    在 CentOS 安裝 Ruby on Rails

    跟朋友學了點 Ruby on Rails 的知識,最好在 CentOS 上嘗試把過程再做一遍來加強記憶。SSH 進入 CentOS 後,先是安裝 Ruby on Rails:


    朋友說初學者最宜使用 RVM,以便簡單入手。安裝方法如下:


    安裝完成需要來個設定,這個動作會在下次登入時自動執行:


    完成後,需要下載有用的 Gems,亦即是 Ruby on Rails 的 Framework 之類的東西。


    根據朋友的示範,Ruby on Rails 看來是一套很聰明快捷的語言。有很多 Gems 可以使用,簡化編程的步驟;而且考慮十分周詳,問題較少,保障較多。得花點時間鑽研一下。

    2013年11月3日 星期日

    SSL + .htaccess


    困擾了我很久的問題終於解決了。一個人在家果然能完成許多的事。之前有一個項目放在 HTTPS 那邊,它有一個後台網頁用來修改內容。為了方便,我想用 .htaccess 想設定密碼防止外界闖入。誰知 .htaccess 失效了。搬到 HTTP 那邊卻沒有問題,那天花了一整天也解決不來,放棄了事。我沒有真正的放棄,只是項目總不能被拖著...。

    事隔半年,再戰這個問題。先從《鳥哥的 Linux 私房菜》惡補一下(這是一個非常好的網頁,幫了我解決問題。多謝!)。發現了 AllowOverride 的用處,查看 httpd.conf,原來這句在 /var/www/html;而 HTTPS 不在這個目錄下,難怪 .htaccess 無效化。手動加回設定,重啟 Apache,成功了!

    2013年11月2日 星期六

    在 CentOS 設定子域名

    Setting Subdomain in CentOS

    為方便把客戶的網頁項目分類,之前嘗試過在 CentOS 服務器設定 VirtualHost 但失敗了。後來要用到 HAProxy 才能成功。但這個方法要兩台服務器之餘,也比教轉折。女兒們去探望阿姨,我則選擇留在家中整理硬碟內的檔案。在等候拷檔的過程中,再試了 VirtualHost 設定。

    今次主要在 ESXi 內的 CentOS 搞搞震。按照網上的教學,做了兩段 VirtualHost 的設定,在重啟 Apache 時,出現「[warn] _default_ VirtualHost overlap on port 80, the first has precedence」錯誤。當然,只有第一段的設定生效。檢查過設定沒問題,後來發現是少了一句「NameVirtualHost *:80」。加回後重啟 Apache,成功了!

    2013年11月1日 星期五

    UILongPressGestureRecognizer 被呼叫兩次的解決方法

    荒廢已久的《AMIGO Controller》一直沒有再次提起,似乎不太想面對那複雜的邏輯(新動作編輯系統)。今日勉強地重拾工作,找到長按 MotionButton 時會出現兩次 UILongPressGestureRecognizer 的錯誤,於是著手解決。以下是原來的代碼:
    - (void)handleLongPress:(id)sender  {
     [self updateTouches:CGPointMake(-1, -1)];
     if ([_delegate respondsToSelector:@selector(motionButtonLongPress:)] == NO)  {return;}
     [_delegate motionButtonLongPress:self];
    }
    解決方法是在最初檢查一下狀態,要是 UIGestureRecognizerStateBegan 才做:
    - (void)handleLongPress:(id)sender  {
     UILongPressGestureRecognizer *recognizer = (UILongPressGestureRecognizer *)sender;
     if (recognizer.state != UIGestureRecognizerStateBegan)  {return;}
    
     [self updateTouches:CGPointMake(-1, -1)];
     if ([_delegate respondsToSelector:@selector(motionButtonLongPress:)] == NO)  {return;}
     [_delegate motionButtonLongPress:self];
    }

    2013年10月31日 星期四

    請支持無障礙E道沿用Sita陳僖儀的聲音

    http://www.ipetitions.com/petition/sitachan/

    以下轉發至Sita媽咪

    致入境處及失明人協進會:

    有鑑於 Sita 生前亦曾是失明人士助跑領行員,也可算是她和失明人士一種愛的聯繫,故此希望她的聲音能再陪他們同行,作為 e 通道的領行員。妹妹聲音酷似家姐,故沒錄的聲段,才再由妹妹補上。可能此舉是會令你們增添麻煩,加重你們的工作,但仍希望 Sita 的聲音能在空氣中傳播,延續她永遠想替人做到最好的理念。

    Sita 媽媽

    2013年10月30日 星期三

    兩年半的堅持

    公司成立至今己經兩年半。一直堅持在每周第一個工作天的早上召開例會,檢討工作進度、分享學到的知識、讓同事了解公司的發展;當然亦希望同事在群眾壓力下會準時上班、準時完成工作。這個堅持在今天結束了。

    事與願遺,十時開始的會議,同事們總是要遲到十五分鐘才回來;回來後又得點時間準備需要展示的內容;甚至要在會上吃早餐;足以表達他們對會議的冷漠。會議過程中,同事交代進度,基本上只有我和當時人在交流,其他人都不專心聆聽。分享環節總只得我分享,間中才會有同事願意把所學到的東西分享出來。總總因素,使我認為開會只是浪費大家的時間,那就不如算了。

    我有想過用鬧來改善狀況,一想到大家都是成年人,清楚知道自己的崗位,不用要「鬧」才改吧!況且我也討厭「被鬧」。己所不欲,勿施於人。心底裡也怕「鬧」走了,又要招人...。既然大家都不願意開會,那就節省少少吧!

    2013年10月29日 星期二

    成功安裝 ESXi


    安裝了新買的 Intel Pro/1000 MT 之後,能成功在 Asus P5K SE 上安裝 ESXi。

    可是,到安裝 OS 上出了問題。在公司把 CentOS 的影像檔拷到 ESXi Datastore 時,236MB 的檔案竟然要上傳 140 分鐘,實在「痴線」。想用機器內的 DVD 光碟機,ESXi 又偵測不到;想透過 USB 又是偵測不到;最後還是放棄了,把整台機搬回家。家中的 LAN 線已經提升至 CAT 6,所有接線的機器都支援 Gigabit,一切準備就緒,只欠那台伺服器的設定成功。幸好,家中上傳那個 CentOS 影像檔只需 5 秒,傳個 4GB 檔也慢不了多少。

    我把 ESXi 劃分成兩台機:一台 CentOS 6,另一台則是 Windows 7。前者用來作為網頁伺服器,後者則是影片串流、IE、BT 之用。之後的安裝都很順利,只是在 Windows 內卻找不到聲效卡,無法把聲音輸出...。

    2013年10月28日 星期一

    再試 ESXi

    Setup ESXi Again

    網友指 Intel Pro/1000 系列最能兼容 ESXi。之前鎖定了 CT 版本,所以昨天到深水埗高登電腦中心找卡。找到兩家小店有這款卡發售。價錢約為 HK$380。由於未能確定添加此卡後能否順利安裝 ESXi 5.5,於是繼續看看有沒有更好的方案。皇天不負有心人,找到另外兩家小店出售 Intel Pro/1000 MT,價錢更只需 HK$168。在網上查看資料,發現有外國朋友成功使用雙頭版的 MT 安裝 ESXi 5.0,相信單頭版的也沒問題,於是付錢購買。

    今早,在我的 ASUS P5K SE 底板上裝上 LAN 卡後,再次安裝 ESXi,今次真的成功了!由於今天實在很忙,未有時間安裝虛擬電腦,留待明天繼續...。

    2013年10月26日 星期六

    MacBook Pro Late 2013


    在星期三零晨的發佈會推出升級版後,再次引起我購買新版 MacBook Pro with Retina Display 的慾望。第二天跟「果農」聯絡後,得悉平時要等三個月才能以優惠價購買蘋果產品的他,今次竟然能第一日便能購買!我當然不能錯過這次大好機會,立即跟他落單!花了三天,新機已經到手。能用比初階版更便宜的價錢買到中階版,實在很高興!

    2013年10月22日 星期二

    初試 ESXi

    Setup ESXi

    我的家中只剩一台十年前買的 Fujitsu 手提電腦及五年前買的桌面電腦是使用 Windows;其他的都是 Mac 系電腦。手提電腦是給內子看韓劇,而桌面電腦原本是用來開發 iOS 應用,現在則留給女兒做功課。因為出版商的網上練習一直都停留在只有 Internet Explorer 6 才能正常運作。友人分享了他家中 ESXi 服務器的佈局,引起了我的興趣。回家後立即動手修改。

    我想把 ESXi 安裝到桌面電腦後,同時設定 Linux 及 Windows 系統。Linux 給我作為網頁及數據服務器;而 Windows 則用作韓劇影片串流服務器。同時女兒也能透過 iPad 連接服務器,打開 IE6 做功課,不用把整台電腦硬塞到細小的書枱上。這個佈局很好用,能同時滿足三位使用者的需要。可是 ESXi 並不容易安裝,在我的華碩 P5K-SE 底板中出現「找不到網絡卡」的問題而無法繼續。在網上找過很多不同的方法,都無法修正問題。看來一是買張 Inter Pro 1000 系網絡卡來解決;或是改為 Linux 底,在 VirtualBox 跑 Windows。後者當然的效能較慢...。

    2013年10月20日 星期日

    Sita Chan @Chivas




    替《Chivas》開發的 iPad App 在昨天的晚會第一次使用,今日需要把 iPad 拍下來的照片從服務器取回來並發給客人。在客人的 Facebook 粉絲頁內無意中找到了一個包含 Sita 陳僖儀的照片。我從未看過這批照片,看來是 Sita 想要給我看的。當時已跟客戶合作第二個應用,再一次在生命中跟 Sita 擦肩而過...。

    2013年10月19日 星期六

    Chivas 18: The Dream City


    上周五,客人找我們開發一款 iPad 應用,在本周五使用。開發及測試時間只有三天半,實在急趕。然而,部份功能(如:把相片貼到 Facebook Fan Page 內)還是第一次製作;在這麼短的時間完成,已經是很有效率。然而,急趕換來一點點不穩定;這是理想與實際的落差所造成的。幸好,還是有解決問題的方法;簡單地修改一下,總算渡過難關。多謝負責的朋友,Objective-C 經驗不多但品質好。

    2013年10月18日 星期五

    下載 OnTV 影片

    Searching Sita's News on Oriental Daily

    昨晚編寫的程式,只要稍微改動一下,便能擷取《東方日報》的新聞。

    不過,在擷取的同時,更想下載 OnTV 的影片。由於影片被 Flash 包裹,無法直接看到它的位置,不像《蘋果日報》般容易地找到,需要花點時間及工具,才能找到影片的網址。最終找到網址的格式是:

    http://202.125.90.194/Video/[yyyyMM]/[id]_ipad.mp4?&msect=150&ssect=yahoo
    * [yyyyMM] 是影片的拍攝年份及月份,如:201304
    * [id] 是影片的編號,如:OBK-130417-12286-07M2

    影片編號是以 XML 格式發送到瀏覽器,以下是它的內容:

    2013年10月17日 星期四

    《蘋果日報》搜聞

    Searching Sita's News on Apple Daily

    今晚不想搞《AMIGO Controller》,反而想搜尋一下 Sita 在《蘋果日報》的新聞及動新聞。於是寫了一個 PHP 程式,把搜尋到的新聞標題及連結顯示在畫面上,我再人肉地把新聞擷圖及影片下載。程式不難寫,原理都是遂天讀取目標頁,搜尋有沒有「陳僖儀」出現,再把連結顯示出來而已。程式雖然簡單,但卻幫得上忙。

    2013年10月16日 星期三

    拉闊圖書館.十:認識八個字

    BeyondZ Library 10

    到了第十課的拉闊圖書館。我再次成為講者。今次的題目是《認識八個字》。向同事講解術數中的八字。

    要在短短一小時交代術數的複雜理念,根本是不可能,只好講解一些必須要知的事情,如:天干地支、陰陽五行、十神代表、八字中哪個字是自己、批命看生剋制化。由於要記的事實在太多,大家都不會記得,最後還是就著喜歡的事情提問及解答。足足花了兩個半小時才完成今次的課堂,證明大家對命理也很有興趣。

    2013年10月12日 星期六

    把 PHP 程式放在背景執行

    Execute PHP in Background

    之前開發的「《頭條日報》自動剪報系統」起初是在 SSH Terminal 下執行,但過不久便會因逾時而被終止。解決辦法是把 PHP 放在背景中執行,可使用「nohup php index.php &」指令。這樣,所有輸出到畫面的內容都會存入 nohup 檔案內。只要利用「tail -f nohup.out」便能觀看最近幾行輸出的內容。

    2013年10月11日 星期五

    設定 VPN

    VPN Settings in QNAP TS-210

    早幾天把 QNAP TS-210 的韌體升級後,發現服務器被黑中,每天有數個 IP 地址的電腦不斷嘗試 SSH 的登入名稱及密碼。有見及此,的起心肝設定 VPN,減少服務器直接對外的接口數目。

    上一版本的控制台沒有 VPN 選項,是目前版本新增的,方便我這種不懂設定服務器的人。設定十分簡單,朋友說 OpenVPN 安全但 iOS 無法連接,建議使用 PPTP,所以就只在 Enable PPTP VPN server 前打勾,除最大連接上限外,其他的都選用預設值。儲存後便能立即使用。在 iPhone 5 及 MacBook Air 中簡單設定一下 VPN 的地址及帳號,便能順利使用!

    2013年10月10日 星期四

    為已有的項目加入 Git 控制

    Adding Git Control to Existing Xcode 5 Projects

    朋友示範了本地 Git 的用法,實在很方便。於是想把開發了一年之久的《AMIGO Controller》加入 Git 代碼控制。可是選項中找不到加入 Git 的方法。這是因為在正常情況下,只有在新建項目時才有得選擇。

    要對現有項目加入 Git 的話,步驟如下:
  • 關閉 Xcode 5
  • 打開 Terminal
  • 跳轉到項目的資料夾,如:AMIGO_Controller
  • 建立一個名為 .gitignore 的檔案
  • 把以下內容加到 .gitignore 檔案內:
        UserInterfaceState.xcuserstate
        build
        *.pbxuser
        *.perspectivev3
        *.mode1v3
        *~
        *~.nib
        *~.xib
        .DS_Store
        xcuserdata/
  • 輸入 git init 後拍 Enter 鍵
  • 輸入 git add . 後拍 Enter 鍵
  • 輸入 git commit -m "Initial commit" 後拍 Enter 鍵

    這樣的改動之後,重新打開 Xcode 及項目,便能見到 Source Control 內的選項。如在執行 git 時出現問題,可到 http://git-scm.com/downloads 下載 Git 程式。安裝後要重啟 Terminal 才會生效。
  • 2013年10月9日 星期三

    iBeacon 示範程式


    從一位專門製造 Bluetooth BLE 產品的朋友手上借來了一顆 iBeacon 硬件。在 Apple 公開 iBeacon 規格前,他已經能利用《逆向工程》製作出 iBeacon 硬件,實在利害。比起最便宜的 iOS 裝置,它的售價便顯得更加便宜,相信能讓市場接受。

    既然硬體準備好,那就由我公司開發軟件部份。朋友最近有空,來了我公司幫忙數星期,這個項目就交給了他負責。花了一天時間已經按要求完成 iBeacon 示範程式,可在日後的展覽場合使用。