about 2 years ago

為什麼要寫這份懶人包?因為我發現,大家之所以對這議題不太關心,原因是你不知道他們在玩什麼把戲。你不知道他們是「如何做修改課綱這一件事情」,你只知道他們想要對下一代洗腦,想要建立意識形態,但是你沒有時間,覺得很麻煩,所以所以不想做深入的理解,這篇懶人包就是要來幫你解決這個問題。

這篇文章我不想談太多修改的課綱內容,像是清代變清廷,日本統治改成日本殖民統治之類的史觀改變,那些文章網路上已經夠多了,不需要我來畫蛇添足。我想把重點放在「流程」。這篇文章會告訴你「政府到底是如何修改課綱」的,看完這篇之後,你會知道那些新聞常出現的名詞如「課發會」、「課審會」、「國教院」到底是在幹嘛。接下來再看其他新聞就會很有感覺。

如何修改一份課綱?

首先,做一件事情需要理由。從古至今,要修改課綱最近最適合的理由就是「推動教改」。最新的教改就是十二年國教。因為要實施十二年國教,所以我們要調整課綱,嗯,聽起來還不賴吧。

接下來,你要有法源依據,才可以順理成章的修改課綱。沒問題,我們有民國102年7月頒布的「高級中等教育法」,這部法律簡單講就是十二年國教的食譜,裡頭大致訂定了十二年國教的執行原則、該由誰負責處理等。法律就像食譜一樣,政府機關就像廚師,食譜告訴你怎麼做,你不能不遵守食譜,但是實際上食譜沒規範到的,多放一點鹽或烤焦一點,雖然難吃但是還是合法的。在這份食譜的第43條裡面寫到

中央主管機關應訂定高級中等學校課程綱要及其實施之有關規定,作為學校規劃及實施課程之依據;學校規劃課程並得結合社會資源充實教學活動。

中央主管機關為審議高級中等學校課程綱要,應設課程審議會,其組成及運作辦法,由中央主管機關定之。

幫大家簡單的翻譯一下,意思就是
1. 教育部應該要訂定課綱,作為學校教學的依據
2. 為了審查課綱,我們應該要設立課程審議會,那要怎麼做,就交給教育部自己處理吧

好了,有了食譜你可以開始做菜了。

至於教育部會怎麼處理這件事情呢?很簡單,教育部網頁「十二年國民基本教育課程綱要研修的問與答」自己講了,過濾掉一堆沒有意義的官腔文字後,濃縮成一句話就是:

我們會把這件事情交給「國教院」處理

看到這裡你第一個OS就是:啥是國教院啊

什麼是國教院

國教院的全名是國家教育研究院,根據維基百科,他是教育部底下的一個龐大的機關,這是個大概有190個人,一年會燒掉5.5億元的單位,院長由教育部長任命。這單位的前身是「國立編譯館」和「國立教育資料館」,根據他們的官方網站,他們講說他們的工作是「研究教育政策」、「評估課程」還有「培育領導人才」。

那國教院會怎麼做這件事情呢?很簡單,你只要掌握我們政府處理事情的邏輯,就可以知道他們會怎麼做了。首先要先成立一個委員會,然後大家再來開一堆會來處理這件事情。所以國教院設置了「十二年國民基本教育課程研究發展會」,簡稱課發會。同時教育部也設立了另一個課綱審查單位,叫做「十二年國民基本教育課程審議會」,簡稱課審會。也就是課發會負責訂定課綱,課審會負責審查並通過課綱。

再來課發會一定要有一個行政的運作要點,這個運作要點會訂定這個委員會的成立目的、成員組成、人數限制等。根據這份要點可以知道,這個委員會大概有27~39人,國教院院長會擔任總召。這些30名左右的委員就決定了全台灣國小、國中、高中的學生要學什麼東西。而這30名委員裡面大概有10~15名是大學院校的代表,6~9名是中小學代表,3~5個政府代表。至於要怎麼選這些委員呢?院長選XD。

要靠30個人開幾次會就訂定出十二年國教課綱的大方向,實在是有點困難,因此他們想出了一個解決辦法,就是找更多人來

這份要點中的第四點裡面提到,課發會可以依照需求自己另開小組,執行各自的任務。於是課發會就成立了一個「總綱研修小組」,負責研究這十二年國教的骨幹要怎麼訂定。這份總綱研究小組又分為2部份,一個是39~49人的代表委員,各個組(國小、國中、高中等)底下又會有10~13人的分組委員,大家一起討論總綱要怎麼定。

一個小組不夠,你有成立第二個嗎?

為了要討論這些接下來我們要怎麼分組,所以我們要先成立一個分組用的小組,所以他們訂定了「十二年國民基本教育課程研究發展會分組會議運作原則」,

有了分組用的小組,接下來他們又訂定了每個小組的組成辦法,也就是十二年國民基本教育課程研究發展會領域課程綱要研修小組委員組成及遴聘程序,每個小組人數在21~69人之間,負責訂定各科目的綱要,這些科目包含了國文、數學、社會、藝術、健康體育、國防等科目。

課綱修改的前世今生

這裡要講一段關於課綱的歷史,很久以前,全台灣每間學校的中小學教科書都只有一個版本,叫做國立編譯館。這是個1932年就成立了的古老組織。後來,1990李登輝當選總統後,解嚴後的社會開始推行一綱多本的教育政策,也就是教育部訂定課綱,作為教科書編寫的依據。1995年終於發布了高中課綱,在1999年實施(民國88年),因此稱為88課綱。

2001年,陳水扁總統推動了「九年一貫」教改,九年一貫的意思就是將國小和國中的教科書做銜接,讓學生在升上國中的時候學習比較不會有困難。此時教育部便重新修訂課綱。由清大歷史系教授張元擔任歷史科課綱委員,這份課綱首次將台灣史獨立出來,將中國的明清兩朝併入世界史。這份課綱的特色在於,學生應該由本土歷史開始學習,再去學習中國和世界史。

但這份修改對當時來說產生了很大的衝擊,當時還不是總統候選人的國民黨立委洪秀柱,以及親民黨立委李慶華、李慶安批評這份課綱充滿了台獨思想,導致張元最後辭職。最後在2004年,這份課綱被杜正勝重新推動,因為修改未完備,所以被稱為95暫綱。杜正勝同時指示底下的周梁楷教授編定歷史科的98課綱。原本預計於2009年開始施行,但因為2008年馬英九執政後,擱置了國文和歷史科課綱,啟用專案小組進行課綱調整,最後2012年完成修改並公佈,並於2013年(民國101年)實施,稱為101課綱。

本次事件的爭議點

而最近的爭議就在於,教育部在101課綱實施不到一年後,發了一篇「普通高級中學國文與社會領域課程綱要微調之說明」,大意是說我們組成了一個「檢核小組」(還記得前面講的,他們訂定了一個可以自行產生小組的辦法嗎),目標是要修正一些錯字、錯誤用詞、還有補正一些內容,進行「微調」(也就是微調是教育部自己講的XD),預定於今年(2015年)實施,也就是現在的104課綱。

這個小組2013年成立的,問題在於,這個小組的組成成員並不透明,教育部以政府資訊保密為由,不打算公佈小組的名單(因此被稱為黑箱課綱)。他的會議記錄並沒有公開,立委鄭麗君取得了一部分他們的會議記錄,可以看到這份會議記錄有很多問題,小組成員全部匿名,另外該課綱微調案是在臨時動議上提出的,也就是並不是正式召開討論的會議,這份會議記錄就這樣通過了,也就是他們取得「微調課綱的權力」。

等到這個小組取得微調的權力,過了幾個月之後,2014/1/17他們公佈了新課綱,以大中國史觀為導向。然而教育部的課審會在2周之內就完成了課綱微調公聽會、審議大會(是的,這時候就超有效率的),而且逕行公告全面實施。

台灣人權促進會向高等行政法院控告教育部違反政府資訊公開法,目前已經判決教育部敗訴。更進一步的討論可以看這篇法律白話文部落格淺顯易懂的「課綱微調案判決分析」,裡面探討了「什麼樣的資訊政府要公開,什麼樣的可以不公開」。

至於檢核小組的的名單,也早已經被挖出來了。但我這篇不想討論這些東西,看完這篇文章,你應該已經搞懂那些看不見的黑手,是如何玩弄課綱的了。

結語

僅以這篇文章,紀念那位為了反黑箱課綱而自殺的高中生林冠華。最後,以1984的一句名言做結,

誰控制過去就控制未來,誰控制現在就控制過去 ---George Orwell

更多關鍵字

這篇文章的目標為程序問題的入門磚,接下來看其他新聞應該會好懂很多。但課綱還有其他如史觀的爭議點,歡迎網友提供更多關鍵字

  • 湯志明,教育局局長,同時也是課審會高中職分組會議主席,更多關於課審會的黑箱程序可以查找該關鍵字
 
over 2 years ago

準備開一個新支線「財務報表研究筆記」。覺得這個年代如果不會投資理財感覺未來會活得很慘。我心目中的投資應該是一門認清價值、認清環境現狀、注意危險的小細節、培養紀律的學問。雖然現在手頭空空,但人生從來沒有準備好的時候,所以就慢慢來,把過程中學習到的筆記和問題記錄下來。

現金流量表

會計有三大報表,資產負債表告訴你目前有多少資產和負債,損益表告訴你賺多少賠多少,而現金流量表則告訴你你手頭的現金進出狀況。這張表對於投資人來說是屬於防禦性質的篩選器,他不是用來判斷企業的成長性,而是用來判斷一間企業安不安全,也就是手頭的現金是否充足穩定,還是常常需要週轉,好公司定然能夠管理好自己的現金,但現金流量看起來正常的不見得是好公司。因此這張表的功能主要在於以下幾點

  • 能不能賺更多現金(未來產生現金流入的能力)
  • 能不能還錢(企業償債和支付股利的能力)
  • 需不需要借錢(企業是否需要籌資)
  • 現金水位變化的原因(營運?投資?籌資?)

什麼是現金流量表的現金?

現金和約當現金(Cash and Cash Equivalent),也就是現金,和隨時可以變成現金的東西。聽起來很有道理但又好像什麼都沒說一樣,但重點在於這些東西是「隨時可以轉換成現金,而且價值變動的風險極小」,除了你手頭的錢之外,還包括你隨時可以解約的定存、活存(不能有違約金),三個月內到期的國庫券、公債、商業本票、公司債、銀行確定會付你錢的匯票等。超過三個月就會有太多利息的成份在,所以就不當作約當現金來考慮。

三大影響現金的活動

企業有三大影響現金的活動,也就是營業投資籌資

營業活動

  • 現金流入
    • 賣商品或賣服務得到的錢
    • 收到的利息或股利(這部份也可以視為投資活動,但要一致處理)
    • 因交易目的而持有的金融商品(期貨,遠期,交換,選擇權)的現金流入
    • 意外之財(如保險賠償、訴訟賠償)
  • 現金流出
    • 付錢買原料
    • 支付各項營業成本和費用
    • 支付稅捐罰款和規費
    • 支付利息(這部份也可以視為投資活動,但要一致處理)
    • 因交易目的而持有的金融商品(期貨,遠期,交換,選擇權)的現金流出
    • 意外之災(交付訴訟賠償、退還顧客貨款)
    • 捐贈

投資活動

取得或處分公司的長期資產,或是不屬於約當現金的項目,視為投資活動。但必須是投資目的而不是交易目的。

  • 現金流入
    • 因金融商品導致的現金流入
    • 收回貸款
    • 處分債權
    • 處分不動產、廠房、設備
  • 現金流出
    • 因金融商品導致的現金流出
    • 承做貸款(借錢給別人是一種投資)
    • 取得債權憑證、權益證券
    • 取得不動產、廠房、設備

籌資活動

  • 現金流入
    • 現金增資(發新股)
    • 舉借債務
  • 現金流出
    • 支付股利、購買庫藏股、退資
    • 償還借款

現金流量表的限制

學習一個東西我們不能只知道他能做什麼,更要知道他不能夠用來做什麼,不然遲早有一天會發生悲劇。現金流量表是一種「流量」,也就是這一期間內,會計現金的進出量,因此他無法衡量「獲利狀況」

  • 營業現金收入只是「這一期」收到的錢
    • 你可能現在才收到前一期的貨款
    • 你可能預先收到下一期的貨款
    • 因此這段時間收到的現金流對於今年的獲利狀況並沒有意義
  • 營業現金支出只是「這一期」支出的錢
    • 這一期只有已經出售且送達顧客的產品才會被列為費用,許多產品依然會被列為存貨
    • 某些產品的購置成本可能尚未付款(信用交易),這些會先被列為負債,而不會被列為現金支出
  • 所得稅、長短期負債的利息費用、營業費用都不一定和這一期對的上

現金流量不是發生的太早(提早付款),就是太晚(晚點付款),所以並不適合評估企業某段時期的獲利

再來是現金流量表無法透漏財務狀態,你不知道企業有哪些資產、有多少現金、有多少應收帳款、有多少存貨、有哪些負債等。但企業經理人有責任讓公司在債務到期時能夠準時償債,這看現金流量表並不太準。

間接法

現金流量表的製作方法分為直接法和間接法,一般會計都是使用間接法,因為法律慣例通常會這麼要求,所謂間接法的意思是用企業的本期淨利來逆推回去當期到底流入流出多少現金。但是淨利和現金其實是有相當大的差距的,因此要做修正。

本期淨利其實有很多雜七雜八的東西在裡面,因為會計是採用「權責發生原則」,也就是交易發生那一瞬間,就列入收入和費用了,但是現金不一定會立刻入帳。因此要進行調整。

以營業現金流來看,

  • 營業收入
    • 本期多認列的應收帳款還沒收到現金
  • 營業成本
    • 只有商品在該期賣出的時候,才會列入營業成本
    • 本期可能會把存貨賣出去,存貨的成本會被認列,但實際上並沒有現金支出
    • 本期多認列的應付帳款還沒付現金
  • 營業費用
  • 折舊費用
    • 但實際上不動用現金,所以加回去
  • 攤銷費用
    • 但實際上不動用現金,所以加回去
  • 利息費用
  • 所得稅費用

調整的方法

加回不動用現金的費用:折舊、無形資產攤銷、權益法認列的投資損失
扣除不產生現金的收益:溢價攤銷、權益法認列的投資收益
//註解:權益法,國內一些公司會將海外投資設在免稅天堂,這些賺的錢不會匯回母公司,損失也和母公司的現金無關
非營業交易的利益損失:加回固定資產的損失,扣除固定資產的利益
//註解:假設公司買了土地1000萬,現在要以900萬賣掉,帳面上損失了100萬,但是實際上呢?並沒有支出現金100萬,所以要加回去。同時在投資活動的現金流量內會增加900萬的現金。
應收帳款、存貨、預付現金減少,則增加現金
應付帳款、預收貨款增加,則增加現金
應收帳款、存貨、預付現金增加,則減少現金
應付帳款、預收貨款減少,則減少現金

這其中最引人疑竇的就是存貨了,為什麼存貨減少要視為現金增加呢?小弟資質駑鈍這部份我想了一個多小時才搞清楚XD
錯誤的邏輯:存貨減少的同時,商品已經賣出去了,不就已經帶來現金了嗎?為什麼還要再加回去?
正確的邏輯:存貨的減少的同時,商品已經賣出去了,帶來現金的同時,也認列了一筆營業成本,但是這筆現金花費實際上早就在前幾期花費過了,轉成存貨的形式留在倉庫內,因此該期雖然認列營業成本,但並未花費現金,所以要補回去。

防禦法則

如果一間公司的營業現金流突然大減,而且變成負的,那是一種危險的徵兆,雖然可能代表他接到一筆大訂單,充滿了應收帳款,導致現金補不起來,股價可能還是在高檔,因為大家可能認為他接了一筆大訂單,而且營收已經認列。但現金補不起來是個危險的徵兆,請小心。

 
over 2 years ago

最近台北市政府充滿了各式各樣的BOT,新聞鬧得沸沸洋洋,剛好接到一份研究新聞專題的作業,了解整個BOT的運作程序和實際狀況和案例花了我好些時間,於是決定把我蒐集到的資料整理成容易吸收理解的資訊,並且附上資訊來源,讓大家可以用更簡單、容易理解的方式了解我們的政府是怎麼運作的。同時我想探討一些關於制度面上的問題。

發生什麼事?

首先先來看這則新聞, 假文創真圖利? 松菸大樓權利金僅繳56萬,簡單的說就是,松菸誠品(其實正名叫做台北文創大樓)是一件BOT案,而2013年他只繳交了56萬的權利金給台北市政府。那我們就來深入理解到底發生什麼事。


▲ 這棟大樓2013年只繳交了56萬的營運權利金給台北市政府,圖片引用自台北市文化局

理想上的BOT

也就是Build-Operate-Transfer, 興建,營運,移轉,也就是政府想蓋一棟公共建設但不想花錢,決定請別人來蓋,並且給別人營運特許期,期滿結束後整棟公共建設再還給政府。

在台灣,BOT的法源來自於政府民國83年制定的「獎勵民間參與交通建設條例」(獎參條例),民國89年政府又公佈「促進民間參與公共建設法」(促參法),兩者的差別在於前者適用的對象主要為交通建設,促參法則適用於所有公共建設。

BOT的執行程序分為五階段,前置作業、公告、備標、甄審、議約與簽約。你可以想像成你想蓋一棟大樓請別人來標時,要做哪些事情,第一個當然是研擬目標,思考你蓋這棟大樓的目的是什麼,有哪些前提是一定要廠商做到的,參加標案的公司有什麼條件。再來是公告,把你的需求跟別人講。接下來就是請廠商準備標案,讓廠商來申請,因此稱為備標。再來就是選擇得標廠商的過程,稱為甄審。最後是和得標者議約和簽約。

一般的BOT會經過這五階段,那我們就直接來看實際上會怎麼運作。

實際上的BOT

感謝台北市政府,他們在5/4的時候把松菸文創BOT的契約和相關公文公佈出來,所以我們有個非常實際的案例可以考究。接下來我會以松菸誠品BOT為案例,直接跟大家探討BOT的制度問題

松菸BOT申請須知

計畫目標(申請須知PDF p.10)

提供文化創意產業進駐,創造多元平臺讓創作者、平臺經營者和消費者間緊密互動以利文化創意產業創作/研發、發行/生產、行銷三個階段管道的暢通;並期健全文化創意產業上、中、下游之經營體質,營造優質發展環境,促進文化創意產業永續發展。

所以當出公告時,市政府的目標是要提供文化創業產業進駐,並創造優質發展環境

業務經營範圍(申請須知PDF p.16)

主體事業: 文化創意產業區及周邊資源區之空間量體應至少佔總容積樓地板面積 65%。
附屬事業: 附屬事業區之空間量體至多不超過總容積樓地板面積 35%

那什麼是主體事業呢?我們可以在申請書的PDF p.6找到,也就是

主體事業

指依據經濟部中央文化創意產業定義與範疇之文化創意產業區(文化創意產業、數位內容產業),及周邊資源區(工商服務顧問公司):
A. 文化創意產業:視覺藝術產業、音樂與表演藝術產業、文化展演設施產業、工藝產業、電影產業、廣播電視產業、出版產業、廣告產業、設計產業、設計品牌時尚產業、建築設計產業、創意生活產業、數位休閒娛樂產業。
B. 數位內容產業:數位遊戲產業、電腦動畫產業、數位學習產業、數位影音應用產業、行動應用服務產業、網路服務產業、內容軟體產業、數位出版與數位典藏。
C. 工商服務顧問公司:如行銷顧問業、法律事務所、智財業等。

附屬事業

指於本基地上開發經營主體事業以外之事業,如餐飲美食業、銀行業等。

財務計畫(申請須知 p.18)

當初BOT的公告文件上,也寫了權利金包含了兩部份,開發權利金營運權利金,開發權利金就是得標者必須在特許營運期間內(就松菸來說,是50年),分期付款給政府的權利金,你可以直接想像成這就是營運期間繳給政府的租金,本文件指出不得少於12億元

另外,營運權利金指的是營運期間每年賺到的錢要分多少給政府,也就是每年繳給政府的保護費。申請條件為依照每年營業總收入0.5%繳交營運權利金。最後得標的公司叫做台北文創,講台北文創沒有多少人知道,但是講背後的股東你們就一定聽過,叫做富邦建設(50.1%股權)和台灣大哥大(49.9%股權)。所以這棟大樓其實叫做台北文創大樓。台北文創以13億的開發權利金得標,營運權利金為每年營業總收入的0.5%。但是你可能不知道,當年有另一家公司「漢洋建設」也申請了標案,並且開出了16.5億的營運權利金,但是他卻沒有得標,為什麼呢?

答案是BOT得標並不是看價格,而是看最有利

BOT 的最有利標

以前政府的標案通常是採取價格標,也就是開出一份規格,誰做得到而且出價最低,誰就得標。因此很多廠商會去打聽出價最低的競爭對手是誰,然後用比對方低一些些的價格投標。但BOT是完全不同的玩法,BOT採取的是最有利標,由甄審委員會決定誰得標,一般來說甄選委員的人數約為7~17位,產生的方式是依照行政院公共工程委員會的「民間參與公共建設甄審委員會組織及評審辦法」,請翻到第四條。

甄審會置委員七人至十七人,由主辦機關首長就具有與申請案件相關專業知識或經驗之人員派兼或聘兼之,其中外聘專家、學者人數不得少於二分之一。
前項人員為無給職。但非由本機關人員兼任者,得依規定支給兼職酬勞。
第一項外聘專家、學者,應自主管機關建立之建議名單中遴選後,簽報主辦機關首長或其授權人員核定。未能自該名單覓得適當人選者,得敘明理由,另行遴選後簽報主辦機關首長或其授權人員核定。
前項建議名單,由主管機關公開於資訊網路。
第三項擬外聘之專家、學者,應經其同意後,由主辦機關首長聘兼之。

這些甄選委員的產生是不受民代監督的,根據法規,挑選的時候應該從行政院的專家學者資料庫中挑選,並且再呈報機關首長核定。但是法條最後面又寫,未能自該名單覓得適當人選者,得敘明理由,另行遴選後簽報主辦機關首長或其授權人員核定,實際上運作會發生什麼事情呢?當然是挑選出「首長核可的人選」。我們可以投機關首長所好選出體察上意的委員。

論匿名的審查制度

再來是探討甄審委員選出「最有利標案」的方式,我們直接以松菸的BOT申請公告為例。

詳情可以松菸BOT參考申請書的p.38頁甄審計畫,裡頭寫了甄審的作業程序。簡單的說就是以評分高低決定是否得標,滿分一百分,如果你想打超過90分或低於70分,要給意見敘明理由,並替所有合格申請者排序。最後以無記名的方式把分數和排序名次投到黑箱子,然後合計名次總和最低者取得最優申請人資格。

5/19(二),我在課堂的報告上闡明這件事情,並且指出匿名的制度充滿了可操作性,評審委員的評分不透明將導致沒有人能替決定負責。當時課堂上的戴天時老師向我說明,這樣制度的設計是為了避免評選委員給出了不利的評分與評鑑後,遭受大公司的追殺與壓迫,並以教評會的例子舉例說明,表達教評會在對老師做教師評鑑時,同樣會以無記名投票的方式進行處理,決定教師是否升等或懲處。

聽起來很有道理,用匿名的方式來規避行政責任,當時戴老師語重心長的向我及課堂同學說,沒辦法,這就是人性。如果你直接指出對方缺失,並且打出低分的考核,對方未來會對你懷恨在心,只有透過這種方式來把責任拋給無記名的制度,才能避免這樣的事情發生。

當下我沒有反駁什麼,但這個議題仍在我心中持續思索,久久迴盪不去。我是個工程師。我們所受的教育就是要根據自己的知識,還有實際的狀況做出最適當的決策,並且對自己做出的決定負責。當然決定可能是對的,也可能是錯的,這些都可以事後檢討與受到大眾公評。但如果只是因為怕被打壓、怕被別人懷恨在心、怕受到各種壓力追殺,而不敢對自己的評論與審核負直接的責任,那至始至終,我們只是在逃避問題而已,把責任這件事情交給匿名的保護傘,最後造成各種弊端,只能由整個組織來承受苦果。我認為這絕對不是一個負責任的組織該有的作法。假設有一間公司因為CEO不敢決定是否投資1000萬研發某項技術,因為可能成功也可能失敗,於是找了一群主管匿名投票決定,最後投資失敗了,帳面上出現一筆巨大的損失,CEO可以跟董事會說「對不起,當初我們是用匿名的方式表決的,我找不出人為這次的失敗負責」嗎,董事會絕對會直接fire掉這個CEO

在程式設計師的世界裡,有一句話是這麼說的。

Given enough eyeballs, all bugs are shallow
讓夠多人看到原始碼,錯誤將無所遁形

越透明越公開,錯誤與問題就會越少。

這裡有一篇曾任桃園污水處理BOT案甄審委員的心得,同樣探討黑箱作業如何造成BOT的問題,相當值得一讀。總而言之,我認為責任不應該透過制度去匿名化,你可以做出事後來看不適當的決策,但是你可以說明你當初這樣做的理由,在當時的時空背景下有什麼因素,最後交由大眾公評,讓我們知道下次該怎麼改進。每個人都會犯錯,我們不可能討每個人喜歡,總要有人當烏鴉,一個開明的組織文化應該是保護那隻烏鴉,避免那隻烏鴉受到其他人的攻擊與排擠,而不是大家都不理那隻烏鴉,害他最後被排擠受到傷害,然後我們再躲到角落告訴自己的下一代,以後不要學他那麼傻。

這樣的制度最後發生什麼事

後來的故事就像台灣八點檔的爛尾連續劇一樣,瑣碎的新聞不停的跳出來,但是大多數的民眾默默的拿來配飯,因為也不能改變什麼。松菸大樓裡頭最後蓋了「文創辦公室」、「文創商場」、「表演廳」、「電影院」、租一天要76萬元的「台北文創會所」(官方已經於2015/2/5修改成租一整天約53萬),以及一晚要價萬元,被網友批評只會擺一堆書的文創旅館

文創辦公室一坪租金2200元(周遭辦公室一坪1200~1700),被批評太貴,一般文創業者租不起,文創商場的租金每個月1050元,被批評太便宜,但是租的人是誠品。因為辦公室太貴沒人租,最後只好請台灣大哥大開一間100坪,全台灣最大的數位生活體驗門市幫忙使用辦公室支付租金,順帶一題,台灣大哥大進駐後也算是文創相關產業,因為他屬於「數位內容產業」,一切都合法。

誠品後來以二房東的身份承接了電影院、表演廳、開了書店、商場和旅館。台北市政府廉政委員徐嶔煌表示:根據國稅局的資料,誠品商場2014年開了11億3000萬的發票,電影院開了4000萬元,音樂廳開了1400萬元,合計約12億元。但是這些發票是以誠品的名義開的,不是BOT的簽約者台北文創。台北文創只有收到誠品繳納的租金,才會發生2013年只繳交56萬,2014年預估不到200萬的營運權利金給台北市政府的神奇事情。當然誠品生活總經理兼副董吳旻潔也開記者會表達,我們2014年雖然營業額12億,但其實還是賠139萬,還有一坪一萬元的租金是成本考量我們還是有一坪500~600的專櫃,但是松菸內店家說,根本沒聽過500~600元的專櫃在哪裡,議員表示,是多個設計師合租才有這樣的價錢,而且整棟商場才1,2處。

最後,台北文創大樓變成誠品生活松菸店,進駐的文創廠商指控一坪一萬元,還外加20%左右的營業抽成,回過頭來看當初BOT的目標,「提供文化創意產業進駐,創造多元平臺讓創作者、平臺經營者和消費者間緊密互動以利文化創意產業創作/研發、發行/生產、行銷三個階段管道的暢通;並期健全文化創意產業上、中、下游之經營體質,營造優質發展環境,促進文化創意產業永續發展。」,實在是非常諷刺。

結語

老實說,整理這些新聞,咀嚼這些資料花費我很多時間,我幾乎把松菸BOT的申請書完整看過一遍,搭配一些現行的新聞去理解到底發生什麼問題。平常這些新聞因為太過瑣碎,對一般老百姓沒什麼意義,往往看一看就過去了,根本不知道背後到底發生什麼事情。我希望可以透過這篇文章讓大家了解松菸BOT,並且引發思辨,讓大家思考制度可能會造成的問題,這才是一個公民社會該有的討論。再來另一個原因是希望大家在檢討這個制度的同時,千萬不要忘記「初衷」是什麼,就算收到誠品的千分之五營業額,每年600萬又怎樣?600萬對政府來說根本不是多大的收入,重點是當時開辦BOT的目的是為了「培植弱勢文創產業發展」,如果只是為了收到600萬,讓這棟大樓被誠品買走,直接合法,那麼就是捨本逐末,忘記當時開辦BOT的初衷。

 
over 2 years ago

上週日我去台中玩,經過充滿文青氣息的誠品綠園道。許多文青、情侶不畏陽光在勤美術館的裝置藝術前自拍,等著上傳Facebook,傳達出一種讓親朋好友「知道我有來過這裡」的文青概念。另一邊的草皮則是街頭藝人的舞台,有的幫遊客做肖像速寫、有的表演魔術,另有一群表演藝術者則打著赤膊,露出黝黑精實的體魄,搭著立體形狀的鋼架,伴著音樂起舞,結束後向在場的觀眾敬個禮,等待現場小朋友拎著父母給的銅板,投進打賞箱內。

天氣很熱,我和朋友經過路旁的Cold Stone,店員正在門口推廣活動,只要轉動上面寫滿優惠的轉盤,就可以獲得免費送脆餅之類的優惠券。我愉快的轉動轉盤,拿到了買大送小的優惠券,店員笑咪咪的告訴我這是最大獎,把優惠券蓋章遞給我。當天心情不錯,反正是出來玩,就決定和朋友去吃Cold Stone。

人有點多,需要排隊。過一會兒我們拿到菜單,可以在排隊時先看看要點什麼冰淇淋。我們選了草莓香蕉和薄荷巧克力。約莫過了10分鐘,終於輪到我們點餐,此時店員告知店內的拌冰機壞掉了,因此會直接把配料撒在冰淇淋上。我們沒有想太多,就一樣付了220元,開始期待等下拿到的冰淇淋。

店內的冷氣並不涼,製作冰淇淋的員工看起來有點手忙腳亂,挖冰淇淋的員工看著單子,量好每一球的重量,放到紙杯裡,因為拌冰機壞掉了,他們沒辦法攪拌,所以便直接交給下一個員工灑上配料,撒配料的員工很緊張的感覺,因為客人很多,都在盯著看,他努力的從醬料罐中擠出醬料,一邊抖一邊畫出規定的交錯圖案,接著夾出一塊布朗尼或OREO、醃漬過的配料等,放到冰淇淋上,小心翼翼捧起剛做好的冰淇淋交給前面的顧客,又趕緊轉過身來做下一杯冰淇淋,再度重複剛剛的步驟。

老實說,我從點完餐後就預期這次的Cold Stone用餐經驗並不會太愉快。又過了10分鐘,我才從店員緊張的手中接過我的「草莓香蕉圓舞曲」和「蜜蜜巧巧」,草莓香蕉就是一坨草莓冰淇淋上撒了花生粉顏色的不知道什麼粉,還有兩顆醃漬過的小草莓,另外有一小截切片後的香蕉,擺在冰淇淋上。蜜蜜巧巧是Mint Mint Chocolate Chocolate的意思,也就是薄荷冰淇淋,同樣因為沒辦法伴冰的關係,上面擺了一塊完整的布朗尼。

店內幾乎坐滿了人,排隊的人潮依然延伸出店外。我和朋友勉強找到位置坐下,同張桌子對面做了一個帶著小孩的家庭、左邊坐著一對情侶。我小心翼翼的拿起塑膠湯匙,輕輕的挖了一口草莓冰淇淋送到嘴裡,我突然覺得,這一切都諷刺地真實。

相信我,你不會想要花220元去吃一碗沒有拌過的冰淇淋。醃漬過的草莓並不甜,小小一顆,反而還帶有些許酸味,沒有草莓的味道,只是一顆豔紅色軟爛的果實而已。另一球薄荷冰淇淋上的布朗尼也是一絕,你絕對沒有吃過如此死甜的布朗尼,這東西本來應該要拌開在冰淇淋內,成為點綴冰淇淋的裝飾,但沒拌開直接一大塊放在上面吃就個悲劇。你只能一口冰淇淋、一口料、一口冰淇淋、一口料,冷氣不涼、外面的客人仍絡繹不絕排隊、對面的小孩偶爾發出尖叫聲。我想用委婉一點的說法,整個用餐的體驗並不愉快。

我知道這一切都是自找的,我拿了買大送小的優惠券,自願走到這家店裡,自願在知道拌冰機壞掉的情況下買了冰淇淋,然後在這個充滿人潮的時段坐在店內,因為也沒其他地方可去。但我一邊用餐,一邊看著店內牆上歡樂的卡通壁畫,一群人來到Cold Stone,開心的吃著冰淇淋、員工還發出歡樂的歌聲,我突然覺得我好像成為了萬惡資本主義下的一份子,一個討人厭的商業模式鎖鏈上的其中一環,因為我花了錢,這樣的商業模式才能持續的運作下去,這裡的員工領的仍然是最低的基本工資,他們盡力在機器壞掉的情況下做出一杯杯的冰淇淋,還要強顏歡笑著,店外的員工仍在招攬客人,然後他們排隊,接過一杯杯沒有拌過的冰淇淋。我不願意苛責任何員工,他們都很努力盡了自己的本分。我想苛責的是背後讓這一切發生的那群人,他們在機器壞掉後仍不願停業,提供有缺陷的產品給客人,並且繼續在門口招攬生意,自栩為顧客帶來歡樂的冰淇淋店,最後卻完全失去了原本的初衷。

我默默把最後一口冰吃完,排隊的人潮依舊,店員們依舊手忙腳亂,但此時他們竟然開始唱歌了。

我再也不會去吃Cold Stone,這一切實在是太諷刺了。

 
over 2 years ago

上週日,我完成了人生第一場馬拉松。

在這之前,路跑相關的運動我只參加過校園路跑吧,連半馬的經驗都沒有。老實說,我也不是很清楚為什麼會想要跑馬拉松,但我卻把「完成一場馬拉松」當成人生必須體驗的待辦事項之內。大概是因為想要體驗看看那種「長期而持續累積」的感覺吧,總覺得要是完成一趟這種比氣長的運動,對人生的見解或許會有些不同。沒想到完成了之後並沒有預期的那種大徹大悟,反而是那些平時的累積會在比賽當天醞釀成熟,佛祖在菩提樹下坐了七天七夜之後醒然悟道,不是因為第七天的關係,而是因為前七天持續的思索、反省才悟道的啊!

馬拉松迷人的地方在於,他跟其他的運動不太一樣。他遠遠不是籃球、排球這類的團體運動,也不是桌球羽球這類的雙人對打。如果硬要說,我會說他和重量訓練比較類似,都是一個人,練的是長期而持續的累積。

很多人都說馬拉松是一項意志力的運動,能跑完全馬的人必然有很強大的意志力,可以克服身體的疲倦和傷痛一路向前。這句話只對了一半。如果你真的去試著跑一趟馬拉松,你就會知道意志力不是那麼可靠的東西。如果你平時都沒有特別練習,頂多體育課跑4000公尺,那麼你大概在跑到10km時就會開始覺得腿很重,15km會開始覺得某支腳開始疼痛,你可以開始切身體會「舉步維艱」實際發生在自己身上會是什麼一回事。你的膝蓋會痛、你的腳踝韌帶可能拉傷、你的小腿堆積滿乳酸,這些東西會持續的累積,很快就會超過你的意志力能承受的地步,最後你只能放棄,回去休息,然後準備迎接接下來三四天走路一拐一拐的問題。

馬拉松比的是「平時的訓練」,絕對不是比「意志力」。如果你平時有按部就班的花時間訓練,慢慢從5km, 10km, 一路進步到15km,之後每週至少跑三次15km,慢慢增長成20, 25, 30。這是所謂的LSD(Long Slow Distance),你不需要快,用比平常還慢的速度慢慢跑,慢慢練,重點在於檢視自己的姿勢正不正確、省不省力。這段過程很無聊,很無趣,你只是不斷的前進、前進、一步一步地前進,但你的身體會在這段過程中發生變化,你的身體會開始不斷的增生微血管,加速你細胞的代謝,你的細胞會更有效率地運用氧氣,肌肉生成的乳酸會更少,此外你的脂肪會開始燃燒、你的肌肉會漸漸習慣長時間的運動,變得更結實、更不容易受傷,身體在一次次的訓練中會不斷升級,你會經歷討厭的肝醣枯竭、乳酸堆積,但是這些狀況會隨著訓練過程逐步改善,最後你可以突破所謂的撞牆期。

我切切深深的體驗的所謂的「撞牆期」是怎麼一回事,但很遺憾,不是在平日訓練,而是在上個禮拜的馬拉松路跑上。我是在三個月前報名全馬的,我原本平時的運動習慣是重量訓練,但因為擔心會因為過度消耗能量喪失平時重訓的成果,我並沒有很勤勞的練習馬拉松,頂多一個禮拜跑一次,最遠的一次是在前兩週跑了60圈外圈操場。這樣的訓練量只能勉強支撐完到完賽。比賽當天,人非常多,前面5公里都是人牆,基本上你沒辦法跨大步,你只能用比平時訓練還慢的速度前進。但你會發現情況不太對勁,你的身體對1km的感覺和平時訓練時不太一樣。路跑時的1公里比平時的1公里還久一些些。持續到20公里之後,你會發現你的身體的訓練感覺是平常的26,7公里,你的速度開始慢下來,每一公里花的比上個一公里的時間還久。距離下個補給站的「體感距離」越來越長,你會開始狼吞虎嚥進食香蕉和水,因為你知道接下來會比剛才更久才會遇到下一個補給。太陽越來越大,還好你剛才有把飲用水淋到身上避免中暑。你開始感到迷惑與懷疑,對面對向跑回來的專業選手人數越來越多,你知道你持續的靠近目標,但是根本不知道還要多久才會到折返點(折返點不是21公里處,而是在更遠的地方)。你的腿開始不太對勁,上個禮拜的舊傷似乎還沒完全康復,又再度隱隱作痛了起來,你努力說服自己「不要停」。因為你知道一停,就會減弱腦內啡的分泌,疲倦與疼痛會迅速湧上來降低你的速度。這點已經在補給站吃東西後重新上路時驗證過了。停下來吃東西再度前進是個痛苦的過程,你不想再經歷一次。你只能持續苦撐著,但你知道你絕對沒辦法以這樣的狀態撐終點,問體變成你會在幾公里處放棄,這不是你的意志力能控制的,靠意志力硬跑只會讓你的腳抽筋罷工。

最後,在30公里處,你決定停下來,改用快走前進。這就是所謂的撞牆期,通常發生在30公里之後。馬拉松是30公里之後才開始的比賽,這個決定舒緩了你的雙腿,但也註定了你要花比剛才更長的時間才會見到下一公里的告示牌,接下來的12公里可以說是人生最漫長的12公里。前面的路沒有盡頭,只是筆直的延伸進地平線。你知道你要回到剛才的起點,你知道很長,很長,這些路你剛才都跑過。偶爾你想要再度恢復跑步,但是很快你就知道這是愚蠢的想法,跑不到200公尺你的腿就開始哀號。強迫你停下來,不然就準備抽筋給你看。這最後12公里讓人難受的不只是看不見盡頭的漫漫長路,更讓人難受的是那些你在前15公里處超過的阿伯、叔叔、其他跑者,開始慢慢的追過你。你完全無能為力,就算你非常不爽,想要奮力一搏擠出力氣把他們超車回來,但是不一會兒,他們又踏著穩健的步伐一步一步慢慢的追上來、超越你。這時你才知道什麼叫做路遙知馬力,如果你的腿跑不起來,人心一點屁用都沒有啊。

這次總共花了5小時23分鐘完賽,大敗筆是撞牆期的關係。我想說,相較於詭譎多變、努力不一定會成功的現實世界,馬拉松提供了一種很直觀的方式,把他想表達的哲學意含在42公里內濃縮完成,我不想說太多關於人生的譬喻,那太作做了,就像在全麥饅頭硬是抹上巧克力醬一樣,重點只在於平時的訓練,也就是長期而持續的累積

 
over 2 years ago

這篇文章將會簡單的說明Linker Script在嵌入式開發上,會寫些什麼內容,如何被使用。但我並不打算詳細的說明那些語法,因為那並不是我該做的事情。我會簡要的各個段落語法的用途與意義,讓你大致掌握Linker Script在做什麼事情。

我們將以一個運行在STM32F429 Discovery上的號誌燈專案的Linker Script做為例子。

進入點

stm32_flash.ld
/* Entry Point */
ENTRY(Reset_Handler)  

定義程式執行的進入點,吃一個symbol作為參數。要指定進入點有好幾種方式,ENTRY只是常見的一種。

配置runtime記憶體大小

/* Highest address of the user mode stack */
_estack = 0x20030000;    /* end of 192K RAM */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0;      /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */

指定runtime stack的記憶體位置,我們會事先指定一段heap和stack size,程式設計師必須自行保證使用的stack不會超過這範圍,如果配置太多在Link時就會炸掉

配置實體記憶體

/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 2048K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 192K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

這裡的記憶體大小必須要按照板子實際上的狀況來配置,可以看到不同的記憶體有不同的起始位置和大小。常見的有FLASH和RAM。一般來說FLASH是燒程式的地方,RAM是跑程式的地方,至於CCMRAM是幹啥的呢?CCMRAM全名是(Core Coupled Memory),他是一種SRAM,特性是無法被DMA存取,這塊記憶體一定要由CPU自己主動存取,用途是是當一般記憶體被DMA時是CPU是動不了的,此時CPU可以使用CCRAM來提昇效能。

你可能會有疑問,為什麼配置的ORIGIN並不是從0開始。這是因為板子本身的FLASH就不是從0開始,這麼做的原因是為了保留0起頭的一段記憶體位置,因為剛boot時板子一定會從0開始讀,透過Memory Alias讓板子可以從不同的記憶體區塊boot,詳情請查閱板子的記憶體配置文件。

定義section

接下來的區塊將開始定義執行檔的sections,我們可以知道執行檔是由多個object file所組合而成的,每個object file中都有自己的section,存放不同的程式內容。接下來我們將透過Linker Script告訴Linker要怎麼把大家的section組合成執行檔中的section。

/* Define output sections */
SECTIONS
{
  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH

我們首先建立一個被稱為.isr_vector的section,關於這個section內容要放置的東西會寫在大括號內。其實.isr_vector就是一開始的中斷向量表。

.是指location counter,代表目前的記憶體位址,ALIGN是對齊的意思,代表請對齊到最接近的4的倍數,相同或更大的記憶體位址。

KEEP意指請找出並保留(不管存不存在)所有object files內被稱為.isr_vector的section,並把這些section統統放進來
最後請把該section存到我們一開始定義的FLASH區塊內。

  /* The program code and other data goes into FLASH */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH

接下來我們要建立.text section,這裡通常是存放實際執行的程式碼,我們會蒐集所有object file中的.text, .text*, .glue_7, .glue_7t, ...放進這個區段內,並另外建立並保留init和fini區段。

.rodata

  /* Constant data goes into FLASH */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

該section存放唯讀data, 一般來說是const變數和字串。

  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
  .ARM : {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } >FLASH

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = LOADADDR(.data);

.data

  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data : 
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */

    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } >RAM AT> FLASH

保存已經初始化的全域變數和static變數

CCRAM

  _siccmram = LOADADDR(.ccmram);

  /* CCM-RAM section 
  * 
  * IMPORTANT NOTE! 
  * If initialized variables will be placed in this section, 
  * the startup code needs to be modified to copy the init-values.  
  */
  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;       /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)
    
    . = ALIGN(4);
    _eccmram = .;       /* create a global symbol at ccmram end */
  } >CCMRAM AT> FLASH

  /* Uninitialized data section */
  . = ALIGN(4);

bss

  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

.bss section,通常是蒐集與存放未初始化的全域變數和static變數。

.user_heapstack

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack :
  {
    . = ALIGN(4);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(4);
  } >RAM

  /* MEMORY_bank1 section, code must be located here explicitly            */
  /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
  .memory_b1_text :
  {
    *(.mb1text)        /* .mb1text sections (code) */
    *(.mb1text*)       /* .mb1text* sections (code)  */
    *(.mb1rodata)      /* read-only data (constants) */
    *(.mb1rodata*)
  } >MEMORY_B1

用於檢查我們需要的的heap和stack size是否會超過板子上的RAM的大小。如果超過的話該section會建不出來,就會噴錯。

/Discard/

  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

/DISCARD/是個特別的section name,被放在這裡的input section不會被輸出成output section。

  .ARM.attributes 0 : { *(.ARM.attributes) }
}
 
almost 3 years ago

因為我本身對金融、匯率方面一點研究都沒有,只是有看過一點雜書而已,所以在此不負責任的用很簡單的方法說明與分析瑞士法郎暴升的原因和影響,本篇文章特別獻給我最敬愛的玉堂大大。

最近的新聞是瑞士法郎與歐元脫勾了,然後發生了一大堆的連鎖事件,包括

  • 瑞士法郎大漲
  • 一堆避險基金破產
  • 觀光客悲劇
  • 台幣升值

我們可以從幾個層面來分析原因是什麼,以及瑞士法郎脫勾到底會對全球經濟造成什麼影響。

背景

首先要先理解瑞士,瑞士是世界金融中心之一,經濟穩定繁榮,是全球資金重要的避風港。這樣講你可能還沒感覺,一般人對瑞士的印象就是一堆富豪把很多錢藏在瑞士的保密銀行裡。事實上,瑞士是全世界人均收入前幾名的國家,幾乎僅次於北歐。因為金融、政治環境的安定,許多人會把錢留在這裡避險。

歐債危機爆發之後,歐元區的資金大量流入瑞士法郎避險,瑞郎當然會升值,於是嚴重衝擊巧克力、瑞士鐘錶製造業的出口。因此瑞士央行在2011年9月下令固定匯率,把瑞士和歐元綁定在一起,也就是1歐元=1.2瑞郎,用來確保歐債危機期間瑞郎不再升值,穩定經濟。另外加上近期石油暴跌、盧布和依賴資源出口的新興市場貨幣劇烈貶值,也就是大家都搶著購買瑞士法郎避險。

固定匯率與央行

固定匯率會有什麼問題?大家當然還是拼命購買瑞士法郎,但是因為要維持匯率固定,瑞士央行就必需要把這些購買的量吃掉,有兩種作法,一種是增加供給,也就是印鈔票,市場上的瑞郎越多就越不值錢。另一種作法就是央行把買瑞郎的外匯全部吃下來,增加外匯存底。

首先要了解央行的責任,央行是負責控制一國或一區域的貨幣政策的主管機構,其最重要職責包括「維持貨幣穩定與供給」、「穩定金融市場」、「制定貨幣政策」、「調節貨幣的流動性」,也就是央行必須負責印鈔票以及管理鈔票。央行發行鈔票必須要有金銀、票據、外匯、有價證券作為擔保,不可以任意印鈔票。央行的目標是穩定貨幣而不是獲利(這是和商業銀行最大的差別)。央行可以透過公開市場操作、調節利率、調節準備金比例、監管金融活動等作法來穩定金融市場。

央行有自己的資產負債表,對銀行來說,資產就是「黃金儲備」、「外匯」、「對商業銀行的應收帳款」、「對公共財政的債權」,負債是「流通中的現金」、「別人存在央行內的錢(外國機構、商業銀行)」

現在瑞士央行為了穩定匯率,從2011年開始只好拼命買進外匯,導致央行的資產上升,問題是這三年來瑞士央行已經買了相當於瑞士全國GDP 80%歐元。要是歐元一貶值,後果不堪設想。

歐元區量化寬鬆

最後一根稻草是本週開始施行「歐元區量化寬鬆」措施。

什麼是量化寬鬆?量化寬鬆的英文是Quantitative easing(QE),也就是創造貨幣(量化),降低銀行的資金壓力(寬鬆)。簡單說就是央行透過公開市場操作,買入銀行的債券。對銀行來說,原本的債券變成現金,像當於國家內流通的現金增加,因此銀行會想要再把錢借貸出去,促進資金流通導致經濟繁榮。但不是每件事情都是好事,量化寬鬆會讓貨幣傾向貶值,持續性的量化寬鬆可能會導致惡性通膨。通常國家會實施量化寬鬆是因為降息已經沒什麼作用了,那時利率會非常低(接近0),日本在2000年初期就曾經實施過量化寬鬆、2007年的全球金融危機美國連準會主席柏南克也推出了量化寬鬆等。

歐洲央行(ECB)一旦實施量化寬鬆政策,就會開始大規模購買債券。市場會開始流通大量歐元,於是這些歐元又會流入瑞郎。瑞士央行想要捍衛固定匯率的話必需要繼續買入更多歐元。另外市場歐元變多也會導致歐元貶值,對瑞士央行來說,他的外匯會受到大量的損失。

於是瑞士央行最後決定和歐元脫勾,取消匯率綁定,瞬間造成被低估的瑞郎暴升,立刻產生許多衝擊。首先是瑞士央行會立刻承受巨大損失,可以看到花旗銀行估計,瑞士央行因為匯率的關係至少損失701億美元。但這樣做總比最後央行崩潰好,長痛不如短痛。再來是瑞士本身對維護金融穩定的能力會受到質疑。另外歐元可能因此加重貶值,因為少了瑞士銀行兌換的管道,大家會更看貶歐元。其他和歐元連動性高的貨幣例如丹麥、瑞典也可能會受到影響,目前丹麥是採取7.46克朗兌換1歐元,允許上下浮動2.5%。瑞典則沒有釘住歐元。

避險

再來是談避險,最近許多新聞說瑞郎升值會造成很多避險基金破產,這道底是怎麼一回事呢?

先來談什麼是避險基金,避險基金並不是沒有風險的意思,事實上避險基金通常會更積極的投資。避險基金以追求「絕對報酬」為目標,也就是穩穩的賺,不和大盤比較。簡單說如果大盤整體走勢是上漲,我就把我的基金配置成和大盤差不多,能賺取和大盤一致的報酬。如果市場是空頭,我就把我的基金配置成利用空頭部位套利。基金的表現取決於所挑的金融標的,而不是進入市場的時機。

這是一個很大膽卻又很有效的策略,發明於1950年代的美國,利用「放空」和「槓桿」兩個高風險的東西,組成一個聽起來穩賺不賠的金融工具。但避險基金最大的問題是,對於市場錯誤的預測將會導致大幅虧損,這種情況通常發生在金融風暴、或是對政治經濟環境所作的錯誤預測。本次瑞郎升值影響最嚴重的就是Everest資本公司下的全球基金,他賭瑞士法郎會下跌,但最後反而高漲,因此最後就幾乎把所有的基金就賠掉了。

另外避險資金將會紛紛湧入其他亞洲新興國家,造成日圓、台幣、韓元等升值,這也是近一週台幣升值的原因。

 
almost 3 years ago

因為最近有朋友問我關於cache的問題,覺得這部份應該很多人一知半解,決定整理出一篇易懂易了解的cache解釋。

從記憶體設計的原則開始

當初記憶體為什麼要像現在設計成階層式的架構?很簡單,因為我們發現我們寫的程式在存取記憶體的過程中,有兩大現象:

  • 剛剛用過的記憶體很容易再被使用(例如,for迴圈)
  • 如果一個記憶體剛剛使用過,他附近的記憶體位址也很可能被使用到(例如,陣列存取)

這就產生了設計記憶體架構的兩大原則,Temporal LocalitySpatial Locality。另外還有記憶體本身的速度、成本的考量,越快的記憶體越貴,我們決定設計出階層式的記憶體架構。

越上層的記憶體越貴,速度越快,容量越小。越下層記憶體越便宜,速度慢,但容量越大。資料只會在相鄰兩層間移動。

我們把資料一次從記憶體下層轉移到記體上層的單位定作block。如果處理器要求讀取某個block的資料,剛好在上層的記憶體內,那就稱為hit。如果不在上層,那就稱為miss。hit rate就是你成功在上層記憶體就找到你要的資料的次數比例。相反的就是miss rate。hit rate + miss rate = 1。現今電腦的hit rate都已經達到驚人的95%以上。

另一個對電腦效能來說影響重大的因素就是hit time和miss penalty

  • hit time
    • 判斷記憶體是否hit + 把上層資料搬到處理器的時間
  • miss penalty
    • 把下層記憶體的資料搬到上層 + 上層記憶體資料搬到處理器的時間

cache設計的概念

cache在設計的時候,就要先回答一個重要的問題:

處理器怎麼知道data是否在cache中,並且正確的從cache抓出想要的資料?

direct map

設計cache的配置有很多種不同的方式,我們先學習最簡單的方式direct-map(也被稱為One-way set associative)


direct-map顧名思義,就是直接根據記憶體位置,把所有區塊平均分配給cache。看圖應該就能理解配置的方法,cache內有000~111 8個block,memory內有00000~11111 32個block,memory內的block index結尾只要等於cache index,就代表該block可以被放到該cache的該位置。也就是灰色的部份(00001, 01001, 10001, 11001)都可以被放到cache 001 block內。

tag

但這樣設計的問題就是,我要怎麼知道我想要的記憶體資料剛好在cache內?
答案是多設計一個tag欄位,讓tag紀錄該cache所紀錄的資料在原本記憶體中的位置。tag不需要完整紀錄該cache存放內容的記憶體位址,他只要紀錄前面幾個bit就好了。以上圖為例,我想知道cache index 001到底是存放(00001, 01001, 10001, 11001),只要額外紀錄前兩個bit就好。

valid bit

另外cache還需要valid bit,來紀錄該cache是否包含有效資訊。例如處理器剛啟動時,cache內並沒有任何東西,此時cache內容全是無效的,要經過一段時間才會塞滿內容。

實際範例


直接看圖了解最快,這是一個32bit的address,direct map到1024個block的cache。word是處理器指令集存取memory的單位。在此架構中一個word是4個bytes,因此我們需要兩個bit來決定到底是該word的哪一個bytes。該圖cache內1個block的大小是1個word,總共有1024個block,所以我們用10 bits來表示該cache index,剩下20個bits就作為tag。因此存取該cache意思就是取出2~11bit找到cache index,並比較tag(12~31 bit)決定是否hit,如果hit到,就讀出資料。

實際上,一個block可能存放不只一個word。假設一個block存放2^m個word(也就是一個block 2^(m+2) bytes),所以一個cache內有m個bit會被用來找是該block的哪個word,有2個bit會被用來找該word的哪個byte。

因此一個32bit的記憶體位址大概會分成 [tag][cache index][word index][byte index]。
一個cache的實際佔用空間是2^n*(valid field size + tag size + block size)

但傳統上,我們會只計算cache的的資料空間作為cache size,也就是我們會把上圖稱為4KB的cache(1024個block,一個block內有4byte的資料)

舉例

使用32bit address,一個可以放16KB data的cache,每個block有4個word,實際上會需要多大的cache?
16 KB = 2^14 bytes = 2^12 word,一個block 4個word,所以總共有2^10 block。
每個block有4個word,也就是128bit,tag的長度是32 - 10 - 2 - 2 = 18 bit(32扣除block index, word index, byte index),外加一個valid bit,因此總共是
2^10 * (128 + 18 + 1) = 2^10 * 147 = 147 Kbit

block size與miss rate的關係

在同樣的cache size下,如果提昇block size,會降低miss rate,因為你提昇了spatial locality。但是如果你無限制的提高block size,反而會導致cache內的總block數太少。另一個提高block size會造成的問題是miss penalty變大,因為一旦miss,你須要轉移更多的記憶體內容。

記憶體的組織(Memory Organization)

在以下的假設下,我們比較一下不同記憶體配置方式的效能

  • 以word為單位傳輸
  • cache block size為8 words。
  • 1 clock cycle 送出想要讀取的記憶體位址
  • 10 clock cycles 存取記憶體內容
  • 1 clock cycle 讓bus傳回資料

One-word-wide memory organization


一次只能傳一個word的記憶體架構。

計算miss penalty 和 memory bandwidth

在此架構下發生miss,則必須把memory的內容搬到cache裡,每次搬運一個word,需要1個cycle傳送想讀的記憶體位址,10個cycle去讀取記憶體,然後1個cycle把記憶體資料放進cache內。所以8個word總共需要:

miss penalty = 8 * (1 + 10 + 1) = 96

memory bandwidth = bytes_transferred / clock_cyle
32bytes(8 words)/96 clock = 0.33 bytes/clock cycle

要如何提昇記憶體bandwidth呢?你可以選擇每次傳更多bytes,或每次花更少的clock傳同樣數量的bytes。這兩種思維導致了以下兩種設計架構

Wider Main Memory


特色是cache和main memory之間的busCPU和cache間的bus還要寬。CPU和cache一次只會傳1個word,但cache和memory會一次傳k個word。在這種情況下,發生miss時,記憶體可以一次搬運大量的資料到cache內。

計算miss penalty 和 memory bandwidth

需要1個cycle傳送要取得的記憶體位址,10個cycle去讀取記憶體(此時一次取得8個word),然後1個cycle把記憶體資料放進cache內。
miss penalty = 1 + 10 + 1 = 12

memory bandwidth = bytes_transferred / clock_cyle
32 / 12 = 2.67 bytes/clock cycle

老樣子,每種架構都有自己的代價,這樣的架構需要更多線,所以成本一定更高。另外因為CPU一次只能讀取一個word,但是cache內每個block有8個word,所以必須要有一個mux去選擇該個block內的某個word。

實際上cache設計會長的像這樣,看圖應該就能理解了:

Interleaved Memory


Interleaved的意思是交錯的,在這種架構下記憶體被分割成許多個bank,每個bank的頻寬是one-word。這樣設計的好處可以一次讀取多個word,再一個一個傳送到cache內。

計算miss penalty 和 memory bandwidth

該記憶體有4個bank,1個cycle送出要讀取記憶體位置,10個cycle讓記憶體讀取資料,4個cycle送出來自4個bank的4個word,總共要讀出8個word。
miss penalty = 2 * (1 + 10 + 4 * 1) = 30 clock cycle
memory bandwidth = bytes_transferred / clock_cyle
32 / 30 = 1.1 bytes/clock cycle

這樣設計的好處是折衷,他不像one-word-width memory這麼慢,但是又不像wider memory需要更大的bus。影響效能的關鍵在於記憶體位址是如何分配到各個bank內,一般來說連續的記憶體會被分到不同的bank內,這樣一次可以從不同的bank抓出連續的記憶體資料。

談cache block的配置

剛剛我們談的是在同樣的cache下,不同的main memory架構會如何影響cache的效能,現在我們換個問題:改變cache的架構呢?
我們一開始採用的是最簡單的Direct-map配置,也就是每個main memory上的記憶體只會出現在特定的cache位置內。

其他還有set associaltive的方式,也就是把cache分成多個set,CPU必須檢查指定set內的每個block是否有可用的cache。最極端的情況下就是Fully Associative,也就是CPU要檢查cache內所有的block。

實作多個four-way set的方式

以上就是cache的簡易介紹,詳情請翻閱你手邊的算盤書。

資料來源:

 
almost 3 years ago

從ARM Cortex-M硬體架構開始

什麼是Exception?

任何讓程式脫離正常的執行流程的事件被稱為Exception。當Exception發生時,程式會停止手邊的工作,然後跳去執行Exception Handler,執行完後再回來繼續執行手邊的工作。

什麼是Interrupt?

在ARM的架構上來說,Interrupt是一種Exception,Interrupt通常是週邊裝置或是外部輸入所產生,也可以透過軟體設定產生。Interrupt的Exception Handler同時也被稱作ISR(Interrupt Service Routine)

Exception對Cortex-M而言有什麼意義?

Cortex-M有幾個不同的exception來源,但都會先交給NVIC處理。NVIC會負責處理Interrupt Request(IRQs)和Non-Maskable Interrupt(NVI) Request。

IRQs和NMI差再哪裡?

  • IRQ
    • 通常是週邊或外部輸入產生的
  • NMI
    • 通常是給watchdog timer(看門狗,一定時間處理器沒有回應時會主動打斷處理器)和brownout detector(處理器電壓偵測,當處理器的電壓低於某個水平時會發出警告) 另外還有SysTick,是處理器內部的timer,會週期性的對處理器發出中斷。通常是給embedded-OS使用。

下面這張表圖代表Cortex-M3, M4的exception type


可以觀察到exception number越小,代表事情越大條。而編號16~255總共240個例外都交給Interrupt使用。

雖然處理器提供了高達240個IRQ,但一般實作上並不會全部使用,一般只會使用16~100個Interrupt,好處是簡化設計,同時減少電力消耗。舉例而言,STM32F429的startup.s中 (請參閱Line152~242),只使用到了91個interrupt。

談NVIC,Nested vectored interrupt controller

NVIC是Cortex-M處理器的一部份。負責處理例外和中斷的設定,包括中斷的優先權和遮罩。他有一些很棒的特性

  • 彈性的控制和設定
    • 每個ISR都可以獨立做啟動與關閉
  • 允許巢狀中斷,也就是中斷時,還可以被中斷
    • 每個Exception都有自己的優先權,有些可以自由設定優先權,少數嚴重的例外不可以
      • Interrupt可以自由設定,可以改變
      • Reset, NMI, HardFault的優先權是固定的,不可改變
    • 當例外發生時,NVIC會比較例外的優先權,如果後來發生的exception優先權比較高,那就插隊先執行更優先的例外,也就是preemption。
  • 可以做中斷遮罩,也就是停用某些中斷
    • Cotex-M3, M4提供了幾個遮罩register,例如PRIMASK,你可以停用所有的exception(除了最嚴重的HardFault和NMI不可以停用),好處是當你在執行一些關鍵任務,不可以被打斷(例如看片執行real-time multimedia解碼時)。或是你可以使用BASEPRI register,來停用某個優先權以下的例外。

談優先權

每個Exception都有自己的優先權。對Cortex-M來說,有一件很簡單但重要的事情要記得,那就是

數值越小代表優先權越高

預設上,所有軟體可以設定的優先權預設都是0。優先權可以設定的範圍在0~15之間,背後意含是Reset(-3), NMI(-2), HardFault(-1)的優先權永遠比你設定的例外還高。

優先權的觀念

在ARM Cortex-M裡,設定優先權的register bits被分為兩個欄位

  • group priority(靠近MSB這一邊)(或稱為preempt priority)
  • subpriority within group(靠近LSB這一邊)

就是遵守幾個簡單的原則

  • 如果一個exception handler正在執行,其他例外發生時,如果group priority優先權比你高就可以插隊,如果跟你一樣或比你低,就乖乖等
  • 如果有多個相同優先權的例外處理在等待執行(Pending),那麼先比較subpriority,優先權比較高的排前面,如果還是一樣,Exception Number小的優先。

ARM Cortex-M 架構允許0~255個不同的優先權,總共256個。但是實際上各個使用Cortex-M的微處理器並廠商不會讓你自由設定256個優先權。舉例來說,TI Stellaris Cortex-M3 and ARM Cortex-M4 提供3個priority bits,允許你自訂8個優先權。NXP LPC17xx ARM Cortex-M3 提供了5個優先權bits,允許你自訂32個優先權。而STM32F429這塊使用Cortex-M4的板子,提供4個優先權bits。
這4個bits要如何分配給group priority和subpriority呢?透過設定Application interrupt and reset control register (AIRCR)可以改變,你可以設成以下形式,詳情請參閱stm32 programming manual p.213

  • GGGG
  • GGGS
  • GGSS
  • GSSS
  • SSSS

其中G代表Group priority field,S代表Subpriority field

談CMSIS和NVIC的關係

CMSIS 提供了控制NVIC register的function。你可以透過CMSIS來控制優先權。包括啟用、停用某個exception,設定某個Interrupt的優先權等。

值得一提的是其實每個優先權會佔用8個bits,但是其實只有bits[7:4]有用而已,bits[3:0]是don't care bits。詳情請參閱stm32_programming_manual p.200

了解這些後,我們可以來談FreeRTOS上和優先權有關的設定

從FreeRTOS的角度看優先權

首先,先搞清楚一件事!(非常重要)優先權有兩種,一種是「ARM Cortex-M上Exception的優先權」,另一種是「FreeRTOS kernel內不同Task的優先權」,這搞混接下來就不用玩了。

  • FreeRTOS kernel內不同Task的優先權
    • 跨平台的,任何地方只要跑FreeRTOS都一樣
    • 數值越小,優先權越低,數值越大,優先權越高,最高可以到你自己定義的configMAX_PRIORITIES-1
  • 例外中斷優先權
    • 相依於平台的,不同的系統架構都不同
    • 有的系統數值小代表優先權低,有的卻相反。不同系統有不同數量的中斷優先權。

不同架構有不同數量的優先權

FreeRTOS是設計給許多不同的處理器架構的RTOS,很多人會跑在ARM Cortex上,但正因為他是設計通用不同的處理器架構的,所以有些東西要特別注意。

第一件事就是優先權的數量,這是處理器的製造商決定的,就算都是使用Cortex-M的處理器,製造商允許的優先權數量也不同。如同我們一開始所講的,Cotex-M本身允許高達256個優先權。但大多數處理器製造商並不會全部實作出來,你通常只能使用3~5bits來設定優先權,也就是8、16、32個不同的優先權數量,取決於微處理器的製造商。

要了解你的處理器使用多少優先權,可以去看你廠商的文件,或是直接看你使用的CMSIS Library header files。可以看core_cm4.h這個檔中定義了__NVIC_PRIO_BITS的數值。如果是stm32f429,這個值是4,也就是允許16個不同大小的優先權。

ARM Cortex-M on FreeRTOS

Cortex-M雖然提供了8-bit的優先權register,但通常會分成兩個部份。preempt priority bits和subpriority bits。如同之前所講的,preempt bits決定一個interrupt可不可以插隊執行。subpriority bits決定了兩個具有相同preempt priority等待執行時,誰先執行。

FreeRTOS官方建議把所有的priority bits都設給preempt bits。因為這樣才不會把事情搞得過於複雜。絕大多數的系統預設都是FreeRTOS想要的設定,也就是全部指派給group priority,除了STM32以外。

如果你是STM32的使用者,同時還使用的STM32的 driver Lbirary。FreeRTOS官方要求在FreeRTOS開始執行前,把所有的priority bits都設給preempt priority bits。做法是在RTOS開始跑之前call

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //implementing in driver file misc.c

另一件要注意的事情是ARM本身的priority大小的定義和大多數的處理器不同,對ARM Cortex-M來說,數值越小代表優先權越高。也就是priority = 2 比priority = 5會更優先。

FreeRTOS的優先權

FreeRTOS的優先權分成兩類。一類是受RTOS管理,不會影響到critcal section的,另一類是不理會RTOS的。這兩者將以configMAX_SYSCALL_INTERRUPT_PRIORITY所設定的值為界。
freeRTOS本身有兩個重要的優先權設定,分別是

  • configKERNEL_INTERRUPT_PRIORITY
  • configMAX_SYSCALL_INTERRUPT_PRIORITY

有些port只實作configKERNEL_INTERRUPT_PRIORITY,有些架構兩者都實作。

對於那些只實作了configKERNEL_INTERRUPT_PRIORITY的port來說

configKERNEL_INTERRUPT_PRIORITY設定的是FreeRTOS Kernel本身使用的interrupt priority。有call FromISR結尾的API的interrupt handler必需要在這個priority下執行。那些沒有call API的handler可以選擇更高的priority,這樣就不會被RTOS kernel所延遲。

PS.
Q:為什麼所有使用到FreeRTOS API的Interrupt必須要在KERNEL_INTERRUPT_PRIORITY下執行?
A: 因為如果有一個Interrupt的優先權大於KERNEL_INTERRUPT_PRIORITY,就有可能在FreeRTOS正在進行QueueSend這種critical section的動作時打斷他,會悲劇。

對於那些兩者都實作的port

configKERNEL_INTERRUPT_PRIORITY設定的是FreeRTOS Kernel本身使用的interrupt priority。configMAX_SYSCALL_INTERRUPT_PRIORITY設定那些call FreeRTOS API的ISR最高能使用的優先權。

注意,對ARM Cortex-M3, M4來說,configMAX_SYSCALL_INTERRUPT_PRIORITY絕對不能設成0,原因下面有解釋

這樣設計有什麼好處?

  • 你可以寫一個發生Interrupt後負責處理的Task,他的優先權會比其他task還高。該Task會被Interrupt喚醒執行,Interrupt Handler本身應該寫得越短越好,也就是抓到資料,然後後喚醒高優先權的Task負責處理,迅速離開。外界看起來就像是Interrupt自己完成的一樣。這樣的好處是當handler Task在執行時,依然可以允許其他Interrupt執行。(要知道有些架構是不允許nested-interrupt的)
  • 更進一步,那些實作configMAX_SYSCALL_INTERRUPT_PRIORITY的port,允許巢狀中斷。優先權在Kernel和MAX_SYSCALL之間的Interrupt可以nest call,同時可以call FreeRTOS API。
  • 比MAX_SYSCALL優先權更高的ISR是絕對不會被RTOS本身影響的,他們回應速度很快,對於那些非常需要快速回應的控制系統而言,是很棒的功能,但是這類的ISR不能使用FreeRTOS提供的API。

談FreeRTOS的Tick


這張圖我們都看過,概念很簡單,兩個priority相同的task在time slice到了之後,會做context-switch,但是卻沒有思考過到底context-switch時會發生什麼事。

要注意到,在 FreeRTOS 中,preemptive scheduling 是可以設定的: http://www.freertos.org/implementation/a00011.html -commented by Jserv

實際上,進行Context-Switch是由Tick中斷所引發的。當Tick中斷發生時,TickHandler的程式碼如下

程式很簡單,Tick會先「設立中斷遮罩」,阻絕絕大部分的中斷,然後執行xTaskIncrementTick(),跳表一次,接著檢查context-switch的時機到了沒,如果是的話,設立Flag。之後離開,「取消中斷遮罩」。

注意到我說「阻絕大部分的中斷」背後的深意。阻絕的意思是下遮罩,但一旦下了遮罩,要是這時候有人發出中斷,那不就遺失了嗎?不是的,阻絕的意思是「依舊接受中斷,但不處理中斷」(請參閱p.203 stm32_programming_manual)。

為什麼我講「大部分」而不是全部?因為事實上,你所阻擋的只是優先權等與或低於configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷。FreeRTOS 中的port.c中,有一個可以停用所有Interrupt的函式叫做ulPortSetInterruptMask。他會把BASEPRI register的值改成MAX_SYSCALL_INTERRUPT_PRIORITY,也就是所有優先權低等於 MAX_SYSCALL_INTERRUPT_PRIORITY的中斷全部不處理。但如果有一個優先權比configMAX_SYSCALL_INTERRUPT_PRIORITY更高的中斷發生時,板子將不理會RTOS Kernel,逕行處理。

看不懂inline-asm語法的話請參照here

這也是為什麼FreeRTOSConfig.h中會加「/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!」的原因。因為一旦BASEPRI register設成0,是無效果的意思。並不是遮住所有優先權的中斷。

在執行xQueueSend這種關鍵操作時,會發生Context-Switch嗎?

答案是:不會。
事實上執行的過程是這樣的

  1. call taskENTER_CRITICAL()
    • 保存中斷向量遮罩的狀態,把中斷遮罩設成configMAX_SYSCALL_INTERRUPT_PRIORITY
  2. 檢查Queue有沒有滿,把東西塞到Queue裡面
  3. call taskEXIT_CRITICAL()
    • 恢復中斷向量遮罩的狀態

在critical section內,程式不會被優先權SYSCALL以下的中斷打斷,就不會發生放進Queue到一半,突然又被優先權更高中斷打擾。

為什麼Interrupt Handler內使用FreeRTOS時,要使用FromISR()結尾的API?

FreeRTOS提供的API中,有一類是FromISP結尾的,像是

  • xSemaphoreGiveFromISR()
  • xSemaphoreTakeFromISR()
  • xQueueSendFromISR()
  • xQueueReceiveFromISR()
  • ……etc

事實上,所有From_ISR開頭的API和一般API的差別是多了一個參數,叫做
signed BaseType_t *pxHigherPriorityTaskWoken

這個參數的用意是,通常當你使用.......FromISR()這類的API時,是為了做communication。告訴系統某個資源已經釋放、某個任務要執行了。作法是讓這個參數紀錄,是否有優先權更高的Task被喚醒了。

xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );

因此在ISR的結尾,要記得呼叫

portYIELD_FROM_ISR( xHigherPriorityTaskWoken );

意思是,如果xHigherPriorityTaskWoken被改成True,那就發生Context-Switch,去執行優先權更高的那個任務吧。

 
almost 3 years ago

這本書基本上就是Peter Thiel的世界觀。

未來的挑戰

進步有兩種形式:

  • 水平式進步
    • 複製已經成功的方法,也就是從1~n
    • 這很容易想像,因為你就是複製目前已經成功的事物。
    • 代表詞:全球化
  • 垂直式進步
    • 做別人沒有做過的事情。
    • 代表詞:科技

新科技不會自動產生,想想我們的祖先從靜態的零和賽局掠奪別人的資源佔為己有就算是成功,極少創造新的財富。等到中世紀發明風車、16世紀發明星盤、這一萬年間只有零新的進步。直到1760年代出現蒸汽機引擎,這社會才突然經歷一連串的科技進展,從來沒有一個世代像我們的父母輩一樣,期待這個社會會持續進步。1960年代,我們期待一週工作4天,能源便宜到不用錢、可以到月球渡假。但是這些都沒有發生,我們創造了智慧型手機,但是卻讓我們忽視環境還是很落後,事實上過去半個世紀,只有電腦科學和通訊大幅進步,這不是說上一代的美好想像是錯的,他們只是不過不該期待這些會自然發生,現在我們面對的挑戰是:「不但要想像新科技,還要更進一步把想像的新科技創造出來,使21世紀比20世紀更和平繁榮」。

1999年的教訓

思考:
有什麼是你跟其他人有不同看法,卻很重要的事實?

網路掏金熱從1998年9月開始到2000年3月,只經歷了18個月。每個地方都有滿滿的錢,每週都有十幾家公司舉辦奢華的晚宴。那時只要加上.com,所有東西都能暴紅。一群人放棄原本高薪的工作,開公司或加入新創事業。那時Peter Thiel在paypal,他嚇壞了,因為這裡的每個人都好像認為「所有美好的事物都會發生」。

paypal如果要順利運作,至少要有百萬用戶的規模,投廣告燒錢但成效有限,找銀行又沒人理我們。最後我們只好付錢請大家使用。只要註冊paypal,我們就給你10美元,而且只要你推薦一位朋友,我們再給10美元。他們立刻增加數十萬個新用戶。當然這種搶客策略沒辦法持久。當時超高成本是矽谷的典型情況,但我們認為這個策略是理智的,在大量用戶的基礎上,paypal只要在用戶交易時收取小額手續費就可以獲利。

Peter Thiel知道榮景即將結束,但他們需要更多資金。他明白不應該期待投資人對網路泡沫化後對paypal保持信心,所以他們加速募資。最後在2000年2月,華爾街日報亂估paypal價值五億美元,隔一個月後,paypal就募到一億美元,然後網路就泡沫化了。

於是矽谷的大家學到了四個教訓:

  • 循序漸進
  • 保持精簡而有彈性
  • 面對競爭求取進步
  • 專注在產品,而非專注在銷售

但是Peter Thiel提出了相反的原則,可能更正確

  • 大膽冒險比無聊瑣碎好
  • 壞計畫比沒計畫好
  • 競爭市場賺不到錢
  • 銷售與產品一樣重要

打造有創意的獨占企業

思考:
哪些有價值的公司還沒有創立?
你的公司可能創造出一大堆產值,卻本身卻不是很有價值。
舉例而言:美國航空業每年服務數百萬名乘客,創造出1600億美元的產值,但是2012年,單程機票的平均價格降到178美元的時候,航空公司只能從每位乘客身上賺到37cent,相較之下,Google創造的產值雖然較小,2012年的營收是500億美元,卻能留下21%的利潤。

問題在哪裡?
航空公司必須彼此競爭,但Goolge則是一家獨大,用簡單的方式來描述就是「完全競爭」vs「獨佔事業」

完全競爭就意味著:「沒有人能夠在市場上獲得超額利潤」如果想要創造,並且長久的留住價值,就不應該建立一個沒有差異化的產品模式。獨占企業會為了讓自己看起來沒有那麼獨占,避免被其他人盯上,騙其他人說自己的市場很大,並沒有獨占。而競爭的企業會假裝自己是獨占,來欺騙其他人表現出掌控大局的樣子。

Google會告訴別人說:我的市場是搜尋引擎+手機+穿戴式裝置+電腦+自動駕駛車的聯集

在加州Palo Alto市的英國菜餐館會說我們的市場是 英國+餐館+Palo Alto+饒舌歌手+hacker+鯊魚,的交集,專注在微不足道的小差異上。

獨占有很多好處,因為長達數年甚至數十年的獨占利潤提供強大的發明誘因,最後,獨占可以讓發明持續,因為他們不必煩惱明天的競爭,可以把目光放的更長遠。投資在競爭公司無法想像的長期發展上,獨占是每個成功企業的寫照。
「幸福的家庭都是相似的,不幸的家庭各有各的不幸」
「成功的企業長得都不一樣,每家公司靠解決一個獨特的問題而贏得獨占地位。倒閉的企業則都一樣,無法從競爭中逃脫。」

競爭的迷思

為什麼大家會相信競爭是健康的?競爭其實意味著大家都沒有利潤,產品沒有實質差異,而且必須掙扎求生。
競爭是一種意識形態,一種充斥在我們的社會,扭曲我們想法的意識形態。我們鼓吹競爭,而且制定競爭的法規,最後卻把我們自己困住,我們越競爭,得到的卻越來越少。

教育體系反應並促成我們對競爭的癡迷,分數讓我們可以看似精準的衡量每個學生的競爭力。我們以類似的方法教導每個年輕人追求相同的目標,而不問天份和喜好。無法一直坐在書桌前學習的學生感覺自己技不如人,而在考試和作業等傳統評量中表現出色的小孩,最後則在與現實世界裡沒有交集的學術界裡證明他們的存在。

高等教育是一場困局,精英學生們充滿自信的往上爬,直到競爭激烈到粉碎他們的夢想為止。他們為此付了數十萬美元的學費,而且學費的漲幅比通膨還高,只為了求一份管理顧問或投資銀行的傳統工作,為什麼要這樣折磨自己?
為什麼要競爭呢?一般來說衝突有兩種形式。

  • 馬克思模型
    • 競爭是來自於理念和目標的不同
  • 莎士比亞模型
    • 競爭到最後根本不知道競爭當初的原因是什麼
    • 沒人記得羅密歐和朱麗葉的家族到底當初為什麼要競爭

商場上,大多數的競爭都是莎士比亞型競爭。這類的競爭打到最後,大家都會忘記真正的重點是什麼,反而把重心放在贏過競爭對手。像微軟對Google,Bing vs Google Search, Office vs Docs, IE vs Chrome, Surface vs Nexus, 最後,蘋果公司後來居上,成為市值最高的企業,比微軟+Google還高。記得在2010年以前,不管是微軟還是Google的市值都比蘋果高喔。

對抗會讓我們過度強調舊有的機會,大肆複製過去的成功經驗。像是1990年代的寵物網站競爭Pets.com, PetStore.com, Petopia.com,你根本分不清這些公司差在哪裡,最後Pets.com在網路泡沫破滅後倒閉。或是Oracle和Informix的競爭,兩個人鬧到在同一條路上互打廣告,只為調侃對方的執行長。

記得一件事情:
「競爭是破壞的力量,並不代表價值。」不要被競爭沖昏頭,保持腦袋清醒來打造獨占企業。

後發優勢

思考:
這個事業十年後還在嗎?
為什麼紐約時報2012年獲利高達1.33億美元。Twitter還在虧損,但為什麼twitter的市值240億美元?
答案在於現金流:一個偉大的事業應該從未來產生的現金流能力來定義。科技公司的現金流通常早期在虧損,因為他們要花時間打造有價值的東西。這意味著產生營收的時間會延後。一家科技公司的價值多半要成立10~15年之後才會顯現。
所謂一家有價值的企業,不但必須成長,還必須能夠持續成長。像是Zynga和Groupon,他們短期的快速成長讓經理人忘卻注意長期挑戰。Zynga因為開心農場暴紅很開心,但是他們最後還是會面臨到一個問題「如何能穩定的製作一連串高人氣的娛樂電影?」

獨佔事業的特點

  • 專利技術
    • 一般來說,專利技術要比接近的替代品好10倍,才能真正取得獨占優勢。否則可能會被視為微幅改善,這樣的產品很難賣出去。要比別人進步10倍以上最好的方法是發明全新的產品。例如發明一種不用睡覺的藥、或是治療禿頭的方法。或是你可以選擇大幅改善現有的解決方法,讓你的產品比現有的好上10倍,像是paypal以前郵寄支票要7~10天才會到,paypal買賣結束後立刻付款。Amazon書店剛開始聲稱是全球最大的書店,他們提供的書比其他書店至少大10倍。或是透過優越的整合科技,像是Apple的iPad比以前的Windows Tablet PC。這恆難衡量,但是相較於現有產品,Apple明顯有大幅進展。
  • 網路外部性
    • 簡單說就是越多人用,就越好用。像是fb,這力量很強大,但是在你公司還很小的時候,除非你對初期用戶相當具有價值,否則相當難以取得網路外部性。矛盾的是,具有網路外部性特質的企業必須從極小的市場開始。這就是為什麼成功的網路事業很少從企管碩士之類的人開始經營,因為初期市場太小,看起來完全沒有商機。
  • 規模經濟
    • 隨著規模擴大,獨佔事業就會越來越強壯,因為製造產品的固定成本可以由更多的銷售產品分攤掉。軟體就可以擁有非常誇張的經濟規模,因為複製一份產品的成本幾乎是0。如果你開的是瑜伽教室,那你很難取得規模經濟,你可以請更多老師或是增加更多教室,但是你的毛利率依然很低,你永遠不可能像軟體工程師一樣,以優秀的人才組成核心團體,然後提供有價值的服務給數百萬客戶。
    • 優秀的新創企業一開始就應該思考潛在客戶的規模。
  • 品牌
    • 品牌要靠實力經營才會長久
    • 大家都想學蘋果的成功方法,付錢買廣告、訴說一個品牌故事、有著精品的材質、詼諧的產品解說、高貴的定價、極簡的設計風格等。但是如果欠缺本質,這些維持表面光鮮亮麗的科技一點都不管用。蘋果擁有複雜的專利技術,橫跨軟體與硬體。蘋果製造的產品規模大的可以主導原料市價,同時數千名開發者為蘋果的產品軟體撰寫程式,因為這裡有上億個用戶,這樣的ecosystem讓蘋果有強大的網路外部性。這些都是蘋果的品牌強化的基礎。
    • 想想yahoo 2012年的CEO,Marissa Mayer,他是圖讓yahoo重新站起來。他的計畫是「人優先、再產品、再流量、再營收」消費者照理說會因為提供的服務很酷而來,所以yahoo開始修改企業LOGO,然後併購Tumblr之類的熱門新創事業來聲稱他很年輕。但是更大的問題是,yahoo要創造什麼樣的產品?沒有科技公司可以僅靠品牌吃飯。

那麼如何打造獨佔事業?

  • 從小生意開始壟斷
    • 主導小市場比大市場容易,paypal先從eBay上高交易量的超級賣家下手。花3個月就跟25%的超級賣家做生意。
  • 擴大規模
    • Amazon先賣書,之後CD、錄影帶和軟體。最後成為全世界最大的雜貨店。
    • 成功的企業會先佔據一個特定的利基市場,然後擴展到相似的市場
  • 別搞破壞
    • 不要讓你的公司被簡化成反對既存的企業。如果你真的想做點東西,創新的行為遠比那些舊產業不喜歡你的創新來的重要。
    • 找麻煩的公司常常專挑打不贏的架打。想想音樂網站Napster,他們再1999年宣示要顛覆唱片業,隔年上了Time雜誌封面,一年半後進破產法庭。

什麼是後發優勢?
第一個進入市場的企業可能會有比較高的市占率,但那只是策略,不是目標。真正重要的是能在未來產生現金流。在特定市場做出最後一個重大發展,並享受數年或甚至數十年的獨占利潤。實行的方法是主導小型利基市場,從那裡開始壯大你的規模。

成功不是樂透彩

到底成功是不是因為運氣好?還是其實是有能力?
Peter Thiel認為看待未來有兩種層面:

  • 確定與不確定
  • 樂觀與悲觀

不確定的悲觀主義

覺得未來前景黯淡,不知道今天能做什麼。就像現在的歐洲,發生財務危機、而且央行無計可施,祈禱事情不會惡化。

確定的悲觀主義

相信未來已經黯淡無光,但是因為這樣,所以必須做準備。像是現在的中國,很嚴肅的看待未來。

確定的樂觀主義

做好計畫並付諸實現,未來一定會比現在更好。像是17世紀到1960年代。我們發明蒸汽機、機械化、工業、農業、電報、新大陸、運河開鑿、登陸月球。

不確定的樂觀主義

1982年後的美國。美國長期多頭,金融人員超越工程師成為通往未來的康莊大道。對不確定的樂觀主義者而言,未來一定會變的更好,但是他不確定有多好,他預期會從未來得到好處,但是沒理由具體規劃。他們不會耗費數年的時間打造新產品,而是重整既有的發明。像是調整公司的資本結構來賺錢、調整經營流程提高舊事業的效率。大家把重點放在整頓而不是創新。如果你是嬰兒潮世代出生的人,18歲以前你的生活過得一年比一年好,而且似乎你什麼都不用做,科技就會自動進步。所以嬰兒潮世代從小到大對未來總是充滿期待,但卻很少有人有特定計畫來實現夢想,然後科技進步在1970年代停滯下來,貧富差距擴大,但那些人擠入了高所得群,他們主導今天的大眾言論,不覺得他們的天真樂觀該被受質疑,由於他們以前的職業生涯一路順遂,所以無法想像他們小孩走得路會窒礙難行。

Peter Thiel:你不明確規劃,樂觀的未來要如何找上你?

跟著錢走

這世界被80/20法則籠罩著。

偉大的企業都有祕密

這世界上還有祕密嗎?是不是所有知識都已經被公諸於世,剩下的問題不是簡單到大家都知道,就是困難到沒有人能解決?
答案是:世界上還有祕密,那是種「有點重要但未知,有點困難但辦得到的事。」這就是你公司的新機會。
為什麼大家會覺得這世界上已經沒有祕密?

  • 因為世界地圖已經沒有一處空白。如果你身處在18世紀,你可能還會聽到很多異國的茂險故事。但是現在探險家多半只出現在歷史書和童話故事裡。再來是漸進主義的社會潮流,我們從小就學習到做事的正確方式是每次都前進一小步,如果超過進度或學習不在考卷上的東西,我們就拿不到分數,如果你完成被要求的事而且表現的比你的同學好一點,你就可以拿到優等。這個過程延伸到整個工作生涯,這也是為什麼學術界追求大量出版瑣碎的資料,而不是發現新的領域。
  • 避險,大家怕祕密,是因為怕自己出錯。如果你的人生目標是絕對不能出錯,那你不應該去挖掘祕密。
  • 安於現狀,如果你能舒舒服服的挑選已經做好的事情去做,何苦探求新祕密?
  • 扁平化,大家開始把世界當成平的,你以為世界上應該有一群更聰明更優秀的知識份子應該找到你的問題的答案,因為這世界似乎大到單獨一個人無法做出貢獻。

但是不相信祕密的會導致什麼結果?

在經濟學界,越多人相信效率市場假說,就會導致越大的泡沫。

對公司而言,HP的衰敗是個警世的故事。1990年,HP市值90億美金。1991年,HP發明世界第一台平價彩色印表機。1993年發表Omnibook,最早的可攜式筆電。1994年,全球首台多功能事物機OfficeJet。2000年HP市值高達1350億美元。但1999年開始,HP發起新的品牌活動,強調他們是重視發名的公司,他們推出外表光鮮亮麗的顧問服務和支援服務HP Service。大概是因為HP不知道還能做什麼,2005年,HP的市值已經剩700億美元。2012年,只剩230億美元。

費瑪定理的證明者花了9年才證明費瑪的推論正確。還有更多的祕密等待發掘,但只有堅持不懈的人找的到。不管在科學、醫學、工程和科技領域都大有可為。今天,我們可以治療癌症、失憶、因為老化和新陳代謝引發的疾病、生產能源的新方法、更快的移動方法,到外太空去。但除非我們非常想知道這些祕密,而且逼自己去尋找,否則永遠無法一窺究竟。

想想Uber,很少人覺得計程車這個行業竟然能再改善,然後建立起一個價值10億美元的企業。只有相信祕密存在而且願意尋找,你才能跳脫傳統,看出隱藏的機會。

選擇人少的路,不要多講,厲害的創業家都知道,每個偉大的企業都是建構在某個不為外界所知的祕密上,一間偉大的公司就是一個改變世界的計畫。

基礎決定命運

沒什麼好講的。

  • 以找另一半的態度挑選合夥人
  • 小心現金獎勵的陷阱
  • 股票報酬才能員工全力以赴
  • 不上車共患難,就下車走人

最有價值的公司會對創新永遠維持開放的態度。這是公司剛創立最大的特色,這要還在創造新的東西,創業就還沒結束,一旦不再創造新的東西,創業就結束了。如果創業的時機正確,你將不只創辦一間有價值的新創公司,你還可以讓公司在未來持續創造新事物,而不會只是承襲過去的成就。

組織的幫派文化

Paypal幫是怎麼起來的?Elon Musk的特斯拉、Reid Hoffman的Linkedin、陳士駿的Youtbue、Yelp、Yammer、Palantir這些公司,每間市值都超過10億美金。這些團隊的成員不管分開或合在一起表現都很卓越,強勢到超越原本的公司。

Paypal幫並不是透過履歷表塞選出來的。而是他們真心尋找喜歡團隊合作的人,必須有才華,而且特別興奮可以與我們一起共事。你需要的不只是履歷表上看起來厲害的人,還要僱用後能和你充分合作。

你要回答一個問題:「為什麼第20名員工要加入你們公司?」

第20名員工沒有優渥的股份分紅,有才華的人不需要為你工作,他們有很多選擇,所以你必須問一個更明顯的問題:「能到Google享受高薪和地位的人為什麼會想要到你的公司工作成為第20位工程師?」。
爛答案:「你在這邊拿到的股票選擇權會比其他公司值錢」「你可以和全世界最聰明的人共事」「你可以協助解全球最有挑戰性的問題」

但這些回答和其他公司一樣,有說等於沒說。你的答案一定會不同於其他公司,一般來說好答案有兩種,不是跟你公司的使命有關、就是跟你公司的團隊有關。

如果你可以解釋為什麼你的使命如此吸引人,你就可以吸引到你需要的員工。不只是說個使命為什麼如此重要,還要說明為什麼別人做不到你做得到。你要能承諾別人做不到的事情,不是公司提供的免費的按摩或是洗衣送件服務,而是承諾這是一份無可替代的工作,可以和優秀同事共同研究解決特殊問題。你可能比不是2014年的Google,如果以上這些問題你有很好的答案,你可以是1999年的Google。

顧客不會自動上門

追求不著痕跡的推銷。真正厲害的推銷員不會讓你發現他是推銷員。你所厭惡的推銷員都是拙劣的推銷員。
不同的產品需要不同的銷售方法,取決於你取得一個客戶願意花費或能夠承受的成本。

  • 1美元(極少)
    • 病毒式行銷
    • paypal的20美元策略
  • 100美元
    • 市場行銷
    • 打廣告
  • 中間地帶
    • 很難賣的死亡地帶
    • 打廣告也不是請銷售員也不是
  • 1萬美元
    • 個人銷售
    • 請業務員就可以了
  • 100萬美元以上
    • 複雜銷售
    • SpaceX和NASA簽10億美元的合約
    • CEO來談

媒體很重要,每個人都該學會銷售。就算你是阿宅工程師也一樣。

人類與電腦的新關係

Q:談電腦會不會取代人類。
A:那是22世紀的煩惱

潔淨科技與特斯拉

你可以思考為什麼特斯拉會成功,為什麼太陽能面板廠等清潔能源科技會失敗?因為忽視了下面7大問題

  • 工程問題
    • 你創造的是突破性科技?還是微幅改善的方法?
  • 時機問題
    • 現在是發展這事業正確的時機嗎?
  • 獨占問題
    • 你一開始就在一個小型市場搶得高市占率嗎?
  • 人員問題
    • 你有合適的團隊嗎?
  • 銷售問題
    • 你除了有開發產品的能力,還有銷售計畫嗎?
    • Peter Thiel
      • 絕對不投資在穿西裝的科技業執行長身上
      • 最棒的銷售員總是深藏不露,擅長推銷東西的執行長也沒什麼不對,但如果看起來就像個推銷員,他可能不會銷售產品、更不擅長技術問題
  • 持久問題
    • 你的市場定位可以堅持10年, 20年嗎?
  • 祕密問題
    • 你是否已經看見別人沒看見的獨特商機?

創業家無可取代的特質

Paypal成立的6個人當中,有4個人曾經在高中時製作過炸彈。5個人沒超過23歲,4個人不在美國出生。3個人從共產國家逃出來。

正常人一般來說不會有相反的人格特質,但創業者卻很常帶有這種特質。他們可能一會兒陰沉不耐煩、卻又充滿魅力。幾乎所有成功的業者同時是局內人也是局外人。