星期三, 6月 08, 2011

核能發電,該還是不該?

今天看到的新聞:

小英:再執政 十三年後終止核能發電

中國時報【朱真楷/台北報導】

提出「二○二五非核家園計畫」的民進黨主席蔡英文,昨日上午抵達德國考察綠能產業。她表示,德國政府已宣布二○二二年前關閉所有核電廠的政策,證明要達成非核目標的關鍵,在於決策者的決心,所以只要民進黨取得政權,就有信心用十三年的時間終止核能發電。

蔡英文在柏林時間六日上午抵達德國後,在執政黨基民黨國會議員費雪陪同下參訪柏林車站等相關綠能建設。

不要核能發電可以,可是要有替代的發電方案。

我國(中華民國)電能來源中,核能佔了 19.3% 左右(資料來源:台灣電力公司 - 年產銷快訊)。所以說,如果沒有核能發電,這些電勢必要以其他方式來產生。

如果平攤到其他種種發電方法中,意味火力發電(國營 53.4% + 民營 18.7% = 72%)必須增加 19.3% * 72% = 13.9%。

再看到總用電量 1933.1 億度,也就是說火力發電必須增加 1933.1 * 13.9% = 268.7 億度。

如果這些發電改用:

  • 燃煤:產生 268.7 億 kw/h * 1.020 kg/(kw/h) = 274.074 億 kg 的二氧化碳
  • 燃油:產生 268.7 億 kw/h * 0.758 kg/(kw/h) = 203.675 億 kg 的二氧化碳
  • 天然氣:產生 268.7 億 kw/h * 0.515 kg/(kw/h) = 138.38 億 kg 的二氧化碳
  • 核能(原本):產生 268.7 億 kw/h * 0.0661 kg/(kw/h) = 17.761 億 kg 的二氧化碳
p.s. 我忘記在哪裡看到這些數據,請知道的人幫我補... >_<

然後又會跑到令一個惡性循環:二氧化碳升高 = 溫度升高、溫度升高 = 冷氣用量增加、冷氣用量增加 = 用電量增加、用電量增加 = 發電量增加、發電量增加 = 二氧化碳升高...

====== 分隔線 === 分隔線 === 分隔線 ======

話又說回來,如果那些反核的從電廠關掉開始就完全不要用電(除了搬去山裡與世隔絕以外,還有別的辦法嗎?),那就關吧!

星期一, 5月 30, 2011

小叮噹風扇 vs. 數位電視訊號

記者知識不足,才會把這件事當成很嚴重的事情:http://tw.news.yahoo.com/article/url/d/a/110529/8/2se1p.html。懂原理的就會知道,這只是沒什麼大不了的數位信號干擾。

台灣使用的數位電視訊號是 1080p/1080i 的 DVB-T,DVB-T 會將數位訊號用 OFDM(正交分頻多工)打散分佈至 4kHz 或 1kHz 的訊號中。

也就是說,當你有個外部頻率為 4k 或 1k 的因數的訊源時(例如 2Hz、4Hz、5Hz、8Hz、10Hz、20Hz、25Hz、40Hz、50Hz、100Hz、125Hz、200Hz、250Hz、500Hz、800Hz、1000Hz、2000Hz、4000Hz...),就有可能會干擾到數位電視訊號。而超商的小叮噹風扇很有可能剛好就是這個轉速(例如剛好是 1000rpm),所以會產生這些頻率的雜訊干擾數位電視訊號。

而影像資料壓縮通常是以 Block 為單位,所以他解壓縮的時候會有某些 block 解壓失敗,導致下一個 block 被提前或延後。反應到影像上就是部份畫面看起來像在左右抖動。

而吹風機為了吹出足夠大的風量,轉速通常都很高,可以到 10000 ~ 20000 rpm,不容易干擾 1kHz 或 4kHz 的數位訊號。如果你拿轉速相當於前述 Hz 的風扇靠近數位電視訊號接收器,應該也會出現類似的干擾。

星期日, 3月 27, 2011

給一個日期,怎樣知道那天星期幾?

嗯... 這真是個神奇的函式 XD~

int dayofweek(int y, int m, int d)  /* 0 = Sunday */
{
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  y -= m < 3;
  return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

-- by Tomohiko Sakamoto.

星期五, 3月 25, 2011

Firefox 4.0 初步使用心得

做了一些 benchmark。我的機器:

  • Intel Core-i7 720QM:performance cpufreq governor
  • Transcend JM1333KSN-4G x 2:在測試時還剩下約 1GB 空間(扣掉 Buffer 則剩 3.5GB)
  • Linux 2.6.38:有開 per-session auto-group(CONFIG_SCHED_AUTOGROUP=y)

參賽的瀏覽器有:

  • Chromium 11.0.696.16:
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.16 Safari/534.24
  • Firefox 4.0:
    Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20110323 Firefox/4.0
  • Opera 11.10 beta:
    Opera/9.80 (X11; Linux x86_64; U; zh-tw) Presto/2.8.119 Version/11.10

測試 0:

  • Acid3
    • Chromium:100/100
    • Firefox:97/100
    • Opera:100/100
  • 冷啟動速度:
    • Chromium:4.16s(8.33 次)
    • Firefox:1.5s(3 次)
    • Opera:5.16s(10.33 次)

冷啟動速度是執行「sync ; echo 3 > /proc/sys/vm/drop_caches」以後啟動瀏覽器到視窗出現,游標閃爍的次數(每次 0.5s)。測了三次,精度不是很準確... 看看就好!

測試 1 - CPU 0%(幾乎沒有其他負載):

測試 2 - CPU 100%(make kernel, -j16):

其中「大頁面測試」一項,是先重整三次(確認檔案讀進了 filesystem buffer),然後再重整三次的成績平均。Chromium 快的很神奇 @@

為什麼會有在 CPU 100% 下的測試呢?因為我使用 Gentoo Linux,常常會編譯東西。可是在編譯的同時,也會一邊上網、看信... 等等。所以在 CPU 負載高的情況下使用瀏覽器是很常有的事情。

跑 Sunspider 的時候,Chromium 會更新每個跑完的測試結果,可是 Firefox 完全不會顯示東西(這算是偷吃步嗎?),Opera 會顯示,但是中間的藍色方框內會閃爍。

對我來說,瀏覽器的速度(網頁顯示速度、分頁切換速度、UI 反應速度)很重要。我無法忍受切換分頁或點個書籤要等一兩秒才看得到東西... 所以「使用心得」主要是速度測試。


附錄 - 大頁面測試使用的網頁:

<html>
  <head>
    <title>A very big page!</title>
    <script language="javascript">
      var startTime = new Date();

      function showElapsedTime() {
        var endTime = new Date();
        var elapsedTime = Number(endTime - startTime);

        document.getElementById("results").innerHTML =
          "took " + Number(elapsedTime / 1000) + " sec";
      }
    </script>
  </head>
  <body onload="showElapsedTime();">
    <p id="results">calculating...</p>
    <p>這裡是很長很長的段落</p>
    <p>重複 n 次</p>
    <p>導致這個檔案長大到 10MB...</p>
  </body>
</html>

星期三, 3月 23, 2011

C/C++: i = i++ + ++i;

這樣的一段 code,結果應該是什麼呢?

答案是「不一定」!

在 C/C++ 之中,operator + 並不是 sequence point。例如,運算式「f() + g()」之中,是 f() 先執行還是 g() 先執行,順序是不一定的(跟編譯器實做有關)。所以「i++ + ++i」之中,有可能 i++ 先作,亦有可能 ++i 先作。

並且,如「i=i++;」這樣的式子之中,i 被指派兩次。「i=」的指派動作可能發生在「i++」的指派動作之前、之後、或之間。

所以,為了節省 debug 耗用的腦細胞,任何程式設計師都不應該寫出這樣的程式碼。

====== 囧rz [分隔線] 囧rz ======

額外一提,「std::cout << f() << g();」這樣的程式碼之中,f() 與 g() 的執行順序也是不一定的。這是由於 C++ 的 operator overload 視為 function call。而 C++ 的 member function 實際上會被轉換成多傳入一個 this 引數的 global function。

例如(以下程式並非合法的 C++ code,只是為了解釋程式的行為):

std::cout << f() << g(); // 1
可能被轉成
std::cout.operator << (f()).operator << (g()); // 2
再被轉成
std::ostream::operator << (std::ostream::operator<< (std::cout, f()), g()); // 3

在上述 3 之中,是「std::ostream::operator<< (std::cout, f())」先執行還是「g()」先執行,順序也是不一定的。

所以,若 f() 與 g() 裡面都有輸出,則有可能先看到 g() 的輸出才看到 f() 的輸出,或是剛好相反。例如:

// 可能性 1:
tmp1 = f(); // 列印 f() 裡面的輸出
std::cout << tmp1; // 列印 f() 的結果
tmp2 = g(); // 列印 g() 裡面的輸出
std::cout << tmp2; // 列印 g() 的結果
// 可能性 2:
tmp1 = g(); // 列印 g() 裡面的輸出
tmp2 = f(); // 列印 f() 裡面的輸出
std::cout << tmp2; // 列印 f() 的結果
std::cout << tmp1; // 列印 g() 的結果

延伸閱讀:http://en.wikipedia.org/wiki/Sequence_point

星期六, 2月 05, 2011

Need More SpeedRAM

最近 4G 的 SO-DIMM DDR3 模組的價錢降低到令人很想買(約 2G 價錢的 1.4 倍),於是我就買了兩條回來插。

因為我手上這台 Dell Studio 1557,CPU 是 Intel Core-i7 720qm,有八個邏輯核心,所以通常我在 make 東西的時候都是 -j16 下去跑。可是編譯一些 C++ 的東西(例如 Google Chromium 瀏覽器)的時候,常常一個 gcc process 就吃掉 500MB 的 RAM,導致有 4GB 的 RAM 都會 Thrashing。尤其是開了一些 Chromium、Firefox、Thunderbird 之類的東西的時候,瀏覽器還有機會被 OOM Killer 殺掉... = =

現在都不會了!真好!

桌機的 4GB 的 DDR3 價錢也降低到很 affordable 了,也許改天可以來買四條 4G 拼一台 16GB 記憶體的桌機 XD~ 噢!桌機的硬碟也快滿了!

星期四, 2月 03, 2011

台灣的女人比美國的豬還不如

不是要貶低台灣的女性,請先看完這篇新聞:

美國男子強姦母豬致豬生病 可能獲刑120年(2011/02/02 12:34)

綜合報導 | 國際中心 | NOWNews 今日新聞網

一名美國農場主人日前發現自己的豬行為異常,因擔心其生病請來獸醫為其診治。檢查的結果卻出人意料,這些豬曾受到性侵犯,農場主人隨即報警。

根據美國密西西比格林伍德警方公佈的消息,獸醫表示這些母豬患有嚴重的陰道炎,並且斷定是由性行為「感染」的。除陰道炎外,其中一些母豬的陰道內還存在傷口,懷疑是暴力性行為所致。警方受農場主人委託,在農場內安裝監視器,希望查出這些母豬是如何遭到性侵犯?

隨後,農場附近一名52歲的男子出現在鏡頭裏,這名男子名叫安德魯•李•納什。監視器畫面顯示,納什在鏡頭下做出了反常的動作,在豬群後面脫下了內褲。 納什的整個作案過程持續了很長時間。犯罪嫌疑人納什被以12條罪名起訴,如果罪名成立,他恐將面臨120年徒刑。

在中華民國刑法中有關妨害性自主罪, 最高只有十年有期徒刑。這不是擺明了中華民國女性的性自主權,比美國的豬還不如嗎?

Updating Seagate Harddisk Firmware under Linux

Actually this is not really about Linux. It's just about when you have no windows and want to update the firmware of the HDD with the official utility.

This article is actually about using the loopback support from grub2 to load the official iso, and the memdisk tool from syslinux to load the disk image inside the iso.

Follow these steps below:

  1. download the official Seagate firmware update ISO image (for example, MomentusXT-ALL-SD24.iso)
  2. put the iso image under /boot (or anywhere else that grub2 can access)
  3. get syslinux, we actually only need the memdisk tool. put that in /boot/memdisk (or somewhere else that grub2 can access)
  4. reboot into grub2 shell
    • upon reboot, keep clicking ESC like crazy, this should bring up the boot entry selection screen
    • when you see that screen, hit 'c' to enter the grub shell (the command prompt)
  5. inside the grub shell, run these commands:
    • loopback loop /MomentusXL-ALL-SD24.iso
      • (change this to the path of the iso image)
    • linux16 /memdisk
      • (change this to the path of the memdisk)
    • initrd16 (loop)/AN-SD24.ima
      • (this may vary, just look for the file with a suffix .ima)
      • (if you don't know the filename, `ls (loop)/` to get a list)
    • boot
  6. now you're inside the official firmware update tool, follow the on-screen instructions.

Enjoy!