發表文章

目前顯示的是 2015的文章

[VS依賴庫管理]Boost動態連結

圖片
當你使用boost動態連結函式庫時,編譯時會出現以下的錯誤代碼嗎? error C1189: #error :  "Mixing a dll boost library with a static runtime is a really bad idea..." 的確,boost 自動連結功能(auto-linking) 帶給我們便利性,節省專案設置的時間,然而如何正確設定專案就成為很重要課題。以上錯誤代碼C1189意思是『 用靜態Runtime混合boost動態連結庫真的昰一個錯誤想法 』,也就是說Boost動態連結的專案屬性設置錯誤。 設定Boost動態連結的專案屬性主要有以下的步驟: 在前置處理器,強制動態連結Boost函式庫 在Code Generation選擇Runtime Library 增加Boost標題檔和函式庫的路徑 錯誤代碼C1189就是在第二步Runtime Library設定錯誤,此步驟主要設定在多執行緒模式下如何連結C和C++執行函式庫(C and C++ Runtime Library),依據偵錯和發佈(Debug & Release)和靜態和動態函式庫(Static & Dll函式庫)主要分成以下四種: Multi-threaded (/MT) Multi-threaded Debug (/MTd) Multi-threaded DLL (/MD) Multi-threaded Debug DLL (/MDd) 簡單來說,若字尾帶有-d即偵錯版,沒有小寫d即發佈版。還有,判斷動態連結庫依據是多執行緒(Multi-threaded)後面是否有DLL,即縮寫為(/MD),而靜態連結則是直接為多執行緒縮寫(/MT)。 環境 Windows 7 64 bit VS C++ 2015  方案:ThirdPartyExample 專案名稱:TestBoost_Dynamic 專案配置:Win32 Debug & Release Boost   1.59.0 下載教學: Boost簡介與分割 所使用到動態連結程式庫(dll) Boost.System Boost.DateTime Boost.Reg

[VS依賴庫管理]Boost簡介與篩選

圖片
你曾經認為Boost 函式庫過於龐大,而不敢使用嗎? 官方編譯好Boost函式庫 解壓縮大約有28GB,因為此龐大函式庫是由不同IDE版本編譯出來。首先,請根據你所設定的環境,取出Lib和Header資料夾,將大小減少到2.2GB。 請問將下圖所有函式庫上傳,讓團隊其他人自行決定如何使用,這是好的專案管理嗎? 答案是非常差!!! 首先,上圖是依據專案編譯屬性所分類的函式庫,詳細請參考以下的命名規則。因此若你將所有函式庫上傳,你無法清楚告知其他人如何在新專案正確地設定編譯屬性去連結函式庫。編譯屬性不同會改變產品發佈原則,部署人員必須花時間重新打包,而且產品發佈也缺少一致性。 舉例來說,圖二某人決定新專案有以下三個設定: 靜態連結 Boost函式庫 只使用Boost 裡面的三種函式庫 動態連結C++標準庫 然而,產品發佈原則是跨平台和獨立運行的應用程式,並且不會受更新IDE所影響,請問以上的設定是對的嗎? 錯, 因為動態連結C++標準函式庫代表客戶開發機必須安裝 『 Visual C++ 可轉散發套件(Visual C++ Redistributable Packages ) 』,所以 產品發佈時 必須將 VS2015 的 Visual C++ 可轉散發套件 和應用程式一起打包安裝檔。 此套件會隨著IDE 更新 有所改變 。 也就是說, 每次開發者更換IDE,部署人員就必須 重新打包 , 無形中增加專案時間成本。所以,篩選函式庫不但能讓其他人清楚如何正確使用,而且也減少第三方函式庫大小。 圖二 . 已分割Boost函式庫 另一方面,Boost目前是 『 準 』 函式庫,某些函式庫並不適合在產品開發上,而且Boost有些功能專案已實作,若不篩選Boost函式庫將導致一種功能有兩份程式碼。舉例來說,專案已經實作產生UUID的API,但是沒有文件說明產生UUID,你分派新人任務產生UUID時,你認為他會怎麼做? 若參考StackOverflow答案,新人就直接使用boost::uuids::random_generator,不但增加引用Boost標頭文件,而且增加產品編譯時間。還有,當你必須更改產生UUID機制,你 必須修正兩個地方,使程式碼缺少一致性。 因此,建議篩選Boost函式

[傾聽他人]回應抱怨

圖片
圖一. 太陽花(source: wikipedia ) 你曾經困擾如何與負面情緒朋友溝通嗎?還有,你好心給他一些建議,他都一一反駁你,使彼此產生衝突,甚至他還關掉與你溝通大門。請你先思考當朋友跟你抱怨時,他真的需要你的建議嗎? 其實,大部分抱怨的人心中已有答案,他們並不需要你的建議,而是傾聽與理解。舉例來說,當你朋友對你說以下的話, 唉~ 主管叫不動其它人,結果他一直分配新工作給我! 結果又不加薪,真過份! 你會做以下那一種回應? 辛苦你了!上次我下班前也被主管叫進去,害我晚半小時下班,真是鬼公司 『 吃得苦中苦,方為人上人 』你就當做主管給你磨練機會 ,像XXX年輕很辛苦,現在不是在有名的外商工作嗎? 你是不是為主管不重視你而感到生氣? 不要再抱怨!你是不是不喜歡工作阿 首先,答案1做法是先簡單安慰當事人,然後你開始長篇大論過去的經歷或朋友的例子,這樣做法不但轉移當事人的話題,而且讓彼此之前立場顛倒,甚至當事人需要安慰你!換句話說,你把人家的話題搶走,這可能會讓他感到自己痛苦被忽略,甚至被標上自以為是的標籤,你的任務是傾聽他的抱怨,而不是只顧着要展現自己,這樣只會增加彼此之間的距離。因此,傾聽時, 請記得今天主角是谁,並且持續當事人的話題 。 接下來,若我給當事人美好未來藍圖或建議,這樣做法應該沒問題吧?錯!!! 你很有可能被當事人打槍,一方面未來是難以預測,在不了解當事人能力或產業走向下,亂評論別人的未來,讓人感到很不負責任。另一方面,你真的理解當事人工作狀況嗎?每個人所遇到的情形都不一樣,解決方案也有所不同,不要擅自把別人經歷套用在他身上,或許他的心中早有答案,所以 你只要傾聽,不要給任何建議。 其次,最佳答案是3,為什麼? 請你重新看一遍當事人的抱怨,透露他很在意薪水和工作分配不公,因此它依此基礎去回應當事人可能感受或想法,不但讓他感受到你的重視,並且鼓勵他抒發他的情緒。若你無法看出他的感受,妳可以選擇性重複當事人的話語關鍵字,鼓勵他繼續談話,例如:其他人在幹嗎?所以,正確地回應是 以當事人的談話內容為基礎去拓展話題。 最後,答案4是最糟的做法,你不但否定當事人的價值,而且對他人行為亂下評語。你這樣只是散發你的優越感,自以為是了解他人感受,對當事人一點幫助都沒有。正確地傾聽主要有以下幾點: 帶

[Chrome書籤]復原舊版管理員

圖片
最近,Chrome在版本42將正式發佈新的書籤管理員 ,它使介面更為美觀和流行,然而卻犧牲 可用性 ,如圖一所示。 作者 Venkat eswarlu 針對圖一的書籤管理員列出以下的缺點[1]: 新版本載入書籤管理員的速度變慢 新版本無法依字母來排列 開啟Chrome任務管理員,它仍然繼續在背景執行(圖二) 加入新書籤到特定資料夾是困難 圖一. 新Chrome書籤管理員 對我而言,最困擾是第五點加入書籤的問題,尤其將書籤分很多層的時候,你無法一步驟 選擇所要 的資料夾,而是 不夠直觀的操作也增添困難性 。另一方面 ,新書籤管理員為內建的擴充功能 ,然而它有時所需要記憶體並不低 ,因此我也懷疑此功能會讓Chrome越變越慢 。 圖二   . 仍然在背景執行的書籤管理員 因此 ,我 將教你如何變回舊版書籤管理員,然而Chrome隨時會把這功能完全淘汰掉,因此此答案只能暫時有效。 環境 Windows 7 64 bit Google Chrome 開發版 版本 44.0.2398.0 dev-m (64-bit) 教程 首先,請在Chrome的地址欄輸入以下的文字,進入Google實驗性功能介面。 chrome://flags/#enhanced-bookmarks-experiment 圖三. 開啟Chrome的實驗功能 接下來,尋找標籤『 啟用強化書籤 』後,請在下拉式選單選擇 『 停用 』。   圖四. 關閉書籤功能 接著,請點選『 立即重新啟動 』使設定生效。   圖四.重新啟動Chrome 最後,重新啟動後 ,再次按下『 書籤星星按鈕 』即可使用舊版書籤管理。 圖五.舊版書籤功能 Reference: Venkat eswarlu , Chrome 42: How to get old Bookmarking Interface and Manager back? http://techdows.com/2015/04/chrome-42-how-to-get-old-bookmarking-interface-and-manager-back.html

美國寒冬(American Winter):動搖中美國夢

圖片
有一天,我旁邊坐著一個美國同事,我無法忘記他對台灣提出一系列的疑問,例如: 『為何台灣人比美國人還瘋狂去Costco?』 『為何台灣人會那麼喜歡外國人球員?』 『台灣人為何喜歡外國文化勝過自己國家呢?』 那時候我無法回答他的問題,或許我骨子裏也認為外國月亮比較圓,我無法有自信反駁他。然而,我想起學姊在我留學前說過的一句話:『妳不要把事情想得太美好,你真的了解要去的國家嗎?』這些話讓我開始反思一味想脫離被稱作鬼島的台灣,去美國工作就能解決問題嗎?我真的了解美國目前的狀況嗎?,美國夢仍然存在美國嗎? HBO紀錄片美國寒冬將推翻你對美國美好的幻想,讓你看到真實中的美國,並且開始對美國夢感到存疑 圖一. 美國寒冬宣傳海報(來源: American Winter-Home ) 首先, 中產階級貧窮化 只會發生在台灣,美國就不會有這個問題嗎?此紀錄片就揭露美國情況也在惡化中。中產階級是一群受過良好教育的人,他們有人人稱羨的好工作,打從心底相信只要努力工作,即使被資遣也能快速找到工作,他們無法相信有一天會繳不起日常生活費用,甚至讓自己的孩子吃不飽。在紀錄片,約翰(John)本來年收入五萬五千美元,大約一百五十萬台幣,他在大約五十歲時被資遣,然而他不但房子面臨被拍賣的局面,而且也無法滿足孩子娛樂需求(看電影),印象最深的是他含淚的說: 『這並不容易!我是50歲的成人,但我需要打電話求父親幫我付電費!』 約翰不但擔心自己所遭遇的狀況,他更害怕孩子的未來。約翰並不是片中唯一的中產階級例子,目前, 美國大約有4千八百萬的人活在貧窮線以下,占總人口大約15% ,然而這只是美國官方數字,這真的能真實呈現美國貧窮人口?在美國波特蘭,專家說目前中產階級是接近貧窮的危險族群。 圖二 . 貼心的美國小兄弟( 來源: American Winter- Preview ) 美國夢倡導不論窮人或中產階級努力工作就有回報,不必擔心日常生活,孩子能不能吃飽,甚至給孩子一個美好未來。然而,上圖孩子父母Ben&Paula說: 『我們只想著錢,如何餵飽孩子們,忘記夢,我們如何度過明天,明天就是夢,晚餐也是一個夢!』 而左邊8歲貼心美國小男孩海洋(Ocean)說: 『我聽到有時爸媽略過晚餐,因為他們需要餵我們,有時我聽到這句話,我哭了!因為讓我覺

[Google定位]免安裝找回遺失手機

圖片
你曾經忘記掉過手機嗎? 甚至忘了在哪裡掉? 以前 ,當自己手機不見時 ,不論是不是小偷拿走的 ,我們都很難找回自己的手機 。 一方面 ,自己忘記手機在哪裡丟失 ,即使有好心人拿到警察局或客服中心 ,你要花很久時間找回你的時間 。 另一方面 ,傳統手機缺乏防盜機制(i.e.密碼鎖) ,使小偷不需要花費時間處理 ,它就能賣給二手手機行 。 然而 ,智慧手機將推翻你的 既定印象 ,它不但 增加找回手機的機率 ,尤其是 Android的手機 ,而且增加安全性防止他人偷取資料 。 Google在你的帳號提供裝置管理功能 ,當你在有GPS的 Android裝置登入 ,你就可以定位你的裝置 ,然而GPS只能顯示大概位置 ,因此當你到裝置附近不要驚慌 , Google 也提供操控手機的功能 ,你只要按下 『 撥打 』即可讓裝置發出鈴響 ,然後再根據聲音找出你的手機 。 若你將 手機 調成震動 ,它還會發出聲音嗎 ?   答案 : 可以 此外,老人家經常發生忘記東西放在哪裡,甚至將手機放到眼睛看不到的地方,例如冰箱。然而,你只要有此裝置所登入的帳號,即使你住很遠,你也能遠距離利用此功能幫助他們找到手機。 圖一. Google 手機定位系統 以下 , 將教你利用Android裝置管理員定位您的手機 ,並且利用撥打功能 , 即使你將此裝置調成震動 , 它也能發出鈴聲 。 環境 個人電腦  Google帳戶管理  Android裝置管理員 想定位的裝置 i.e.手機 必須登入Google帳號 免安裝APP 具有GPS的功能 教程 首先,請在Google的首頁左上方,點選『 你的帳號圖片 』顯示帳號資訊後,選擇『 帳戶 』進入設定界面。 圖二. Google帳號界面 接下來,在帳戶設定界面尋找標籤『 近期活動 』後,請點選 『 裝置 』查詢有哪些裝置登入的紀錄。   圖三. Google帳戶設定界面 接著,在裝置列表 點擊你所遺失的手機 跳出此裝置資訊後,請點選『 使用 Android 裝置管理員找出您的 Android 裝置 』。   圖四.登入此帳號所有裝置 再接著,在Android裝置管理員界面,你將看到『 正與 您的裝置連線... 』的訊息,代表它正

[Google部落格]救回誤刪文章(下)-利用postID重新發佈

圖片
在 上一章 ,我利用複製搜尋引擊的快照內容,重新刊登我的文章,但是新文章卻無法使用原本網址,如下圖一所示。然而,搜尋引擊是根據你的網址去統計流量,網址就像在網路上身分證具有唯一性。另一方面,網址更換也會影響到Google+留言,當你決定為你的部落格換網域時,Google會出現以下的警告訊息告知你的留言會消失。換句話說,若要保留你的流量和Google+留言,你必須使用原本的網址。 警告:您已啟用 Google+ 留言功能,變更網誌網址會對現有的留言造成負面影響 圖一. 被救回的文章 以下將教你如何利用postID找回刪除文章後再重新發佈。然而,若你有出現錯誤訊息『bX-cejt47』,你就需要利用其他工具救回原本網址,但也不一定有效。 環境 Google 部落格 (Blogger) 網域:XXXX. blogspot.tw Chrome Blogger管理頁面 教程 首先,請依據 上一章 到你被刪除網頁的快取畫面,按下 滑鼠右鍵 後,選擇『 檢視網頁原始碼 』。 圖一. 檢視快取網頁的原始碼 接下來,在原始碼頁面按下『 Ctrl+F 』呼叫搜尋功能,然後在對話框輸入『 postID 』後,在橘色標註的位置即可找到唯一的ID,這裡為 『 4239077584546560024 』。   圖二. 搜尋被刪除的文章 接著,請編輯任一篇文章的編輯後,在 omnibox 找到postID,請將它 取代為找到的postID , 這裡將把 『 8889869403022029595 』替代為『4239077584546560024』。   圖三.開起快照的頁面 最後,在文章的編輯模式,你可以看到被刪除的文章,然後選擇『 發佈 』救回原本文章。 圖四.救回的文章 Reference: Easy Methods To Recover Deleted Blogger Blog Post  http://www.how-to-comp.com/2014/03/Recover-Deleted-Blog-Post-Page.html

[Google部落格]救回誤刪文章(上)-搜尋引擊

圖片
你曾經不小心刪除你的部落格文章嗎? 如上圖,我曾經整理部落格文章標籤時,不小心刪除剛發表的文章,然而,它沒有提供任何介面讓你簡單救回文章。換句話說,Blogger沒有Gmail的回收桶功能,救回只能依賴外部工具,因此文章救回比起信件來複雜許多。幸運的是,當你發表你的文章時,Google搜尋引擊會定期快照你的頁面,因此當你修正內容時,快照過不久也會更新。換句話說,快照能幫你拿回刪除前的文章,但滿高機率救不回修改前的。 以下將教你如何使用Google搜尋引擊找到文章內容,複製後在重新發佈。然而,若你文章有特殊格式,直接複製內容會造成編輯不容易,在下一章將描述如何保留原本格式。 環境 Google 部落格 (Blogger) 網域:XXXX. blogspot.tw Chrome Google搜尋引擊 教程 首先,請在 Chrome的 Omnibox 或 Google搜尋引擊 輸入 『 Site: 』 再加上你的網域 ,如以下所示,按下 『 搜尋 』。 site:設定的部落格英文名稱.blogspot.tw 圖一. 搜尋你的網誌 接下來,Google會列出網誌所有列表,然而當你網誌文章數過多時,你要花過多時間找此文章,因此若你記得被刪除的文章,請在 『Site:』前面輸入文章名字後,按下『 搜尋鍵 』就可以找到它。   圖二. 搜尋被刪除的文章 接著,如下圖三在被刪除文章下面點擊『 朝下按鈕 』開起選單後,請點選『 頁庫存檔 』開啟快照頁面。   圖三.開起快照的頁面 最後,你能看到被刪除的文章內容,此時你直接複製文章內容再重新發佈文章。 圖四.救回的文章 Reference: Easy Methods To Recover Deleted Blogger Blog Post  http://www.how-to-comp.com/2014/03/Recover-Deleted-Blog-Post-Page.html

UML類別圖:Generalization vs Realization

圖片
某一個 類別去繼承另一個 ,子類別(child class)在擁有父類別的屬性和行為下去擴展功能,在C++很單純定義兩者關係為繼承(inheritance)。如下圖一所示,在UML有以下兩種方式描述繼承,兩者主要差別在父類別。 Generalization 實線 Realization 虛線 父類別必須是界面(interface) 圖一. UML繼承 Realization 請先思考什麼是界面(interface)? 在物件導向的定義,界面是一個抽象類別,設計一個界面類似於設計一個類別,但是它們的思考點有所不同。類別描述物件的屬性和行為,而界面是定義類別們統一行為,並且不會有詳細行為描述。界面是不被允許實例化,但你可以宣告空指標,或是將它綁定其中一個子類別。 例如:當主人叫動物們(雞,豬和狗)走路時, 如何在C++實作界面? 這裡只解釋程式碼的一部分,我已經將完整新增在線上C++編譯器ideone,你無需安裝任何C++IDE,直接線上修改後跑程式,請在 以下 找子標題程式碼。 首先, 找出類別們的共同行為,實作一個界面 。這裡的例子為走路,因此新增界面Animal,然後增加純虛擬函數(pure virtual function)  walking  定義走路的指令。 class Animal { public: virtual ~Animal(){} virtual void walking()=0; }; 接下來, 新增繼承界面的子類別,並且實作界面的子類別 。以下舉雞為例,這裡的 walking 描述雞用兩隻腳走路。 class Chicken:public Animal { public: virtual void walking() { printf("chickens walk on two leg\n"); } }; 最後,擁有 界面指標向量的類別可直接呼叫物件的虛擬方法,不需要是哪一個類別 實作 。由於界面不允許初始化,在程式某處產生向量容器界面指標Animal,然後將物件雞,豬和狗放入容器後,擁有此容器的類別如同下圖46-47行直接呼叫walking,讓容器所有動物開始走路。 圖二. 界