2016年12月31日 星期六

書評: 黑殼(Husk)

寫多了冷硬的程式設計與悲慘的職場現實也該換換口味,2016 年最後一天就來寫寫小弟的休閒之一「科幻小說」

2016年12月25日 星期日

LeetCode#8 String to Integer (atoi)

分析

原題連結

這題歷史悠久,早在 30 年前 K&R C 語言 習題裡就出現過了,但小弟 submit n 次才成功。因為這題有個陷阱是解題系統會傳入超過 INT_MAX(2147483647),小於 INT_MIN(-2147483648) 的數值字串,系統希望「參數 > INT_MAX」 時傳回 INT_MAX,「參數 < INT_MIN」時傳回 INT_MIN,如果傻傻的照抄 K&C 習題解答,得到的是 overflow 的結果,當然就被 reject 了。

2016年11月30日 星期三

C++ 沉思錄: 遲來的較大嬰兒奶粉

C++ 進階讀物裡,最有名的大概就是 Scott Meyers 寫的那本 Effective C++,光是前公司辦公室裡大概就有 5、6 本。小弟也翻閱了很多次。

Effective C++ 比較偏向原則性的說明,什麼該做,什麼不該做,什麼做了必死無疑。書中的範例都很片段,總有些讓人意猶未盡。

今天推薦的這本 C++ 沉思錄,改從另外一種角度出發,先從一個很小的雛型開始,逐步添枝加葉,過程中告訴你為什麼要這樣做,會面臨哪些設計決策,最後完成一個完整的範例。

這樣的寫作方式,小弟一讀就上癮了,因為這更貼近程式員的實際工作狀況:「寫出一些 classes,拼湊他們,卡住了,回到上一步...」

作者 Andrew Koenig、 Barbara Moo 是 C++ 元老級人物,後者與 Stanley Lippman 寫了很有名的教科書 C++ Primer(印象中 Moo 為 Lippman  的研究所導師),Andrew Koenig  更是被 Scott Meyers 列為 C++ 史上影響力前五大人物,本書可看性可想而知。

以下就來談談這本書我認為最精華的部份

2016年11月7日 星期一

沒有事情是簡單的

最近很多人認為只要把原有產品隨便改一改,就可以當成 IoT 產品來賣了,但這些產品要不是連網路設定界面都做的 5566,要不就這些人連用 wireshark 看懂 TCP three-way handshake 的能力都不知道有沒有,若不是台灣工程師很好混,要不就是把做產品想的太簡單了!

如果這樣就能賺錢,那某幸福企業一年做個 7,80 億真是太沒天良,小弟不找幾個人開公司爽賺幾億豈不是太對不起自己?事情真有憨人想的那麼簡單?這邊就來舉幾個過去碰到的例子,讓大家了解一下魔鬼就在細節裡...

2016年11月5日 星期六

你也賈伯斯上身了嗎?

這些年台灣人很愛談創新,不光是企業要創新,政府施政也要創新,彷彿一切沒有創新就沒有價值,你不創新就是造成台灣沒有進步的罪人

乾脆說便秘是因為蹲馬桶的姿勢沒有創新,老婆沒有高潮是因為體位沒有創新好了

這邊就要來公開創新失敗的親身經歷,下次如果你看到某人一副賈伯斯上身的模樣,要你跟他一起改變世界,在掏出血汗錢一頭栽入前,請先回想一下本文的慘痛經驗

2016年10月24日 星期一

C++: Prototype Pattern 應用

以前在幸福企業 M 社時,對流程、產品編碼的管理可說到了走火入魔的程度,還為此建立了專業部門。還記得該部門的女同事在教育訓練中狂電台下負責開發產品的男工程師,這些產品編碼搞得比工程師的程式還複雜,也真是強強強~

很不幸的這些編碼也流竄到產品的程式碼中,當年小弟只能照虎畫貓,最近終於找到一種比較好的作法,相信很多人也被這樣的問題困擾,讓我們繼續往下看。

2016年10月19日 星期三

實例研討: 從 C++ 學習 C 高級技巧

很多人聲稱:
  • function pointer 是 C 高級技巧
  • 學習 C++ 讓我變成更好的 C 程式員。
這中間的因果關係,有沒有一個實際案例可以說明?筆者最近研究 libmodbus 發現這是一個極佳案例,很適合用來解釋上面這兩句話。專案規模不大,易於說明,無論你是 C or C++ fans 相信都能從中獲益。

2016年10月15日 星期六

為何 Google 禁止工程師使用 C++ static object?

網路流傳的 Google C++ Style Guide 裡提到:Google 禁止旗下工程師使用 static object,僅允許使用 static Plain Old Data(ints, chars, floats, pointers),或 POD array/struct。可惜的是文中缺少實際範例指出這樣做的危害,剛好小弟最近踩到這個地雷,來跟大家分享一下心得 :)

2016年10月6日 星期四

為什麼硬體公司軟體做不起來?

最近與一位資深硬體 RD 聊天(有 20 年以上設計經驗),言談之中他不斷跟我強調很多 IPC 廠想入門 SCADA/HMI 軟體,但不知道怎麼入門 blah~blah~

小弟在工控界搞了 7  年 HMI 軟體,3 年 Remote IO,也算略有經驗。現在就從個人角度來分析,為何硬體公司要入門軟體這麼難?

2016年9月21日 星期三

再論 multi-threading

之前那篇文章陳鐘誠老師轉貼後,引起正反雙方各種討論,通篇看下來反對的人比較多。看來小弟不得不替自己辯解一下

2016年9月18日 星期日

Embedded Linux: 如何使用現成的 C code?

前面的文章開頭提到,FAE 說要盡量使用現成的 C code,但卻沒提到要怎麼做。這裡就來分享一下個人心得(該公司應該聘請小弟當 FAE 才對 XDDD)

2016年9月16日 星期五

Q&A: sleep 與 system call

Hi 大家好,小弟之前有去某一家嵌入式晶片供應商公司上課,令人印象深刻時候有個重點。
-> 不要使用太多sleep(),但是他沒講說為什麼不能使用sleep(),有其他代替方案嗎?
-> 不要使用太多system call(),會需要fork而消耗系統資源,
有專門的C code就優先使用。
請問先進們針對這兩個問題有什麼特別要注意的地方 or 見解嗎?
因為不是很清楚為什麼要避免使用這樣的情境,謝謝大家。

2016年9月6日 星期二

運用 gprof + graphviz 學習 Open Source (續)

如果您照著前面的文章按圖索驥,您會發現有些情況或某些類型的程式會卡住無法進行下去。比方說如果您按 Ctrl+C 中斷 process,或者是用 kill 殺掉某些 background process, daemon,您會發現目錄下找不到 gmon.out,少了 gmon.out,就無法產生 call graph 與最終的 svg 圖檔。

2016年9月3日 星期六

運用 gprof + graphviz 學習 Open Source

有時我們想了解一個 Open Source 軟體是如何運作的,可能是為了除錯,也可能是想了解心中的一些議題在這個軟體中是如何運作的。舉例來說,如果你正在用 socket 開發軟體,想要知道如何正確使用 socket API,找一個很受歡迎,很多人使用的 Open Source 軟體打開研究,比起只看文檔或書上的範例,抓頭騷耳老半天要來的快速有效。

2016年8月30日 星期二

IT 考古: 什麼是 CGI?

某天有位朋友跟小弟討論起 PHP,因為他的裝置運算能力有限,無法負擔解譯 PHP script 的成本,於是他想出一個方法,把 *.php 丟給 Browser 去解譯,我跟他這樣講不行,Browser 只能解譯 HTML & JavaScript(當然,如果裝了什麼特殊 plug-in 有可能,但這裡指一般情況)。

2016年7月19日 星期二

2016年7月17日 星期日

有病治病,沒病強身: Cppcheck + Valgrind

Cppcheck


簡單來說這是一套靜態 C/C++ 靜態分析工具,什麼是靜態分析?就是程式尚未編譯執行前,直接對原始碼分析,看有沒有 bug 或值得改進之處。

2016年6月21日 星期二

用遞迴產生所有排列

本來要解的題目其實是算法競賽入門經典習題 2-6:

用 1,2,3,...,9 組成 3 個三位數 abc, def, ghi, 每個數字恰好使用一次,要求 abc:def:ghi = 1:2:3。按照 "abc def ghi" 的格式輸出所有解,每行一個解。提示:不必太動腦筋。(這裡有一份題解,效率比列出所有的排列高)

2016年6月14日 星期二

管理者的遠見

有一天大科學家 Richard Hamming (Hamming 碼發明者,1968 Turing Award 得主) 問他的老闆 Bode:

「為什麼你要當這個部門的頭呢?為什麼你不去當一名大科學家呢?」

2016年6月5日 星期日

書評: Wireshark 網路分析就這麼簡單

大部分講 TCP/IP 的書有如字典,啃起來乾巴巴的沒什麼味道,食之無味棄之可惜。偏偏網路是個很講究實戰的領域,這些偏向學術性的著作往往很難提供工程師需要的即戰力。

2016年5月16日 星期一

書評: 致命 Bug - 軟件缺陷的災難與啟示

新聞報導民國 107 年將把程式設計列為國中必修課程,這個訊息透漏出在不久的將來、不懂軟體的人將成為另一種文盲。不懂軟體的大人也別以為那是小孩子的事,反正以後送補習班就好,事實上軟體已經跟我們的生命財產密不可分


2016年5月2日 星期一

RS232/422/485 Anaylzer DIY PART3

看了 PART1PART2 的朋友應該會心生疑惑:「那 source code 呢?難道沒有 soruce code 可以參考嗎?」

其實程式去年就寫完了,但最近才有時間整理,寫這一系列文章也是給自己做個複習,再不然我都快忘了自己曾經寫過這麼一隻程式,而且與其放著隨風而逝,還不如拿出來拋磚引玉。


2016年5月1日 星期日

Arduino 另類應用: PLC

Arduino 應該不用特別介紹了,大概已經到了大人小孩人手一片的程度,據說坊間還有開設給小孩上的才藝班。不過今天要介紹的應用除了工控圈的人之外應該很少人知道

2016年4月30日 星期六

被遺忘的神作

最近很流行參加程式競賽,這方面的中文書(不含譯作)目前大部分出自強國手筆。事實上早在 26 年前,台灣就有人寫了一本全是演算法解題的書:


2016年4月29日 星期五

通訊協議個案研究

工控這個圈子大概是最熱衷發明新輪子的圈子,不但有圓的扁的,八角形,長刺的,定時爆炸跟不定時爆炸的。

2016年4月26日 星期二

JavaScript Note: constructor 徹底研究

JavaScript 混亂的程度,就算是拿大師們的著作來比對都會發現不一致之處。不信嗎?讓我們看下去......

2016年4月25日 星期一

2016年4月24日 星期日

RS232/422/485 Anaylzer DIY PART2

1. Embedded Lua to C/C++


最後小弟選擇了 Lua,因為他本來就是被設計成嵌入其他應用程式,而且 100% ANSI C 無雜質不需要安裝其他有得沒得,我們的開發工具就定調為 C/C++ mix Lua。順帶一提,在 RTOS 界知名度極高的 WindRiver 最近新推出的 IoT 平台也支援了 Lua(WindRiver 現為 Intel 子公司)。

2016年4月22日 星期五

RS232/422/485 Anaylzer DIY PART1

動機

工作上常常需要分析 RS232/422/485 通訊,為了除錯或是了解通訊協議。幾經思索下,發現最好的方式就是在一個正常通訊的線路上觀察通訊行為,然而通訊的兩端不一定是 PC,所以不一定有機會安裝 sniffer 之類的軟體,再說盡量不要介入通訊的實際過程以免影響通訊行為。這時候用硬體的方式是最穩當的,以 RS232 為例:


2016年4月21日 星期四

JavaScript Note: prototype 更新釋疑

最常跟小弟交流的網友,大部分來自工控界。其實小弟也作過一陣子時下流行的「全棧工程師(Full Stack Developer)」,寫過 PHP + MySQL + jQuery + Google Map API,下面是小弟過去的作品截圖:

2016年4月20日 星期三

推薦: 入門 機械控制與實作練習:藉由製作四軸吊臂學習設計機械裝置

當年小弟還在唸書時,某位 PLC 老師很驕傲的表示市面上唯一找得到的中文書就是他寫的。

時至今日,大家的選擇變多了,不過大部分的書普遍有個問題,就是學了一堆 PLC 語法還是不知道如何組出一個系統。



2016年4月19日 星期二

書評: 數學教你不犯錯(上)



這是一本「掃盲」的書

怎麼說?比方說,「靠O工程師」裡一堆「工程師」堅持放「乖乖」可以使伺服器不當機,請問這個方法是否具有「統計顯著性(Statistical significance)」能否通過「虛無假設(null hypothesis)」?

2016年4月7日 星期四

debug 的奧秘(2): ISR Debug 方法蒐集

哪種類型程式最難除錯?ISR(Interrupt Service Routine)絕對可以排進前三名

因為 ISR 對 timing 非常要求,程式必須短小精幹,於是即使花了大筆鈔票買 ICE,也很難用傳統設定中斷點、單步執行等方式進行除錯。

但 ISR 又是 firmware 必須面對的一環,沒有他絕大多數的週邊無法正常工作!

妙的是這樣重要的東西,居然很少有書本/網站提到(或許是站長孤陋寡聞,還請各方先進指正),於是站長興起一個念頭,何不把多年來蒐集到的各種 ISR 除錯技巧分享給大家,也算功德一件 :)

2016年3月29日 星期二

第三勢力: Raspberry Pi

因為看到站長的偶像 ChamberPlus 大師在 facebook 轉貼一篇文章,本來直接在下面留言的,不小心越寫越長,心想乾脆獨立成一篇文章算了!

2016年2月12日 星期五

師父: 一本工程師必讀的書

對於已經出社會一陣子的工程師來說,最困難的不是技術,而是這間公司是否值得投注所有的心力?

過去的作法是到各處有名的宮廟求神問卜,希望超自然力量來改善自己的工作運。

忘掉那種不科學的作法吧(如果對你有效,請跳過這篇文章),畢竟義和團已經幫忙證明了效果實在不怎麼樣。


2016年2月3日 星期三

淺談 Maker 運動與文化

2016/02/12 update

Maker (自造者) 運動大概是近幾年最夯的活動了,這讓很多老人大惑不解(3D 印表機?又慢精密度又差)。

甚至很多人覺得這只是高級嗜好而已(從 Maker Faire 參訪的民眾不少都是家長帶小孩可知)。

以下是小弟的見解...

2016年1月21日 星期四

Loopback 妙用: 應用篇

在 Loopback 妙用一文中有網友問這有哪些應用,這邊就來舉兩個例子

1. 安全的結束 thread

2016年1月16日 星期六

Loopback 妙用

楔子

multi-threading programming 免不了需要實作 Inter-thread communication(ITC),最常見的大概就是 consumer/producer:

2016年1月11日 星期一

C++: 善用 PIMPL 技巧

PIMPL (Pointer to Implementation ) 技巧已經出現十幾年了,可是小弟的職業生涯中卻很少看到有人使用,決定來寫篇文章推廣一下。這個手法可以解決/改善 C++ coding 常碰到的 2 大問題:
  1. class 增加 private/protected member,使用此 class 的相關 .cpp(s) 需要重新編譯
  2. 定義衝突與跨平台編譯問題

2016年1月3日 星期日

From C++ Builder to Qt > From TThread to QThread

C++ Builder: TThread

C++ Builder(簡稱 BCB)是十幾年前頗流行的 Windows C++ IDE,現在大概只剩站長這種老人記得。早年若是不肯花苦工去學 MFC 又堅持要用 C++,那剩下的選擇就只有它了。

BCB 易學難精,一開始覺得很容易上手,但直到需求增加、專案規模變大變複雜,馬上就會碰到「撞牆期」,multi-threading 就是一例。