2011年12月30日 星期五

再看Design Pattern

最近有機會重新思考軟體建構的深度, 最終目標當然是能把Design Pattern化為己用, 而不是只能看懂別人的用法.

基本上, 個人認為, 雖然四人幫的著作是Design Pattern的鼻祖, 但真正發揚光大感覺是Java出現以後, 繼之前高先生的Android Design Pattern之後, 說真的, 要驗證是不是真的融入自己的招式,就看自己的思路就可以知道, 幾乎不太想得出當初理解的感覺, 不是書上寫得太牽強, 就是我還沒辦法融會.

看到書架上還有一本2002年出版的,"Design Patterns於Java語言上的實習應用", 是日本人寫的, 大略看了一下, 應該會有更好的感覺才是, 光K武功祕笈始終不夠, 一定要能融會到自己的系統邏輯, 才能衍伸出自己的一套用法.

寫程式的年資和寫程式的能力是沒有關係的, 真正要晉升到另一個層次, 還是要靠高段的思考邏輯以及融會前人累積的解題模型, 針對系統所處的情境最適當的設計.

2011年11月9日 星期三

VS2008 Build Event使用命令列,需要系統管理權限(非執行期UAC問題)

狀況描述:

我的狀況有別於大部分開發者要的是編譯完的執行程式能主動詢問使用者UAC的設定, 我的問題是project在建置事件的命令列用到fsutil, 編譯時出現了以下訊息

"FSUTIL 公用程式要求您必須具有系統管理權限。"

開發環境:
OS: Windows7 64bit, IDE: VS2008

解法:

先以系統管理員身分啟動VS2008 IDE, 再Load .sln, 這樣就可以了

以下所述都是為了解執行期的UAC設定, 雖然不合我用, 還是列出來

http://msdn.microsoft.com/en-us/library/bb756929.aspx
(原始設定)
專案->屬性->連結器->資訊清單檔
UAC執行層級= asInvoker




2011年10月31日 星期一

如何處理 winmail.dat

好久沒看到這個outlook寄出來的格式, 記得之前是用有時效性的command line tool去解, 但是太久沒用了, 於是再去問問Google大哥, 是有看到其他的免費軟體, 但是要安裝, 想想實在不常用, 何必裝個軟體把環境弄亂, 最後選擇線上解開的方法

http://www.winmaildat.com/

當然唯一的缺點就是會怕檔案流出去, 這個可要考慮清楚喔
如果不介意要安裝的

http://www.kopf.com.br/winmail/

這是for Windows, 可是我沒有試過喔!!(Linux, Mac網頁上也有連結, 要研究Source Code的可以看Linux的, http://sourceforge.net/projects/tnef/)
---------------------------------------------------------------------------------------
2013/7/23 Update
若要從源頭去解, 就是避免寄出附件變成 winmail.dat (TNEF 格式)
基本上, 改郵件格式設定或是改註冊檔

可以參考

微軟官方改註冊檔
http://support.microsoft.com/kb/958012/zh-tw
微軟官方改Outlook設定
http://support.microsoft.com/kb/278061/zh-tw

您會收到電子郵件訊息,其中包含 「 winmail.dat 的附件。如果下列條件全部成立,可能會發生這個問題:
  • 被人使用 Microsoft Outlook 電子郵件訊息傳送給您。
  • 訊息的格式是 Rich Text 格式 (RTF)。

這個問題是通常可以透過網際網路電子郵件訊息傳送給您時。
------------------------------------------
Winmail.dat 檔案中的資料便無法使用。若要解決這個問題,請要求寄件者重送訊息,以純文字格式。下列方法可依寄件者若要避免傳送純文字訊息封裝中傳輸中立封裝格式 (TNEF)。

方法 1: 變更預設的訊息格式

寄件者可以變更它們使用下列步驟來傳送電子郵件訊息的格式:
  1. 在 [工具] 功能表上按一下 [選項],然後再按一下 [郵件格式
  2. 在 這個郵件格式撰寫按一下若要選取純文字,然後按一下[確定]
附註: 若要傳送給特定收件者使用 RTF 格式和其他人以純文字格式的收件者,寄件者必須在 [個人通訊錄] 或 [收件者連絡人記錄設定收件者選項。

方法 1: 變更預設的訊息格式

若要從收件者的屬性在 [個人通訊錄中移除 rt f 格式,寄件者可以使用下列步驟:
  1. 在 [工具] 功能表上按一下 [電子郵件通訊錄]。
  2. [名稱來源] 中,按一下 [個人通訊錄。
  3. 選取您想要設定為純文字收件者然後按一下 [檔案] 功能表上的 [屬性
  4. 在 [ SMTP 一般] 索引標籤中,按一下以清除 我要傳送到此收件者Microsoft Exchange rtf 格式 核取方塊,然後再按[確定]

方法 3: 變更特定連絡人格式

寄件者可以使用下列步驟來設定 [純文字在收件者連絡人記錄中:
  1. 在 [連絡人] 資料夾中開啟該收件人的記錄。
  2. 按兩下 [收件者的電子郵件地址]。
  3. 在 [電子郵件內容] 對話方塊中,按一下 只用純文字傳送 在 [網際網路格式

方法 4: 將 Outlook Rtf 文字格式的網際網路電子郵件設定

  1. 在 Outlook 2003 與 Outlook 2007 中,按一下選項在上工具 功能表。
  2. 按一下 郵件格式 索引標籤。
  3. 按一下 網際網路格式.
  4. 在下Outlook 純文字選項按一下任一個 將轉換成 HTML 格式 -或者- 將轉換為純文字格式.
---------------------------------------------------------------------------------------
2013/7/24 Update
如果是Office 2003, 有可能是多語系支援的問題
http://support.microsoft.com/kb/905645/zh-tw

在 Microsoft Office 2003 多語系使用者介面套件所修正問題



2011年10月12日 星期三

Open Source License

五種開源授權規範的比較 (BSD, Apache, GPL, LGPL, MIT)

運用自由軟體元件於政府補助計畫的後續商用建議

我的理解是這樣

1. 所有授權都要附上授權協議文件檔
2. GPL最嚴苛, 只要有用到這種授權的source or binary, 自己開發的相關程式碼, 不管是修改Open Source, 或是引用Open Source, 都要公開
3. LGPL是可以將OpenSource當library用, 自己寫的code只是引用Open Source library, 就不需要公開, 可以只release binary, 相對的, 引用的 Open Source不能修改, 這也是新版Qt授權的最大改變, 當然若是改到Source code, 還是要公開修改的code
4. BSD, Apache, MIT都是任你改, 只要附上授權協議以及原作的版權聲明, 然後保險一點在程式碼註解加上修改者和修改日期(binary viewer還是看得到的), 可以不用公開修改過的code, 自己引用Open Source的code也可以不用公開

實際狀況, 最好還是經過公司的法務部背書

2011年10月6日 星期四

Photography Lighting

One-light
Hair lighting
Silhouette lighting
Rim lighting
Flat lighting
Paramount (butterfly) lighting
Rembrandt (triangle) lighting
Two-light
Natural-light

2011年10月3日 星期一

何謂Teamwork?

很多團隊在找人都要求能Teamwork, 這實在是很奇怪的問題, 人是群居的動物, 再宅的人還是會和人互動, 只是互動的介面是不是實體的介面, 我在想, 會要求能Teamwork, 或是Teamwork態度的背後意涵是什麼? 我認為大部分要的是能配合延長工時, 有需要隨傳隨到, 分配到的任務鞠躬盡瘁, 是這樣吧?

誰不希望你的手下是這種猶如春秋戰國的死士, 其實這種死士現在還是很多的, 君不見多少人不惜爆肝也要賺到公司的績效股票, 所以工作不再是興趣, 工作分配不再是視成員特性互補, 而是看配合度, 即使不適合, 配合度高, 可以用時間彌補效率, 這種人在職場是最受歡迎的, 但對個人來說, 傷害也最大

一個團隊的形成, 組建團隊的人必須能知道每一個人的特性, 以發揮互補性, 甚至提升及激勵個人, 這有點像美國職棒的總教練, 至於總經理則是提供資源以利總教練做最有效率的分配, 團隊成員的素質若一致, 可以激勵向上提升, 若素質有落差, 那要看被拖垮的是素質高的還是素質差的, 總之, 程度差太多對整個合作也會很不協調

對個人而言, 最好不要想說自己盡本分就好, 畢竟這是群體的工作, 完成群體的任務才算成功, 但若能掌握全局(, 不是只有Project Leader才要掌握全局), 個人的工作也會比較能預期, 就像下棋一樣, 如果你能預期對手或夥伴的能力和工作模式, 那你就可以用比較好的安排來配合, 甚至協助, 讓大家的整合工作能更順暢, 這樣的Teamwork模式才是比較好的, 不然結局只會是任人宰割或是運氣使然. 畢竟, 以專案來說, 沒有個人的成功, 只有團隊的成功, 同時, 失敗也是大家一起的, 互相協助或是願意接受別人的建言或幫助, 才是真正的Teamwork, 特別是團隊中程度參差不齊時, 這一點更重要

你的C有多熟?

(先澄清一下,這裡的C是指程式設計的C語言)
聽到這個問題, 真的很難回答, 如果看過"讓天賦自由", 更會覺得難以回答, 為什麼, 標準傳統回答, 大概是拿認證或是學分分數來比較, 分數高的就學得好一點, 分數差的就遜色一些, 這種評斷的方法是針對你學C是為了以後要去教C, 而不是你要拿C來做什麼

程式語言只是為了達到程式系統目的的工具, 不同的應用以及規模有其適用的工具, (TODO: 舉例), 而實務上, 為達到應用, 常用的寫法, 大概也只有那種程式語言的一半不到, 要使用某種語言, 最快上手的過程其實不是鑽研程式語法, 程式邏輯對所有程式語言來說大同小異, 只是定義上稍有不同, 比一下就知道, 反而是編譯器的特性, 特定用途的慣用寫法, 如果能收集的到, 那才能快速掌握精髓而且實用, 不常用的還有對需求用不到的, 可以先放過, 例如你不寫Network, 相關的介紹就可以跳過, 不寫GUI, 相關的也是跳過, 之類的主題其實篇幅都很多, 現在程式語言的差異, 主要其實是相關提供的程式庫, 學程式語言主要是學程式庫的使用

如果有人始終搞不清楚程式語言的基本觀念, 例如C的指標, C++的template, Java的reference,我只能說, 找到好的解說文件, 跑個code, debug一下, 應該都可以弄懂, 真的完全無法理解, 應該避開那個程式語言, 做其他的應用, 但我想這種情框應該很少,以現代人對電腦科技的適應力來說

至於Compiler的特性, 這對C來說, 影響和指標的嚴重性不遑多讓, 畢竟C被普遍認為是跨平台的程式語言, 其所以能跨平台, 是因為能在不同平台重新編譯, 因此Compiler在不同平台, 甚至不同供應商, 就會有差異, 這差異讓你可能要對程式寫法要調整以配合硬體資源以及效能需求, 不過, 這方面還是找得到相關設計的資源(自從有網路之後), 沒有考慮這些問題不能做成是設計嗎? 當然可以, 中文英文說得好不好, 聽得懂還是有用, 即使語文認證分數有高低, 那也只是一個片面標準, 了解風俗文化才能有高竿的應用, 土法煉鋼是最不可取, 縱然能寫code, 但是品質堪慮, 但要寫到抽象藝術等級嗎? 那又過頭了, 只有少數人能欣賞, 還是實用導向, 又有內涵的寫法, 大家看了都懂, 又不落俗套, 這樣才好, 就像常用的成語或是俚語, 一套出來, 整個質感就出來了, 去找出程式語言的成語和俚語, 用得巧妙, 遠勝過語言認證高一級卻不會這樣用的人

回歸主題, 問這個問題, 或許要的答案是和這個語言定義相關的講法, 不過對我而言, 浮出腦海的卻不是這些, 也有很多程式能力認證的挑戰題可以找到, 但, 到底程式語言的目的是什麼? 中道去思考, 不役於物才能真正回歸自我

影像色彩處理核心開發

個人見解, 可以分為三個方向,可以以此分工,但要各司其職, 各盡其效, 才能得到好的成果

1. 演算法
2. 參數
3. 平台實做

這三類其實互有關聯, 不可偏廢, 不然也要有熟悉這三者介面以及流程的整合角色, 否則很難達到實際需求, 至於其內涵, 從名詞及實務上應該很容易理解, 只是資源以及個人的風格會影響實際的產出, 需要個別去檢討, 也沒什麼洽不恰當的問題, 而是在於主導者的心態, 以及時程和品質的考量, 反而我覺得開發流程的走法, 反而是影響成敗很大的因素

從實際需求去設計系統, 本是天經地義, 對需求有確實的了解, 負責的分工角色才能朝向相同的目的地前進, 沿途披荊斬棘, 不必為了創新而創新, 而是依照所處時空背景, 選擇最省時有效的方法

這個過程比較特別的是, 最好遵循軟體工程多重循環的做法, 不管是系統, 核心或是模組, 不要只有一次的產出就是最終成品, 最主要原因就是, 這是人為的設計, 每個人對需求規格的理解都有先天認知的差異, 即使再怎麼溝通或是明文定義, 仍然會存在未知的誤解或岐見, 透過多重循環的產出整合, 可以針對介面的部分做實務上的測試檢討, 而屬於自己單獨運算的部分, 不管是捏造或是真實邏輯, 只要能先滿足介面整合即可, 後續再自己抓空檔補足, 這樣做主要是為了藉由實際的整合動作, 來驗證當初談好的介面是否有缺陷或漏洞, 這種瑕疵如果在後期才發現, 最嚴重將導致原先設計要完全捨棄重建

2011年9月27日 星期二

Otsu Thresholding

沒有比這更清楚的了
http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html
當然Wiki也要查一下
http://en.wikipedia.org/wiki/Otsu's_method

Gray轉Binary還有其他方法(details please check OCRopus)

 transforms grayscale (and sometimes color) images into binary images.
  • BinarizeByOtsu
  • BinarizeByRange
  • BinarizeBySauvola

2011年9月26日 星期一

了解上帝旨意的方法

最近遇到工作上的重大抉擇, 碰巧在週遭出現了相關上帝的話, 和抉擇有重大關聯, 整理一下, 先把經文列下來, 後面再補感想

1. 2011/09/25
張懋禎牧師主日講道 "做你去!"("你只管去吧")
a)禱告
使徒行傳9:10~19
b)分析與詢問
以賽亞55:8~9
c)為宣揚耶穌的名(工作是為了榮耀上帝)
d)總結
雅各2:17
約書亞3:14~16

2. The Promises of Peace

“I will listen to what God the Lord will say; he promises peace to his people...”
(Psalm 85:8, NIV)
http://www.joelosteen.com/MessageViewer/Pages/MessageViewer.aspx?date=2011-09-22

3. The Way

“‘…how can we know the way?’ Jesus answered, ‘I am the way and the truth and the life. No one comes to the Father except through me’”
(John 14:5-6, NIV)
http://www.joelosteen.com/MessageViewer/Pages/MessageViewer.aspx?date=2011-09-23

4. Know When to Turn Away

“Turn my eyes away from worthless things; preserve my life according to your word”
(Psalm 119:37, NIV)
http://www.joelosteen.com/MessageViewer/Pages/MessageViewer.aspx?date=2011-09-26


2011年9月24日 星期六

Facebook 和 Google+

很明顯, Facebook拿來玩Game聊一些完全公開的事,洩密也無所謂,你的朋友就是全世界網友, 要考慮私密性或區別社交圈有不同的公開設定,用Google+還是比較心安

2011年9月22日 星期四

得到平安的應許

“I will listen to what God the Lord will say; he promises peace to his people...”
(Psalm 85:8, NIV)

"我要聽 神耶和華所說的話; 因為他應許賜平安給他的子民..."
詩篇 85:8, 新譯本 


translate from Today's Word from Joel and Victoria 2011/9/22
http://www.joelosteen.com/MessageViewer/Pages/MessageViewer.aspx?date=2011-09-22


無論你的生活此刻發生什麼事, 上主應允你可以得到平安. 不管是金錢,感情或是工作遇到困難, 這世上沒有任何事可以奪走這應許. 但要注意經文中的第一句--我們必須先盡到我們該做的. 也就是我們必須傾聽上帝的話語.


你可能會自己這樣想, "上帝又沒跟我說話". 但其實一但你接受耶穌做為你的上主和救贖, 你就已經屬於上帝. 聖經說, 你是他的羊, 因此你會聽從他的聲音(John 10:4,因為你認得他的聲音), 陌生人的聲音你將不跟隨(John 10:5,因為你不認得他的聲音).


上主的以各種方式對你說話. 
第一種, 經由神的話語,也就是聖經. 但有時候是經由偶遇的朋友, 一首歌, 或是大自然榮美的弦外之音. 有時候, 純粹只是深入精神內在很單純的"知道". 如果你不確定上帝如何和你說話, 請他教你. 開放你的心, 迫切期待聽到他的聲音. 當你花時間靜默來聽, 他會對你說話. 他會對你顯明他自己, 賜給你生命中每一天的平安.


禱告


天上的父, 謝謝你平安的應許. 今天, 我對你打開我的心, 求你教我如何清楚的聽到你的聲音. 我會傾聽, 遵從並且走在你所指引的道路.
奉主耶穌的名, 阿門

2011年9月18日 星期日

定義 新產品/技術的研發


開發原生技術(私有技術)
使用成熟技術開發新產品(use Open Source as kernel)
使用成熟技術重新設計既有產品(change OS or framework)
將既有產品或技術應用到新市場(烙鐵海綿用到臉部清潔)

2011年9月16日 星期五

羽絨夾克一分錢一分羽毛


http://shopping.pchome.com.tw/?mod=item&func=exhibit&IT_NO=DEAR59-A51081885&SR_NO=DEAR59&ROWNO=8
51%的羽毛, 1640/51=32.16元
http://shopping.pchome.com.tw/?mod=item&func=exhibit&IT_NO=DEAR59-A51081849&SR_NO=DEAR59&ROWNO=2
51%的羽毛, 2490/51=48.82元

http://www.lativ.com.tw/Detail/03357011
Lativ只有10%的羽毛,1580/10=158元

除非是為了Lativ造型,不然質料上是比較貴的,最便宜的還是之前買的BigTrain綠色羽絨衣,100%的羽毛,只是帽子太簡陋

2011年9月15日 星期四

老師該不該用勞基法

在天下雜誌看到洪蘭老師的專欄, 深深覺得, 老師的確是志業不是職業, 但這是針對有熱情的老師而言, 同樣的, 上班族若真的有心, 那也是志業而不僅僅是職業, 如果公司是你的, 你會把工作當志業還是職業, 如果學生是你的孩子, 而你也關心自己的孩子, 那你會把教育和照顧當志業還是職業.

我想大部分的老師或上班族都只是把工作當職業, 以至於排擠到真正有志向的從業者, 而社會或是政府的規範, 只能針對大多數人去設定, 我不知道這種狀況怎麼解, 社會的趨勢就是這樣, 從我個人的學習經驗, 我傾向都是自己看書學習, 現在還多了一個網路, 想要一個不同的說法, 各大名校都有開放視訊上課影片, 有問題, 網路上討論即可, 不再侷限在幾個有限的老師和同學, 可以看到的視野是想多寬就有多大, 老師的角色應該往引導的方向走, 也就是導師的任務, 教學的任務應該請全世界的公認名師錄製教學課程, 這樣學生受教的權利就不會有老師教學素質的問題, 只會有導師引導的問題, 而導師訓練的方向也應該會和現在培育師資的方向不同

你叫一個體育老師來教數學,怎麼想都很奇怪,就算是美勞老師還是很奇怪, 即使說國小課程容易, 但在啟發階段, 根基和觀念興趣沒有處理好, 將會影響未來的學習, 甚至影響到心理層面, 從小到大, 遇過太多只會念課本的老師, 這不是標準的上班族是什麼, 這些人當然是勞工, 他們的志業不在教學

洪蘭老師在"讓天賦自由"的推薦序也說,她認同"假如孩子沒有學好, 那是老師沒有教對", 現在的老師應該自許為專業經理人, 當你的團隊成員(學生), 有不懂的或是超前的, 應該要尋求資源來解決, 並不需要自己什麼專業知識都懂, 即使自己真的都懂, 但教不會別人, 還是要聽聽別的資源是不是有其他的教法或是理解方法

孩子們, 現階段和20年前沒什麼兩樣, 遇到好老師或是靠自己(靠家長)

2011年9月5日 星期一

Histogram Equalization的物理解釋

個人解釋,有錯請包涵並指正

公式證明找得到,但希望可以用理解的方式來看這個結果

基本上推導出的結論就是將原影像的CDF當作轉換用的LUT,得出的新影像其PDF產生的CDF會和定值的PDF產生的CDF一樣, 會是斜直線,照理PDF應該要變成水平的吧?但不會,是因為Normalize過嗎??就算式來看p(y)是constant但是dy不是,所以等dy的PDF來看, p(y)就不會是constant了
(參考 http://en.wikipedia.org/wiki/Histogram_equalization 的圖示)

以高斯分布來想像, 其PDF是像山坡, 左右兩側偏低, 中央偏高, 若要修正成平坦的PDF, 勢必要將中央削平, 兩側填高

將 Gaussian Distribution的CDF當LUT和一對一, 0對0, 255對255的斜線LUT疊起來看, CDF會把中間Level以下的對應成更低的Level, 造成低Level的數量變多; 而中間Level以上的則會對應成更高的Level, 使得高Level的數量變多, 如此便可以把中間Level的量往兩邊擴散, 而中間的分水嶺則會依據分布的中心來移動

若以局部區塊來看(p(y) keep constant)
小範圍(dx)的p(x)若很大(例如高斯分布的峰值), 則對應CDF的dy會比較寬, p(y)會比p(x)降低
小範圍(dx)的p(x)若很小(例如高斯分布的兩側), 則對應CDF的dy會比較窄, p(y)會比p(x)升高

(詳細內容參考原文, 摘錄部分如下)
http://fourier.eng.hmc.edu/e161/lectures/contrast_transform/node3.html

To transfer the gray levels so that the histogram of the resulting image is equalized to be a constant:

\begin{displaymath}h[i]= \mbox{constant},\;\;\;\;\mbox{for all $i$} \end{displaymath}

To equalize the histogram of the output image, we let $p(y)$ be a constant.
Intuitively, histogram equalization is realized by the following:
  • If $p(x)$ is high, $P(x)$ has a steep slope, $dy$ will be wide, causing $p(y)$ to be low to keep $p(y)dy=p(x)dx$;
  • If $p(x)$ is low, $P(x)$ has a shallow slope, $dy$ will be narrow, causing $p(y)$ to be high.

2011年9月2日 星期五

經營策略

經營策略是指,從事與對手不同的作業,或以異於對手的方式,從事類似的作業。
~策略大師麥可‧波特(Michael Porter)



這對企業或個人都是一樣的思維, 要嘛, 就是做別人不做的(藍海), 不然, 就要做得比別人好(紅海), 選擇的原則還是在於自己的條件, 要盡量發揮自身的特質優勢, 避開弱點, 才能展現效率和成果, 只是很難找到100%符合自己優勢的領域, 而且隨著時間流逝, 個人或企業的優勢也會隨著經驗和環境的變化而改變, 能看到趨勢還有自己的演變才能亦步亦趨, 其他就交給上帝了

MSN看不到我的聯絡人

發生過幾次這樣的情況,通常是在電腦休眠之後在別的區域網路環境打開後發生的,重開機就好了,今天午後又發生了一次,但或許早上上班開機後就發生了,只是我沒注意,我基本上是很少關機,都是用休眠來取代

這次我上Windows Live Solution Center去找不用重開機的解決方法,找到了

http://windowslivehelp.com/thread.aspx?threadid=fb5ece2c-4ee0-41a4-8734-96680f8cf498

看起來是蠻有道理的,應該是緩存不知道什麼原因(會是網路環境變動?)無法更新,因為Web MSN是看得到的,總之,我照說明關閉MSN,刪掉我的帳號名稱的緩存目錄,就恢復了(一開始刪不掉,還到工作管理員殺MSN相關程序,其實會不會是有執行中程序死在那邊,導致無法更新緩存?不知道,下次再發生時可以試試看,關閉MSN,看工作管理員還有沒有相關執行程序還活著)

Windows Live Messenger 2009 :在完全退出Windows Live Messenger的情況下請點選[開始]——[所有程式]——[附件]——[執行],在輸入%userprofile%\Local Settings\Application Data\Microsoft\Windows Live Contacts後[確定]。

Windows Live Messenger 2011 :在完全退出Windows Live Messenger的情況下請點選[開始]——[所有程式]——[附件]——[執行],在輸入%userprofile%\Local Settings\Application Data\Microsoft\Windows Live\Contacts後[確定]。

2011年9月1日 星期四

Non-maximum suppression

Non-maximum is one of the stages in Canny edge detection.

I collected some theory/implementation as below.


http://en.wikipedia.org/wiki/Canny_edge_detector
http://140.115.11.235/~chen/course/vision/ch6/ch6.htm <--canny.cpp
http://ccy.dd.ncu.edu.tw/~chen/course/vision/ch6/單元六、邊緣偵測.pdf
http://ccy.dd.ncu.edu.tw/~chen/course/vision/index.htm
http://www.tomgibara.com/computer-vision/canny-edge-detector <--CannyEdgeDetector.java
http://www.cvmt.dk/education/teaching/f09/VGIS8/AIP/canny_09gr820.pdf
http://www.nada.kth.se/cvap/abstracts/cvap191.html <--cvap191.pdf
http://code.google.com/p/in-spirit/wiki/CannyEdgeDetector <--CannyEdgeDetector.as, canny.c
http://users.ecs.soton.ac.uk/msn/book/new_demo/nonmax/ <--nonmax.java
http://140.118.107.213/personal/master96/joseph/ <--Canny Edge Based Image Expansion.pdf, Canny edge.ppt
http://ssip2003.info.uvt.ro/lectures/chetverikov/edge_detection.pdf <--edge_detection.pdf
[OpenCV source]/modules/imgproc/src/canny.cpp <--canny.cpp

compare non-maximum suppression in canny.cpp, CannyEdgeDetector.java, nonmax.java, maxsupr.m, canny.cpp


2011年8月5日 星期五

Compositon and Aggregation in UML

http://en.wikipedia.org/wiki/Class_diagram

Stronger dependency
Composition > Aggregation > Association

Composition: owns a (Car owns an Engine)(UML symbol with solid diamond)
Aggregation: has a(Car Model has an Engine Model)(UML symbol with empty diamond)

UML symbols reference the wikipedia link above.

2011年8月4日 星期四

Design Patterns in Android

閱讀"高煥堂","Google Android 設計招式之美"的心得

此書不是直接給出最終Pattern的樣子,而是描述如何直覺的演變出最終型態(以Android Framework為例), 熟悉這個過程會比較能欣賞高竿的程式代碼, 自己設計系統時, 也能用進階的想法去處理, 擺脫土法煉鋼的寫法

若可以在做系統設計時,把這13個Pattern套進去, GoF的23個, 倒是以後再說, 能融會13招的武學, 雖不能稱霸武林, 但已經可以稱得上是俠客了吧, 絕對超越一般憑藉蠻力的莽夫

試著讓每個系統都能引用這13個Pattern, 畫出System Block Diagram with 13 Patterns

(我的理解, 以產品生產流程為例)(TBD: 以咖啡自動販賣機為例)

1. Template Method : 用繼承(Inheritance)方式, 依工廠產品的模板生產具差異化功能產品

2. Factory Method : 定義工廠生產表單(Factory Method), 業務(Client)依照產品需求填寫, 工廠依照表單廠內生產, 業務(Client)取得產品,可直接執行差異化功能, 但不清楚此功能的實做細節

3. Observer : 用委託(Delegation)方式, 依工廠產品的模板委外生產, 業務(Client)取得產品,可直接執行差異化功能, 但不清楚此功能的實做細節

4. Abstract Factory : 業務(Client)依照產品需求下單給代工廠,代工廠(Abstract Factory)自己依照產品類別調整產線(+ Observer or Template Method), 業務(Client)取得產品,可直接執行差異化功能, 但不清楚此功能的實做細節(Service in  Android)

5. Adapter : 代工廠將工廠出產的產品或是組件, 配合客戶需要包裝新的ID, 但內容並沒有改變; 將角色之間的行為規範再抽出更好用的介面, 封包了複雜或不直覺的底層行為(repackage Binder.onTransact() in Android)

6. Composite: 產品的BOM (ListView in Android)

7. Strategy: 半成品組件, 可以簡化BOM, 如果是單純生產半成品的工廠, 就可套用生產產品相關的pattern. (BaseAdapter for ListView)

8. State: 產品所處狀態, 從接單,生產到出貨之間的過程和狀態

9. Proxy: 和Adapter一樣的用意, 但與其背後之代理對象有一樣的介面,可視為真正的分身(AIDL code gen in Android)

10. Bridge: 使用同一介面橋接各種技術(包括程式語言, OS Platform, media codec)

11. Iterator: use Cursor to manipulate Records(Cursor or Iterator in Android)

12. Mediator: 工廠裡的生產管制中心, 協調各單位, 統一溝通管道(可以利用Adapter重新包裝溝通介面)(The class that implement the Listener of View in Android)(Binder Driver in Android)

13. Facade: 最外圍的介面, 以網路磁碟(NAS)為例, 網路介面是最外圍的介面, 裡面可能是直接硬體儲存, 或是多了一層Adapter, 例如1394, USB, eSATA, Network...; 郵政信封的格式規範;

2011年8月2日 星期二

Java/Android's access modifier : protected

找了很多說明,還不如一句定義

http://en.wikibooks.org/wiki/Java_Programming/Keywords/protected


protected is a Java keyword.
This keyword is an access modifier, used before a method or other class member to signify that the method or variable can only be accessed by elements residing in its class, subclasses, or classes in the same package.

2011年8月1日 星期一

C++的virtual和Java的abstract

Use to override functions in parent class.

(C++)virtual與pure virtual
Good summary table from the link above. There are good examples there also.

Virtual function: Differences between C++ and Java

C++Java
Pure Virtual Functionvitual void func() = 0;abstarct void func();
Impure Virtual Functionvitual void func();void func();
Non-Virtual Functionvoid func();final void func();
Hiding Inherited NamesYesNo
Prohibiting InheritanceNofinal class

2011年6月30日 星期四

三十歲以前 累積職涯馬拉松的能耐---我的想法

這個標題是 104獵才雙月刊6月號,杜書伍先生口述的文章,

http://www.104hunter.com.tw/edm/DE146441/02.htm

該文的角度,很明顯是以職場升遷的角度來看職涯發展,而不是以性向興趣來看,特別是以各個位階在公司的人口比例,再以退休年齡去反推年齡層所應該達到的歷練和升遷.這是有前提的,

很常識性的推論,也把公司的人事管理做了很簡單的一般化,如果聯強是這樣管理,想進去聯強的最好遵循這個原則.

我對聯強這樣的組織管理沒興趣,我對職涯發展的看法是,找到自己的興趣和性向,工作做起來會很愉快,上班下班時間並不會有明顯的分際,因為是做好玩有興趣的事情.所謂過不過勞,是看個人身體和心理的負擔而定,以工時去衡量等於是把人當機器看,運轉超時就是過勞,可是如果做的是不合自己本性,有可能心理負擔會超過身體負擔,心理的過勞要如何評斷.那如果沒有找到自己的職涯性向,為生活而工作的人,去聯強就對了

再以組織而言,或許以年齡層決定階級人口比較好管理,但若去看現在知識產業或是以創新聞名的世界企業,那些年輕的創業者該去跳樓了,我想杜先生的觀念有可能源自日本企業,但這樣的觀念,也隱含了年齡歧視,難怪中高齡會失業,因為中高齡只允許擔任高階主管,哪來那麼多坑可以塞人,更何況每個人都有自己的侷限,不是每個人都可以當大老闆大主管,我只想做我有興趣的螺絲釘,沒有這個機會和權利嗎?薪資本來就不應該和年齡或年資畫上等號,而是和貢獻度有關,以這個角度來看,年齡與職位畫分應該扯不上關係,而是以個人能力和貢獻度有關,除非是為了管理方便.

況且以現在社會來看,中小企業充斥,即使是大企業,高層主管獲得升遷頂多20%是有真本事,80%還是要靠人際關係和運氣,當然如果人際關係就是這個職位80%的工作內容,這就無庸置疑了

總之,人生苦短,職涯還是以沿著興趣性向的方向走,升遷?交給上帝吧. 如果真要規劃人生,我反而覺得不要以職涯來侷限自己,去好好解釋和體會孔子的想法,會比較實際,特別是知天命.

子曰:「吾十有五而志於學;三十而立;四十而不惑;五十而知天命;六十而耳順;七十而從心所欲,不踰矩。」

2011年6月22日 星期三

OpenCV Build for Android

build Updated OpenCV with Updated NDK, 唯一正確的參考

http://opencv.willowgarage.com/wiki/AndroidTrunk

要注意的是OpenCV必須從svn抓,因為download版本(2.2)並沒有scripts目錄存在
目前確認過的
1. OpenCV build on Ubuntu10.10
2. OpenCV build on Windows7 64bit
3. Building console "Hello World" with OpenCV on Windows7 64bit and test on Emulator
4. Building the android-opencv project on Windows7 64bit (Eclipse can import it as project)

2011年6月16日 星期四

Android NDK in Eclipse on Windows 7

再精簡一下流程
1. Download NDK for Windows並解開到想放的位置(Ex. C:\Android\android-ndk-r5c)
2. Windows環境要多裝一個Cygwin(Ex. C:\cygwin),下面兩個連結皆可參考
http://cheng-min-i-taiwan.blogspot.com/2010/06/android-ndk-hellojni.html
http://www.61ic.com/Mobile/Android/201105/34543.html
我是參考第一個連結的圖示,安裝套件在Devel分類的
gcc: C compiler upgrade helper
gcc-core: C compiler
gcc-g++: C++ compiler
gcc-mingw-core: Mingw32 support headers and libraries for GCC
gcc-mingw-g++: Mingw32 support headers and libraries for GCC C
make: The GNU version of the 'make' utility
mingw-runtime: MinGW Runtime

執行一下Cygwin.bat, home底下,使用者名稱目錄會被建立,然後出現.bash_profile,編輯這個檔案並存檔


PATH=/cygdrive/C/Android/android-ndk-r5c:${PATH}
export PATH


3. Eclipse-Project-Properties-Builders新增一個External Tool Program到第一個位置,內容就不贅述,重點在於Main Tab的設定,以我的環境為例
Location: C:\cygwin\bin\bash.exe
Working Directory: C:\cygwin\bin
Argument:
--login -c "cd  /cygdrive/D/work/study/Android/workspace/tryNDK/${project_name}/jni && ndk-build"

另外, Android Project Build Target必須是GoogleAPIs

2011年6月15日 星期三

android.app.Application

在Study NDK的章節裡,看到sample用到Application,之前沒看過這個東西,基本上,


http://developer.android.com/reference/android/app/Application.html

給的定義如下


Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's tag, which will cause that class to be instantiated for you when the process for your application/package is created.


其實, application的角色可以從AndroidManifest.xml裡的結構就可以看出來


manifest
---application
------activity


activity是包在application裡面的, 只是我們只把application當作一個殼, 在這個sample是將這個殼加了一個儲藏室,只要多定義


android:name=".UA2EFindEdgesApp"


 然後實做


public class UA2EFindEdgesApp extends Application


這樣在整個application所包圍的區域,都可以利用 


UA2EFindEdgesApp app = (UA2EFindEdgesApp) getApplication();


取用這個application所增加的功能,以書上的例子是藉此存取系統共用的Bitmap






2011年6月10日 星期五

終於在Windows7裝好Notes Client

其實會覺得問題不在Windows7,但是之前在XP下怎麼裝都ok,一樣的手法在Windows7卻不行,難怪會認為是Windows7的問題

之前的裝法是,我把可以執行環境(WindowsXP)的data目錄直接copy到Windows7,然後在Windows7裝完Notes Client後,將資料目錄直接指到這個目錄,接下來就切換ID

發生的問題是SMTP有問題,去查google,得到的答案直指Vista/Windows7沒有內建SMTP服務,於是我裝了SMTP server來轉發mail,就這樣使用了幾年之久

5月底換了新筆電,還是秉持著自給自足,不找MIS的學習精神(這是不好的,沒本事請不要學我),想方法處理,裝了好幾版Notes Client,都出現CoreEmailClasses有問題,這是在不copy data目錄的情況下,如果使用copy其他環境的data目錄,則會出現之前SMTP的問題

這下,我明白了,一定是我的data目錄並沒建好,一直都有瑕疵,有可能是版本或是OS有差異,所以舊有data目錄不能再用(甚至這種裝法是不應該的),應該想辦法解決為什麼會出現,"Illegal circular USE: CoreEmailClasses",畢竟看得到郵件目錄,只是打開才有問題,可能原因如下

https://www-304.ibm.com/support/docview.wss?uid=swg21089915&wv=1

但要怎麼修復,目前看起來是好的,但是我不確定是哪一個環節做對了

1. 我在設定過程中,第一次有設定Domino Server,幾年前設定有問題,後來就每次都關掉,這次設定了,也抓到了,接下來還直接問我ID File,裝完後,收發信就沒有CoreEmailClasses的問題,但是出現Server信件會重複出現,除非我把狀態改成Read,只要是Unread的,會一直自我複製,而且Send Mail到其他外部信箱,例如Gmail,會收不到

2. 猜想是Local和Server信箱同步問題,於是去查了Replication的用法,follow指示

http://www.ibm.com/developerworks/cn/lotus/notes-replication/index.html

目前頭好壯壯,再用一陣子看看

基本上,對Notes Server端做了哪些事並不清楚,但本著只不過是個收發mail的tool,即使是Notes Ap,也不過是藉著mail通道,做出Client-Server架構的資料庫應用,能用基本系統邏輯來處理的話,還是自己試試看,對邏輯推理有幫助

2011年4月18日 星期一

工作日誌很重要

無論如何,把WeeklyReport當工作日誌寫,絕對是有幫助的
不管有沒有人看,用自己的思路,整理自己的工作,用最省時的方式記錄下來
隨時都可以更新
我只要看到Weekly Report是每周更新一次的,就知道只是應付上面要求,那真的寫了對自己是浪費時間
隨時更新才能隨時做計畫,檢討並調整方向
一定會有幫助
But it still depend on you
I have no right to force you
It's just for your own good

2011年4月15日 星期五

Important Notes for Android Bound Service



There are three ways you can define the interface:
Extending the Binder class
If your service is private to your own application and runs in the same process as the client (which is common), you should create your interface by extending the Binderclass and returning an instance of it from onBind(). The client receives the Binderand can use it to directly access public methods available in either the Binderimplementation or even the Service.
This is the preferred technique when your service is merely a background worker for your own application. The only reason you would not create your interface this way is because your service is used by other applications or across separate processes.
Using a Messenger
If you need your interface to work across different processes, you can create an interface for the service with a Messenger. In this manner, the service defines a Handler that responds to different types of Message objects. This Handler is the basis for a Messenger that can then share an IBinder with the client, allowing the client to send commands to the service using Message objects. Additionally, the client can define aMessenger of its own so the service can send messages back.
This is the simplest way to perform interprocess communication (IPC), because the Messenger queues all requests into a single thread so that you don't have to design your service to be thread-safe.
Using AIDL
AIDL (Android Interface Definition Language) performs all the work to decompose objects into primitives that the operating system can understand and marshall them across processes to perform IPC. The previous technique, using a Messenger, is actually based on AIDL as its underlying structure. As mentioned above, the Messenger creates a queue of all the client requests in a single thread, so the service receives requests one at a time. If, however, you want your service to handle multiple requests simultaneously, then you can use AIDL directly. In this case, your service must be capable of multi-threading and be built thread-safe.
To use AIDL directly, you must create an .aidl file that defines the programming interface. The Android SDK tools use this file to generate an abstract class that implements the interface and handles IPC, which you can then extend within your service.
Note: Most applications should not use AIDL to create a bound service, because it may require multithreading capabilities and can result in a more complicated implementation. As such, AIDL is not suitable for most applications and this document does not discuss how to use it for your service. If you're certain that you need to use AIDL directly, see the AIDL document.

2011年4月14日 星期四

Scrollable TabWidget in Android

I practiced the Tab Layout Tutorial by

http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

and realized that I need to scroll the TabWidget. After Goofling "android scroll tabwidget",
thanks to bscarl88

http://androidforums.com/application-development/118108-scrollable-tabs.html

I could not successfully paste the xml here, so I use "[" and "]" instead of "<" and ">"
 

Originally is


                    [TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" /]


Now is


[HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"]    
                    [TabWidget
        android:orientation="horizontal"
           android:id="@android:id/tabs"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content" /]
        [/HorizontalScrollView]  

2011年4月6日 星期三

上帝的安排真是奇妙, What's Next?

本以為我換了三個全然不相干的產業和職能, 但現在回頭檢視, 竟是環環相扣


中光電: 背光板色彩, 光學檢測程式(VB)
宇太新: ERP 物管系統(VB), EAI(Java, Software Engineering)
崴強:     DSC 影像色彩, MFP DSP/影像色彩, Qt/QML, RTOS(C)/Linux(C)/Android(Java)


在崴強用到了前兩個工作的技術觀念, 下一個工作會發生什麼事呢?

2011年3月29日 星期二

白蘭氏五味子芝麻碇

剛剛花旗打來促銷, 我沒有答應,去網路查到這篇,覺得很忠肯,問題不在於有效沒效

http://kunghc.pixnet.net/blog/post/27933260

不過真的有很多說有效的, 不過我覺得所謂有效, 已經把他當作藥了, 病的成因並沒有解除, 一但不吃, 還是會再回來, 甚至更快, 歸根究柢, 多運動多休息還是癥結, 當營養補充, 可吃可不吃, 千萬不要當藥了

2011年3月24日 星期四

Append text to file from command line

http://stackoverflow.com/questions/4640011/append-text-to-file-from-command-line-without-using-io-redirection

其實最簡單的就是
$ export lines="text you want to append"
$ echo $lines >> file
$ echo "" >> file

2011年3月18日 星期五

Try eGalax USB Touch for tslib

There are three kernel modules support USB eGalax Touch device
1. inbult usbhid module for HID touch device
2. Inbult usbtouchscreen module for non-HID touch device
3. eGalax Touch tkusb module for both HID and non-HID touch devices

Item 3 is not in consideration list for inbuilt modules in kernel being more convenient. Usbhid and usbtouchscreen conflict and I use usbhid finally.
As for the application interface, there are X11 and tslib. X11 is too big and often is used on desktop. tslib is a thin software interface and ready for Qt. I decide to focus on tslib.

Step 1. Root File System with tslib
Make sure tslib in buildroot has been checked. Find the eGalax plugin patch from
http://repository.timesys.com/buildsources/t/tslib/tslib-1.0/
I modify and combined to 4 patches.
tslib-1.0-A1_svn_updates-r50-r78.patch, tslib-1.0-Z4_egalax.patch, tslib-1.0-no-cxx.patch, tslib_add_finddef_and_inputattach_utils.patch
Notice that patches are used by alphabetic sequence.

Step 2. Linux Kernel with usbhid
Follow the menuconfig on kernel,
(Notice that USB Touch Driver has to be unchecked.)
$ Make menuconfig
Device Drivers --->
Input device support --->
<*> Event interface
// [*]Touchscreens --->
// <*>USB Touch Driver
HID Devices  <---(Handy: Try All to Yes)
[*] /dev/hidraw raw HID device support
[*] /dev/hiddev raw HID device support

Step 3. test tslib
Make sure /dev/input/event0, /dev/hidraw0 is there.

Test by
# export TSLIB_TSDEVICE=/dev/input/event0
# export TSLIB_FBDEVICE=/dev/fb0

# vi /etc/ts.conf
module_raw input
module_raw galax

# ts_calibrate
# ts_test

Step 4. Qt with qt-mouse-tslib

[Host]
$ ./configure -embedded arm -xplatform qws/linux-arm-g++ -qt-mouse-tslib
$ make
//deploy to Target
[Target]
# export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
# cd /usr/lib/
# ln -s libts-1.0.so.0.0.0 libts-0.0.so.0
//Test qt application with touch

2011年1月17日 星期一

系統程式設計的觀念

不管是軟體或是韌體, 很多人已經中了軟體工程的毒, 其實不能說是軟體工程的原意, 而是被解釋過的軟體工程造成的誤導, 當然其目的是要推銷其理念或是產品, 但是我們回歸原本系統程式的原始目標, 事情沒有必要被這樣侷限.

系統程式的規範來自於需求, 在這樣的規範之下, 其實可以發揮的空間非常大, 但因開發團隊的經驗加上時程的壓力, 有經驗的團隊始終會以熟悉的開發平台畫地自限, 經驗愈長, 愈不敢跳脫去嘗試新平台新技術, 導致以不是和需求最佳媒合的平台或工具來做基礎, 第一步選錯了, 往往沒有回頭的機會, 就算選對了, 團隊成員若沒能力快速上手, 發揮平台或工具的效能, 那還是枉然, 所以, 關鍵還是在於, 依照需求, 選定平台和人力, 才能發揮最大的成效, 但是這也是理想化的講法, 不是每個成員都像特種部隊或是超級怪咖, 所以選定人力有可能會影響平台的選取, 這只能說專案召集人沒那麼好做, 選錯召集人, 大概就決定了系統的成敗

Moto MB525(Defy)耳機問題確認方法

Can't hear the person calling unless I use loudspeaker/speakerphone

https://supportforums.motorola.com/thread/41152?start=375&tstart=0


If you have a BTxx or BFxx or see a Blue Dot on your phone's label beneath the battery door you can have confidence that your device is not affected by this issue as long as you are still able to connect a Bluetooth or Wired Headset and the issue goes away. If the issue does not go away with a Bluetooth or Wired accessory then you have a separate issue.

Mark
Support Forums Manager