搜索
Table_bottom

标签云
Table_bottom

分类
Table_bottom

声明
文章若未特別註明,皆採用 知识共享许可协议 請自覺遵守
Table_bottom

存档
Table_bottom

匆匆过客
30537
Table_bottom

功能
Table_bottom

Python中經驗致誤處

豫:這是一篇記述自己學藝不精的文章,而不是介紹什麼奇技淫巧或是隱藏語義的。

 

Python用了也有幾個年頭了(雖然並不是全年都在用),然而發現自己還是有很多依賴(其他語言的)經驗而導致問題的地方。可能是由於自己的學習方式,也可能僅僅是由於語義的問題,這些問題也許是一些人學習中總是會遇到的(嗯,我不會說有一些同學也遇到這些問題),故且總結一下,以饗後人。

 

我個人學習Python所依賴的是:1.其他語言的經驗(Pascal/C/C++/Java);2.實踐;3.《Python學習手冊》。

是的,我沒有看《Python Cookbook》一類的(貌似更適合用來入門的)東西——不是因爲覺得沒必要,而是因爲不知道《Python學習手冊》裏邊的內容居然是那個樣子……而看完《Python學習手冊》以後就再也不想看什麼書了,實在是被它的厚度噁心到了。

 

函數參數默認值

Python中支持函數重載,也(因此而得以)支持參數默認值。

在最初用過的其他語言中,一些(C、Java)不支持重載,而支持的(C++)也沒有內置一些高級數據結構(及其便捷的初始化方法),於是從來沒有遇到過這種問題。

 

到了Python中,我想當然地以爲:參數默認值在每次函數調用的時候都是一個全新的,或者說每次重入的時候都會重新初始化一遍。

而事實上,參數默認值在每次重入時都是同一個!

 

這在簡單一些的數據結構中問題/區別不大,例如數字等不可變類型:因爲它們每次賦值時都會修改引用爲一個新的,而不是修改目標數據的值。

然而,遇到複雜數據結構/對象的時候,區別就體現出來了。我碰到的就是以一個空列表(list)爲默認值時產生的奇妙現象:在函數中每次都要修改這個列表,而由於總是同一個對象,而不是每次從一個空白的新對象開始,於是進行索引、追加等等操作時候結果總是和預期的不同。

 

意識到這個問題之後開始排查問題所在,最終鎖定到參數默認值上。經過一段搜索,搜到了這裏。其中解釋道:參數默認值僅僅在def語句被執行時會被求值。並且,其中也給出了替代的解決方案,如:使用None作爲默認值,之後在函數體中進行判斷。

 

變量作用域

按照C++的習慣,每一個區塊中的變量在出了區塊之後就失效——其中用花括號({})來界定區塊。

故而,在python中我一直以爲每個縮進層級中所創建的變量在出了該層級之後就失效。

然而在教人(之前從沒學過編程)Python時,發現居然不是這樣!當時還鬧了個笑話……

 

所以看來Python中變量作用域是整個函數,而不僅僅是聲明/賦值的那個區塊。

 

import入口

寫的某個flask程序中由於需要在整個程序中共享一些變量/對象,所以在入口的最外區塊中直接進行賦值,然後在其他部分import之。

看起來一直運行正常,然而在假如migrate的時候出事了,數據庫ORM沒有出現。排查好久終於通過id()發現其他部分所用的變量和入口處的那個不同,而它們之間相同……

於是纔意識到,入口的那些代碼在調用的時候執行一次,在import時候又執行一次,而反復import的時候不會重複執行。

是了,以前只知道反復import不會重複執行,但是從來沒意識到入口處並不是import的……

 

 

(主作於2016.3.15。拖延症……)

不知疾與無疾

我們先來說說這麼兩種人:第一種人,他們不願意去醫院看病,因爲他們可能本來覺得自己身體還不錯,如果去醫院檢查出來有病會讓他們很不舒服;第二種人,他們感到不舒服時對去醫院檢查並不排斥,並且遵守醫囑,更是還有一部分會定期去醫院做體檢。

第一種人,他們在去醫院檢查之後如果發現沒有病,就會反過來埋怨叫他檢查的人,因爲他覺得耽誤自己時間和浪費錢了;如果檢查出來有病(但並非不可醫治),同樣會去怪罪叫他去檢查的人,因爲他覺得自己本來好好的,如果不去檢查就不會發現有問題;如果檢查出來的病不可醫治,那麼他一般會一蹶不振,並且(雖然不說)在內心中怪罪叫他檢查的人,因爲他覺得自己現在要注意這個注意那個的很討厭。

第二種人,他們在去醫院檢查之後如果發現沒有病,則會感覺更加舒適,且並不會對叫他檢查的人有什麼怨言;如果檢查出來有病(但並非不可醫治),那麼會感謝叫他檢查的人,因爲他知道雖然現在需要有一些限制,但這樣自己可以好得更快,最終是對自己有益的;如果檢查出來的病不可醫治,那麼他依然會積極面對,因爲儘早發現纔能更好地對待自己的身體,遵循建議的話或許可以獲得更長的生命以及平均來講更高的生命質量。

 

這麼兩種人,在生活中應該能找到相應例子,想來諸位應該感觸頗深。一般而言,如果一個人有正常的取向,那麼他會努力去當第二種人而不是第一種人。

然而在計算機領域,這種認知似乎是顛倒的:人們普遍認爲,閉源軟件更“安全”——只因爲它的漏洞相對而言更難以發現。

 

好了我們來看看這些事情:

1. “閉源軟件的漏洞相對而言更難以發現”這句話是正確且毫無疑問的。但“更難”究竟是難多少,卻是一個難以考量的問題。至少我們可以確認一點:閉源並不是不可能被發現漏洞,否則Windows、IE等的漏洞不會被發現那麼多。

2. 人們對軟件的認知不同,於是決定了當發現某軟件的一個漏洞以後不同人會有不同的反應。一部分人認爲,軟件和硬件類似,只要獲得(安裝)了就不再變了,於是在他們的概念中,軟件的漏洞被發現得越少越好,軟件升級也只是讓他們厭煩的事情;另一部分人認爲,軟件和知識類似,擁有(安裝)了以後如果發現有問題是可以改進(升級)的,於是在他們的觀念中,軟件的漏洞發現與否並不是特別重要(或者說他們知道軟件漏洞的發現是必然的),而發現了一個漏洞以後自己的是否能及時得到升級(修復漏洞)纔是最重要的。

3. 發現軟件漏洞的人/團體在發現漏洞之後的做法也不盡相同,大致也可分爲兩類。第一類發現之後會去報告,然後軟件的“生產”方“可能”會花一些時間去修正這個問題,再花一些時候之後將問題的補丁放出;第二類發現之後自己利用漏洞而不去報告,於是漏洞直到有第一類人報告纔有可能會得到修復。

 

由如上諸點,加上開源閉源本身的特性,我們可以得到下面的推論:

1. 一般而言閉源軟件比開源軟件的漏洞更難被發現。

2. 被發現漏洞後,開源軟件有更大的可能性會更快得到修復。原因有三:

1. 會爲閉源軟件找漏洞的一般有兩類人,分別是開發者僱用的人和想找漏洞的人——其中第一種會上報且有希望修復最終(希望)不會造成危害,第二種有一部分不會上報從而可能造成危害;而開源軟件也會有這兩種人——只不過一般而言第一種會少一些,而第二種好人會更多一些,其原因一是開源軟件可以享有下面一條的好處,二是開源軟件“製造”者大多不是公司(公司的本質是追逐利益)。

2. 有一點是開源軟件所有而閉源軟件沒有的:充沛的同儕審查。同儕這裏指任何有興趣的開發者——由於我們可以相信世界上好人多,開發者也是好人多,所以這一部分人會有較高機率會去上報。而且由於源代碼公開,他們很有希望可以直接提出解決方案,而不用等待原始開發者自己再去還原產生環境、查找、修復。在這種睽睽衆目之下,軟件漏洞難以遁形,於是我們可以假設有1個惡意的想找漏洞的人,而有9個善意的想找漏洞的人,有極大的概率使得9個人中有人找到漏洞且修復,而那1個還沒有找到。

3. 開源軟件開發一般都是逐步增長的,即所謂“集市”模式(顯然閉源軟件無法採取這種模式)。這樣,在一個軟件還沒有特別多用戶羣的時候,它的許多基礎問題已經被解決。而且在用戶羣逐步增長的過程中,其新版本加入的內容也在不斷地被驗證確認,本身引入問題的可能性就低;而即使引入問題,由於有許多其他人可以檢查,遇到的問題也會較快地被解決,不用等到像閉源軟件普遍的已經產生大量用戶羣以後再發現、解決。

3. 閉源會給軟件編寫者一種虛假的支配安全感:軟件有錯誤也無所謂,反正除了我們沒人知道。於是在這種心理下,開發者更容易寫出質量較差的代碼,其中產生問題的可能性也更高。反觀開源這邊,因爲一切都是公開進行的,所以開發者一般都會對自己代碼質量有較高要求(不論是出於面子還是什麼),而且即使出現了質量不大高的代碼,其他有空的人也可以對它進行改進,避免小問題最終釀成大禍。

4. 除了被“入侵”這點以外,安全還有兩個層面:

1. 保證用戶的數據安全。閉源軟件由除了其開發者以外沒人能接觸到源代碼,所以如果其中有哪一部分可能會工作不正常而導致數據損壞,開發者只有兩個途徑知道:一是自我審查或者測試的時候發現;二是事情出現以後有用戶報告。如果等到用戶報告,那麼就太晚了。而開源軟件由於代碼公開,所以在審查代碼(無論是自己還是任一一個人)時被發現的可能性要高很多,而且更由於可以有大量的人參與討論,這類問題的修復速度也會比閉源軟件高。

2. 保證用戶本身的安全,尤其是保護用戶隱私。在這一點上,閉源軟件絲毫沒有可信度——看不到源代碼,你說你沒做手腳誰信啊;而開源軟件由於源代碼公開,所以用戶可以放心使用。(嚴格說來,如果一個公司想要在軟件上做些什麼不可告人的事,即使將源代碼公開也可以耍些手段,例如寫得極其晦澀難懂。然而即使真的晦澀難懂也不怕,開源保證了總有人可以依照其原理寫出清晰易懂的,而且用戶們可以不怎麼費勁地切換到新的上面。)

 

這裏還有一些人會有迷思,會認爲如果一個軟件本身就和安全相關,那麼就不應該開源。爲什麼呢?他們的理由是:不公開的東西看起來似乎更不容易被攻破。然而這實際上是對安全的誤解以及對權力的服從而產生的結論。

首先我們必須明確一件事:無論一個系統(加密方法)是否公開,它的安全性是固定的。公開與否改變的是它的問題/漏洞被發現的概率,而不是漏洞是否存在——就類似上面關於去醫院檢查的例子,去檢查能改變的只是你是否知道自己有病,而不能改變你是否病。

然後一種加密技術在被大規模使用以前,是需要有一個檢驗階段的。如果在檢驗階段發現較大漏洞,那麼該技術是顯然不可採用的。如果公開,則全世界有興趣的人都可以對它進行檢驗——甚至是原理上的檢驗——如果存在問題則很快會被發現,可以免造成更嚴重的影響。而如果不公開,則只有開發者(或許還有其委託的少量幾個人)知道其原理,而其他人無法知道,從而在檢驗階段少了很多被尋找到漏洞的可能性。我們知道所有加密方式都有破解方案的——不然怎麼解密——只是被發現的難度不同而已。於是當一個有漏洞的加密方案被大規模應用(例如軍事),而後有人發現其有漏洞於是自己使用,這時候造成的危害實在是不堪設想。

口說無憑,不過現代密碼學就是我的憑證。現代密碼學的基礎原理決定了:其上的加密算公開並不會導致加密效果減弱,反而因爲有大量的同儕評審,不好的算法可以儘早被發現被廢棄。例如多數人都見過卻不一定知道是什麼的AES、RSA算法等就都是現代密碼學產物,而它們(還有相關的其他東西)在計算機世界尤其是網絡世界幾乎是作爲基礎存在的。

 

所以最後一個迷思也被攻破了,那麼作爲正常人作爲用戶,我們是不是應該很明確答案了?

閉源不會爲自己帶來任何好處,而開源至少可以保證個人隱私。所以,爲什麼不從內心中選擇開源?

 

附:

從心中選擇開源不是說要立即把所有的東西都換成類似的開源軟件——當然這樣做很好,但總會遇到各種各樣問題——而是要有意識地去考慮:“某個軟件有沒有相同質量的開源代替物?某個軟件有沒有可能開源,至少讓它開放API以讓人們可以開發開源客戶端?某個開源軟件的設計爲什麼和我用的相同功能的另一個軟件差別那麼大,排除習慣因素,究竟哪個設計更好?”

春節好?不,你叫錯了

(本文是個人對所瞭解到的一些事情所進行的總結,如有錯誤還望不吝指正。)

在當代人們的心中,中國傳統的新年叫做“春節”,而且似乎也沒什麼問題——過年時總是在春天前後,而且“寒假”是冬天到春天的過渡期,而寒假的具體時間總是和新年相關。
然而很不幸,大家都被誤導了。

本文大約結構:首先拆穿錯誤,其次說明錯誤肇始,最後給出正確。

(爲了跟大家解釋清楚本文主題,這裏不得不先捋一下曆法的問題。)
人們一般都知道這麼一個常識:中國傳統的新年是夏曆(文革後亦稱農曆)的正月初一(順便一提,生肖也是按夏曆正月初一——而不是公曆——變換的,今天CCTV-1晚間新聞幹得不錯),而夏曆和公曆並不一樣,甚至一年的長短都不同。然而由於某些原因,人們往往將夏曆錯誤地稱爲“陰曆”,而又將公曆稱爲“陽曆”,然後就理所當然地認爲既然一陰一陽肯定不同,而沒有去仔細思考。
事實上,夏曆並不是什麼陰曆。(不過公曆確實是陽曆沒錯。)
所謂“陰曆”、“陽曆”,分別是“太陰曆”、“太陽曆”的簡稱。“太陽”是什麼,大家都知道;而“太陰”這麼個說法可能有些陌生,不過一些人可能腦子轉得比較快,應該能想到就是月亮。搞清了太陰、太陽,也就好弄懂什麼是太陰曆、太陽曆了:太陰曆(lunar calendar)指以太陰(月)的運轉(週期)爲根據而制定的曆法,例如伊斯蘭曆;太陽曆(solar calendar)指以太陽(日)的運轉(週期)爲根據而制定的曆法,例如格里高利曆(當今公曆)。有些人看到這可能會在腹誹:夏曆的每個月就是根據太陰的運轉而制定的,你前邊卻說它不是太陰曆,騙誰呢?各位請稍安勿躁,這裏請出另一尊大神來解決大家的疑惑:陰陽合曆。所謂陰陽合曆(lunisolar calendar),就是指同時考慮太陽和太陰的運轉而制定的曆法。而我們的夏曆,就屬於陰陽合曆。(再舉個陰陽合曆的例子:猶太曆。)
又有人要腹誹了:你說它是陰陽合曆,你告訴我說它“陽”的部分在哪啊?好,來大家想一想小學時期是不是背過這麼一口訣:春雨驚春清穀天……沒錯,二十四節氣!是不是有人當年還奇怪過:明明節氣和公曆上的“月+日”有一定對應關係,卻說它是中國傳統的東西?事情的關鍵就在這:二十四節氣正是夏曆中陽的一部分,而每個月則是其中陰的一部分。如果有人仍不願相信,那麼再來考慮這麼一個問題:大家都知道華夏是農耕文明,而對農業來說顯然地日關係比地月關係更爲要緊,那麼這麼樣一個文明的曆法可能會不考慮太陽運轉(“科學”的說法是地球公轉)麼?可能嗎?
大家知道,地日週期是365日餘不足366日,而地月週期是29日餘不足30日,無論如何無法得到一個整數使得地月週期乘上它得到地日週期,即:若以月球公轉週期爲月份長度,無法直接滿足地球公轉週期。那麼以太陰運轉定月份長度的夏曆,是如何保證其陰陽合曆的本質呢?這回您猜對了:閏月。

好了,說清了夏曆的本質後,新年這個問題就好講了。既然夏曆中的一年和地球繞太陽公轉的一年長度並不相同,那麼很顯然,每年的正月初一時地球並不處於公轉中的同一位置。這也就是我們站在公曆的角度看,每年過年的時間都不同的原因。好我們翻翻公元2000年開始到今年(公元2016年)的日曆,傳統新年最早(最接近冬至)的是甲申新年(癸未大寒次日/2004年1月22日),最晚的是乙未新年(乙未雨水當日/2015年2月19日)。這兩個新年之間相差接近一月,跨了冬春兩季,如何當得起“春節”之稱?

當然了,我們無法否認現今階段華夏新年被稱爲“春節”。那麼我們就再來翻一翻歷史,看看華夏新年究竟是何時被稱爲“春節”的。如果這件事要我來做,那估計是要在我寫好一個趁手軟件之後再來的了。所幸已有前輩做過完善的整理,我們來看看前輩是如何說的:(節選自溪山琴況所作之文《正月飞雪庭燎光,元夕笙动春未央》)
“新年称为‘春节’的说法从何而来?说起来,这倒是一个不及百年、并不久远的故事。
……
1912年1月2日,孙中山发布《临时大总统改历改元通电》:‘中华民国改用阳历,以黄帝纪元四千六百九年十一月十三日,为中华民国元年元旦。经由各省代表团议决,由本总统颁行。订定于阳历正月十五日,补祝新年。请布告。孙文。’
……
风云突变,袁氏登上历史舞台。内务总长、登极大典筹备处长朱启钤于1914年1月21日提出《定四时节假呈》:‘拟请:定阴历元旦为春节,端午为夏节,中秋为秋节,冬至为冬节。凡我国民均得休息,在公人员亦准给假一日,本部为顺从民意起见,是否有当?理合呈请大总统鉴核施行。’袁世凯旋即批准。从此,夏历元旦被降格为一个季节性节日,‘春节’,而与中国文化毫无关系的西历岁首被称为‘元旦’和‘新年’,成为官方倡导的法定新年。
然而,民间信仰和习惯的力量是强大的。无论官方如何倡导新历新年,百姓并不买帐,民间仍然把夏历元旦当成最隆重盛大的新年来过。洋派的当权者终于按捺不住,一场‘废除春节’的闹剧在1930年上演。
1930年底,南京国民政府颁令‘废除春节’。
……
文化的传统再一次表现出强大的延续力量。虽然政客煞有介事地组织了各种‘国历新年’的活动,但官员多敷衍行事,民间也是消极抵制。相反,到了夏历新年时,民众仍然偷偷过年。几年后,‘国历新年’的活动逐渐销声匿迹,国人如常地过着除夕、元旦,‘废除春节’的闹剧无疾而终。一代代的政客已成尘土,但是‘春节’的概念却在不知不觉中在民众的心中植根,近百年来,几成新的‘传统’。回味略显苦涩,我们至今守着的,竟是袁世凯造出的概念,他留给国人几乎唯一的‘遗产’。”
而“春節”這麼一個似乎頗爲順口的稱呼,本來是在指代什麼呢?繼續援引溪山琴況文:“中国是一个岁时节日丰富的国度,也许是因为四季的节日太多了的缘故,华夏文化中,并不喜欢以某个特定的节日作为一个季节节日的代表,‘春节’、‘夏节’、‘秋节’、‘冬节’的说法在漫长的历史中稀疏少见,夏历的岁首……称为新年。古人偶用‘春节’时,所指为节气之首的立春。”

那麼傳統新年究竟應該叫什麼呢?如果各位讀上面那段文字時有過留心,便會發現其中有兩句甚是耐人尋味:“……定阴历元旦为……”;“……国人如常地过着除夕、元旦……”。按照通行的觀點,“元旦”乃是公曆一月一日,爲何這裏明明在說傳統節日,卻在用“元旦”的稱呼?聰明之人應當已經想到:“元旦”本就是對該日子的稱呼。
對於“元旦”這麼兩個字,《說文解字》中是這麼解釋的:“元,始也”;“旦,明也”。“元”的意義很明瞭,就是“開始”、“初始”;而“旦”則要稍稍考究一下字源了。仍然是《說文解字》中“旦”之一字:“從日見一上。”什麼意思呢?就是說“旦”這個字所表達的是:太陽(日)已從地平線(一)上升起可被人看到。我們用一個白話詞語來表達:初生(當然未必是“初”,也可能是“復”)。兩個字弄明白了,由它們構成的詞(字組)意義也就明瞭了:歲首(初始日)出現(初生)之時,也就是指每年的第一天(或按夏曆的說法叫“正月初一”)。
我知道:所有人看到這裏,都已看懂“元旦”便是指曆法中第一天,而且在中國的語境下特指夏曆正月初一;但是並非所有人都願意去修正自己的說法,因爲自己已經“習慣”了叫公曆一月一號爲“元旦”而叫夏曆正月初一爲“春節”。無外乎溪山琴況前輩在文中嘆息道:“‘春天的节日’成了安置华夏新年的单薄的躯壳,名已不正,言已不顺,多少年了,中国在漫天飞雪中过着‘春天的节日’,而别人的新年,已经被叫做代表岁时之首、新年起点的‘元旦’。”

行文至此,若是英語文章,則有可能會用一句“last but not least”來收尾例舉;而我想說的,卻或許可表達爲“last but at least”——至少最後請聽我一言:不求諸位將夏曆正月初一叫做“元旦”,因爲畢竟還有個公曆一月一日要被稱呼;只求諸位將夏曆正月初一叫做“新年”而不要叫做“春節”——至少叫它“新年”並沒有什麼障礙,而且它真的不是“春天的節日”。

請和我說“新年快樂”,而不要說“新春快樂”。

孤華
乙未臘月廿八

本文遵循CC-BY-SA協議(https://creativecommons.org/licenses/by-sa/3.0/cn/deed.zh)傳播(中文可另考http://creativecommons.net.cn/licenses/meet-the-licenses/),轉載請註明作者、出處(http://renyuneyun.is-programmer.com/2016/2/7/chinese_new_year.194929.html)及是否有修改。

Linux下的聲音質量

這主要是一篇翻譯,原帖在 https://www.linuxquestions.org/questions/linux-newbie-8/sound-quality-in-linux-610168/

該帖子比較老(2010年),其中所說的有些狀況現在已有了改變——當然是朝好的方面改變——但道理無誤。


發帖者說他對其朋友的一段話比較疑惑,所以發這麼一個帖子問問大家的意見。朋友的話是這麼回事:

he is not satisfied with the quality of sound in Linux(fedora7).

他對Linux (fedora 7)下的聲音質量不滿意。

All of u try this : play the same song simultaneously on a linux &
windows machine, u will notice difference in sound quality.

你們可以這樣試一下:同時在一臺Linux和一臺Windows機器上放同一首歌,(這樣)你們會注意到音質的不同。


While looking at the sound settings, he found that Fedora uses generic
ALSA sound drivers. He think that the quality is not good because the
drivers are generic, they are not specific.

當查看聲音設置時,他發現fedora使用通用的ALSA音頻驅動。他認爲這樣的質量不夠好,因爲這是通用驅動而非專用驅動。

下面數個樓層(1#到15#)主要話題是這麼幾個:“根據我的經驗來說並沒有什麼不同”;“在兩臺不一樣的機子上比較的結論並沒有什麼意義”;“認爲不同的請去做無偏見測試(blind test)然後再來說”;“‘聲音質量’是個很模糊的術語,請詳細描述”。

其中技術性較強的是:“ALSA上沒有什麼‘通用’(generic)驅動”;“有可能是設置的問題,你可以如何如何做一下試試”。

10-12#是兩個人在爭,其中10#的內容我沒看懂,期望哪位(如果有)幫忙解釋一下他在說什麼。

重頭戲在於14#及其在16#、18#回覆的內容:其中16#給出了這個問題最直白的答案,14#和18#也都很有意義。

16#是對15#的回覆;15#是對14#的回覆;18#是對17#的回覆。

這裏先翻譯一下16#以饗衆人,14#、15#、18#的翻譯隨後附上:

I totally agree with you on what you've said. There is no difference.

我完全同意你說的。它們之間沒有區別。

To make clear once and for all, people should keep in mind we're talking about **digital signals** here, processed in a lossless (PCM) manner. If there are no resamplings or any other effects applied to the PCM stream, any OS is pretty much the same!

爲了一勞永逸地說清楚這個問題,人們需要在腦中時刻牢記我們在討論數字信號——已處理成無損的(PCM)形式。如果沒有重採樣(resampling)或任何其他附加在PCM流中的特效的話,任何操作系統都是一樣好的!

It works just like this:

這個過程大概是這麼回事:

*You open the application that will play your songs.

你打開一個要播放你歌曲的程序。

*The application uses the appropriate demuxer (to deal with .mp3, .wma, .ogg, .m4a... extensions) to get the encoded stream (wma, mp3, aac, flac, ogg...).

這個程序使用合適的分離器(demuxer)(爲了處理.mp3、.wma、.ogg、.m4a等擴展)以得到編碼後的音頻流(wma、mp3、aac、flac、ogg等)。

*Then there is a decoder that will convert back the encoded stream into a PCM stream [the application could, then, make use of some DSPs to resample or up / downmix by itself].

然後這裏有個解碼器,它會將編碼好的流轉換回PCM流[應用程序可以——在此之後——使用一些數字信號處理技術(DSP)來自己進行重採樣或是up / downmix]。

*The PCM stream, most likely to be untouched by the application, is sent to your sound system.

該PCM流——一般情況下未被應用程序碰觸——被送到你的聲音系統。

Now, when it comes to the PCM stream and the sound system, things are just like this:

現在,輪到PCM流和聲音系統時,事情是這麼回事:

*If you have a sound server, like Pulse Audio, the PCM stream is sent to the Pulse server. Pulse up / downsamples the PCM stream if it is different of its own settings (you can change Pulse default sampling rate by editing the "/etc/pulse/daemon.conf" file, it also up / downmixes the PCM file if its told to,

如果你有一個音頻服務器(sound server)——如Pulse Audio——該PCM流會被送到Pulse服務器。Pulse會對該PCM流進行向上/向下採樣(up  /downsample)——如果它和Pulse自己的設置不同的話(你可以通過編輯/etc/pulse/daemon.conf文件來修改Pulse的默認採樣率,它也可以在被告知如此做時up / downmix該PCM文件)。

*and, at last, the processed (or maybe untouched) PCM stream is sent to ALSA system.

以及,最後一步,被處理過的(也可能是沒被碰觸的)PCM流被送到ALSA系統。

I'm not going to get into deeper details on how things work under Windows or OS X, for example, because things are almost the same with all of them. The point is: the **true** maximum audio quality is achieved but getting the PCM stream untouched to the sound card. That ANY operating system can do, including Linux.

我不打算深入如Windows或OS X中事情如何工作的細節,因爲事情在它們中幾乎是一樣的。重點在於:真正的最大聲音質量由(原文中是but,疑似by之訛誤)傳輸未碰觸的PCM流至聲卡中來達成。這是任何操作系統都可以做到的,包括Linux。

ALSA is able to do the resampling stuff on its own, but it's not as configurable as Pulse Audio. I myself like to set Pulse to 44,1 KHz sampling and S32_LE resolution all the time, except when I have to deal with 48 KHz audio samplings. I know for sure my sound card works only at 48, 96 or 192 KHz on Linux, but its audio processor (X-Fi) has an excellent resampler using advanced techniques. So, I prefer to always let the sound card to the processing.

ALSA可以自己進行重採樣工作,但沒有Pulse Audio那麼好的可配置性。我個人喜歡始終設置Pulse爲44.1KHz採樣率以及S32_LE分辨率(resolution)——除非當我需要處理48KHz音頻採樣時。我很確定我的聲卡在Linux下僅可以工作於48、96或192KHz,但它的音頻處理器(X-Fi)有極好的使用高級技術的重採樣器。所以,我傾向於始終讓聲卡自己來處理。

If you don't have such hardware capabilities, I guess you'd really want to consider taking a look at this website.

如果你沒有這樣的硬件條件,我猜你會想要看一下這個站點

Up and downmixing on Linux, anyway, is flat and 2 dimensional as I've said. I've already tried ALSA "vdownmix" plugin, it works but it's not yet as well implemented as Creative's own HRTF technology.

在Linux中,Up 及 downmixing始終是平(flat)的以及2維的——就像我說過的那樣{參見14#}。我已經試過ALSA “vdownmix”插件——它可以工作,但是尚未有創新自己的HRTF技術那樣實現完備。

Amarok has a built in equalizer that does its job, specially when set to "Rock" if I'm not wrong. aTunes also has its own equalizer but it sounds horrible and is not worth a try.

Amarok有它自己的均衡器來做這件事,尤其是當設置成“搖滾(Rock)”時——如果我沒記錯。aTunes也有它自己的均衡器,但聽起來極其可怕並且不值得一試。

So, quality is the same on every OS if you know how to set them up. Here I've left the tips of mine to help anyone who would occasionally be interested.

所以,在任何操作系統中,只要你知道如何設置,聲音質量都是一樣的。這裏我留下一些我自己的建議,以幫助任何可能有興趣的人。

> Preferably, don't do any resamplings.

> 最好不要做任何重採樣。
> Tell Pulse and / or ALSA to always use the highest definition for your sound card (mine is 24 bit, so I use the S32_LE instruction both under Pulse and ALSA).

> 告訴Pulse和/或ALSA總是使用你聲卡的最高精確度(我的是24位,所以我在Pulse和ALSA下均使用S32_LE指令)。
> Avoid multichannel if all you have is a pair of speakers or headphones, or try the not so well implemented "vdownmix" plugin for ALSA.

> 如果你僅有一對揚聲器(speaker)或者耳機(headphone),避免多聲道,或者使用ALSA中尚未完善的vdownmix插件。
> Try Amarok equalizer (probabily set to "Rock") to help improve a bit the perceived sound quality.

> 嘗試Amarok均衡器(很可能是設置爲“搖滾(Rock)”)以幫助增強一點感知到的聲音質量。

Best wishes to everyone here and to Linux in the hope that it continues to improve and to be a more and more appealing alternative to MS Windows or Apple OS X.

致祝願於這裏所有人,以及給Linux——期望它可以繼續改進並且成爲一個愈來愈吸引人的MS Windows或Apple OS X替代選擇。

14#:

I don't know precisely what problem you guys are talking about, anyway, I want to leave here the comment of mine on this subject.

我並不確切你們在討論什麼問題,不過不管怎麼說,我想在這留下我對這個主題的看法。

I own a Creative SoundBlaster X-Fi XtremeMusic. On Windows, Creative's drivers offer you technologies fully implemented in hardware like Crystalizer and CMSS-3D.

我有一個創新的聲霸卡X-Fi XtremeMusic。在Windows上,創新的驅動提供了全部由硬件完成的技術,如Crystalizer和CMSS-3D。


Crystalizer stands for a really dynamic equalizer which adjusts itself according to the quality of the sound the card is fed with. For example: if I'm playing a 96kbps MP3 file, with considerable loss of high frequencies, the card is able to play with its own equalizer, the one specifically called Crystalizer, so you can kind of restore the lost frequencies (that's the illusion you have).

Crystalizer代表一個真正動態的均衡器的,它可以根據卡片收到的音頻的質量進行自我調整。舉例子:如果我在播放一個96kbps的MP3文件——其中顯然會有高頻中的大量丟失——這個卡片可以用它自己的均衡器——那個叫Crystalizer的東西——來播放,所以可以在某種程度上恢復那些丟失的頻率(這是你會感受到的幻覺)。

CMSS-3D stands for a multi purpose surround sound mixer. For example: if you have a 5.1 home theater speakers setup and want to play a stereo sound, the CMSS-3D technology is able to identify instruments on the sound the card is fed with and dynamically distribute it through all the available speakers. It's a totally active design, that's why I say "dynamically". If on the other hand, all you have is a pair of speakers or headphones, the card is able to mix into stereo channels up to 8 surround sound channels with Creative's proprietary HRTF technology. It immerses you into your DVD / BD movies or 3D games.

CMSS-3D代表一個多用途的環繞聲混音器。舉個例子:如果你有一個5.1聲道的家庭劇場設備,並且你想放一個立體聲音頻,CMSS-3D技術可以分辨出卡片收到的音頻中的樂器並且(然後)由所有可用的音箱中動態地分發它。這是一個完全主動的設計——這就是我爲什麼說”動態“。如果說是另一種情況——你只有一對音箱或者耳機(headphone)——該卡可以利用創新的專有HRTF技術在立體聲的聲道中插入最多8個環繞聲聲道。它可以讓你沉浸入你的DVD/BD影片或者3D遊戲中。

That could all be implemented on Linux for sure IF there was any sort of interest from Creative's Linux driver people. Anyone knows for sure it'll never happen anymore, thus, we're left with a complete 2D and raw sound experience with Linux or any other OS except Windows with Creative's sound cards.

這些當然可以在Linux上實現——只要創新那寫Linux驅動的人有那麼幾分興趣。(然而)任何人都很確定這並不會發生,因此我們在Linux或任何其他非Windows的系統上使用創新的聲卡時,均被離棄在一個純2D和裸的聲音體驗中。

I often test new Linux distributions but can never stay with anyone of them because of the lack of such important technologies. I have 3 headsets, high fidelity ones (12 to 28 KHz frequency range and near 20 bit sound quality), and I very frequently watch 5.1 CH videos and play 5.1 CH games. I just couldn't live without CMSS-3D. Besides that, X-Fi Crystalizer is just so amazing I have no pleasure on listening to anything without it.

我經常測試新的Linux發行版,然而無法在其中任一上停留——因爲缺乏如此重要的技術。我有3個耳機(headset)——高保真的(12到28KHz的頻域以及接近20位的聲音質量)——並且我時常看5.1聲道影片和玩5.1聲道遊戲。我簡直無法離開CMSS-3D。另外,X-Fi Crystalizer也是那麼的令人驚奇以至於我在離開它聽任何東西時都覺得索然無味。

Linux, OS X and Windows do have almost no difference in sound quality. Up to XP, with such a good card as the X-Fi, Windows was the best out of the three. Having them all properly set up not to make any sort of resamplings, they're all the same. Each, of course, deal with latency a different way. I'm not quite familiar with other OS'es but at least Windows has WASAPI and works admirably with ASIO 2.0 and OpenAL (hardware accelerated, opposed to software rendered on Linux and OS X). These APIs are quite good on latency, specially ASIO. Anyway, without resampling and not taking into consideration latency, any OS should be the same.

Linux、OS X和Windows在聲音質量上真的幾乎沒有什麼區別。直到XP,在使用如此好的X-Fi卡片時,Windows是它們三個中表現最好的。把它們都設置好且不使用任何重採樣(resampling)之後,它們(的表現)都是完全一樣的。當然了,它們使用不同的方法對待延遲(latency)。我並不特別熟悉其他的操作系統,但是至少Windows有WASAPI並且在使用ASIO 2.0和OpenAL(硬件加速,和Linux及OS X上的軟件渲染相反)時表現極好。這些API在延遲上表現良好,尤其是ASIO。(當然)無論怎麼說,在不使用重採樣並且不考慮延遲時,任何操作系統的表現都應當是一樣的。

Now, when it comes to improvements implemented in hardware / driver, no doubt Windows wins (on Creative's side, specifically).

現在,當考慮到硬件或是驅動上實現的增強時,Windows贏得毫無疑問(僅限創新)。

I'll just keep using Linux once in a while with its 100% software rendered, mixed, resampled audio, quite flat and 2 dimensional.

我仍舊會時不時地使用Linux——100%軟件渲染、混音、重採樣音頻,特別平(flat)的以及2維的(聲音)。

For the best quality and user experience and full use of my hardware capabilities, I'll unfortunately have to stay with Windows.

爲了追求最好的質量以及用戶體驗,並且完全使用我的硬件規格,我很不幸地不得不留在Windows上。

By the way, have any of you ever realized that Linux just doesn't grow on the "hardware accelerated" industry? The most it gets is OpenGL. There are no solutions to fully decode in hardware video streams, like MPEG2 or H.264, or to mix audio streams from different sources, or to process MIDI, or EAX effects, or audio resempling, downmixing, or TCP offload, or whatever. Everything, except OpenGL is software implemented. I shame indeed!

順便說一下,你們是否意識到Linux並不長在”硬件加速“的產業上?它得到得最多是OpenGL。沒有任何的硬件解碼視頻流——例如MPEG2或者H.264——,或者合併不同源頭的音頻流,或者處理MIDI,或者EAX效果,或者音頻重採樣、downmixing,或者TCP offload,或者其他東西的方案。任何東西——除了OpenGL——都是軟件實現的。我實在感到恥辱。

15#:

Well, that is of course the whole issue. Most hardware manufacturers put all their efforts into developing drivers for Windows. Linux, if it is even considered at all, is an afterthought at best. The companies that fully support linux and open source their drivers (for example Ralink wireless cards) have hardware that works just as well in linux as it does in Windows.

說起來,這當然就是所有問題所在。大多數硬件製造商將它們的精力全都放在開發Windows驅動上。至於Linux——如果它被考慮了的話——最好的情況也是一個靠後之事。那些有完善Linux支持並且願意公開驅動源代碼的廠商(例如Ralink無線網卡)所產硬件在Linux和Windows上的表現一樣好。

For those who swear that sound is "better" in Windows, perhaps try a blind comparison. Install Windows and linux on the same computer. Have a friend boot either Windows or linux randomly and play some music. See if you can consistently tell whether Windows or linux is playing the music. You may be surprised at what you find. Even the (supposedly golden eared) high end audio reviewers at Stereophile magazine dare not do blind comparisons of audio hardware.

對於那些信誓旦旦說在Windows中聲音“更好”的人,你們應當嘗試一下無偏見比較(blind comparison)。在同一臺電腦上安裝Windows和Linux。讓一個朋友隨意啓動Windows或Linux並且播放同一首音樂。看看你能否始終如一地分辨出播放音樂的到底是Windows還是Linux。你或許會對你自己的發現感到驚訝。即使是那些Stereophile雜誌中(號稱金耳的)高端音頻評測者也不敢對音頻硬件做無偏見比較。

17#提出了這麼一個問題:“在播放音樂文件時候Windows上和Linux上效果一樣,但是在放DVD影片時候Windows中音量比Linux下大,不知道爲什麼。”

18#:

The "problem" you talk about exists on Windows too. We're actually talking about a Dolby Digital issue. It's not exactly a problem though, nothing that has got to be fixed. Dolby Digital has a lower audio range, output, volume, whatever they call it, meaning it sounds lower than other formats, like DTS (which happens to be better concerning audio quality).

你所說的這個“問題”在Windows上其實也有。我們在討論的其實是Dolby Digital的事情。它其實並不是個問題,所以也沒什麼可修復的。Dolby Digital有一個更小的聲音範圍/輸出/音量——不管怎麼叫它吧——,意味着在和其他格式——例如DTS(考慮到聲音品質時它恰好更好)——比較時它聽起來聲音更低。

Windows 7, for example, has a built-in Dolby Digital decoder. If you right-click the video screen (on Media Player) and go to "Enhancements" (I'm not sure that's what it's like on the English version of the software since I use the Br-Portuguese version) you can click "Dolby Digital settings" and it will give you three options for you to choose: "Normal", "Night" and "Cinema". If you choose "Normal" you're going to have a boost on low volumes and a decrease on the excessively high ones. If you choose "Night", you'll have the same softened output but a slight increase on the dialogs (I guess this one sounds better for onboard sound solutions). Now, if you choose "Cinema" mode, then you'll have the same exact output that the DVD was intended to have, called full dynamic. At times the sound will be low, and at times high, it'll vary dynamically. Most people won't like it if they don't have a good sound card, capable of high dynamics in audio, and a good speaker system or headphones too.

Windows 7——例子而已——有一個內建的Dolby Digital解碼器。如果你在視頻界面上右鍵(在Media Player中{即Windows Media Player,Windows自帶的播放器})並且轉到“增強(Enhancements)”(我不確定在英文版中它到底叫什麼,因爲我用的是巴西葡萄牙文(Br-Portuguese)版),這樣你可以點擊“Dolby Digital設置(Dolby Digital settings)”,然後它會給你三個可選項:“正常(Normal)”、“夜間(Night)”、“影院(Cinema)”。如果你選擇“正常”,你會在低音量時得到增強且在高音量時減弱;如果你選擇“夜間”,你會得到相同的柔化了的(softened)輸出但在對話中得到輕微增強(我猜這會在板載(onboard)聲音解決方案{集成聲卡?}中聽起來更好一些);現在,如果你選擇“影院”模式,你會得到同該DVD被預期得到的效果完全一樣的輸出——這被稱爲全動態(full dynamics)。有時聲音會低,有時會高——它會動態變化。多數人並不喜歡它,因爲(if)他們沒有一塊好聲卡——適用於音頻中的高動態——以及好的揚聲器(speaker)系統或耳機(headphone)。

I don't know which Dolby Digital decoder you've chosen under Windows XP, since it doesn't have a built-in one, I'd recommend, by the way, AC3Filter, it's one of the bests out there. Anyway, it seems your decoder under Windows is set to something like the "Night" mode, giving you pretty much the same (high enough) volume experience throughout the whole video.

我不知道你在Windows XP中選的是哪個Dolby Digital解碼器,因爲它沒有內建的——順便一提,我建議AC3Filter,它是上佳之選中的一個。不管怎麼說吧,看起來你在Windows所用的解碼器被設置爲類似於“夜間”模式——給你在看整個視頻時以還原很好(pretty much the same)(足夠高)的聲音體驗。

Linux, on the other hand, doesn't have the same configurability of Windows 7 and other decoders like AC3Filter, and instead of choosing the "Night" mode equivalent as does your Windows XP decoder, it chooses the "Cinema" mode for quality purposes. As I've said, preferably, the encoded, compressed sound should be decoded and sent to your audio system **untouched**. If you have your system sound output set to stereo there is surely some processing done with the decoded DVD audio in order to fit it to 2CH outputs. Anyway, the Linux decoder tries to convert the compressed audio stream to PCM **as it is**, with the same output volume as is in the DVD. As said, too, Dolby Digital has lower volume if compared to other compression formats, like DTS, MP3, etc.. Thus, you have the impression that Linux sounds worse, which isn't true. Actually, it sounds better since it doesn't play with audio volume.

然而另一方面,Linux沒有如同Windows 7或者其他解碼器如AC3Filter之列的配置能力,並且它沒有像你的Windows XP解碼器那樣選擇“夜間”模式的等價物,而是出於質量考慮選擇“影院”模式。像我說過的那樣,較好情況下,該編碼、壓縮了的聲音應當被解碼並且原封不動地送往聲音系統。如果你將你系統的聲音輸出設置爲立體聲,其中顯然會有一些處理過程施加在解碼後的DVD音頻上——爲了使其適用於雙聲道(2CH)輸出。不管怎麼說吧,Linux解碼器會試着將壓縮過的聲音無差別地(as it is)轉換到PCM——同DVD中一模一樣的輸出音量。依然如前所述,Dolby Digital和其他格式——如DTS、MP3等——比起來音量更低。因此,你產生Linux聲音更差的感覺——其實並不正確。實際上,它聽起來更好,因爲它沒有調戲(play with)音量。

I don't know any solution to this but trying to increase both the PCM and Master volumes under ALSA Mixer (type on terminal "alsamix").

我並不知道該事情的解決方案——除了在ALSA Mixer(在終端中輸入“alsamix”{至少現在arch上應當爲alsamixer})中嘗試調高PCM和Master的音量。

I myself can't stand watching DVD's or any multichannel audio under Linux. Firstly because it has no advanced audio downmixing with well implemented HRTF techniques, as Creative's CMSS-3D. Secondly, it has no hardware accelerated MPEG-2 decoding. There are good [paid] choices for Windows out there, but for Linux the best you're gonna have is VLC which has plenty of choices for deinterlacing. Anyway, none of them have come even near to the quality of my hardware dedicated decoding under Windows. My ATI Radeon HD 3850 deinterlaces using vector adaptive algorithm with "pulldown" detection, that makes my DVD's look gorgeous! Let alone if I had a better card, like the 4000 series, with upscaling techniques!!! I like most Linux Mint and Ubuntu. I have made extensive tests with Mint 10 RC and Ubuntu 10.10. I can say that Totem DVD player, or Gnome Mplayer look just like Apple's DVD player on Mac OS X. Sound for me is not an issue on DVD's because of my better sound card.

我自己無法忍受在Linux下播放任何DVD或是多聲道音頻。首先,因爲它沒有任何使用實現良好的HRTF技術——例如創新的CMSS-3D——的高級音頻downmixing。其次,它沒有硬件加速的MPEG-2解碼。Windows上有許多良好的[付費]選擇,但是在Linux上你能得到的最好一種應當是VLC——它擁有大量的deinterlacing選擇。不管怎麼說,它們中沒有任何一個表現得哪怕是接近我在Windows下的硬件專用解碼。我的ATI Radeon HD 3850 deinterlaces使用帶有“pulldown”檢測的vector adaptive算法,它能讓我的DVD看起來絢爛奪目!更不用說假如我有一個更好的卡片——例如4000系列——擁有upscaling技術會如何了!我最喜歡Linux Mint和Ubuntu。我對Mint 10 RC和Ubuntu 10.10進行了多方面的測試。我可以說Totem DVD播放器或者Gnome Mplayer看起來就像Mac OS X上蘋果的DVD播放器一樣。歸功於我良好的聲卡,DVD的聲音對我來說並不是個問題。