2009年7月31日 星期五

Linux-圖示關聯消失

這個問題是因為裝了PCMAN瘦身機造成的

目前似乎只發生在9.04上面

解決方法:
sudo apt-get install --reinstall shared-mime-info
sudo update-mime-database /usr/share/mime
killall nautilus
rm -rf ~/.local
sudo rm /etc/apt/apt.conf.d/99-transpurge
註:
如果出現Parse Error的話
可以把
/usr/share/mime/packages/libmimetype.xml
這個檔案先刪掉

Linux一些路徑

sources.list
/etc/apt/sources.list
menu.lst
/boot/grub/menu.list
pidgin日誌
~/.purple/logs/
下載下來的套件
/var/cache/apt/archives/
lxmenu&lxpanel裡的連結的路徑
/usr/share/applications/
註:
lxmenu或lxpanel如果有圖片跑不出來的話

                                 ↑像這樣

是因為所關聯到的圖片有「-」的關係
*這是「/usr/share/applications/firefox-3.5.desktop」的內容

*這是圖片路徑(可能會有些出入,應該是沒有.png的:p)

所以再來要改兩個部分
第一個是這裡的連結,改成
/usr/share/pixmaps/firefox3.5.png
再來到
/usr/share/pixmaps/
找出「firefox-3.5.png」
改名為「firefox3.5.png」
這樣就可以了~

想到再加~

2009年7月30日 星期四

Ubuntu-"Modprobe vboxdrv failed"

更新Kernel之後發現VirtualBox不能用了

而在boot的時候則有這個錯誤訊息

Modprobe vboxdrv failed
Google後發現只是少裝了一些東西

sudo apt-get install linux-headers-generic build-essential

這樣就好了~

這只是一個小問題XD

Ubuntu-刪除舊Kernel的方法

Kernel一直升上去之後

如果你是雙OS的話

在開頭的選單會變得很長

這時除了改menu.lst之外

也可刪掉舊的Kernel

方法很簡單

只要打入一行指令

sudo aptitude purge ~ilinux-image-.*\(\!`uname -r`\)

2009年7月29日 星期三

七月

要回到台北去了,也是時候打一篇七月的總集篇了。XD
七月五日回到嘉義至今過了也一個月了。
在家的一個月過得十分之懶散。(壓力Free的一個月XD)

比較常做的反而是聚餐一類的事了,這次回來就聚了三次。<( ̄ c ̄)y▂ξ
跟以前的朋友聊聊感覺很不錯,大家也都過得很好~
重考的侶航今年的狀況也很不錯,考上目標的學校想必是沒問題了。
久未見到的培剛感覺比較不一樣了,比較健談也比較活潑,四年不見果然有差。XD
家輝在大學也過得很不錯的樣子,雖然之後發生了那件事,相信他是能重新站起來的人,加油! 慧慈在台北就見過幾次面了,不過在飯局也沒妳自己想得那麼安靜,多和大家互動總是不錯的XD 轉學考雖然在這一次沒有成功,但這就像妳說的一樣不是第一次也不會是最後一次,加油吧!
姵如也是好久不見了,變得比較成熟(?)了,不過煩惱好像也變多了,努力活出自己吧~不必為了他人而有所改變。
威豪也和過去差不多 除了身材比較...( ′-`)y-~ 要多運動啊~
于勝也沒什麼變,雖然剛見到時頭髮比較長的樣子,聽你說又要剪掉,那就沒什麼差了XD

飯局三次見到的人雖不多,但總是以往的好麻吉XD
同時才發現嘉義適合聚餐的店不大好找,吃來吃去也只有幾家可以吃而已~

昨天回輔仁看了一下,也見到了完全沒變的鼎傑和旭倫
而也剛好和高中及國中所有的導師都聊了一遍。
了解到現在輔仁的狀況(聽說現在作弊變嚴重了,真是...( ′-`)y-~)
可惜的是沒見到侯老師,及因為有人遲到而沒時間去見的學弟。
回來時還遇到了大雨,淋得全身濕QQ
不過快到家時就停,還附加大太陽,結果就乾了XD

雖然有些人平時在MSN上就會聊
可是MSN上面聊總是少了什麼的感覺,還是見面聊比較開心~
以後長假時都能跟大家聊聊就好了XD
難得有關係這麼好的朋友們~(雖然聚餐蠻傷荷包的XD)

暑假中為了雲嘉會的事務還下了台南一次,去和寢具的廠商談合約的事。
一見面就覺得對方是很熱情的人(南部人的熱情(?)),而再三考慮後就決定接受了。
也和會長討論了迎新的一些事項,討論了諸多問題。
不過,找場地真的是有夠麻煩且困難的= =
一直卡在這方面的問題<( ̄ c ̄)y▂ξ

這一段時間也開了不少線上會議
有新生書院的和資訊週的
其中新生書院常常開到半夜一兩點,和之前大一劇有得拼( ′-`)y-~
不過,這時就一定要抱怨家裡這個動不動就斷線的網路了。
每次聊到半夜時,就一直斷線,有時一斷就再也上不去了(之後發現原兇是MOD)
也使得新生書院同組的組員都把我會斷線變成個梗了T.T
雖然現在處理了斷線的問題,不過速度有時還是會慢到連上B都lag
不過在家的時間本就不長,也就不那麼計較了。

新生書院的隊輔目前分成了十組,而一組有十二個人~
而目前來看,同一組的人似乎都是High咖XD
線上討論時,發言都很踴躍而且梗超多的XD
之後的團訓看樣子能好好的期待一下~

再來談談比較宅的活動吧XD
因為家裡的網路很慢,上起網來還蠻痛苦的。
於是決定轉而去打單機的遊戲= =+
結果半個月的左右時間就打破了仙劍三(就以往打RPG的速度來說算蠻快了)
之後改打 英雄傳說六空之軌跡FC
Falcom出的遊戲,畫風和伊蘇系列很像,人物屬於可愛路線的~
劇情寫得也很不錯,有興趣的可以上網找資料,這裡就不多說了~
FC = First Chapter
也因此這款遊戲還有SC及3rd(一直想問為什第三款不是TC! XD)
不過目前連FC都還沒結束
八月開始忙的話只怕沒麼時間玩了~

就結論來說
如同一開始提的,這個月真的過得十分之懶散XD
說好的ACM倒是沒做到幾題,而之前和圖書館借的七本書也只看了兩本半= =
整個進度就是十分的緩慢,下個月只希望不會再這樣任時間流去。
要好好的加油!!

八月,我來了!!!!

2009年7月23日 星期四

[轉]看日食 這堂課好high

新竹學生賞日食 手骨X光片也上陣 / 彭芸芳

「哇,太陽變月亮了」,昨天上午新竹和苗栗可見的日偏食食分達8成,建功中學和建臺中學的自然科教師把握機會,指導學生們一起「追日」,看到圓圓的太陽先變成上弦月、再變成下弦月、又變成咬一口的蘋果,人人high翻了。

建功國中和高中的師生們興奮的自製濾光眼鏡欣賞日食,雀躍不已。
記者彭芸芳/攝影
建功的16名自然科老師邀請清華大學天文社指導老師賴詩萍教授及7名天文社的學生,教學生自己黏製專屬的太陽濾紙,有人在眼鏡上還畫睫毛、眉毛,欣賞天狗是如何一口口把太陽吃掉,學生還上了完整的天文課。

現場用望遠鏡投影出日偏食全程形狀,人人興奮地品頭論足,「真想問問天狗,太陽好不好吃啊」!

最興奮的是清大資工系二年級學生張正朋,他發揮創意,翻箱倒櫃找出16歲時拍的X光片,細心的剪下來,一塊貼在眼鏡上,一塊貼在單眼相機上,胸前還掛著用剩的X光片,上面骨頭形狀清晰可辨,他興奮地拍下幾百張照片。

建臺中學全校近3000名師生昨天一起觀察日偏食,用雙眼記錄難得的天文奇觀。
圖/建臺中學提供

苗栗縣私立建臺中學昨天上午用10分鐘下課時間,集合全校近3000名學生觀察日偏食,連老師們也聚精會神看著太陽漸漸籠罩陰影。

國中部的陳子勳說,書本上看再多,都比不上親眼目睹日食讓人印象深刻,「真想再多看一點」,教務主任劉漢田說,現場觀察是最好的教學。

原文連結


--------------------------------------------------------------------------------------------------------------

高中同學上新聞了呢XD(就是用X光片的那位~)

LXDE - 其他套件

有一些不錯用的套件有時是不會一開始就裝進去的

在這裡介紹一下~

套件下載處(deb):https://launchpad.net/~lxde/+archive/ppa

如果用指令安裝的話:
sudo dpkg -i xxxxx.deb


LXShortcut:



LXShortcut 是一個剛新加入的元件。它是個用來編輯應用程式的捷徑小工具。現在編輯應用程式捷徑變得非常容易。

個人沒怎麼用過,算是幫助編輯的小工具吧~

LXTask:



XTask 是 LXDE 標準的工作管理員和系統監控。他可以透過 Ctrl+Alt+Del 啟動,而且非常的輕巧。

和XP下的工作管理者很像(連開啟的快捷鍵也是),如果對kill指令還不熟的話,是很方便的一個套件

有一些是要自己編的(gz):http://sourceforge.net/projects/lxde/files/

LXSession Edit



可以用來編輯選單(就是有點像windows選單的那一個)

最後要提一下的是

目前在UBuntu上的版本都還蠻舊的

有興趣的人最好是自己compile一下才能用到最新版的

[轉]相關文章

原文網址:http://abintech.twidv.com/2007/03/related-post.html

這邊補充一下字體大小的問題~

先找到這一行

document.write('Related Posts: <ul>');


改成(其中紅色的數字表示字體大小,可自行更改~)

document.write('<br><b><font size="3">Related Posts: </font></b><ul>');


如果不習慣英文的話,也可將「Related Posts」改成「相關文章」

再來是改內文文字的大小

找到這行

document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</li>');


改成(紅色數字同樣可以改~)

document.write('<li><font size="2"><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</font></li>');


如此一來字太小的應該會好一些~

2009年7月21日 星期二

失蹤的正方形

失蹤的正方形謎題是一種用於數學課的視錯覺,有助於學生對幾何圖形的思考。它描述兩種面積板塊形狀組合,每個顯然的都構成一個13X5直角三角形,不過其中一個裡頭有個1x1的孔。

這謎題的關鍵是實際上兩個13x5的多邊形並不是三角形,目測不容易察覺到紅色和藍色三角形斜邊的斜率有差別。 因此誤以為兩個組合成的圖形都是三角形。


四個圖形(黃色、紅色、藍色和綠色圖形)總共佔32個單位面積,但是外面總三角形是寬13高5,合計32.5單位。藍色三角形長寬比為5:2,紅色三角則是8:3,並且這些不是同一個長寬比。因此在每個圖中外觀上加成後的斜邊實際上縮短了。

總共縮短的長度大約是一單位的28分之一,這在此謎題示例圖上很難以看出。注意在藍色紅色斜邊交界處的網格點,如果將它與另一張圖的對應交界點比 較,邊緣稍稍溢出或者低於格點。來自兩張圖重疊後溢出的斜邊導致一個非常細微的平行四邊形,佔據了剛好一格大小的面積,恰洽是第二張圖「消失」的區域。

根據美國業餘數學大師馬丁·加德納指出,本謎題是在1953年是由紐約市業餘魔術師保羅·嘉理(Paul Curry)發明的。不過裁切悖論的原理自從1860年代就已為數學家所知了。

謎題裡描述組成圖形的整數域(2, 3, 5, 8, 13)是連續的斐波那契數。 許多其他幾何裁切謎題皆根據著名斐波那契數列的許多簡單的特質。

消失的小正方形謎題

本謎題另類且較簡單的版本(在動畫裡顯示)使用四個相等的四邊形以及一個小正方形,則組成一個較大的正方形。當四邊形繞著其中心旋轉,中間的小正方形將被填滿,即使該圖的總面積看起來沒有變動。這外表上的悖論可由新形成的方形四邊較原來的小了一點。如果 a 代表大正方形的四邊和,且 θ 是每個四邊形相對邊間的夾角,那兩個旋轉前旋轉後方塊面積間相除的商結果是 sec2θ − 1。對於 θ = 5°,結果大約是 1.00765,故對應的差異大約 0.8%。

森姆·萊特的悖論裁切

老虎悖論

故事

國王要處決一個囚犯,但給他一個生還的機會。囚犯被帶到5扇緊閉的門前,其中一扇後面關著一隻老虎。國王對囚犯說:「你必須依次打開這些門。我可以肯定的是,在你沒有打開關著老虎的那扇門之前,你是無法知道老虎是在那扇門後。」顯然,如果囚犯有可能在打開有老虎的那扇門前知道,就證明國王在撒謊,那麼就可以活命。 開門之前,囚犯進行了如下分析:假如老虎在第五扇門,那當他把前四扇門打開後都沒發現老虎,那他肯定猜到老虎在第五扇門中,因國王說過不論何時他也料不到老虎在哪扇門後,那國王的說話就錯了。因此,老虎肯定不在第五扇門中。同樣道理,老虎也不在第四道門中,否則囚犯打開三道門後,只剩兩道門,老虎既不在第五扇門後,那就會給他料到在第四扇門後;依次類推,老虎不存在任何一道門後;囚犯這時就不再多想,冒冒失失依次推門,結果老虎從第二扇門中跳了出來,把囚犯咬死了。國王看見了說:「不是跟你說了老虎在哪扇門後總是出乎你的意料了嗎?現在你就是萬料不到了。」

悖論分析

如果囚犯的推理成立,那麼就算國王把老虎放在第五扇門後,也是「料想不到」,學者們爭論的重點在於:這個推理究竟錯在第幾步?

主張錯在第一步

* 如果第一步是正確的,那麼後面幾步為什麼是錯的?所以第一步就錯了。錯在囚犯把國王的思路作為論據。
* 首先必須定義怎樣算國王所謂的「知道」(或「意料」),如果投機猜測算的話,那國王不論怎樣放都不能保證不被猜中,所以帶投機成分的猜測不能算「知道」(國王為了自身利益也會這麼定義),設「知道」定義為「在即有事實下的邏輯推理」,那麼囚犯不僅要正確預測老虎,還要對其預測給出嚴格的邏輯證明才行。本例中不考慮沒有老虎的情況,即囚犯已知必有1老虎。作為囚犯,他在每次打開一個門前都會進行邏輯推理,如果能推出老虎是在即將打開的門裡就贏了,如果不能推出,他就只能打開這個門,如果打開後沒有老虎就繼續推理下一個門是否有老虎,依此類推。
* 然後,把問題從5個門簡化為只有2個門,囚犯會在打開第一個門之前,對第一個門裡是否有老虎做邏輯推理:由於囚犯要引用國王的思路,故須先考慮國王思路是否是會錯。
o 如果相信國王是不會錯的,那麼你不可能推測出第一個門裡有沒有,因為如果推測出就說明國王會錯,所以在這個前提下不可能知道。 囚犯無法推測出第一個門裡有沒有老虎,必然要打開第一個門。
o 如果相信國王是會錯的:

囚犯首先認為國王放第二個門是錯的,但國王既然是會錯的,他為何不會按囚犯認為錯誤的思路放第二個門呢?所以國王的思路就沒法唯一的推測了。囚犯失去國王的思路做論據,無法推測出第一個門裡有沒有老虎,必然要打開第一個門。

*
o 因此國王應且只應放到第一個門中,則國王必勝。
* 推廣到n個門的情況,只要只要國王不把老虎放到最後一個門,則國王必勝,囚犯必敗。

主張錯在第二步


* 故事中的囚犯最後決定相信「沒有老虎」。但,國王並不知道囚犯是否會這樣,所以的確不可能把老虎放在第五扇門。如果囚犯決定相信「一定有老虎」,那麼在前四扇門都沒有老虎之後,第五扇門後的老虎的確就變成「可預料的」了。
* 既然老虎在第五扇門的話,牠一定是「可預料的」,那麼當你已經開了三扇空門時,情況是怎麼樣?我們可以試著寫成邏輯式子:前提一、老虎不可預料。前提二、老虎如果在第五扇門時,可預料。前提三、老虎不在第五扇門時,就一定在第四扇門。前提四、老虎如果在第四扇門時,可預料。結論:前提互相矛盾。
* 請注意:這時的邏輯推理中,既然前提互相矛盾,必定有一個以上不成立,那麼可能性就是以下四個其中之一、或是更多:

1.
* 一、老虎可預料。
* 二、老虎如果在第五扇門時,不可預料。
* 三、老虎不在第五扇門時,也不一定在第四扇門。
* 四、老虎如果在第四扇門時,不可預料。

二和四自身是矛盾命題,不考慮,三會導致老虎變成薛定諤的貓,也就是既存在亦非存在的狀態(囚犯把老虎往前門推是錯誤的,因為前提中包含「已經開了三扇空門」)。所以可能性只有一個:老虎可預料。但若老虎可預料,那麼顯示國王說謊,如果國王可能說謊,那麼老虎也真的有可能消失。

* 這時的正確結論是:國王一定說謊,但他的謊言可能是「老虎可預料」,卻也可能是「根本沒老虎」,囚犯只是偏心於一個可能性,結果幫國王圓謊罷了。

主張錯在最後一步

* 如果「不可預料」並不是一種保證,而只意味「高機率」,「有老虎」才是保證,那麼情況又整個改觀。可以列成以下狀況:
* 如果囚犯連猜五次「老虎不在」,則不可預料率100%,當然是最糟的狀況。
* 如果囚犯連猜五次「老虎在」,這時應將不可預料率一樣視為100%。假設國王隨便放,因為平均猜錯次數是兩次,亦即猜錯一次要加不可預料率50%才公平。
* 假設國王隨便放,這時囚犯採用的策略,以:

1.
* 先兩次不猜,再連續猜老虎在:成功率0、0、100、50、0,平均30最高分
* 先三次不猜,再連續猜老虎在:成功率0、0、0、100、50,平均也是30最高分
* 但以上兩種高分解,前兩扇門都是安全門,必須混合下列解答靈活運用
* 如果第一次就猜老虎在:成功率100、-50、-50、50、0,平均只有10分
* 如果第二次就猜老虎在:成功率0、100、50、0、-50,平均也有20分
* 為了便於計算,假設這四種策略囚犯都平均運用,綜合以上,老虎放在不同門的平均不可預料率,75%、87.5%、75%、50%、100%

* 很明顯了,這時國王的對應策略,如果把老虎放在失分最低的第五扇門,可能被囚犯豪賭賭中,所以把老虎放在失分次低的第二扇門會是最佳選擇,只要把囚犯的猜中率壓在20%以下,都可以毫無愧色說是有很高的不可預料率。

他應該從「老虎不存在」這個矛盾的結論,導出國王所謂的「不可預料」其實是指機率,再從機率上推測國王到底把老虎放在第幾個門。

突擊測驗

老師宣布下星期一至星期五其中一日之中,會有一天舉行突擊測驗。學生認為根本不存在突擊測驗。若假設直到星期四還未舉行測驗,那麼星期五就會舉行,那就不算突擊,因此星期五不會舉行。若星期三還未舉行,而星期五又不會舉行,星期四就會舉行……如此類推,老師不可能進行突擊測驗。

奶油貓悖論(Buttered cat paradox)

奶油貓悖論(英文:Buttered cat paradox),是把兩種趣談組合而成的惡搞悖論,該常識為:

* 貓在半空中跳下,永遠用腳著陸。
* 把奶油吐司拋到半空中,吐司永遠在塗上‎奶油的一面落地。

這個悖論出在,你把奶油吐司沒有塗上奶油的一面黏著貓的背部之時。依照以上兩條定律,貓無法用腳著陸,因為奶油吐司永遠在塗上奶油的一面落地;但同樣的,奶油吐司塗上奶油的一面無法落地,因為貓永遠用腳著陸。

思想實驗

這個悖論是由兩種民間智慧組合而成的玩笑式悖論,亦是一個有趣的思想實驗。我們確定兩條定律「貓永遠用腳著陸」;「奶油吐司永遠在塗上奶油的一面落地」皆是真確和有證據證明的。那麼,把奶油吐司沒有塗上奶油的一面黏著貓的背部(下文簡稱奶油貓)之時,會發生什麼反應呢?

某些人打趣地表示,奶油貓實驗將導致一個反地心引力的作用。他們猜測,奶油貓在半空落地之時,它將漸漸減速和轉動,最終到達一種恆穩狀態,與地面浮著一個短的距離高速轉動,使得吐司沒有塗上奶油的一面和貓背無法接觸地面。[1]

這種解釋十分詼諧,如果我們假設兩種定律都是正確的話,什麼事情都能發生。然而,依照以上解釋,必須有某一種能量維持奶油貓的恆穩狀態,否則它會違反能量守恆定律。不過,亦有很多方法使奶油貓得到能量,例如轉動時,奶油貓能在摩擦空氣得出熱量、或從陽光,轉換它成直接動能。雖然很艱苦證明這點,但並非不可能。

其他實驗結果是,貓用腳著陸,但立即反轉。然而這結果意味貓的腳比吐司塗上奶油的一面對地心引力更有吸引力,但同一實驗,吐司塗上奶油的一面曾經擊敗貓腳。這取決於最初實驗開始的參量,到底是貓的腳或吐司塗上奶油的一面對地心引力更有吸引力?兩者都是正確的,另一種實驗結果是,吐司首先著地(意味著貓實際上未落地,吐司照樣在貓的背面),然後貓用腳打滾。

阿羅悖論(Arrow Paradox)

阿羅悖論(Arrow Paradox)又稱作阿羅不可能定理(Arrow's impossible theorem),美國史丹福大學教授肯尼斯·阿羅的結論:

如果我們排除了人際效用的可比性,而且在一個相當廣的範圍內對任何個人偏好排序集合都有定義,那麼把個人偏好總合為社會偏好的最理想的方法,要麼是強加的,要麼是獨裁的。

不可能存在一種社會選擇機制,使個人偏好通過多數票規則轉換為成社會偏好。

命題

有 N 種選擇,有 m 個決策者,他們每個人都對這 N 個選擇有一個從優至劣的排序。我們要設計一種選舉法則,使得將這 m 個排序的信息匯總成一個新的排序,稱為投票結果。我們希望這種法則滿足以下條件:

* 一致性,或稱為帕累托效率。即如果所有的 m 個決策者都認為選擇 a 優於 b,那麼在投票結果中,a 也優於 b。
* 非獨裁。不存在一個決策者 X,使得投票結果總是等同於 X 的排序。
* 獨立於無關選項。如果現在一些決策者改了主意,但是在每個決策者的排序中,a 和 b 的相對位置不變,那麼在投票結果中 a 和 b 的相對位置也不變。

那麼,如果 N 大於 3,我們不可能設計出這種制度。

例子

例如,某日人們舉辦一個投票,這個投票問卷里只有一個問題,包含若干個選項,投票者根據自己的偏好給這幾個選項排序。人們希望滿足以下幾個條件:

* 投票的結果應該能表現出多個參加者的偏好,而不是某個人的偏好。
* 它應該能體現所有參加者的偏好,並且如果有2次投票所有人投的票相同,結果也一定相同。
* 如果人們改變了某2個選項的相對優先順序,那麼這變化不應該影響其他選項的相對優先順序。
* 如果一個人提高了某個選項的優先順序,那麼在結果中,這個選項的優先順序不能因此下降。
* 所有結果的排序都應該是可能達到的。

阿羅的結論是,如果有2個或以上的人參加投票,並且問題有3個或以上的選項,那麼以上的這些條件不可能同時滿足。

生日悖論

生日悖論是指,如果一個房間裡有23個或23個以上的人,那麼至少有兩個人的生日相同的機率要大於50%。這就意味著在一個典型的標準小學班級(30人)中,存在兩人生日相同的可能性更高。對於60或者更多的人,這種機率要大於99%。從引起邏輯矛盾的角度來說生日悖論並不是一種悖論,從這個數學事實與一般直覺相抵觸的意義上,它才稱得上是一個悖論。大多數人會認為,23人中有2人生日相同的機率應該遠遠小於50%。計算與此相關的機率被稱為生日問題, 在這個問題之後的數學理論已被用於設計著名的密碼攻擊方法:生日攻擊。

對此悖論的解釋


理解生日悖論的關鍵在於領會相同生日的搭配可以是相當多的。如在前面所提到的例子,23個人可以產生C(23,2)= 23 × 22/2 = 253 種不同的搭配,而這每一種搭配都有成功相等的可能。從這樣的角度看,在253種搭配中產生一對成功的配對也並不是那樣的不可思議。

換一個角度,如果你進入了一個有著22個人的房間,房間裡的人中會和你有相同生日的機率便不是五十五十了,而是變得非常低。原因是這時候只能產生22種不同的搭配。生日問題實際上是在問任何23個人中會有兩人生日相同的機率是多少。

應用

生日悖論普遍的應用於檢測哈希函數:N-位長度的哈希表可能發生碰撞測試次數不是2N次而是只有2N/2次。這一結論被應用到破解密碼學散列函數的生日攻擊中。

生日問題所隱含的理論已經在[Schnabel 1938]名字叫做capture-recapture的統計試驗得到應用,來估計湖裡魚的數量。

近似匹配

此問題另外一個范化就是求得要在隨機選取多少人中才能找到2個人生日相同,相差1天,2天等的機率大於50% 。這是個更難的問題需要用到容斥原理。結果(假設生日依然按照平均分佈)正像在標準生日問題中那樣令人吃驚:

2人生日相差k天 #需要的人數
0 23
1 14
2 11
3 9
4 8
5 7
7 6

只需要隨機抽取6個人,找到兩個人生日相差一周以內的機率就會超過50%。

辛普森悖論

當人們嘗試探究兩種變數是否具有相關性的時候,比如新生錄取率與性別,報酬與性別等,會分別對之進行分組研究。辛普森悖論是在這種研究中,在某些前提下有時會產生的一種現象。即在分組比較中都佔優勢的一方,會在總評中反而是失勢的一方。該現象於20世紀初就有人討論,但一直到1951年E.H.辛普森在他發表的論文中,該現象才算正式被描述解釋。後來就以他的名字命名該悖論

請看下面的例子

一所美國高校的兩個學院,分別是法學院和商學院,新學期招生。人們懷疑這兩個學院有性別歧視。現作如下統計:

法學院

性別 錄取 拒收 總數 錄取比例
男生 8 45 53 15.1%
女生 51 101 152 33.6%
合計 59 146 205


商學院

性別 錄取 拒收 總數 錄取比例
男生 201 50 251 80.1%
女生 92 9 101 91.1%
合計 293 59 352

根據上面兩個表格來看,女生在兩個學院都被優先錄取。即女生的錄取比率較。現在將兩學院的數據匯總:

性別 錄取 拒收 總數 錄取比例
男生 209 95 304 68.8%
女生 143 110 253 56.5%
合計 352 205 557

在總評中,女生的錄取比率反而比男生

薛丁格的貓

薛丁格的貓是奧地利物理學家埃爾溫·薛丁格試圖證明量子力學在巨觀條件下的不完備性而提出的一個思想實驗。實驗內容如下:

把一隻貓放進一個封閉的盒子里,然後把這個盒子連接到一個包含一個放射性原子核和一個裝有有毒氣體的容器的實驗裝置。設想這個放射性原子核在一個小時內有50%的可能性發生衰變。如果發生衰變,它將會發射出一個粒子,而發射出的這個粒子將會觸發這個實驗裝置,打開裝有毒氣的容器,從而殺死這隻貓。根據量子力學,未進行觀察時,這個原子核處於已衰變和未衰變的疊加態,但是,如果在一個小時後把盒子打開,實驗者只能看到「衰變的原子核和死貓」或者「未衰變的原子核和活貓」兩種情況。
現在的問題是:這個系統從什麼時候開始不再處於兩種不同狀態的疊加態而成為其中的一種?在打開盒子觀察以前,這隻貓是死了還是活著抑或半死半活?這個實驗的原意是想說明,如果不能對波函數塌縮以及對這隻貓所處的狀態給出一個合理解釋的話,量子力學本身是不完備的。

這個思想實驗的意義是,將量子理論從微觀領域帶到了巨觀領域,而導出和一般常識相衝突的結果。根據哥本哈根學派的解釋,當觀察者未打開盒子之前,貓處於一種「又死又活」的狀態,該狀態可以用一個波函數來描述,而波函數可由薛丁格方程式解出。一旦觀察者打開盒子觀察,波函數會坍塌(Collapse),貓呈現在觀察者面前的只會是「生」或「死」的狀態之一。這導致了對世界客觀性和人意識的作用的討論。

根據多世界理論,當觀察者打開盒子的一刻,世界會分裂成多個世界,而觀察者只能進入眾多的世界其中的一個,而觀察結果就因此只有一個,貓是「生」或「死」。而在其他世界里貓的狀態會由薛丁格方程式決定。其生存的機率越大,貓倖存下來而處於其中的世界的數目就越多。

薛丁格可被視為一個佯謬,由「不確定」的衰變-檢測器-毒藥-貓的生死構成一條因果鏈,將量子的不確定與巨觀物質(貓的生死)的不確定性聯繫起來,而根據日常經驗,無論我們是否觀察,貓的狀態必為生或死中之一。

命定悖論

命定悖論或命運悖論( Predestination paradox ,命運註定的悖論),又稱因果循環( Causal loop 或 Causality loop ,與佛教的業德去返無關),是科幻作品中與時間旅行有關的悖論。

這悖論大致與祖父悖論相反:

如果自己返回過去,將自己的祖父殺死,那麼自己的父母就會不曾出現過,隨之而言就連自己的存在也消失,把自己從(這個平行宇宙分支的)時間洪流中「消去」。

命定悖論是其中一個去解釋「為何歷史事實不被時間旅行中所作出的改變而受影響」的方法,就是:

改變歷史的做法,不論企圖與否,最終都會引致歷史所「命定」的結果,而並非作出之外的改變。

(Novikov self-consistency principle)提出,只有事件屬前後一致的因果循環才能出現,矛盾的則不能。

祖父悖論

祖父悖論是一種時間旅行的悖論,科幻故事中常見的主題。最先由法國科幻小說作家赫內·巴赫札維勒(René Barjavel)在他1943年的小說《不小心的旅遊者》(Le Voyageur Imprudent)中提出。情景如下:

假設你回到過去,在自己父親出生前把自己的祖父母殺死;因為你祖父母死了,就不會有你的父親;沒有了你的父親,你就不會出生;你沒出生,就沒有人會把你祖父母殺死;若是沒有人把你的祖父母殺死,你就會存在並回到過去且把你的祖父母殺死,於是矛盾出現了。

平行宇宙

物理學家認為,也許世界是由無數個平行宇宙組成的,而當你回到過去殺你的祖父母時,你殺的其實是另一個宇宙的人(或者你的這個舉動也可以創造一個新的平行宇宙),而這個人(你的「祖父」或「祖母」)的死只會使那個平行宇宙的「你」不再存在,而這個平行宇宙的「你」則平安無事。

* 在量子物理中,「多個世界」理論可以如此理解:對於每一個似乎隨機的事件來說,只要它的可能性不是零,它所有可能的情形都會在不同的平行世界中發生,造成歷史的分支。物理學家大衛·多伊奇(David Deutsch)認為,當你回到過去去殺你的祖父母時,你其實進入了另一個世界,殺的是另一個世界的人。(那個世界與你的世界的差別僅在於你祖父母死了)
* M理論,作為至今最有可能結合5種不同的弦論的理論,是如此解釋平行宇宙的:多個三維的「膜」可以同時在一個四維的宇宙(不是愛因斯坦的三維空間加一維時間;見膜宇宙學)中存在;這些膜之間的撞擊會在膜中產生大量的能量——這也可以解釋大爆炸是如何起源的。可是,M理論並不能解釋不同膜的歷史之間的關係,也不能肯定,當你回到過去時,你會進到另一個膜裏面。

羅素悖論(Russell's paradox)

羅素悖論(Russell's paradox),也稱為理髮師悖論,是羅素於1901年提出的悖論,是一個關於類的內涵問題。

羅素悖論:設性質P(x)表示「x\not\in x」,現假設由性質P確定了一個類A——也就是說「A=\{x|x \not\in x\}」。那麼現在的問題是:A\in A是否成立?首先,若A\in A,則A是A的元素,那麼A具有性質P,由性質P知A\not\in A;其次,若A\not\in A,也就是說A具有性質P,而A是由所有具有性質P的類組成的,所以A\in A。

「理髮師悖論」悖論內容

一位理髮師說:「我只給不給自己刮臉的人刮臉。」那麼他是否給自己刮臉呢?如果他給的話,但按照他的話,他就不該給自己刮臉;如果他不給的話,但按照他的話,他就該給自己刮臉。於是矛盾出現了。

書目悖論

書目悖論與理髮師悖論基本一致。可以說是羅素悖論的另一種通俗表達形式。內容是:一個圖書館要編纂一本書,其內容是列出該圖書館里所有不列出自己書名的書的名字。那麼作為目錄的書該不該列出自己的書名?

布雷斯悖論

在一個交通網路上增加一條路段反而使網路上的旅行時間(travel time)增加了,而且是所有出行者的旅行時間都增加了,這一附加路段不但沒有減少交通延滯,反而降低了整個交通網路的服務水準(level of service),這種出力不討好且與人們直觀感受相背的交通網路現象就是人們所說的Braess 悖論現象。

唐·吉訶德悖論

桑丘·潘薩在他治理的島上頒布一條法例,規定過橋的旅客必需誠實地表示自己的目的,否則就會被絞死。 有一個旅客在見到橋上的告示後,宣稱自己過橋是要被絞死的。

這使執法者感到為難:如果該人的言論為真,則他應被釋放,但如此一來其言論即變為假。如其言論為假,則他會被絞死,但如此一來其言論即變為真。該旅客被帶到桑丘面前,而桑丘最後把他釋放。

謊言者悖論

謊言者悖論最常見的例子是「我在說謊」這個句子。因若我所說是真(「我在說謊」),那我就不是在說謊;但若我所說是假(「我不在說謊」),那麼我就是在說謊了。所以無論這句子是真或不真,情況都不可能成立。

起源

西元前6世紀,克利特哲學家埃庇米尼得斯(Epimenides)說了一句很有名的話:「所有克利特人都說謊。」

嚴格來說埃庇米尼得斯這句話並不能算是悖論,因為這句話一定是錯的。如果埃庇米尼得斯所言為真,那麼克利特人就全都是說謊者,身為克利特人之一的埃庇米尼得斯自然也不例外,於是他所說的這句話應為謊言,但這跟先前假設此言為真相矛盾;假設此言為假,那麼也就是說有部分克利特人是不說謊的,則表示埃庇米尼得斯說謊,仍符合假設(即埃庇米尼得斯屬於克利特島的人中說謊的部分)。因此,這句話一定是錯的。

聖彼得堡悖論

聖彼得堡悖論是決策論中的一個悖論。

1730年代,數學家丹尼爾·伯努利(Daniel Bernoulli)的表兄尼古拉·伯努利提出一個謎題:擲硬幣,若第一次擲出正面,你就賺1元。若第一次擲出反面,那就要再擲一次,若第二次擲的是正面,你便賺2元。若第二次擲出反面,那就要擲第三次,若第三次擲的是正面,你便賺2*2元...如此類推,即可能擲一次遊戲便結束,也可能反覆擲沒完沒了。問題是,你最多肯付多少錢參加這個遊戲?

這個遊戲的期望值是無限大,即你最多肯付出無限的金錢去參加這個遊戲。但是,你更可能只賺到1元,或者2元,或者4元……那你為什麼肯付出無限的金錢參加遊戲呢?

實驗的論文解釋

丹尼爾·伯努利對這個悖論的解答在1738年的論文里,提出了效用的概念以挑戰以金額期望值為決策標準,論文主要包括兩條原理:

1. 邊際效用遞減原理:一個人對於財富的佔有多多益善,即效用函數一階導數大於零;隨著財富的增加,滿足程度的增加速度不斷下降,效用函數二階導數小於零。
2. 最大效用原理:在風險和不確定條件下,個人的決策行為準則是為了獲得最大期望效用值而非最大期望金額值。

艾爾斯伯格悖論

艾爾斯伯格悖論是決策論中的一個悖論。

1961年丹尼爾·艾爾斯伯格(Daniel Ellsberg)進行了如下實驗:

一個罐中有90個球,已知其中有30個紅球,其餘的60個要麼是黑球,要麼是黃球。現從中隨機抽取一個,並設計4個賭局如下:

賭局A:若是紅球,參賭人得到100元;若是其它顏色得到0元。

賭局B:若是黑球,參賭人得到100元;若是其它顏色得到0元。

賭局C:若是黑球,參賭人得到0元;若是其它顏色得到100元。

賭局D:若是紅球,參賭人得到0元;若是其它顏色得到100元。

實驗調查結果發現多數人在A、B之間選擇A而非B;在C、D之間選擇D而非C。

實驗結論

實驗結論即艾爾斯伯格悖論,它表明人是模糊厭惡(Ambiguity averse)的,即,不喜歡他們對某一博弈的機率分佈不清楚,也即,人在冒險時喜歡用已知的機率作根據,而非未知的機率。人在決策是否參賭一個不確定事件的時候,除了事件的機率之外,也考慮到它的來源。

錢包遊戲

錢包悖論,又稱錢包遊戲,是機率論中的一個悖論。

內容

A和B兩人進行一場賭博。

賭法是:由第三者計算A、B二君錢包裏面的錢,錢少者可以贏走錢多者的錢。

A對於這場賭博的想法為:若B君的錢比我少,我可能輸掉我現有的錢。但若B君的錢比我多,我贏了,就會得到多於我現有的錢。我能夠贏的錢比輸的錢多,所以這場賭博對我有利。

而B的想法也是如此。

二人想法的邏輯都正確,但若認為二人的想法都正確,又將做出這場賭博對A、B二人都有利的錯誤結論。這顯然是一個悖論。

來源

錢包悖論源自法國數學家莫里斯·克萊特契克,在他的《數學消遣》書中賭的是領帶而非錢.

「有兩個人都聲稱他的領帶好一些。他們叫來了第三個人,讓他作出裁決到底誰的好。勝者必須拿出他的領帶給敗者作為安慰。兩個爭執者都這樣想:我知道我的領帶值多少。我也許會失去它,可是我也可能贏得一條更好的領帶,所以這種比賽是對我有利。一個比賽怎麼會對雙方都有利呢?」

分析

克萊特契克的分析

克萊特契克在他的書中指明必須限制條件,這才是一場公平的遊戲,例如A,B二人對對方穿領帶的習慣一無所知等。

他還假定每一個比賽者帶有從0到任意數量(比如說一百元)的錢。以此假定構成兩人錢數的矩陣,就可看出這個此賽是「對稱的」,不會偏向任何一方。

但他沒有指出兩個比賽者的想法錯在哪裡。

考慮勝算

其實問題就在A,B二人只以「可以贏更多的錢」這點,就做出這場賭博對自己有利的結論,當然是錯誤的。顯然是缺乏思考,對客觀事物的複雜程度缺乏認識,才會做出如此樂觀的結論。

這場賭博對誰有利的考慮誰可以贏得這場賭博。而不是以「可以贏更多的錢」來判斷。

若以誰有勝算來判斷,必須注意二點:

1. 必須計算期望值。
2. 「錢包里有多少錢」是很隨機的。無法有一定的標準。難以論定這場賭博的勝負,但若將「所有人類的錢包里的錢」相加後除以全人類數目,還是可以得出一個平均值。

若錢包里的錢比平均值小,那勝算比較大,反之較小。各國家,各地區人的錢包里的平均值都不一樣,全人類太廣泛,以國家,地區來分更加有勝算。

但就算是費很大力氣來得到這平均值,還是很難確定有勝算的。由此可見A,B二人認為這場賭博對自己有利的結論是做得多麼輕易,缺乏思考。

其實最有勝算的方法是知道對方的錢包里有多少錢。

另一種分析

錢包只有二個,所以錢包里的錢只存在二個數:

X,Y,設X>Y。

A有1/2機會是X,1/2機會是Y;B也如是。

如果A的錢是Y,則贏得X;如果A的錢是X,則輸掉X;B也如是。

結論:1/2機會贏,1/2機會輸。

而A,B想法的問題出在,他們假設了3個數:

設A有X元,B有Y,(YX)。

但實際上只存在2個數,所以這是錯誤的論證,推理出錯誤的結論。

現實例子

最常見的就是在賭博時,期待「如果贏的話、會贏得比輸得更多」。例如玩吃角子老虎機時認為「就算只中櫻桃,也是翻五倍!」但問題在於:會中嗎?

遊行隊伍悖論

首先假設在操場上,在一瞬間(一個最小時間單位)裡,相對於觀眾席A,列隊B、C將分別各向右和左移動一個距離單位。

 □□□□ 觀眾席A
 ■■■■  列隊B・・・向右移動(→)
 ▲▲▲▲  列隊C・・・向左移動(←)

B、C兩個列隊開始移動,如下圖所示相對於觀眾席A,B和C分別向右和左各移動了一個距離單位。

 □□□□
  ■■■■
▲▲▲▲

而此時,對B而言C移動了兩個距離單位。也就是,隊列既可以在一瞬間(一個最小時間單位)里移動一個距離單位,也可以在半個最小時間單位里移動一個距離單位,這就產生了半個時間單位等於一個時間單位的矛盾。因此隊列是移動不了的。

飛矢不動

飛矢不動悖論是古希臘數學家芝諾(Zeno of Elea)提出的一系列關於運動的不可分性的哲學悖論中的一個。人們通常把這些悖論稱為芝諾悖論。

芝諾提出,由於箭在其飛行過程中的任何瞬間都有一個暫時的位置,所以它在這個位置上和不動沒有什麼區別。中國古代的名家惠施也提出過,「飛鳥之景,未嘗動也」的類似說法。


芝諾問他的學生:「一支射出的箭是動的還是不動的?」

「那還用說,當然是動的。」

「確實是這樣,在每個人的眼裡它都是動的。可是,這支箭在每一個瞬間里都有它的位置嗎?」

「有的,老師。」

「在這一瞬間里,它佔據的空間和它的體積一樣嗎?」

「有確定的位置,又佔據著和自身體積一樣大小的空間。」

「那麼,在這一瞬間里,這支箭是動的,還是不動的?」

「不動的,老師」

「這一瞬間是不動的,那麼其他瞬間呢?」

「也是不動的,老師」

「所以,射出去的箭是不動的?」

運動場問題(The dichotomy paradox)

運動場問題(英文:The dichotomy paradox)是芝諾(Zeno)提出的四個悖論中的第一個,又稱為兩分法悖論。

其實四大悖論的關鍵就是人們沒有了解自然界的一個重要概念——「率」的概念。討論任何「變化」的問題的時候,忽略了變化發生的時候,另一個條件也在同時變化。例如討論距離的變化的時候,如果你只考慮長度的變化,而忽略了在長度變化時另一個條件「時間」必定也在變化。這就是速率。在速度變化時,有了加速度的概念。加速度變化時,照樣可以用加速度變化的多少和時間變化的多少來表示。

哲學是認識世界的方法和理論。雖然我們一旦發現了率的概念,立刻就可以破解所謂「單一條件變化悖論」,但是悖論的意義就在於激發人們尋找世界真像的好奇心。

在這4大經典悖論中,我們發現世界的變化並不是單一條件獨立變化的,而是多條件同時變化的,這是事實。我們可以用距離除以時間來定義速度,但是速度本身是現實的獨立的存在,而不依靠距離和時間。利用距離和時間來表示,僅僅是人們用自己能夠感知的概念來表示難以感知和表示的事務罷了。比如我們天天坐汽車,但是我們難以直接感知汽車加速度的變化。但是簡單的公式就可以表明這個變化了。

悖論的內容

因為一運動物體在到達目的地之前,必須先抵達距離目的地之一半的位置。即:若要從A處到達B處,必須先到AB中點C,要到達C,又須先到達AC的中點D。如此繼續劃分下去,所謂的「一半距離」數值將越來越小。最後「一半距離」幾乎可被視為零。

這就形成了此一物體若要從A移動到B,必須先停留在A的悖論。這樣一來,此物體將永遠停留在初始位置(或者說物體初始運動所經過的距離近似0),以至這物體的運動幾乎不能開始。因此,我們得出了運動不可能開始的結論。

見《莊子·天下篇》,莊子提出:「一尺之捶,日取其半,萬世不竭。」

悖論的解釋

其實此悖論的解釋如下:

此悖論在設立時有意忽略了一個事實:那就是從A到B的「運動」必須是一個時間相關的概念而不僅僅是距離的概念。也就是說如果運動的速度為0的時候這個悖論為真!但是一旦運動起來,必然有一個速度,速度等於經過的距離除以歷經的時間。什麼時候速度為0呢?一種情況是距離為0,根本沒有要動,另一種情況大家一般會忽略掉,就是經歷的時間趨近於無限,不論距離多大,只要是一個固定值,那麼速度就是0,於是悖論就成立了。

此悖論雖然沒有提及時間,但是卻故意掩蓋了時間這個因素。

這同最小分割無關,因為在數學上,無限分割是成立的。

阿萊悖論(Allais Paradox)

1952年,法國經濟學家、諾貝爾經濟學獎獲得者阿萊作了一個著名的實驗:

對100人測試所設計的賭局:

* 賭局A:100%的機會得到100萬元。
* 賭局B:10%的機會得到500萬元,89%的機會得到100萬元,1%的機會什麼也得不到。

實驗結果:絕大多數人選擇A而不是B。即賭局A的期望值(100萬元)雖然小於賭局B的期望值(139萬元),但是A的效用值大於B的效用值,即1.00U(1m) > 0.89U(1m) + 0.01U(0) + 0.1U(5m)。【1】

然後阿萊使用新賭局對這些人繼續進行測試,

* 賭局C:11%的機會得到100萬元,89%的機會什麼也得不到。
* 賭局D:10%的機會得到500萬元,90%的機會什麼也得不到。

實驗結果:絕大多數人選擇D而非C。即賭局C的期望值(11萬元)小於賭局D的期望值(50萬元),而且C的效用值也小於D的效用值,即0.89U(0) + 0.11U(1m) <>

悖論

悖論,亦作弔詭或詭局(在有些場合「佯謬」是悖論的別名),是指一種導致矛盾的命題。悖論的英文paradox一詞,來自希臘語「para+dokein」,意思是「多想一想」。 如果承認它是真的,經過一系列正確的推理,卻又得出它是假的;如果承認它是假的,經過一系列正確的推理,卻又得出它是真的。古今中外有不少著名的悖論,它們震撼了邏輯和數學的基礎,激發了人們求知和精密的思考,吸引了古往今來許多思想家和愛好者的注意力。解決悖論難題需要創造性的思考,悖論的解決又往往可以給人帶來全新的觀念。

英文paradox其實亦有「似非而是」的解釋。即是用普通常識看上去不正確﹐但其實是正確或是有可能的。例如「站著比走路更累」。一般常識是走路比站著累。但要一個人例如在公園裡站一個小時﹐他可能寧願走動一個小時﹐ 因為「站著比走路更累」。也例如狹義相對論裡面的雙生子佯謬(Twin Paradox) 亦是另外一個例子。

亨佩爾的烏鴉

烏鴉悖論,也叫做亨佩爾的烏鴉或亨佩爾悖論,是二十世紀四十年代德國邏輯學家卡爾·古斯塔夫·亨佩爾(Carl Gustav Hempel)為了說明歸納法違反直覺而提出的一個悖論。

幾千年以來,無數人觀察了許多事務,比如地心引力法則,人們趨於相信其極可能是真理。這種類型的推理可以總結成「歸納法原理」:

如果實例 X 被觀察到和論斷 T 相符合,那麼論斷 T 正確的機率增加。

亨佩爾給出了歸納法原理的一個例子: 「所有烏鴉都是黑色的」論斷。我們可以出去觀察成千上萬隻烏鴉,然後發現他們都是黑的。在每一次觀察之後,我們對「所有烏鴉都是黑的」的信任度會逐漸提高。歸納法原理在這裏看起來合理的。

現在問題出現了。「所有烏鴉都是黑的」 的論斷在邏輯上和「所有不是黑的東西不是烏鴉」等價。如果我們觀察到一隻紅蘋果,它不是黑的,也不是烏鴉,那麼這次觀察必會增加我們對「所有不是黑的東西不是烏鴉」的信任度,因此更加確信「所有的烏鴉都是黑的」!

解決它和直覺的衝突,哲學家們提出了一些方法。美國邏輯學家納爾遜·古德曼(en:Nelson Goodman)建議對我們的推理添加一些限制,比如永遠不要考慮支持論斷「所有P滿足Q」且同時也支持「沒有P滿足Q」 的實例。

其他一些哲學家質疑「等價原理」。也許紅蘋果能夠增加我們對論斷「所有不是黑的東西不是烏鴉」的信任度,而不增加我們對 「所有烏鴉都是黑色的」信任。這個提議受到質疑,因為你不能對等價的兩個命題有不同的信任度,如果你知道他們都是真的或都是假的。

古德曼,以及其後的威拉德·馮·奧曼·蒯因,使用術語「projectible predicate」來描述這些類似於「烏鴉」和「黑色」的命題,所有這類命題是支持歸納推理法的;而「非projectible predicate」則為與只相反的後者,如「非黑」和「非烏鴉」這些命題並不支持歸納推理法。蒯因還提出一個需要證實的猜想:如果任何命題是projectible的;在無限物件組成的全集中,一個projectible的命題的補集永遠是非projectible的。

這樣一來,雖然「所有烏鴉都是黑的」和「所有不是黑的東西都不是烏鴉」這兩個命題所擁有的信任度必須相等,但只有「黑色的烏鴉」才能同時增加兩者的信任度,而「非黑色的非烏鴉」並不增加任何一個命題的信任度。

還有些哲學家認為其實這個命題是完全正確的,出錯的是我們自己的邏輯。其實觀察到一個紅色的蘋果確實會增加烏鴉都是黑色的可能性!這就相當於:如果有人把宇宙中所有不是黑的物體都給你看,而你發現所有的物體都不是烏鴉,那你就完全可以斷定所有烏鴉都是黑的了。這個「悖論」看上去荒謬只是因為宇宙中「不是黑的」物體遠遠多於「烏鴉」,所以發現一個「不是黑的」物體只增加了極其微小的對於「烏鴉都是黑的」的信任度,而相對而言,每發現一隻黑的烏鴉就是一個有力的證據了。

惡魔的證明

拉丁語probatio diabolica(devil's proof),日語翻成「惡魔的證明」,這通常是在修辞学rhetoric.或是詭辯sophistry上,很常被提起的話題。原意是,歐洲中古的宗教奇蹟劇中常演的劇本,有人把靈魂出賣給惡魔,事後反悔就找惡魔理論,想要回自己的靈魂,於是惡魔就要這些人證明,這靈魂是屬於他(這些人)的!通常都是失敗收場,也就是業已出賣給惡魔的靈魂,要再要回來,就會面臨惡魔刁難的難題。後來引伸為,對於異常困難證明的難題,就用「惡魔的證明」比喻。

後來中世的法學者,在解釋古羅馬法中,有關所有權的證明的困難時,也以「惡魔的證明」做比喻。古代羅馬法中,對於自己的土地或物的所有權立證時,除了自己從前主的權利繼承說明之外,還有必須針對前主的所有權立証,對前主的所有權立証,又必須交代前主的前主的所有權,如此無限追朔的困難,就類似來自於惡魔,所要求証明靈魂所有的難題一樣。

後來又引申為,事實有無的爭論中,立証責任的歸屬,事實的認定當中,有積極的事實和消極的事實,所謂積極的事實,簡單的說:就是某事實確實是存在,而消極的事實則是指:某事實並不存在。現代法的精神當中,通常把事實證明的責任,歸屬於積極事實的主張的一方,把証明的責任歸給消極事實一方,就如惡魔給的証明一般,非常困難而且不妥!有的東西(事實)的舉證,比較簡單可行,無的東西(事實),卻可能無從著手或者異常困難。

主要是在說,要證明"沒有"遠遠比證明"有"要困難的多

例如,要證明惡魔的存在很簡單,只要叫惡魔跳出來揮揮手就可以了,但是要證明沒有卻是不可能的,因為無法證明惡魔是不是躲在人類看不到的地方

要證明這是完全密室是不可能的,因為有可能有其他進入房間的方法,只是沒有想到

2009年7月17日 星期五

仙劍三

結束了~

只能說打起來還蠻累的(  ̄ c ̄)y▂ξ

不過劇情很好XD

2009年7月13日 星期一

GPG error

error:
W: GPG error: http://ppa.launchpad.net hardy Release: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY 6AF0E1940624A220

solution:
gpg --keyserver keyserver.ubuntu.com --recv 0624A220
gpg --export --armor 0624A220 | sudo apt-key add -

Do the same for other key...
Last 8 digits...

Linux個人常用套件整理~

個人Linux其實比Windows還常重灌
得多備份才是

(1)ntfs-3g
用來看ntfs的磁區,算是必裝的套件~

(2)LXDE
桌面,和gnome(Ubuntu預設)、kde(KUbuntu預設)、xfce(XUbuntu預設)三者一樣,不過最大的著重點在於輕量,所用的套件都是相依套件較少的,並以pcmanfm為視窗管理,個人覺得還不錯,大家可以裝裝看XD

(3)gdm
登入管理套件,裝了這個之後就可以自動登入桌面,不同再打指令了~

(4)xorg
這是一定要裝的,不然就沒桌面可用了

(5)firefox
網路瀏覽器,除了重了之外,有插件真的讓它十分的方便~

(6)mplayer & w32codecs
影音播放套件,加上w32codecs之後一樣可以播幾乎所有的格式

(7)audacious
音樂播放套件,和winamp長得很像,主要是加上官方的混音器設定檔後,音質也變得也不錯,有支援插件和快捷鍵,也是十分的方便

(8)gimp
圖片編輯套件,在Linux下頗負盛名的套件,不過對於我來說有些難用XD

(9)wine
可以讓linux跑windows軟體的套件,有時還是有些軟體想用windows時必備,有人成功用這個套件來跑魔獸世界~

(10)VirtualBox
和vmware是同性質的套件,有些軟體用wine還是無法順利模擬時(像是gogobox,因為用上ie+activex,完全無法在linux下跑),就要用上vb了,直接在linux下再跑一個windows出來

(11)madedit
文字編輯套件,個人一直很喜歡用的一個,有簡字轉繁字的功能

(12)vim
文字編輯套件,特色是直接在terminal下跑,有插件的功能和很多設定不完的參數,十分之好用,而且能應付當設定失敗造成無法開啟XWindow的文字編輯,寫程式時也十分好用,大推XDDDD

(13)gcc
編譯器,用來編譯C/C++

(14)jdk jre
JAVA用,jdk是寫,jre是跑

(15)synaptics
套件管理,非常方便,屬於一定要裝的類型

(16)xarchiver p7zip unrar
解壓縮用套件,加上後面兩個就可以應付7z和rar格式

(17)gcin
輸入法,沒有這個就不用打中文了XD,不過沒有預設嘸蝦米比較麻煩

(18)stardict
字典套件,用來查單字很方便,windows下也有,推大家裝XD

(19)lazybuntu
官網
可以省下不少力氣的套件,點一點之後就可以裝好很多套件,很方便~
註:lazyscript也是同性質的套件,大家也可以用看看~

(20)pcmanx
在linux下的pcman,有一點問題其實,不過上b很ok的XD

(21)k3b
在linux下很方便的燒錄軟體,功能很強大,和nero有得拚

(22)pidgin
和msn相同的性質,windows下也有,有一個很強大的功能就是可以同時登入很多組帳號,而且是很多不同的通訊協定,像我是一次登入yahoo、msn和google talk,不用像在windows下開三個軟體,造成資源的浪費

(23)epdfview
在linux的輕量級pdf閱讀套件,功能很陽春,但是單純用來看是很夠的~

(24)openoffice
和M$ Office有得拚的軟體,有支援pdf輸出

(25)wicd
連線用套件~

(26)localepurge
用來刪除多餘語言套件~

(27)gnome-screenshot
如果用的桌面不是gnome的話,就會沒有這個抓螢幕畫面用的套件,裝起來要用掉20mb左右

2009年7月12日 星期日

Ubuntu下掛載NTFS

得先裝ntfs-3g

sudo apt-get install ntfs-3g

寫在/etc/fstab裡

sudo vim /etc/fstab

加在最下面:

/dev/sda4 /media/SYS ntfs-3g defaults,gid=100,umask=0,locale=zh_TW.utf8 0 0
/dev/sda5 /media/DATA ntfs-3g defaults,gid=100,umask=0,locale=zh_TW.utf8 0 0

2009年7月7日 星期二

Cygwin問題解決

顯示中文

安裝好cygwin之後,發現無法在console看到中文,必須做以下設定

1. ~/.bashrc
stty cs8 -istrip
stty pass8
export LANG=C
export LC_CTYPE=iso-8859-1
alias ls="ls --show-control-chars"
alias crxvt='rxvt -fm "細明體-16" -fn "細明體-16" -km big5 -e bash --login -i'
2. ~/.inputrc
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

參考:

* http://sources.redhat.com/ml/cygwin/2001-07/msg00311.html
* http://www2.cs.uh.edu/~kcting/blog/index.cgi/opencontent/cygwin/CygwinHOWTO.html

VI中的 Backspace 與 Delete 按鍵異常

首先確定 $TERM的設定為cygwin

echo $TERM

若不是,請設定為

TERM = cygwin
export TERM

Backspace 與 Delete這兩個鍵正常狀況下只有一個有用。可在 $HOME/.bash_profile 任選一個來使用

stty erase '^H' //ctrl+v, ctrl+h

stty erase '^?'
參考:

* http://www.mgt.ncu.edu.tw/~dino/unix/editor03.htm
* http://www.ibb.net/~anne/keyboard/keyboard.html#Bash
* http://ece.niu.edu.tw/~chu/download/doc/UNIX.txt

ls 無法看見顏色

可編輯 /etc/bashrc 或家目錄下的 .bashrc ,加入下列指令

alias ls='ls -F -N --color=auto'

要立即生效的話,則執行下列命令

source /etc/bashrc



source .bashrc
應用
在Cygwin上安裝ssh伺服器

1. OS修改環境變數:path增加d:\cygwin\bin
2. OS增加環境變數:CYGWIN=ntsec tty
3. Cygwin安裝必要的套件:OpenSSH,cygrunsrv
4. Cygwin設定OpenSSH:
1. 執行 ssh-host-config
2. Should privilege separation be used? (yes/no) :yes
3. Should this script create a local user 'sshd' on this machine? (yes/no) :yes
4. Do you want to install sshd as service? (yes/no) :yes
5. Default is "ntsec" . CYGWIN=ntsec tty
5. 手動啟動OpenSSH服務:net start sshd
6. 手動關閉OpenSSH服務:net stop sshd


註:
gcc在devel裡
vim在editor裡
ncourse在libs裡(裝了之後可以使用clear指令)

Java on Cygwin

因為Cygwin算是一個Shell,而Java認的是OS,所以在Cygwin底下使用JDK版本仍為windows版本

如果已經安裝好windows版本的JDK,那麼只需在Cygwin中設好PATH即可:在命令提示字元後鍵入以下指令:
$ PATH="$PATH":[jdk的位置]
在我的環境下是輸入:
$ PATH="$PATH":/cygdrive/c/Program\ Files/Java/jdk1.6.0_12/bin

2009年7月6日 星期一

archlinux 整理

首先先是老哥網誌的整理文

[archlinux]archlinux+LXDE心得文

archlinux最特別的就是pacman了~
所以附上一些pacman的資料

Pacman Wiki:
http://wiki.archlinux.org/index.php/Pacman


一些基本指令的介紹:
http://blog.sssun.com/2006/02/21/20

Arch Linux pacman 加速:
http://blog.chinaunix.net/u2/74004/showart_1770408.html

其他:
http://hi.baidu.com/camark/blog/item/58962e7a5552d9ee2f73b31d.html


http://wiki.archlinux.org/index.php/LXDE


筆記:
記得到
/etc/pacman.d/mirrorlist裡
把#Server=http://archlinux.unixheads.org/$repo/os/i686前的#去掉


小心得:
愈是強大愈是難搞
在Ubuntu下很多理所當然的存在
在archlinux不一定是如此
如果要換到過來勢必要多學很多東西
也會多遇到很多麻煩
不過相對的會多學到很多
有興趣的就玩看看吧~�很很

2009年7月4日 星期六

協會盃

話說這一次就沒得名了XD

今天難得比較早起了

因此到會場時才八點半左右

跟之前每次都是最後一刻才到真的差好多= =

開始前和學長最後練了一下

也就上陣了

其實到了第三次參賽了

我用的方法和招式倒是一點進步都沒有

一直是同一套

是升五級時考的三招

也是最常練

可是不論怎麼練

總覺得最基礎的三招就是練不好

也許這就是武術最神奇的地方吧

最基礎的是最重要的也是最難練好的

---------------------------------------------------

其實這一次沒得名也算鬆了一口氣

希望這樣可以去除掉那些雜念

學合氣道的初衷在於強身健體及保護自己和他人

到了下半年

一直在比賽

的確

比賽讓人進步得快

但還是不希望自己是為了比賽而如此的努力

要將練習視為一種鍛練

或許在老師的眼中我一直缺少了身為一個武者該有的感覺

一直說我在做技法時沒有精神

但這是我的道

因此會這樣一直下去

吉屋出租/Rent

看到哭出來了T.T

真的是很不錯的電影

這是一部歌舞片

因此整部片基本上就是由很多的歌所組成

有點像歌舞青春的感覺

如果喜歡這一類的一定要看看

我載到的版本沒有字幕

因此是直接看了o(一︿一+)o

以下是電影情報入口網的簡介:

故事描述一群住在紐約的波希米亞人,他們的生活、友誼,以及彼此間錯綜複雜的愛情難
題。而同性、異性間的愛慕情感,以及愛滋病的威脅陰影,都對他們的生活與價值觀產生
了莫大的影響。而當他們面對著生命與情感的挑戰,他們決定以歌舞揮灑熱情

其中最感人還是當Angel死掉的時候

在喪禮上的那一幕

真的是十分的感人T.T

實在不大會打心得(  ̄ c ̄)y▂ξ

還是請有興趣的人自己找來看看吧~

選課

我大二上下的學分都只剩九學分了

為此得再找些課來修才行XD

計畫列表:

上學期

計算機組織與組合語言 3 一678

離散數學 3 三345(二345)

線性代數 3 四678

自動機與形式語言 3 二234 || 四234

社會學甲 3 二234

A58 普通心理學丙 2 二567

A5 領導與管理概論 3 三234

經濟學一 2 || 3 一34 && 五234

體育三(未定) 1

通識只好等課程出來之後再說了

//很快就衝堂了= =

下學期

數位電子學 3 一678

設計模式與軟體開發 3 二34@

社會學甲 3 二234

系統程式 3 三234

機率 3 四678

服務二 0

[轉]心理學的十個效應

文章轉自 http://www.u148.net/article/894.html

1.鳥籠效應

掛一個漂亮的鳥籠在房間裏最顯眼的地方,過不了幾天,主人一定會做出下面兩個選擇之
一:把鳥籠扔掉,或者買一隻鳥回來放在鳥籠裏。這就是鳥籠邏輯。過程很簡單,設想你
是這房間的主人,只要有人走進房間,看到鳥籠,就會忍不住問你:“鳥呢?是不是死了
?”當你回答:“我從來都沒有養過鳥。”人們會問:“那麼,你要一個鳥籠幹什麼?”
最後你不得不在兩個選擇中二選一,因為這比無休止的解釋要容易得多。鳥籠邏輯的原因
很簡單:人們絕大部分的時候是採取慣性思維。所以可見在生活和工作中培養邏輯思維是
多麼重要。


2、破窗效應

心理學的研究上有個現象叫做“破窗效應”,就是說,一個房子如果窗戶破了,沒有人去
修補,隔不久,其他的窗戶也會莫名其妙的被人打破;一面牆,如果出現一些塗鴉沒有清
洗掉,很快的,牆上就佈滿了亂七八糟,不堪入目的東西。一個很乾淨的地方,人會不好
意思丟垃圾,但是一旦地上有垃圾出現之後,人就會毫不猶疑的拋,絲毫不覺羞愧。這真
是很奇怪的現象。


任何壞事,如果在開始時沒有阻攔掉,形成風氣,改也改不掉,就好象河堤,一個小缺口
沒有及時修補,可以崩壩,造成千百萬倍的損失。

犯罪其實就是失序的結果,紐約市在80年代的時候,真是無處不搶,無日不殺,大白天走
在馬路上也會害怕。地鐵更不用說了,車廂髒亂,到處塗滿了穢句,坐在地鐵裏,人人自
危。我雖然沒有被搶過,但是有位教授被人在光天化日之下,敲了一記悶棍,眼睛失明,
從此結束他的研究生涯,使我多少年來談虎變色,不敢隻身去紐約開會。最近紐約的市容
和市譽提升了不少,令我頗為吃驚,一個已經向下沉淪的城市,竟能死而復生,向上提升


因此,當我出去開會,碰到一位犯罪學家時,立刻向他討教,原來紐約市用的就是過去書
本上講的破窗效應的理論,先改善犯罪的環境,使人們不易犯罪,再慢慢緝凶捕盜,回歸
秩序。

當時這個做法雖然被人罵為緩不濟急,“船都要沉了還在洗甲板”,但是紐約市還是從維
護地鐵車廂乾淨著手,並將不買車票白搭車的人用手銬銬住排成一列站在月臺上,公開向
民眾宣示政府整頓的決心,結果發現非常有效。

員警發現人們果然比較不會在乾淨的場合犯罪,又發現抓逃票很有收穫,因為每七名逃票
的人中就有一名是通緝犯,二十名中就有一名攜帶武器,因此員警願意很認 真地去抓逃
票,這使得歹徒不敢逃票,出門不敢帶武器,以免得不償失、因小失大。這樣紐約市就從
最小、最容易的地方著手,打破了犯罪環結(chain),使這個惡性循環無法繼續下去。


3、責任分散效應

1964年3月13日夜3時20分,在美國紐約郊外某公寓前,一位叫朱諾比白的年輕女子在結束
酒巴間工作回家的路上遇刺。當她絕望地喊叫:“有人要殺人 啦!救命!救命!”聽到喊叫
聲,附近住戶亮起了燈,打開了窗戶,兇手嚇跑了。當一切恢復平靜後,兇手又返回作案
。當她又叫喊時,附近的住戶又打開了電燈, 兇手又逃跑了。當她認為已經無事,回到
自己家上樓時,兇手又一次出現在她面前,將她殺死在樓梯上。

在這個過程中,儘管她大聲呼救,她的鄰居中至少有38位 到窗前觀看,但無一人來救她\
,甚至無一人打電話報警
。這件事引起紐約社會的轟動,也引起了社會心理學工作者的重視和思考。人們把這種眾
多的旁觀者見死不救 的現象稱為責任分散效應。

對於責任分散效應形成的原因,心理學家進行了大量的實驗和調查,結果發現:這種現象
不能僅僅說是眾人的冷酷無情,或道德日益淪喪的表現。因為在不同的場合,人們的援助
行為確實是不同的。當一個人遇到緊急情境時,如果只有他一個人能提供幫助,他會清醒
地意識到自己的責任,對受難者給予幫助。如果他見死不救會產生罪惡感、內疚感,這需
要付出很高的心理代價。而如果有許多人在場的話,幫助求助者的責任就由大家來分擔,
造成責任分散,每個人分擔的責任很少,旁觀 者甚至可能連他自己的那一份責任也意識
不到,從而產生一種“我不去救,由別人去救”的心理,造成“集體冷漠”的局面。如何
打破這種局面,這是心理學家正在研究的一個重要課題。

4、帕金森定律

英國著名歷史學家諾斯古德‧帕金森通過長期調查研究,寫出一本名叫《帕金森定律》的
書。他在書中闡述了機構人員膨脹的原因及後果:一個不稱職的官員,可能 有三條出路
,第一是申請退職,把位子讓給能幹的人;第二是讓一位能幹的人來協助自己工作;第三
是任用兩個水準比自己更低的人當助手。這第一條路是萬萬走不 得的,因為那樣會喪失
許多權利;第二條路也不能走,因為那個能幹的人會成為自己的對手;看來只有第三條路
最適宜。於是,兩個平庸的助手分擔了他的工作,他 自己則高高在上發號施令,他們不
會對自己的權利構成威脅。兩個助手既然無能,他們就上行下效,再為自己找兩個更加無
體系。

5、暈輪效應

俄國著名的大文豪普希金曾因暈輪效應的作用吃了大苦頭。他狂熱地愛上了被稱為“莫斯
科第一美人”的娜坦麗,並且和她結了婚。娜坦麗容貌驚人,但與普希金志不同道不合。

當普希金每次把寫好的詩讀給她聽時。她總是捂著耳朵說:“不要聽!不要聽!”相反的
,她總是要普希金陪她遊樂,出席一些豪華的晚會、舞會,普希金為此丟下創作,弄得債
臺高築,最後還為她決鬥而死,使一顆文學巨星過早地隕落。在普希金看來,一個漂亮的
女人也必然有非凡的智慧和高貴的品格,然而事實並非如此,這種現象被稱為暈輪效應。

所謂暈輪效應,就是在人際交往中,人身上表現出的某一方面的特徵,掩蓋了其他特徵,
從而造成人際認知的障礙。

在日常生活中,“暈輪效應”往往在悄悄地影響著我們對別人的認知和評價。

比如有的老年人對青年人的個別缺點,或衣著打扮、生活習慣看不順眼,就認為他們一定
沒出息;有的青年人由於傾慕朋友的某一可愛之處,就會把他看得處處可愛,真所謂“一
俊遮百醜”。暈輪效應是一種以偏概全的主觀心理臆測,其錯誤在於:
第一,它容易抓住事物的個別特徵,習慣以個別推 及一般,就像盲人摸象一樣,以點代\
面;
第二,它把並無內在聯繫的一些個性或外貌特徵聯繫在一起,斷言有這種特徵必然會有另
一種特徵;
第三,它說好就全都肯定,說壞就全部否定,這是一種受主觀偏見支配的絕對化傾向。

總之,暈輪效應是人際交往中對人的心理影響很大的認知障礙,我們在交往中要儘量地避
免和克服暈輪效應的副作用。


6、霍桑效應(Hawthorne effect)

心理學上的一種實驗者效應。20世紀20--30年代,美國研究人員在芝加哥西方電力公司霍
桑工廠進行的工作條件、社會因素和生產效益關係實驗中發現了實驗者效應,稱霍桑效應


實驗的第一階段是從1924年11月開始的工作條件和生產效益的關係,設為實驗組和控制組
。結果不管增加或控制照明度,實驗組產量都上升,而且照明度不變的控制組產量也增加
。另外,有試驗了工資報酬、工間休息時間、每日工作長度和每週工作天數等因素,也看
不出這些工作條件對生產效益有何直接影響。

第二階段的試驗是由美國哈佛大學教授梅奧領導的,著重研究社會因素與生產效率的關係
,結果發現生產效率的提高主要是由於被實驗者在精神方面發生了巨大的變化。參加試驗
注,從而形成了參與試驗的感覺,覺得自己是公司中重要的一部分,從而使工人從社會角
度方面被激勵,促進產量上升。

這個效應告訴我們,當同學或自己受到公眾的關注或注視時,學習和交往的效率就會大大
增加。因此,我們在日常生活中要學會與他人友好相處,明白什麼樣的行為才是同學和老
師所接受和讚賞的,我們只有在生活和學習中不斷地增加自己的良好行為,才可能受到更
多人的關注和讚賞,也才可能讓我們的學習不斷進步,充滿自信!


7、習得性無助實驗

習得性無助效應最早有奧弗米爾和西裏格曼發現,後來在動物和人類研究中被廣泛探討。

簡單地說,很多實驗表明,經過訓練,狗可以越過屏障或從事其他的行為來逃避實驗者加
於它的電擊。但是,如果狗以前受到不可預期(不知道什麼時候到來)且不可控制的電擊
(如電擊的中斷與否不依賴于狗的行為),當狗後來有機會逃離電擊時,他們也變得無力
逃離。而且,狗還表現出其他方面的缺陷,如感到沮喪和壓抑,主動性降低等等。

狗之所以表現出這種狀況,是由於在實驗的早期學到了一種無助感。也就是說,它們認識
到自己無論做什麼都不能控制電擊的終止。在每次實驗中,電擊終止都是在實驗者掌控之
下的,而狗會認識到自己沒有能力改變這種外界的控制,從而學到了一種無助感。

人如果產生了習得性無助,就成為了一種深深的絕望和悲哀。因此,我們在學習和生活中
應把自己的眼光在開闊一點,看到事件背後的真正的決定因素,不要使我們自己陷入絕望


8、證人的記憶

證人,在我們的認識裏,通常都是提供一些客觀的證據的人,就是把自己親眼看到、親耳
聽到的東西如實地講出來的人。

然而,心理學研究證明,很多證人提供的證詞都不太準確,或者說是具有個人傾向性,帶
著個人的觀點和意識。證人對他們的證詞的信心並不能決定他們證詞的準確性,這一研究
結果令人感到驚訝。心理學家珀費可特和豪林斯決定對這一結論進行更深入的研究。為了
考察證人的證詞是否有特別的東西,他們將證人的記憶與對一般知識的記憶進行了比較。

他們讓被試看一個簡短的錄像,是關於一個女孩被綁架的案件。第二天,讓被試回答一些
有關錄像裏內容的問題,並要求他們說出對自己回答的信心程度,然後做再認記憶測驗。
接下來,使用同樣的方法,內容是從百科全書和通俗讀物中選出的一般知識問題。

和以前發生的一樣,珀費可特和豪林斯也發現,在證人回憶的精確性上,那些對自己的回
答信心十足的人實際上並不比那些沒信心的人更高明,但對於一般知識來說,情況就不是
這樣,信心高的人回憶成績比信心不足的人好得多。

人們對於自己在一般知識上的優勢與弱勢有自知之明。因此,傾向於修改他們對於信心量
表的測驗結果。一般知識是一個資料庫,在個體之間是共用的,它有公認的 正確答案,
被試可以自己去衡量。例如,人們會知道自己在體育問題上是否比別人更好或更差一點。
但是,目擊的事件不受這種自知之明的影響。例如,從總體上 講,他們不大可能知道自
己比別人在記憶事件中的參與者頭髮顏色方面更好或更差。


9、羅森塔爾效應

美國心理學家羅森塔爾等人於1968年做過一個著名實驗。他們到一所小學,在一至六年級
各選三個班的兒童進行煞有介事的“預測未來發展的測驗”,然後實驗 者將認為有“優
異發展可能”的學生名單通知教師。

其實,這個名單並不是根據測驗結果確定的,而是隨機抽取的。它是以“權威性的謊言”
暗示教師,從而調動了教師對名單上的學生的某種期待心理。

8個月後,再次智慧測驗的結果發現,名單上的學生的成績普遍提高,教師也給了他們良

的品行評語。這個實驗取得了奇跡般的效果,人們把這種通過教師對學生心理的潛移默化
的影響,從而使學生取得教師所期望的進步的現象,稱為“羅森塔爾效應”,習慣上也稱
為皮格馬利翁效應 (皮格馬利翁是古希臘神話中賽普勒斯國王,他對一尊少女塑像產生

慕之情,他的熱望最終使這尊雕像變為一個真人,兩人相愛結合)。

教育實踐也表明:如果教師喜愛某些學生,對他們會抱有較高期望,經過一段時間,學生
感受到教師的關懷、愛護和鼓勵;常常以積極態度對待老師、對待學習以及對待自己的行
為,學生更加自尊、自信、自愛、自強,誘發出一種積極向上的激情,這些學生常常會取
得老師所期望的進步。

相反,那些受到老師忽視、歧視的學生,久而久之會從教師的言談、舉止、表情中感受到
教師的“偏心”,也會以消極的態度對待老師、對待自己的學習,不理會或拒絕聽從老師
的要求;這些學生常常 會一天天變壞,最後淪為社會的不良分子。儘管有些例外,但大

勢卻是如此,同時這也給教師敲響了警鐘。


10、虛假同感偏差(false consensus bias)

我們通常都會相信,我們的愛好與大多數人是一樣的。如果你喜歡玩電腦遊戲,那麼就有
可能高估喜歡電腦遊戲的人數。你也通常會高估給自己喜歡的同學投票的人 數,高估自
己在群體中的威信與領導能力等等。你的這種高估與你的行為及態度有相同特點的人數的
傾向性就叫做“虛假同感偏差”。有些因素會影響你的這種虛假 同感偏差強度:

(1)當外部的歸因強於內部歸因時;
(2)當前的行為或事件對某人非常重要時;
(3)當你對自己的觀點非常確定或堅信時;
(4)當你的地位或正常生活和學習受到某種威脅時;
(5)當涉及到某種積極的品質或個性時;
(6)當你將其他人看成與自己是相似時。

2009年7月2日 星期四

失敗

失敗學得比成功還多得多

若是一直順利的成功下去

那所看到的景象便會受限制了

我想以後站在別人的立場想時

便會多一份同理心了吧

要加油!

2009年7月1日 星期三

[轉]ArchLinux下LXDE的安裝與設置

受了蠱惑,決定試試LXDE這個輕巧的桌面管理器。
安裝

首先安裝基本的桌面環境:
$ sudo pacman -S lxde

奇怪的是默認並沒有安裝面板lxpanel,而且源裡也沒有,只好從AUR安裝之:
$ yaourt -S lxpanel-svn

(注,幾天後發現,lxpanel出現在官方源裡了)

然後安裝wm,我選擇了openbox(如果只使用compiz,openbox也可以不安裝):
$ sudo pacman -S openbox

然後根據提示把/etc/xdg/openbox下的menu.xml和rc.xml複製到~/.config/openbox下,前者是程序菜單,後者主要是快捷鍵設置。

如果需要,還可以安裝openbox設置管理器:
$ sudo pacman -S obconf

至此安裝完成,登錄時會話選擇LXDE就可以了。
設置

沒有快捷鍵真不爽,所以首先設置它

網上都是說rc.xml用於設置快捷鍵,但是很奇怪,我發現登錄後,快捷鍵沒生效,不過如果運行了fusion-icon,點擊一下reload window manager,快捷鍵就能生效

繼續研究發現,~/.config/openbox下還有一個lxde-rc.xml文件,這裡也可以設置快捷鍵,和上面相反,這裡的設置在登錄後直接就能用,但reload wm後就不能用了。

所以辦法是,對兩個文件都設置,格式如下:

          < keybind key="F9">

< action name="Execute">

< execute>gnome-terminal -x mocp</execute>

< /action>

< /keybind>

其中第一行是要設置的快捷鍵,第三行是相應的命令,把它放在 <keyboard>和</keyboard>之間。

LXDE下我找不到調節音量的東東,所以把音量調節綁定到快捷鍵了:
    <!-- 音量調節 -->
< keybind key="C-KP_3">
< action name="Execute">
< command>amixer -q set Master 3%-</command>
< /action>
< /keybind>
< keybind key="C-KP_9">
< action name="Execute">
< command>amixer -q set Master unmute 3%+</command>
< /action>
< /keybind>

接下來設置一下字體DPI,默認的太小了,我改為96:
$ echo Xft.dpi:96 >> ~/.Xresources

如果使用startx啟動Openbox的話,要在.xinitrc的開始處添加一行:
xrdb -merge ~/.Xresources

其它設置可以用obconf,LXDE會繼承gnome的一些東西,比如登錄時自動運行的程序,在/.config/autostart目錄下。

主題之類的可以在「程序菜單-首選項-外觀」那裡設置,不過不可以設置鼠標指針,關於鼠標主題,另寫一文。

LXDE果然很輕巧,一共才裝了幾個包,體積很小,使用起來不錯,和compiz的結合也非常好,暫時和gnome說拜拜先^_^

早上

藥學奇觀開始動工了

結果今天就在宿舍房間"窗外"施工

結果九點就起床了= =

再來似乎會過著早上定時起來的生活

畢竟有這麼大的一個鬧鐘= =

//我要回嘉QQ

[轉]Vim特殊技巧

讀本文之前請注意:
1. 本文的目標是提供一些vim的使用技巧,利用這些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用,但是現在基本上都是用vim了。
2. 本文是整理和總結使用技巧,而非講解vim入門,因此不會涉及最基本的使用,例如如何上移或下移光標,對此類操作請參閱任何一本vim或者vi教程。
3. 本文閱讀對象是瞭解了vim的基本操作,而希望高效地利用vim進行工作的人。熟練使用vim的人自然不必細讀,如果能留下您的寶貴意見,本人將感激不盡。
4. 本文由本人蒐集整理,轉載請註明出處

本文一般情況下用(裡邊的字母一般大小寫無所謂,除非特別註明)表示按住ctrl同時按下相關字母,命令前加一個i表示在插入模式下用這個命令

1. 選定文字 / 拷貝粘貼

v為可視模式,可以選定多行。選定多行之後,可以用yy或者dd等等進行拷貝和剪切。
p 是粘貼
y 和d 可以直接拷貝或者剪切選定的內容
yw是拷貝一個單詞
如果要複製整行的最簡單辦法就是V,y,p 就行了
v是可以選定一行任意個字符的,V是行選定的,一次一整行,然後通過向下或向上移動光標而選定多行。
對於v選定的,拷貝後就是這麼多,選多少就拷貝多少,而V選定的,粘貼的話會自動換到下一行
命令模式下,也是塊選定,不過是列塊選定

2. 摺疊代碼

可以zf進行摺疊, 用zo打開摺疊,也可以方向鍵向右打開摺疊,zc 關閉摺疊(只要在被摺疊的塊中的任一個語句就行)

3. 縮進代碼

<是左縮進, >是右縮進
按v選定後按=就是自動格式化代碼,自動縮進,內部的遞歸的縮進都做到了
行左移<<,行右移>>,該命令用於調整源碼縮進格式簡便快速。

4. 移動光標

%是從大括號的開始移動到大括號的結束位置
:後邊加行號就是跳到這一行
光標返回到以前的位置。相當於光標移動的「撤銷」
光標返回到後來的位置。相當於光標移動的「恢復」

5. 多文件編輯 / 緩衝區命令

vim下每一個打開的文件對應一個緩衝區(buffer)。
多文件編輯會有兩種情形,一種是在進入 vim 前所用的參數就是多個文件(這種情形稱為 argument list)。另一種情形是進入 vim 後另外再開其它的文件(稱為 buffer list)。不過都可以統稱為buffer。

5.1 打開文件
vi flname1 flname2… flnameN
將多個文件調入緩衝,是 argument list。
:e filename
這是在進入 vim 後,在不離開 vim 的情形下再開其它文件,只要您要編輯的檔案是在目前目錄,Tab 補全鍵還是可以使用。是buffer list。
注意::e 或者:new 或者:split 後邊可以跟目錄,這樣就可以在目錄下慢慢找要打開的文件了

5.2 緩衝區跳轉
:n 編輯下一個文件。
:2n 編輯下二個文件。
:N 編輯前一個文件。注意,這種用法只能用於 argument list 的情形。
:rew 回到首文件
:args 查看當前編輯緩衝文件狀態
:e# 或 Ctrl-^ 編輯前一個檔案,用於兩文件互相編輯時相當好用。這種用法不管是 argument list 或buffer list 檔案間皆可使用。 使用Ctrl-^ 命令更便捷,但如終端類型不正確該功能將無效。
用:ls來顯示緩衝區中的文件,編號後邊有#的代表是前一個文件,可以通過:e#來進入,有%a的代表是當前文件,什麼也沒有的可以通過:bn來進入,這裡的n代表文件編號。
:b文件名或編號 移至該文件。
在 :ls 中就會出示各文件的編號,這個編號在未離開 vim 前是不會變的。這個指令 elvis 也是可以使用。當然 :e#編號 也是可以的,這樣的用法則是所有 vi clone 都通用了。
在 buffers 中,減號 - 表示這個 buffer 並未載入,不過,不必擔心,載入相當快速的。加號 + 表示這個 buffer 已經修改過了。
:bn buffer next。這裡的n代表字母n
:bl buffer last。
以上兩個指令 elvis 不適用。
如果您是使用 vim 的 GUI,那就在菜單上就會有 Buffers 這個選項,可以很容易的知道及移動各buffer 間。

5.3 移除緩衝區
:bd(elete) buffer 在未離開 vim 前是不會移除的,可使用這個指令移除。其實移除它幹什麼呢?vim是您在叫用時才會載入的,因此這些 buffers 並不是像 cache 一般要佔內存的。

5.4 重新編輯
放棄一修改過的文件,重新編輯。
(1)使用命令 :q!強行退出後再vi flname重新進入。
(2)使用命令 :e!強行重編輯更便捷。這樣也是會打開文件,但會放棄目前編輯文件的改變,否則如果文件已有變動,vim 預設是不讓您隨便離開的。:e! 後不接什麼的話,代表捨棄一切修改,重新載入編輯中文件。

5.5 其他命令
:files 或 :buffers 或 :ls 會列出目前 buffer 中的所有文件。
在 elvis 中可使用 :b 來叫出 buffers。
:f 或 Ctrl-g 顯示目前編輯的文件名、是否經過修改及目前光標所在之位置。
:f 文件名 改變編輯中的文件名。(file)
:r 文件名 在光標所在處插入一個文件的內容。(read)
:35 r 文件名 將文件插入至 35 行之後。
gf 這是 vim 的特殊打開文件的方法,會打開光標所在處的 word 為名的文件,當然,這個文件要在當前目錄內,否則會創建新文件。

6. 查找命令

用/查找單詞後,n可以跳到下一個,N則是上一個,:nohls可以取消高亮
查找時,:set ignorecase」項讓VIM忽略大小寫,「:set noignorecase」 來關閉這項功能。

7. 修改文字

cw:刪除一個單詞並進入插入模式,cc:刪除一行並進入插入模式。
r:然後輸入的字母將替換當前字母並保持命令模式,R則是不停的替換(一個挨著一個)。
0到行首,$到行尾。

8. 函數間跳轉

ctrl+]和ctrl+T分別是查找函數的定義和返回,好像需要ctag的支持
i 跳轉到光標所指標識符的定義行,是打開一個新的小窗口顯示,記住要加個i,最好是找自己項目下的文件,否則找庫函數的話還不如man.
大寫 K 看光標所指標識符的 man 幫助頁

9. 窗口命令

= ctrl+w
:split 文件名 同時在一個頁面顯示多個文件的內容,類似多窗口,用切換當前窗口
f 切分顯示光標在處的文件名,VIM 會在 path 中搜索該文件名,比如常用它打開 #include 語句中的文件
_ 當同時打開幾個文件時,按 _ 使當前窗口最大化
用Ctrl-W命令指定光標移動:
Ctrl-W + 擴大窗口
Ctrl-W - 縮小窗口
Ctrl-W h 移動到窗口左邊
Ctrl-W j 移動到窗口下邊
Ctrl-W k 移動到窗口上邊
Ctrl-W l 移動到窗口右邊
等於是按下後,鬆開鍵盤,再按下一個命令就可以了.
如果要關閉分割窗口可以用:close,剩下只有一個窗口的話就不能關了。
多窗口是split,像用e打開多個文件是將文件放在緩衝區中。

10. 自動完成

i 向上搜索,補全一個詞
i 向下搜索,補全一個詞
i 補全一行。
比如你寫過一行 for (int i = 0; i < 100; i++),你想再寫一模一樣的一行,只要輸入 for即可。如果補全出來的不是你想要的那一行,你可以按 選擇上一個或下一個匹配行i 在文件系統中搜索,補全一個文件名
如果按 補全一個詞,在當前文件中沒有找到匹配,VIM 將搜索 #include 語句中的文件,而文件的位置將在 path 中搜索。
i 把上一行對應列的字符抄下來
i 把下一行對應列的字符抄上來,這兩個都可以一直按下去,到了行尾自己會停的.

11. 註釋整塊內容

註釋塊的方法:
選定要註釋掉的行 I // Esc
I之後輸入的東西就是插入到選定的行前邊的,直至Esc.
要去掉註釋的辦法:選定註釋符//,然後d
列塊選定後I是在前邊都插入,A是在後邊都插入
是按列塊模式的選定,是行選定,v是普通選定

12. 其他命令

u可以撤銷上一步操作, ctrl+r可以恢復
i命令執行一個普通模式的命令,執行完畢後回到插入模式,不用多次Esc
i後續字符 輸入特殊的 ASCII 字符或鍵。
. 在光標當前位置處重複上一次操作
:!命令行 執行一條外部命令


本文就說些其中比較有用, 比較常用的命令, 若能熟練運用這些命令, 那麼會發現編輯文件很舒服.

說明:
以下的例子中 xxx 表示在命令模式下輸入 xxx 並回車
以下的例子中 :xxx 表示在擴展模式下輸入 xxx 並回車
小括號中的命令表示相關命令.
在編輯模式或可視模式下輸入的命令會另外註明.

1. 查找

/xxx(?xxx) 表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找.其中xxx可以是正規表達式,關於正規式就不多說了.
一般來說是區分大小寫的, 要想不區分大小寫, 那得先輸入
:set ignorecase
查找到以後, 再輸入 n 查找下一個匹配處, 輸入 N 反方向查找.

*(#) 當光標停留在某個單詞上時, 輸入這條命令表示查找與該單詞匹配的
下(上)一個單詞. 同樣, 再輸入 n 查找下一個匹配處, 輸入 N 反方
向查找.

g*(g#) 此命令與上條命令相似, 只不過它不完全匹配光標所在處的單詞, 而
是匹配包含該單詞的所有字符串.

gd 本命令查找與光標所在單詞相匹配的單詞, 並將光標停留在文檔的非
註釋段中第一次出現這個單詞的地方.

% 本命令查找與光標所在處相匹配的反括號, 包括 () [] {}

f(F)x 本命令表示在光標所在行進行查找, 查找光標右(左)方第一個x字符.
找到後:
輸入 ; 表示繼續往下找
輸入 , 表示反方向查找

2. 快速移動光標
在 vi 中, 移動光標和編輯是兩件事, 正因為區分開來, 所以可以很方便的進行光標定
位和編輯. 因此能更快一點移動光標是很有用的.

w(e) 移動光標到下一個單詞.
b 移動光標到上一個單詞.

0 移動光標到本行最開頭.
^ 移動光標到本行最開頭的字符處.
$ 移動光標到本行結尾處.

H 移動光標到屏幕的首行.
M 移動光標到屏幕的中間一行.
L 移動光標到屏幕的尾行.
gg 移動光標到文檔首行.
G 移動光標到文檔尾行.
c-f (即 ctrl 鍵與 f 鍵一同按下) 本命令即 page down.
c-b (即 ctrl 鍵與 b 鍵一同按下, 後同) 本命令即 page up.

'' 此命令相當有用, 它移動光標到上一個標記處, 比如用 gd, * 等查
找到某個單詞後, 再輸入此命令則回到上次停留的位置.

'. 此命令相當好使, 它移動光標到上一次的修改行.

`. 此命令相當強大, 它移動光標到上一次的修改點.

3. 拷貝, 刪除與粘貼
在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標移動命令
結合的, 看幾個例子就能夠明白了.

yw 表示拷貝從當前光標到光標所在單詞結尾的內容.
dw 表示刪除從當前光標到光標所在單詞結尾的內容.
y0 表示拷貝從當前光標到光標所在行首的內容.
d0 表示刪除從當前光標到光標所在行首的內容.
y$ 表示拷貝從當前光標到光標所在行尾的內容.
d$ 表示刪除從當前光標到光標所在行尾的內容.
yfa 表示拷貝從當前光標到光標後面的第一個a字符之間的內容.
dfa 表示刪除從當前光標到光標後面的第一個a字符之間的內容.

特殊地:
yy 表示拷貝光標所在行.
dd 表示刪除光標所在行.
D 表示刪除從當前光標到光標所在行尾的內容.

關於拷貝, 刪除和粘貼的複雜用法與寄存器有關, 可以自行查詢.

4. 數字與命令
在 vi 中數字與命令結合往往表示重複進行此命令, 若在擴展模式的開頭出現則表示行
號定位. 如:

5fx 表示查找光標後第 5 個 x 字符.

5w(e) 移動光標到下五個單詞.

5yy 表示拷貝光標以下 5 行.
5dd 表示刪除光標以下 5 行.

y2fa 表示拷貝從當前光標到光標後面的第二個a字符之間的內容.

:12,24y 表示拷貝第12行到第24行之間的內容.
:12,y 表示拷貝第12行到光標所在行之間的內容.
:,24y 表示拷貝光標所在行到第24行之間的內容. 刪除類似.

5. 快速輸入字符
在 vi 中, 不要求你輸入每一個字符, 可以有很多種方法快速輸入一些字符.
使用 linux/unix 的同學一定有一個經驗, 在命令行下輸入命令時敲入頭幾個字符再按
TAB 系統就會自動將剩下的字符補齊, 假如有多個匹配則會打印出來. 這就是著名的命令
補齊(其實windows中也有文件名補齊功能). vi 中有許多的字符串補齊命令, 非常方便.

c-p(c-n) 在編輯模式中, 輸入幾個字符後再輸入此命令則 vi 開始向上(下)搜
索開頭與其匹配的單詞並補齊, 不斷輸入此命令則循環查找. 此命令
會在所有在這個 vim 程序中打開的文件中進行匹配.

c-x-l 在編輯模式中, 此命令快速補齊整行內容, 但是僅在本窗口中出現的
文檔中進行匹配.

c-x-f 在編輯模式中, 這個命令表示補齊文件名. 如輸入:
/usr/local/tom 後再輸入此命令則它會自動匹配出:
/usr/local/tomcat/

abbr 即縮寫. 這是一個宏操作, 可以在編輯模式中用一個縮寫代替另一個
字符串. 比如編寫java文件的常常輸入 System.out.println, 這很
是麻煩, 所以應該用縮寫來減少敲字. 可以這麼做:
:abbr sprt System.out.println
以後在輸入sprt後再輸入其他非字母符號, 它就會自動擴展為System.
out.println

6. 替換
替換是 vi 的強項, 因為可以用正規表達式來匹配字符串.以下提供幾個例子.

:s/aa/bb/g 將光標所在行出現的所有包含 aa 的字符串中的 aa 替換為 bb
:s/\/bb/g 將光標所在行出現的所有 aa 替換為 bb, 僅替換 aa 這個單詞
:%s/aa/bb/g 將文檔中出現的所有包含 aa 的字符串中的 aa 替換為 bb
:12,23s/aa/bb/g 將從12行到23行中出現的所有包含 aa 的字符串中的 aa 替換為 bb
:12,23s/^/#/ 將從12行到23行的行首加入 # 字符
:%s= *$== 將所有行尾多餘的空格刪除
:g/^\s*$/d 將所有不包含字符(空格也不包含)的空行刪除.

7. 多文件編輯
在一個 vim 程序中打開很多文件進行編輯是挺方便的.

:sp(:vsp) 文件名 vim 將分割出一個橫(縱)向窗口, 並在該窗口中打開新文件.
從 vim6.0 開始, 文件名可以是一個目錄的名稱, 這樣, vim 會
把該目錄打開並顯示文件列表, 在文件名上按回車則在本窗口打
開該文件, 若輸入 O 則在新窗口中打開該文件, 輸入 ? 可以看
到幫助信息.

:e 文件名 vim 將在原窗口中打開新的文件, 若舊文件編輯過, 會要求保存.

c-w-w vim 分割了好幾個窗口怎麼辦? 輸入此命令可以將光標循環定位
到各個窗口之中.

:ls 此命令查看本 vim 程序已經打開了多少個文件, 在屏幕的最下方
會顯示出如下數據:
1 %a "usevim.html" 行 162
2 # "xxxxxx.html" 行 0

其中:
1 表示打開的文件序號, 這個序號很有用處.
%a 表示文件代號, % 表示當前編輯的文件,
# 表示上次編輯的文件
"usevim.html" 表示文件名.
行 162 表示光標位置.

:b 序號(代號) 此命令將指定序號(代號)的文件在本窗口打開, 其中的序號(代號)
就是用 :ls 命令看到的.

:set diff 此命令用於比較兩個文件, 可以用
:vsp filename
命令打開另一個文件, 然後在每個文件窗口中輸入此命令,就能看
到效果了.

8. 宏替換
vi 不僅可以用 abbr 來替換文字, 也可以進行命令的宏定義. 有些命令輸起來很費勁,
因此我把它們定義到 - 上, 這樣就很方便了.這些配置可以預先寫到 ~/.vimrc
(windows 下為 $VIM/_vimrc) 中, 寫進去的時候不用寫前面的冒號.

:nmap :nohls 取消被搜索字串的高亮
:nmap w 命令模式下轉移光標到不同窗口
:imap 輸入模式下運行
:nmap :%s= *$== 刪除所有行尾多餘的空格.
:imap 同上

:java 中: (注, 這裡為什麼說 java 中, 因為以下定義對其他文件格式不起作用, 下文
會說到如何實現這一點)
:nmap :comp javac:mak -d . %
此命令用 javac 編譯 java 文件, 它會自動將光標定位到出錯點. 不過這需要定
義一個 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 裡面只有兩行字:
setlocal makeprg=javac
setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#

:nmap :comp ant:mak
此命令用 ant 編譯 java 文件, 它會自動將光標定位到出錯點. 一般來說, 安裝
vim 後已經有了compiler/ant.vim文件, 因此這個命令可以直接使用. 但是需要
在當前目錄下有 build.xml 文件, 當然還必須安裝 ant 才行.

:nmap :cl 此命令用於查看所有的編譯錯誤.
:imap

:nmap :cc 此命令用於查看當前的編譯錯誤.
:imap

:nmap :cn 此命令用於跳到下一個出錯位置.
:imap

:nmap :cp 此命令用於跳到上一個出錯位置.
:imap

:nmap :JavaBrowser
此命令用於在窗口左部分割出一個新窗口, 裡面的內容是 java 的資源樹, 包括
本文件中出現的類, 類的成員變量及成員方法, 就好像 JCreator 表現的那樣.
在這個窗口中輸入 ? 會看到幫助. 嘿嘿, 很好用, 不過需要 ctags 支持.
:imap

9. TAB
TAB 就是製表符, 單獨拿出來做一節是因為這個東西確實很有用.

<< 輸入此命令則光標所在行向左移動一個 tab.
>> 輸入此命令則光標所在行向右移動一個 tab.
5>> 輸入此命令則光標後 5 行向右移動一個 tab.
:12,24> 此命令將12行到14行的數據都向右移動一個 tab.
:12,24>> 此命令將12行到14行的數據都向右移動兩個 tab.

那麼如何定義 tab 的大小呢? 有人願意使用 8 個空格位, 有人用4個, 有的用2個.
有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 沒關係, vim 能
幫助你.以下的設置一般也都先寫入配置文件中, 免得老敲.

:set shiftwidth=4 設置自動縮進 4 個空格, 當然要設自動縮進先.
:set sts=4 即設置 softtabstop 為 4. 輸入 tab 後就跳了 4 格.
:set tabstop=4 實際的 tab 即為 4 個空格, 而不是缺省的 8 個.
:set expandtab 在輸入 tab 後, vim 用恰當的空格來填充這個 tab.

10. autocmd
這個命令十分的強大, 可以用這個命令實現對不同的文件格式應用不同的配置; 可以
在新建文件時自動添加上版權聲明等等. 這些命令一般定義在 ~/.vimrc 這樣的配置文件
裡面. 由於他很強大, 所以我不能給出很具體的說明, 只能舉幾個例子, 詳細的請看幫助.

:autocmd! 刪除所有之前的自動命令.
autocmd FileType java source ~/.vim/files/java.vim
autocmd FileType java source ~/.vim/files/jcommenter.vim
以上兩條命令讓我在打開 java 文件時才應用後面提到的兩個配置文件.
autocmd BufNewFile *.java 0r ~/.vim/files/skeletons/java.skel
以上這條命令讓我在新建 java 文件時自動加入 java.skel 文件的內容.
autocmd BufNewFile *.java normal gnp
以上這條命令讓我在新建 java 文件時自動運行 gnp 命令, 這個命令進行一些特殊化
處理, 比如將新 java 文件中的 __date__ 替換成今天的日期什麼的.

11. 常用腳本
在 vim.sf.net 你可以發現很多腳本(script), 這些腳本常常有讓你意想不到的作用.
我常用的有:

jcommenter.vim 自動加入 javadoc 風格的註釋.
JBrowser.vim 類資源瀏覽. C, C++ 等可以用 Tlist

還有許多有用的, 比如 checkstyle.vim 可以檢驗你的編程風格, jad.vim 可以直接
反編譯 .class 文件等等.

12. 常用配置
在~/.vimrc 配置文件中你常常需要一些個性化配置. 比如上面寫的一些宏定義, 一些
autocmd 定義等等. 比如:

set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
這樣在vim中打開文件時, 按 tab 鍵補齊文件名時它會忽略上述文件.

set nu 顯示行號
set ai 設置自動縮進
map Y y$ 讓 Y 和 D 一樣, 要不然 Y 的本意和 yy 一樣.

13. 其他
還有許多有意思的命令, 記錄在這裡免得忘記.

. 重複上次編輯命令.
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4) 在行首插入行號
:runtime! syntax/2html.vim 轉換 txt 成 html, 會按照你的顏色配置來轉

[轉]火鳳燎原名言精句集錄(第一至十五集)

第一集

殘存亦沒路 兵敗如山倒

絕招!老七攻城車!

人的命運只有一個——死亡!

可怕的是,在生與死之間......
你‧究‧竟‧做‧了‧什‧麼?

許臨︰要死的終歸要死......
要活的,還是活下來.

小孟:如果再叫我孟姐,就取你(郭昂)狗命.
卡———(拉弓聲)

劉備:這......不夠,不夠......
關羽:這瓜不夠甜嗎?很甜啊!
劉備:不,我是說這箱錢還是不夠啊!
就像這薄薄的瓜皮,本已無肉可吃,
但用力一擠,還是有水出的.

司馬懿:我們要建造一座洛陽城!

司馬懿:火一旺...就知道你來了.
燎原火:只因我與火同體.

小孟:我是貂嬋?

第二集

燎原火的理論:
殺一個高手,
總比殺一百個嘍囉來得方便!

呂布的理論:
殺一百個高手.
總比殺一個嘍囉來得有趣!

司馬馗:四叔!那二哥偷了你的紅鉗玉墜,更咬斷了!
四叔:仲達,受死吧!
司馬懿:...(唉!外憂內患......)...

小兵:趙大人,這位是.....
燎原火:這位......
是我在西涼娶回來的第十八個妾侍,漂亮嗎?
黃蓋:她啊!又漂亮又溫柔!
(哎呀—————)
小兵:西涼女子果然不同凡響!

燎原火:原來除了武功外...
論狠毒,妳也跟小孟不相上下!
誰說南方少女溫柔啊...

燎原火:活該!潑婦遇上了色鬼!

雜魚甲:左右包抄!
雜魚乙:好!
燎原火:不用了,一齊來死吧!

燎原火:
(在戰場上一切生命會變得毫無意義.)
(不是你死便是我亡.)
(我管你是家中長子,孩子的爹,父母的心肝......)
(我目的只是為救一人,想救人就先要混入關東軍!)
(因此,凡擋我路者的下場......)
(只有絕對滅絕!)
(看,這就是戰爭!)
(人的生命就是如此脆弱.)
(殺人者也得習慣、盲目、麻木、在這亂世中,人人瘋狂.)
(良心和本性已遭出賣了!)
(我日夜祈求有人來改變她......)
(認一切戰爭殺戮都停止......)
(仲達,是你!還有我......一股雄心滿天下的火!)

呂布:謝謝你教了我寶貴的一課!

第三集

獻帝 劉協:我這玩具,你敢取嗎?

小孟:
(鳥往上飛,)
(人卻往下墜.)
(他,就像一個將天地分開的巨人,)
(可笑的是,他竟分不開一個無親無故的人……)
(為了這個人,)
(他的手已被繩子弄得皮破血流.)
(為了這個人,他只用一隻手去抵擋永不休止的敵人!)
(原本自己一人可輕易逃脫,)
(現在卻招到萬劫不復……)
(水在流,血亦在流,)
(瀑布就像染紅的布帶在擺動.)
(直到槍尖刺破了他絕不放棄的臂膀……)
(放棄吧!)
(放手啊!)
(你這個傻瓜!)
..……………………………………………………..
小孟:火!你怎麼了!醒醒啊!
燎原火:看……我沒有放……放手啊!

世上有很多蠢才,專幹傻事的蠢才!
蠢才無處不在,壟斷了整個世界……
導致每朝每代都發生了可悲的傻事!
故此,上天製造了一批與眾不同的人來平衡這世界,
稱之為天才.
天才有三種,一種是蠢才認為的天才;
一種是自認天才的天才;
而最後一種是……
天才公認的天才!

水鏡先生 司馬徽:
冷靜,為軍師之本!
看不見敵之猛,聽不見敵之詭,
心方可保持冷靜,你們要緊記啊!

逢紀:輪到你放屁了嗎?
司馬懿:對,還有八奇中一人跟我放屁!
諸葛亮:司馬公子,那就看看誰放得響了.

司馬懿:他沒有回答,只是笑了一聲.
這種人最可怕.

小孟:你們走吧!你們先走吧!我在此等他.
他不走……我也不走.

許臨《非人論》
董卓問道:文人不能武;武者不擅文.
文武俱備者稀,汝謂呂布是何人?
許臨答曰:將士有云『馬中赤兔,人中呂布』,
吾卻謂呂布不是人!

第四集

獻帝 劉協:朕已騎虎難下了!
董卓:你當我是老虎?那麼你是什麼?
獻帝 劉協:朕當然是騎在虎上的——龍!

孫淑:
(他並不喜歡我!)
(一切都完了!就連我的英雄夢也完了!)
(所謂的『英雄』,也不過是利益的崇拜者!)
(政治婚姻就是結成利益的手段之一.)
(我竟然愛得一廂情願,愛得連生命也斷送……)
(但是,我死不甘死!)
(我討厭被出賣,我不想有這樣的結局!)
(我到底是不甘心?還是怕死?)
(我忽然怕死了,莫非,這就是人性?)
(立場易處,我也會像袁大哥一樣嗎?)
(答案是一樣的吧!蒼天有靈,假如有人能救我……)
(不管是醜、是跛、是盲、是聾,還是瘋子……)
(我孫淑甘願奉獻終生!)
(只是,現在有這種人嗎?很可笑吧……)
(連死去的人也在笑我!)

袁紹:我要你恨我,憤怒是野心的原動力,
這樣就可以令你不惜一切來奪走我的東西!

呂布:公子,你不是說過要她嗎?
我可以安排一切.
董璜:不不不!會死的!我不要!
呂布:你不要,我要.

袁隗:
(天下百姓的心!?)
(治國之本!百姓之心!)
(這就是董卓的政見……)
(如雷貫耳!)
(我們的扶漢之策,竟比不上一個亂賊的暴政!)
(雖然不可思議,但我竟有點感動.)
(我漸漸變得渺小,還是……)
(董卓在我心中不斷膨脹?)
(這是我的錯覺?)
(還是……事實?)

偽呂布:先取文醜,後取袁紹!
文醜:先‧取‧呂‧布.

偽呂布:隊長一招便死了,副隊長,這……
文醜:如果這人是呂布,莫說十個……就算一百個,
我……也吞得下!

呂布:我曾聽你說過……
義父統一天下之後,你想當洛陽的太守.
所以,許臨兄……現在我把洛陽城燒給你.

燎原火:血,不可白流.
流多少,我便吃多少!

袁紹:紹問眾將士,你們怕死嗎?
眾將士:不怕!
怕他奶奶的!
袁紹:我問完了,現在……
就把答案……告訴敵人吧!

袁紹:黃俊! (在!)
馬鴻! 鄭傑! (在!)(在!)
你們還沒答我.
黃俊:即使主公被嚇得屎滾尿流,
我還是故我.
馬鴻:即使主公向賊黨投降,
我還是堅持己忠!
鄭傑:即使主公下令退軍,
我還是會堅守到最後!
袁紹:紹銘記於心!
馬鴻:大人,你動搖了嗎?
黃俊:你忘了袁家的祖訓嗎?
袁紹:(對,就算要死……)
(也不可失袁家的顏面啊!)
(我的好將領,謝謝你們的提點.)

張飛:
(戰爭為的是什麼?)
(為的是天下太平……)
(為的是國泰民安……)
(為的是興仁義復孝慈……)
(何以眼前盡是人殺人、命滅命?)
(如果這是蒼天的命運,那麼……)
(蒼天已死!)
(黃巾賊張角說的沒錯!)
(就算蒼天已死,我人性仍在!)
(可是,為達成恢復漢室的夢想而踏上殺戮之路!)
(我和董卓又有什麼分別?)
大哥,我矛盾了.
劉備:因為你不明白蒼天的真義.
世上根本沒有蒼天.
所謂的蒼天,就是民願,
人民的意願就是蒼天,
也是我們征途上的指標.
任憑你的力量多大,蒼天是改變不了.
蒼天不在乎時間流逝,不在乎生命飄零,
只在乎對與錯!

第五集

黃俊:鄭大人,生命是什麼?你可曾感慨過?
鄭傑:生老病死吧.
黃俊:不,我問的是武將的生命?
馬鴻:老爹生前說過……
十五從軍征,八十始得歸.
黃俊:歸?那是馬革裹屍還吧.
馬鴻:戰勝,還有永無休止的戰事在等你.
戰敗,死者家屬咒罵你,軍法處分你.
臨陣退縮,史書上定會貶抑你.
而後人一生抬不起頭來.
若幸八十歲仍不死,當看見年青一輩沙場殺敵,
而自己卻有心無力,那時比死更難受.
鄭傑:對,武將的生命就是如此無奈和荒謬.
你既然選擇了這條路,就沒有後悔的餘地.
黃俊:謝兩位大人的提點!我豁然開朗了!
………………………………………………
馬鴻:黃俊,你打頭陣.
黃俊:正有此意.
文醜兄,永別了.
馬鴻:文醜兄的身子顫抖,只因在生與死上下不了決定,
像我們這等視死如歸的先鋒,從未享受過這種掙扎……

縱戰死,也無悔!

董卓:持國如騎虎,用人也是一樣,當一個人能駕馭猛虎,
世上還有什麼解決不了.
董璜:我可沒有叔叔的騎術啊!

生死無懼無悔,就讓天地來見證!

呂布:痛,不重要……
痛快才最重要!

痛乃是源自內心的恐懼.

第六集

沒有……
嘿嘿嘿……
只有一句啦~

劉備:劉玄德在此!
呂布:在此喪命!

第七集

劉備愛才,
因為這些人覺得他是有蓋的牆,
牆雖小,卻住的心安理得.

袁紹愛才,
只因這些人是保護他的一堵牆,
可是,君子不立危牆之下.

霸主的滅亡,
只因更強的霸主即將出現.

李儒:諸將啊!呂布開始頭痛了
眾將:就讓他痛死吧!

猶豫之間,
我是貂嬋、還是妲己?
只知天下因我而變……

第八集

董卓:虎可吃人,亦有人藉虎威得天下.
只要明白一句話:誰是虎主?
燎原火:可惜……虎也有吃飽的時候.
呂布,你不應留他一命啊!
李儒:錯錯錯!若虎吃了主人身邊的狗,
就得不到主人的信任,以後就難有令主人鬆懈的機會……
這頭虎是聰明的,但是,他還是不明白一件事……
就是……要認清楚誰是主人最信任的狗.

呂布:靜 ! 請欣賞我的下一步!

第九集

三船:嗨 !

呂布:沒有人說稱霸天下的就是好人,
而好人、壞人亦非由你所定.
天下以民為本,百姓以吃溫飽、停戰禍為生存目的,
這就是他們所謂的賢君天下.
你是一個挑起戰禍的人,在百姓心中的確是暗無天日.
而我就是一個能火速平定禍亂之人,
天下無知者的一片曙光.

呂布:荀子曰:天行有常,不為堯存,不為桀亡.
人和野獸又有何分別?你我殺人……又豈比殺雞屠牛為少?
人既為野獸,就只有強者可立!這就是真正的天行有常.

司馬懿:泰山之下多奇人,你若要登山……
就要先問問我這原住民了.

野獸來了 !

論智,說權……
我李儒,在這個時代,
只是一個微不足道的角色罷了.

在這個時代之後,
出現了三位位高權重的智者:
諸葛丞相、司馬太傅和……
賈太尉 !

第十集

老子曰:知人者智.

五天敗李肅,五天敗呂布,只用一成兵力.
初平三年四月,賈詡攻入長安,
由於大軍九成兵力絲毫無損,
因此無人敢來犯.

老子又曰:自知者明.

呂布:
(好強!)
(為什麼我從來沒發現……軍中還有如斯強人?)
(是我弱了……還是,大江後浪湧至?)
(這人是誰?)
(而這人又是誰?)
(呂布,你怕了嗎?)
(我怕的是什麼?)
(是死亡?)
(是箭矢交墜的沒路?)
(是旌旗蔽日的黑暗?)
(是英雄末路的唏噓?)
(還是……還是我最怕的一幕?)
(殘存亦沒路!)
(賈詡!呂布在你之下,)
(暗淡無光!)
(暗淡無光!)

華陀:救人是我的天職,
但救國之責,卻是水鏡八奇不可逃避的事!
我在等…
等你們將曹操變成秦始皇帝的那一天…

馬騰:廚子,給我兩斤牛肉.
馬超:明白.
(本為野獸,殺生是行為,狠毒是睿智.)
(吃!才是天性!)
(父親!請吃下天下吧!)
(兩斤不夠!)
(兩頭牛才夠咬勁!)

第十一集

上求材,臣殘木;
上求魚,臣乾谷.
上求權,將殘殺……
權何價?
人命何價?

賈詡:從來意圖變天者,必先血流天下,
洗滌人心. 分別在於……血是否白流?
郭嘉:反黑為白,反白為黑,天理循環……
賈詡:對,一切只看天意!
郭嘉:哈哈,老師一定給咱們氣死了.

劉備:我看這是一個出兵的藉口,
平亂、造亂、救人、殺人,
正與邪只是一線之差.
有人看見現在的驚惶大亂,
也有人看見狠心過後的安逸.
張飛:呸,殺人就是殺人!何來滔滔大論?
大哥,還等什麼?

將當以勇為本,行之以智計.

郭嘉:你可知徐州盛產什麼?
夏侯惇:你是什麼意思?
郭嘉:人多,石頭也多.
夏侯惇:什麼石頭?

陳宮:貪婪天下之王道,無義天下之小人,
正是陳宮眼中的霸主.

許褚:中我拳、不哼、一聲、你、第一個……
燎原火:不痛,不癢.

好賞山林的,不只一人.
但是,好賞天上的諸侯,舉目皆是.

第十二集

曹操:真的奇怪,看見你,我倒說不出話了.
劉備:對!看見你,我也罵不出了.
曹操:因為大家都是同一類人物.
劉備:只是,立場不一.

郭嘉:
(熟讀兵法只是入門,軍師的優劣在於臨場應變,)
(世上從來沒有一場戰爭是預先部署好的.)
(這就是戰場的真面目.)

燎原火:中路,送死的人,一個.
典韋:後方,送死的傻瓜,一個!

典韋:能在天下第一刺客手上殺人,典韋自感榮幸,
告辭了.
這個時候,燎原火下了一個重誓!

曹操:疑人不用,用人不疑.
許褚,就用行動証明吧!

陳宮:能人用之,疑人又用之,
呂布兄果然善於在刀鋒上走路.

呂布:疑人不用,用人不疑,
陳宮,就用行動証明吧!

張遼:
(那年‧那天,我在後山遇見一個人.)
(我相人,總是喜歡從士兵的眼神來判斷.)
(士兵恐懼的眼神,代表主將實力有限.)
(相反……信任的眼神代表……)
(這種似曾相識的眼神,勾起以前在呂布軍中為小卒私感覺.)
(但是,這個人不是呂布,他叫關羽.)
關羽:名將之後,你怎麼倒下了?
夏侯淵:暗箭傷人……算……什麼好漢?
張遼:打仗就是打仗,兵法偷襲之暗,與刺殺敵人之暗,
又有何分別?勝就是勝,敗就是敗,什麼好漢不好漢?
關羽:理論是對的,只是作為武者……
關某對閣下的為人倒有一點意見.

第十三集

陳宮:恭喜大家!
你們已成功踏進了八奇思考領域的……
第一步!

呂布:陳宮,你令我飛躍起來了!

張飛:(上蒼,你令我飛躍起來了!)

臥龍:(看見天下還有這種人……我的心不禁躍動起來!)

程昱:
雷———
電———
雨………
不可能的!
不可能的!
最強兵法,以神行為利器,搜神鑑雨師,大能展現!
程昱五體投地啊 !
雨神……赤松子 !

炎炎者滅,隆隆者來也.

那天,兩個受傷的人,為著兩個說教的人而頭痛.
同樣地……腦海激盪.

心中的枷鎖正被鏽蝕,有如毒液蔓延全身.
枷鎖抵不住熱血的衝擊,完全解放.
但是,打開那扇心門之後……
竟是無盡的矛盾和血淚……

在刀鋒上走路不易,
在這個時代,你不殺人,人亦殺你,
殺人並不可怕,
可怕的是……你為了殺一個惡人,卻要殺萬千個無辜的人.
我看見這個人……彷彿看見他父母等待著他回鄉的焦慮眼神.
是非、人倫、道德往往是歪曲的.
小孩子握著兵器,樂上了半天,撕殺仿似是與生俱來的本性.
殺人如麻的人在某些人眼中是一個大英雄.
惡人也殺人,好人也殺人.
人,終歸是野獸,
披在仁義的皮下,他……的本性是什麼?
人生如夢,夢如人生.

第十四集

戰爭,取敵要害者勝.雙方按兵不動,久候敵人一剎那的要害顯露.
打仗之前,行外交、行心理、行計,還有……
行刺.

信心,可以主宰自己.

典韋:能在無敵戰神身上劃上一刀……
(典韋小心!)
典韋自感榮幸.
(媽的!)
碰————

恐懼,可以摧毀一切.

曹操:人說臥龍、鳳雛得一可得天下.
我謂……二人皆為人,人中可有……
人中呂布啊!
呂布:
(大地在我腳下!)
(人命任我踐踏.)
(任我玩弄!)
(我———)
(是戰神!)
(人中之神!)
(縱使這人是我見最強的人,)
(只是,今天……不可比之!)
我還沒批准你可以站上來!
碰———
(是痛快,但可惜……)
(可惜天下間……)
(我已找不到任何對手了.)
(因為……)
神已飛躍起來了.
曹操……你這個亂世的奸雄,在我眼中……
是多麼渺小啊!

曹操:那麼說,如果有一天你為人所擄,
也會不顧顏面,哀求活命?
呂布:只要活著,哪怕什麼顏面?敢闖這一關的,
才是真正的英雄.
曹操:曹操只是一個守舊之人,並不配如此高尚情操.
呂布:所以你是傻瓜.
英雄、狗熊,只是歷史的玩物.
(唯聰明者看透一切.)
燎原火:唯智者得天下.

殺敵,在於勇猛……在於擾敵!

郭昂:放心,呂布一向寬宏大量.

曹操:
(這四人的激鬥,)
(仿似萬人在戰場上廝殺,)
(又像軍師在帳內談笑用兵.)
激鬥忘我之間,又見計謀互擊.
這是一場濃縮的戰爭.
此戰比萬兵更強悍,比萬馬更奔騰!
但是,兵中有萬人敵,
也有戰神!
無視眾生的戰神 !

荀彧:我這個人,一向都以真誠待人.

第十五集

張良———
曾助漢高祖建功立業,
功成,只望能身退.

狼顧———
狼頭能環顧前後,
前進可攻,退可反噬.

典韋:我找到兵器了!

陳宮:軍師除了要預測敵人的下一步,
更要有如商人般的遠大目光.
呂布之強,有於久經戰爭磨練;軍師之強,
在於臨陣學習應變,理論同出一轍.
恭喜大家,你們已成功踏進八奇思考領域的第二步了.
司馬懿:不幸地……也踏進敵人陷阱的第一步.

司馬懿:陳宮大人,我有事請教.
陳宮:我最喜歡作育英才!
司馬懿:別後悔.

大地萬物生死有律,難逆天意……
山火燒殆多餘的老木,只為幼苗成長鋪路.
飢荒除去多餘的競食者,只為後代提供合適的環境.
戰火潔淨天下,只為順天之意.
人本天地之物,生死有命,天意難違.
霸主之成長,必先面對苦難.
為下一步做好準備.
我……看見亂的真諦.

于禁:為將者只要勇猛如韓浩,兵少又有何懼?
韓浩:(為將者只要堅守軍法,在劣勢中仍能穩定軍心.)
(為決策者,縱使敵人倍於我方,仍不忘險中求勝.)
許褚:只要、哼一聲、財產、歸你!
韓浩:(為猛將者,縱使只剩一口氣……)
(也絕不言敗!)
(這幅動人的畫,背後代表著什麼?)
(是無恥戰場上的美學,純潔無瑕,悲哀但漂亮.)
(百花盛放,可惜春風無力.)
(悲哀但漂亮……)
(敵人也是?)

典韋:我是刺客!
刺客的真義是捨身……
殺人———

呂布:你活著是為什麼?
典韋:……活著?
呂布:你為何而生存?
典韋:忠誠.
呂布:(什麼!?)
(那是什麼?)
(多麼膚淺,多麼刺耳的答案.)
(只是那麼的……露骨!)
偶爾也會有想站起來的畜牲……
但是,歷史就是不允許.
還是,我根本不懂遊戲的規則?
我……是否只是一頭野獸
還沒到人的階段.
不是人啊!

敗者無一死,將來富如山.

司馬懿:繁衍.
人活著,只要做這種東西就可以了.
燎原火:什……什麼?
司馬懿:你年紀不小了,有沒有想過繁衍?
燎原火:你……你在說什麼?
司馬懿:樣貌娟好,應該是很好的投資……
燎原火:你、你是說要我……!

[轉]gdb使用

基礎使用:http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=187&blogId=1


gdb是個命令列模式的交談(interactive)除錯器, 跟telnet或其它的unix交談式程式一樣有個提示符號,然後要下命令

(gdb)COMMAND


不要忘了gcc編譯時要加 -g 參數, 基本gdb命令

檔案處理
========
file a.out 載入可執行檔a.out
path 告訴gdb obj code在那
directory 告訴gdb source code在那裡

SHELL
=====
shell ls 就會執行ls了
cd xxx 不過用shell的方法跟Makefile一樣喚起sub shell而已
要真的cd到目錄要用cd

中斷點(Break point and watch point)處理
=======================================
break 設定中斷點
clear 清除中斷點
delete 清除中斷點
disable 暫時使中斷無作用
enable 使中斷再作用
condition 進一步設中斷點的條件 如果條件為true則中斷
commands 如果中斷了則執行commands與end中的一連串gdb命令
.....
end


其中 中斷點可以用source code的行數來代表(這些資訊藏在ELF格式 裡的.line這個section裡),也可以用中斷點的流水號來表示

br 在目前位置設中斷點
br 100 在100行中斷
br func1 在func1中斷
br +100 目前位置+100行中斷
br *0x08048123 在這位址中斷
br file.c:100 因為如果是多個c檔案時指定file.c
tbreak 同break的寫法 不過中斷一次後 此中斷點就失效
br 100 if (var == 5) 條件中斷 後面跟著c語法的條件判斷式
br 100 在第100行中斷並且執行command...end中的gdb命令
commands
silent
printf "x is %d\n",x
end
break String::func1 C++ Function Overloading的中斷 String是class

clear 100 清除中斷點 後面跟著行號或函數名
clear func1

delete 5 清除5號中斷點 後面是中斷點流水編號
disable 3 暫時使3號中斷點沒作用 後面是中斷點流水編號
enable 2 使2號中斷點作用 後面是中斷點流水編號

condition 3 (var > 3) 設3號中斷點的條件 如果條件為true則中斷
condition 3 清除3號中斷點的條件

程式執行
========
set args xxx 給執行程式參數xxx,就是main裡的**argv
run 開始跑程式
continue 中斷後繼續跑
next 往下跳一步c程式 如果有副程式 執行完整個副程式
step 往下跳一步c程式 如果有副程式 追進副程式
until 跳離一個while for迴圈
nexti 往下一步CPU組語的指令(Instruction)執行完整個副程式
stepi 往下一步CPU組語的指令(Instruction)追進副程式
until 執行到source code的行數比目前的大
如果目前所在行是loop的最後一行就會跳離loop

程式變數值(data)處理
====================
print var 看var的值
print &var 印出var的位址(其時這就是C 啦)
print *var 印出*var值 var是pointer
display var display會每次step, next時都會印出值來,print只印一次
print (var=value) 設var的值為value
其實print 可以只用p代替 很多指令都可以簡寫代替
p/x /x表示印hex值
/u表示unsigned digit
/d signed digit
/t 二進位值

/是列印的選項 在Solaris上的adb也有相似形式
x/3uh 0x8048012 印出記憶體
其中
3表示看3個
u unsigned digit(跟上面p命令一樣意義)
h halfword就是2bytes(bhwg分別是1248bytes)

GDB內定變數(跟程式變數不一樣喔)
===============================
一些gdb方便的變數(convenience variable)
$_ 用x命令所得到的最後一個位址
$__ 用x命令所得到的最後一個位址的值
$_exitcode 程式離開的code就是用exit時的code

CPU暫存器(registers)
$pc program counter就是目前cpu指到的執行位置啦
$sp stack pointer

訊息觀看與設定
==============
info 得到一些program debug資訊
info break
info frame
info display

info program
info share
info registers

show 得到一些系統(OS, CPU Arch), GDB資訊
show args (系統傳進來的argv[0],argv[1]...)
show os (OS是什麼)
show endian
show prompt (gdb的提示符號)

list 看原始碼
list x 從第x行的source code印出,x不寫從目前行印出
list *addr 秀出addr所在source code的行
可以先用info program找出目前PC的值
再用list *addr
search REGEXP 在目前source code做RE搜尋

disas 想看machine code用這個

whatis var 告訴我var的資料型別是啥 int, char or double
ptype var 告訴我var的資料型別是啥 這用來看struct用的

set 設定gdb, 系統的控制變數值(這些變數不是program內的)
set listsize xx 設定要看xx行source code
set $pc xx 把PC設到 xx
set convenience可以自己設變數

help 可以得到命令HELP

程序與副程式(process and sub-function)
======================================
backtrace(bt)2 程式執行到這裡前的兩個副程式,2不寫則列出全部
frame 2 選擇2號frame跳過去 2不寫就列出現在執行到那裡
up 2 往上走2個副程式
down 3 往下走2個副程式
return expression 不要玩了,回到上一層呼叫的routine去並return一個值
finish 繼續玩完一個選擇的stack frame(副程式)

kill 砍掉child process
signal procss-id 送signal給process
attach procss-id debug一個已經在記憶體跑的process
detach procss-id 釋放attach的process脫離gdb的控制



其中每次程式呼叫副程式時, 原本的執行的世界的東西(變數值啊等等)必需先保存起來, 然後再跳到新世界(將要執行的副程式)這就是stack, 每叫一個sub routine就等於進到一個stack frame

(gdb)frame 2


就是選擇2號frame,而0號frame就是目前在執行的副程式, 1號是呼叫0號的副程式,以此類推, finish搭配frame這個命令來用

所以bt這個命令很重要,可以追回之前叫了那些function來到目前的地方。 通常在命令列也有類似的追蹤system call的程式,因為system call很重要, 在Solaris上我們可以用

$ truss prog1


在Linux上

$ strace prog1


來看現在程式到底叫了甚麼system call導致他毀掉。

attach, detach必需在有支援process 的環境, 因為有的沒記憶體保護OS,或embadded system沒有支援, 另外也要有能力送signal給process的環境才行, 這主要可以來debug deamon或做multiprocess的除錯


------------------------------------------------------------------

訊號(signal)處理

除了可以送signal給程式外孩可以指定如何處理signal

handle signal keyword


signal是下面其中一個

(gdb) shell kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS


keyword是

nostop
當接到這個signal時GDB 不要停止你的程式
stop
當接到這個signal時GDB 停止你的程式
print
當接到這個signal時GDB 印出這是什麼sginal
noprint
當接到這個signal時GDB 不印出這是什麼sginal
pass
GDB pass這個signal給你的程式 也就是你的程式有能力處理這個siganl
nopass
GDB 不會讓你的程式看到這個signal


multi-thread與multi-process除錯

multi-thread mutli-process除錯最討厭的是程式邏輯不再是一步一步, 而是會有時這個process or thread執行到一半,時間到就被排程到後面去了, 造成輸出的沒有前後關係 所以講到thread/process,就一定要講到OS的Scheduler

一個thread就是一個sub-routine在同一個process image下, 所以常聽教科書說stack pointer不一樣 (所以thread的text執行位置還是跟process一樣, 不過stack區域每個thread有自己的保存區,原本process的是在最下面) programe couter(就是目前CPU應該指到的執行位置)不一樣, 可以同時access變數(所以此變數為global變數), 其實只要說是可以fork subroutine的就是thread, 看一下前面Linux的執行image, 然後真的寫個multithread程式就懂了, 以pthread而言

pthread_create(&t_id, &t_attr_obj, sub_func_name, &arg);


這就是一個thread的建立方法,每次呼叫這個就會把一個執行的單位(context)放到 OS的scheduler後面去。等到一個個的執行一直到這個context了,就會被執行了。

pthread_join(t_id, &status)


相當於waitpid()會block住的等著這個要返回的thread,status是個指標的指標**status。 其中作為thread的副程式如果要還回一個值,通常要還回一個指標型的位址,指著一串的還回值。

void * func_thread(void *arg)
{
xxxxx
xxxxx
}


arg就是在create的傳進去的arg,sub_func_name就是這個func_thread副程式名。 return必須return一個pointer。(gcc比較好compile時不會complain傳回不是void *, 其他有的compile就會complain)

multi-thread程式中比較常見的錯誤是如果caller thread不等forked thread, 也就是不join, 而傳遞local變數像在用一般程式傳遞, 因為local變數如果副程式走完了stack也消失了, 而scheduler的單位是thread, 此時forked thread往往得到錯誤的值, thread的除錯跟傳統的很像,只是要追蹤thread編號

info threads 跟info frame很像看thread號碼(pthread_create的ID)
thread xxx 跳到xxx號thread
break 13 thread 2 執行第二號thread時在第13行中斷
break frik.c:13 thread 28 if bartab > lim


break 的用法跟一般一樣,不過多一個thread的字眼其餘是一樣的

multi-process其實沒什麼工具, 只能在fork後的小孩放個sleep, 讓child進到sleeping狀態停住, 然後再開一個gdb用attach的方法把小孩叫進來, 在不同的process(就是不同的gdb啦所以要另外喚起一個gdb)中切換trace, 每走一步每改一個想要的值,這相當於把多個process放到gdb來控管, 以下面程式做例子

int main()
{
int a, pid, status;

if ((pid = fork()) < 0)
printf("fork error");
else if (!pid) { /* child */
sleep(100);
printf("I dont want to be a zombie");
}
else {
printf("I dont want to be a orphaned");
waitpid(pid, &status, 0);
}
func1();
return 0;
}


先開一個gdb並且用file命令來load進a.out在parent直接run

GNU gdb 19990928
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
(gdb) file a.out
Reading symbols from a.out...done.
(gdb) run
Starting program: /home/cyril/tmp/a.out



由於我們放了waitpid(),爸爸會停下來 再開一個gdb也把a.out load進來,並且用shell ps -aef|grep a.out來看 child的process id並且把它attach進來

cyril 26689 26678 0 12:20 pts/1 00:00:00 /home/cyril/tmp/a.out
cyril 26690 26689 0 12:20 pts/1 00:00:00 /home/cyril/tmp/a.out
cyril 26691 26687 0 12:20 pts/5 00:00:00 ps -aef
(gdb) attach 26690
Attaching to program: /home/cyril/tmp/a.out, Pid 26690
Reading symbols from /lib/libm.so.6...done.
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
0x400b2081 in nanosleep () from /lib/libc.so.6


0x400b2081是libc裡的sleep這個function,我們不要理它,所以我們下

(gdb) return


讓它回到我們main裡來

(gdb) info program
Using the running image of attached Pid 26690.
Program stopped at 0x400b2081.
It stopped with signal SIGSTOP, Stopped (signal).
(gdb) return
Make selected stack frame return now? (y or n) y
#0 0x80486b8 in main ()
at debug.c:45
45 sleep(100);
(gdb) s
Single stepping until exit from function nanosleep,
which has no line number information.
46 printf("I dont want to be a zombie");
(gdb) s
47 }


可以看到小孩process在我們掌控下了,接下來就可以step, next...來追它了
遠端除錯

一般device或者遠端機器上,如果沒有環境跑gdb來除錯, 可以用gdb這項特異功能來除錯,或者我在i386機器上跑ddd 或gdb 遠端是VxWorks embadded 系統或Sun的binary環境 這是說gdb在local跑,遠端機器跑要被除錯的程式, gdb可以透過serial line或TCP/IP來對遠端除錯, 常用的serial line方法會透過terminal console server (Cisco的2500系列, Nortel的annex系列)

target remote /dev/ttyA
target remote machine:TCP_port (machine 是terminal server)
target cisco machine:TCP_port


target此target非Makefile彼targe,target指的是一個環境 通常就是被除錯的機器與程式, cisco有它們特有的protocol, cisco的system admin不是蓋的, 功力還蠻強的

這個要被除錯的可執行檔除了-g以外還要link到一些特殊的sub-routine 這些subroutine是跟機器有關的程式叫stub, 用來在遠端執行然後跟本地的gdb溝通用的, stub跟target CPU有關才知道怎樣控制target CPU的trace功能, 另外stub還要能解釋gdb送過來的message也就是gdb自己溝通用的protocol。 所以是伴隨gdb package過來有的程式, 現在有的stub i386-stub.c, sh-stub.c, VxWorks, sparc, m68k..., 這些是伴隨gdb來的.c source code, 例如 i386-stub.c, 這些xxx-stub.c裡面都含有

set_debug_traps()
handle_exception()
breakpoint()


但是gdb只曉得CPU而已,CPU跟外界溝通的I/O chip gdb不管, 自己必需寫5個低階的函數來溝通。所以去看stub的code都會去呼叫下面函數, 不過這要自己implement。

getDebugChar()
putDebugChar()
flush_i_cache()
exceptionHandler()

memset() 這是ANSI C的標準應該都有的不用寫了


也就是set_debug_traps breakpoint負責處理掉target CPU中的單步trace部份, 並且會處理由gdb送來的訊息,也就是remote protocol知道怎麼處理。像Cisco有他們自己的 protocol。ok gdb經由Host serial port到target,但是target系統中CPU還是要靠 I/O serial chip來跟Host溝通,這邊每家的I/O chip是gdb不知道的,不像Host這邊 OS已經處理掉serial port driver。所以target那邊的gdb stub會去呼叫自己 要implement的getDebugChar putDebugChar...。另一種作法是用JTAG, 也就是target CPU跟外界溝通用JTAG,不用serial port,target CPU只跟JTAG 控制晶片溝通,JTAG message protocol算是一種介面,凡是想要給CPU的命令用JTAG的好處 是不比針對某個特定CPU寫instruction,有比較大的general特性,JTAG會負責跟後面的 CPU溝通,把該要的Instruction轉成這一個CPU懂的instruction。如果用這種方法 則不需要stub在target CPU上compile,但必須要有個中介box作gdb remote protocol與 JTAG的轉換。(有人在賣這種盒子還貴的嚇人)

Figure 6-3. Remote Debug

在要被debug的程式最前面需要呼叫

set_debug_trap();
breakpoint();


然後編譯時要把這些一起link起來最後丟到遠端機器跑, 然後在gdb ddd 下

target remote /dev/ttySx
or
target remote machine:TCP_port


就可以像正常的gdb用法來用了,不過要注意的是image是不是有symbol table, 有些image的格式當初編譯時由於是embadded system,image大小很重要,所以拿掉了 symbol table。記住gdb參照的symbol table image與source code是在local端喔, 所以local host用gdb命令"path"指的image要有symbol table喔。

client/server程式除錯

寫過socket程式的人都知道有個無窮迴圈在那邊等待request, 這部份應該跟用multiprocess的方法一樣, 只不過變成兩台機器的multiprocess或multithread程式除錯
core dump的除錯

Basic Perl等語言處理的可以說是User的資料, C可以說在那邊把資料在記憶體移來移去, 組語可說把資料在暫存器搬來搬去, 越低階的處理表示握有的資源越少

所以C處理不好的話很容易記憶體跨出範圍, 或者系統毀了(panic), 這時都會產生一個core dump, 就是毀掉的瞬間記憶體內部的內容會搬到一個檔案core, core file 包含了程式的read/write的memory部份, 也就是程式躺在記憶體時的狀態, executable只是一個可執行檔也就是程式躺在硬碟時。 gdb可以根據這個檔來除錯,只是這時的target是core 或exec 不是remote。 通常這可以拿來做系統毀掉時的debug

gdb a.out core 命令列上給executable與core file
target exec a.out 跟file命令不一樣的是exec不load symbol table
只loadTEXT與initialized DATA這時程式只可run
無法看source code與檢查任何變數

target core core core file


用下面程式做例子

#include
int main()
{
char *x = 0x0;
*x = 1;
printf("%s", x);
strcpy(x, "This is wrong");
}


跑它之後產生core dump檔並用gdb來看它

[cyril@megami cyril]gdb a.out core
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.7"...
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation Fault.
Reading symbols from /usr/lib/libc.so.1...done.
Loaded symbols for /usr/lib/libc.so.1
Reading symbols from /usr/lib/libdl.so.1...done.
Loaded symbols for /usr/lib/libdl.so.1
Reading symbols from /usr/platform/SUNW,Ultra-Enterprise/lib/libc_psr.so.1...
done.
Loaded symbols for /usr/platform/SUNW,Ultra-Enterprise/lib/libc_psr.so.1
#0 0x10870 in main () at core.c:5
5 *x = 1;
(gdb) print x
$1 = 0x0
(gdb) print *x
Cannot access memory at address 0x0


當然這例子很簡單,不過不用自己一步步追到死掉的地方, gdb a.out core自動用file命令load了symbol table進來,所以我可以用 print x來看它。通常捉到問題點就是用bt(backtrace)捉出之前到底叫了甚麼。
kernel除錯

一般來說應用程式必需在kernel監督下執行應用程式, 毀掉時有時會產生一個core dump, 就是錯誤時瞬間的CPU記憶體狀態, 好的OS不會隨隨便便就讓應用程式毀了整個系統造成系統不能使用, 頂多是這個程式會Hang住,kernel與其它process還是照樣執行, 而如果整台電腦完全不能用了我們叫它作crash, crash有兩種可能, kernel太爛自己死掉(panic), 硬體發生問題導至一個bad trap, software panic或者hardware bad trap都會去呼叫一個 kernel routine - panic(), panic()會做

1.瞬間停止所有scheduler的process
2.copy所有記憶體內容到一個dump device,通常就是swap device
(因為這個device上不能有任何file system - superblock indoe....)
3.dump記憶體時會先寫個magic number在dump device前
(因為如果是swap device則此magic number是用來識別目前swap device內的內容
是否為kernel core dump還是一般swap memory)
4.把一些目前CPU重要registers記下來例如stack pointer
5.reboot


reboot 後系統回來了檔案系統也回來了可以把在dump device內存成一個 kernel core dump以便後來用debug工具來除錯

kernel除錯通常不是像User小程式用debugger追, 而是盡量用print或向系統要目前的狀態值來做除錯, 這些資訊通常存在所謂的kernel ring buffer, 如果要用debugger必需找另外工具來完成,而且沒有source code時, 通常要用nm或strings找出想要的symbol來做很低階的debug

另外kernel的除錯使用者必需是root
Linux

Linux kernel的除錯可以在程式碼中用 printk()印出來 printk(log_level "msgs", arg); 用法很像一般printf只不過多了log_level定義在 可以丟到console(就是kernel專屬印出資訊的地方)或/var/log/messages /var/adm/messages(syslogd根據/etc/syslog.conf覺定/proc/kmesg的 東西要不要丟出)

driver除錯另一種方法是建立自己的/proc下的檔案, /proc下的檔案是代表了目前kernel下的狀態, 可以在程式碼中建立/proc/xxxx把想要的資訊丟出, 或者是給ioctl()很多不為人知的功能, ioctl()是正常I/O動作例如read(), write(), open()....外, 設定device的特殊功能的一種函式, 當然read write...等功能也可含在ioctl裡, 例如ethernet chip裡有promiscuous mode允許所有的packet進來, 可以透過ethernet driver給的特殊ioctl函式介面來指定, 不過必須另寫一個User Ap呼叫ioctl來跟driver要資訊

ooops(linux kernel的特有用語)訊息是由於hardware bad trap產生的 會顯示trap時的CPU狀態

Unable to handle kernel NULL pointer dereference at virtual address 00000014
*pde = 00000000
Oops: 0000
CPU: 0
EIP: 0010:[]
EFLAGS: 00210213
eax: 00000000 ebx: c6155c6c ecx: 00000038 edx: 00000000
esi: c672f000 edi: c672f07c ebp: 00000004 esp: c6155b0c
ds: 0018 es: 0018 ss: 0018
Process tar (pid: 2293, stackpage=c6155000)
Stack: c672f000 c672f07c 00000000 00000038 00000060 00000000 c6d7d2a0 c6c79018
00000001 c6155c6c 00000000 c6d7d2a0 c017eb4f c6155c6c 00000000 00000098
c017fc44 c672f000 00000084 00001020 00001000 c7129028 00000038 00000069
Call Trace: [] [] [] [] [] [] []
[] [] [] [] [] [] []

Code: 8b 40 14 ff d0 89 c2 8b 06 83 c4 10 01 c2 89 16 8b 83 8c 01


kernel的core dump與目前kernel記憶體資訊/proc/kcore可以用gdb, 用gdb時別忘了要用gcc -g 重新編譯kernel

# gdb -q vmlinux /proc/kcore
Core was generated by `auto BOOT_IMAGE=247-p6 ro root=302
BOOT_FILE=/boot/vmlinuz-2.4.7-pre6'.
#0 0x0 in ?? ()
(gdb) printf "%d\n", sizeof(struct inode)
464

# gdb -q vmlinux /proc/kcore
(gdb) p jiffies
$1 = 58863


module可以這樣加symbol table

# insmod -m bfs > bfs.map
# vi bfs.map
# gdb -q vmlinux /proc/kcore
Core was generated by `auto BOOT_IMAGE=247-p6 ro root=302
BOOT_FILE=/boot/vmlinuz-2.4.7-pre6'.
#0 0x0 in ?? ()
(gdb) add-symbol-file /lib/modules/2.4.7-pre6/kernel/fs/bfs/bfs.o
0xc8834060
add symbol table from file
"/lib/modules/2.4.7-pre6/kernel/fs/bfs/bfs.o" at
.text_addr = 0xc8834060
(y or n) y
Reading symbols from /lib/modules/2.4.7-pre6/kernel/fs/bfs/bfs.o...done.
(gdb) disas bfs_read_super
Dump of assembler code for function bfs_read_super:
0xc8834514 : sub $0x10,%esp
0xc8834517 : push %ebp
0xc8834518 : push %edi
0xc8834519 : push %esi
0xc883451a : push %ebx
0xc883451b : mov 0x2c(%esp,1),%esi
0xc883451f : push $0x200
0xc8834524 : mov 0x28(%esp,1),%eax
0xc8834528 : movzwl 0x8(%eax),%ebx
0xc883452c : push %ebx
0xc883452d : call 0xc012e258


其中vi map file主要是要把text的address轉到0xc8834060 .text_addr = 0xc8834060

kernel source level debugger, 由於沒有source只能靠看symbol方式除錯, kgdb提供在x86平台上可以像除一般應用程式般的有source level的除錯, http://kgdb.sourceforge.net
Solaris

Solaris上有adb kadb做kernel的除錯, 主要是像Linux上的一些查詢系統資訊的方式, adb也可以拿來做一般程式的處理,不過沒有gdb這麼powrful做 source level除錯,通常是

adb -k unix_kernl kernel_core ->除錯某個特殊的kernel core dump
adb -k ->這是除錯目前正在跑的kernel
adb -k /dev/ksyms /dev/mem
adb a.out ->除錯一般程式


一些用法

add:b 設中斷點add可以是address或函數名(symbol)(其實兩個意義是一樣的)
add:d Delete中斷點
:z Zap(Delete所有中斷點)
:r Run
:c Continue
:s Step
:e nExt

$c 這個就是gdb的backtrace這很重要的,看系統毀掉前叫了什麼函數
$q 離開adb

$ < 巨集 執行巨集(有些巨集已經寫好可以完成特定工作)
例如察看現在所有註冊的file system有個vfslist這個巨集
kernel除錯大致上靠這些巨集
add$ < 巨集 將目前add的內容餵給巨集處理
$>file redirect結果到檔案file,要再導回螢幕,不要給檔名file就好
$m address map


跟gdb一樣要有一個執行檔還要有core file來除錯, 通常系統crash掉時的core是vmcore.0 vmcore.1 ......., 每次毀掉的kernel symbol table叫vmunix.0 vmunix.1 ......

savecore這個命令會把之前在dump device的內容存起來, 如果發現dump device前有magic number而且版本跟目前OS一樣, 就把它存到一個savecore directory, savecore directory是在/var/crash, 會存成vmcore.X X是流水號, 可以在/etc/init.d/sysetup裡設定每次boot up後就做一次savecore, 然後用


adb -k vmunix.0 vmcore.0
crash -d vmcore.0 -n unix.0


來除錯

查看某個kernel內部位址或symbol名的內容可以用

symbol_name? 看obj file symbol
symbol_name/ 看core file symbol
symbol_name= 看symbol位址


其中?, / 與=後面跟著的選項

X heX 十六進位
D Decimal 十進位
f Float 小數形態資料
s String 印出字串
Y Year 印出日期形式
i Instruction 印出assembly指令
W value Write 這會把value設給symbol


這些選項前面可以跟著數字代表要印出的數目

特殊系統資訊與symbol字串, 可以用nm或strings找出kernel的symbol名,然後在adb裡除錯 例如solaris kernel裡有個cpu_list這個變數(symbol)

cpu_list/X


如果是一顆cpu會顯示0

*panicstr/s 系統crash掉時的原因會放在這
rootdir/X rootdir是VFS中root vnode的struct
rootdir/W 0 這會把系統毀了(哈哈)

6ef2c9a0/2X 從位址0x6ef2c9a0看兩個Hex的值
0x6ef2c9a0: 38e955fc f68c61d7


adb可以把常用的命令寫成巨集完成某特定工作, 例如

$< msgbuf
rootvfs$< vfslist
rootfs$< bootobj


Solaris系統內有一些內定巨集了,藏在/usr/lib/adb。一些常用巨集如下

msgbuf message buffer是kernel ring buffer
是這個core的一些重要message,這個巨集會用比較好看的格式秀出
proc 看目前系統的process
thread
threadlist
mutex
pid
proc2u

vfslist 看目前vfs裡有那些filesystem
file
vnode
inode

modules Solaris裡的modules結構
stdata
queue
qinit
mblk
regs
stacktrace
utsname


kernel除錯通常必需用到core dump檔, 抓進來後用backtrace(在solaris裡就是$c), 捉出死掉前倒底叫了什麼子函式,

$c
complete_panic(?) + 24
do_panic(0x10404000,0x1,0x1040cf58,0x0,0x20,0x0)
vcmn_err(0x3,0x1040e128,0x3,0x3066b214,0x0,0x1043ea60) + 190
cmn_err(0x3,0x1040e128,0xeffff9a0,0x18d,0x18d,0x10407400) + 1c
die(0x31,0x3066b3f8,0xf68c61d7,0x0,0x1040e128,0x0) + a0
trap(0x3066b3f8,0x0,0xf68c6000,0x1,0x0,0x5) + 830
.....


然後一步步追蹤一些重要的symbol, struct等等, 追到看看是那個symbol出問題找,到相對應的C code來debug, 通常傳進來的address都有問題,或者多工狀態時的parametersr沒有處理好

[轉]GCC參數

題目:編織出個好程式--GCC參數篇(一)
作者:陳信宏(Ivor Chen)
E-mail add:civor@ksts.seed.net.tw or
Ivor.bbs@bbs.ccu.edu.tw
地址:嘉義市西門街 80 號
電話:(05)2253215

GNU C/C++是由自由軟體協會(FSF;Free
Software Foundation)所發展和推出的一套功能
完備的 C/C++語言編譯器和程式庫,C/C++ 語言
以其類似高階語言的語法和接進機械語言的執行
速度,成為軟體發展的重要選擇之一; C/C++語
言的可攜帶性能力本來就很高,這使得發展完成
的程式只需修改小部份或是根本不需修改,就能
輕易的移植到不同的作業系統上;雖然 C/C++本
身有這些先天上的優點,但更重要的是需要有個
良好的編譯程式,才能將可執行檔編得更快、編
得更小,而且若是在不同的作業系統上都有一套
相同的編譯器,那對於程式設計人員有著莫大的
幫助和方便,因為不會有在那個OS下要用那個編
譯程式的困擾;多年來,GNU C/C++ 一直盡職的
扮演這個角色。
如同 Linux一般,GNU CC非由一人或一公司
所撰寫,除了Richard Stallman先生外,全世界
的使用者也供獻了許多心力,有人加入新的關念
和技巧,有人改善舊有的結構,更有人把她移植
到不同的機型和作業系統上,在夜以繼日時時刻
刻的改進之下,GNU CC匯集了各方的優點加以融
合,並朝未來進步之中;在 Linux中就是以她作
為發展工具,在重編核心之時便是她擔任重責大
任,而且在 DOS中也有GNU CC-- DJGPP。然而她
並未提供如 Turbo C的整合發展環境,想要認識
她的使用者難免會有吃力的感覺,面對如此的仰
之彌高,最直接的方法便是從控制功能的參數認
識起,如此一來不但不會鑽之彌堅,而且還能漸
入佳境,因此我們就先從參數談起。

GNU C/C++ 的一些相關資料
========================
gcc 是 GNU C/C++的 C語言編譯程式的名稱
,在接下來的文章之中,筆者將以大寫的 GCC來
代表 GNU C/C++,而以小寫的 gcc來代表編譯程
式,gcc 的語法如下:
gcc [option|filemane]...
其中filemane是將要編譯的檔名,option是將要
認識的參數部份。
當要編譯 C++語言時,g++ 為使用的編譯程
式,在此 g++是一個完全的編譯器--而不只是個
前置處理器,直接產生物件碼,這樣的 C++執行
起來才更有效率,其語法如下:
g++ [option|filemane]...
其中參數部份除非有指明是專屬於 gcc或是 g++
外,其餘兩者皆可使用。
在一般的情況下,GCC 的編譯過程有下列四
個步驟:preprocessing,compilation,assembly
和 linking,而整體參數(overall options) 的
作用是指定在那一階段停止,其它類型的參數主
要是調整這四個步驟中某一步驟的動作。
由於許多參數之後都允許加上其它控制的子
參數,因此對於參數間的合併使用有較嚴格的限
定--兩個參數不可併成一個,如 -dr這個參數便
和 -d -r在作用上有著極大的不同。對於不同類
型的參數,在排列上不需依任何順序。而相同類
型的參數,也沒有只能使用一個的限制。對於某
些參數如-f或是-W,其後的子參數可能是一個字
串,如 -fforce-mem或是-Wformat,這類型的組
合大部份都有posetive和negative兩種型態,如
-ffoo的negative型為-fno-foo,在接下來的討
論之中,若是這兩種型態皆存在者,筆者會一同
列出。

整體參數(Overall Options)
=========================
整體參數的目的在於控制編譯的進行,即編
譯到那個階段便停止,因此我們先來看看各種字
尾和檔案間的關係:

'FILE.c' 需作前置處理(preprocess)的 C語言
原始程式

'FILE.i' 不需作前置處理的 C語言原始程式

'FILE.m' Objective-C 的原始程式,且必需和
程式庫 'libobjc.a'連結才能植執行

'FILE.h' C 語言標頭檔(header file)

'FILE.cc'
'FILE.cxx'
'FILE.C' 需作前置處理的 C++語言原始程式

'FILE.ii' 不需作前置處理的 C++語言原始程式

'FILE.s' 組合語言檔

'FILE.S' 需作前置處理的組合語言檔

接下來我們來看整體參數:

-x LANGUAGE
GCC 會以檔案字尾來判定是何種語言來作編譯,
而本參數的作用為指定後續的檔案之語言種類,
不管其字尾為何,LANGUAGE的可能內容為
c objective-c c++ c-header
cpp-output c++-cpp-output
assembler assembler-with-cpp
這些指定的語言會一直作用到下一個-x參數

-x none
不指定任何語言,以輸入檔案的字尾為準

當只希望作某階段的編譯時,用-x可指定編譯的
起點,下述的參數可以指定編譯終點:

-E
此參數指定只作完perprocess便停止,不作接下
來compiler等動作,並輸出到標準輸出(stdout)
去,對於不需前置處理的檔案本參數無效。

-S
只進行到compiler便停止,因此輸出為一組合語
言檔,在內定的輸出檔名為輸入檔名去除.c或.i
等字尾之後加上.s而成。

-c
只 compile或assemble輸入檔案,而不作連結,
因此輸出為一目的檔(object file), 內定的檔
名為去除.c、.i或是.s等之後加上.o而成。

-o FILE
不管在那一階段結束動作,都可用此參數將內定
的輸出檔名改成"FILE";若是沒用此參數,最後
產生的可執行檔檔名內定為 "a.out",在各階段
結束的輸出內定檔名請看上列參數。

-v
將正在執行的編譯階段及編連程式的版本輸出至
標準錯誤輸出(standard error output)。

-pipe
在不同階段之編譯時,使用管線(pipe)取代暫存
檔,在某些系統上的組譯程式(assembler) 由於
不能由管線讀取資料,而使得這參數無效,但對
GNU assembler 而言此參數當然可用。

和C之方言(C Dialect)有關的參數
==============================
所謂的「方言」或是「標準語言」在此是以
制定的標準而言,因此ANSI C便是「標準語言」
,而相對的較舊(在制定之前的 C)或是較新者(
如C++)便成了「方言」,這樣的分類是因為依實
際的情況而定,沒半點優劣的意思。
對於 C++語言而言,雖然 gcc能以檔名字尾
為判斷而作正確的編連,但有時仍需指定物件程
式庫libg++為連結所需程式庫,因此如果要編連
C++語言,建議使用 g++(某些系統上為 c++)來
作,因為 g++會將語言內定為 C++、將libg++內
定為標準程式庫,而且對於字尾並不符合標準字
尾的檔案也能作編連。
接下來我們來看方言參數:

-ansi
指定為ANSI C語言,本參數會將不符合ANSI C標
準的字視為語法錯誤,因此本參數會關閉 GCC中
許多有用的關鍵字,如 asm、inline和typeof,
以及用來辨認系統的巨集名稱如unix和 vax,而
且 $將不可用來作為識別字的一部份;__asm__
、__extension__、__inline__ 和__typeof__這
四個字不管有無本參數都可繼續使用,不過它們
通常是放在標頭檔中,而 __unix__ 和 __vax__
也是相同情況;當指定本參數時,alloca,abort
exit、_exit 和 ffs將不會視為內建函數。
當設定本參數時,將會定義__STRICT_ANCI__ 這
個巨集,許多標頭檔利用這個巨集定義與否來宣
告相關的其它巨集或函數,這個目的只是為了符
合ANSI的標準。
對於非ANSI的程式,本參數並不會使編譯終結或
發出任何警告,因此通常需加入 -pedantic,有
關這個參數將在警告參數中說明。

-fon-asm
不將 asm、inline和typeof識為保留字,因此這
些字可當成識別字(identifiers), 如欲達到這
些功能,可用__asm__,__inline__和__typeof__
來代替;而 -ansi包含本參數的功能。

-fno-builtin
對於某些不是以雙底線(__)開頭的函數,不視為
內建函數,這些函數為--abort、abs、alloca、
cos、exit、fabs、ffs、labs、memcmp、memcpy
、sin、sqrt、strcmp、strcpy和strlen。
通常 GCC對這些函數有特定的處理方式--利用一
段小而且更有效率的碼來取代,例如呼叫alloca
通常會變成直接調整堆疊的單一指令,而memcpy
則是一inline的複製迴圈,這使得程式變小又變
快,由於程式碼已經改變,因此無法對這類函數
定除錯中斷點,而且也不能以連結別的程式庫的
方式來改變這些函數的行為。

-trigraphs
支援ANSI C trigraphs,本參數包含在-ansi中.

-traditional
會使 GCC以「傳統」的方式來編譯程式,所謂傳
統是指在ANSI C之前,其方式如下:
○所有在函數內宣告的extern變數具有整體作用
○新的保留字'typeof'、'inline'、'signed'、
'const' 和'volatile'不具作用
○允許指標和整數作比較。
○'unsigned short'和 'unsigned char'皆轉換
成'unsigned int'。
○不認定超出範圍的浮點數指標為錯誤
○對於 constants型態的字串,會存放在可寫入
的區域,可在程式中更改其內容。
○不再定義'__STDC__',然而'__GNUC__'仍將定
義,這使得在標頭檔中能以這兩個巨集名稱存
在與否來分辨是用 GNU C、traditional GNU
C 、other ANSI C或是other old C 編譯程式
來作編譯。

-traditional-cpp
以傳統的 C前置處理器方式來編譯程式。
○以 newline字元為一字串的結束記號。
○將'\x'和'\a'兩escape sequences轉換成'x'
和 'a'字元。
○允許'this'在 C++程式中使用。
以上這三項方式包含在-traditional參數中。

-fcond-mismatch
允許 conditional expressions之第二和第三個
參數為mismatched types。

-funsigned-char
-fno-signed-char
將'char'設為unsigned;不同的主機和系統對於
'char'的基本設定並不相同,有些為signed、其
它則相反,程式中的'char'變數會因不同系統而
有差異,本參數主要目的便是作強制設定;本參
數之同義詞為-fno-signed-char。

-fsigned-char
-fno-unsigned-char
將'char'設為signed。

-fsigned-bitfields
-funsigned-bitfields
-fno-signed-bitfields
-fno-unsigned-bitfields
這四個參數主要目的為設定 bitfields之符號值
,在內定上 bitfields是為signed--這可從基本
資料如 'int'是為signed看出;在-traditional
下所有的bitfields全為unsigned。

-fwritable-strings
對於 constants型態的字串,會存放在可寫入之
區域,可在程式中更改其內容;-traditional包
含本項功能。

-fallow-single-precision
就算是使用-traditional的情況下,也不要將單
精密度的運算子強制成雙精密度;傳統的 K&R編
譯程式會不論運算子之型態而將運算式改成雙精
密度,然而編譯時單精密度比雙精密度快多了,
因此若是需用-traditional又不需要double的運
算,便可用本參數;對於ANSI C和 GNU C而言本
參數無效。

C++ 方言參數
============
以下是用來控制編譯 C++時的一些參數,雖
然這些參數只對 C++有作用,然而若是使用於其
它語言,將會被忽略而不會產生任何錯誤。

-fall-virtual
除了物件建構者(constructor) 和 new、delete
外,將其它出現的成員函數(member functions)
視為 virtual函數;這並非意謂每次都是透過內
部的 virtual函數表來呼叫這些成員函數,而是
若compiler判斷能直接呼叫 virtual時,這些成
員函數同樣也是直接呼叫。

-fdollars-in-identifiers
允許 $這個符號在識別字串(identifiers) 中使
用,傳統的 C允許 $在識別字串中,但ANSI C和
C++禁止此種用法;本參數有相反詞。

-felide-constructors
在允許的情況下省略建構函數,在下列的程式片
段中本參數會使得呼叫 foo()時直接初始化 y:
A foo();
A y = foo();
未使用本參數時 GCC之過程如下(一)呼叫物件A
的建構函數來初始化 y (二)將 foo()的結果存
到暫存區 (三)將暫存區的值代換給 y;這個過
程是ANSI C++的標準。

-fenum-int-equiv
允許 int型態完全的轉換至enum。

-fexternal-templates
對於template函數將只在其定義的所在產生一份
copy,因而對template宣告能獲得較小的程式碼
,然而要達到這個效果,除了本參數外,還要定
義#pragma implementation或是#progma inter-
face;本參數會將所有的template視為外部函數
(external),因此可用 typedef來安排在在im-
plementation file 中出現的instantiations;
對於本身並無template的source,無需顧慮相關
程式是否有template,皆不需本參數作編譯,這
樣只是會加大物件程式碼的大小而以;本參數亦
有加上 no-之相反詞。

-fmemoize-lookups
-fsave-memoized
利用heuristics方法來加速編譯,然而本方法未
成為內定的編譯方式是因為本法只能針對一個輸
入檔案,對其它檔案之速度反而變慢。

-fno-strict-prototype
在 C++中對函數的雛型宣告(prototype declar)
有嚴格的規定,例如 "int foo()"之宣告在 C中
是可以的,它代表 foo()並無輸入值,但在 C++
中得要宣告成 "int foo(void)",本參數便是允
許在 C++中作 C般的宣告。

-fnonnull-objects
設定references之物件為非null型態。

-fthis-is-varible
允許程式中使用this,這是為了和過去的程式相
容的參數。

-nostdinc++
不要在內定的 C++標準目錄下搜尋標頭檔,然而
其它標準目錄還是依舊會尋找,本參數通常用於
建立 C++程式庫libg++時。

-traditional
本參數對 C++的作用如同 -fthis-is-varible參
數(對C和C++的共同影響請參閱「C的方言參數」
中之-traditional項)。

除上所述之外,專對 C++之最佳化、警告和
程式碼生成參數也一並在下討論:

-fno-default-inline
在 class中忽略inline之作用。

-Wenum-clash
-Woverloased-virtual
-Wtemplate-debugging
對於這些情況,只對 C++程式提出警告(相關內
容請看「警告參數」節)。

+eN
限定已定義之virtual函數如何使用(相關內容請
看「程式碼生成參數」節)。

除錯參數
========
對於編譯後的可執行檔之除錯方式,通常的
方是是在編譯之時便在特定部份放入除錯碼,有
除錯碼的程式在大小和執行速度上都會略遜一般
程式一籌,但相對的卻也提供額外的訊息讓 gdb
等除錯程式進行對原始碼及變數的追蹤等工作,
除錯碼的規格有許多種,而 gdb也有自己獨特的
部份,因此在不同的系統和不同的除錯器下,便
需不同的參數才能順利工作。

-g
產生作業系統認可格式(native format)的除錯
碼(可能為stabs、COFF、XCOFF或是 DWARF之一)
,以便 GDB除錯。大多數的系統使用 stabs格式
;本參數除了會產生標準格式碼外,還會產生額
外的除錯碼,這些額外的部份只有 GDB能辨識,
目的是為了提供更多訊息,因此若是要以別的除
錯程式來除錯,便需使用 -gstabs+、-gstabs、
-gxcoff+、-gxcoff、-gdwarf+或是-gdwarf,這
些參數的作用請看下列依次的說明。

-ggdb
除了產生 native format的除錯碼外,還再包含
GDB專用的擴充部份。

-gstabs
產生 stabs格式除錯碼,但不包含 GDB的擴充部
份,這是在大多數 BSD系統上 DBX所使用的格式
,然而在MIPS和 Alpha系統上卻會產生 DBX所不
能辨識的內嵌(embedded) stabs除錯碼。

-gstabs+
產生包含 GDB擴充部份的 stabs格式除錯碼,然
而這樣別的除錯程式便無法用來除錯。

-gcoff
產生COFF格式的除錯碼;COFF格式是System V至
Release 4 之前的 SDB所用之格式。

-gxcoff
產生 XCOFF格式之除錯碼;這個格式為DBX在IBM
RS/6000 系統上所使用。

-gxcoff+
產生包含 GDB擴充部份的 XCOFF格式除錯碼。

-gdwarf
產生 DWARF格式的除錯碼;這個格式是System V
Release 4 上 SDB所用之格式。

-gdwarf+
產生包含 GDB擴充部份的 DWARF格式除錯碼。

-gLEVEL
-ggdbLEVEL
-gstabsLEVEL
-gcoffLEVEL
-gxcoffLEVEL
-gdwarfLEVEL
產生不同格式的除錯碼,並依 LEVEL的數值決定
除錯碼的多寡,內定數值為 2。
LEVEL 1 產生最少量的除錯碼,通常置於非主要
除錯部份,在這些除錯碼中包含函數和外部變數
(external variables)的描述,但無行編號和區
域變數(local variables)。
LEVEL 3 包含比 LEVEL 2更多額外資訊,如所有
此程式中定義的巨集。

-p
產生分析程式prof所能確認的特殊碼,在編譯和
連結時都需使用本參數才能達到目的。

-pg
產生分析程式 gprof所能確認的特殊碼,在編譯
和連結時都需使用本參數才能達到目的。

-a
產生basic blocks的基本訊息,如每個blocks執
行的時間、啟始位址和包含的函數名稱;如果-g
一起使用時,行編號和第一個 block的檔名也會
一併記錄,這些資料內定會附加到bb.out中,可
用tcov或是 gprof作分析。

-dLETTERS
本參數是對"編譯程式"作 debug,方式為當編譯
進行到 LETTERS所指定的步驟時,將特定資訊傾
印到指定的檔案去,相信讀者看到此可能會覺得
奇怪,為何要對編譯程式除錯呢?照說 GCC應該
是不太可能會出錯的,事實上別忘了 GCC是網路
上大家同心撰寫出來的,新增改進部份的測試方
式為令其編譯一程式並觀查其結果,這時本參數
便派上用場了,有時也會發生 patch後再編譯舊
程式時竟然出現過去沒有的錯誤,若確定舊程式
沒問題,可用本參數一步一步追蹤編譯的結果;
以下是 LETTERS的部份;
M 當前置處理完畢後dump出所有的巨集定義
N 當前置處理完畢後dump出所有的巨集名稱
D 當前置處理完畢後dump出所有的巨集定義至一
般輸出,因此可重新將結果導至檔案
y 在語法分析(parsing) 時將除錯訊息dump至標
準錯誤輸出
r 在 RLT產生後將內容dump至FILE.rtl
x 只產生 RLT碼後便停止,本項通常和上一項 r
一起使用
j 第一輪跳躍最佳化作完便dump至FILE.jump
s 完成 CSE後dump至FILE.cse
L 當迴圈最佳化(loop optimization)完成後便
dump至FILE.loop
t 第二輪 CSE完成後dump至FILE.cse2
f flow analysis 完成後dump至FILE.flow
c 指令連結完成後dump至FILE.combine
S 第一輪指令排程語法分析完成後後dump至
FILE.sched
l 區域暫存器變數定位完成後dump至FILE.lreg
g 全體暫存器變數定位完成後dump至FILE.greg
R 第二輪指令排程語法分析完成後dump至
FILE.sched2
J 最後一輪最佳化完成後dump至FILE.jump2
d delayed branch 排程完成後dump至FILE.dbr
k 暫存器變數轉換到堆疊後dump至FILE.stack
a 完成上列所有dump
m 編譯完畢後印出記憶體使用狀況至std error
p 將assember的輸出加上有使用之alternative
和 pattern的註釋

-fpretend-float
當進行cross-compiler時,將目標主機的浮點運
算器假設為和目前主機相同,以便編譯出的程式
在目標主機上能執行無誤;所謂cross-compiler
為在某一型主機或是OS上(如Unix)編譯出另一OS
(如 DOS)執行檔的過程,如此在軟體移植上更為
方便,相關的詳細內容會另文再敘。

-save-temps
將編譯時的產生的中間暫存檔儲存起來,例如使
用"-c -save-temps"來編譯 foo.c時將會產生
foo.i 和 foo.s。

-print-libgcc-file-name
只是印出'libgcc.a'此檔的絕對名稱,在本參數
下 GCC並不作任何事--只是列出libgcc.a這個字
串;當使用 -nostdlib參數卻同時想和libgcc.a
連結時便可依下列方式使用本參數:
gcc -nostdlib FILES... 'gcc -print-libgcc-
file-name'

最佳化參數
==========
最佳化一個程式的演算法有很多種:從合理
的調整程式結構流程到適當的安排變數型態等不
一而足,且除了程式方面的最佳化之外,還可配
合主機硬體優勢和OS過人之處來加以運用,但不
管如何,最佳化的目標仍是唯一的--更快、更小
、以及能配合所在環境的更好。

-O
-O1
初步最佳化,作最佳化的編譯當然會花費更多的
時間和記憶體;未使用本參數前 GCC編譯的原則
是減少編譯成本,而且各個階段的編連是各自獨
立的--可以在任一階段停下來,重新指定變數內
容,且各階段的結果和一般的狀況相同,完全符
合正常的程序,然而本參數會以整體四個階段一
起考慮,且本參數包含許多其它參數,目的就是
要減少程式大小及執行時間;使用本參數同時會
將-fthread-jumps和-fdelayed-branch開啟。

-O2
更進一步最佳化,本參數可直接使用不需配合上
一個參數,在本參數下除了「大小--速度」需犧
牲一方的演算法外其於都會用來作最佳化處理,
也就是除了 frame pointer elimination和loop
unrolling 外其餘將會利用上;和上一個參數比
起來本參數在編連時間和執行碼效能都更優越。

-O0
不作最佳化;然而若是之前有指定其它 LEVEL的
參數,將不會受到本參數的影響。

接下來是許多和 CPU構造有關的參數,它們
的型態為-fFLAG,大部份有相反詞,而相反詞為
FLAG之前加上 no-所形成。

-ffloat-store
"不要"將浮點變數儲存在暫存器中,而且抑制其
它會改變從暫存器或記憶體所得浮點數之值的參
數功能;本參數避免了一個現象,即浮點數的值
無緣無故的加了好幾位小數出來,本來若將變數
內容放在暫存器中,會比在記憶體中快上許多,
這也是一般最佳化的方法之一,然而對許多主機
例如 68000來說其浮點暫存器所能容納的長度比
double還長,這對一般程式來說無可厚非,然而
對數值計算程式或是利IEEE浮點數的程式而言卻
是"窩裡反"的行為,本參數就是避免這種情況發
生。

-fno-default-inline
inline這個關鍵字的作用是在呼叫此類函數的地
方有著這個函數的程式碼存在,如此雖然程式變
大了但執行速度也加快許多,當使用-O時物件中
定義在 class區域中的每一個成員函數都是以
inline的型態處理,而本參數便是限定不要將這
些成員函數視為inline。

-fno-defer-pop
函數呼叫時其間傳入值和傳回值的傳遞是靠堆疊
來完成的,一般情況下編譯程式會在堆疊之中累
積一些argument後再一起 pop出去,這是為了速
率著想,而本參數的作用便是不要作堆積,進一
個便彈一個出去。

-fforce-mem
強制 memory operands在作運算前先copy到暫存
器中以加快運算速度。

-fforce-addr
強制 memory address 之內容在作運算前先copy
到暫存器中以加快運算速度。本參數對於程式整
體效率的提升比 -fforce-mem還好,但這兩個參
數並不適合任一機種。

-fomit-frame-pointer
當函數用不到 frame pointer時將它從暫存器中
清除,本參數同時抑制了任何儲存、設定或回存
frame pointer 的動作,這將使得更多的函數可
利用暫存器以提升執行效率。

-fno-inline
忽略關鍵字inline的作用。

-finline-functions
整合所有「簡單」的函數到呼叫它們的函數內,
而「簡單」的標準由 GCC自行判斷;假如一個函
數被整合到其它函數中,且其型態為static,此
函數當然不會有自己本身的輸出。

-fkeep-inline-functions
本參數要和上一參數對照;縱然一static函數被
整合到其它函數內,仍輸出執行時期可供呼叫的
version。

-fno-function-cse
不要將函數所在位址放在暫存器中,這將使得每
個呼叫函數的指令包含了函數位址,這會產生較
沒效率的程式碼,但對於某些會改變 assembler
輸出的 hacks來說,最佳化的過程會擾亂程式的
行為,那時便需使用本參數。

-ffast-math
本參數允許 GCC違反某些ANSI或IEEE規則來作運
算,這將使得執行速度加快,但對於運算程式等
需依賴數值精密度作計算者則本參數不應和任何
-O參數共同使用,因為很有可能產生錯誤結果。

前置處理器參數
==============
直觀來說前置處理器的作用為處理程式之中
以 #開頭的命令,這些命令於常見的有標頭檔的
引入和定義常數及巨集等,可以說是在編譯之前
的準備動作,有時也可用依某常數定義與否來決
定那些程式片段是否要編譯,這對移植的工作有
很大的助益,例如同樣要作到印出檔案名稱,在
不同的OS和檔案格式上所得的結果就有蠻大的差
異,在此就可分別寫不同的處理碼,然後再利用
#ifdef等命令適機編連,不僅節省程式碼,還能
加快速度;以下的參數,便是和前置處理時期有
關者,而且許多參數需和-E配合使用。

-include FILE
在編譯目標程式之前先編譯FILE,而且FILE並無
只能為標頭檔的限定,若是和-D及-U合併使用時
以本參數為優先處理,當參數列中不只一個本參
數及-imacros時依其順序執行。

-imacros FILE
本參數和上一個參數幾乎相同,同樣都是在編譯
目標程式之前先編譯FILE,所不同的是本參數會
捨棄FILE的輸出,這使得FILE中唯有放置巨集定
義才有作用。

-idirafter DIR
將 DIR內的路徑加至第二包含路徑中,當在主要
包含路徑中找不到標頭檔時便可到第二來尋找,
而主要包含路徑便是由-I所指定。

-iprefix PREFIX
設定PREFIX之內容為-iwithprefix中之prefix預
設值。

-iwithprefix DIR
增加一個路徑到第二包含路徑中去,而這個路徑
由 DIR和-iprefix中的PREFIX之內容聯合組成。

-iwithprefixbefore DIR
增加一個路徑到主要包含路徑中去,而這個路徑
由 DIR和-iprefix中的PREFIX之內容聯合組成。

-nostdinc
不要在標準系統目錄下尋找標頭檔,只在目前目
錄和-I所指定的目錄下尋找,因此這對於自行建
立程式庫有幫助,有關目錄的所有選項請看稍後
的「搜尋參數」。

-undef
不要預先定義任何非標準的巨集。

-E
本參數在「整體參數」有提到過,作用為令 GCC
完成前置處理後便停止。

-C
命令前置處理器不要捨棄註解部份,本參數需和
-E共用。

-P
命令前置處理器不要產生 #line命令,本參數需
和-E共用。

-M
命令前置處理器輸出給make程式用的規則,內容
為每個目的檔的依存規則,對於每個source,前
置處理器會將其target定為目的檔(object),而
其中所使用到的標頭檔便成為依存檔,有關本參
數的最佳參考為 ~/linux下Makefile中depend這
項依存規則的內容;另外一個如本參數功能的方
法為設定環境變數"DEPENDENICS_OUTPUT"。

-MM
本參數唯一和-M不同之處在於輸出的規則中唯有
使用者自定標頭檔(#include "FILE" 部份)才會
列入,而系統標頭檔(#include 部份)並
不會列入。

-MD
作用如同-M一樣,然而在本參數會將規則輸出到
和.o檔同檔名的.d檔中(-M要用重新導向的方法)
,而Mach utility中的"md"可將各別的.d檔集合
成可供make使用的依存檔。

-MMD
為 -MM和 -MD功能的交集。

-H
印出所使用的標頭檔。

-DMARCO
定義巨集 MARCO為字串"1"。

-DMARCO=DEFN
定義巨集 MARCO為DEFN;此時所有的-D參數將比
-U參數優先執行。

-UMARCO
取消 MARCO的定義;此時-U還是比-D後執行,但
卻在-include和-imarcos之前。

-dM
命令前置處理器在前置處理完畢後列出所有有效
的巨集名稱,本參數需和-E共用。

-dD
命令前置處理器輸出所有的巨集定義內容。

-dN
命令前置處理器輸出所有內定之外的巨集定義。

-trigraphs
支援ANSI C trigraphs,本參數包含於 -ansi。

傳遞參數至組譯程式(Assembler)
=============================

-Wa,OPTION
將OPTION的內容傳給組譯程式,其內容是由參數
們所組成,不同的參數間以逗號( ,)隔開。

連結參數
========
當原始程式編譯或組譯完成候,便完成了基
本架構,如條件判斷或是迴圈等已正確的轉換成
機器語言型式,這便是.obj的內容,在不同的主
機和OS上.obj的格式也不相同,在程式中通常都
會呼叫一些函數,這些函數的可執行碼便放在程
式庫中,需要把它們加進來才算是完整的可執行
檔,而這個過程便稱為連結(link),本區所要介
紹的為控制連結過程的各項參數。

-OBJECT-FILE-NAME
連結之時會以.o檔為模版造出最終可執行檔,這
個過程是以.o的字尾來判定是否為Object檔,若
是當Object檔字尾不是.o時,便可使用本參數,
而OBJECT-FILE-NAME的內容是為非標準Object檔
的檔名。

-lLIBRARY
連結時尋找 LIBRARY.a程式庫作為程式庫來源,
本參數所指的程式庫為附加方式,即標準程式庫
仍會用來作連結,不管本參數有設定,而相關的
目錄路徑則為標準路徑加上-L所指定的路徑;如
果參數列中有兩個以上的目的檔,本參數的位置
有很大的影響,如在 "foo.o -lz bar.o"中 -lz
只對 foo.o有效,即 bar.z無法連結到 z.a中的
特定函數。

-lobjc
若是編譯 Objective C程式則需以本參數來連結
專用程式庫。

-nostartfiles
編譯完成的可執行檔在啟動時都會經由標準系統
啟動程式(standard system startup file)作啟
動的動作,這個檔案依OS的不同而有不同的功能
,本參數便是命令連結程式不要將啟動程式連入
執行檔中。

-nostdlib
當連結時不要使用標準程式庫和啟動程式,但由
-l指定者不在此限。

-static
對於提供動態連結(dynamic linking) 的系統,
本參數抑制與共享程式庫作連結(也就是說GCC的
內定為動態連結)。

-Xlinker OPTION
在 GCC中內定的連結程式為ld,而且 GCC能以內
部的方式將參數傳給ld,然而在某些系統下能在
Makefile中改變LD變數的內容來指定特別的連結
程式,此時控制參數便需本參數來作傳遞,此時
GCC 會將OPTION的內容傳給特定連結程式,如果
傳遞的參數有附加選項,則需本參數兩個才能成
功,如欲傳遞 '-assert definitions'時,則需
寫成 -Xlinker -assert -Xlinker definitions
才行。

-W1,OPTION
對於 GCC能辨認的連結程式便可用本參數來傳遞
控制值,在OPTION中若有一個以上的參數,其間
使用逗號( ,)隔開。

-u SYMBOL
假裝符號SYMBOL未曾定義,使得程式庫模組可定
義同一符號。

搜尋參數
========
本系列參數定義有關標頭檔、程式庫和部份
編譯程式的搜尋路徑。

-IDIR
增添 DIR中的路徑到標頭檔搜尋路徑之中。

-I-
任何在本參數之前的-I參數,其所設立的路徑將
只會用在對 #include "FILE"的搜尋,對於搜尋
#include 並無影響,然而在本參數之後
的-I,其路徑對所有的#include皆有作用,因此
本參數還會使得目前目錄不是第一個搜尋"FILE"
的路徑;由於本參數並不會影響對標準系統目錄
的標頭檔搜尋,因此和 -nostdinc各自獨立。

-LDIR
增添 DIR到由-l所指定程式庫的搜尋路徑去。

-BPREFIX
本參數主要作用為指定如何去尋找和編譯程式有
關的可執行檔、程式庫及資料檔等;編譯時其實
是由四個子程式所共同完成--cpp、cc1、as和ld
,這四個程式在 gcc的統籌驅動下完成編連的四
個步驟,在沒指定本參數的情況下, gcc會先在
/usr/lib/gcc/ 和 /usr/local/lib/gcc-lib/下
尋找相關檔案,若未找到再依PATH所指去尋找,
若是使用本參數,則PREFIX中所指路徑將是第一
個尋找的目標。

警告參數
========
警告是在編譯的過程中所發出的建議訊息,
警告並非是錯誤,編譯後的程式仍可執行,不過
警告的目的為指出某段可能會出錯的宣告方式語
法,因此不可因不影響程式執行而掉以輕心;警
告參數的目的為對某種語法提出(或抑制)警告訊
息,以方便除錯或是順利執行,通常是以-W為開
頭,這些參數的相反詞為加 no-所形成,而不管
是那種類型,都不是 GCC的內定值。

-fsyntax-only
只檢查程式之語法有無錯誤而不作編譯。

-w
抑制所有警告訊息。

-Wno-import
抑制所有和使用 #import有關之警告訊息。

-pedantic
依嚴格的ANSI C的標準發出警告訊息,並駁回任
使用不允許擴充函數的程式。

-pedantic-errors
作用如同 -pedantic,但除了警告外還會產生錯
誤訊息。

-W
對下列情況提出警告:
○一個 nonvolatile自動變數將被改成 longjmp
時,這種情況唯有作最佳化時才會發生。
○當一個函數可能有傳回值,也可能不傳回任何
值時,例子如下:
foo (a)
{ if (a > 0) return a; }
○沒任何作用的 expression敘述。
○一個unsigned數值和零比較大小時。
○如 'x<=y<=z'的表示式,此表示式 GCC會將其
處理成 '(x<=y?1:0)<=z'以便程式能順利執行
,當然這樣和原來想表現的意思差蠻多的。
○當storage-class specifiers如'static'並不
是所有宣告中最先執行之時。

-Wimplicit
當某函數或某參數implicitly宣告時提出警告。

-Wreturn-type
當一函數內定傳回值為 int時卻作別種型態的宣
告便提出警告,或是當一函數無傳回值(void),
然而其中的return接一傳回值時便發出對return
的警告。

-Wunused
對某一local變數自宣告後便沒再使用、declare
一static函數後但未先define、還有一段敘述算
出一個結果,這個結果接下來卻未再使用等以上
三種情況提出警告。

-Wswitch
使用一列舉(enum)形態的變數為switch的 index
時,接下來卻缺少一個或以上的case作配合,或
者是case的 label超出了enum中的選項時,便發
出警告訊息,若是沒有必要列出每個case時可用
default 代替。

-Wcomment
當'/*'符號"又"出現在註解中時。

-Wformat
檢查printf、scanf...等函數其中第二個以後的
參數型態是否和第一個字串中所寫有符合。

-Wchar-subscripts
當陣列的註標(subscript) 之型態為char時便發
出警告,因為在某些主機上char為signed。

-Wuninitialized
當一自動變數未給予初值便使用時;如下的例子
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
這個例子看起來沒錯,因為只要 y為 1、 2或 3
則 x都會有初值,但 GCC對於這樣的寫法並不夠
聰明到能看出 x會有初值這件事,因此對foo(x)
而言其中的 x就出問題了,然而當未使用最佳化
編譯時並不會有本警告出現。

-Wparentheses
當 parentheses在以下這些敘述中省略時:當預
期將為true value卻有assignment時,或是有令
人頭昏眼花的nest operators時。

-Wenum-clash
當兩個不同的enum型態作轉換時。(C++ only)

-Wtemplate-debugging
若是在程式中使用了模版(template)但除錯功能
未完全支援時。(C++ only)

-Wall
本參數為以上所有-W參數的總集,且本參數為最
推薦使用者,因為以上的情況便包含了一般情況
下該警告的事項。

接下來的這些參數並不包含於 -Wall之中,
這些參數所要警告的為一些結構上的問題。

-Wtraditional
對傳統和ANSI C的一些結構上的差異提出警告:
○switch的 operand型態為long。
○函數在 block中宣告為外部(external)而後在
block 結束後使用。
○巨集的參數是位於巨集本體的字串內容中,這
種情況對傳統 C是允許的,但對ANSI C會有不
相容發生。

-Wshadow
當一區域變數shadow另一區域變數時。

-Wid-clash-LEN
當兩個以上的辨別字(identifier)在開頭和 LEN
相同時。

-Wpointer-arith
當使用 size of在函數時。

-Werror
將所有警告轉換成錯誤,這會讓編連停止。