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 的聲音數據來還原她的口腔結構,變成立體模型後,便能按模型的活動重現不同的聲音。我不知道這個想法是否可行,但希望機械人技術能把它實現出來。