2017-04-22

[資源]相容HD-DVD與Blu-ray Disc的video encoding參數

HD-DVD的VBV buffer size
來源: https://forum.doom9.org/showthread.php?p=881160#post881160
According to the HD-DVD specs, these are the allowed VBV buffer sizes:

1843200 bytes for Main Video HD
937984 bytes for Main Video SD
929792 bytes for Sub Video HD
242688 bytes for Sub Video SD

So it looks like the buffer size is more like 500 msec, not 320 msec. 

HD-DVD與Blu-ray的peak video rate,maximum GOP,VBV buffer size比較
來源: http://www.reduser.net/forum/showthread.php?4422-HD-DVD-and-Blu-Ray-Discussion&p=84624&viewfull=1#post84624
HD DVD:
Peak video rate is 29.4 Mbps.
Maximum GOP length is .6 seconds (14 frames for 24p)
VBV is 1843200 bytes (peak bitrate buffer)

BD:
Peak video rate is 40 Mbps
Maximum GOP length is 1 second (if bitrate is > 15 Mbps) (24 frames for 24p)
VBV is 3750000 bytes

2014-10-28

[程式]用Squeak Smalltalk寫一個簡單的MIDI發聲程式

前一陣子買了61鍵的Casio XW-P1合成器來玩,但是都沒有嘗試與電腦連動。
最近突然想到,以前曾經接觸過Squeak Smalltalk,在它內建的class庫中,正好有SimpleMIDIPort這個class可以讓我們接收與發送MIDI event。
只要靠SimpleMIDIPort,我們就可以寫個簡單的程式,送些MIDI event到外接的MIDI設備,看看電腦可以對該MIDI設備做到什麼程度的控制。
於是筆者就在這裡記下一段簡單的Smalltalk程式碼,方便之後做些測試。

| midiPortNum midiPort |
midiPortNum := SimpleMIDIPort outputPortNumFromUser.
midiPort := SimpleMIDIPort openOnPortNumber: midiPortNum.
Transcript show: midiPortNum; cr; show: midiPort; cr.

midiPort midiCmd: 16rC0 channel: 0 byte: 90. "change program"

midiPort midiCmd: 16r90 channel: 0 byte: 60 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 60 byte: 16r0.
midiPort midiCmd: 16r90 channel: 0 byte: 60 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 60 byte: 16r0.
midiPort midiCmd: 16r90 channel: 0 byte: 67 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 67 byte: 16r0.
midiPort midiCmd: 16r90 channel: 0 byte: 67 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 67 byte: 16r0.
midiPort midiCmd: 16r90 channel: 0 byte: 69 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 69 byte: 16r0.
midiPort midiCmd: 16r90 channel: 0 byte: 69 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 69 byte: 16r0.
midiPort midiCmd: 16r90 channel: 0 byte: 67 byte: 16r7F.
(Delay forSeconds: 0.5) wait.
midiPort midiCmd: 16r80 channel: 0 byte: 67 byte: 16r0.

midiPort midiCmd: 16rC0 channel: 0 byte: 0. "reset program"
midiPort midiOutput: (#(16rFF) asByteArray). "system reset"

以上的程式範例會用120bpm的速度控制MIDI設備的Channel 0放送Twinkle Twinkle Little Star的前7個主音。

如果有現成的MIDI檔的話,也可用下面的程式開啟MIDI檔,並輸出到作業系統提供的MIDI裝置。

| file score scorePlayer midiPortNum |

file := FileStream fileNamed: 'C:\Windows\Media\flourish.mid'.
file binary.

score := ((MIDIFileReader new) readMIDIFrom: file) asScore.
file close.

scorePlayer := ScorePlayer onScore: score.

midiPortNum := SimpleMIDIPort outputPortNumFromUser.
scorePlayer openMIDIPort: midiPortNum.

scorePlayer reset.
scorePlayer startMIDIPlaying.
(Delay forSeconds: 60.0) wait.
scorePlayer stopMIDIPlaying.

之後想要測什麼就可以用這些template程式碼起頭了。

2014-08-07

[設定]在VMWare中的Debian wheezy要如何啟動3D加速?

最近常常需要雙開Windows跟Linux來開發程式,考量到Windows會用到一些要求效能以及很會吃記憶體的工具,於是決定用Windows做為Host OS,而讓Linux做為VMWare中的Guest OS。
個人以往在VMWare中安裝Ubuntu是沒有什麼問題,只要裝好VMWare tools就可以讓Ubuntu直接享受到最完善的硬體加速,連3D加速的桌面環境都能順暢運作。
但是最近在VMWare中安裝Debian 7 (wheezy)時卻碰到Gnome 3桌面環境不能啟用的問題,原因是在VMWare中,Debian預帶的video driver不能提供Gnome 3需要的3D加速功能。
花了一些時間拜求Google大神,終於在這個blog文章的下方推文找到了最簡單的解決方法。
在這邊簡單敘述解決步驟。

打開任何你習慣使用的terminal,並依序執行下列指令:
sudo apt-get install libxatracker-dev
sudo apt-get build-dep xserver-xorg-video-vmware

apt-get source xserver-xorg-video-vmware -b
sudo dpkg -i xserver*.deb
rm -rf xserver*

重開機後就可以享受Gnome 3的華麗UI介面了!

2014-07-28

[工具]在泛Debian系的Linux中更新certificate檔

沒想到Linux的方便性也是在日益進化的......

如果要在泛Debian系(例如Debian,Ubuntu)的Linux中更新certificate檔,其實很簡單。只要我們執行一下update-ca-certificates這個工具,它就能幫你搞定所有細節了。

許細做法如下:
先取得root權限,把領到的*.crt檔丟到
/usr/local/share/ca-certificates
再用root權限執行
update-ca-certificates
之後連到那些需要用指定的certificate檔才能連立SSL連線的server時,就不會再跳出錯誤訊息了。

2014-04-09

[程式]以tail-recursion來實作已有iterative求解法的recursive數學函數

最近和同好討論到程式方面的問題。對於一個缺乏iterative loop機制的函數式程式語言,要如何做到類似for loop的計算動作呢?最簡單的方法是,在這個函數本體中放入每回iteration時要做的計算動作,在計算動作完成後,呼叫函數自身,並且把要傳到下一輪iteration的數值做為呼叫函數所需的參數。只要這個函數的寫法符合tail-recursive規範,執行於任何有實作tail-recursive最佳化的函數式程式語言(如Scheme、Erlang等等),就不會發生因recursion次數太多造成stack overflow的問題。

當我們要用C語言這類循序式程式語言計算Fibonacci數列中第n個數值是多少時,在n>1的前提下可以用
f(n)<=f(n-1)+f(n-2)
以recursive求解。但是當n很大時,會發生stack overflow的問題,再加上每回求解時,f(n-1)自身也需要用到f(n-2)的結果,使得重複計算的問題持續發生。 既然如此,用iterative的實作方法既能迴避stack overflow,又能重複利用前一輪的計算結果,根本是兩全齊美!但要以缺乏iterative loop機制的函數式程式語言,來實作iterative版的Fibonacci數列求解時,我們就得用點小技巧了。 像是以Lisp-1家族的Scheme來寫Fibonacci函數時,在tail-recursion這部分,除了原有的參數n之外,還要把中間結果a與b做為呼叫函數所需的參數,傳到下一輪iteration:
(define (fibonacci n)
    (define (fibonacci_internal n a b)
        (if (> n 0)
            (fibonacci_internal (- n 1) b (+ a b))
            a))
    (fibonacci_internal n 0 1))
把這段Scheme程式碼拿到支援大數計算的直譯器跑(例如較新版的GNU Guile),就會發現,不論n有多大,這個Fibonacci函數都不會因為stack overflow而當機,也不會因為integer的數值overflow而出現預期外的結果。唯一麻煩的地方,是需要另外定義外部函數fibonacci來包裝函數的參數介面,讓呼叫者不用直接面對需要傳遞a與b的核心函數fibonacci_internal,並在開始執行時自動給a與b一個起始值。

若要循序列舉上述Fibonacci函數的return值,我們也可以用tail-recursive的寫法來循序列出Fibonacci函數求解結果:
(define (loop_test n)
    (define (iter i n)
        (format #t "fibonacci(~a)=~a" i (fibonacci i))
        (newline)
        (if (< i n)
            (iter (+ i 1) n)))
    (iter 0 n))

2013-06-27

[EAC]光碟機存取音樂CD的Read/Write Offset特性,如何影響rip下來的音樂數據內容?

剛剛在查要買什麼新光碟機時,意外看到以前在巴哈姆特討論區GameMusic板回給網友louis000的文章。
我想這篇就足以把光碟機讀寫CD audio sample時造成的offset現象,如何影響rip下來的音樂數據內容的來龍去脈解釋清楚了:

2013-05-26

[Tip]Ramdisk要是超過4G,要怎麼讓pagefile運用全部的Ramdisk空間

在Windows XP 32bit版這類不能利用超過4GB記憶空間的系統,大多數的使用者會加裝支援PAE的Ramdisk軟體(如Gavotte Ramdisk),把剩下的記憶體空間變成虛擬磁碟。為了能夠有效地利用這個虛擬磁碟空間,使用者會把分頁檔pagefile.sys放在這裡,讓系統的記憶體總空間得以超過4GB,變相地讓在Windows XP 32bit支援超過4GB的記憶空間。

但只要主記憶體超過6GB多,就會造成分出來的Ramdisk總空間大於4GB。而pagefile.sys單檔大小又不能超過4095MB,用GUI介面設定pagefile時也不能在同一個磁碟建立2個以上的pagefile.sys,若電腦內那些能自行建立暫存檔的程式,還不能把剩下的Ramdisk空間完全用掉,那麼從實體主記憶體要來的Ramdisk空間就形同浪費了。

所幸,Windows XP 32bit版可以在同一個磁碟建立2個以上的pagefile.sys,只是光靠GUI介面並不能指定這種配置方法,必須用regedit手動更改Windows register設定。

方法很簡單:

首先啟動regedit程式。找到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
這個路徑。

接著在這個路徑內尋找PagingFiles這個型態為REG_MULTI_SZ的變數。找到後,點2下打開編輯對話框,輸入:
Z:\pagefile_01.sys 4095 4095
Z:\pagefile_02.sys 4095 4095
Z:\pagefile_03.sys 4095 4095
按下Ok。

如果要改變各個pagefile.sys的最小值,請把每列的第1個4095改成你要的大小(以MB為單位);如果要改變最大值,則是把每列的第2個4095改成你要的大小(以MB為單位)。
要把8GB左右的Ramdisk空間幾乎用完,就得開2個pagefile.sys;要把12GB左右的Ramdisk空間幾乎用完,就得開3個pagefile.sys,以此類推。

重開機後,若是看到記憶體總空間多出來,而Ramdisk內也有2個以上的pagefile.sys,就代表設定成功了。

若是嫌麻煩的話,也可以自己匯出register設定檔:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"PagingFiles"=hex(7):5a,00,3a,00,5c,00,70,00,61,00,67,00,65,00,66,00,69,00,6c,\
  00,65,00,5f,00,30,00,31,00,2e,00,73,00,79,00,73,00,20,00,34,00,30,00,39,00,\
  35,00,20,00,34,00,30,00,39,00,35,00,00,00,5a,00,3a,00,5c,00,70,00,61,00,67,\
  00,65,00,66,00,69,00,6c,00,65,00,5f,00,30,00,32,00,2e,00,73,00,79,00,73,00,\
  20,00,34,00,30,00,39,00,35,00,20,00,34,00,30,00,39,00,35,00,00,00,5a,00,3a,\
  00,5c,00,70,00,61,00,67,00,65,00,66,00,69,00,6c,00,65,00,5f,00,30,00,33,00,\
  2e,00,73,00,79,00,73,00,20,00,34,00,30,00,39,00,35,00,20,00,34,00,30,00,39,\
  00,35,00,00,00,00,00
往後要復原設定時,把register設定檔匯入,重開機便可生效。

[PyConTW 2013]懶人とPythonとAnimation Studio

下面是我在PyConTW 2013給talk的投影片內容:
懶人とPythonとAnimation Studio

本來是想說鍛練自己在大場面的演說能力,剛好看到PyConTW年會又要舉行了,於是就心血來潮,以工作上的經驗報個題目來試試,沒想到還真的得上台給talk XD

基本上相對於Django,AppEngine用很兇或是把Python Parser與VM玩弄於股掌之間的的高手而言,小弟還只是個小咖。如果這次talk有什麼不足之處,歡迎各方高手多給小弟建議 <(_ _)>

2013-01-25

[Tip]Gavotte Ramdisk在剛開機時尚未格式化

現在記憶體價格十分低廉,只要有點小錢,隨便就可以買到總和8GB、16GB上下的桌上型電腦記憶體,因此很多會自行組裝電腦的玩家都開始用大容量的記憶體來增進自己電腦的執行效能。而少部分因為軟硬體相容性而不得不安裝像是Windows XP 32bit這種非Server OS的電腦,一定會苦於Windows讀不到超過4GB的記憶體等定址範圍問題。不過,有使用Windows Server經驗的IT工作者們應該都知道,其實Windows在啟用PAE定址模式時,是可以定址最大64GB的記憶體空間的。Windows XP 32bit版只能定址4GB的記憶體,單純是因為微軟封印了XP的極限,想強迫那些需要用大記憶體又不想用64bit系統的客戶們,採購他們家的Windows Server產品系列,以做出明確的市場區隔。雖然也有少數沒寫好的驅動程式不能在PAE定址模式正常工作,但是這種情況並不多見。

也因為如此,堅守Windows XP 32bit版的老派們便尋找手段來釋放XP封印住的記憶體。而目前最多人採用的方案,就是使用那些可以透過PAE模式挪用超過4GB的記憶體的Ramdisk軟體,把XP封印住的記憶體模擬成超高速的磁碟空間。
接下來,看你要把pagefile還是cache放在這個磁碟空間都可以。

目前軟體費用最低(但是效能也最差)的Ramdisk,應該是網友Gavotte從Microsoft Ramdisk實作範例改寫而得的Gavotte Ramdisk。因為Gavotte Ramdisk完全免費使用,所以眾多買不起商業Ramdisk軟體的玩家便用這個Ramdisk來運用XP封印的記憶體。

不過最近筆者重灌電腦後卻碰到一個難題,那就是筆者自行安裝的Gavotte Ramdisk,在剛安裝好時看起來都一切正常,但是重開機後,Ramdisk卻沒有如期地清空,回復到已格式化成FAT32,只有一個TEMP目錄的淨空狀態,而是變成尚未格式化的狀態。起初以為是沒有使用Gavotte Ramdisk隨附的rdutil工具做一些額外設定的關係,但是後來試過了各種解決方法,剛開機的Ramdisk一樣是未格式化的狀態。

但是昨天筆者仔細研究了Gavotte Ramdisk安裝在Windows registry的參數後,發現竟然是因為一個簡單的原因,那就是Gavotte Ramdisk的service在開機期間根本沒啟動,所以虛擬出來的磁碟才會沒有回復到Ramdisk剛建立時的狀態。而沒有啟動的原因,就是因為下面這個參數:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RRamdisk]
"Start"=dword:00000002

在我的電腦裡面,當這個dword參數數值是00000000的時候,開機期間就不會啟動Gavotte Ramdisk;但是把這個dword參數數值改成00000002(也就是Automatic,在開機時自動啟動service)以後,下次重開機,Gavotte Ramdisk的service就會自動啟動,也就不會再發生虛擬出來的磁碟尚未格式化的問題了。

電腦問題往往都導因於超級白痴的錯誤,這句話可真是不假orz

2012-06-02

[Tip]如何減輕SeaMonkey的定格問題

雖然我的電腦主力browser是Google Chrome,但是有時候在記憶體較小的老電腦上,Google Chrome的記憶體用量真的會讓老電腦吃不消。這時,網頁顯示正確度也很高的Gecko核心(FireFox使用的核心)browser,就成為我的另一個選擇。然而我以前也曾是Netscape Navigator/Communicator的忠實用戶,同樣是Gecko核心的browser,個人會偏好使用介面與Netscape Navigator相似的SeaMonkey(以前是Mozilla Suite)。

不過注重browser順暢度的玩家一定會發現,Gecko核心的browser最近看有內嵌plugin的網頁時,不時會發生定格的問題。這是因為現在Gecko核心的browser刻意用plugin-container.exe讓plugin在另一個process執行,防止plugin的當機拖垮browser本身。但也因為這個保護機制,使得browser用起來會卡卡的,所以一般使用者都會選擇取消這個功能。那你說要是運氣不好,plugin掛掉導致browser爛掉的話怎麼辦?其實只要你有把browser設定成"Restore Previous Session",不管是異常終止還是正常關閉,browser都會記住每個tab內開著的網頁與歷史記錄。所以要是browser爛掉了,重開就好了。

那如何關掉plugin-container.exe呢?如果你跟我一樣用的是SeaMonkey,只要照著以下步驟做就可以了:
  • 在網址列輸入字串 about:config
  • 搜尋 dom.ipc
  • 找到 dom.ipc.plugins.enabled 這個項目
  • 令 dom.ipc.plugins.enabled = false

重開browser之後,就不會讓plugin在plugin-container.exe的保護下執行了。順暢度也就因此提高了。

2012-04-30

[硬體]老箱重開: Roland EDIROL UA-4FX

Roland這家日本廠商,在電子樂器、錄音室、音控設備等領域是人人皆知的大廠。而Roland廣大的音樂產品中,也包含了高品質的電腦錄音硬體介面。在台灣,很多音響發燒友推薦有錄音需求的人們使用專業的外接錄音介面(像是Echo AudioFire系列),或是推薦不錄音的人們使用高品質的外接DAC。因為外接DAC只要使用Windows內建的驅動程式就可以工作,所以不會有只支援特定作業系統的問題。但是外接錄音介面需要專用的驅動程式,早期很多知名廠牌又大多沒有提供Windows Vista或是Windows 7的驅動,對於想在新版Windows下享受高音質的發燒友來說是個很大的障礙。不過好在Roland揪感心,早在Windows Vista與Windows 7問世時,就推出了支援Windows Vista與Windows 7的驅動程式給外接錄音介面。雖說Roland的外接錄音介面品質並不是最優的,但是在當時只有Roland一家推出新Windows驅動程式的情況下,我就買了他們家旗下EDIROL品牌的入門等級外接錄音介面,UA-4FX。

後來電腦桌面空間不夠用的關係,有一陣子把這台收起來保存在櫃子中。但是最近又開始做MV,需要低延遲的聲音與大量的聲音細節,以判定如何調整影片時間軸,來符合音樂節奏。所以,我才又把這台拿出來用。

包裝盒:

[硬體]Benevo BUH327 7ports USB Hub

最近台灣隨處可見的USB Hub,往往都會附上供電能力嚴重不足的外接電源,使得所有USB port無法同時間輸出500mA的電流,而這也是導致USB裝置運作不穩的元兇之一。在原有的爛USB Hub壞掉之後,筆者決定來找個外接電源出力足夠的USB Hub來用。而這類USB Hub最容易買到的,便是筆者買來的這個Benevo BUH327 7 ports USB Hub了。

包裝盒:

2012-04-22

[車]北都Toyota Camry Hybrid省油賽

我參加這個比賽後才覺得,原來現在車子賣這麼貴,是因為行銷花了太多錢...XD

比賽會場:

2012-04-14

[車]Toyota Prius c試駕

不知道是故意還是巧合,Toyota社長自從由喜歡玩賽車的豐田章男接任後,旗下的新世代車款有越來越年輕化與運動化的趨勢。除了目前國內外各汽車媒體所推崇的平價運動車Toyota 86以外,其他不是專為競賽而生的車款也開始變得更有運動化的味道。而Toyota/Lexus油電家族的新成員Prius c,就是調性朝向運動化的新世代Toyota車款之一。

展間等試乘:

[食記]英國茶館

像我這種窮人平常是不會來英國茶館這種贅沢(ぜいたく、意即奢侈)茶館的。但是靠著信用卡紅利點數,我換到了兩人份的免費餐券。

就這樣,校慶結束後,我就決定來英國茶館吃點好的。

大葉高島屋:

[慶典]附中校慶

校慶可說是附中一年之中相當重要的慶典之一。不過今年正好是60年整,所以校慶規模格外地盛大。

有人會覺得,不就一樣升旗唱校歌,然後鳥獸散,有什麼特別的嗎?
有,今年的來校人數讓這區的行動通訊網路完全癱瘓了幾個小時... -_-|||

人!

2012-01-28

[食記]土三寒六

日本香川縣的名產-讚岐烏龍麵-其獨特的麵條口感讓不少愛吃麵食的饕客趨之若騖。而在台北的東區商圈一帶,正有一家打著讚岐烏龍麵名號的日式烏龍麵店,那就是土三寒六。

土三寒六這奇怪的名字,乃是來自製作美味烏龍麵的其中一個要訣。這4字訣中的土,為土用的簡稱。原先土用指的是立春、立夏、立秋、立冬這4個重要節氣日的前18天,但現在大多指立秋前18天,也就是夏天最熱的時期。那夏天3冬天6是什麼意思呢?我們知道製麵過程需要用到鹽水,而在日本香川縣當地,有個自古傳承下來的鹽水調配要訣,那就是在酷夏時期,其鹽和水的比例是1比3;在寒冬時,鹽和水的比例是1比6。依季節不同調整鹽與水的比例,就能做出Q彈好吃的烏龍麵。

招牌:

店面:

2012-01-27

[開箱]Gran Turismo 5 Collector's Pack 2nd Edition (PS3)

在PS3主機上,有片讓人期待已久的賽車遊戲,因為製作人一貫不調校好就絕不會上市的龜毛個性,遊戲的推出日程一再地延宕,讓數量難以估計的全球玩家等得心癢癢的。這款遊戲就是龜了好幾年才總算推出的Gran Turismo 5。

GT5這片遊戲雖然在各大遊戲市場都有推出限定版,但比較有趣的是,特典內容更加豐富的典藏版並沒有在日本本地推出,反而是海外的玩家(北美、歐洲以及亞洲地區),才有機會買到內容物更加豐富的GT5典藏版。

於亞洲區發行的冬季典藏版:

2012-01-25

[食記]所長茶葉蛋

有時聞名四海的小吃,可能只是一位無名人士的臨時發想,卻歪打正著不小心就聲名遠播。用這樣的描述來形容所長茶葉蛋,是再好不過的了!

招牌:

2012-01-21

[開箱]Super Mario 3D Land

之前就耳聞這片老馬新作非常地好玩,本來是打算在第一時間入手的,但是卻因為價格太貴,所以遲遲無法下手。最近這片的價格慢慢降下來了,於是就選在今天入手。

Super Mario 3D Land: