About虛擬&實際

@分享虛擬與實際的世界中所遊玩的心得紀錄,從物理化學到生命科學、從人文藝術到現代科技、從虛擬介面到實際生命體。享受的只是一種學習與體驗。若文章內容有誤,歡迎提出以供修改,對文章的回饋,歡迎寄信給我!一起分享,互相學習成長的環境。
@個人簡介在『關於韃靼』
@我是韃靼~我的信箱:chenyuquan at gmail dot com

2013年3月31日 星期日

人月神話_ The Mythical Man-Month

前言:
這篇記錄了閱讀人月神話所得到的感想或者筆記,閱讀的是中文版本,但一樣輔助英文版的電子書。這是一本被譽為經典的好書,雖然程式方面我還沒熟悉與精通,但看此書也得到非常多的建議與觀念,而且現在閱讀與以後閱讀我想也是可以有更多新的感觸。



Chapter 1-焦油坑 (The Tar Pit, P19)

Chapter 2-人月神話 (The Mythical Man-Month, P31)

軟體專案時程:(P41)
1/3- 規劃(Planning)
1/6- 寫程式(Coding)
1/4- 組件測試(Component test & early system test)
1/4- 系統測試,完成所有組件(System test, all components in hand)

惡性循環的時程災難(P43~P47)

1. 這幾頁可以提供計算人月關係與思考拖延的後果
2. 軟體專案會耗費多少時間是看他有多少連續性的限制。

Chapter 3-外科手術團隊 (The Surgical Team, P49)

盡可能用最少的人來完成專案!!-P53

Chapter 4-專制與民主 (Aristocracy, Democracy, and System Design, P79)

整體概念性(Conceptual Integrity)-P67
功能概念複雜度比(ratio of function to conceptual complexity),好的設計既不可單獨偏重功能性,也不可只偏重簡單性。

創意工作: 架構設計-實作-實現; 事實上是可以同時開始合並行的。


以整體概念性為主軸,時程壓力終會迫使系統開發由更多人一起合作,使用兩個方式解決達成整體概念性:

1. 將工作分成“架構(architecture)”與“實作(implementation)”-P70
---architecture, 做什麼? ; implementation, 如何做?
2. 外科手術團隊(第三章)

約束對藝術而言是件好事(Discipline is good for art)-P73

形式就是解放(From is liberating)
成本校能比(Cost-performance ratio)

Chapter 5-第二系統效應 (The Second-System Effect, P79)

架構設計師 vs. 第二系統效應(chapter 5)-p87
架構設計師要如何避免第二系統效應呢?很明顯地,他無法跳過他的第二系統,但可以留意造成第二系統效應的獨特原因,再加上自律,以特別提醒自己避免設計出不相干的功能,或是做出違反原先假設與目的的功能。

Chapter 6-意念的傳達 (Passing the Word , P93)

量化(quantize)
”精確的說明“應該比”生動地表達“來得重要
英語,或任何其他人類語言,原本就不是用來精確描述定義的。

--使用"正式標記法(formal notation)",另外好的規格書應該同時包含“正式定義”和“散文式定義”,以口語化的解釋使規格書易於領會和傳授。
Chronometer:羅盤
贊同開會:P98
第一種:每週會議,成功的原因,共五點
第二種:年度檢討大會(作者prefer半年一次)

Chapter 7-巴別塔為什麼失敗? (Why Did the Tower of Babel Fail?, P107)

(p107即)提到五個重要的成功條件,但是皆以失敗結束。因為缺乏了兩樣因素:溝通(communication)以及隨之而來的組織(organization)
--溝通:非正式方法(informally),會議(meeting)以及工作手冊(workbook, P109)
--組織, P112:目的在於減少溝通介面和協調的需要量->人力配置(division of labor)以及專業分工(specialization of function)

Chapter 8-預估(Calling the Shot, P123)

1. 練習就是最好的教練-西流士, Practice is the best of all instructors.- PUBLILIUS
2. 經驗的代價是昂貴的,但愚人就只能從經驗中學習, Experience is a dear teacher, but fools will learn at no other.- POOR RICHARD'S ALMANAC
ref:上面的第二點出自“窮查理年鑑”(中譯),也就是Benjamin Franklin(1706-1790)在1733-1758年在費城發表的年鑑。

另個比較有趣的是提到“即使只考慮個人創作,不含任何跟別人溝通的代價,寫程式的費力程度仍然跟程式的大小呈現指數倍數的關係”-雖然是淺顯易懂一句話,不過有時候還是會成為判斷錯誤的原因之一。


兩個新的名詞:

控制程式(control program)
    包含:操作,維護
語言轉譯程式(language translator)
    包含:編譯器,轉譯器(資料組譯器)

(p129), 在章節末段提出的兩點結論之一:若以“行”來算生產力,似乎是個固定的值,因為每一行程式得花多少腦筋思考,可能藴藏多少錯誤,都是固定的...。
好奇點在,對程式語言開發系統來說,“每一行”的長度很接近或一樣嗎?因為前述有提到每一行大概可抵三到五個字。恩!恩?

Chapter 9-地盡其利,物盡其用(Ten Pounds in a Five-Pound Sack, P135)

The author should gaze at Noah, and ... learn, as they did in Ark, to crowd a great deal of matter into a very small compass- SYDNEY SMITH, EDINBURGH REVIEW

空間就是金錢->A:程式大小的控制->B:節省空間的技術

A:
技術上 & 管理上
(p137),存取規劃(access budget)
提到的兩種問題:
1. 重疊(overlay)
2. 分頁錯亂(page thrashing)
提到的三個教訓:
1. 做好“整體空間規劃(total size budget)”,
2. (p138)在規定某個模組的大小之前,先精確定義出這個模組該做的事情,
3. 系統架構師對系統的整體性保持警覺。
B:
“創意” & “技術”取代“規劃”與“管制”
第一種技術:功能和空間取捨
1. 功能越單一,程式所佔的空間也會越少
第二種技術:空間和時間做取捨
1. 對同一個函式而言,能用的空間越多,執行的速度就越快,這道理幾乎在任何情況下都能成立,可以作為安排空間規劃的參考。

(p140)管理者可以做的兩件事情:

1. 確保程式設計師的本事是技術訓練而來,
2. 認知到寫程式有其專業的技術。
(兩套手冊必備:副程式或者巨集- queuing, searching, hashing, sorting,分成=執行速度最快以及使用空間最少的)

(p141)又小、又快、又好的程式幾乎都源自於“策略”上的突破。

”譯註“資料(Data)或表格(Table)地呈現方式指的是“資料結構”,而“流程圖”所隱含的意義就是“演算法(algorithm)”。

(p142)有一段話寫得很好:
為了空間不足的問題而顯得黔驢技窮之際,通常最好的做法就是從程式碼中跳脫,回過頭重新思考所使用的資料。
“資料的呈現方式是程式設計的本質”
“Representation is the essence of programming”

Chapter 10-文件假說(The Documentary Hypothesis, P147)

假說:
在成堆的書面資料中,有一小部份關鍵性文件記錄着任何專案管理的核心工作。而這些文件是身為管理者最重要的工具。
The hypothesis:
Amid a wash of paper, a small number of documents become the critical pivots around which every projects management revolves. These are the manager's chief personal tools.

(p147)準備這一小部分文件是為了讓思考集中,並且使討論言之有物,而非淪為漫無目的的空談。


(p150)任何管理工作所關心的五件事情:

人、地、時、物、錢

(p150)規劃軟體開發專案的文件(很受用,值得參考!)

做什麼(What):目標
做什麼(What):產品規格
何時做(When):時程
多少錢(How much):預算
哪裡做(Where):場地配置
由誰做(Who):組織編制圖

(p151)最後一點有一句定律如-Conway定律:從事系統設計的組織所設計出來的系統將會是組織溝通結構的翻版。意思就是組織編制圖會初步反映出系統的第一次設計成果,而此設計幾乎可以確定並不是我們要的。


(p151)提到為什麼需要正式文件

第一:只有“寫”下來,才能引導更多細節的決定(mini-decision),而這正是從模糊不清之中理出清晰而明確政策的具體方法。
第二:有“傳達決策給他人的功用”
-管理者的工作就是“制定計劃“,然後”實現它”,但唯有將計劃“寫”下來,整個開發工作才能做精確地推動與溝通。(p152)

Chapter 11-失敗為成功之母(Plan to Throw One Away, P157)

這世界唯一不變的就是這世界一直在變-斯威夫特
There is nothing in this world constant but inconstancy.-Jonathan SWIFT(1707)

你得以平常心看待失敗,試試這個,如果行不通,就老老實實接受行不通的事實,再試試那個。總之,要成功,就得去試試。-富蘭克林·羅斯福

It is common sense to take a method and try it. If it fails, admit it frankly and try another. But above all, try something.-FRANKLIN D. ROOSEVELT

"丟掉重做" 

1.毋須煩惱是否做一個試探性的系統,因為到時候勢必就會這麼做。
2.計畫做得再完美也會有百密一疏,因此必須有丟掉重做的準備。
3.所以無論如何,把必然的一次失敗納入正式計畫之中-plan to throw one way; you will, anyhow.
4.硬體是有形的且可以量化(quantize)並加以節制,但軟體是無形的,且易於操控(tractable),使得開發人員面臨需求上無窮無境的改變。
5.定義出一個底線是必須的,而且隨著專案進行,這項限制應該要越來越嚴格,否則沒有任何產品會完成。
6.丟掉重作的改念本身就是要讓你接受先學到竅門、然後改變設計的事實。

使系統利於改變

7.(p159) 說的多做的少-設計一個系統且利於改變: 模組化、副程式、為內部模組之間定義出明確且完整的介面,並寫出完整的文件。盡可能使用標準的呼叫程序(calling sequence)和表格驅動技術(table-driven)。

使組織利於改變

8.類似"外科手術團隊"

軟體維護(program maintenance)在於軟體交付之後的變動

-主要來自"修正設計錯誤"、"增加新功能"。維護起碼付出相當於開發成本的40%,甚至更高。
-軟體使用者越多,維護成本越高。(p162-163)
可能遭遇到一個重要的問題,就是因修正錯誤而導致其他錯誤的可能性相當高(about 20~50 %)
-做到完整的迴歸測試(regression test)所需的成本相當高。

Pascal: 任何事物總是在開始的時候最完美。(p164-165, 進一步,退一步)


Chapter 12-神兵利器(Sharp Tools, P171)

巧匠以他所使用的工具而聞名。-諺語
A good workman is know by his tools.-Proverb

有哪些工具是管理者需要思索、規劃和組織的呢?

『目標機器』
機器(電腦設備)->作業系統(服務法則)->語言(語言政策)
『工具機器與資料維護』
另外還有:工具程式、除錯輔助軟體、測試案例產生器以及文書處理系統

p175, 可靠(dependable)跟精確(accurate)不同,模擬器需要可靠性,雖然新型機器架構相對來得精確。


p175, 對於模擬器(simulator)的描述必看(到p176)


p182, 交談式工具必須搭配高階語言。這兩者的結合確實造就了一組神兵利器。

Chapter 13-化整為零(The Whole and the Parts, P187)

我可以招喚地底的幽魂。
啊!這我也會,甚麼人都會;可是當您招喚它們的時候,它們就真的會來嗎? - 莎士比亞,亨利四世》,上篇
I can call spirits from the vasty deep.
Why so can I, or so can any man; but will they come when you do call for them? - SHAKEPEARE, KING HENRY IV, PART I


測試方案有三大面向:
設計-組件-系統
(避免發生錯誤的設計方案-組件除錯-系統除錯)


p188, A good top-down design avoids bugs in several way.這裡面的第三點:The suppression of detail makes flaws in the structure more apparent.不是很瞭解!?為什麼隱藏的細節卻可以使結構中的缺陷更容易被突顯出來呢?


名詞解釋:dump (for computer)
(n) The act of copying raw data from one place to another with little or no formatting for readability. Usually, dump refers to copying data from main memory to a display screen or a printer. Dumps are useful for diagnosing bugs. After a program fails, you can study the dump and analyze the contents of memory at the time of the failure. Dumps are usually output in a difficult-to-read form (that is, binary, octal, or hexadecimal), so a dump will not help you unless you know exactly what to look for.

p193, 系統除錯:系統除錯所耗費的時間將超乎預期,而其困難也證明了有必要準備一套條理分明、規畫良好的測試方案。而在系統除錯中有5點:
A:
大致上提到的為:嘗試整合(bolt-it-together-and-try)還有讓各個組件互相測試。另外不建議"先將錯誤記錄起來"的做法。

B:
建立充分的測試鷹架(scaffolding),屬於鷹架的部分占了產品全部程式碼的一半其實並不為過。
C-E
控制改變一次只整合一個組件以及固定改版的時機

Chapter 14-釀成大災難(Hatching a catastrophe, P203)
沒有人會給報壞消息的人好臉色看。- 沙孚克里斯
None love the bearer of bad news.

為什麼專案會落後一年?
......因為每次落後一天。
How does a project get to be a year late?
...One day at a time.

p203, 時程總在不知不覺之間延誤,而且非常無情;事實上,顯而易見的事故很容易克服。

Milestone vs. Millstone (p203, 里程碑或者包袱?)
里程碑必須是具體明確可量測的事件,有沒有達成應該是一翻兩瞪眼的事情,絕不模稜兩可。

p206, 善用要逕網路圖 (critical-path network)[通稱"計畫評核圖"]

p206, 兩種必須知道的資訊:未如計畫預期的意外狀況,計畫的執行現況。
p207, 兩種知道真相的方法:降低角色的衝突以鼓勵據實回報,審查制度。

p207, 降低角色衝突:執行狀況報告 & 討論解決方案 應該明確分開。

p211, 建立"計畫監控小組"是可以擔任守門員的角色,也就是早期預警系統。

Chapter 15-一體兩面(The Other Face, p217)
我們無法主宰我們不了解的東西。- 歌德
What we do not understand we do not possess. GOETHE

哦!請賜予我簡單平實的評論者,他們不諱莫如深到讓人困惑不解。 - 克拉布
O give me commentators plain, Who with no deep researches vex the brain. CRABBE

**p217, 程式,其實就是人對電腦說話,其內容必須經過審慎、嚴謹的語法編排與定義,這都是為了能將意圖明確地傳達給那台笨電腦。

p218, 為使用程式而寫的文章,最常犯的毛病就是“缺乏”“概觀性的描述(Overview)”,通常可以歸納九點:
    目的、環境、輸入&輸出值域、欲達成的功能與使用的演算法、輸出入格式、執行過程中的指示、選項、執行時間、輸出結果的精確度&檢驗方式。

另外還有“為建立對程式的信心所寫的文件”,“為修改程式而寫的文件”(p218-220)

p220,惱人的流程圖,是最被過度強調的文件,許多程式一點都不需要流程圖,也很少有程式需要一頁以上的流程圖。
    繪製詳細的流程圖其實是個既落伍有麻煩的事情,僅適合用來幫助初學者起個頭,協助他進入演算法的思考。

p223, 自我說明程式(Self-documenting),資料處理的基本原則告訴我們,嘗試同步維護不同的文件是件愚蠢的事,“對於同一件事物的相關,應該盡可能統一放在同一份文件中比較好。

p230, 電腦終究是服務人類的,而非由人去配合電腦。

Chapter 16-沒有銀彈:軟體工程的本質與附屬工作 (No Silver Bullet-Essence and Accident in Software Engineering, p235)
在未來的十年之內,無論是在技術上或管理上,都不會有任何單一的重大突破能夠保證在生產力、可靠度或簡潔性上獲得改善,甚至,連一個數量級的改善都不會有。
There is no single development, in either technology or management technique, which by itself promises even one order-of-magnitude improvement within a decade in productivity, in reliability, in simplicity. 

p235, 所有的軟體創作都包括了“本質性(essential task)”和“
附屬性(accidental task)”。

    前者是抽象的軟體實體所組成的複雜概念性結構;
    後者則是用程式語言來表現這些抽象的實體,將程式對應至機器語言。

p238, 本質上軟體實體是由許多彼此環環相扣的概念所組成:
    資料集合、資料項目之間的關係、演算法、各種功能的執行。

p238, 現代軟體都有的天生特質:複雜性(complexity)、配合性(conformity)、易變性(changeability)、隱匿性(invisibility)

p243, 過去的突破都是解決附屬性的難題如:高階語言、分時技術、統一的軟體開發環境。

p245, 尋找銀彈,Ada的理念比Ada語言本身更先進的地方:
    模組化(modularity)
    抽象資料型別(abstract data type)
    階層式結構(hierarchical structure)
其它尋找銀彈的方向還有:物件導向程式設計(object-oriented programming, OOD),人工智慧(artificial intelligence, AI),專家系統,<自動化>程式設計(automatic programming),圖形化程式設計(graphical programming),軟體的驗證,環境與工具,工作站。

p247, 人工智慧,軟體開發難就難在決定要表達什麼,而不在於表達本身,表達的方式再怎麼簡化,所得到的效益也是有限的。

Chapter 17-再論『沒有銀彈』("No Silver Bullet" Refired, p269)
無論中彈與否,都是命中注定
Every bullet has its billet.- William III of England, Prince of Orange

無論誰想要看到十全十美的東西,那麼就去想像一下那種過去不曾有過、現在也沒有,而未來也不會存在的事物。
Whoever thinks a faultless piece to see, Thinks what ne'er was, nor is, nor e'er shall be. - Alexander Pope, <An Essay of Criticism>

Chapter 18-<人月神話>的主張:是真是假?

Chapter 19-<人月神話>二十年

補充:

看到了一篇文章提到"吳信輝"先生提出的軟體開發工程師的十大特質:
0 喜歡寫程式
1 完成事情的能力
2 持續地重構你的程式碼
3 使用設計模式
4 撰寫程式碼的測試程式
5 利用現成的程式碼
6 專注在可用性上
7 必須寫出可以維護的程式碼
8 可以在不同的程式語言撰寫程式
9 必須瞭解基本的電腦科學基礎
    大部分都可以在此人月神話此書中相呼應,以學術界深入研究程式語言的角度(也許也曾在業界,沒有進一步查詢)也是將好的軟體開發工程師所需具備的重要特質都提到了。

後記:


Book List:

The Mind of the Maker- Dorothy Sayers
---Idea, Implementation and Interaction

Reference:

Backus-Naur Form(P95, formal notation)

2013年3月30日 星期六

呼叫subVI並以新視窗(VI)開啟程式

前言:
有時候主程式已經布滿了控制元件,或者有些子程式並不需要常態性的顯示,所以當需要的時候再呼叫"另一個"VI可以減少版面的設計。

Code:
Main VI  "本身" 不需要做特別的設定,只要採取底下的方法 ( 2選1 ):


方法一:使用「sub vi node setup」,然後把「Show Front Panel when calledClose afterwards if originally closed」打勾,看看這樣可不可以。
















方法二:在 Sub VI 的VI Propertyes -> Window Appearance -> Custmize ->

















左邊下方的兩個選項勾取即可:
Show front panel when called &
Close afterwards if originally closed

這樣就可以在主程式(mainVI)呼叫另一個子程式(subVI)囉。


參考網址:

IT360.com


2013年3月18日 星期一

Timing- Wait (ms) & Wait Until Next ms Multiple(ms)

前言:
最近在複習一些基本觀念,有些小細節總是容易搞混,即使用了很多次還是一樣。有關"wait" & "wait until next ms multiple"這兩樣時間控制的元件。

比較:

若以help的解釋來看,其實有點模糊不清楚。所以從網路資訊可以得到的概念大概就是:
wait:執行到包含此元件的時候會等待所設定時間,再繼續執行下一個流程(或下一個迴圈)。wait until...:有點類似wait,但是當要執行下一個流程(或者下一個迴圈)會以設定的時間"倍數"作為起始點。
這樣說起來還是有點ㄚ札,自己的理解大概就是使用wait until...可以保證每次迴圈起始時間都是所設定的整數倍。或者可以參考這裡(需加入會員)

那這樣就衍生一個有趣的問題,在這樣的假設下,在同樣的時間(例如五分鐘、十分鐘或者更長時間)下,超過wait或者wait until...設定時間的程式,那哪個程式可以執行比較多次呢??於是我設計了一個VI如下:




程式的設計是迴圈每兩個迴圈後持行執行一次包含time delay的迴圈。程式中的T1是設定wait的迴圈,另外T2是設定wait until...的迴圈,looptime是兩個並行迴圈共同執行的速度,而code time則是"假的"code運行速度。(使用的ICON為time delay)


狀況一:looptime=100 ms, code time=0.12(120 ms) 
在這樣的模擬下,執行時間與相對應的迴圈技術(i number)如下:
Time(second)-Code count-delta
60-(c1)561/ (c2)601-40
300-(c1)2795/ (c2)2996-201
以上的結果顯示了使用wait until...在相同的時間下,執行的次數反而比較多!??

狀況二:looptime=100 ms, code time(second)>=0.199

在這樣的模擬之下,兩個執行時間則會變成相當接近!!就不會再有持續的差距出現了!!真是有趣啊!?~WHY~ 

小結論:

不過我對這樣的結果也是稍微存疑,因為一來我沒有適合的程式可以真的測試運行時間,用Time delay不知道合不合理。第二因為兩個迴圈雖然是並行運行,但是不知道是否可以自行的變成多核心運行(雖然查詢到的資訊是說會自行轉換!)。至於狀況一與狀況二的差異,還需要思考一下真正導致的原因,雖然我覺得就跟time delay這個icon所造成的有關係,好像有一點點跟原本討論的不太一樣。

2013年3月17日 星期日

Arduino_Project12_Knock Lock

前言:
這次的專題計劃是設計可以上鎖的箱子(同樣地,也是先順利完成專題為主)。利用piezo可以反向的作為感測器(震動),敲打震動的次數來解開鎖定(servo motor)。

硬體:

servo motor, piezo, capacity, LED, resistor...etc

程式:

一開始也要先呼叫servo的函數庫(Servo.h),在sketch裡面設定敲打的次數(knock number),以及加入自定義函數來作初始的判斷,判斷piezo是否處在不正確的狀態(例如振動頻率過高或過低)。

Code:

boolean name = true (or false_ 定義"name"的布林參數。

圖片:


後記:

越到後面的專題,難度就越來越高,真是有很多有趣的挑戰性,不過code中的邏輯就更需要去思考為什麼這樣了。也瞭解與學到了如何自定義函數(記錄在後面的補充),雖然好像在之前也有看過的樣子!?~下個專題想必又是令人心動的學習過程。

參考:

Arduino reference

補充:(2013/3/17) 自定義函數(custom function),在這個專題裡面是先出現後,在完成void loop()後才進行“定義”,但是依然會運行在loop裡面!?(這裡還沒搞清楚)!

自定義函數可以有兩種結果:(1)不回傳數值(Value),則宣告此函數為void,類似loop()和setup()函數。(2)回傳數值(Value),則必須宣告數值的形態(int, long, float, etc.),但在這個case裡面是宣告成boolean type(布林形態)  
boolean checkForKnock(int value){....:這個自定義函數中的value是輸入數值,在主要函數內則是以knockVal輸入此位置(但是knockVal其實就是等同於analogRead(piezo)所得到的數值)。

目前測試下,ㄧ開始按下按鈕後,會變成locked然後在serial monitor會一直出現還需要knock的次數,但是敲得很大力會亮黃燈,但是還需敲打次數依然會減少!?然後滿足敲打數(knock number)後會變成unlocked(開鎖),此時再次按下按鈕,會變成locked(亮紅燈)後馬上就再次變回unlocked(亮綠燈),再按幾次都是如此,是只能進行一次嗎??怪哉!

解決方案:(2013/3/18)

在比較瞭解程式的邏輯後,我發現原本的code本來就只能執行一次,因為在 "numberOfKnocks" 增加後就不會回到起始點(雖然在“setup”有初始化int numberOfKnocks = 0),所以必須在"loop"的結束後加上以下的code就可以重復的使用此程式囉。

Code:


if(numberOfKnocks >=3){
  numberOfKnocks = 0;
  }

Reading & Learning

前言:
雖然利用首頁旁邊可以快速設定連結,不過當連結束過多我想版面就會拉得很長。所以設定這個主要的連結作為分類,再從裡面更新與新增比較方便。排序暫時就以新增的先後順序為主!另外閱讀筆記的書籍目前都以程式語言,電腦相關的資料為主,其他的就看情況再打算要不要做電子紀錄了,也許以紙本記錄吧!!??另外整合了"學習資料"與"學習紀錄"的部分,讓整個清單比較一目瞭然而不會分了太多副連結。

閱讀:
[閱讀筆記] 學徒模式-Apprentise Pattern
[閱讀筆記] Getting Started with Arduino
[閱讀筆記] 人月神話-The Mythical Man-Month
[閱讀筆記] 超閱讀力,不誇張!一分鐘讀懂?本書
[閱讀筆記] Hacking Work夠駭 才能成為職場A咖-CH1~7

學習資料:
[學習資料] LabVIEW
[學習資料] MATLAB
[學習資料] Arduino
[學習資料] Raspberry Pi
[學習資料] Python

學習紀錄:
[學習紀錄] Linux
[學習紀錄] Python-The Quick Python Book
[學習紀錄] LabVIEW
[學習紀錄] Arduino Cookbook
[學習紀錄] LabVIEW- Image Acquisition Processing with LabVIEW
[學習紀錄] 論壇教學&技術文章等等
[學習紀錄] 介面設計與實習,使用LabVIEW NI-VISA
[學習記錄] 我和LabVIEW,一個NI工程師的十年編程經驗

閱讀中書單:
資料之美-Beautiful Data
艾西莫夫科普教室(中)
朗文當代辭典
藍芽技術
藍芽技術理論與實作閱讀清單:

GRE紅寶書
Python 科學計算
You 你的身體導覽手冊
伸展聖經

Feynman's Tips on Physics

待思考:
MATLAB 學習紀錄
Igor 學習紀錄(已有文章記錄)
Illustrator CS 3 學習紀錄
SQL (ex: mySQL, LabSQL...etc...)

Getting Started with Arduino

前言:
這邊記錄了一些讀此書所得到的新觀念或者一些基本概念。反過來比較不會專注於描述Arduino的東西,細節的基本上會紀錄在Arduino Projects Book的實作以及其他實作(例如Arduino Cookbook, etc)過程。同樣地,其實也都快讀完了才想到回頭做點筆記,真是殘念...

P103-Appendix C-Arduino Quick Reference
-在shiftOut(dataPin, clockPin, bitOrder, value)裡面提到的least significant or most significant原來就是LSB & MSB,這些被歸類在Endianness(位元組序)中所提到的,大致的定義是“位元組序,又稱端序,尾序(英語:Endianness)。在計算機科學領域中,位元組序是指存放多位元組數據的位元組(byte)的順序,典型的情況是整數在內存中的存放方式和網路傳輸的傳輸順序。Endianness有時候也可以用指位序(bit)。 

Reference1Reference2”。自己的解讀就是“一串數據應該從哪個方向讀取(從暫存器裡面讀取出來)”,若類似英文書寫(左至右)為MSB,反之則為LSB,從文章所附件的表格看起來是指這個意思。


2013年3月15日 星期五

學徒模式_Apprenticeship Patterns

前言:

漸漸地發現筆記有時候以紙本模式存在要再搜尋有點困難,尤其是書閱讀越多的時候!!要在把以前的內容電子化真的是一大工程(讓我想起來一本書-數位記憶革命,就是提到將所有紙本的資訊都數位化,然後藉由很棒的搜尋系統來提取與分類等等的,“也許”有一天我也會試試看吧),所以就以近來新讀的書為主吧。

摘要:
這裡主要記錄看此書得到的想法,與其相對應的經驗與反省,還有值得再三思考的文字,都將其記錄下來,屬於持續更新的文章。雖然開始紀錄的時候已經閱讀差不多七八成內容了!!以下所提到的頁數除非有特別提到,否則是以中文書本的頁數為主。而最後的每小節所收錄的好句子會附上英文,因為大多數語意真的翻譯的很不順暢,當然也許是我自己理解錯誤,所以中英文就都記錄下來。英文的部分是參考原文書電子檔案。

內容:
$Chapter5-終身學習$
&邊工作邊反省&
-P86”Peter Principle,彼得原理_Reference“,白話一點就是被升職到一個“不能勝任的位置”。而此項建議則是必須為了升遷的將來做好'準備',而這項建議就是利用”個人實作地圖(Personal Practices Map-Joe Walnes)“。(補充)另一項從此原理變化的就是”呆伯特法則(The Dilbert principle)-Reference“,含義很接近,不過是更具諷刺意味的法則。

&記錄個人所學&
-P89“用日記、個人維基或部落格”記錄下你的旅程(目前正在持續進行),這些應該是個苗圃而不是個墳場,資料記錄應該能產生出新的經驗,而不是靜靜的死亡。需要在每次復習的時候加上新的連結,這個“創造性複習“的過程可以(1)用新的資料重新評估過去所做的決定,或是(2)能確認過去搖擺不定的想法。只要持之以恆,兩種結果都是好的。

&建立回饋迴路&
-P93"Stop Energy",可google<What is Stop Energy + Dave Winer>,主要提到當進行RFC(Request For Comment)的時候可能會得到“以善意忠告的方式呈現,告訴你為何無法達成目標,應該立即放棄而非冒著失敗的風險堅持下去。”有點類似中文的“說涼話”,“潑冷水”且自以為過來人的經驗忠告。這個就稱為“Stop Energy”,是個沒有用的回饋迴路,應該避免。

-P94”如果你覺得否件事情很有趣,你就會學到有趣的東西。“---(<開刀房裡的沈思>,255)

-P94"Systems thinker","Reinforcing feedback" & "Balance feedback",前者主要是鼓勵(積極)做更多事情,後者主要是鼓勵(建議)較少做某件事情。同時連結兩種形式的回饋,增加許多微小的調整來維持系統平衡(或者可以解釋學習某項事務之時期的平衡)

&自失敗中學習&
-P95"試著辨認出你失敗的方式,並嘗試解決那些值得修正的問題“---改善自我認知,可以與&量身繪製地圖&共同使用,以避免傾向太過理想化的道路。

&Ch5結語&
-P96"終身學習可以看作是祝福也能被視為詛咒“,學習新知識可能是十分通股的事情且必須承受心智上的不協調,但這種不協調表示持續進展的訊號。

$Chapter6-安排自我課程$
&熟悉使用工具(Familiar Tools)&
-P110"In a time of drastic change it is the learners who inherit the future. The learned usually find themselves equipped to live in a world that no longer exist.---Eric Hoffer, Reflections on the Human Condition_Reference",這句我想含義應該是指,能自主學習的人,終將繼承(掌握)未來;而不求進步的人(the learned, 已有知識的人,但不求新)將會發現那可以生存的世界已不復存在。

-P110"groove vs. rut",查了一些資訊得到這兩個字雖然意思相似,實際上他們的言外之意卻是天差地別。”A groove can guide you, while a rut restrains you._Reference“以前面這段話就可以看出兩個差異性了。



$Chapter7-總結$
大略提到,要達成好的軟體工程,需要將”知識“&”經驗“經由”有效地“傳承下去才是”好的結果”。可惜的是目前都還沒有,軟體工藝還是只有一小群擁有特別優秀才能的開發人員產生,形成了孤立的品質。藉由Antonio Stradivari的工藝(大、小提琴)無法隨著傳承而失去,也講述“日常工作中的小細節也是技巧的一部份”,技藝之路是機會與限制並存。

另外有提到程式設計師技能的分配圖並非是常態分佈,事實上是低於平均水平。而作者希望表達的是看重技術的領域與傳統,包含了獲得-成長-傳播技術。最後則說,目前仍然沒有大師的事實,雖然缺少證明並不是證明(Absence of proof is not evidence of proof.)。

-P114"Dunning-Kruger effect(達克現象)",認知偏差(Cognitive Bias)的一種,大概的意思是指自認為優秀(自我感覺良好),而且不僅指無能的人,即使是有能力的人也是一樣會反這樣的毛病。"the miscalibration of the incompetent stems from an error about the self, whereas the miscalibration of the highly competent stems from an error about others_Reference"(miscalibration = mis + calibration, 錯誤的標定/判斷)

每章節開頭的名言佳句:
Ch5-邊工作邊反省(P86)
(中)自我檢驗很難,但我相信我們能從自己的失敗中學到的比成功還多。---<專案回顧>
(英)Self-examination is hard, but I believe we can learn more from studying our failures than from our successes.---Norm Kerth, Project Retrospectives

Ch5-記錄個人所學(P88)
(中)你不應該低估寫作的力量...你會忘記目的。但是寫下來會讓你後退一步,重新思考ㄧ個問題,即使是最憤怒的怒吼也能強迫作者達到一定程度的深思熟慮。---<開刀房裡的沈思>
(英)You should not also underestimate the power of writing itself...You can lose your larger sense of purpose. But writing lets you step back and think through a problem. Even the angriest rant forces the writer to achieve a degree of thoughtfulness.---Atul Gawande, Better

Ch6-熟悉使用工具(P109)
(中)泥溝是指你持續轉動輪子卻停留在原地,唯一的進展是為自己挖條更深的溝;石溝則不同,當輪子轉動時你會毫不費力地前進,泥溝是不理會自己或世界的變化,持續使用嘗試過與測試過方法的結果。---<創意是一種習慣>
(英)A rut is when you're spinning your wheels and staying in place; the only progress you make is in digging yourself a deeper rut. A groove is different: The wheels turn and you move forward effortlessly... a rut is the consequence of sticking to tried and tested methods that don't take into account how you or the world has changed.---Twyla Tharp, The Creative Habit

Ch7-總結(P113)
(中)工匠以技藝的成熟自豪,因此單純的模仿無法得到持續地滿足,自身技藝必須要有所提昇。---<The Craftsman>
(英)Craftsmen take pride most in skills that mature. This is why simple imitation is not a sustaining satisfaction; the skill has to evolve.---Richard Sennett, The Craftsman

總結:
(2013/3/3 edited)
最近買了一堆新書,其中一本就是由Dave H. Hoover & Adewale Oshineye所共同出版的學徒模式- 優秀軟體開發者的養成之路(Apprenticeship Patterns- Guidance for the Aspiring Software Craftsman_Link)。主要就是談論如何從初學者(或再次成為初學者)的角度去磨練,增進,提升自我的能力所給的許多模式討論。


對於剛從G語言(LabVIEW)轉進Wiring (Arduino, 建立在C語言上)的文字式語言有很多觀念上的幫助,也可以藉此回顧之前學習LabVIEW歷程中的許多缺陷。


目前也還沒決定好到底想學哪一種程式語言,Python or.....自學的關係,要找到一個工匠或者師傅學習可能機會頗小,環境不像是在國外,華人說實在的還是比較保守些,不過還是會嘗試接觸與聯繫看看。


另外覺得有點可惜的是,翻譯與校正上面有頗多錯誤,例如翻譯不順,錯字多(目前只看了十來頁就發現至少五處錯誤)。有錯誤一定會有,不過錯誤很多就有點品質管理上的疏忽了。希望台灣進口代理(翻譯)的碁峰資訊可以加強譯文的流暢與正確性。

(2013/3/12 edited)
自從開始看了學徒模式後,學到了很多觀念,等到整理筆記完後再打成電子檔放上來做記錄。

另外不得不再次提起的是,翻譯的品質真的很不好,只有一整個不順的內容。站在讀者的角度,當然希望快速吸收到國外的資訊,且是用熟悉的語言,才不會需要花很多時間在語言上面。雖然讀英文是沒有太大的問題,但是原文書價錢貴是個不爭的事實(其實不太瞭解為何翻譯書籍通常都是便宜的??)。我瞭解翻譯者的功力以及要將一些外文語意翻譯成通俗的中文是非常的有挑戰性,但是出版社這時候應該要好好地控制品管吧,站在守門員的角度吧!?

這真的令我覺得翻譯領域其實非常極度的缺人才,不管是翻譯者還是出版業的編輯等等。除了一些外文翻譯的市場外,大概也是因為"cost down"所造成的狀況吧。希望在上頭的各位大佬可以除了賺錢外,可以再多花一點點的良心在推廣知識囉。(例如:聘起更多專業人才,且給足夠的薪水)

PS:台灣O'Relly已經停止營業,改由碁峰出版社,在專業的電腦圖書出版社的監控下應該可以增加更好的品質囉。(話說回來,學徒模式的出版公司還是碁峰呀~不是台灣歐禮來!這....)

參考:
Manifesto of Software Craftsmanship
Book:
(1)Refactoring : Improving the Design of Existing Code_ Fowler, Martin...etc, Addison-Wesley, 1999

(2)Software Craftsmanship : The New Imperative_ McBreen, Pete, Addison-Wesley, 2001
學徒模式(書籍資料)

軟體工藝宣言:
As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value:

Not only working software, but also well-crafted software.
Not only responding to change, but also steadily adding value.
Not only individuals and interactions, but also a community of professionals.
Not only customer collaboration, but also productive partnerships.

That is, in pursuit of the items on the left we have found the items on the right to be indispensable.

© 2009, the undersigned.

this statement may be freely copied in any form, but only in its entirety through this notice.

2013年3月13日 星期三

[學習記錄] Linux

前言:
最近一直都有找零碎時間來研讀Linux相關資訊,對於初學者的我而言,找一本書或者一個完整的資訊(網路)瀏覽是個很好的開始。

學習教材:
目前都先關注鳥哥的 Linux 私房菜為主,每天休息或者實驗空檔瞧個幾行幾段,增加一些基本資訊。雖然是很想買一本書起來放,但是看到鳥哥出的書這麼的貨真價實(有夠厚),還是先瀏覽網站,稍稍微的延緩後再說吧(手上還有幾本書在閱讀中)。

&閱讀紀錄&2013/03/13:

目前閱讀到第三章"主機規劃與磁碟分割",前幾張主要都是硬體為主,第三章開始會進入Linux的安裝以及軟體的部分。雖然我購買了Raspberry Pi已經內建Linux系統(Debian),不過還在思考要不要先從鳥哥建議的"CentOS 5.x"來學習~(雖然網路上有關Debian的學習資料也是很多,不過考量到學習效率與學習曲線,還是先以能快速且完整上手的部分開始)

題外話,最近思考了學習清單(包含書籍清單)後,已經比較有稍微清晰的藍圖了,希望可以順利的啟動~哈哈~



2013年3月10日 星期日

Micro B USB 小手術

前言:
今天焊接了micro B USB的接頭,話說回來,這種接頭比傳統的小,且漸漸地普及化了,不過我也直到今年年初才知道真是過時代呢!!

過程:
從wiki可以查到類似如下的圖片:
其實種類還挺多的,若能全部統一那實在是使用者的福氣,否則總是一堆規格不一樣的線材也是整理上的噩夢。

斷掉的地方是內部的電線,大概是因為殼裂開後,拉扯所造成的吧!不過焊接還了才想起來,只好拍外部來做記錄。

後記:
總而言之是個小小的手術而已,原本的線材有點短,不過還能使用,就省了時間換新的,雖然覺得有點鬆脫就是了。

參考:

2013年3月6日 星期三

程式語言的"開始"-by Arduino

前言:
若說LabVIEW是我第一個正式學的程式語言(Programming Languages),MATLAB是第二個(但只剛上手),那麼正式的文字敘述型程式語言大概可以將Arduino的Wiring (Based on C)算是一個吧。不過這幾天又持續的將幾個”程式語言“看了一些新的資訊,例如Ruby, Python...還是在思考到底以哪一個為“開端”,這實在是有點頭大,或許我不應該思考太過複雜才對!
    扯遠了的是,通常程式語言好像很喜歡以"Hello, World"為開始作為與電腦互動的起始!?利用Arduino的Wiring也不例外的可以這樣使用,因此我利用了Project 11有用到的LCD顯示器作一個測試,來達到這個小小的卻有象徵意義的程式碼。

硬體:

跟Projectㄧ模一樣,只是改變程式的部分。

程式:

將亂數的部分刪除,只增加很簡單的開始文字敘述與搖晃後的文字敘述而已。

Code:(截取片段)


void loop() {

  switchstate = digitalRead(switchPin);
  if (switchstate != preswitchstate) {
    if (switchstate == LOW) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("My dream will");
      lcd.setCursor(0, 1);
      lcd.print("come true!");
      delay (5000);
    }
    else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("I fucking love");
      lcd.setCursor(0, 1);
      lcd.print("our world !!");
    }
  }


圖片:
後記:
我想我會持續的很努力去喜愛這個世界,否則若什麼都不學,什麼都不做的話,實在是活得太無聊了。另外,有關LabVIEW & MATLAB的"Hello World"表示方式說真的挺無趣的,也許現在電腦的人機界面做得太棒了,導致我對於當下所顯示出的資訊還沒有太深入的感動吧!!

參考:

The Hello World Collection
Arduino_Project11_Crystal Ball

2013年3月4日 星期一

Arduino_Project11_Crystal Ball

前言:
經過二月的空窗期後,又繼續我的Projects計劃了。以往使用Arduino,若要顯示資訊都是經由Serial monitor,而這次借由LCD顯示器,就可以直接將資訊顯示在實體世界(指除了電腦螢幕以外的顯示元件)。

硬體:

LiquidCrystal (16*2 matrix), potentiometer, tilt switch.

程式:

已經有封包好的LCD library可以使用,只需要呼叫對應的command即可。另外自行建立八種預設答案,每次搖晃tilt switch則使用亂數功能(random)選擇答案。

Code:

    random(number)_ selected from number randomly.
    LCD library_ control lcd monitor.
    switch (case)_ case<use int number>, 傳回所選擇的數字,在此project內,顯示其中之一的答案(文字)(程式碼中建立八種預設答案)

圖片:


後記:

使用了LCD顯示器,則可以直接在實體世界顯示出資訊,例如使用溫濕度感測器,則可以將數值顯示在LCD上面,就不需要透過電腦來達到直覺的方式啊!真是方便,改天就將溫度感測器接上試試看。
另外,LCD的產品說明書是台灣的公司所提供的,真是有趣,還以為都是大陸制的!!

補充:

(2013/03/10) "switch"的這個指令很有趣,為什麼呢?因為之前都常常會打類似的指令-switchPin, switchState...etc,打完前面的switch都會顯示橘紅色(表示為內建指令),還在想為什麼指令會用到switch(那時候不認真,只想快速地先瞭解當下的project內容,所以沒查)。到了今天才瞭解到這個"switch"可以作”任務“的設定,就是先定義"switch(數值)",然後"case x"下一行則是內容,最後加上"break"表示case結束。大致地表示法如下:

    switch(number){
        case x:
        "reply content/ command"
        break;
        "new case"
        ....

其中的reply content/ command在project 11裡是輸出string到LCD上面<lcd.print ("text")>。

參考:

Switch(case) statement_ serial input 
LCD library
alphanumeric LCD (16X2)