<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>kelvins-參考文章</title>
<link>http://blog.roodo.com/kelvins/archives/cat_44172.html</link>
<description></description>
<language>zh-tw</language>
<generator>Roodo Blog System</generator>
<copyright>All Rights Reserved</copyright>
<atom:link href="http://blog.roodo.com/kelvins/archives/cat_44172.xml" rel="self" type="application/rss+xml" />
<item>
	<title>崛起的蒼狼</title>
	<description><![CDATA[
			    一九九八年四月一日，愚人節的那一天，我揮別原本的一生志業－－學術研究，加入台灣的主流製造業，那一年，我四十七歲。取得博士學位後，已任教、任職過台大資工系、交大工業工程及管理系，以及貝爾實驗室、工研院電通所。投入完全陌生的製造業，對我是一種激烈的文化衝擊，學術研究與滴血肉搏的製造業是兩種截然不同的生活型態，做生意人和做教授是非常不同的兩碼子事。

　我一方面捲起袖子進入工廠去體會工廠的運作管理，與線上人員打成一片向他們學習，一方面在工作壓力中，本著讀書人的習性，思索咀嚼製造業的精髓、困境與挑戰。因為當時服務的致福公司的特殊情況，在董事長宋恭源先生及執行長林行憲先生的支持下，以生手之姿出任總經理。致福後來與光寶合併，我在這個職位上前後待了五年七個月，這段日子是我人生步調最快的歲月。

　當時的致福狀況並不好，因此短短不到六年的時間內，我經歷了一個公司所可能經歷的最壞狀況。從打掉七十多億資產、減資三分之一、團隊出走、處理三十多億的庫存、被併購入光寶，一直到贏得台灣頭幾個手機ODM訂單、公司轉虧為盈、然後又陷入泥淖，從銀行團的的保留態度，到由花旗銀行主辦的十八家銀行簽約聯貸。現在想起這些往事，對花旗銀行一路鼎力相助，還是非常感激。

　我記得簽約的那天，剛好是我五十歲生日，簽約後簡短致辭，想起一路走來的艱辛，我的心情頗為激動。當時，我為了穩定想出走的團隊，時常情緒低落，最為感傷的一次，是在某次核心幹部週會上，猛然發現在座的核心幹部，處長級以上約二十多人，每一個人都跟我提過辭呈，有的已是第二次、第三次，但都是被我用情義給挽留下來的。

　一個不成功的公司，實在拿不出任何獎勵的辦法，而外面的誘惑又是那麼大，董事會的焦慮又是那麼明確，我只能一次一次畫出願景、濫用情義去挽留團隊。每天晚上回家，都不知明天又會有誰提出辭呈，生活步調也因此非常不正常。我曾在短短時間內胖五公斤，又於短短時間內瘦五公斤，一來一回十公斤，我的健康指數前所未有的不堪，大量透支我的體力與心力。

我多次下班後直奔機場搭機飛赴北歐，隔天早上抵達法蘭克福機場，在機場洗個澡，轉機到客戶所在地點開會到中午，晚上又搭機返回台灣，在第三天晚上回到台灣。三天下來，連旅館都省了，就睡在機上；當時多事的公司讓我經常無法入睡，所以就養成了看書的習慣；根據我的記錄，在那六年裏，平均每個星期看完一本書。這樣子燃燒自己的結果，我終於在公司狀況大致差強人意的二○○三年十一月離開光寶。

離開光寶後一年多的日子裏，六年來的點點滴滴漸漸沉澱，我每天早上出去快走三到五公里，一面思考台灣電子製造業的困境、挑戰與特殊的企業文化，一面試著將過去六年累積的經驗、背後的結構性意義，用簡單的語言及適切的比喻勾勒出來，嘗試著將台灣電子製造業的競爭力放在全球的架構下，用比較長的時間軸及略帶歷史觀的角度，去檢討台灣電子製造業的時代意義、未來走向、及危機。

剛好在此時，《電子時報》的資深記者陳慧玲小姐來電詢問我是否願意幫《電子時報》寫個專欄，大約二個星期一篇，當下我一口就答應了她。從二○○三年十月底開始，平均二個星期一篇，我一面寫、一面整理雜亂的思緒，有的時候一些很強烈的圖像、語言，會在我早上快走時突然冒出來，讓我享受片刻的創意快感，用「蒼狼」來比喻台灣的電子製造業，就是一個例子。

蒼狼是蒙古草原的圖騰，大陸作家姜戎在其鉅作《狼圖騰》一書中，對蒼狼有很細緻的觀察，在他筆下蒼狼是嗜血的，抓住獵物絕不輕易鬆口，可在最惡劣的環境下，採用媲美孫子兵法的策略，配合上在稀疏的草叢中盯緊獵物一蹲十個小時的耐心，在最佳的時點迅速出手咬嚙目標，擁有草原上最高的機動性，幾千年來成為草原文化的催生推手，是老天爺賜給草原的老師。由此訓練出的勁旅，讓文盲的成吉思汗，帶領一批文盲的草原大軍，征服中亞、西亞，征服了幾個世紀的歐洲。過去六年來的電子製造業，就好像是一匹蒼狼，充滿了活力、耐力、爆發力，咬定一個獵物就絕不鬆口，直到全然吞噬入腹，草原上沒有其他的動物可與其匹敵。

今天的電子製造業，由早期的各種板卡、modem、PC、notebook PC、monitor、scanner、mouse、keyboard、video card、WLAN一樣樣吃下去，而且吃到見骨、沒有敵手，有些項目市佔率高達八○％。更可怕的是，牠在草原上不斷尋找新的獵物，手機、IC設計、面板、數位電視、汽車電子用品，哪一樣能夠逃得過牠銳利冷峻的眼神？

姜戎先生在《狼圖騰》一書中提到，有一次在草原上埋伏半天，遠遠的土丘背後、茅草叢中，隱約可見一匹狼，於是拿起望遠鏡望過去，赫然發現遠方的蒼狼竟然兩眼冷森森地望著他，不知已被牠盯上多久了，當下覺得渾身毛骨悚然。 

今天的電子製造業漸漸形成國際級的規模，渴求成長的本能，使得牠冷森森地盯著每一項可能的新產品，耐心地等著機會的來臨。而在草原上趾高氣昂的動物，如馬，風馳電掣不可一世，就如同今天的國際買主Dell、HP、IBM、Nokia、Motorola等等，然而潛伏在茅草叢中的蒼狼，其冷森森的眼光不只盯著肥美的羊兒，牠也貪婪地盯著這些高頭大馬。

姜戎先生在書中提到草原上的狼，靜靜地蹲伏近十小時，耐心地等著雄馬吃足了草、喝飽了水，才突然出現發動攻擊，驚惶的馬群迅速集結成隊，然而吃飽喝足的高頭大馬因為重量而失去速度，很快就被狼追上，但身驅遠比馬小的狼如何吞得下、咬得住馬呢？姜戎描繪了一幅自然界最殘酷的畫面，狼漸漸追上馬，突然一躍而起咬住馬腹，大口撕咬，吃飽喝足的馬，此時肚腹膨脹、撐得肚皮薄薄的，狼一口撕咬下去，血水與草料從肚腹的破口傾洩而出，但馬兒還是狂奔不止，然後傾洩而出的血水與草料將腸胃內臟都跟著帶出來，此時依然狂奔的馬兒拖曳著自己的腸胃內臟，轟然一聲就倒下去了。

電子製造業是國際科技草原上崛起的蒼狼，趾高氣昂的快馬就是那些國際品牌大廠，蒼狼耐心地等著機會，會否有那麼一天，蒼狼一躍而起咬住快馬的肚腹，掌握近八○％的筆記型電腦出貨量的蒼狼，會怎麼吞噬手握訂單、趾高氣昂的快馬呢？

就像這樣，我一篇篇的寫，編織著我對電子製造業的幻想，同時批判它所帶來的粗俗副文化，擔心它的接班問題，嘲弄著它的洋名洋氣，以及它有形無形自認為乃折衝美、日、歐和中國之間的「買辦」價值觀等等，一寫就是一年又六個月，數一數也超過十萬字了。

一年多以來，我漸漸聽到一些讀者的回應，一開始大多是透過陳慧玲小姐間接轉述而來，漸漸地反應越來越多，直到每次同業聚餐或開會，一群人中，總會碰到一、二個讀過這些專欄文章的人士。在陳慧玲小姐的鼓勵下，財訊出版社表示高度興趣將之集結出書，我亦覺得這些文字，如果能讓更多人看到，能激發一些共鳴、討論，甚至影響一些人的觀念，進而對產業走向貢獻點滴，未嘗不是件好事。而當這些文章集結在一起，略為修改成一本書的形式，我還是相當驚訝，我那來那麼多的牢騷，竟然可以多到集結成書了！

我想，如果不是陳慧玲小姐起的頭，加上她每個星期來電，有意無意的暗示下個禮拜是否有產出，到最後，並串聯我的秘書周瑞明小姐就近監督，我也無法持續不斷地寫下去，故在此要特別感謝她們兩位。當然，不能免俗的，我也必須強調一切文責自負，在沒有時間細查資料的狀態下寫出的文字，有些錯引誤用是難免的。

最後，藉此機會感謝我的太太及三個女兒，過去七、八年來對我放任式的信任，或許妳們也很喜歡一個不常在家囉唆的丈夫及爸爸吧！

		]]>
	</description>
	<content:encoded><![CDATA[
			    一九九八年四月一日，愚人節的那一天，我揮別原本的一生志業－－學術研究，加入台灣的主流製造業，那一年，我四十七歲。取得博士學位後，已任教、任職過台大資工系、交大工業工程及管理系，以及貝爾實驗室、工研院電通所。投入完全陌生的製造業，對我是一種激烈的文化衝擊，學術研究與滴血肉搏的製造業是兩種截然不同的生活型態，做生意人和做教授是非常不同的兩碼子事。<br />
<br />
　我一方面捲起袖子進入工廠去體會工廠的運作管理，與線上人員打成一片向他們學習，一方面在工作壓力中，本著讀書人的習性，思索咀嚼製造業的精髓、困境與挑戰。因為當時服務的致福公司的特殊情況，在董事長宋恭源先生及執行長林行憲先生的支持下，以生手之姿出任總經理。致福後來與光寶合併，我在這個職位上前後待了五年七個月，這段日子是我人生步調最快的歲月。<br />
<br />
　當時的致福狀況並不好，因此短短不到六年的時間內，我經歷了一個公司所可能經歷的最壞狀況。從打掉七十多億資產、減資三分之一、團隊出走、處理三十多億的庫存、被併購入光寶，一直到贏得台灣頭幾個手機ODM訂單、公司轉虧為盈、然後又陷入泥淖，從銀行團的的保留態度，到由花旗銀行主辦的十八家銀行簽約聯貸。現在想起這些往事，對花旗銀行一路鼎力相助，還是非常感激。<br />
<br />
　我記得簽約的那天，剛好是我五十歲生日，簽約後簡短致辭，想起一路走來的艱辛，我的心情頗為激動。當時，我為了穩定想出走的團隊，時常情緒低落，最為感傷的一次，是在某次核心幹部週會上，猛然發現在座的核心幹部，處長級以上約二十多人，每一個人都跟我提過辭呈，有的已是第二次、第三次，但都是被我用情義給挽留下來的。<br />
<br />
　一個不成功的公司，實在拿不出任何獎勵的辦法，而外面的誘惑又是那麼大，董事會的焦慮又是那麼明確，我只能一次一次畫出願景、濫用情義去挽留團隊。每天晚上回家，都不知明天又會有誰提出辭呈，生活步調也因此非常不正常。我曾在短短時間內胖五公斤，又於短短時間內瘦五公斤，一來一回十公斤，我的健康指數前所未有的不堪，大量透支我的體力與心力。<br />
<br />
我多次下班後直奔機場搭機飛赴北歐，隔天早上抵達法蘭克福機場，在機場洗個澡，轉機到客戶所在地點開會到中午，晚上又搭機返回台灣，在第三天晚上回到台灣。三天下來，連旅館都省了，就睡在機上；當時多事的公司讓我經常無法入睡，所以就養成了看書的習慣；根據我的記錄，在那六年裏，平均每個星期看完一本書。這樣子燃燒自己的結果，我終於在公司狀況大致差強人意的二○○三年十一月離開光寶。<br />
<br />
離開光寶後一年多的日子裏，六年來的點點滴滴漸漸沉澱，我每天早上出去快走三到五公里，一面思考台灣電子製造業的困境、挑戰與特殊的企業文化，一面試著將過去六年累積的經驗、背後的結構性意義，用簡單的語言及適切的比喻勾勒出來，嘗試著將台灣電子製造業的競爭力放在全球的架構下，用比較長的時間軸及略帶歷史觀的角度，去檢討台灣電子製造業的時代意義、未來走向、及危機。<br />
<br />
剛好在此時，《電子時報》的資深記者陳慧玲小姐來電詢問我是否願意幫《電子時報》寫個專欄，大約二個星期一篇，當下我一口就答應了她。從二○○三年十月底開始，平均二個星期一篇，我一面寫、一面整理雜亂的思緒，有的時候一些很強烈的圖像、語言，會在我早上快走時突然冒出來，讓我享受片刻的創意快感，用「蒼狼」來比喻台灣的電子製造業，就是一個例子。<br />
<br />
蒼狼是蒙古草原的圖騰，大陸作家姜戎在其鉅作《狼圖騰》一書中，對蒼狼有很細緻的觀察，在他筆下蒼狼是嗜血的，抓住獵物絕不輕易鬆口，可在最惡劣的環境下，採用媲美孫子兵法的策略，配合上在稀疏的草叢中盯緊獵物一蹲十個小時的耐心，在最佳的時點迅速出手咬嚙目標，擁有草原上最高的機動性，幾千年來成為草原文化的催生推手，是老天爺賜給草原的老師。由此訓練出的勁旅，讓文盲的成吉思汗，帶領一批文盲的草原大軍，征服中亞、西亞，征服了幾個世紀的歐洲。過去六年來的電子製造業，就好像是一匹蒼狼，充滿了活力、耐力、爆發力，咬定一個獵物就絕不鬆口，直到全然吞噬入腹，草原上沒有其他的動物可與其匹敵。<br />
<br />
今天的電子製造業，由早期的各種板卡、modem、PC、notebook PC、monitor、scanner、mouse、keyboard、video card、WLAN一樣樣吃下去，而且吃到見骨、沒有敵手，有些項目市佔率高達八○％。更可怕的是，牠在草原上不斷尋找新的獵物，手機、IC設計、面板、數位電視、汽車電子用品，哪一樣能夠逃得過牠銳利冷峻的眼神？<br />
<br />
姜戎先生在《狼圖騰》一書中提到，有一次在草原上埋伏半天，遠遠的土丘背後、茅草叢中，隱約可見一匹狼，於是拿起望遠鏡望過去，赫然發現遠方的蒼狼竟然兩眼冷森森地望著他，不知已被牠盯上多久了，當下覺得渾身毛骨悚然。 <br />
<br />
今天的電子製造業漸漸形成國際級的規模，渴求成長的本能，使得牠冷森森地盯著每一項可能的新產品，耐心地等著機會的來臨。而在草原上趾高氣昂的動物，如馬，風馳電掣不可一世，就如同今天的國際買主Dell、HP、IBM、Nokia、Motorola等等，然而潛伏在茅草叢中的蒼狼，其冷森森的眼光不只盯著肥美的羊兒，牠也貪婪地盯著這些高頭大馬。<br />
<br />
姜戎先生在書中提到草原上的狼，靜靜地蹲伏近十小時，耐心地等著雄馬吃足了草、喝飽了水，才突然出現發動攻擊，驚惶的馬群迅速集結成隊，然而吃飽喝足的高頭大馬因為重量而失去速度，很快就被狼追上，但身驅遠比馬小的狼如何吞得下、咬得住馬呢？姜戎描繪了一幅自然界最殘酷的畫面，狼漸漸追上馬，突然一躍而起咬住馬腹，大口撕咬，吃飽喝足的馬，此時肚腹膨脹、撐得肚皮薄薄的，狼一口撕咬下去，血水與草料從肚腹的破口傾洩而出，但馬兒還是狂奔不止，然後傾洩而出的血水與草料將腸胃內臟都跟著帶出來，此時依然狂奔的馬兒拖曳著自己的腸胃內臟，轟然一聲就倒下去了。<br />
<br />
電子製造業是國際科技草原上崛起的蒼狼，趾高氣昂的快馬就是那些國際品牌大廠，蒼狼耐心地等著機會，會否有那麼一天，蒼狼一躍而起咬住快馬的肚腹，掌握近八○％的筆記型電腦出貨量的蒼狼，會怎麼吞噬手握訂單、趾高氣昂的快馬呢？<br />
<br />
就像這樣，我一篇篇的寫，編織著我對電子製造業的幻想，同時批判它所帶來的粗俗副文化，擔心它的接班問題，嘲弄著它的洋名洋氣，以及它有形無形自認為乃折衝美、日、歐和中國之間的「買辦」價值觀等等，一寫就是一年又六個月，數一數也超過十萬字了。<br />
<br />
一年多以來，我漸漸聽到一些讀者的回應，一開始大多是透過陳慧玲小姐間接轉述而來，漸漸地反應越來越多，直到每次同業聚餐或開會，一群人中，總會碰到一、二個讀過這些專欄文章的人士。在陳慧玲小姐的鼓勵下，財訊出版社表示高度興趣將之集結出書，我亦覺得這些文字，如果能讓更多人看到，能激發一些共鳴、討論，甚至影響一些人的觀念，進而對產業走向貢獻點滴，未嘗不是件好事。而當這些文章集結在一起，略為修改成一本書的形式，我還是相當驚訝，我那來那麼多的牢騷，竟然可以多到集結成書了！<br />
<br />
我想，如果不是陳慧玲小姐起的頭，加上她每個星期來電，有意無意的暗示下個禮拜是否有產出，到最後，並串聯我的秘書周瑞明小姐就近監督，我也無法持續不斷地寫下去，故在此要特別感謝她們兩位。當然，不能免俗的，我也必須強調一切文責自負，在沒有時間細查資料的狀態下寫出的文字，有些錯引誤用是難免的。<br />
<br />
最後，藉此機會感謝我的太太及三個女兒，過去七、八年來對我放任式的信任，或許妳們也很喜歡一個不常在家囉唆的丈夫及爸爸吧！<br />

		<a class="acontinues" href="http://blog.roodo.com/kelvins/archives/276582.html">(繼續閱讀...)</a>
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/kelvins/archives/276582.html</link>
	<guid>http://blog.roodo.com/kelvins/archives/276582.html</guid>
	<category>參考文章</category>
	<pubDate>Sun, 17 Jul 2005 10:52:37 +0800</pubDate>
</item>
<item>
	<title>Steve Jobs對2005年史丹佛畢業生演講</title>
	<description><![CDATA[
			以下是蘋果電腦公司與Pixar動畫製作室執行長SteveJobs在2005年
六月12日對全體史丹佛大學畢業生的演講內容。
 ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
  'You've got to find what you love,' Jobs says

  今天，有榮幸來到各位從世界上最好的學校之一畢業的畢業典禮上。我從來沒從大學畢業。說實話，這是我離大學畢業最近的一刻。今天，我只說三個故事，不談大道理，

  三個故事就好。

  第一個故事，是關於人生中的點點滴滴怎麼串連在一起。

  我在里德學院（Reedcollege）待了六個月就辦休學了。到我退學
前，一共休學了十八個月。那麼，我為什麼休學？

  這得從我出生前講起。我的親生母親當時是個研究生，年輕未婚媽媽，她決定讓別人收養我。她強烈覺得應該讓有大學畢業的人收養我，所以我出生時，她就準備讓我被一對律師夫婦收養。但是這對夫妻到了最後一刻反悔了，他們想收養女孩。所以在等待收養名單上的一對夫妻，我的養父母，在一天半夜裡接到一通電話，問他們「有一名意外出生的男孩，你們要認養他嗎？」而他們的回答是「當然要」。後來，我的生母發現，我現在的媽媽從來沒有大學畢業，我現在的爸爸則連高中畢業也沒有。她拒絕在認養文件上做最後簽字。直到幾個月後，我的養父母同意將來一定會讓我上大學，她才軟化態度。

  十七年後，我上大學了。但是當時我無知選了一所學費幾乎跟史丹佛一樣貴的大學，我那工人階級的父母所有積蓄都花在我的學費上。六個月後，我看不出唸這個書的價值何在。那時候，我不知道這輩子要幹什麼，也不知道唸大學能對我有什麼幫助，而且我為了唸這個書，花光了我父母這輩子的所有積蓄，所以我決定休學，相信船到橋頭自然直。

  當時這個決定看來相當可怕，可是現在看來，那是我這輩子做過最好的決定之一。當我休學之後，我再也不用上我沒興趣的必修課，把時間拿去聽那些我有興趣的課。

  這一點也不浪漫。我沒有宿舍，所以我睡在友人家裡的地板上，靠著回收可樂空罐的五先令退費買吃的，每個星期天晚上得走七哩的路繞過大半個鎮去印度教的HareKrishna神廟吃頓好料。我喜歡HareKrishna神廟的好料。追尋我的好奇與直覺，我所駐足的大部分事物，後來看來都成了無價之寶。舉例來說：

  當時里德學院有著大概是全國最好的書法指導。在整個校園內的每一張海報上，每個抽屜的標籤上，都是美麗的手寫字。因為我休學了，可以不照正常選課程序來，所以我跑去學書法。我學了serif與sanserif字體，學到在不同字母組合間變更字間距，學到活版印刷偉大的地方。書法的美好、歷史感與藝術感是科學所無法捕捉的，我覺得那很迷人。

  我沒預期過學的這些東西能在我生活中起些什麼實際作用，不過十年後，當我在設計第一台麥金塔時，我想起了當時所學的東西，所以把這些東西都設計進了麥金塔裡，這是第一台能印刷出漂亮東西的電腦。如果我沒沉溺於那樣一門課裡，麥金塔可能就不會有 多重字體跟變間距字體了。又因為Windows抄襲了麥金塔的使用方式，如果當年我沒 
這樣做，大概世界上所有的個人電腦都不會有這些東西，印不出現在我們看到的漂亮的字來了。當然，當我還在大學裡時，不可能把這些點點滴滴預先串在一起，但是這在十年後回顧，就顯得非常清楚。

  我再說一次，你不能預先把點點滴滴串在一起；唯有未來回顧時，你才會明白那些點點滴滴是如何串在一起的。所以你得相信，你現在所體會的東西，將來多少會連接在一塊。你得信任某個東西，直覺也好，命運也好，生命也好，或者業力。這種作法從來沒讓我失望，也讓我的人生整個不同起來。

  我的第二個故事，有關愛與失去。

  我好運－年輕時就發現自己愛做什麼事。我二十歲時，跟SteveWozniak在我爸媽的車庫裡開始了蘋果電腦的事業。我們拼命工作，蘋果電腦在十年間從一間車庫裡的兩個小夥子擴展成了一家員工超過四千人、市價二十億美金的公司，在那之前一年推出了我們最棒的作品－麥金塔，而我才剛邁入人生的第三十個年頭，然後被炒魷魚。要怎麼讓自己創辦的公司炒自己魷魚？好吧，當蘋果電腦成長後，我請了一個我以為他在經營公司上很有才幹的傢伙來，他在頭幾年也確實幹得不錯。可是我們對未來的願景不同，最後只好分道揚鑣，董事會站在他那邊，炒了我魷魚，公開把我請了出去。曾經是我整個成年生活重心的東西不見了，令我不知所措。

  有幾個月，我實在不知道要幹什麼好。我覺得我令企業界的前輩們失望－我把他們交給我的接力棒弄丟了。我見了創辦HP的David Packard跟創辦Intel的BobNoyce，跟他們說我很抱歉把事情搞砸得 
很厲害了。我成了公眾的非常負面示範，我甚至想要離開矽谷。但是漸漸的，我發現，我還是喜愛著我做過的事情，在蘋果的日子經歷的事件沒有絲毫改變我愛做的事。我被否定了，可是我還是愛做那些事情，所以我決定從頭來過。

  當時我沒發現，但是現在看來，被蘋果電腦開除，是我所經歷過最好的事情。成功的沉重被從頭來過的輕鬆所取代，每件事情都不那麼確定，讓我自由進入這輩子最有創意的年代。

  接下來五年，我開了一家叫做NeXT的公司，又開一家叫做Pixar的
公司，也跟後來的老婆談起了戀愛。Pixar接著製作了世界上第一部全
電腦動畫電影，玩具總動員，現在是世界上最成功的動畫製作公司。
然後，蘋果電腦買下了NeXT，我回到了蘋果，我們在NeXT發展的技術
成了蘋果電腦後來復興的核心。我也有了個美妙的家庭。

  我很確定，如果當年蘋果電腦沒開除我，就不會發生這些事情。這帖藥很苦口，可是我想蘋果電腦這個病人需要這帖藥。有時候，人生會用磚頭打你的頭。不要喪失信心。

  我確信，我愛我所做的事情，這就是這些年來讓我繼續走下去的唯一理由。你得找出你愛的，工作上是如此，對情人也是如此。你的工作將填滿你的一大塊人生，唯一獲得真正滿足的方法就是做你相信是偉大的工作，而唯一做偉大工作的方法是愛你所做的事。如果你還沒找到這些事，繼續找，別停頓。盡你全心全力，你知道你一定會找到。而且，如同任何偉大的關係，事情只會隨著時間愈來愈好。所以，在你找到之前，繼續找，別停頓。

  我的第三個故事，關於死亡。

  當我十七歲時，我讀到一則格言，好像是「把每一天都當成生命中的最後一天，你就會輕鬆自在。」這對我影響深遠，在過去33年裡，我每天早上都會照鏡子，自問：「如果今天是此生最後一日，我今天要幹些什麼？」每當我連續太多天都得到一個「沒事做」的答案時，我就知道我必須有所變革了。提醒自己快死了，是我在人生中下重大決定時，所用過最重要的工具。因為幾乎每件事－所有外界期望、所有名譽、所有對困窘或失敗的恐懼－在面對死亡時，都消失了，

  只有最重要的東西才會留下。提醒自己快死了，是我所知避免掉入自己有東西要失去了的陷阱裡最好的方法。人生不帶來，死不帶去，沒什麼道理不順心而為。

  一年前，我被診斷出癌症。我在早上七點半作斷層掃描，在胰臟清楚出現一個腫瘤，我連胰臟是什麼都不知道。醫生告訴我，那幾乎可以確定是一種不治之症，我大概活不到三到六個月了。醫生建議我回家，好好跟親人們聚一聚，這是醫生對臨終病人的標準建議。那代表你得試著在幾個月內把你將來十年想跟小孩講的話講完。那代表你得把每件事情搞定，家人才會盡量輕鬆。那代表你得跟人說再見了。

  我整天想著那個診斷結果，那天晚上做了一次切片，從喉嚨伸入一個內視鏡，從胃進腸子，插了根針進胰臟，取了一些腫瘤細胞出來。我打了鎮靜劑，不醒人事，但是我老婆在場。她後來跟我說，當醫生們用顯微鏡看過那些細胞後，他們都哭了，因為那是非常少見的一種胰臟癌，可以用手術治好。所以我接受了手術，康復了。

  這是我最接近死亡的時候，我希望那會繼續是未來幾十年內最接近
的一次。經歷此事後，我可以比之前死亡只是抽象概念時要更肯定告訴你們下面這
些：

  沒有人想死。即使那些想上天堂的人，也想活著上天堂。但是死亡是我們共有的目的地，沒有人逃得過。這是註定的，因為死亡簡直就是生命中最棒的發明，是生命變化的媒介，送走老人們，給新生代留下空間。現在你們是新生代，但是不久的將來，你們也會逐漸變老，被送出人生的舞台。抱歉講得這麼戲劇化，但是這是真的。

  你們的時間有限，所以不要浪費時間活在別人的生活裡。不要被信條所惑－盲從信條就是活在別人思考結果裡。不要讓別人的意見淹沒了你內在的心聲。最重要的，擁有跟隨內心與直覺的勇氣，你的內心與直覺多少已經知道你真正想要成為什麼樣的人。任何其他事物都是次要的。

  在我年輕時，有本神奇的雜誌叫做 Whole EarthCatalog，當年我們很迷這本雜誌。那是一位住在離這不遠的Menlo Park的StewartBrand發行的，他把雜誌辦得很有詩意。那是1960年代末 
期，個人電腦跟桌上出版還沒發明，所有內容都是打字機、剪刀跟拍立 得相機做出來的。雜誌內容有點像印在紙上的Google，在Google出現之前35年就有了：理想化，充滿新奇工具與神奇的註記。

  Stewart跟他的出版團隊出了好幾期Whole EarthCatalog，然後出了停刊號。當時是1970年代中期，我正是你們現在這個年齡的時候。在停刊號的封底，有張早晨鄉間小路 的照片，那種你去爬山時會經過的鄉間小 
路。在照片下有行小字：

  求知若飢，虛心若愚。

  那是他們親筆寫下的告別訊息，我總是以此自許。當你們畢業，展
開新生活，我也以此期許你們。

  求知若飢，虛心若愚。

  非常謝謝大家。

******************************************************************************************
******************************************************************************************

		]]>
	</description>
	<content:encoded><![CDATA[
			以下是蘋果電腦公司與Pixar動畫製作室執行長SteveJobs在2005年<br />
六月12日對全體史丹佛大學畢業生的演講內容。<br />
 ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
  'You've got to find what you love,' Jobs says<br />
<br />
  今天，有榮幸來到各位從世界上最好的學校之一畢業的畢業典禮上。我從來沒從大學畢業。說實話，這是我離大學畢業最近的一刻。今天，我只說三個故事，不談大道理，<br />
<br />
  三個故事就好。<br />
<br />
  <b>第一個故事</b>，是關於人生中的點點滴滴怎麼串連在一起。<br />
<br />
  我在里德學院（Reedcollege）待了六個月就辦休學了。到我退學<br />
前，一共休學了十八個月。那麼，我為什麼休學？<br />
<br />
  這得從我出生前講起。我的親生母親當時是個研究生，年輕未婚媽媽，她決定讓別人收養我。她強烈覺得應該讓有大學畢業的人收養我，所以我出生時，她就準備讓我被一對律師夫婦收養。但是這對夫妻到了最後一刻反悔了，他們想收養女孩。所以在等待收養名單上的一對夫妻，我的養父母，在一天半夜裡接到一通電話，問他們「有一名意外出生的男孩，你們要認養他嗎？」而他們的回答是「當然要」。後來，我的生母發現，我現在的媽媽從來沒有大學畢業，我現在的爸爸則連高中畢業也沒有。她拒絕在認養文件上做最後簽字。直到幾個月後，我的養父母同意將來一定會讓我上大學，她才軟化態度。<br />
<br />
  十七年後，我上大學了。但是當時我無知選了一所學費幾乎跟史丹佛一樣貴的大學，我那工人階級的父母所有積蓄都花在我的學費上。六個月後，我看不出唸這個書的價值何在。那時候，我不知道這輩子要幹什麼，也不知道唸大學能對我有什麼幫助，而且我為了唸這個書，花光了我父母這輩子的所有積蓄，所以我決定休學，相信船到橋頭自然直。<br />
<br />
  當時這個決定看來相當可怕，可是現在看來，那是我這輩子做過最好的決定之一。當我休學之後，我再也不用上我沒興趣的必修課，把時間拿去聽那些我有興趣的課。<br />
<br />
  這一點也不浪漫。我沒有宿舍，所以我睡在友人家裡的地板上，靠著回收可樂空罐的五先令退費買吃的，每個星期天晚上得走七哩的路繞過大半個鎮去印度教的HareKrishna神廟吃頓好料。我喜歡HareKrishna神廟的好料。追尋我的好奇與直覺，我所駐足的大部分事物，後來看來都成了無價之寶。舉例來說：<br />
<br />
  當時里德學院有著大概是全國最好的書法指導。在整個校園內的每一張海報上，每個抽屜的標籤上，都是美麗的手寫字。因為我休學了，可以不照正常選課程序來，所以我跑去學書法。我學了serif與sanserif字體，學到在不同字母組合間變更字間距，學到活版印刷偉大的地方。書法的美好、歷史感與藝術感是科學所無法捕捉的，我覺得那很迷人。<br />
<br />
  我沒預期過學的這些東西能在我生活中起些什麼實際作用，不過十年後，當我在設計第一台麥金塔時，我想起了當時所學的東西，所以把這些東西都設計進了麥金塔裡，這是第一台能印刷出漂亮東西的電腦。如果我沒沉溺於那樣一門課裡，麥金塔可能就不會有 多重字體跟變間距字體了。又因為Windows抄襲了麥金塔的使用方式，如果當年我沒 <br />
這樣做，大概世界上所有的個人電腦都不會有這些東西，印不出現在我們看到的漂亮的字來了。當然，當我還在大學裡時，不可能把這些點點滴滴預先串在一起，但是這在十年後回顧，就顯得非常清楚。<br />
<br />
  我再說一次，你不能預先把點點滴滴串在一起；唯有未來回顧時，你才會明白那些點點滴滴是如何串在一起的。所以你得相信，你現在所體會的東西，將來多少會連接在一塊。你得信任某個東西，直覺也好，命運也好，生命也好，或者業力。這種作法從來沒讓我失望，也讓我的人生整個不同起來。<br />
<br />
  <b>我的第二個故事</b>，有關愛與失去。<br />
<br />
  我好運－年輕時就發現自己愛做什麼事。我二十歲時，跟SteveWozniak在我爸媽的車庫裡開始了蘋果電腦的事業。我們拼命工作，蘋果電腦在十年間從一間車庫裡的兩個小夥子擴展成了一家員工超過四千人、市價二十億美金的公司，在那之前一年推出了我們最棒的作品－麥金塔，而我才剛邁入人生的第三十個年頭，然後被炒魷魚。要怎麼讓自己創辦的公司炒自己魷魚？好吧，當蘋果電腦成長後，我請了一個我以為他在經營公司上很有才幹的傢伙來，他在頭幾年也確實幹得不錯。可是我們對未來的願景不同，最後只好分道揚鑣，董事會站在他那邊，炒了我魷魚，公開把我請了出去。曾經是我整個成年生活重心的東西不見了，令我不知所措。<br />
<br />
  有幾個月，我實在不知道要幹什麼好。我覺得我令企業界的前輩們失望－我把他們交給我的接力棒弄丟了。我見了創辦HP的David Packard跟創辦Intel的BobNoyce，跟他們說我很抱歉把事情搞砸得 <br />
很厲害了。我成了公眾的非常負面示範，我甚至想要離開矽谷。但是漸漸的，我發現，我還是喜愛著我做過的事情，在蘋果的日子經歷的事件沒有絲毫改變我愛做的事。我被否定了，可是我還是愛做那些事情，所以我決定從頭來過。<br />
<br />
  當時我沒發現，但是現在看來，被蘋果電腦開除，是我所經歷過最好的事情。成功的沉重被從頭來過的輕鬆所取代，每件事情都不那麼確定，讓我自由進入這輩子最有創意的年代。<br />
<br />
  接下來五年，我開了一家叫做NeXT的公司，又開一家叫做Pixar的<br />
公司，也跟後來的老婆談起了戀愛。Pixar接著製作了世界上第一部全<br />
電腦動畫電影，玩具總動員，現在是世界上最成功的動畫製作公司。<br />
然後，蘋果電腦買下了NeXT，我回到了蘋果，我們在NeXT發展的技術<br />
成了蘋果電腦後來復興的核心。我也有了個美妙的家庭。<br />
<br />
  我很確定，如果當年蘋果電腦沒開除我，就不會發生這些事情。這帖藥很苦口，可是我想蘋果電腦這個病人需要這帖藥。有時候，人生會用磚頭打你的頭。不要喪失信心。<br />
<br />
  我確信，我愛我所做的事情，這就是這些年來讓我繼續走下去的唯一理由。你得找出你愛的，工作上是如此，對情人也是如此。你的工作將填滿你的一大塊人生，唯一獲得真正滿足的方法就是做你相信是偉大的工作，而唯一做偉大工作的方法是愛你所做的事。如果你還沒找到這些事，繼續找，別停頓。盡你全心全力，你知道你一定會找到。而且，如同任何偉大的關係，事情只會隨著時間愈來愈好。所以，在你找到之前，繼續找，別停頓。<br />
<br />
  <b>我的第三個故事</b>，關於死亡。<br />
<br />
  當我十七歲時，我讀到一則格言，好像是「把每一天都當成生命中的最後一天，你就會輕鬆自在。」這對我影響深遠，在過去33年裡，我每天早上都會照鏡子，自問：「如果今天是此生最後一日，我今天要幹些什麼？」每當我連續太多天都得到一個「沒事做」的答案時，我就知道我必須有所變革了。提醒自己快死了，是我在人生中下重大決定時，所用過最重要的工具。因為幾乎每件事－所有外界期望、所有名譽、所有對困窘或失敗的恐懼－在面對死亡時，都消失了，<br />
<br />
  只有最重要的東西才會留下。提醒自己快死了，是我所知避免掉入自己有東西要失去了的陷阱裡最好的方法。人生不帶來，死不帶去，沒什麼道理不順心而為。<br />
<br />
  一年前，我被診斷出癌症。我在早上七點半作斷層掃描，在胰臟清楚出現一個腫瘤，我連胰臟是什麼都不知道。醫生告訴我，那幾乎可以確定是一種不治之症，我大概活不到三到六個月了。醫生建議我回家，好好跟親人們聚一聚，這是醫生對臨終病人的標準建議。那代表你得試著在幾個月內把你將來十年想跟小孩講的話講完。那代表你得把每件事情搞定，家人才會盡量輕鬆。那代表你得跟人說再見了。<br />
<br />
  我整天想著那個診斷結果，那天晚上做了一次切片，從喉嚨伸入一個內視鏡，從胃進腸子，插了根針進胰臟，取了一些腫瘤細胞出來。我打了鎮靜劑，不醒人事，但是我老婆在場。她後來跟我說，當醫生們用顯微鏡看過那些細胞後，他們都哭了，因為那是非常少見的一種胰臟癌，可以用手術治好。所以我接受了手術，康復了。<br />
<br />
  這是我最接近死亡的時候，我希望那會繼續是未來幾十年內最接近<br />
的一次。經歷此事後，我可以比之前死亡只是抽象概念時要更肯定告訴你們下面這<br />
些：<br />
<br />
  沒有人想死。即使那些想上天堂的人，也想活著上天堂。但是死亡是我們共有的目的地，沒有人逃得過。這是註定的，因為死亡簡直就是生命中最棒的發明，是生命變化的媒介，送走老人們，給新生代留下空間。現在你們是新生代，但是不久的將來，你們也會逐漸變老，被送出人生的舞台。抱歉講得這麼戲劇化，但是這是真的。<br />
<br />
  你們的時間有限，所以不要浪費時間活在別人的生活裡。不要被信條所惑－盲從信條就是活在別人思考結果裡。不要讓別人的意見淹沒了你內在的心聲。最重要的，擁有跟隨內心與直覺的勇氣，你的內心與直覺多少已經知道你真正想要成為什麼樣的人。任何其他事物都是次要的。<br />
<br />
  在我年輕時，有本神奇的雜誌叫做 Whole EarthCatalog，當年我們很迷這本雜誌。那是一位住在離這不遠的Menlo Park的StewartBrand發行的，他把雜誌辦得很有詩意。那是1960年代末 <br />
期，個人電腦跟桌上出版還沒發明，所有內容都是打字機、剪刀跟拍立 得相機做出來的。雜誌內容有點像印在紙上的Google，在Google出現之前35年就有了：理想化，充滿新奇工具與神奇的註記。<br />
<br />
  Stewart跟他的出版團隊出了好幾期Whole EarthCatalog，然後出了停刊號。當時是1970年代中期，我正是你們現在這個年齡的時候。在停刊號的封底，有張早晨鄉間小路 的照片，那種你去爬山時會經過的鄉間小 <br />
路。在照片下有行小字：<br />
<br />
  求知若飢，虛心若愚。<br />
<br />
  那是他們親筆寫下的告別訊息，我總是以此自許。當你們畢業，展<br />
開新生活，我也以此期許你們。<br />
<br />
  求知若飢，虛心若愚。<br />
<br />
  非常謝謝大家。<br />
<br />
******************************************************************************************<br />
******************************************************************************************<br />

		<a class="acontinues" href="http://blog.roodo.com/kelvins/archives/276516.html">(繼續閱讀...)</a>
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/kelvins/archives/276516.html</link>
	<guid>http://blog.roodo.com/kelvins/archives/276516.html</guid>
	<category>參考文章</category>
	<pubDate>Sun, 17 Jul 2005 09:54:02 +0800</pubDate>
</item>
<item>
	<title>tcl/tk 介紹</title>
	<description><![CDATA[
			◇ tcl/tk 介紹

大家好，
        一提到直譯語言，令人印象最深刻的，想必是BASIC了。沒錯，
　　　　BASIC 陪伴很多人進入PC的奇妙世界，甚至到今天，Visual
        Basic 在Windows 下依然魅力十足，把Interpretor 的優點發揮
        的淋淋盡致─程式發展快、方便易學。在UNIX的世界裡，Ｃ幾乎
        是程式語言的代名詞，BASIC 早已被人們所淡忘。但是，UNIX下
        是否有像BASIC 一般簡單易學，功能強大的解譯語言呢？答案是
        肯定的，而且功能皆有過之而無不及，舉凡lisp、prolog等人工
        智慧語言，或者像Perl、tcl/tk 皆是，而且都有提供方便的圖
        型界面，使得在X window下設計程式方便不少。以下文章就是在
        下寒假研究tcl/tk的心得，提供大家參考；並且強力推銷tcl。

******
一、什麼是tcl？什麼是tk？

        tcl 是Tool Command Language 的縮寫，而tk是一個X window的
        Tool Kits，是tcl在X Window System 的應用。tcl 是一種解譯
        語言，也是一套Ｃ的函式庫。為什麼這樣說呢？因為tcl 的解譯
        器被設計成一個Ｃ的函式庫，提供基本的命令與控制結構，並且
        使用tcl 的任何程式皆可以根據tcl 的規格撰寫Ｃ程式與之鏈結
        增加新的命令，以提高關鍵程式的效率、或增加新的特色。如tk
        就是這樣子的示範。廢話少說，以下先來個示範：

    ┌───────────────────────────────┐
    │  tk的解譯器叫wish，是WIndowing SHell 的簡稱。只要在提示號          │
    │  下（xterm 下）輸入wish就可以了。接下來你可以看到一個空白          │
    │  的視窗出現，xterm 下的提示號也變成了wish的提示號。此時，          │
    │  在提示號輸入以下兩行指令，就可以見到最簡單，最讓人驚奇的         │
    │  tk程式了：                                                                                                      │
    │          button .b1 -text "Hello,World!" -command exit                                 │
    │          pack .b1                                                                                                  │
    │  下完第二個指令後，原本空白的視窗就變成一個印有Hello,World        │
    │  的立體按鈕，而且滑鼠移近時會變成高亮度。但是別急，且慢按鍵     │
    │  在輸入兩個命令看看：                                                                                  │
    │                                                                                                                            │
    │      button .b2 -text "Hello,TCL/TK" -command "destroy .b2"  │
    │      pack .b2                                                │
    │                                                              │
    │  此時，螢幕上會出現第二個按鈕。以下兩個命令可以更改顏色：    │
    │          .b1 configure -background red                       │
    │          .b2 configure -foreground green                     │
    │  按下第二個按鈕會使第二個按鈕消失，而第一個按鈕會結束程式。  │
    │                                                              │
    │  每次這樣寫很麻煩，但是你也可以照UNIX的規矩把程式寫成一個檔  │
    │  案hello，再執行之。（ 當然要先chmod +x hello）              │
    │    hello的內容：（第一行的內容可由`which wish`指令得知）     │
    │           #!/usr/local/bin/wish -f                           │
    │           button .b -text "Hello,World!" -command exit       │
    │           pack .b                                            │
    └───────────────────────────────┘

  ＊註１：請查詢系統管理者詳細的路徑。
    註２：tcl/tk原始碼可以在NCTUCCCA:/X/contrib/下找到。
    註３：cc.ntu.edu.tw的使用者其wish的路徑為/remote/bin/wish
    註４：交談式的wish的命令行編輯非常原始，使用者可以用fep 或ile
          兩個front end 程式達到類似tcsh/bash/ksh 的行編輯。
    註５：Linux/386BSD的使用者（應該說XFree86的使用者）應該安裝時就有
          tcl/tk了。

二、關於tcl

        因為tk是基於tcl 語言而來的，因此我們有必要先了解tcl 。
        與tk相同，tcl 也附了一個交談式解譯器tclsh ，可供線上學習tcl之用。
        tcl 的語法非常簡單，基本上就是與Shell的語法類似。學過一點點shell
        programing的人非常容易進入狀況：

                A.一個tcl 程式是由好幾個tcl 敘述組成的。
                B.一個tcl 敘述與平常在shell 下面的命令一模一樣，如前面
                  hello,world 的例子一樣，第一個字是命令，剩下的全部是
                  該命令的參數。
                C.tcl 除了命令外就只有變數。變數與shell 變數一樣，只有
                  一種型別：字串。錢號可以取出變數的值。
                D.tcl 對每一個敘述最多只做一次變數代換。而被大括號括住
                  的部份不做任何處理。
                E.tcl 會優先執行被方括號括住的敘述，並將其結果當成原來
                  命令的一部份。這與shell 的重音符號相同（mkdir `echo Hello`）

       以下就是一些範例：

                unix% tclsh
                tcl% set x 100     輸出     100
                tcl% set y 200              200
                tcl% expr $x + $y           300
                tcl% set z [expr x+y]       300, z = 300
                tcl% set a [set b 100]      a = b = 100
                tcl% expr (3>4)||(6 0} {
                                set result [expr $result*$base]
                                set p [expr $p-1]
                        }
                        return $result
                }
                power 2 6         可得 64
                power 1.15 5           2.01136

            仔細觀察procedure的demo，其實tcl 並沒有procedure結構的語法。
            proc只是一個命令，接受４個引數：
                  proc 新命令名字  參數   一段tcl程式碼
            其中，參數與tcl程式碼用大括號括起來的原因是我們不希望tcl 現在
            就執行這些程式碼，而是當procedure被呼叫時才執行。while結構也是
            如此：
                  while 判斷 程式碼
            因為我們希望每次while執行時$result,$p的值都會變。如果不用大括號
            括起來，則所有的值在tcl解譯的時候就固定了，while迴圈永遠也不會
            結束。

            與大括號相反，eval命令可以把一個字串當成tcl 命令執行：
                   eval {set x 123}   等於   set x 123
                   eval "set x 123"          同上
            eval可以造成tcl 對同一敘述parse兩次，解決一些難纏的問題：
                   exec rm [glob *.o]
            會告訴你：
                   "a.o b.o c.o" not found
            正確的解法是叫tcl 再parse一遍命令行：
                   eval "exec rm [glob *.o]"

            tcl 的array：不須宣告，直接用即可，但是只有一維陣列而已。
                   set days_of_a_month(Jan) 31
                   set days_of_a_month(Fab) 28
            多維陣列可用單維陣列模擬：
                   set matrix(1,1)  100
                   set matrix(3,9)  50
                   set matrix($x,$y) 66
                   set z $matrix(6,6) 77

                陣列的index其實為 "1,1" 、 "3,9" 與 "$x,$y"

            相關的命令:
               set  var value
               append var value [value2 vaule3 ...]
               incr var [increament]       /* default = 1 */
               unset var [var2 var3 ...]

            tcl 還有一種之料結構叫list

                   set x {Sun Mon Tue Wed Thu Fri Sat}
                   lindex $x 1     輸出 Mon
                   lindex {a b {c d e} f g} 2 輸出 "c d e"
                   concat {a b} {c d} e       輸出 "a b c d e"
                   list {a b} {c d} e              "{a b} {c d} e"
                   llength { {a b} e f}            3
                   llength {}                      0
                   llength a                       1
                   linsert $x 2 a b c              Sun Mon a b c Tue ...
                   linsert $x 0 a                  a Sun Mon ...
                   lreplace $x 0 a                 a Mon Tue ...
                   lrange $x 0 1                   Sun Mon
                   lappend $x a b c
                   lsearch $x Sat
                   lsearch -glob $x S*  /* Wild Cards */
                   lsearch -regexp      /* regular expression */
                   lsort [-decreasing|-integer] $x
             Strings & Lists
                   set x a/b/c
                   set y /usr/local/bin/wish
                   split $x /             輸出  a b c
                   split y                     {} usr local bin wish
                   反函數為join
             Lists & Commands:
                   其實tcl 語言本身就是一個list，瞧，最後一個是command或是
                   list：
                       button .b -text "Reset" -command {set x 0}

               list可以解決一些難以構成的命令：
                   假設有一個情況，我們寫了下列命令：
                       button .b -text "Reset" -command "set x $InitValue"
                   此命令的情況是我們希望Reset button按下後把 x設回
                   InitValue，可是天不從人願，如果$InitValue是"tcl tk"
                   則Command變成set x tcl tk，引述個數不對了。
                   如果改成：
                       button .b -text "Reset" -command {set x $InitValue}
                   則x 值取決於按鈕時的InitValue，而非真正的InitValue
                   所以可用下列方法解決：
                     button .b -text "Reset" -command [list set x $initValue]

         控制結構：
                 if 判斷 [then] 敘述 elseif 敘述 elseif 敘述 [else] 敘述
                    then 與else 皆可省略。
                 while :      (make b the reverse of a)
                      set b ""
                      set i [expr [llength $a] -1]
                      while {$i >= 0} {
                           lappend b [lindex $a $i]
                           incr i -1
                      }

                 for:
                      set b ""
                      for {set i [expr [llength $a] -1]} {$i >=0} {incr i -1} {
                                lappend b [lindex $a $i]
                      }

                 foreach:
                      set b ""
                      foreach i $a {
                             set b [linset $b 0 $i]
                      }

                 注意，受限於tcl 語法，大括號不能獨立一行：
                     while {}
                     {
                     }
                 break與continue也都有效。
                 switch命令：
                     switch $x {
                          Mon  {incr days(Mon)}
                          Tue  {incr days(Tue)}
                          default {...}
                     }
                  亦可寫成：
                     switch $x Mon {...} Tue {...} default {...}
                  或
                     switch $x \
                        Mon {...} \
                        Tue {...} \
                        default {...}
                  如果動作相同可用 - 代表。
                     switch $x {
                         1 -
                         3 -
                         5 -
                         7 -
                         9 {incr odd}
                         default {incr even}
                      }
         副程式：
               同csh,tcl也有source 命令:
                        source tclInit.tcl
               procedure:
                        proc name ArgList Body
                           定義一個叫做name 的procedure，
                           如果ArgList的最後一個為args，則此procedure
                           為不定引數函數，而args為一list。
                        global name1 name2 ...
                           使用global中的name1 name2變數，而非自定local變數
                        return value
                        uplevel [level] script1 script2...
                           類似inline函式，把stript1 script2 ...串起來
                           然後在上一層中執行，而非在procedure自己的stack
                           內執行(可以更改上一層的變數)。
                        upvar [level] name localname [name1 localname1] ...
                           引用上一層的變數name，但是在本procedure內用
                           localname存取之。(call by reference)
                 uplevel例:
                       proc do {varName first last body} {
                           upvar $varName v
                           for {set v $first} {$v  0} {
                set result [expr $result*$base]
                incr p -1
        }
        return $result
}
entry .base -width 6 -relief suken -textvariable base
label .label1 -text "to the power"
entry .power -width 6 -relief sunken -textvariable power
label .label2 -text "is"
label .result -textvariable result
pack .base .label1 .power .label2 .result -side left -padx 1m -pady 2m
bind .base  {set result [power $base $power]}
bind .power  {set result [power $base $power]}
# End of File

註： -relief sunken的意思是凹陷的輪廓。

      本程式產生一個視窗：
     ┌──────────────────────────┐
     │〔   Ａ   〕to the power 〔   Ｂ  〕 is 〔        〕│
     └──────────────────────────┘
      只要輸入Ａ，Ｂ就可以得到Ａ的Ｂ次方。

#!/usr/local/bin/wish -f
set id 0
entry .entry -width 30 -relief sunken -textvariable cmd
pack .entry -padx 1m -pady 1m   
		]]>
	</description>
	<content:encoded><![CDATA[
			◇ tcl/tk 介紹<br />
<br />
大家好，<br />
        一提到直譯語言，令人印象最深刻的，想必是BASIC了。沒錯，<br />
　　　　BASIC 陪伴很多人進入PC的奇妙世界，甚至到今天，Visual<br />
        Basic 在Windows 下依然魅力十足，把Interpretor 的優點發揮<br />
        的淋淋盡致─程式發展快、方便易學。在UNIX的世界裡，Ｃ幾乎<br />
        是程式語言的代名詞，BASIC 早已被人們所淡忘。但是，UNIX下<br />
        是否有像BASIC 一般簡單易學，功能強大的解譯語言呢？答案是<br />
        肯定的，而且功能皆有過之而無不及，舉凡lisp、prolog等人工<br />
        智慧語言，或者像Perl、tcl/tk 皆是，而且都有提供方便的圖<br />
        型界面，使得在X window下設計程式方便不少。以下文章就是在<br />
        下寒假研究tcl/tk的心得，提供大家參考；並且強力推銷tcl。<br />
<br />
******<br />
一、什麼是tcl？什麼是tk？<br />
<br />
        tcl 是Tool Command Language 的縮寫，而tk是一個X window的<br />
        Tool Kits，是tcl在X Window System 的應用。tcl 是一種解譯<br />
        語言，也是一套Ｃ的函式庫。為什麼這樣說呢？因為tcl 的解譯<br />
        器被設計成一個Ｃ的函式庫，提供基本的命令與控制結構，並且<br />
        使用tcl 的任何程式皆可以根據tcl 的規格撰寫Ｃ程式與之鏈結<br />
        增加新的命令，以提高關鍵程式的效率、或增加新的特色。如tk<br />
        就是這樣子的示範。廢話少說，以下先來個示範：<br />
<br />
    ┌───────────────────────────────┐<br />
    │  tk的解譯器叫wish，是WIndowing SHell 的簡稱。只要在提示號          │<br />
    │  下（xterm 下）輸入wish就可以了。接下來你可以看到一個空白          │<br />
    │  的視窗出現，xterm 下的提示號也變成了wish的提示號。此時，          │<br />
    │  在提示號輸入以下兩行指令，就可以見到最簡單，最讓人驚奇的         │<br />
    │  tk程式了：                                                                                                      │<br />
    │          button .b1 -text "Hello,World!" -command exit                                 │<br />
    │          pack .b1                                                                                                  │<br />
    │  下完第二個指令後，原本空白的視窗就變成一個印有Hello,World        │<br />
    │  的立體按鈕，而且滑鼠移近時會變成高亮度。但是別急，且慢按鍵     │<br />
    │  在輸入兩個命令看看：                                                                                  │<br />
    │                                                                                                                            │<br />
    │      button .b2 -text "Hello,TCL/TK" -command "destroy .b2"  │<br />
    │      pack .b2                                                │<br />
    │                                                              │<br />
    │  此時，螢幕上會出現第二個按鈕。以下兩個命令可以更改顏色：    │<br />
    │          .b1 configure -background red                       │<br />
    │          .b2 configure -foreground green                     │<br />
    │  按下第二個按鈕會使第二個按鈕消失，而第一個按鈕會結束程式。  │<br />
    │                                                              │<br />
    │  每次這樣寫很麻煩，但是你也可以照UNIX的規矩把程式寫成一個檔  │<br />
    │  案hello，再執行之。（ 當然要先chmod +x hello）              │<br />
    │    hello的內容：（第一行的內容可由`which wish`指令得知）     │<br />
    │           #!/usr/local/bin/wish -f                           │<br />
    │           button .b -text "Hello,World!" -command exit       │<br />
    │           pack .b                                            │<br />
    └───────────────────────────────┘<br />
<br />
  ＊註１：請查詢系統管理者詳細的路徑。<br />
    註２：tcl/tk原始碼可以在NCTUCCCA:/X/contrib/下找到。<br />
    註３：cc.ntu.edu.tw的使用者其wish的路徑為/remote/bin/wish<br />
    註４：交談式的wish的命令行編輯非常原始，使用者可以用fep 或ile<br />
          兩個front end 程式達到類似tcsh/bash/ksh 的行編輯。<br />
    註５：Linux/386BSD的使用者（應該說XFree86的使用者）應該安裝時就有<br />
          tcl/tk了。<br />
<br />
二、關於tcl<br />
<br />
        因為tk是基於tcl 語言而來的，因此我們有必要先了解tcl 。<br />
        與tk相同，tcl 也附了一個交談式解譯器tclsh ，可供線上學習tcl之用。<br />
        tcl 的語法非常簡單，基本上就是與Shell的語法類似。學過一點點shell<br />
        programing的人非常容易進入狀況：<br />
<br />
                A.一個tcl 程式是由好幾個tcl 敘述組成的。<br />
                B.一個tcl 敘述與平常在shell 下面的命令一模一樣，如前面<br />
                  hello,world 的例子一樣，第一個字是命令，剩下的全部是<br />
                  該命令的參數。<br />
                C.tcl 除了命令外就只有變數。變數與shell 變數一樣，只有<br />
                  一種型別：字串。錢號可以取出變數的值。<br />
                D.tcl 對每一個敘述最多只做一次變數代換。而被大括號括住<br />
                  的部份不做任何處理。<br />
                E.tcl 會優先執行被方括號括住的敘述，並將其結果當成原來<br />
                  命令的一部份。這與shell 的重音符號相同（mkdir `echo Hello`）<br />
<br />
       以下就是一些範例：<br />
<br />
                unix% tclsh<br />
                tcl% set x 100     輸出     100<br />
                tcl% set y 200              200<br />
                tcl% expr $x + $y           300<br />
                tcl% set z [expr x+y]       300, z = 300<br />
                tcl% set a [set b 100]      a = b = 100<br />
                tcl% expr (3>4)||(6<=7)     1<br />
                tcl% expr 14.1*sin($x)<br />
                tcl% set organization "Taiwan University"  （兩句同意，只是  ）<br />
                tcl% set organization {Taiwan University}  （引號會做變數代換）<br />
           [以下省略tcl的提示號]<br />
                tcl的procedure:<br />
                proc power {base p} {<br />
                        set result 1<br />
                        while {$p > 0} {<br />
                                set result [expr $result*$base]<br />
                                set p [expr $p-1]<br />
                        }<br />
                        return $result<br />
                }<br />
                power 2 6         可得 64<br />
                power 1.15 5           2.01136<br />
<br />
            仔細觀察procedure的demo，其實tcl 並沒有procedure結構的語法。<br />
            proc只是一個命令，接受４個引數：<br />
                  proc 新命令名字  參數   一段tcl程式碼<br />
            其中，參數與tcl程式碼用大括號括起來的原因是我們不希望tcl 現在<br />
            就執行這些程式碼，而是當procedure被呼叫時才執行。while結構也是<br />
            如此：<br />
                  while 判斷 程式碼<br />
            因為我們希望每次while執行時$result,$p的值都會變。如果不用大括號<br />
            括起來，則所有的值在tcl解譯的時候就固定了，while迴圈永遠也不會<br />
            結束。<br />
<br />
            與大括號相反，eval命令可以把一個字串當成tcl 命令執行：<br />
                   eval {set x 123}   等於   set x 123<br />
                   eval "set x 123"          同上<br />
            eval可以造成tcl 對同一敘述parse兩次，解決一些難纏的問題：<br />
                   exec rm [glob *.o]<br />
            會告訴你：<br />
                   "a.o b.o c.o" not found<br />
            正確的解法是叫tcl 再parse一遍命令行：<br />
                   eval "exec rm [glob *.o]"<br />
<br />
            tcl 的array：不須宣告，直接用即可，但是只有一維陣列而已。<br />
                   set days_of_a_month(Jan) 31<br />
                   set days_of_a_month(Fab) 28<br />
            多維陣列可用單維陣列模擬：<br />
                   set matrix(1,1)  100<br />
                   set matrix(3,9)  50<br />
                   set matrix($x,$y) 66<br />
                   set z $matrix(6,6) 77<br />
<br />
                陣列的index其實為 "1,1" 、 "3,9" 與 "$x,$y"<br />
<br />
            相關的命令:<br />
               set  var value<br />
               append var value [value2 vaule3 ...]<br />
               incr var [increament]       /* default = 1 */<br />
               unset var [var2 var3 ...]<br />
<br />
            tcl 還有一種之料結構叫list<br />
<br />
                   set x {Sun Mon Tue Wed Thu Fri Sat}<br />
                   lindex $x 1     輸出 Mon<br />
                   lindex {a b {c d e} f g} 2 輸出 "c d e"<br />
                   concat {a b} {c d} e       輸出 "a b c d e"<br />
                   list {a b} {c d} e              "{a b} {c d} e"<br />
                   llength { {a b} e f}            3<br />
                   llength {}                      0<br />
                   llength a                       1<br />
                   linsert $x 2 a b c              Sun Mon a b c Tue ...<br />
                   linsert $x 0 a                  a Sun Mon ...<br />
                   lreplace $x 0 a                 a Mon Tue ...<br />
                   lrange $x 0 1                   Sun Mon<br />
                   lappend $x a b c<br />
                   lsearch $x Sat<br />
                   lsearch -glob $x S*  /* Wild Cards */<br />
                   lsearch -regexp      /* regular expression */<br />
                   lsort [-decreasing|-integer] $x<br />
             Strings & Lists<br />
                   set x a/b/c<br />
                   set y /usr/local/bin/wish<br />
                   split $x /             輸出  a b c<br />
                   split y                     {} usr local bin wish<br />
                   反函數為join<br />
             Lists & Commands:<br />
                   其實tcl 語言本身就是一個list，瞧，最後一個是command或是<br />
                   list：<br />
                       button .b -text "Reset" -command {set x 0}<br />
<br />
               list可以解決一些難以構成的命令：<br />
                   假設有一個情況，我們寫了下列命令：<br />
                       button .b -text "Reset" -command "set x $InitValue"<br />
                   此命令的情況是我們希望Reset button按下後把 x設回<br />
                   InitValue，可是天不從人願，如果$InitValue是"tcl tk"<br />
                   則Command變成set x tcl tk，引述個數不對了。<br />
                   如果改成：<br />
                       button .b -text "Reset" -command {set x $InitValue}<br />
                   則x 值取決於按鈕時的InitValue，而非真正的InitValue<br />
                   所以可用下列方法解決：<br />
                     button .b -text "Reset" -command [list set x $initValue]<br />
<br />
         控制結構：<br />
                 if 判斷 [then] 敘述 elseif 敘述 elseif 敘述 [else] 敘述<br />
                    then 與else 皆可省略。<br />
                 while :      (make b the reverse of a)<br />
                      set b ""<br />
                      set i [expr [llength $a] -1]<br />
                      while {$i >= 0} {<br />
                           lappend b [lindex $a $i]<br />
                           incr i -1<br />
                      }<br />
<br />
                 for:<br />
                      set b ""<br />
                      for {set i [expr [llength $a] -1]} {$i >=0} {incr i -1} {<br />
                                lappend b [lindex $a $i]<br />
                      }<br />
<br />
                 foreach:<br />
                      set b ""<br />
                      foreach i $a {<br />
                             set b [linset $b 0 $i]<br />
                      }<br />
<br />
                 注意，受限於tcl 語法，大括號不能獨立一行：<br />
                     while {}<br />
                     {<br />
                     }<br />
                 break與continue也都有效。<br />
                 switch命令：<br />
                     switch $x {<br />
                          Mon  {incr days(Mon)}<br />
                          Tue  {incr days(Tue)}<br />
                          default {...}<br />
                     }<br />
                  亦可寫成：<br />
                     switch $x Mon {...} Tue {...} default {...}<br />
                  或<br />
                     switch $x \<br />
                        Mon {...} \<br />
                        Tue {...} \<br />
                        default {...}<br />
                  如果動作相同可用 - 代表。<br />
                     switch $x {<br />
                         1 -<br />
                         3 -<br />
                         5 -<br />
                         7 -<br />
                         9 {incr odd}<br />
                         default {incr even}<br />
                      }<br />
         副程式：<br />
               同csh,tcl也有source 命令:<br />
                        source tclInit.tcl<br />
               procedure:<br />
                        proc name ArgList Body<br />
                           定義一個叫做name 的procedure，<br />
                           如果ArgList的最後一個為args，則此procedure<br />
                           為不定引數函數，而args為一list。<br />
                        global name1 name2 ...<br />
                           使用global中的name1 name2變數，而非自定local變數<br />
                        return value<br />
                        uplevel [level] script1 script2...<br />
                           類似inline函式，把stript1 script2 ...串起來<br />
                           然後在上一層中執行，而非在procedure自己的stack<br />
                           內執行(可以更改上一層的變數)。<br />
                        upvar [level] name localname [name1 localname1] ...<br />
                           引用上一層的變數name，但是在本procedure內用<br />
                           localname存取之。(call by reference)<br />
                 uplevel例:<br />
                       proc do {varName first last body} {<br />
                           upvar $varName v<br />
                           for {set v $first} {$v <= $last} {incr v}<br />
                               uplevel $body<br />
                           }<br />
                       }<br />
                       set a {}<br />
                       do i 1 5 {<br />
                           lappend a [expr $i*$i]<br />
                       }<br />
                       set a    顯示 1 4 9 16 25<br />
                如果不用uplevel，則$body就不可能存取到 a變數了。<br />
       Errors& exceptions:<br />
<br />
            catch {<br />
                 tcl 程式碼<br />
            } messages<br />
        如果程式碼有錯，catch return 1，否則為0，messages為實際的錯誤訊息。<br />
<br />
以下沒力氣打中文，寫不下去了，抄兩個玩具給大家欣賞 :-b<br />
<br />
#!/usr/local/bin/wish -f<br />
proc power {base p} {<br />
        set result 1<br />
        while {$p > 0} {<br />
                set result [expr $result*$base]<br />
                incr p -1<br />
        }<br />
        return $result<br />
}<br />
entry .base -width 6 -relief suken -textvariable base<br />
label .label1 -text "to the power"<br />
entry .power -width 6 -relief sunken -textvariable power<br />
label .label2 -text "is"<br />
label .result -textvariable result<br />
pack .base .label1 .power .label2 .result -side left -padx 1m -pady 2m<br />
bind .base <Return> {set result [power $base $power]}<br />
bind .power <Return> {set result [power $base $power]}<br />
# End of File<br />
<br />
註： -relief sunken的意思是凹陷的輪廓。<br />
<br />
      本程式產生一個視窗：<br />
     ┌──────────────────────────┐<br />
     │〔   Ａ   〕to the power 〔   Ｂ  〕 is 〔        〕│<br />
     └──────────────────────────┘<br />
      只要輸入Ａ，Ｂ就可以得到Ａ的Ｂ次方。<br />
<br />
#!/usr/local/bin/wish -f<br />
set id 0<br />
entry .entry -width 30 -relief sunken -textvariable cmd<br />
pack .entry -padx 1m -pady 1m   <- 顯示輸入行<br />
bind .entry <Return> {          <- 當.entry 收到<Return>這個event時<br />
        set id [incr id]<br />
        if {$id > 5} {<br />
                destroy .b[expr $id -5]        <- tcl的變數名也可以用湊的<br />
                     └＞ 刪除第5次前的命令<br />
        }<br />
        button .b$id -command "exec <@stdin >@stdout $cmd" -text $cmd<br />
        pack .b$id -fill x       <- 顯示按鈕，且水平（ｘ）方向填滿。<br />
        .b$id invoke             <- 模擬按鈕被按下<br />
        .entry delete 0 end      <- 清除輸入行<br />
}<br />
<br />
#end of file<br />
<br />
       本程式產生一個輸入行，可以下命令，並且把過去的５個命令記錄下來，<br />
       用按鈕就可以執行。<br />
<br />
***<br />
<br />
看到這裡，您是否同意tcl/tk是UNIX世界的BASIC呢？<br />
<br />
本篇文章是我閱讀一本書：tcl and tk toolkit的部份心得。這本書已於1994年由<br />
Addison-Wesley Publishing Company,Inc.出版(ISBN 0-201-63337-X)。此書<br />
網路上有postscript檔案，但是我不認為大家有閒情逸致印個500頁左右的<br />
書吧---用10ppm的雷射印表機也要50幾分鐘、實際上用Postscript輸出更慢，<br />
還會卡紙哩：）最好是找找看有沒有進口。<br />
<br />
tcl/tk在USENET上有自己的討論群：comp.lang.tcl各位可以參考其FAQ。FAQ可在<br />
NCTUCCCA:/USENET/FAQ/comp/lang/tcl拿到。<br />
<br />
UNIX下的Interpretor種類繁多，功能複雜，但願這篇文章能收到拋磚引玉之效<br />
使有人願意寫些中文文件來介紹與X Window 整合的其他Interpretor，如tkperl<br />
、Prolog等。甚至是一些Windows的程式設計工具，如SUIT,xvwindow等library<br />
使得 X Windows Programing對入門者不再是夢靨。<br />
<br />
以上所提及的軟體更是網路上可以免費取得的合法軟體，特別是Linux下全部都有。<br />
<br />
ps: 上學期末在天龍書局看到Larry Wall的Programing Perl，對perl有興趣者可<br />
    以去買，保證不會後悔!<br />
<br />
pps: tk目前的版本無法處理16bits的字集，即Botton..無法看到中文，可能要<br />
     等到tk 4.0。<br />
<br />
        ======================================================<br />
<br />
 <br />

		
		]]>
	</content:encoded>
	<link>http://blog.roodo.com/kelvins/archives/264051.html</link>
	<guid>http://blog.roodo.com/kelvins/archives/264051.html</guid>
	<category>參考文章</category>
	<pubDate>Tue, 12 Jul 2005 23:11:00 +0800</pubDate>
</item>
</channel>
</rss>