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];
    }