2011年10月26日 星期三

用 PuTTY 的 SSH Tunnel 上 BBS

用 PuTTY 的 SSH Tunnel 上 BBS
http://blog.xuite.net/vexed/tech/14718287

用 PuTTY 的 SSH Tunnel 瀏覽網頁
http://blog.xuite.net/vexed/tech/22157888

2011年10月24日 星期一

C Variadic functions stdarg.h 不定參數

C Variadic functions stdarg.h
http://zh.wikipedia.org/wiki/Stdarg.h

我的移除要求

https://www.google.com/webmasters/tools/removals?pli=1
我的移除要求
您可以使用這個頁面要求我們將網頁或網站從 Google 的搜尋結果中移除 (不一定所有要求都會通過核准。詳細原因。)。
使用此工具將特定內容從 Google 的搜尋結果中移除。
您沒有未完成的移除要求。

2011年10月23日 星期日

Recursive

http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=general&id=2830
作者 : chiuinan2(青衫)

(1) recursive algorithm:

Procedure HANOI(A,B,C,n) // 將n個環從A移到B //
    if n<=0 then 
        print("error")
    else if n=1 then 
        print(A,"→",B)
    else
       [ call HANOI(A,C,B,n-1); 
         print(A,"→",B);
         call HANOI(C,B,A,n-1) ]
end

設計的主要觀念為:
    1.將A柱中前n-1個環搬到C柱中暫置。(呼叫自己)
    2.將A柱中剩下最大的環搬到B柱中。
    3.將C柱中的n-1個環搬到B柱中。(呼叫自己)

(2)將recursive改成non-recursive的做法有很多種。如果已經知道recursive algorithm的話,最正統的方法便是直接將它化成non-recursive的形式。由recursive algorithm化成non-recursive algorithm的方法如下:

  1.在程式開頭處標上一個label。
  2.在每個呼叫自己的敘述的下一個敘述前,各標上一個label。
  3.把每個呼叫自己的敘述代換成一個將目前狀態push到stack的敘述,以及將程式參數改變的敘述,然後跳回程式的開頭。
  4.將每個返回敘述變成檢查stack的敘述,只有在stack為空時才能返回,否則必須pop出以前的狀態,然後跳到應返回的位置繼續執行。

上述的方法其實是在模擬程序遞迴呼叫的方式,label的記錄則是要得知其返回位址。因此本題的non-recursive algorithm便可以化成:

Procedure HANOI(A,B,C,n) // 將n個環從A移到B //
step 1: 
    if n<=0 then 
        print("error")
    else if n=1 then 
        print(A,"→",B)
    else
        [ push(A,B,C,n-1,2);
          (A,B,C,n)←(A,C,B,n-1);
          goto step 1;
step 2:
          print(A,"→",B);
          push(A,B,C,n-1,3);
          (A,B,C,n)←(C,B,A,n-1);
          goto step 1; ]
step 3: 
    if stack not empty then
        [ pop(A,B,C,n,ret_step);
          goto ret_step ]
end

這個方法所得出的algorithm雖然不是最佳的,但是卻保證一定正確。當然您也可以利用程式技巧將它化簡成沒有label的結構化程式。另外一種方式是要靠靈感的,可說是可遇而不可求。例如上述algorithm,其實可以寫成:

Procedure HANOI(A,B,C,n) // 將n個環從A移到B //
step 1:
    if n<=0 then
        print("error")
    else if n=1 then
        print(A,"→",B)
    else
        [ Push(C,B,A,n-1);
          Push(A,B,C,1);
          Push(A,C,B,n-1) ]
    if stack not empty then
        [ pop(A,B,C,n);
          goto step 1 ]
end

使用三個push敘述來模擬三次搬運,相當簡潔。這是從觀察它的呼叫方式和stack的關係所發覺的,並無規則可循。雖然這個algorithm相當簡潔,但是執行速度並不是最好的。主要的原因是在於模擬recursice call的stack push和pop次數太多,因而減低了執行的速度。如果我們所要求的是速度的話,則必須儘量不要用stack的結構來模擬,應該從分析該問題non-recursive關係著手。這種過程一般都相當冗煩,而且不一定能夠做得到。這裡我們只列舉別人研究的成果供讀者參考,並做為以後您將來寫程式時的一個目標。Hanoi塔問題的non-recursive關係如下:

另類行列式計算法——Chiò 演算法

另類行列式計算法——Chiò 演算法
http://ccjou.twbbs.org/blog/?p=4513

2011年10月22日 星期六

大陸溫州亂象之我見

大陸溫州亂象之我見
http://e-big.blogspot.com/2011/10/blog-post_17.html

[小惡魔的電腦教室] 電腦達人養成計劃,正式啟動!

[小惡魔的電腦教室] 電腦達人養成計劃,正式啟動!
http://www.mobile01.com/newsdetail.php?id=3527

2011年諾貝爾化學獎簡介

2011年諾貝爾化學獎簡介
http://www.ch.ntu.edu.tw/nobel/nobel100.htm

Bossa Nova 巴薩諾瓦

Bossa Nova
巴薩諾瓦
http://zh.wikipedia.org/wiki/%E5%B7%B4%E8%96%A9%E8%AB%BE%E7%93%A6

什麼蟲子咬我?

什麼蟲子咬我?
http://www.youth.com.tw/db/epaper/es002002/eb2568.htm

程式語言排名

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

2011年10月9日 星期日

從科學園區論全民受害的國家暴力

從科學園區論全民受害的國家暴力
http://mhperng.blogspot.com/2011/09/blog-post_2631.html

什麼是錢!!?

什麼是錢!!?
http://accrcw75.pixnet.net/blog/post/38094608


什麼是錢?

錢就是欠條。不管是黃金白銀,還是紙鈔,還是電子幣,本質都是欠條。黃金白銀、紙幣、電子幣的地位都是平等的,“金本位貨幣”理論是錯誤的。

假設世界上只有兩家人,老美兩口子和老華兩口子,開始他們兩家各幹各的,自給自足。一天,老美捉了4條魚,老華逮了8只鳥,老美想嘗嘗鳥味,老華想品品魚鮮,他們就交換了,老美用2條魚換了老華的4只鳥。以後他們常常這樣交換。

有一天,老美懶了,沒去捉魚,在家睡了一天。晚上,老華逮鳥回家,老美沒東西吃,就找老華借鳥吃。老美找一張樹皮,在上面寫上:2條魚。到老華家後,對老 華說:“我來換你4只鳥。不過,我今天生病了,沒能去捉魚,我給你打2條魚的欠條。”老華說:“這好說。”把欠條收下,把4只鳥給了老美。老美回去吃得美 滋滋的。

老美嘗到了這個甜頭,第二天又在家睡一天,晚上又拿2條魚的欠條去換了4只鳥。交換完畢,老美對老華說:“以後欠條上就不寫2條魚了,這欠條是我老美打的,以後就寫2美元吧。”老華欣然同意。以後欠條就用美元表示,如此日復一日。

按照商品交換的原則來說,商品交換應該是物物交換,商品換商品,而不是錢和物的交換。老美拿錢換了老華的鳥,老華得到錢,這不是商品交換的全過程,只是半 個過程。

老華手裡有老美的錢,就說明老美還欠老華的魚。所以,錢的本質就是欠條。等老華拿錢買了老美的魚後,商品交換的整個過程才結束。這個過程就是老美 用魚換了老華的鳥。

如果老華始終不用錢去換老美的鳥,那麼老美就占了大便宜了,白吃白喝老華的。可是,這裡,老美就設法始終不讓老華拿錢到他那裡兌換實 物。

日子長了,老華手裡積攢的錢有一大堆。老美害怕老華來兌換實物,就對老華說:“現在我們之間的交易,你是順差,順差對你是非常有利的,你要保持下去。”老華聽了很高興,就捨不得兌換實物了。老華就沒想起來問一問:“你是逆差,既然逆差不利,你為什麼要始終保持逆差呢?”

又過一天,老美覺得4只鳥不夠吃的,就寫了3美元,到老華家買了6只鳥。老美一天有6只鳥吃,老華反而只有2只鳥吃,餓得饑腸轆轆。但是一想到手裡有那麼多的錢,到老美家可以買很多很多的東西,夠自己養老的了,也就覺得值了。

以前,秦國利用其權威,經常為各國培養奸賊。外國的王公貴族到秦國去,秦國就教育他們:“以後只要秦國和你們的國家打仗,你們就割地,這對你們國家是最有 利的。”這些王公貴族,回到自己的國家後,因為是從秦國留學回去的,滿腹經綸,都被委任要職。

後來,只要秦國的大兵一壓,或者一封討伐信一到,這些國家就 立即割地。如今,美國的這種“順差有利”的理論被各國的留學生帶到世界,也就成了主流經濟學理論,美國靠印錢到各國買東西,各國都像守寶貝一樣守著美元, 捨不得花,美國暗裡得意死了。

又過了很長一段時間,老華發現老美給他的一些錢被蟲蛀了,想到老美家把這些欠條兌換成實物。老美對他說:“這些錢都是財富,你怎麼能輕易花掉呢?你太奢侈 了。

你不要擔心我兌換不起你,我富裕的很,你看我吃的喝的,哪樣不比你好?”邊說邊指著屋裡的一口袋一口袋的鳥肉乾說:“你看我有這麼多的財富,你還擔心 什麼?我完全能兌換得起你,你不要擔心,我拿我的人格發誓,我絕對不違約。

可是你有什麼,你就是個窮光蛋,天天餓得直打晃,我看著都可憐。俗話說,越窮越 賴,我倒擔心你的信譽呢。”老美說完,忽然感到說得不好,又立即改口說道:“當然啦,你只是表面上窮,實際上你非常富裕,你有那麼多的外匯儲備。

你看我有什麼,欠一屁股債。我倒感覺你對我的天下第一富的地位有嚴重威脅呢。”老華被他說得,如同一口喝了二兩老白乾,頓時覺得暈暈忽忽的。

老美又說道:“這充分 說明你這條路走對了。今後你還要繼續走下去,我們之間的貿易是互惠互利的。我們要共同富裕。”老華感激萬分,忙向老美表態:“您放心,我是個負責任的人, 絕對不失信!”

老美又指著老華手裡的錢說道:“既然這些錢被蟲蛀了,我就給你重新寫個債券吧。算是我借你的債,付給你優厚的利息,一年後還錢。”老華一 聽,這個合算,就換了一張債券回去。他們的交易又正常繼續下去。

終於有一天,老華有點醒悟了。他想:“老美這個傢伙天天什麼活都不幹,吃的喝的,全都是我的,比我過得還滋潤,我得到的只不過是些樹皮。而他總是想盡一切辦法,編出各種理論不讓我兌換實物,如果不能兌換,就只能當柴火燒。算了,以後就不和他交易了。”

晚上,老美又拿3美元去買鳥。老華不給他。老美就說:“如果你不賣給我,我就得餓死,那麼你手裡的美元和債券就全廢了。你要知道,現在救我就是救你自己。”老華聽了,不得已,還得和他交易。

究竟和老美還繼續交易不交易?老華愁死了,但是在他妻子面前還得裝作很英明的樣子。

轉眼一年過去了,老華的妻子翻出老美的那張債券,催老華去討債。還塞給老華一大抱美元,讓他順便到老美家多買點東西。老華怕減少外匯儲備,不想買東西,兩 口子為此事爭吵起來。老華的妻子嚷道:“不買東西,留這些美元有什麼屁用?今後不准你再要他的美元,也不准你再要他的債券!”

聲音傳到隔壁,老美嚇死了。對他妻子說:“我倒不怕他們來討債,我造錢還他就是了,要多少有多少。說實話,我根本就不需要向他們借債,不管買什麼,我直接 造錢付帳就行。其實,不管是我發出去的債券,還是美元,本質都是債券,都表明我欠人家的實物。

而我之所以要向他們借債,就是演戲,讓他們知道我對造錢很慎 重,不輕易造錢,我也不造錢買東西,以保持他們對美元的信任。我最怕的就是他們懷疑我亂造錢,造錢買東西,不信任美元,不接受美元。

其次我怕的是他們拿美元來換實物。這樣要把我們掏空還不說,我們還不能白占他們的便宜了。我們得想個辦法,讓他們繼續相信和接受美元,還不能讓他們來兌換實物。”

於是兩口子就嘀咕了一陣子,然後大聲吵起架來。老美的妻子大聲罵老美:“你這個飯桶,就知道吃吃喝喝,我讓你節省開支你也不節省,欠的都是債,拿什麼還 哪,我的老天爺呀,這個日子我不過了,我得上吊去!”

老美也大聲罵他的妻子:“你這個掃帚星,就知道怨我,你天天塗脂抹粉,穿紅戴綠,我讓你節省開支你聽 了嗎?你就知道讓我天天去借債,我上哪借去?你看人老華家的,那才叫會管家,人家多富裕,錢都多得發黴了。攤上你這個女人,我算倒八輩子的黴了。我也不活 了,我也得上吊去!”

隔壁老華兩口子聽得一清二楚,都想:“你們千萬不能死,你們死了,我們問誰要債去!你們要是缺錢花,就趕緊來借吧,借多少都有,絕對不限制,救你們就是救 我們自己。”老華想完,就對妻子說:“他們太可憐了,不能讓他們就這樣倒下。他們不好意思來借債,我們就主動送上去吧。 家裡還有一隻鳥,也送給他們吧。”老華的妻子連連點頭。

於是兩口子抱起一大抱美元和家裡僅剩的一隻鳥,到老美家去,對他們說:“送給你們應應急吧。”說完兩口子轉身就走了。

老美兩口子在後面,望著他們的背影,樂翻了天。

老美說:“這樣的傻瓜窮死活該!

簡報技巧小整理

簡報技巧小整理
http://funding101.blogspot.com/2011/01/blog-post.html

2011年10月7日 星期五

〈容忍與自由〉胡適

〈容忍與自由〉胡適

節錄部份:

《王制》(《禮記》的一篇)

...

我在那時候也完全沒有想想《王制》那句話的歷史意義。那一段《王制》的全文是這樣的:

『析言破律,亂名改作,執左道以亂政,殺。作淫聲異服奇技奇器以疑眾,殺。行偽而堅,言偽而辯,學非而博,順非而澤以疑眾,殺。假於鬼神時日卜筮以疑眾,殺。此四誅者,不以聽。』

我在五十年前,完全沒有懂得這一段話的「誅」正是中國專制政體之下禁止新思想、新學術、新信仰、新藝術的經典的根據。我在那時候抱著「破除迷信」的熱心,所以擁護那「四誅」之中的第四誅:「假於鬼神時日蔔筮以疑眾,殺。」我當時完全沒有夢到第四誅的「假於鬼神……以疑眾」和第一誅的「執左道以亂政」的兩條罪名都可以用來摧殘宗教信仰的自由。我當時也完全沒有注意到鄭玄注裏用了公輸般作「奇技異器」的例子;更沒有注意到孔穎達《正義》裏舉了「孔子為魯司寇七日而誅少正卯」的例子來解釋「行偽而堅,言偽而辯,學非而博,順非而澤以疑眾,殺」。故第二誅可以用來禁絕藝術創作的自由,也可以用來「殺」許多發明「奇技異器」的科學家。故第三誅可以用來摧殘思想的自由,言論的自由,著作出版的自由。

孩子問:「什麼是麒麟?」Giraffe嗎?

孩子問:「什麼是麒麟?」Giraffe嗎?
http://drspieler.blogspot.com/2009/09/giraffe.html

C與Fortran誰快,我該用哪種

關於Fortran較快的論點:
http://stackoverflow.com/questions/146159/is-fortran-faster-than-c

Fortran不允許兩個Pointer指向同一記憶體,C允許,所以C須重複load同一塊記憶體
除非C加上keyword returict:
http://en.wikipedia.org/wiki/Restrict

但只有C99支援
且還有其他因素使Fortran快於C,但其他因素是什麼?

 作者  yoco315 (眠月)                                         看板  C_and_CPP
 標題  Re: [問題] 為何公認fortran速度略快於C ?
 時間  Fri May  1 02:38:34 2009
───────────────────────────────────────


※ 引述《Carbontube (碳管)》之銘言:
: 大體上,就多數人認知,C與Fortran速度是有差的
:   小弟實在想不透這點,為何fortran可以比較快。


這邊有解釋
http://stackoverflow.com/questions/146159/is-fortran-faster-than-c


簡單來說就是 fortran 可以作一些 C 沒辦法(自動)做的最佳化
至於為什麼沒辦法自動作上面這篇跟下面 [1] 都有講
但是我們還是可以提示 compiler 作這個最佳化,看 [1]


這邊有兩個 C 的加速手段
[1] http://tinyurl.com/dygwpb __restrict__
[2] http://tinyurl.com/d55t9f __builtin_prefetch


只用上 [1] 的話大概打平手或是小贏,
[1] 跟 [2] 都用上的話,C 就贏了,我沒試過,只是合理推論
不過 [2] 不是標準,[1] 也只是 C99 的標準,C++ 沒的用
(雖然說還是有 extension 支援)


--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈.                  L. Peter Deutsch


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.106.42
推 vip82:推!!                                                      05/01 05:12
推 sjgau:fortran have common block, it is global valriable         05/01 07:51

另一個Fortran的優勢是有前人寫的LAPACK等數值運算函式庫
以上為Fortran77

但Fortran90出現POINTER,Fortran2003全面支援OOP
是否使Fortran的速度不再快於C?

又有人說Fortran2008不再支援OOP,是真的嗎?

 作者  DrStein (交換關聯)                                     看板  C_and_CPP
 標題  [閒聊] 怒吼,PTT怎沒有fortran版
 時間  Sun Sep  7 17:06:15 2008
───────────────────────────────────────
...略
※ 發信站: 批踢踢實業坊(ptt.cc)
...略
→ DrStein:Fortran優勢有三: 1.有lapack等數值函式庫                 09/07 20:28
→ DrStein:2.前人的科學計算程式,大多是用fortran來寫               09/07 20:28
→ DrStein:3.好學 比起C/C++那種指標強制學習制(開檔必要用指標)      09/07 20:29
→ DrStein:fortran無疑是非專業程設者的第一選則                     09/07 20:30
→ DrStein:(4.) fortran 2008直接支援平行,那更是目前的趨勢         09/07 20:31
→ DrStein:fortran2003胎死負中的原因 就是因為全面支援OOP           09/07 20:31
→ DrStein:後來會議結論是OOP不該存在於fortran中                    09/07 20:32
→ DrStein:也就是fortran完全定位為科學計算程式                     09/07 20:32

http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=gcc&lang2=ifc
上面的測試結果是用Fortran2003? 還是其他的版本?
是否有測試Fortran的強項?
Fortran的強項是什麼?(陣列? 迴圈?)

http://gcc.gnu.org/ml/fortran/2007-01/msg00619.html
g77的前身是g2c,也就是說用g77編譯Fortran時,她會先把Fortran翻成C
於是若拿g77當compiler,Fortran在速度上對C毫無優勢
那麼gfortran的編譯方式也是透過g2c嗎?

目前合法免費的Fortran compiler就只有gfortran?
須要用付費的Fortran compiler才能享有Fortran的高速嗎?

以下來個問題總結:
與C比較,Fortran的強項是什麼?(陣列? 迴圈? 複數? 禁止重複?)
該強項是比C快的原因是什麼?
哪些版本的Fortran快於C?
須要用付費的Fortran compiler才能完全享有Fortran的高速或強項嗎?

2011年10月3日 星期一

Constant Pointer


[18.5] What's the difference between "Fred const* p", "Fred* const p" and "Fred const* const p"?

http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5

You have to read pointer declarations right-to-left.

  • Fred const* p means "p points to a constant Fred": the Fred object can't be changed via p.
  • Fred* const p means "p is a const pointer to a Fred": you can't change the pointer p, but you can change the Fred object via p.
  • Fred const* const p means "p is a constant pointer to a constant Fred": you can't change the pointer p itself, nor can you change the Fred object via p.

const X& x and X const& x are equivalent.
const X* x and X const* x are equivalent.

TypeX const ... 可寫成 const TypeX ....

2011年10月2日 星期日

c++ class template cannot find its constructor

c++ class with template cannot find its constructor
http://stackoverflow.com/questions/644397/c-class-with-template-cannot-find-its-constructor

[35.12] Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?
http://www.parashift.com/c%2B%2B-faq-lite/templates.html#faq-35.12


A template is not a class or a function. A template is a "pattern" that the compiler uses to generate a family of classes or functions.

In order for the compiler to generate the code, it must see both the template definition (not just declaration) and the specific types/whatever used to "fill in" the template. For example, if you're trying to use a Foo<int>, the compiler must see both the Foo template and the fact that you're trying to make a specific Foo<int>.

Your compiler probably doesn't remember the details of one .cpp file while it is compiling another .cpp file. It could, but most do not and if you are reading this FAQ, it almost definitely does not. BTW this is called the "separate compilation model."

class template不是class,只是個pattern。compiler看到class template並不會製造出class,除非有使用到,才會在編譯過程中嘗試造出。

製造時,她必須要有class template的宣告與定義(實作),才能造出class method。
但compiler不會去記他之前看過的檔案,所以在有使用到template class的檔案裡,不只要include宣告,還要include定義(實做)。

/*A.hpp*/
template<class T>
class A
{...}

/*A.cpp*/
#include"A.hpp"
...

/*Main.cpp*/
#include"A.cpp"

另一種解法:(如果是用A<bool>)

/*A.hpp*/
template<class T>
class A
{...}

/*A.cpp*/
#include"A.hpp"
...
template class A<bool>; //令compiler現在就把A<bool>造出來

/*Main.cpp*/
#include"A.hpp"
//you can use A<bool>

如果你不能修改A.cpp的話,可以這樣:
/*A-impl.cpp*/
#include"A.cpp"
template class A<bool>;