跟四位機械人發燒友去太古城的機械人展。展出的都是能在市面買到的機體,除了那台像真度高的女機械人外,沒有一點驚喜。反而之後坐下來「吹吹水」來得開心。
網友 Peter 也有出席,順道把製造好的部件交給我。回家後放進機體,尺寸剛剛好,十分精準。可是在 Servo 碟的位置則遇到問題,可能是繪畫設計圖時量度得不好,Servo 碟剛剛無法穿過板金的圓孔,需要把孔擴大才能繼續安裝...。
My studies, development and creations on Robotics, iPhone Apps, Andriod Apps,...etc.
2012年3月31日 星期六
2012年3月30日 星期五
Arduino vs ATMega128
這個星期忙於趕製為客人度身訂製的 Samsung Galaxy Tab 7.7 應用及其後台管理項面。也花了點時間看完一本新書「Make: Arduino Bots and Gadgets」。所以沒時間嘗試新的技術。選這本書看,是因為 AMIGO Hexapod 的機體差不多完成,是時候選擇 MCU。我的首選是 ATMega128。過往三架機體也是用這塊小板。最近得悉 Arduino 後,想了解一下是否合用。它有很多資源,也很易容,但不適合我。我跟 Steve Jobs 一樣很喜歡控制身邊的事物。Arduino 給我的印象跟 BASIC 一樣。易學易用,但無法隨心所欲,而且慢。所以,還是用 ATMega128 ASM 好。
2012年3月29日 星期四
2012年3月25日 星期日
組合 AMIGO Hexapod
Constructing AMIGO Hexapod
今個周末十分忙,除了應付大女兒的活動外,還要加班趕工。既然昨晚拿到板金,就在早上來個安裝。效果十分理想,不過開始感覺到一點重量。希望六顆 S3003 能夠支持身體的重量。萬一不能的話,便要用 MG995 來頂替。
今個周末十分忙,除了應付大女兒的活動外,還要加班趕工。既然昨晚拿到板金,就在早上來個安裝。效果十分理想,不過開始感覺到一點重量。希望六顆 S3003 能夠支持身體的重量。萬一不能的話,便要用 MG995 來頂替。
2012年3月24日 星期六
AMIGO Hexapod 板金二號入手
這個星期很忙,有一個應用趕著上架;而另一個則趕著完工。卒之要星期六才有時間找 Peter 取得 AMIGO Hexapod 的板金。面板厚度為 2mm,底板厚度為 1.5mm。多謝 Peter 的幫忙!
2012年3月23日 星期五
Javascript 下的 UTF-8 加密工程
Javascript UTF-8 Encoding
有兩個在進行的項目都有 Admin Page 作數據管理。一個是正體中文,另一個是簡體中文。當中有需要用 Javascript 把中文字串加密;一來增加保安程度,二來避免了破壞 URL。在另一端的 PHP 會把數據解密後儲存到數據庫中。可是,在 HTML 的檔頭已經設定為 UTF-8,但用 Javascript 轉換出來的數據卻不正確。PHP 的解密程序會視一個 UTF-8 文字為 24-Bits,而 Javascript 輸出卻只有 16-Bits。經過連翻試驗之後,發現要經過 unescape(encodeURIComponent(x) 洗禮,Javascript 的文字才會變成 24-Bits UTF-8 文字。
有兩個在進行的項目都有 Admin Page 作數據管理。一個是正體中文,另一個是簡體中文。當中有需要用 Javascript 把中文字串加密;一來增加保安程度,二來避免了破壞 URL。在另一端的 PHP 會把數據解密後儲存到數據庫中。可是,在 HTML 的檔頭已經設定為 UTF-8,但用 Javascript 轉換出來的數據卻不正確。PHP 的解密程序會視一個 UTF-8 文字為 24-Bits,而 Javascript 輸出卻只有 16-Bits。經過連翻試驗之後,發現要經過 unescape(encodeURIComponent(x) 洗禮,Javascript 的文字才會變成 24-Bits UTF-8 文字。
function encodeString(inputString) { var outputString = ""; var utf8String = unescape(encodeURIComponent(inputString)); for (var i=0; i<utf8String.length; i++) { var value = utf8String.charCodeAt(i); var encodedValue = (value^secretKey); var hex = Number(encodedValue).toString(16).toLowerCase(); if (hex.length == 1) {outputString += "0";} outputString += hex; } return outputString; }
2012年3月22日 星期四
在 Mac 上把 PDF 轉為圖檔
PDF to Image Sequence on Mac周二晚上十一時許,突然收到客戶的來電要求把一本雜誌上架,希望能在第二朝開會時展示給老闆觀看。由於管理頁面還有幾個技術問題尚待解決,我唯有尋求其他解決方法。原來利用 Mac 本身的 Automator 便能完成這樣的轉換工作。
首先,在 Automator 建立新 Workflow 之後把 PDF 拖拉到 Automator 的右方 在左上方的搜索欄輸入 PDF Image 把下方的「PDF to Images」拉到視窗右方,並選好輸出目錄 在左上方的搜索欄輸入 Type 把下方的「Change Type of Images」拉到視窗右方 選擇輸出的圖檔格式 最後按「開始」鍵進行轉換
用了 Mac 四年,覺得 Apple 的設計十分體貼,很多事情不用安裝軟件便能做到,不像 Windows 般只得一個空殼系統。
用了 Mac 四年,覺得 Apple 的設計十分體貼,很多事情不用安裝軟件便能做到,不像 Windows 般只得一個空殼系統。
2012年3月21日 星期三
上傳大檔案
Upload Large File
最近開發了一個雜誌架 App,能讓客戶自行發佈新雜誌。為了有效測試,我選用較細小的檔案,直至所有流程都沒有問題為止。現在就是這個時候。當我嘗試拿真正的檔案進行測試時,發現檔案無法成功上傳。在網上不斷尋求解決辦法,可惜問題依然存在。經過多次嘗試之後,發現了解決方法。
修改服務器的 php.ini:post_max_size = 100M upload_max_filesize = 100M
在接收檔案的 php 目錄新增 .htaccess 檔: php_value upload_max_filesize 100M php_value post_max_size 100M php_value max_execution_time 1000 php_value max_input_time 1000
修改後要重啟服務器。
最近開發了一個雜誌架 App,能讓客戶自行發佈新雜誌。為了有效測試,我選用較細小的檔案,直至所有流程都沒有問題為止。現在就是這個時候。當我嘗試拿真正的檔案進行測試時,發現檔案無法成功上傳。在網上不斷尋求解決辦法,可惜問題依然存在。經過多次嘗試之後,發現了解決方法。
修改服務器的 php.ini:
在接收檔案的 php 目錄新增 .htaccess 檔:
修改後要重啟服務器。
2012年3月20日 星期二
2012年3月18日 星期日
2012年3月17日 星期六
DHL Express is dying
自從昨天收到 iPad 出貨通知之後,一直監測住送貨的進度。下午三時發現包裹已經在速遞手裡,滿心歡喜,匆匆忙忙回家等候。一直等到晚上十時半,在蘋果網頁發現住宅的送貨時間是朝九晚九。在希望落空之際,再次監測送貨進度時,竟發現「Delivery attempted; recipient not home」。在沒有電話、沒有 SMS 通知、本人又一直在家、大門打開了的情況下,出現這個狀態實在令我驚訝。
於是致電客戶服務熱線,指客服時間已過,要星期一再打過去。致電客服總機,又說無法查詢,連留下訊息也不行,確保寄送地址沒有出錯也不行。究竟是個怎樣的系統?一家國際商業機構的服務質素竟然是這樣!DHL Express is dying...。
於是致電客戶服務熱線,指客服時間已過,要星期一再打過去。致電客服總機,又說無法查詢,連留下訊息也不行,確保寄送地址沒有出錯也不行。究竟是個怎樣的系統?一家國際商業機構的服務質素竟然是這樣!DHL Express is dying...。
2012年3月16日 星期五
iReserve 策略
Strategy on iReserve
昨日最多朋友一起做的事,相信非「預訂 iPad」莫屬。究竟怎樣可以提高抽中的機會?白想了一會,我有以下結論:
在 iReserve 中訂購全新 iPad 可選 1 台或 2 台。從這點來看,我認為訂 1 台的中獎機率會較大。假設 iPad 的數目是固定。在抽韱的時候,應該是抽到 2 台扣 2 台,抽到 1 台扣 1 台。假如當中有中獎者是選 1 台的話,那麼尾數便有機會是 1。這時要求 2 台的人便會落空;變成要求 1 台的人在抽,大大縮小抽獎範圍,增加中獎機會。就算尾數是 2 的話,選 1 台的機會率也不會變小。
在這時人人都預訂 2 台的時間,選 1 台似乎有點著數。以上只是我個人的假設,與實際情況可能有異,只作參考之用。要是 Apple 不是以台數作限,而是用人次的話,以上方法便起不到作用。
後記:最終我選了 1 台 16GB WiFi 版本,沒抽中。
昨日最多朋友一起做的事,相信非「預訂 iPad」莫屬。究竟怎樣可以提高抽中的機會?白想了一會,我有以下結論:
在 iReserve 中訂購全新 iPad 可選 1 台或 2 台。從這點來看,我認為訂 1 台的中獎機率會較大。假設 iPad 的數目是固定。在抽韱的時候,應該是抽到 2 台扣 2 台,抽到 1 台扣 1 台。假如當中有中獎者是選 1 台的話,那麼尾數便有機會是 1。這時要求 2 台的人便會落空;變成要求 1 台的人在抽,大大縮小抽獎範圍,增加中獎機會。就算尾數是 2 的話,選 1 台的機會率也不會變小。
在這時人人都預訂 2 台的時間,選 1 台似乎有點著數。以上只是我個人的假設,與實際情況可能有異,只作參考之用。要是 Apple 不是以台數作限,而是用人次的話,以上方法便起不到作用。
後記:最終我選了 1 台 16GB WiFi 版本,沒抽中。
2012年3月15日 星期四
HTML 及 CSS 筆記
HTML & CSS Notes
把 DIV 設定成半透明,可在 CSS 加入
background-color: #000000;
opacity: 0.3;
取得 selector
var newsletter = document.querySelector('#newsletter');
從字串中分拆成 array
dataArray = request.responseText.split("|");
在數字前方補零
var formattedMagazineID = "000000"+magazineID;
formattedMagazineID = formattedMagazineID.substr(-6);
隨機數
var randomNumber = Math.floor(Math.random()*1000);
建立 URL 安全的字串
var safeContent = encodeURIComponent(content);
彈出選擇視窗
var answer = confirm ("Are you a girl?");
if (!answer) {echo("No!");}
把 DIV 設定成半透明,可在 CSS 加入
background-color: #000000;
opacity: 0.3;
取得 selector
var newsletter = document.querySelector('#newsletter');
從字串中分拆成 array
dataArray = request.responseText.split("|");
在數字前方補零
var formattedMagazineID = "000000"+magazineID;
formattedMagazineID = formattedMagazineID.substr(-6);
隨機數
var randomNumber = Math.floor(Math.random()*1000);
建立 URL 安全的字串
var safeContent = encodeURIComponent(content);
彈出選擇視窗
var answer = confirm ("Are you a girl?");
if (!answer) {echo("No!");}
2012年3月14日 星期三
真相不在表面
今天在職場上學到「真相不在表面」。就像在開會時,董事提議開發部為趕及死線要加班處理。此話不是第一次聽到。其實加班不時在做,只是加班的地點不一定要在公司而已。這個錯誤也發生在我身上。新同事的工作效率未如理想,代碼的擴展性也有待改善,平時見他準時返工放工,感覺不到他的熱誠。但今天溝通後卻有另一發現,原來他為了這份新工作購買了一台 MacBook Air,以便在家也能盡力學習 Objective-C。這是我觀察所遺留了的部份。
今日那同事在公司最後上班的日子。希進他能繼續學習 Objective-C,日後有緣的話能再次合作。
今日那同事在公司最後上班的日子。希進他能繼續學習 Objective-C,日後有緣的話能再次合作。
2012年3月13日 星期二
PHP 開發筆記
PHP Commands
以下是一些常用的PHP 句法:
建立新 array
$fileArray = array();
加入數據
$fileArray[] = $file;
逆向排序
rsort($fileArray);
讀取 array 中所有的內容
for ($i=0; $i<count($fileArray); $i++) {}
不是所有瀏覽器都支援
$_FILES['upload']['tmp_name'];
$_FILES['upload']['name'];
要從 PHP 中輸出圖片內容,要先設定 Contet-Type:image/jpg 後,再用 readfile($imagePath); 輸出
取得字串長度
strlen("This is a PHP string");
取得當刻時間
$today = date("Y-m-d H:i:s");
以下是一些常用的PHP 句法:
建立新 array
$fileArray = array();
加入數據
$fileArray[] = $file;
逆向排序
rsort($fileArray);
讀取 array 中所有的內容
for ($i=0; $i<count($fileArray); $i++) {}
不是所有瀏覽器都支援
$_FILES['upload']['tmp_name'];
$_FILES['upload']['name'];
要從 PHP 中輸出圖片內容,要先設定 Contet-Type:image/jpg 後,再用 readfile($imagePath); 輸出
取得字串長度
strlen("This is a PHP string");
取得當刻時間
$today = date("Y-m-d H:i:s");
2012年3月12日 星期一
avrdude stk500v2_ReceiveMessage
以前開發機體用的軟件,都是用 Fujitsu Lifebook + Windows XP 的。這幾年轉用 Mac 後,決定在周末嘗試在 Mac OS X Lion 上開發 AMIGO Hexapod 的軟件。第一樣要處理的事項是把 .c 組譯成 .hex 後下載到 ATmega128。找到了 CrossPack 有以前使用開的 avrdude,還能用 Xcode 開及(在 Terminal 下以 avr-project Main 來建立專案)。組譯方面沒有問題,不過使用跟 Windows 一樣的參數卻無法跟 ATmega128 連線。可能是由於以前用的 USB -> RS232 接線在 Mac 下都沒有驅動程式,改為使用 Bluetooth 的緣故。找了很久試了很久都沒有反應,日後繼續!
2012年3月8日 星期四
2012年3月6日 星期二
2012年3月5日 星期一
UIImageView 三維處理
UIImageView 3D Transform有一陣子沒有寫作 iOS 開發的筆記,是因為工作實在太忙,有好幾個項目需要由我去處理。新來的同事還未能夠減輕工作量。希望他能在不夠的將來能獨自處理開發項目。
今個星期將有一個人 AR 項目需要完成。當中有些畫面需要用到立體圖像處理;因此在項目開發的初期已經加入 OpenGL 圖層。可是,我不熟悉 OpenGL,花了整天時間都無法把平面的貼圖以三維方式旋轉及顯示。於是想到能否用 UIKit 來達成。回家吃過晚飯之後,隨即編寫代碼進行實驗。意外地簡單便能做到!
今個星期將有一個人 AR 項目需要完成。當中有些畫面需要用到立體圖像處理;因此在項目開發的初期已經加入 OpenGL 圖層。可是,我不熟悉 OpenGL,花了整天時間都無法把平面的貼圖以三維方式旋轉及顯示。於是想到能否用 UIKit 來達成。回家吃過晚飯之後,隨即編寫代碼進行實驗。意外地簡單便能做到!
#define DEGREES_TO_RADIANS(x) (3.14159265358979323846*x/180.0f) - (void)updateFrame { static CGFloat degrees; float zDistance = 250.0f; degrees++; CATransform3D transform3D = CATransform3DIdentity; transform3D.m34 = 1.0/zDistance; transform3D = CATransform3DRotate(transform3D, DEGREES_TO_RADIANS(degrees), 1, 0.5, 0); _imageView.layer.transform = transform3D; }
2012年3月1日 星期四
訂閱:
文章 (Atom)