<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5526321511435224740</atom:id><lastBuildDate>Mon, 19 Oct 2015 15:42:53 +0000</lastBuildDate><category>diary</category><category>隨筆</category><category>Linux</category><category>programming</category><category>music</category><category>程式設計</category><category>音樂</category><category>c-faq 繁中版</category><category>Crypto</category><category>密碼</category><category>技術</category><category>recipe</category><category>食譜</category><category>tech</category><category>閱讀</category><category>Security</category><category>reading</category><category>資訊安全</category><category>Movie</category><category>trip</category><category>旅遊</category><category>電影</category><category>cs-pop</category><category>計算機科學普及計畫</category><title>furseal&#39;s lair</title><description>sing, and the world sings with you.</description><link>http://hbtsai.blogspot.com/</link><managingEditor>noreply@blogger.com (Hong-Bin Tsai)</managingEditor><generator>Blogger</generator><openSearch:totalResults>148</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-1777553825527603956</guid><pubDate>Thu, 11 Nov 2010 00:11:00 +0000</pubDate><atom:updated>2011-08-02T23:04:37.625+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">程式設計</category><title>fork() in c cgi</title><description>&lt;p&gt;In programming, function invocation is designed to run in either synchronous or asynchronous mode. system() for instance, is a synchronous call. system(“something &amp;amp;”) is a ugly way to make system() kindda asynchronous because the execution of system command is put to background and thus system() returns immediately while return value is always 0. &lt;/p&gt;  &lt;p&gt;To better control the system() process we’d better create another thread (pthread_create) or process (fork) to keep tracking the execution of that command, and in that thread/process we can do further process control over the command. For example, data validation, return value checking, sending notice to upper layer of the program…etc. &lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;fork() is thus become very important to my c-cgi because certain operations are very time-consuming and without sophisticated adjustment, browser will be locked-up and wait till system command finishes. However, calling fork() is not enough. Let’s see how fork() is usually used in a program. &lt;/p&gt;    &lt;div style=&quot;border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px&quot; id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum1&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;(!fork())&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum2&quot;&gt;   2:&lt;/span&gt; { &lt;span style=&quot;color: #008000&quot;&gt;// start child process&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum3&quot;&gt;   3:&lt;/span&gt;     setsid();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum4&quot;&gt;   4:&lt;/span&gt;   &lt;span style=&quot;color: #008000&quot;&gt;//do-something&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum5&quot;&gt;   5:&lt;/span&gt;     exit(0);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum6&quot;&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Basically if fork() successes, there will be a duplicated process that you can’t miss by watching `ps` output. This is also the case when doing fork() in a cgi program, only that even if parent process returns (cgi finished,) browser’s loading status bar is not finished. The reason is quite simple. &lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px; line-height: 19px; font-family: sans-serif; &quot;&gt;∵&lt;/span&gt; stdout and stderr of child process is duplicated from parent process, which is reserved for pipelining cgi output to browser webpage. &lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 13px; line-height: 19px; font-family: sans-serif; &quot;&gt;∴ &lt;/span&gt;browser is actually waiting for that piece of memory (duplicated in child process) being released. &lt;/p&gt;

&lt;p&gt;Realizing this fact, we can easily modify the fork() code as follows,&lt;/p&gt;

&lt;div style=&quot;border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px&quot; id=&quot;codeSnippetWrapper&quot;&gt;
  &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;
    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum1&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;(!fork())&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum2&quot;&gt;   2:&lt;/span&gt; { &lt;span style=&quot;color: #008000&quot;&gt;// start child process&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum3&quot;&gt;   3:&lt;/span&gt;     fclose(stdout);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum4&quot;&gt;   4:&lt;/span&gt;     fclose(stderr);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum5&quot;&gt;   5:&lt;/span&gt;     setsid();&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum6&quot;&gt;   6:&lt;/span&gt;   &lt;span style=&quot;color: #008000&quot;&gt;// do-something&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum7&quot;&gt;   7:&lt;/span&gt;     exit(0);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum8&quot;&gt;   8:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;And thus your browser will no longer busy-waiting for the process. :)  &lt;/p&gt;
&lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2010/11/fork-in-c-cgi.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-3697861484690026216</guid><pubDate>Wed, 07 Jul 2010 03:30:00 +0000</pubDate><atom:updated>2010-07-07T11:30:58.855+08:00</atom:updated><title>加大 qemu image size</title><description>&lt;p&gt;我預設拿來做 tool chain 的 qemu image 只給了 8G，沒想到這次客戶給的一整包 BSP 要 5G ，加上原有 host 裝 debian ，和 BSP 自己的壓縮檔，8G 一下子就爆掉了。&lt;/p&gt;  &lt;p&gt;把原有的 disk image 加大很簡單，簡單點說就是幾個步驟就搞定。因為我是裝 ext3，似乎用 ntfs 的人得再多花點力氣…&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;參考網頁：      &lt;br /&gt;&lt;a title=&quot;http://itsignals.cascadia.com.au/?p=28&quot; href=&quot;http://itsignals.cascadia.com.au/?p=28&quot;&gt;http://itsignals.cascadia.com.au/?p=28&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;還需要下載 gparted live cd 的 ISO檔:      &lt;br /&gt;&lt;a title=&quot;http://sourceforge.net/projects/gparted/files/gparted-live-stable/&quot; href=&quot;http://sourceforge.net/projects/gparted/files/gparted-live-stable/&quot;&gt;http://sourceforge.net/projects/gparted/files/gparted-live-stable/&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;1. 建立一個空的 qemu image，大小等於你要新增的空間，比如說10G&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;font style=&quot;background-color: #ffffff&quot;&gt;#qemu-img create –f raw empty.img&lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;2. 如果原來的 disk image 不是 raw，就要 convert 成 raw&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;#qemu-img convert –f qcow2 –o raw disk.img disk_raw.img&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;3. 把它貼到原來的 image 後面&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;#cat empty.img &amp;gt;&amp;gt; disk_raw.img&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;4. 用 gparted live cd 開機 (指定 cdrom 給 qemu) &lt;/p&gt;    &lt;p&gt;5. … 啊就 gparted ，resize 原有的 disk 。&lt;/p&gt;    &lt;p&gt;完畢。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2010/07/qemu-image-size.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-8034863284319493362</guid><pubDate>Sat, 17 Oct 2009 03:46:00 +0000</pubDate><atom:updated>2009-10-17T11:46:44.777+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>夢想</title><description>&lt;p&gt;這個時候我應該在寫 gstreamer plugin 的第四部份，但本來想用 twitter 發的文一直發不出去…乾脆寫一篇 blog 好了。&lt;/p&gt;  &lt;p&gt;夢想如果能實踐，算不算是夢想？&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;  &lt;p&gt;夢想如果不能實踐，那還真的叫做夢，那些宣稱可以築夢踏實的人都在說謊。&lt;/p&gt;  &lt;p&gt;我夢想有一天，能有能力去整頓迂腐顢頇的中華民國政府。我夢想建立有效率而且公正公開的公務系統，領人民的稅，服務人民的事。&lt;/p&gt;  &lt;p&gt;我夢想台灣的人民行止有禮，安居樂業，不做違法的事，不做虧心的事，不做違背道德良心的事，不臆測，不猜度，不疑懼他人。生活能有理想，有目標，能實踐，能發展。&lt;/p&gt;  &lt;p&gt;人人有書讀，人人有屋住，有車開，有家有伴侶有子嗣。互相合作，守望相助，團結一心，同時顧及個人及群體的利益。&lt;/p&gt;  &lt;p&gt;人人心裡得到安定，身體得到安養，以慈悲面對苦難，以包容面對紛爭，以祝福面對他人的成就，以友善面對陌生，以理性面對未知。&lt;/p&gt;  &lt;p&gt;我夢想同樣的夢想能在地球的每一個角落得到實現。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/10/blog-post_17.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-7857329155383342390</guid><pubDate>Wed, 30 Sep 2009 03:01:00 +0000</pubDate><atom:updated>2009-10-08T23:48:17.422+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">技術</category><title>推動 gstreamer plugin 的第三步</title><description>&lt;p&gt;前面兩篇我們完成了兩件很重要的事情，第一是建立了編寫插件程式的環境和測試方法，第二是替插件裝好了進出水閥 (sinkpad 和 srcpad) 的格式和屬性，格式不合的資料進不來，也出不去。接下來我們要開始放水，讓資料流進這個插件。&lt;/p&gt;  &lt;p&gt;gstreamer 在處理資料的流動有兩種主要的模式，一個是「推」，一個是「拉」。兩種模式需要實作的 routine 不同，在對資料的操作 (manipulation) 上的重點也不一樣，很容易被搞得摸不清方向(其實我到現在還是有很多沒搞懂的地方…)。首先先解釋一下兩者的不同。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;「推」模式就是由上游的插件控制資料的大小、流速，向下「推」到下游的插件，所以下游的插件並不會事先知道有多少資料會被送進來，它就必須先準備一個緩衝區來承接資料，然後判斷緩衝區裡的資料是否足夠拆解出一個壓縮單位的資料，夠的話就把資料切割出一個固定大小送給解碼器，剩下的資料要留著和下一筆流進來的資料做連接。&lt;/p&gt;    &lt;p&gt;「拉」模式則是需要自己控制資料大小、流速，告訴上游的插件說自己要多少資料，從幾分幾秒開始讀，自己控制速度、大小等等變數，把資料「拉」進來。因為要流進來的資料量 (舉例來說，media-object 的 size、chunk size、packet size) 自己可以控制，就不需要設計一個緩衝區來放資料。&lt;/p&gt;    &lt;p&gt;通常，「拉」模式會用在 demuxer，而「推」模式用在其他插件，所以 gst-template 提供的例子是「推」模式的寫法。_chain() 函式就是讓上游插件把資料送進來的接口，當資料開始流動的時候 (完成啟動階段(activation stage)後，啟動的部份留待後述。) 會直接喚起初始階段時向 pad 註冊的 chain 函式，這個函式的介面 (GstPadChainFunction) 是已經被定義好的，其中一個變數是 GstBuffer 的指標，資料就被塞在這個指標所指向的記憶體空間。我們便可以透過註冊進去的函式，取得操作這段資料的 handle 。&lt;/p&gt;    &lt;p&gt;Gstreamer 在處理資料流有四個狀態：Null, Ready, Pause, Playing 按順序切換。也就是說，剛開始播放一個檔案時狀態變化是： Null –&amp;gt; Ready –&amp;gt; Pause –&amp;gt; Playing，當播放結束要釋放 pipeline 的順序就是原路走回去：Playing –&amp;gt; Pause –&amp;gt; Ready –&amp;gt; Null。我們寫的這個 mp3dec 插件是要把 mpeg audio decoder libmad 包裝為 gstreamer 插件，所以在開始播放檔案之前必須先把插件初始化 (比如說，設定 member variable 的初始值，初始化 gstreamer 的其他元件等等)，當然，也要先初始化 libmad。初始化的動作一般來說，應該要放在 Null 轉到 Ready 的階段，或 Ready 轉到 Pause 的階段，絕對不可能是在 Pause 轉到 Playing 的階段，因為 Pause 和 Playing 兩個狀態是切換播放模式用的 (如：暫停、快進、Seeking) 。&lt;/p&gt;    &lt;p&gt;到目前為止都很抽象，我們走進源碼來看就會好一點。&lt;/p&gt;    &lt;p&gt;為了處理剛提到的狀態切換，我們要註冊一個 _change_state() 函式。&lt;/p&gt;    &lt;div style=&quot;border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px&quot; id=&quot;codeSnippetWrapper&quot;&gt;     &lt;div style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot; id=&quot;codeSnippet&quot;&gt;       &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum1&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; GstStateChangeReturn &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum2&quot;&gt;   2:&lt;/span&gt;     gst_mp3dec_change_state(GstElement* element, GstStateChange transition)&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum3&quot;&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum4&quot;&gt;   4:&lt;/span&gt;     GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum5&quot;&gt;   5:&lt;/span&gt;     Gstmp3dec *dec;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum6&quot;&gt;   6:&lt;/span&gt;     dec = GST_MP3DEC(element);&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum7&quot;&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum8&quot;&gt;   8:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;switch&lt;/span&gt;(transition)&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum9&quot;&gt;   9:&lt;/span&gt;     {   &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum10&quot;&gt;  10:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;case&lt;/span&gt; GST_STATE_CHANGE_NULL_TO_READY:&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum11&quot;&gt;  11:&lt;/span&gt;             mad_frame_init(&amp;amp;dec-&amp;gt;frame);&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum12&quot;&gt;  12:&lt;/span&gt;             mad_stream_init(&amp;amp;dec-&amp;gt;stream);&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum13&quot;&gt;  13:&lt;/span&gt;             mad_synth_init(&amp;amp;dec-&amp;gt;synth);&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum14&quot;&gt;  14:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum15&quot;&gt;  15:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum16&quot;&gt;  16:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum17&quot;&gt;  17:&lt;/span&gt;     }   &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum18&quot;&gt;  18:&lt;/span&gt;     &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum19&quot;&gt;  19:&lt;/span&gt;     ret = parent_class-&amp;gt;change_state(element, transition);&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum20&quot;&gt;  20:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt;(ret == GST_STATE_CHANGE_FAILURE)&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum21&quot;&gt;  21:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; ret;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum22&quot;&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum23&quot;&gt;  23:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;switch&lt;/span&gt;(transition)&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum24&quot;&gt;  24:&lt;/span&gt;     {   &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum25&quot;&gt;  25:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;case&lt;/span&gt; GST_STATE_CHANGE_READY_TO_NULL:&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum26&quot;&gt;  26:&lt;/span&gt;             gst_mp3dec_reset(dec);&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum27&quot;&gt;  27:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum28&quot;&gt;  28:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum29&quot;&gt;  29:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum30&quot;&gt;  30:&lt;/span&gt;     }   &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum31&quot;&gt;  31:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; ret;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum32&quot;&gt;  32:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum33&quot;&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum34&quot;&gt;  34:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; gst_mp3dec_clas_init()&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum35&quot;&gt;  35:&lt;/span&gt; {    &lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum36&quot;&gt;  36:&lt;/span&gt;     ...&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum37&quot;&gt;  37:&lt;/span&gt;     gstelement_class-&amp;gt;change_state = gst_mp3dec_change_state;&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum38&quot;&gt;  38:&lt;/span&gt;     ...&lt;/pre&gt;
&lt;!--CRLF--&gt;

      &lt;pre style=&quot;border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px&quot;&gt;&lt;span style=&quot;color: #606060&quot; id=&quot;lnum39&quot;&gt;  39:&lt;/span&gt; }     &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
  &lt;/div&gt;

  &lt;p&gt;如剛所說，當狀態從 NULL 轉到 READY 時 (GST_STATE_CHANGE_NULL_TO_READY)，插件要做初始化，配置記憶體等。反過來當狀態從READY轉到NULL時(GST_STATE_CHANGE_READY_TO_NULL)，就要釋放資源。為了避免當主要的執行續(main thread)還在運作時，就因為收到「停止」的指令，從 PLAYING 切進 NULL ，把資源都給釋放掉，所以狀態轉換要分成兩個 switch-case 來處理。&lt;/p&gt;

  &lt;p&gt;我們可以試著討論一下 pipeline 如此處理狀態切換的理由是什麼。想像你手上有一個濾水器，一個水桶的污水和一個乾淨的水壺。當你要開始過濾污水的時候，你會不會先檢查水壺已經正確地接在濾水器的另一端了？要開始把污水往下倒時，會不會先把濾水器的開關打開，會吧？水壺和濾水器都「READY」了以後，才開始把污水往下倒。如果你使用濾水器的方法和我不同，請麻煩接受這個「由下而上READY」的想法，因為這是 gstreamer 在做開關控制的精神。&lt;/p&gt;

  &lt;p&gt;反過來看，如果要停止濾水，該是怎樣的順序？沒錯，把上面過濾的順序反過來。先停止倒污水，再關閉濾水器，最後才蓋上水壺。這樣的流程要怎麼用程式碼表達呢？&lt;/p&gt;

  &lt;p&gt;Gstreamer 只提供了一個函式來處理整個 pipeline 開始和結束的動作，在 mp3dec 這個例子中，就是我們註冊進去的 gst_mp3dec_change_state。只有一個函式的話，還要兼顧「開的時候下游先開，關的時候上游先關」的原則，最簡單的做法就是：播放初始時先替自己做初始化，準備好了以後通知上游。播放結束時先通知上游，再釋放自己的資源。所以，就會出現上面那段程式碼的寫法。&lt;/p&gt;

  &lt;p&gt;當 pipeline 的狀態被切換到 PLAYING 的時候，gstreamer 會開始做 preroll (提取影音資料進緩衝區)，此時 _chain() 函式就會被觸發。主要的資料處理工作就是在 _chain() 裡完成，在「拉」模式的情況下，主要的資料處理工作則是在 _loop() 裡完成，以後會說明。因為 _chain() 裡面牽涉到 mpeg audio 解碼的程式，和 libmad 調用的部份、處理緩衝佇列等等比較複雜，將另開篇幅說明。&lt;/p&gt;
&lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/09/gstreamer-plugin_30.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-3800576051802834600</guid><pubDate>Thu, 24 Sep 2009 08:33:00 +0000</pubDate><atom:updated>2009-10-08T23:42:47.406+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">技術</category><title>看見 gstreamer plugin 的第二步</title><description>&lt;p&gt;上一篇我們把一些編譯 gstreamer 插件的環境給準備好，也透過 gst-inspect 看到新加入的插件 ( 在上一個例子中是「mp3dec」) 的屬性，接著就要親眼見證它的運作了。&lt;/p&gt;  &lt;p&gt;先打開 gstmp3dec.c 找到 &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;kbd&gt;g_printf(“I&#39;m plugged, therefore I’m in.\n”);&lt;/kbd&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;這一行，改一下文字，然後跳出重編，執行&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;kbd&gt;gst-launch filesrc location=/path/to/file.mp3 ! mad ! mp3dec ! alsasink &lt;/kbd&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;有沒有看到一行你剛剛改的字拚命洗畫面，那就是插件運作的明證。接著我們要開始改寫這個插件，來讓它取代 mad。所以測試方法也很明確，就是要讓&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;kbd&gt;gst-launch filesrc location=/path/to/file.mp3 ! mp3dec ! alsasink &lt;/kbd&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;這指令可以正確地播出 file.mp3 的內容。這個指令會在接下來的測試過程中不斷的被執行。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;接著編輯 gstmp3dec.c (這個檔案也會不斷的修改)，尋找 GstStaticPadTemplate ，會找到已經被自動產生的兩個 pad：sink_factory 和 src_factory 。還不知道 pad 是什麼沒關係，先想像它是插件的「開口」就好；上一篇文章我們有提到所謂的 pipeline 的箭頭是有方向性的，資料從源頭 (檔案、網路…等) 讀取出來後，從讀取的插件開始(即：file-source)，到播送的插件出去(即：audio-sink 和 video-sink)。&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/images/simple-player.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/images/simple-player.png&quot; width=&quot;640&quot; height=&quot;241&quot; /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;透過插件的「開口」，資料才能在插件之間流動，就像濾水器的進水閥和出水閥，控制流進流出的水量、速度等等。不過 gstreamer 的水閥比較複雜一點，它必須再去判斷多媒體資料流的屬性，動態地決定輸入的多媒體檔案要用哪一個濾水器來承接。在這裡水閥就是 &lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html&quot; target=&quot;_blank&quot;&gt;GstPad&lt;/a&gt; ，而標示水閥的「屬性」就是 &lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html&quot; target=&quot;_blank&quot;&gt;GstCaps&lt;/a&gt;。進水閥我們稱為「sink pad」，出水閥我們稱為「source pad」，所以按上圖來看，file-source 沒有「安裝」「sink pad」是因為他在進水的那一條路是透過系統的 file I/O 來處理，不屬於 gstreamer pad 的範疇；同樣的 audio-sink 和 video-sink 沒有「安裝」「source pad」是因為在播放聲音和影像的部份是透過系統的 A/V renderer。而在中間的插件們，最基本的型態是一個進水(後稱 sinkpad )一個出水(後稱 srcpad )，像 decoder ；而 demuxer 要把 audio/video (或更多，視封裝格式而定) 資料拆開給各自的解碼器，就會有一個 sinkpad ，多個 srcpad ，因為責任重大，demuxer 寫起來也比較複雜。&lt;/p&gt;    &lt;p&gt;解釋完插件和 pad、caps 之間的關係後，我們先透過程式去設定 mp3dec 的屬性。為求簡單，我們照抄 mad 的屬性就好，所以 sink_factory 和 src_factory 會改成如下&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;/p&gt;      &lt;pre&gt;&lt;kbd&gt;
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE (&amp;quot;sink&amp;quot;,
    GST_PAD_SINK,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS (&amp;quot;audio/mpeg,   \
        mpegversion=1,      \
        layer=[1,3],        \
        rate={8000,11025,12000,16000,22050,24000,32000,44100,48000},\
        channels=[1,2]&amp;quot;)
        );

static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE (&amp;quot;src&amp;quot;,
    GST_PAD_SRC,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS (&amp;quot;audio/x-raw-int,  \
        endianness=1234,    \
        signed=true,        \
        width=32,           \
        depth=32,           \
        rate={8000,11025,12000,16000,22050,24000,32000,44100,48000},\
        channels=[1,2]&amp;quot;)
        );&lt;/kbd&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;重編後再用 gst-inspect 檢查一下就會發現在 Pad Templates 裡所描述 sinkpad 和 srcpad 的屬性都更新了，看的出來 mp3dec 接受的輸入格式是 mpeg1 audio layer3 的資料流，輸出 pcm 。設定這些屬性的目的就跟前述一樣，讓 gstreamer 在自動產生 pipeline 的時候可以按照我們設定的格式找到正確的插件來處理資料。(想像一下濾水器的進入出入閥標示著這個是濾工業用水、那個是濾農業用水、另一個是濾家庭用水，口徑多少、每單位吃水量多少…等等等，如此就算濾水器的功能一樣，而相對應的口徑、水量不符合，gstreamer 也不會接錯。)&lt;/p&gt;

  &lt;p&gt;然而，這邊設定的 caps 只是一個樣板，告訴上下插件輸入和輸出資料的格式及相關屬性的「範圍」，做為建立 pipeline 時參考的依據，當檔案開始播放時，真正的資料流的格式、屬性要等解碼完才知道。換言之，caps 的設定不一定是在 template 裡寫死就好，有時要另外動態產生運行時對應的 caps 並指派給 pad ( 包括 sinkpad 和 srcpad )。&lt;/p&gt;

  &lt;p&gt;在處理 sinkpad 和 srcpad 的程式都還沒寫之前就先設定 caps 其實並沒有具體的功能，但我覺得這樣解釋比較不會搞不清楚或混淆 caps 的目的和重要性。&lt;/p&gt;

  &lt;p&gt;當 caps 被設定好後，我們再來執行看看前面執行過的指令&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;&lt;kbd&gt;gst-launch filesrc location=/path/to/file.mp3 ! mad ! mp3dec ! alsasink &lt;/kbd&gt;&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;有沒有發現結果不一樣了？此時音樂不會播，程式直接中斷並吐出一行字：&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;&lt;kbd&gt;WARNING: erroneous pipeline: could not link mad0 to mp3dec0&lt;/kbd&gt;&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;原因很簡單，就是 gstreamer 發現 mad 的輸出閥 (srcpad) 和 mp3dec 的輸入閥 (sinkpad) 的 caps 不符合。所以跑都不跑就直接跳掉了。&lt;/p&gt;
&lt;/span&gt;</description><link>http://hbtsai.blogspot.com/2009/09/gstreamer-plugin_24.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-1854364196793143935</guid><pubDate>Wed, 23 Sep 2009 09:35:00 +0000</pubDate><atom:updated>2009-09-28T09:54:52.529+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">技術</category><title>踏出 gstreamer plugin 的第一步</title><description>&lt;p&gt;搞 gstreamer 插件已經好一陣子，好不容易勉強算的上知道怎麼去寫一個插件，嚴格說來看 gstreamer 寫的 plugin writer’s guide 應該是看不懂要怎麼接著去叫 gstreamer 做事的，網路上找的到的資料，也絕大多數是在講 integration layer (也就是純 player 啦) 的部份，而對於 development layer (也就是 pipeline 裡的 element) 該怎麼撰寫付之闕如。我打算趁手上的 wmv 插件告個段落時寫個筆記，算是為了交流，也算是幫自己重新確認觀念無誤。&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Gstreamer-logo.svg/530px-Gstreamer-logo.svg.png&quot; /&gt; &lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;這回我想拿 mp3 檔案做例子，用一個比較普遍而且廣泛應用的格式做練習有很多好處，一來沒有影像，就先省去同步的問題，也不會有 cpu / bandwidth 不夠的問題 (因為 video 的 bitrate 比 audio 高出很多)；二來測試檔案滿地爬，而且橫跨多種不同參數的壓縮格式，更好的是可以互相參照的播放器也是滿地爬(一不小心就踩到的程度…搭捷運時年輕人幾乎人手一台 player)，抓蟲或對照功能時很好用。&lt;/p&gt;    &lt;p&gt;gstreamer 提供了一個 command line 建立 pipeline 的工具：gst-launch。給不同的參數可以自動或手動的方式去播放一個多媒體檔，這個工具說方便很方便，說不方便也的確有點麻煩。方便是一個指令就可以叫它開始播檔案，省去圖型化介面的慢和滑老鼠的動作；不方便是因為它除了 play 以外沒有別的 navigation command，不像 mplayer 還有給 hotkey 快轉 (快轉對於看謎片來說是很重要的呀!!)。至於所謂的 pipeline，長得就像這樣&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/images/simple-player.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/images/simple-player.png&quot; width=&quot;520&quot; height=&quot;196&quot; /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;箭頭和方塊組成的結構就稱為 pipeline，而每個方塊 (element) 都負責某一部份的資料處理，稱為 element。這和 DirectShow 的 graph 是相當神似的。有 DirectShow 基礎的人應該會比我還快了解 gstreamer 吧。&lt;/p&gt;    &lt;p&gt;總之，自動建立 pipeline 的指令是如此：&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;kbd&gt;gst-launch playbin uri=file:///path/to/file.mp3&lt;/kbd&gt;&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;而手動建立的話可以這麼簡單：&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;kbd&gt;gst-launch filesrc location=/path/to/file.mp3 ! mad ! alsasink&lt;/kbd&gt;&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;其中的 mad 就是 gstreamer 會 runtime 去 load 的 element ，也就是接下來會深入去講的主題。如果你的系統缺少了解碼 mp3 必要的函式庫或 gstreamer 針對 mp3 的插件，那就會播放失敗。開源的 mp3 函式庫很多，我們就用 mad (mpeg audio decoder)。以 ubuntu 為例，安裝必要的函式庫很容易：&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;kbd&gt;sudo apt-get install libmad0 gstreamer0.10-plugins-ugly&lt;/kbd&gt;&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;如此應該就可以順利聽到 mp3 的音樂了。其他必要的 element 像是 audio renderer 通常預設就會安裝了。知道了這些工具後我們就可以開始以 mad 為師的 gstreamer 插件學習過程。&lt;/p&gt;    &lt;p&gt;首先，我們最好用 gst-inspect 看看 mad 這個插件的一些資料，這些都會是接下來寫程式或多或少會用到的。&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;kbd&gt;gst-inspect mad&lt;/kbd&gt;&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;我們會看到一些對這個插件的描述，pad template 的 capabilities 等等，&lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/section-basics-types.html&quot; target=&quot;_blank&quot;&gt;gstreamer 的文件&lt;/a&gt;裡有比較清楚的列出哪些 properties 對 capabilities 的描述和對應的意義，此處就不多說。&lt;/p&gt;    &lt;p&gt;gst-launch 和 gst-inspect 是開發插件時滿重要的兩個工具，玩熟練後我們就可以開始實作自己的 mp3 gstreamer 插件。gstreamer 很體貼的在網站上擺了一個插件的 template，我們就從這個 template 開始走下去。&lt;/p&gt;    &lt;blockquote&gt;     &lt;pre&gt;&lt;kbd&gt;git clone git://anongit.freedesktop.org/gstreamer/gst-template.git&lt;/kbd&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;下載後在作業目錄會找到一個 gst-template 的資料夾，然後進到 gst-plugin/src 執行 &lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;&lt;kbd&gt;../tools/make_element mp3dec&lt;/kbd&gt;&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;這個 tool 會用 mp3dec 為名產生一個 gstreamer plugin 的 template。這兩件事情就是在做 gstreamer plugin writer’s guide 的 section 3.1, 3.2。&lt;/p&gt;

  &lt;p&gt;接著，我們要「立刻」看到自己寫的 plugin 被 gst-inspect 找到，這要怎麼做呢？&lt;/p&gt;

  &lt;p&gt;首先，改寫 gst-plugin/src/Makefile.am，讓他編譯我們的程式，用文字編輯器把 gstplugin 這個字串換成 gstmp3dec。接著就像一般我們在編譯開源專案一樣，藉 autotool 來產生 Makefile，執行 gst-plugin/autogen.sh 。接著到 gst-plugin/src 下 make，就會在 gst-plugin/src/.libs/ 下面看到 libgstmp3dec.so，這個就是我們的 gstreamer 插件。你可以用&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;&lt;kbd&gt;GST_PLUGIN_PATH=/path/to/gst-template/gst-plugin/src/.libs/ gst-inspect mp3dec&lt;/kbd&gt;&lt;/p&gt;
  &lt;/blockquote&gt;

  &lt;p&gt;來檢視這個插件的細節，就像之前我們檢視 mad 一樣，會發現很多資訊在 mad 裡面有的，在 mp3dec 這個新生的插件裡看不到，那些就是我們要慢慢加上去的功能。&lt;/p&gt;
&lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/09/gstreamer-plugin.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-9095882457770111461</guid><pubDate>Wed, 22 Jul 2009 04:21:00 +0000</pubDate><atom:updated>2009-07-22T12:21:09.046+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">music</category><category domain="http://www.blogger.com/atom/ns#">音樂</category><title>7/12 《卡門》</title><description>&lt;p&gt;早在二月時，就有聽說愛樂在徵《卡門》的歌隊。因為《卡門》的檔期和兩廳院歌劇工作坊的《頑童與魔法》剛好撞期，想必彩排時間也會撞在一起，為了能隨時支援寶貝，放棄演出《卡門》的機會雖然可惜，但看完《卡門》以後，竟有種「還好我沒在舞台上」的感覺。因為這次NSO製作的《卡門》最大敗筆就是男歌隊，我如果當初運氣好考上了，不就自動升格為炮灰…。&lt;/p&gt;  &lt;p&gt;男歌隊到底有什麼缺點晚點再說，歌隊畢竟是背景，主角的表現才是重點。這次《卡門》的製作相當大手筆，不只請來 A/B cast 的主角(卡門、荷西和艾斯卡米洛)，還請來整個雪莉歌劇院的劇組，採用傳統風格帶點創新詮釋的製作(好像是因為這個製作是有版權的，要買就要買全部)，身段充滿力道的舞者身材也超優的，這次的製作連馬都搬到舞台上，整個熱鬧非凡，成功獵取了普羅大眾的心。不知道是卡門這個梗太好，還是NSO有口碑，還是難得可以看到國外歌手來唱歌…門票早一個多月前就賣光光了，我半個月前開始求票是半張也求不到，還好，這世界總是會有那種「可遇不可求」的事給我遇到了!!(大心)世紀無敵感謝葭儀老師的讓票和子苡的第一手情報，讓我有機會進場拜見卡門的魅力。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.artsticket.com.tw/Images/Products/9582.jpg&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;display: block; float: none; margin-left: auto; margin-right: auto&quot; src=&quot;http://www.artsticket.com.tw/Images/Products/9582.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;我看的是 7/12 的 B cast ，據看過 A cast 的同事 D 說，Kirsten 演的卡門很大、很大、很大隻…看著無法聯想到充滿魅力的女人，至於唱的好不好，怎麼個好法，對他來說都是好聽。(我想對於歌劇比較沒有經驗的人因為不知道如何聽音樂，都會把重點放在戲劇的效果上，這樣的結論其實無可厚非。)，相對於「很大、很大、很大隻」的卡門，Viktoria 應該算是非常對味的卡門吧。&lt;/p&gt;    &lt;p&gt;又唱又跳的卡門本來就是非常吃重的角色，然而同事 D 更驚訝於林鄉雨纖細的身體可以叫出漂亮的花腔，無視於演唱卡門的人其實需要更多技巧和訓練 XD。Viktoria 的身材要是和林鄉雨或其他台灣的歌者舞者比起來大概是和「纖細」沾不上邊，但以西方歌手的標準來看，她算是瘦卡門了，而且調情的動作更增說服力，舞蹈動作也充滿力道，音色從第一幕到第四幕也維持相當的穩定度，增加了不少可看性。題外話，對於古典音樂的入門者來說，聽聲樂真的是只會聽高音…真是不利於中音域的角色在市場上的發展呀。(嘆)&lt;/p&gt;    &lt;p&gt;B 卡的荷西是 Justin，一個聲音很柔軟的男高音，和一些錄音名盤裡高亢嘹亮充滿爆發力的男高音比起來，Justin 的聲音反而帶出荷西憂柔寡斷的性格，展現出被人牽著鼻子走又沒辦法控制情緒的無能男人的陰柔氣質。雖然算不上是討喜的男高音，但別有一番戲劇效果。聽說他的穩定性也比 A 卡的高，聲音撐到第四幕也不會變形。但就舞台的表現來說，聚光燈反而完全不在荷西身上，可能跟 Justin 身高不夠和 Viktoria 匹配有關，再加上艾斯卡米洛實在太高太帥氣了，想讓人不喜歡也難。聽說 Richard 也是身材不夠巨大，和 Kirsten 對戲很吃虧，也給同事 D 「為什麼卡門會愛上荷西這種型？」的大問號。唉，這是歌劇呀! 歌劇! 不是八點檔 soap opera … 冏rz 。&lt;/p&gt;    &lt;p&gt;艾斯卡米洛，喔，真是令男人生氣的典型呀。高大(一個躍步就可以跳上桌面…聽說身高超過一米九)，帥氣，聲若洪鐘，音色堅定而神氣，動作大闔大放，而且還開外掛，騎著馬出場…總覺得是女人就要愛上這種男人。如果說歌劇裡也要有花瓶角色，在這次的《卡門》裡就非艾斯卡米洛莫屬了(誤)。這個角色的立體感不高，但有名的鬥牛士之歌也不是等閒人可以唱的。一邊擺出鬥牛舞的 pose，一邊唱出勝利宣言，不管是牛還是女人，都是他要用「刺刀」征服的對像。(啊？！)&lt;/p&gt;    &lt;p&gt;再來就要說到台灣土產的歌手了，在這中西合璧的舞台上，一點也不輸進口的歌手。最讓觀眾心折的應屬陳美玲，她詮釋的米凱拉簡直清純又痴情又勇敢的讓人心痛呀。尤其最有名的一曲詠嘆調「我無所畏懼」唱罷，觀眾鼓掌不休，不得不再多讚幾次，那是真的唱進人心裡的聲音呀，和錄音製作裡雄壯大管又迪娃的歌手相比，陳美玲唱活了米凱拉的嬌弱與決心，或者說…單純到甚至傻氣的單闖賊窩，還要大喊「我不怕我不怕」的那種輕透感。聽過陳美玲後再去聽錄音裡大牌歌手所演唱的米凱拉，頓時覺得這些大牌歌手的唱法比較像荷西他老母來討人…。題外話，唱出這般動人歌曲不僅需要純熟的技巧，還要有充滿渲染力的聲音，我自賣自誇地覺得心如已具備了演出米凱拉的特質，只是還需要時間練的大管一點^^。&lt;/p&gt;    &lt;p&gt;廖聰文向來詮釋充滿喜感的角色都很成功，從《喬望尼》的僕人，《蝙蝠》的法蘭克，唱到《卡門》的祖尼卡，覺得現在的他不管唱什麼都會帶著戲謔的味道。王凱蔚的戲份就比較少了，滿可惜的。演強盜的陳忠義和林中光，在服裝上就多了幾分神祕的色彩，加上戴了頂帽子和斗篷，更添了幾許義賊的感覺，只是劇情上不是這麼一回事 XD。在舞台的視覺效果來說，阿光的身高就加了很多分數，和其他主角比起來(艾斯卡米洛除外)，跟卡門站在一起就比較有齊平的氣勢(甚至有要調情的感覺…為什麼呢？)，穿起那一身盜賊裝扮，也不會變得賊頭賊腦，反而有點像蘇洛。&lt;/p&gt;    &lt;p&gt;林鄉雨和石易巧也是國內年輕一輩很有前景的歌手，聲音很完整，舞台上也很放的開，看到他們和鬥牛士那麼明目張膽的調情，比&lt;a href=&quot;http://hbtsai.blogspot.com/2009/07/711.html&quot; target=&quot;_blank&quot;&gt;《頑童》裡的黑貓白貓&lt;/a&gt;還要超過，真的令人看得連下巴都撿不回來…。可惜和卡門的三重唱可能為了製造音量或突顯音色，反而在音樂的整體上並沒有融合的感覺。&lt;/p&gt;    &lt;p&gt;再來說到女歌隊，天，我不知道要怎麼形容這群女人，在第一幕又潑又浪的令人看得很「爽」，廣場上處處有野合的影子，還有演員和舞者穿插其中，活生生是一群已然「釋放自我」的女人。第二幕酒館裡的打鬧也很活潑，轉身變成一群發花痴想給鬥牛士「鬥」的模樣。最重要的是，為了製造這些鮮活的劇情，女歌隊仍把音樂掌握的很好，邊演邊唱本就不易，這裡真的要給女歌隊大大的鼓掌。不過根據可靠消息指出，這些女人在後台化妝時就已經起乩了…。&lt;/p&gt;    &lt;p&gt;還有兒童合唱團。小孩子是舞台的補藥也是毒藥，乖乖演戲的話效果十足，在舞台上跑跑跳跳玩開來，就把場面弄得很熱鬧。但要是一不小心有人出了岔子，緊張了，跑錯方向了…就可能在台上哭給你看，亂了整場戲，變成毒藥。運氣很好的，或者說，訓練有素的，這次的兒童合唱團表現很到位，音樂「不講究到很像小孩子唱歌」，這是好的，因為音準的基礎還在，只是和聲整個很雜，吵鬧的完全沒有美感可言，十足十的野孩子，很棒。導演還有安排小孩子惡搞警察，真的是很好看的橋段…若是這群小鬼唱歌像木十字，這齣戲就完了。XD&lt;/p&gt;    &lt;p&gt;問題大的來了…&lt;/p&gt;    &lt;p&gt;男歌隊的問題不是只有演的很無趣，最嚴重的是和聲嚴重歪斜，凡是鬥牛士進來的男聲合唱全部爛掉，因為那時連樂團也沒有聲音，男歌隊完全靠自己，於是起音整個自動降兩個全音…樂團接著一進來就錯得更明顯，這種情況下，就算唱對的人聽起來也變成唱錯了，而聽在觀眾耳朵裡更是痛苦的要命。男歌隊的動作也很呆板遲滯，硬要說是軍官動作比較僵硬就算了，連和女工調情，或著到第二幕在酒館嬉鬧，看起來都很呆板，數拍點做動作，真的讓人無言，若不是有男舞者在台前搶戲，卡門早就在台上乾死了(因為卡門和男舞者調情的片段頗鹹溼，如果換成和男歌隊那些軟趴趴的方式調情…早就乾了)。男歌隊請自己面壁去，你們是整場最難看的部份。&lt;/p&gt;    &lt;p&gt;另外一個很難看的地方是結尾，荷西要殺卡門的片段。把卡門揪在地上拖著的橋段不錯，很有fu，可是為什麼，為什麼到了最後，導演要荷西把小刀藏在褲管裡呢？拿刀的姿勢既醜又好笑，明明是充滿殺機的一場戲，居然因為這種小地方引來觀眾的哄堂笑聲，實在太煞風景了，小刀哪裡不好藏居然藏到褲管裡去？如果是我來安排就會覺得腰間就很恰當。&lt;/p&gt;    &lt;p&gt;而且，當刀子刺進卡門身體裡時，完全沒有 hint，兩個人卡在一起的動作也不知道是插進去了沒，總覺得卡門死的很無力。不過心如對後面這點看法不同，她說這樣無聲而且突然、令人錯愕的、「啊？就這樣」的死更有諷刺的效果，反而是我提議的場燈轉紅，或掉下紅絲巾的作法太老派。她的解釋也滿有道理的，我的風格果然一整個譁眾取寵。&lt;/p&gt;    &lt;p&gt;這次《卡門》的製作引起民間熱烈的參與實在令人高興，雖然不乏湊熱鬧的人，但總算是把歌劇再一次成功的包裝推銷。同事 D 看完後難掩興奮之情，還會在辦公市宣傳鬥牛士的帥氣，還問了我幾個有點奇怪的問題，不知道初次接觸歌劇的人是不是也會問類似的問題，我就多開點篇幅整理如下。&lt;/p&gt;    &lt;p&gt;Q：為什麼卡門要先愛荷西，又移情別戀艾斯卡米洛？那她對荷西是真心的嗎？&lt;/p&gt;    &lt;p&gt;A：想像一下妳是校園裡人見人愛的公主，有一天遇到一個對妳不理不睬的小伙子，妳覺得有趣就想逗他，剛開始他還很矝持，後來終於棄守未婚妻而對妳表達愛意。但是這個死板的傢伙嘴巴說愛你，心裡又放不下工作，沒辦法，因為太窮了，來來去去就一套說詞，令人生厭。此時有個開雙 B (馬) 的帥哥 (真的很帥) 出現，問妳要不要上他的車。妳會怎麼決定？&lt;/p&gt;    &lt;p&gt;Q：為什麼第一幕大家都在呼喚卡門出場呀？她在劇情裡有什麼特別的身份嗎？&lt;/p&gt;    &lt;p&gt;A：按劇情設定，她很正，又很豪放。想像一下一群男人去夜店，舞台上先有DJ放舞曲，一群辣妹跳舞熱場，但其實大家都在等待今晚佳賓：小澤馬莉亞。等不急會怎樣？怒吼呀~&lt;/p&gt;    &lt;p&gt;Q：卡門對荷西是真愛嗎？還是艾斯卡米洛是她的真愛呢？&lt;/p&gt;    &lt;p&gt;A：… (不想回答)&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/07/712.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-4216881063886969871</guid><pubDate>Tue, 21 Jul 2009 16:23:00 +0000</pubDate><atom:updated>2009-07-22T12:18:40.114+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">music</category><category domain="http://www.blogger.com/atom/ns#">音樂</category><title>7/11《頑童與魔法》</title><description>&lt;p&gt;雖然我向來否認自己愛發閃文…但為了避免瞎了人家的可魯賠不起，還是先警告一下好了：&lt;/p&gt;  &lt;p&gt;以下有「疑似」閃文，去死團團員請小心進入。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;寶貝從入選「兩廳院歌劇工作坊」後，每個禮拜六都要到兩廳院上課。《頑童驚夢》開始彩排後，寶貝更是每周台北龍潭來回跑，有時開車有時坐亞聯，回到家往往十一點多了。而且溝通老師調課、買代課老師鐘點等等犧牲是必然，偶爾遇到段考、借課、畢業典禮天外飛來則是運氣好，撿到一天「比較不累」。同樣參與製作的其他聲樂家們，也付出了相當多的心力兩頭燃燒，這些努力，都在 7/10-7/12 的製作中看見了成果。&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://www.artsticket.com.tw/Images/Products/11333.gif&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;display: block; float: none; margin-left: auto; margin-right: auto&quot; src=&quot;http://www.artsticket.com.tw/Images/Products/11333.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;歌坊的曲目開了很多，主打是拉威爾的作品：《頑童驚夢》(L&#39;enfant et les sortilèges)，調皮搗蛋的小男孩不愛寫功課，鬧脾氣把家裡弄的亂七八糟…(&lt;a href=&quot;http://tw.classf0001.urlifelinks.com/css000000005257/cm4k-1134306844-233-5547.doc&quot; target=&quot;_blank&quot;&gt;詳情參考&lt;/a&gt;)。下半場則是歌劇選粹，按入選歌手的聲部和音色挑選的曲目。一群傑出的音樂家於是在小小的實驗劇場裡，帶給觀眾滿滿的兩個半小時的歌劇嚮宴。&lt;/p&gt;    &lt;p&gt;和音樂會型式比起來，我還是比較喜歡完整呈現歌劇片段的製作。嗯，白話文來說就是，我喜歡兩廳院的歌坊更勝愛樂歌劇坊，連刑子青在愛樂歌坊做開場時也會說溜嘴，把歌劇坊說成歌劇工作坊。不過我覺得這種競爭是好事，因為雖然兩個龐大的音樂集團，同時弄出個給年青聲樂家發展機會的歌劇製作，頗有互別苗頭的意味。但兩種不同型式的製作推出，讓觀眾有機會選擇喜歡的製作去欣賞，也給聲樂家更多演出的機會。就演出的品質上，我還是很主觀的投兩廳院的歌坊一票^^。&lt;/p&gt;    &lt;p&gt;但我不是平白無故抬兩廳院而貶愛樂，因為在我的評分表上，《頑童與魔法》還更優於同屬兩廳院製作的《卡門》(Carmen)，原因沒別的，就是《頑童》比《卡門》精緻。這樣評斷其實有點不公平，因為小劇場本來就是走精緻路線，而《卡門》這種大製作就是要搞氣勢的。製作大雖然令人鼓掌叫好的梗也比較多，但反而破綻也越多越明顯，就是有些破綻讓人難以忍受，令我決定把《卡門》再往下打(另一個原因是：票好貴…)。但本文不是要批《卡門》的，細節就另開專文再論。&lt;/p&gt;    &lt;p&gt;《頑童驚夢》的音樂乍聽之下會有點難以接受，拉威爾嘛。就像印像派的畫也需要花時間研究一下才懂得欣賞一樣，多聽幾次，就開始習慣而且喜歡拉威爾式的音樂。拉威爾用音樂去模仿有形物體的感覺真的很有想像力，尤其是場景切到花園那一段，大家用人聲營造花園的蟲鳴鳥叫，聽來仿如身歷其境。&lt;/p&gt;    &lt;p&gt;因為一直和心如一起聽彩排錄音，《頑童》的音樂我已經聽熟了，多餘的心思可以好好欣賞舞台和其他人的表現。簡單講，看到阿信和筱婷調情的茶壺茶杯，看到思亨和有席纏綿的黑貓白貓…只能說這些聲樂家，不只賣力，連命都掠下去了。心如的《天堂與地獄》也穿著包得緊緊的性感睡衣，蹬著一雙毛茸茸的拖鞋出場，走可愛路線，用打情罵俏的方式和蒼蠅調情。要是照德賽的版本演，我會衝上去扒聖哥的皮…。(還好導演也接受了她的詮釋…) &lt;/p&gt;    &lt;p&gt;心如飾演的頑童很可愛，表情很豐富，聲音的穩定性和完整性也很高，不只我聽得開心，當代來捧場的諸位也都愛死她的演出了。子苡說燈亮看到心如趴在地上就覺得很開心，聽到心如的歌聲，更有一種熟悉的幸福感，令人聽了不自禁的微笑了起來，這話十足十地說進我心坎裡去了。可惜不能一次看完所有心如的製作，因為 7/12 沒有上演 Nicolai 心如和思亨重唱的片段(不過我有彩排的錄影~ 哇哈哈)。&lt;/p&gt;    &lt;p&gt;小劇場的舞台也很棒，服裝設定也很到位。本來會擔心是不是要按角色重新訂做服裝，那真的會累死服裝設計師；人型生物的衣服還算簡單，但，扶手椅、茶壺、松鼠、夜鶯…等等等的衣服要怎麼做呀…？還好服設的想像力非常豐富，概念式的去定裝，像有席穿著像鐘錶師傅飾演的「鐘」，筱婷穿著旗袍的「茶杯」(瓷器)，拿著紅色樹枝表現流出樹汁的「樹」…等等。還有舞台設計也很棒，場景的設定很到位，換景也很流暢。每個道具在不同的劇碼裡都充份的運用到，搭配出很有說服力的場景。導演特地故意安排一個換景的橋段，把換景的動作「演」給大家看，可能就實用性來說換景耗時，用演的把時間填滿，但搭配起曾志遠搞笑的笑話，整個很有跳tone的喜感，也抒解了看戲的人的緊張感。&lt;/p&gt;    &lt;p&gt;實驗劇場是個標準的黑盒子，方形的空間裡要塞下舞台、後台和觀眾席，觀眾席和舞台當然就非常靠近，和大舞台不同，距離越近帶給演員的心理壓力也越大，歌坊在這裡演出也著實挑戰演員控制緊張感的功力。然而，是演員們的表現令人激賞，自然而且用心，演員之間長時間密集的排練也建立了非常好的默契。我覺得「用心」是很重要的一點，因為每個角色在舞台上都是目光焦點，對自我的要求就會很高，舞台也就生動了起來。&lt;/p&gt;    &lt;p&gt;小劇場裡當然也不會有足夠的空間放下樂團，這場演出最多只用到鋼琴、大提琴、長笛和兼拉小提琴的指揮。台下聽來覺得台上唱作俱佳，行雲流水，但聽說楊智欽已經被這些歌手們搞到快把指揮棒捏斷了…。聽說上一屆的歌坊還有幾位老師級的歌手像林慈音、林中光，整個氣氛沉穩多了，這一屆都是三十歲上下的年輕歌手，玩在一起簡直是要把戲劇院給翻了過來。但這樣演戲帶著遊戲的心情，也拉近這些歌手們的距離，私底下還會約出去玩、聽音樂會，為未來的合作鋪路。&lt;/p&gt;    &lt;p&gt;整體來說，歌坊這次《頑童與魔法》的製作令人印像深刻，精緻、創新、活潑、趣味，帶給我很多滿足感。因緣際會，我也多認識了一些聲樂家。&lt;/p&gt;    &lt;p&gt;還有，我的寶貝永遠是最棒的^Q^。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/07/711.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-4572307145142769488</guid><pubDate>Sun, 12 Jul 2009 05:19:00 +0000</pubDate><atom:updated>2009-07-12T13:23:13.970+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>同理心</title><description>&lt;p&gt;生活在台灣這個地方，什麼奇形怪狀的東西到了此地通通不奇怪，會有每天當機停駛的捷運，會有基座裸露的纜柱，會有禁止兒子探視母親的醫院，會有接了訂單又賴帳的購物商城，會有亂編故事的媒體…等等等。&lt;/p&gt;  &lt;p&gt;坊間很多教人溝通的書都說，對話的過程中要保持「同理心」，也就是「穿上別人的鞋子」，和對方站在同樣的角度思考，「如果我是他的話，對我來說最重要的是什麼？」「如果我是他的話，什麼樣的條件我可以接受？」「如果我是他的話，我會希望對方如何回應？」，如此方式思考，可以有效抓住對方的出發點，增進溝通的效率。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;然而，善於標籤化的中國人和台灣人，並無法理解同理心是什麼，只知道看標籤說話。因此最近被頻繁拿出來討論的「吸菸和不吸菸的人」「騎機車和開車的人」就是一個是典型的標籤化的爭論。因為把香菸和人的關係定位為「抽」和「不抽」，所以「抽菸」的人就如何如何，「不抽菸」的人就如何如何。於是抽菸的人聚在一起數落政府的無情無義，不抽菸的人聚在一起痛罵抽菸的人沒有公德心。然而，問題真的在抽不抽菸嗎？&lt;/p&gt;    &lt;p&gt;同樣的道理，出現在馬路上的交通工具，就分為「機車」和「汽車」。於是騎機車的人總是痛恨在兩公尺內就橫跨三個車道的計程車和公車，開車的人也覺得在車陣中穿梭的機車騎士很煩人討厭。問題是，用路安全問題，真的跟你是開車還是騎車有絕對關係嗎？如果開車的人照規矩開，騎車的人照規矩騎，真的會很不方便，很危險嗎？&lt;/p&gt;    &lt;p&gt;問題，在於台灣人自我本位主義作祟，就像納粹一樣，覺得貼上某種標籤就會產生認同，對自我群體的認同，產生對對立群體的敵意，這是標籤化最可怕的後果，也是正在台灣社會上演的組織行為實驗。標籤化產生認同和狂熱的心理學討論可以參考《路西法效應》一書，我就不獻醜。&lt;/p&gt;    &lt;p&gt;我對於菸的看法以前就表達過，我極端痛恨抽菸的人，更明確一點說，是「正在抽菸而且不顧四周有人不抽菸的人」，此間例子最簡單的就是：邊抽菸邊走路、開車或騎車的人。抽不抽菸基本上是與我無關的事，我想對於抽菸的人來說，不抽菸的人對他來說也沒有什麼差別，但如果抽菸的人不顧旁人地吞雲吐霧，那就是最失敗的人格，而我們的確應對此譴責。抽菸的人可以抽，但為顧及不抽菸的人的權益，應受到時間和地點的限制。&lt;/p&gt;    &lt;p&gt;針對這個問題，可能有人會反問：為什麼不是「不抽菸的人可以不抽，但為了顧及抽菸的人的權益，不抽菸的人應受到時間和地點的限制。」我的想法是：「會肢體或意識上侵犯到他人的作為應受到限制」。所以我們會明文規定禁止在公共場合做愛，禁止在公共場合隨地便溺，禁止在夜間製造噪音…等等。不抽菸的人基本上沒有「煙」去侵犯別人，但抽菸的人卻有這項武器，這是抽菸的人應該受到規範的理由。把「抽」和「不抽」的標籤去掉後，我們就可以很明確的看到問題在哪裡，而不是只能意氣用事的做人身攻擊。&lt;/p&gt;    &lt;p&gt;對於交通，去標籤化也可以使用在「騎車」和「開車」的人身上。交通的混亂如果只二分為機車和汽車是很沒有意義的，因為它的假設是：如果路上沒有機車，交通就會變好；或，如果路上沒有汽車，交通就會變好。問題是，高速公路沒有機車呀，前一陣子不是還有人抱怨「塞車也是一種幸福」是種失言嗎？越南的西貢市幾乎沒有汽車呀(近幾年有增加)，他們的交通很好嗎？交通管理的問題不在於路面上有什麼交通工具，而在於這些交通工具如何「按規定使用」。&lt;/p&gt;    &lt;p&gt;舉個簡單的例子，每當有計程車或公車從內側車道搶進外側車道載客時，機車要去哪？不就跑到內車道去了。所以汽車會抱怨機車佔用汽車道，警察也樂得騎士們幫他們增加業績，但問題的根本在於要接人載客的汽車，並不會乖乖走外車道，而要在內外車道間變換來去。機車族為了圖快的鑽洞行為也值得好好的規範一番，我就看過有騎士催著顏射管在車陣中用80km/hr 蛇行，或著用 30km/hr 的速度騎在內車道的正中央。二、四輪不分道，駕駛不互相體諒、禮讓，等著的就是無止境的混亂。但到底是要管制機車，還是管制汽車的爭論，只要把「汽車」、「機車」的標籤去掉，就會曝露出原本問題的所在。&lt;/p&gt;    &lt;p&gt;同是用路人，卻缺乏互相禮讓的同理心，交通一定會混亂。不只是交通，失去同理心，家庭會混亂，公司組織也會混亂，政治也會混亂。同理心並不是盲目的容讓或寬恕，而是一個自我與他人之間緩衝的空間。撕掉標籤化的習慣，才能從問題的根本去解決問題，不然都是耍嘴皮子遊戲而已，比賽誰先替標籤染色，比賽誰能發明更新奇有趣的標籤，造成僅在紙上作文章，而不去正視隱藏在標籤背後的污垢的現象。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/07/blog-post.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-8609268490376164060</guid><pubDate>Thu, 25 Jun 2009 02:26:00 +0000</pubDate><atom:updated>2009-06-25T10:26:03.815+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>求婚金句？</title><description>&lt;p&gt;六月十號過後沒多久，就看到很多求婚相關的消息，包括在電影院的啦，在音樂會上的啦…。根據現場觀眾指出，這種大庭廣眾之下的求婚，真的是超級無敵尷尬，要不就話講的不得體，要不就梗鋪的很爛，還是我們的那場比較溫馨歡樂。(自high中)&lt;/p&gt;  &lt;p&gt;還有篇新聞很用力的報一則「十大求婚金句」，其中金句之首叫做「財產都過給妳」。我看到這則新聞的第一眼就想到邰哥扮黎佬時的名言「新聞怎麼報？亂報就對了嘛~」。不過為了求証，昨天在團練前又問了一次在座的女士們。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;答案果然和我預期的一樣，超級一致的，敝團的女團員們，不管是在學還是上班族，都口徑一致的說：「用這句話求婚者，斬！」或是「拎周罵免gain」(台語：「你奶奶我不屑」)。不知道這求婚金句是誰選出來的，當時在場的女團員有六個吧，雖然樣本空間不大，但對這種說詞是 100% 倒彈。眾男士們，要是你信了媒體說的話，你就準備單身一輩子啦。&lt;/p&gt;    &lt;p&gt;NCC 也真不公平，女明星到談話性節目大肆炫耀結婚送房子，生小孩送鑽石這種真正物化女性的行為不好好譴責一下，年輕美眉衣著整齊的在螢幕上抖兩下就要抓。國家單位這種笑貧不笑娼的作法，是無知還是無恥呢？如果政府真的有心要做品德教育，麻煩從自己家門裡的垃圾掃起。預算你們自己留著，等貪污的、關說的、多重國籍的、甩巴掌的、扯頭髮的、3000cc是小車的、塞車很幸福的、看的到天空就可以抽煙的、交通亂都是機車錯的、音容苑在的、懿範長存的…等等，全部掃乾淨，再來做品德教育吧。&lt;/p&gt;    &lt;p&gt;不過不及格的求婚詞倒是沒有排錯位置。那種藉口他人來求婚的都是必死。像「爸說、媽說、老師說」就死定了，原因很簡單，對女人來說，這種說法意即：「我其實不想娶妳啦，不過別人一直給我壓力，我就委屈一下好了。」翻成白話文就知道，不會有女人要委屈到接受這種求婚的。還有什麼「煮飯婆」說，「女佣」說…等等，就不用贅述了，有腦的人自然想的通，腦殘者也不用廢心。&lt;/p&gt;    &lt;p&gt;男士們，討女人歡心是要多花一點錢沒錯，但「有品」的女人不會為了你那三兩銀委身的。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/06/blog-post_25.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-4160823677184367189</guid><pubDate>Sun, 21 Jun 2009 03:46:00 +0000</pubDate><atom:updated>2009-06-21T11:47:17.125+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>6/10 求婚紀念日</title><description>&lt;p&gt;依靠著當代合唱團的大伙兒鼎力相助，終於讓結婚大戲首部曲：求婚，順利地落幕。隔天是6/11，是我和心如相戀四周年，因此特地選在 6/10 求婚是為了方便記憶，要是隨便選個心血來潮的日子，恐怕以後忘記求婚紀念日會被追殺…(誤)；也不能選個情人節(早就過了)、耶誕節(太晚了)、生日(更晚)、或重陽節、婦幼節、端午節、國慶、光復紀念日、教師節(太怪了吧…)，而且更添「以免忘記」的動機之嫌…(大誤)。&lt;/p&gt;  &lt;p&gt;其實，是為了讓合唱團諸君也能配合演出的時間啦，不能在開演前(要加練很忙)，不能在暑假(有人要回鄉、有人要出國、有人要度假…)。6/10 剛好是我們五月公演結束不久，大家還沒有下一場演出的緊張感時，又充滿了「四周年」的氛圍，剛好又在禮拜三(敝團在每周三練唱)，真是個絕妙的好日子，就這樣敲定下來，而這個構想早在四月就成型了。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;求婚必備武裝有三：&lt;/p&gt;    &lt;p&gt;1) 鑽戒 (DSC 買的，如果有朋友要買鑽戒，我真的很推薦 DSC) (鑽石等級保密，有興趣請私下找我) (有點怕放照片上來太招搖…總之非常閃，非常漂亮，讓人一瞬間明白「diamond is woman’s best friend」的那種漂亮。)      &lt;br /&gt;2) 玫瑰花 (Grass Flower 的傑作，很精緻，很美，很熱情，也很有巧思)&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://lh3.ggpht.com/_yVFjA3j9Fxw/SjEykKaRvnI/AAAAAAAAIDE/5axNyAFlHMA/s576/IMG_1149.JPG&quot; width=&quot;360&quot; height=&quot;242&quot; /&gt;       &lt;br /&gt;3) 驚喜 (因為過度焦慮，我不小心露一點餡…不過很多梗都是新的，驚喜之情還是寫在寶貝臉上^^) (背景是家禹學長、阿信、和吉比的屁股…)&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_M59511GFf9I/SjDTGSDysCI/AAAAAAAAEMQ/V6p0e_pAlus/s400/IMG_7941.jpg&quot; /&gt; &lt;/p&gt;    &lt;p&gt;(1) (2) (3) 合體照^^&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://lh3.ggpht.com/_M59511GFf9I/SjDT780XOSI/AAAAAAAAENg/pMgcFjjOSxU/s400/IMG_7965.jpg&quot; /&gt; &lt;/p&gt;    &lt;p&gt;結局當然是大歡喜囉，不過究竟這一切劇情是如何發生的呢？現在要一步一步解密了。&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;求婚的第一個難題是：要怎麼開口？&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;我們曾無意間在部落格或電視上看到別人的求婚故事，通常會出現在媒體上的都是很轟轟烈烈的求婚，要不就在大庭廣眾之下亂入，要不就拿學校擴音器喊話，要不就報名參加一些遊樂園的求婚計畫，要不就登報或登巨幅廣告。&lt;/p&gt;    &lt;p&gt;心如不喜歡這種方式的求婚，我也不喜歡。(意見一致的感覺真好)。我們不喜歡那麼招搖，在一群陌生人面前，大聲嚷嚷只屬於我們和我們的親友們的事。我們都覺得那是假熱鬧，尷尬多於喜悅。那到底什麼樣的求婚方式比較好？這個問題變成我的責任了…。 &lt;/p&gt;    &lt;p&gt;運氣很好，當代是個很有人情味的合唱團，我和心如和戴老師從金穗合作到當代，看著戴老師的魅力慢慢的發酵，凝聚起當代很特別的一種風格。當代的團員們一起經歷了許多場演出，團內建立起很簡單又自然的歡樂氣氛，讓我決定尋求當代的朋友們幫助，和祝福。真的很感謝戴老師出借場地，感謝團員們配合演戲，給我建議，幫我解決硬體上的不足。&lt;/p&gt;    &lt;p&gt;我的選擇果然是對的，當求婚的影片在大螢幕上播出來時，心如雖然難掩緊張之情，但當她環顧四周，前後左右都是熟識的朋友，都是熟悉的臉孔，都是熟悉的聲音。熟悉的環境給她安全感，她可以放心的開懷的笑。沒有人山人海的叫囂，或陌生人的指指點點，我們擁有的是一個非常溫馨的求婚。&lt;/p&gt;    &lt;p&gt;求婚的劇本很簡單，一段收錄了當代伙伴們的祝福的影片，加上花和鑽戒，我本來以為我會冷靜的講一些浪漫的話，結果完全不是那樣，心如笑個不停，大伙兒都笑個不停，我努力繃起的認真神情不到三秒鐘就毀了…那些擠破頭想出來的話，一個字也沒吐出來。&lt;/p&gt;    &lt;p&gt;果然子苡姊姊是對的：「還要說什麼？直接問問題就對了。」&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;求婚的第二個難題是：如何展現誠意？&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;花是必要的，婚戒也是必要的，這兩個加在一起只代表該有的東西準備好了，不代表有誠意…。所以我其實對於求婚的型式思考了很久，也有想過包下一間餐廳，請當代的大家都去當客人，然後在餐廳裡求婚。或者是，手做相簿，貼滿我們過去的照片，加上一些感人的註腳，然後呢？這還是會面臨在哪裡求婚的難題，想來想去，好像都很難同時兼顧隱私和熱鬧。這個梗真的很難鋪，直到最後，我想出一個可以把大家都拉下海來的方法：跟戴老師借團練的時間、團練的人和團練的場地。 &lt;/p&gt;    &lt;p&gt;音樂會後聚餐那天，我假藉團員的名義跟心如借了DV，也跟大家解釋了我的計畫，請大家犧牲色相入鏡。我的運氣真的很好，那天剛好心如去謝老師家合新秀伴奏，要八九點才會到。大家趁著女主角不在，有人搞笑，有人感性，嘻嘻哈哈的錄了一個多小時的短片。&lt;/p&gt;    &lt;p&gt;後來為了在影片中呈現我們過去約會的快樂模樣，我還放了很多照片進去，但因為我手邊的照片東缺西漏，還找了很多藉口跟心如 copy 照片來做 DVD ，每開口一次都會挫一次，怕她起疑為什麼我突然對照片很有興趣。(其實她已經有起疑了，只是我都凹一些奇怪的理由矇過去…)&lt;/p&gt;    &lt;p&gt;影片的後製花了我大約一個多月的時間，日子慢慢接近，我開始思考當天的流程。首先當然是要確認心如會出現，我就是在這裡露了點兒餡…因為非要她去團練的理由實在太爛了…。再來就是要送什麼花。還好有子苡姊姊的幫忙，還有花店老闆專業的堅持，包了36朵火紅色的玫瑰花，祈求事事順心，還巧妙地教我把戒指藏在花叢裡，把驚喜藏在驚喜裡面，而且少了掏東掏西的手忙腳亂，真的是很有心的設計。&lt;/p&gt;    &lt;p&gt;為了保護團員們的隱私，影片就恕不公開了。我很開心的是，這段影片不只感動了心如，也感動了一起觀看的朋友們。因為，我在後製時，就已經哭了好幾次啦~。&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;求婚的第三個難題是：忍住…不要露餡…&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;我還是露了… &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;求婚的第四個難題是：如何收尾？&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;除了花束外，就是，麻煩了大伙兒幫我這個忙，不能不意思意思答謝一下。我訂了亞尼克的提拉米蘇、巧克力和雪藏泡芙。&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://lh6.ggpht.com/_M59511GFf9I/SjDT05ieS9I/AAAAAAAAENY/r8ohJnsEMLs/s576/IMG_7963.jpg&quot; /&gt; &lt;/p&gt;    &lt;p&gt;亞尼克的提拉米蘇不會甜膩，入口即化。好吃! 而且愛心造型很可愛也很應景，光是用眼睛看都覺得甜蜜。小點心泡芙和巧克力也大獲好評，心如也覺得這些安排精緻、簡單、溫馨，她也覺得很有面子。當天這些小點心可是被吃的一點不剩，甜在嘴裡，也甜在心底。^^&lt;/p&gt;    &lt;p&gt;我想，對女孩子來說，安全感也來自於這個男人是不是能夠圓融地處世，是不是能夠設想周全，是不是在浪漫之外，還能兼顧現實。&lt;/p&gt;    &lt;p&gt;之後，我們又準備了小小的謝卡，寫上感謝的話語，簽上我和心如的名字，謝謝每一個入鏡大方祝福我們的朋友，以及在求婚當天熱情幫忙的人。&lt;/p&gt;    &lt;p&gt;接下來，還有很多事情要忙，提親、準備新房、訂婚、宴席、拍婚紗、喜帖…。光想到就覺得路途遙遙，再一點一點地更新上來吧。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/06/610.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_yVFjA3j9Fxw/SjEykKaRvnI/AAAAAAAAIDE/5axNyAFlHMA/s72-c/IMG_1149.JPG" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-6635054545964129473</guid><pubDate>Sat, 20 Jun 2009 11:12:00 +0000</pubDate><atom:updated>2009-06-20T19:33:33.835+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>你愛我嗎？</title><description>&lt;p&gt;(Note. 這是舊文章，最近覺得我的標籤太多了，清一清，重新分類一下)&lt;/p&gt;  &lt;p&gt;最近花x弄了一支廣告，內容是一對情侶從年輕到老，女生親暱的問著她的伴侶「你愛我嗎？」，男生一言不發，把她的手抓進口袋，掏出一只鑽戒，女生感動的哭了。 &lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt; &lt;p&gt;其實我本來就想弄一篇文章討論一下廣告的「信度、效度、力度」的問題，還沒來的及表示意見就被這支廣告弄到情緒很差。 &lt;/p&gt;  &lt;p&gt;廣告本身沒什麼好說的，就是鼓勵消費，任何一家銀行都拍的出這種廣告，我會記得是花x，是因為拍的真夠爛，爛到我確定不要辦花x的卡。 &lt;/p&gt;  &lt;p&gt;(事實是我對花x的印象本來就很差，進入社會開始工作一年多，我想替自己辦張美商的卡，剛好那時花旗在推透明卡，就去問了一下。松江路上有一家花x，一進門口，我跟櫃檯的小姐說：「我想辦張花旗卡」，她看了我一眼說：「我們的卡有年收六十萬的限制唷」…想當然爾，我轉身就走。我年收是沒破百啦，超過六十萬倒不是問題，居然擺勢利，當然從此花x在我心目中就是黑銀行的代表) &lt;/p&gt;  &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;[update on 2008-02-23]&lt;/font&gt;後來想想，廣告真正動人的價值應該是「時間」吧，永恒堅定的愛情，的確是大多數女人的想望；從相戀、成家、生小孩、到養老都能一路牽手，的確是滿感人的。(不是說男人不想，而是大多數男人壓根兒沒想到過這方面的事)。就像梁靜茹某一首歌的 MV 所說：剝橘子的幸福有多遠呢？ &lt;/p&gt;  &lt;p&gt;總之，以上是題外話。事件始於寶貝跟我說，這個廣告讓她很感動。 &lt;/p&gt;  &lt;p&gt;我說：我知道 (想當然爾…這廣告是打給女人看的…) &lt;/p&gt;  &lt;p&gt;她說：你不覺得很感動嗎？就像生命中的驚喜 &lt;/p&gt;  &lt;p&gt;我說：不是驚喜，是鑽戒。 &lt;/p&gt;  &lt;p&gt;她說：跟鑽戒什麼關係，是那份心意。(寶貝不高興了) &lt;/p&gt;  &lt;p&gt;我說：那放巧克力糖給妳呢？ &lt;/p&gt;  &lt;p&gt;她沈默了一下…「會融化…」 &lt;/p&gt;  &lt;p&gt;我說：寫情書呢？ &lt;/p&gt;  &lt;p&gt;她說：皺皺的… &lt;/p&gt;  &lt;p&gt;我說：那不是鑽戒而是鋼戒呢？ &lt;/p&gt;  &lt;p&gt;她不說話了，因為我們都覺得鋼戒很醜…沒質感。 &lt;/p&gt;  &lt;p&gt;我說：銀戒？(金戒？還是鑽戒？其實我沒有窮追猛打啦…) &lt;/p&gt;  &lt;p&gt;她岔開了話題，我們也沒再討論這個。她是好女孩，知道我的意思。對情人的心意不能用物質算，但當你嘗試用物質來表達的時候(好比說…送禮物)，心意永遠只有打折的份。To elaborate，送奢侈品當禮物，還不如送實用的來的「有誠意」。因為只有當你注意對方的需求時，才能找到對對方來說是「實用」的禮物。 &lt;/p&gt;  &lt;p&gt;「驚喜」不是只因為「意料之外的禮物」，還包括「禮物的價值意料之外的高」。所以對阿拉伯油王來說，送個1克拉的鑽戒給妃子是一點驚喜都沒有的事(說不定還有貶低之意)；然而對大陸礦工來說，送老婆一套 Net 的新衣就是天大的驚喜(以上只是我對這兩種身份的經濟能力的猜測，如有謬誤請不吝指教…)，問題是，礦工的老婆買不買帳？ &lt;/p&gt;  &lt;p&gt;對於我這種收入尚可的人來說，買高價的禮物又有什麼難？存款掏出來就有啦~ 存款沒有，信用卡刷一下也有啦(正如同廣告所期待你做的事)。不是吝嗇這個錢，但我們既然不是家財萬貫，可以姿意揮霍；就要好好規畫手上的錢，做理財。錢花在奢侈品上，之後需要錢的話怎麼辦？(就算不考慮買房子之類的遠未來，也要考慮如出國旅遊的近未來)。製造驚喜的方法很多，但要達到驚喜的感覺，還是需要經濟能力的支持。再者…廣告裡的男女主角活了大半輩子，也才兩次驚喜 = =;; 要是光靠這兩次驚喜就能解決所有經營感情會遇到的問題，我現在立刻下單去。 &lt;/p&gt;  &lt;p&gt;從廣告主的出發點來看，鼓勵消費是絕對的目的，為了刺激消費慾望而設計具煽動性的廣告是必然的。只是從我的角度來看這支廣告蘊含太多我無法認同的暗示，加上花x曾經對我如此惡劣，再加上寶貝居然站在支持的角度 @.@!! (大驚失色…) ，不得不上來抒發一下。這就是所謂廣告的力量吧，跟催眠很像，利用「暗示」來培養消費者的「認同」，來刺激購買。看來就算我不認同，這支花x信用卡的廣告，其效度和力度都有一定水準了。 &lt;/p&gt;  &lt;p&gt;問題：什麼東西成本不高，卻能當作「意料之外的禮物」，讓女人覺得「具有意料之外的價值」？&lt;/p&gt; &lt;/span&gt;</description><link>http://hbtsai.blogspot.com/2009/06/blog-post_20.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-8207218408050752502</guid><pubDate>Fri, 19 Jun 2009 03:59:00 +0000</pubDate><atom:updated>2009-06-20T23:52:18.546+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>禁C字褲，不禁丁字褲?</title><description>&lt;p&gt;可能台北縣政府有「內褲頭禁斷症」，兩種內褲只差一條細到隨手一揮就會斷掉的褲頭，居然禁此不禁彼。粥縣長，您就老實說，拿了廠商多少錢，用這種方式幫忙打廣告。搞不好先禁後准，炒紅這個話題後，再跟廠商抽成吧。撇開陰謀論不談，如果縣政府是很認真的要禁 C 字褲，那真的很可憐到了極點。做這種決策的人，大概連什麼是 C 字褲都不知道吧，go get a life！&lt;/p&gt;    &lt;p&gt;C 字褲長這樣&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://img.fzengine.com/best/20092/2009221045240.jpg&quot; width=&quot;437&quot; height=&quot;377&quot; /&gt; &lt;/p&gt;    &lt;p&gt;(圖片來源：&lt;a title=&quot;http://img.fzengine.com/best/20092/2009221045240.jpg&quot; href=&quot;http://img.fzengine.com/best/20092/2009221045240.jpg&quot;&gt;http://img.fzengine.com/best/20092/2009221045240.jpg&lt;/a&gt;)&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;丁字褲長這樣&lt;/p&gt;    &lt;p&gt;&lt;img src=&quot;http://cn.yimg.com/gallery/health/20071219102336748531001.jpg&quot; /&gt; &lt;/p&gt;    &lt;p&gt;(圖片來源：&lt;a title=&quot;http://cn.yimg.com/gallery/health/20071219102336748531001.jpg&quot; href=&quot;http://cn.yimg.com/gallery/health/20071219102336748531001.jpg&quot;&gt;http://cn.yimg.com/gallery/health/20071219102336748531001.jpg&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;我找來的丁字褲造型已經算客氣的，網路上還有兩條繩子接起來就拿出來賣的丁字褲，到底縣政府想要禁什麼東西，自己有沒有想過呀？他們辦這個活動，有沒有人去參加過呀？想吸毒嗑藥的會去，想聽音樂玩水的也會去，想找一夜情的會去，想和情人享受一下的也會去，禁條褲子的意義是什麼？&lt;/p&gt;    &lt;p&gt;女人要耍性感，會差在有沒有一條只剩裝飾功能的內褲頭？男人的視姦意淫功力不用說看到穿 C 字褲的正妹會啟動，只要目標正確，穿修女服都可以。至於說到妨害風化(露點、打野炮)或引誘犯罪(強暴、強姦、輪姦、猥褻)的便利性，C 褲有強過丁字褲？如果真的那麼害怕風化問題，那就規定大家全穿潛水衣算了。&lt;/p&gt;    &lt;p&gt;對了，我沒去過貢寮音樂祭，也不想去，那不是我喜歡的風格。不過單純對國家單位的愚蠢（或詨詐）感到失望而已。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/06/c.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-1702919802154182911</guid><pubDate>Tue, 09 Jun 2009 15:31:00 +0000</pubDate><atom:updated>2009-06-20T23:49:36.897+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Movie</category><category domain="http://www.blogger.com/atom/ns#">電影</category><title>《力挽狂瀾》- 人生的最後一片火花</title><description>&lt;p&gt;我很喜歡看緯來育樂台晚上播的美國職摔 ECW 和 SmackDown 節目。最近一次令我熱血沸騰的賽事就是 Batista 大暴走，狂斬 Randy Orton 的腳踝，又一對三，轟爆了趕來救人的 Cody Rhodes 和 Ted DiBiase, Jr. ，一報之前 Shane McMahon 被 Randy 爆腳之仇。&lt;/p&gt;    &lt;p&gt;喜歡的理由很簡單，WWE 的摔角手有最酷的極限動作，像 Evan Bourne 、Jeff Hardy、John Morrison 很變態的飛身動作，肌肉練的很漂亮的 Batista、Triple H、Randy Orton，打不死的怪物 Shawn Michaels、Kane、Undertakerr…等等。WWE 是娛樂性質非常高的運動。有人會批說那些劇情是套好招的，所以不好看。我的想法是，哪一齣戲不是先套好「很多」招，還排練很多次才能端到舞台上？想看正規的摔角比賽別處有正規的賽事可以看，WWE 在名稱上已經開宗名義說它是「Entertainment」，根本沒有什麼真假的問題，娛樂到觀眾的就是好節目。這裡隨手找兩張照片來&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Orton_Royal_Rumble_2009.jpg/180px-Orton_Royal_Rumble_2009.jpg&quot; /&gt;&lt;/td&gt;          &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;img src=&quot;http://www.breakitdownblog.com/wp-content/uploads/2007/04/batista.jpg&quot; width=&quot;254&quot; height=&quot;264&quot; /&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;           &lt;p align=&quot;center&quot;&gt;Randy Orton&lt;/p&gt;         &lt;/td&gt;          &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;           &lt;p align=&quot;center&quot;&gt;Batista&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;    &lt;p&gt;我覺得摔角手的肌肉練起來都不會過份變態，反而，就算肌肉練到塊塊分明，技巧不足還是當不了摔角手的。也且視覺上看來，比起健美比賽那些已經練到變型的人，感覺強壯多了。可能跟摔角也講求柔軟度有關，如果肌肉太大塊反而失去彈性，沒辦法施展摔技吧(自己這樣猜想的…)&lt;/p&gt;    &lt;p&gt;《力挽狂瀾》說的是每個人都必須去面對的故事，只是用摔角手「大鎚(RAM)」(米基洛克飾)來呈現這個故事的外貌。經歷過無數次精彩的戰役，Ram在摔角迷和選手間留下了非常好的印像，無奈年華老去，雖然擂台上的老練依舊，但身體已經不聽使喚。一次心臟病發讓他萌生退休的念頭，但褪去摔角手的光環後，他還是必須找一份工作養活自己。(劇情這樣鋪讓我有點懷疑，因為如果是很出名的選手，光是廣告、代言、周邊商品還有演出收入應該都非常可觀，而不是這樣窮困潦倒，除非是年輕時錢賺到就花掉…)。除了肌肉沒有其他專長的結果，就是只能到超市搬搬貨，顧生熟食櫃台，還要受上班看A片的主管苛薄，還要面對要求千奇百怪的顧客。台上台下冷暖落差…真的是令人難堪。&lt;/p&gt;    &lt;p&gt;歲月的刀不只刻在摔角手身上，也刻在每個體能受老化所苦的人身上，包括脫衣舞孃…。Marisa Tomei 演的 Cassidy 實在…令人血脈賁張，我喜歡她的鋼管舞和 lap dance，跳得滿有感覺的。倒是最後鋼管桌邊，因為年紀太大，半個恩客都沒有的時候(可是身材很好耶，而且跳的性感，為什麼會沒有人想看呢？)，她也面臨非常難堪的處境，那個場面和在超市受人指使的 Ram 一樣令人鼻酸。&lt;/p&gt;    &lt;p&gt;更令人難過的是，當她在夜店裡找不到人買她跳舞時，她還把主意打到老客人 Ram 身上。明明是兩個已經光華不在的人，只能靠薄薄一層買賣關係，互相取得一點點虛假的肯定，像螢火蟲一樣，Ram 從 Cassidy 搖擺的臀部裡找一些年輕的活力；而 Cassidy 則從 Ram 屁股口袋的錢裡找回自己年輕的吸引力。&lt;/p&gt;    &lt;p&gt;但我一邊在看這部片子時，一邊在想，運動員年輕時體能好，肌力好，反應快，可以不斷遞造紀錄；老了以後，就不能再用肌肉和別人拚，要用經驗和智慧去爭取別人沒辦法取代的機會。過去的榮耀可以被消費，但只消費不生產也會有消耗光的一天。因此有些運動員能成功的轉型為教練、記者…等職業，但，不是每個運動員都能轉型成功，能靠幾次比賽就賺進大錢的運動員畢竟是少數，大多數的人還是在努力衝破瓶頸和面對現實之間不斷徘徊。&lt;/p&gt;    &lt;p&gt;至於 Ram 的女兒呀…嗯哼…演技不怎麼好，有點破壞劇本的感覺，就不想講了。&lt;/p&gt;    &lt;p&gt;電影的結尾收的不錯，Ram 奮力地摀著胸口，最後一下飛身肘擊到底打在敵人身上，還是打在自己心口不得而知，只是在選擇釋放最後一片火花，和，留住最後一口氣，回到超市打工，還能再試試和女兒言和之間，Ram 做出了選擇…。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/06/blog-post_09.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-6781198797628730104</guid><pubDate>Sat, 06 Jun 2009 04:25:00 +0000</pubDate><atom:updated>2009-06-09T13:53:51.990+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>外文書的訂價?!</title><description>&lt;p&gt;今天心血來潮想找一本書(其實是知識不足，羞愧中想用買書來弭平一點罪惡感…)，書名是《The Art of Debugging with GDB, DDD and Eclipse 》，Oreilly 出版。買電腦書當然沒有二話，先上天龍找，果然也看到庫存，定價是$1400，VIP $1330。(&lt;a href=&quot;http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=1593271743&amp;amp;sid=44053&quot; target=&quot;_blank&quot;&gt;證據&lt;/a&gt;)&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;後來想想，我先前買別的領域的書都上博克來，也累積了不少 e-coupon，於是也跑去博克來的網站找這本書，結果報價出乎意料的貴：$1798。(&lt;a href=&quot;http://www.books.com.tw/exep/prod/booksfile.php?item=F011334369&quot; target=&quot;_blank&quot;&gt;證據&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;有趣的是，雖然這本書的定價的確是 $39.94 (如同博克來列的)，在 Amazon 上全新的書只要 $34.57 還送 Shipping，更別說的有書店可以找到更好的折扣，不過當然沒有台灣的份就是了。&lt;/p&gt;    &lt;p&gt;我想兩家書店(天龍有實體店面，在重慶南路上；博克來是網路書店)。按我們對網路書店的理解，總覺得博克來沒有庫存，應該會賣比較便宜吧。結果居然不只比較貴，還貴很多…。看來零庫存的售貨模式雖然省下庫存成本，但在售貨商品的價格上卻失去優勢(因為不會一次屯很多貨，不能壓低進貨價)。消費者買成品，畢竟價低者得，一樣是 O’reilly 的書，內容一樣、印刷一樣，當然還便宜的買。而且近$400的價差，郵寄到高雄都綽綽有餘…。&lt;/p&gt;    &lt;p&gt;外文書的消費市場雖然比不上中文書大，但合起來的數量應該還是有一定的議價能力吧？(純猜測…)，不知道 ihergo 什麼時候會把外文書做上去。^^&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/06/blog-post.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-5563741541872425264</guid><pubDate>Thu, 04 Jun 2009 07:23:00 +0000</pubDate><atom:updated>2009-06-04T15:23:02.368+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>DiMAGE 7 笨笨的…</title><description>&lt;p&gt;Minolta 命運多桀，先和 Konica 結盟再被 SONY 併吞，連帶的我們這些原先看好 D7 的玩家都只能傻眼，腦海中跳出 David 的建言：相機(指DSLR)不買 C 家就買 N 家，不是因為他們的東西無敵好，而是因為他們的市場夠大，他們不敢亂來，以免得罪客戶。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;總之，我的 Minolta DiMAGE 7 在轉動開機的旋鈕到「播放」「設定」和「錄影」時都不理我，簡單講這幾個功能都陣亡了，不知道有沒有玩家的 D7 也是這個狀況。雖然如此，拍照卻是一點問題都沒有，要加減飽如度、曝光度、快門光圈和對焦都沒什麼問題。加減用 XD&lt;/p&gt;    &lt;p&gt;寫信去問 SONY 後得到的答案是肯定的，他們會收送 D7 維修，只是作為一個工程人員，我很擔心我的相機是給誰維修的…搞不好根本不會修，或用一句沒有備料就打回票。既然還能拍，就不修了。等發財了再來買 dslr，到時候可能照片像素從三千萬起跳吧…&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/06/dimage-7.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-2040424256912738165</guid><pubDate>Thu, 28 May 2009 09:20:00 +0000</pubDate><atom:updated>2009-05-28T17:24:12.396+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Movie</category><category domain="http://www.blogger.com/atom/ns#">電影</category><title>世界是平的?</title><description>&lt;p&gt;之前有一本書《The world is flat》被直譯為《世界是平的》，我看完後曾經寫了短短的心得，說書裡闡釋的「扁平化」其實是「美國化」。但這部電影《Outsourced》，居然也被翻成《世界是平的》，但其劇情和所謂扁平化的世界沒什麼關係(企業委外並不是扁平化的現像，因為企業委外的合作模式由來已久，在扁平化談到的委外，指的是因新科技而衍生的新的委外模式，而不是因為扁平化才出現企業委外)，基本上是個只能拿20分 (我真仁慈…) 的翻譯…。&lt;/p&gt;  &lt;p&gt;對了，附帶一提，這部片子的男女主角如果換一下，也就是，男主角變印度人，女主角變美國人，這浪漫愛情談的下去嗎？？我好好奇喔。好萊塢對於兩性和國籍的詮釋，我想也再度證明了，世界一點都不平吧。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;首先我們看一下海報&lt;/p&gt;    &lt;p&gt;&lt;img style=&quot;display: block; float: none; margin-left: auto; margin-right: auto&quot; src=&quot;http://4.bp.blogspot.com/_lfGP14LgFGM/R1BlKo-ruYI/AAAAAAAAAV4/eJefz1cIwVI/s1600-R/Soundtrack+Art.jpg&quot; width=&quot;529&quot; height=&quot;480&quot; /&gt; &lt;/p&gt;    &lt;p&gt;如何，怎麼看都只像老美和老印的愛情片吧。這部片子只是借用了跨國委外的機緣，串起劇中文化衝擊的笑料，重點是異國戀情而不是委外，從劇情來看，算是滿不錯的浪漫小品。&lt;/p&gt;    &lt;p&gt;不過我想說的是被劇情齣發的一些想法。&lt;/p&gt;    &lt;p&gt;不論在哪一個產業，切割一部份的業務外包出去以降低成本已經是常態。打從數十年前，台灣還在做家庭代工的時代，每個產品的部件就是一個又一個委外業務串起來的。例如：皮革的加工、汽車的零件委外、鋼材的設計、珠寶的鑲嵌、都屬於硬件的委外業務。然而，劇中安排的梗是軟件-客戶服務-的委外，這是一個時代性的變化(也比較能帶出電影想要的效果)。在《世界是平的》一書中，印度不只成為電話客服委外中心(後來是中國，這在劇中也出現了)，同時也是電腦軟體委外中心。&lt;/p&gt;    &lt;p&gt;現在，我們來談談軟體委外。&lt;/p&gt;    &lt;p&gt;所謂委外，基本上是把產品(產品可以是有形的，也可以是無形的)製作流程切割為很多子流程，其中一或多個子流程，用比較便宜的價格外包出去給其他的企業負責生產。母公司負責制定規格、法律文件、和時程的控管，因此如果產品設計+法務+財務+專案管理的成本遠低於自己開發的成本，那麼外包是個不錯的選擇，反之則適合自己開發。但是問題來了，什麼是開發成本？如何計算外包的成本？哪些流程適合外包？如何控制外包業務？&lt;/p&gt;    &lt;p&gt;敝公司過去曾經把某一片段很重要的程式碼外包給某個小國的一群年輕駭客，結局是，東西可以跑，可以賣。但是那段程式碼沒人研讀過，也沒人維護過，於是在某一次升級後那一段程式碼就不能用了。反省一：構成產品的任何一部份的程式碼都不應外包。&lt;/p&gt;    &lt;p&gt;但 sales 不是這樣說的，他們說，現在如果不能出貨，大家都會領不到薪水。他們不知道的是，一但未來的某一天，外包取得的源碼不能用了，公司必須付出更多的成本去補償。&lt;/p&gt;    &lt;p&gt;日本某巨型企業曾把一塊板子丟給我們，弄了個 NRE 的合約叫我們讓它動起來。本來以為這是個賺錢的大好機會，後來才發現，他們這一步的目的是把整個案子放棄掉的前奏。只要把「不能動」的問題丟給別人，他們就可以名正言順的花個一百萬美金把專案丟掉，而不必多花一千萬美金想辦法把本來做爛的東西修到好。那個案子最後也變成燙手山芋，出不了貨，結不了案，收不到錢，還有很多 bug 因為委外的關係，對方刻意保留很多技術細節，修半天修不好。反省二：外包的東西不一定是要成功的。&lt;/p&gt;    &lt;p&gt;但 sales 不是這樣說，他們說，自由市場的選擇是這樣，我們也沒有辦法，至少 NRE 的錢收到了。(我們是收下了遮羞費嗎？…)&lt;/p&gt;    &lt;p&gt;其他像外包商扮豬吃老虎，合約期內逼著你公司上從 CEO 下到 RD 每個人都陪他玩政治遊戲，還要一面對客戶賠不是，這種無形的成本不能不算，而且一算就知道這個外包合約不划算。還有諸如像包商在客戶面前捅你一刀啦，拿了 reference code 用在自己的產品裡啦等等奸邪手段。畢竟大家都是在刀口上搶錢，大方就死定了。&lt;/p&gt;    &lt;p&gt;其實我們公司的 sales 是很大方的…&lt;/p&gt;    &lt;p&gt;但這個世界上，會做出如此粗糙的委外策略的公司並不多(可能只要負責人是台灣人就有機會吧…台灣老闆在做決策的能力上還很有待加強)(然而敝公司的 CEO… 不只有待加強…我有時會想是不是砍掉重練比較快…)&lt;/p&gt;    &lt;p&gt;印度之所以成為軟體委外中心，有一個很重要的關鍵就是，他們最大宗的業務不是程式撰寫，也不是維護，他們甚至看不到一些大型軟體的程式核心。他們負責的是軟體測試。像這種業務就是適合外包。軟體測試必須有 domain knowledge，但不需要接觸公司的源碼，但業主的成本就是要把規格書定義好，不然測試者對於軟體的行為可能會誤判，這種成本，對於大型軟件來說，大約是一個五人的產品經理團隊就夠了。&lt;/p&gt;    &lt;p&gt;台灣本身也是一個委外中心，只是人力日漸昂貴，造成一些委外業務的轉移。昂貴其實有昂貴的價值，不然像Pixer、VMware、Apple、Google、Oracle 這種大型企業也不會不惜重金把真正的研發單位留在美國(雖然裡面的工程師有大量的印度和大陸人…)(或許有人會想爭辯，但，我想問一下各位的看法，拿著 IRQ list 寫 driver 過 WHQL 算研發單位嗎…)。&lt;/p&gt;    &lt;p&gt;台灣有台灣的競爭力，擺拖委外中心，或者爭取建立委外中心的角色都不是重點，畢竟台灣佔文化、語言和地理之利，要做中國的二房東是綽綽有餘。但是一邊又想做房東(建立自有品牌)，一邊又想做房客(搶OEM/ODM的單)，往往只會兩頭空。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/05/blog-post_28.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lfGP14LgFGM/R1BlKo-ruYI/AAAAAAAAAV4/eJefz1cIwVI/s72-Rc/Soundtrack+Art.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-840945413613841442</guid><pubDate>Wed, 06 May 2009 02:37:00 +0000</pubDate><atom:updated>2009-05-06T10:37:37.618+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>男人從生命中最重要的兩個女人學到的事</title><description>&lt;p&gt;母親讓你學會說謊，妻子讓你學會把謊說的好聽。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;外遇不是全天下男人都會犯的錯，外遇根本不是錯，只是學以致用。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/05/blog-post.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-2335291447640558090</guid><pubDate>Sat, 25 Apr 2009 11:35:00 +0000</pubDate><atom:updated>2009-04-25T19:36:55.862+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">music</category><category domain="http://www.blogger.com/atom/ns#">音樂</category><title>[音樂劇] 耀演-酒館中的情與愛</title><description>&lt;p&gt;4/18 的下午，應呂馬之邀，到中和的迴廊咖啡劇場欣賞「耀演」的音樂劇演出。在寫心得之前，我想先說說對國內百老匯音樂劇製作的看法。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;首先是，因為經費有限，要作一齣抄襲自錢坑曼哈頓百老匯的音樂劇一定會面臨資源不足的窘境。哪些資源不足呢？很簡單，&lt;strong&gt;人手不足&lt;/strong&gt;：能唱能演又能跳的人不夠，又沒時間和金錢來培養；&lt;strong&gt;道具不足&lt;/strong&gt;：只擺一張椅子在舞台上就能演的音樂劇不是沒有，但也不是多如繁星，需要張羅複雜一點的道具時，捉襟見肘是必然的；&lt;strong&gt;舞台不足&lt;/strong&gt;：在曼哈頓有一種別的地方沒有的職業，叫作「百老匯搭景人員」，因為想在百老匯紅的劇實在太多，舞台拆了又搭搭了又拆，永遠有搭不完的舞台，而每一齣劇的舞又不一樣，就出現專門搭舞台的人。在台灣，有這樣的場地讓劇團發揮舞台設計的功力嗎？缺乏場地的結果是劇團只好處處將就，結果戲劇效果也被將就掉了。&lt;/p&gt;    &lt;p&gt;所以從連老師的「音樂劇坊」(只有音樂)開始到最近收掉的「嵐創作體」(舞樂分家)，和剛去看過的「耀演」(總算兜起來作成瀨尿牛丸了)，我在入場前都沒抱什麼特別的期待，而聽完後也大多是充滿感慨，唯感慨的內容不盡相同。寫這篇的目的，是因為耀演讓人感覺得到用心，讓我很期待看到他們下一次的作品，因為有期待，希望能提供一些意見，作為他們未來進步的參考。&lt;/p&gt;    &lt;p&gt;耀演的表現比我想像中的還要好多了，最主要是其中有一些段落真的能說服我(我真容易被收買…)，就算這些段落本身在音樂和劇情上就有比較豐富的張力，演員的實力仍然相當值得讚賞：上半場曾慧誠的：「(曲名我忘了，是演一個很會拼字的小孩)」「玻璃人」、下半場謝淑文的「You don’t know this man」「Do it alone」。&lt;/p&gt;    &lt;p&gt;劇團的努力是值得被肯定的，但進步空間仍大。打著酒館音樂會(cabaret)的旗子能幫助觀眾放鬆，但並不能降低觀眾的期待。我覺得整場音樂會最弱的東西是「力道」的掌握。就像買股票的人會說：懂得買是學徒，懂得賣才是師傅。戲劇、音樂、舞台，懂得「放」只是學徒，懂得「收」才能出師。整場製作裡面，我覺得最懂「收」的藝術的應是謝淑文，其他人，包括曾慧誠，都太放了，很膩。&lt;/p&gt;    &lt;p&gt;舉個俗氣一點的例子，收跟放就像吃烤肉配果醋，能解膩(收)才能享受烤肉的爽口(放)。&lt;/p&gt;    &lt;p&gt;其次是「節奏」的問題，雖然下半場的《遊行》是截錄其中連貫劇情的橋段出來演，但有一些換場太頻繁了，顯得瑣碎，多餘。因為有投影的協助，其實很多劇情用字幕交代也就過去了，硬插上一段對白、對唱或樣板式的劇，真的還滿破壞胃口的。至於上半場，我覺得曾應該是很努力的去準備每一首歌，但是弱在節奏的控制上。比如說，曲子曲子中間想插口條進來做曲解很好，但…請多喘口氣再繼續，不然看的人也很緊張，好像有什麼事沒做完，匆匆忙忙的。&lt;/p&gt;    &lt;p&gt;last but not the least：空白。關於「空白」這回事，我是在一本書叫「絕對成交」裡看到的，但無意中發現，這個概念可以運用到任何一個領域。空白就像樂譜上的休止符，也是表演的一部份，然而演戲的人，可能常被罵過「你演的很無聊」，就覺得所有的空白都應該盡量被填滿。這是一種詮釋沒錯，但在音樂劇的範疇，這種詮釋應該早就隨俗爛劇變成歷史了。演員的動作，可以有空白(但不是失神)，不需要每一分鐘都要弄東西「給」觀眾，就像吃東西需要時間消化，觀眾看到演員的每一個動作，也需要時間消化，演員一直給，觀眾很快就吃飽，而不想吃了。&lt;/p&gt;    &lt;p&gt;雖然曾慧誠有先向大家強調，耀演的宗旨是以戲為主，音樂只是手法之一，我還是很好奇，在他的理念裡，戲、劇以外的元素，究竟可以被犧牲到什麼程度？比如說，唱歌的咬字咬的不清不楚，對白口條念的含糊，算是…？在舞台上的站姿、坐姿、走姿不好看，要算戲還是算舞台訓練不足？對我這種沒什麼專業能力的人來說，看不出來跟劇情有關的瑕疵，就真的會當它是瑕疵。&lt;/p&gt;    &lt;p&gt;最後我想補一個小小的心得：那一場的辣妹好多喔…@@!&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/04/blog-post_25.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-2122237872888368102</guid><pubDate>Fri, 17 Apr 2009 11:22:00 +0000</pubDate><atom:updated>2009-06-20T19:28:41.454+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">music</category><category domain="http://www.blogger.com/atom/ns#">音樂</category><title>大嬸版保羅帕茲？</title><description>&lt;p&gt;這真的是…再來一次就不新鮮了&lt;/p&gt;  &lt;p&gt;有興趣看的人麻煩自己連去&lt;a href=&quot;http://www.youtube.com/watch?v=OYr_Tp8XzJo&quot; target=&quot;_blank&quot;&gt;youtube&lt;/a&gt;，&lt;/p&gt;  &lt;p&gt;我只想說兩件事：&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;1. 大嬸的外型跟這首歌真不搭XD，這首歌在悲慘世界裡是 Fantine 唱的，一個，按劇情來說，是個為了籌錢而下海的妓女，回憶起年輕不懂事，睡了個帥哥後被拋棄，還生下了 Cossette。基本上，是個愛玩的女人的型，被拋棄後吃了苦頭，後悔睡錯人時唱的歌。這位大嬸…不只單身，搞不好魚干到連 pub 都沒去過，整個型唱「I dreamed a dream」…太滄桑了啦…雖然故事需要一點滄桑感，但是按劇情 Cossett 不到十歲，就算 Fantine 生 Cossette 時是23歲(年輕愛玩嘛)，Fantine 當時也不過33 歲，susan大嬸 47 歲啦…。&lt;/p&gt;    &lt;p&gt;2. 大嬸的聲音抓太用力了，透露出的憤怒比自憐/後悔還多，完全不是在唱 Fantine，而是在因她自己了。她的聲音不適合 Fantine，但很適合 Sunset Boulevard 裡的 Norma，尤其是給她唱「With one look」，那種力道，那種隱藏的火力，一定可以很完整的突顯 Norma 的內外性格。&lt;/p&gt;    &lt;p&gt;大嬸唱功不錯，但她選錯歌了。不過這年頭只要對比強烈一點，人家就會把你的成就放大看。尤其是這種綜藝節目，誇大是常態，包括 Paul Potts，他是唱的好沒錯，但真的沒那麼好，只是利用了普通人以貌取人的劣根性，就可以轉變成龐大商機，這整件事真的是太 cynical 了。&lt;/p&gt; &lt;/span&gt;</description><link>http://hbtsai.blogspot.com/2009/04/blog-post_17.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-6476266477724676516</guid><pubDate>Thu, 16 Apr 2009 02:51:00 +0000</pubDate><atom:updated>2009-04-16T10:51:54.719+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">music</category><category domain="http://www.blogger.com/atom/ns#">音樂</category><title>居然可以錄到爆麥…</title><description>&lt;p&gt;可惡可惡，我還以為是我聽太多音樂耳朵爛了，居然在聽 verdi 的 Dies Irae 時聽到嚴重的爆麥聲。結果不是，是錄的時候就爆了…&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;爛死人的 EMI，就是這張，千萬別買&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Verdi-Messa-Requiem-Quattro-Pezzi/dp/B000002RNP/ref=sr_1_7?ie=UTF8&amp;amp;qid=1239849923&amp;amp;sr=8-7&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/21VZADA5S9L._SL500_AA130_.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;我的形容可能不夠專業，爆麥可能有比較正統的說法。總之，我說的爆麥，就是如果你拿很便宜的 mp3 player + 錄音筆，對著內建的麥大叫一聲，再聽聽看，應該會聽到像炸掉一樣的聲音，表示聲音的振幅超過麥克風能接收的程度。 &lt;/p&gt;    &lt;p&gt;這種事情，唉，只能怪我被 Schwarzkopf, Ludwig, Gedda 和 Ghiaurov 的陣容迷了心竅，沒去注意錄製的日期，真是踩到大地雷 &amp;gt; &amp;lt;~ &lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/04/blog-post_16.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-7047842309473267662</guid><pubDate>Mon, 13 Apr 2009 02:52:00 +0000</pubDate><atom:updated>2009-04-13T10:53:49.350+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>品質相當不穩的 NCC</title><description>&lt;p&gt;我國的「國家通訊傳播委員會」近來做了兩件引起宣然大波的決定。&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;對「預言online」和「發達麻將」開鍘，認為其廣告手法、內容物化女性，違反公序良俗。(&lt;a href=&quot;http://www.ncc.gov.tw/chinese/news_detail.aspx?site_content_sn=8&amp;amp;is_history=0&amp;amp;pages=0&amp;amp;sn_f=10172&quot; target=&quot;_blank&quot;&gt;參考一&lt;/a&gt;，&lt;a href=&quot;http://www.ncc.gov.tw/chinese/news_detail.aspx?site_content_sn=8&amp;amp;is_history=0&amp;amp;pages=0&amp;amp;sn_f=10152&quot; target=&quot;_blank&quot;&gt;參考二&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;檢討「中華電信」的收費；檢討中華電信和台固罔顧消費者權益，恣意限縮頻寬的作法。(&lt;a href=&quot;http://www.ncc.gov.tw/chinese/news_detail.aspx?site_content_sn=8&amp;amp;is_history=0&amp;amp;pages=0&amp;amp;sn_f=10159&quot; target=&quot;_blank&quot;&gt;參考一&lt;/a&gt;，&lt;a href=&quot;http://www.ncc.gov.tw/chinese/news_detail.aspx?site_content_sn=8&amp;amp;is_history=0&amp;amp;pages=0&amp;amp;sn_f=10149&quot; target=&quot;_blank&quot;&gt;參考二&lt;/a&gt;) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;我個人對於這兩起事件都有意見。我有意見的地方不是他們裁示的對象，而是裁示的方法。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;首先不論是哪個案例，NCC 都是被動地進行調查。&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;NCC自今年1月1日起開闢傳播內容申訴網，已獲社會大眾熱烈支持，近來民眾紛有反映「預言Online 、發達麻將Online兩廣告內容不妥，要求NCC依法處理」，經NCC初步判斷，該2支廣告片有違反廣電相關法規之虞。&lt;/p&gt;   &lt;/blockquote&gt;    &lt;blockquote&gt;     &lt;p&gt;台固於4月7日行文NCC表示，中華電信預計於4月8日起限縮雙方網際網路互連2G頻寬訊務，請NCC立即介入。&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;換句話說，NCC 很「中立」地扮演仲裁者的角色，有事奏來，無事退堂。問題是，別人叫了才動的機器，中立嗎？偵查對象僅限於被奏褶劈到的人，中立嗎？NCC 就算不想當廠公，隨時監視電視上有沒有「壞了規矩」，也別懶散到變成商業競爭下的工具。而且從裁示的結果來看，真的是先告狀的先贏。&lt;/p&gt;    &lt;p&gt;以中華電信限縮頻寬為例，明明是台固欠人錢，卻先拖欠資費，又加告中華電信一狀，中華電信的租費策略就被檢討。那&lt;strong&gt;要是台固不告，中華的租費策略就不用被檢討&lt;/strong&gt;？還是中華電信被檢討，台固就可以躲過這三千多萬？(就我所知，目前似乎錢有拿出來放律師那，還沒真的進中華電信的口袋。)不知道要是中華電信先狀告NCC，說明台固違約的情事，請NCC示下應如何處治，NCC會吐出什麼高見來。&lt;/p&gt;    &lt;p&gt;再看廣告「物化女性」的部份，這種指控本來就很主觀，我自己不覺得廣告內容有物化到什麼東西，麻將牌和電鑽嗎？總之，今天不是來反省兩性議題的，就先跳過這一段。NCC 說是因為有消費者申訴「預言online」和「發達麻將」內容「物化女性」，所以他們動手查，查完後覺得「的確有物化女性」，所以禁播。意思是說，如果沒有人申訴，這兩則廣告就沒有物化女性嗎？還是說，就算廣告嚴重明顯有物化女性(鬼畜系？)，只要沒有人申訴就不用查？&lt;/p&gt;    &lt;p&gt;再者，我不是很清楚新聞局是幹麻的？但印像中所有出現在電視上的東西，不是都會先送新聞局審查嗎？什麼時候變成 NCC 來管的？要是NCC才有決定權，為什麼要放一個新聞局在那邊？當花瓶？當炮灰？還是這樣才有足夠的位子給政治做酬庸？功能重複的單位好聽點叫權責不清，難聽點就是冗員。如果說新聞局是第一關，NCC是第二關，那第一關和第二關的關係是什麼？第一關的篩孔大一點？第二關的篩孔小一點？那閱聽人的權益又在哪？&lt;/p&gt;    &lt;p&gt;再者，什麼叫&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;依案例經驗，初步判斷違法構成要件明顯&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;什麼案例？講清楚嘛…拿出來大家笑一笑。不然我也會說，依照案例，此廣告並不構成違法。反正你拿不出案例，我也不用拿出來，標準不明還是不明，要吵繼續吵。&lt;/p&gt;    &lt;p&gt;對於廣告事件，NCC不斷發新聞稿消毒，但骨子裡還是躲躲閃閃。對於中華電信和台固的糾紛，又把兩件事扯扯在一起變成一個案件，誠意或許足了(畢竟有發新聞稿)，但能力…唉。&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/04/ncc.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-1033688690437010222</guid><pubDate>Sun, 12 Apr 2009 14:28:00 +0000</pubDate><atom:updated>2009-04-16T10:08:40.220+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>丹堤不及格服務生目擊</title><description>&lt;p&gt;對於經營咖啡店或速食店的業者來說，應該很能體會有人只點了一杯咖啡就坐一整天的消費習慣。為了讓店內容納較多的客人，業者一定會希望每組客人按人數找位子坐，而不要一個人佔用多個人的餐桌空間。對於消費者來說，一杯咖啡也沒多少錢，也懶得要求五星級服務，堅持使用自己已經坐熱了的椅子。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;但…明明是很簡單的動作，剛剛就目睹丹堤的服務生用很笨的方式表達…&lt;/p&gt;    &lt;p&gt;事情是降子，有個瘦瘦的年輕人點了壺茶，佔用了四人的座位在翻閱求職雜誌。接著來了一對夫妻，他們推著嬰兒車，希望服務生幫他們找個大一點的位子 (這真的很奇怪…一個人佔四人位是不好，兩個人佔四人位就比較有正當性喔? 明明他們現在也只用了兩個人的空間，加上走道放著嬰兒車而已 )&lt;/p&gt;    &lt;p&gt;總之，為了幫客人「橋」位子出來，服務生跑去找那個年輕人，客氣地問他能不能移到雙人座。年輕人也無所謂的點了頭，然後服務生居然在年輕人的眼鏡、手機等個人物品還在桌面的時候，就開始搬動桌子 (咖啡廳的桌子都用併的，比較彈性)。那個年輕人也傻眼，忙著說我自己搬就好，服務生忙不迭的說謝謝就走了。&lt;/p&gt;    &lt;p&gt;…&lt;/p&gt;    &lt;p&gt;服務有做沒有到，這就是最好的一課，卻是業界的常態。&lt;/p&gt;    &lt;p&gt;題外話：櫃台妹妹好像不懂什麼是冰滴，雖然我也覺得在連鎖咖啡店問這種問題是多餘的…我問：「你們的冰咖啡是冰滴的嗎？」櫃台：「吭？」我重複一次，櫃台：「吭？什麼的？」我再重複一次，櫃台：「是用煮的，不是用滴的唷」。我：「……拿鐵就好…謝謝。」&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/04/blog-post_12.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-361010783901097184</guid><pubDate>Sat, 11 Apr 2009 13:54:00 +0000</pubDate><atom:updated>2009-04-16T10:08:57.862+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>去宅化運動</title><description>&lt;p&gt;「御宅族」並不是21世紀新發明的詞彙，90年代左右，在日本「御宅」一詞所指的是在某個領域投注非常多熱情和心力，而有所專精的人(參考wiki)。只是後來在日本發生一些社會事件，加上媒體渲染，御宅變成一種負面的形容詞，代表：人際關係差、沉醉在幻想的世界、生活作息不正常…等等。&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;這種由好轉壞的標籤印象，也曾經發生在「駭客」一詞上。原來駭客指的是一群關心網路安全的技術人員或玩家，他們尋找電腦系統漏洞的目的在加強對電腦的保護，在當時被稱為駭客是件光榮的事；如今連網路蟑螂都會被當成駭客，叫那些原來真正想對電腦安全做出貢獻的人情何以堪呢。&lt;/p&gt;    &lt;p&gt;先撇開「宅」標籤的問題不談，那些投注大量時間在網路聊天室(含即時通訊軟體)、電腦電視遊戲、動漫畫(被統稱為次文化)的人們，的確表現出一些不利於人際關係的行為。比如說：不在乎別人的感受，在網路上發表充滿攻擊性的言論或字眼；文字及語言應對能力減弱，容易寫出錯別字，或注音文，對話時所使用的字詞彙缺乏變化，或網路式語言化；不注重打扮…甚至不注重衛生；體型變胖，尤其集中在下腹與臀部。&lt;/p&gt;    &lt;p&gt;因為上述「宅性」的養成相當依賴網路和電腦操作的技術，在電腦工程師的族群中，宅男的比例相當高。有趣的是，也是有先變成宅男再投身軟體工程領域的人。敝公司裡，說句老實話，宅男還真不少…。這些人的性吸引力相當不足，卻又常常抱怨沒有女朋友，又不肯主動改變自己。叫我介紹女生給他們，我也很猶豫呀…。叫我把他們介紹給女性友人，更捨不得唷，捨不得砸了自己的招牌。&lt;/p&gt;    &lt;p&gt;老實說，我還找不到勸人「不要宅」的正當理由。畢竟每個人都有權選擇自己過生活的方式，「宅」也是一種。就像抽菸的人不怕死，只要不要給我聞到，我也不會想勸他別抽。但假如有人想脫離「宅」的形像，我倒是有一些建議。&lt;/p&gt;    &lt;p&gt;首先是，生活中一定要找到不需要依賴電腦的嗜好。運動、閱讀、畫畫、寫作、聽音樂、跳舞、釣魚、旅行、品酒、烹飪…等等，能做的事情實在太多了，而且和宅在家裡打線上遊戲比起來，不見得比較貴。只要有任何一種不依賴電腦的嗜好，你就已經去掉八成的「宅」了。如果你的生命中還沒找到這種嗜好，請先從閱讀開始。透過閱讀你會看到別人的生活方式、別人的想法，去尋找你有興趣的題材再深入去找書，你會看見自己的興趣正在慢慢成形。&lt;/p&gt;    &lt;p&gt;再來，要把焦點放在自己的「presentation layer」上，也就是外表給人家的感覺。一定要想辦法讓自己看起來乾淨整齊，沒有異味，之後再去思考衣著形像的事。乾淨的外表第一步，就是要勤洗頭，油膩的頭髮立刻就會給人「髒」、「生活習慣不好」的感覺。還有髮型也會說話，先不說髮型應該留什麼款，至少不要讓他自由發展，要是已經長成窗廉就太超過了。&lt;/p&gt;    &lt;p&gt;第二步是臉部調理，要是長很多紅紅腫腫的青春痘，會給人「髒」、「不健康」的感覺，最好是去一趟皮膚科，請醫師開處方把痘痘治好。鬍子要是留的沒造型，沒有風格的鬍子或風格很糟，不如不要蓄鬍，剃乾淨能給人清爽的感覺。耳屎、眼屎、鼻屎不要跑出來嚇人。頭弄乾淨了，整個人就乾淨八成了。&lt;/p&gt;    &lt;p&gt;再來說衣著，如果衣服上的破洞很明顯不是故意挖洞的，請別再穿。衣服的領口或衣擺洗久鬆掉，別穿。系校服…別穿，公司的衣服，如果沒有被規定，建議也別穿。圖像是露出大胸部的女人的 T-shirt (不管是星野亞希還是漫畫角色)，別穿。褲子的話，沒有造型的短褲別穿，沒有造型的運動褲別穿，打褶褲別穿。不要穿涼鞋，不要穿拖鞋，不要穿已經破洞的運動鞋。&lt;/p&gt;    &lt;p&gt;這幾個簡單的步驟，只是先把和「宅」的直接連接給打斷，不會被看一眼就立刻被分類為宅類。然而要是動作、講話方式、內容…等等不改，三分鐘內還是會「宅神歸位」。&lt;/p&gt;    &lt;p&gt;(待續…) (打這篇花了好多時間…)&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/04/blog-post_11.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5526321511435224740.post-6290946561060232471</guid><pubDate>Fri, 10 Apr 2009 17:34:00 +0000</pubDate><atom:updated>2009-04-11T01:34:05.850+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">diary</category><category domain="http://www.blogger.com/atom/ns#">隨筆</category><title>軟體業 - 做個敬業的工程師 (2)</title><description>&lt;p&gt;續&lt;a href=&quot;http://hbtsai.blogspot.com/2008/10/blog-post_21.html&quot; target=&quot;_blank&quot;&gt;上一篇&lt;/a&gt;，雖然已經隔了許久…&lt;/p&gt; &lt;span class=&quot;fullpost&quot;&gt;   &lt;p&gt;&lt;strong&gt;4. 千萬要學好英文&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;雖然受金融風暴的影響，許多人認為美國世界霸主的權力和地位搖搖欲墜，但假設在這個時間點，你遇到另一個母語不同的國家的人，舉例來說：印度、德國…等等，你會優先嘗試使用哪個語言來溝通(不論是口說還是文字)？我相信大多數的人會先選擇英文。&lt;/p&gt;    &lt;p&gt;從二戰後到現在所累積的各項國際標準、公約、專利、學術論文等都是用英文為主要文字語言，未來我不敢說會一直都是，但至少對於目前已經在工作的工程師來講，退休前所閱讀到的國際通用的專利、技術文件很可能還是以英文為主要語言，工作上和異國工程人員的互動也是以英文為主。&lt;/p&gt;    &lt;p&gt;國際化(扁平化)的水不會只流向中國，在過去五年間，台灣…至少在我念書和工作的周遭，外國人有越來越多的趨勢。他們不見得位居要津，不見得聰明過人，不見得見解獨到，但你和外國人共事的機會就是增加了，估且不去究責為什麼他們不學中文 (唉，就算學了也是學簡中…整個向下沉淪…) (除非在台灣學中文，不然其他國家的漢學都是教簡中)，在國際場合能用越多語言溝通的人就越有優勢。&lt;/p&gt;    &lt;p&gt;台灣人從國中開始就有標準的英文教材，把英文放進國民教育裡是個很好的作法，但僵化的教育方式卻讓學習英文的人學得挫折又無趣。因此台灣人的英文能力大至上是讀&amp;gt;聽&amp;gt;寫&amp;gt;說，這當中當然也有「勇氣」因素，不過究其根本，是學習的過程死板，不實用。從國中到大學，每個人最少最少都花了七年的時間在學英文，十年的時間在使用英文，結果大學畢業還是寫不出像樣的英文履歷，文法只會用猜的還一直猜錯，開口只會「啊..啊…啊……」或「ㄜ..ㄜ…ㄜ…」，到美國要訂旅館、點餐、問路都有困難。&lt;/p&gt;    &lt;p&gt;這很糟糕…學習別人的語言並不媚外，為此放棄自己的語言才是媚外。&lt;/p&gt;    &lt;p&gt;能順利從好大學畢業的人，應該英讀都沒什麼問題，英聽也還ok，反正聽懂意思只要聽個大概就能猜，猜不出來就 pardon 一下。但英寫和英說真的很重要，是用來好好表達自己意思的工具，我們的教育系統卻不重視，真的很可惜。雖然說工程師只要看懂 code 就能工作，但在講求合作的時代，只看 code 而不溝通或無法溝通，最多成為偉大的英雄，很難成就偉大的軟體。&lt;/p&gt;    &lt;p&gt;工程師的英文好的話，有哪些好處呢？能準確解決外國客戶的問題，快速理解客戶的要求，提供意見，討論適當的解決方案。舉例來說，因為時差的關係，我們和美東的客戶整整十二小時的時差，很難抓到電話會議的時間，這時寫 e-mail 的能力就很重要。用文字表達清楚你的提案是什麼，要怎麼做，什麼東西需要對方配合，什麼是你要給對方的，風險是什麼，時程是什麼。有良好英寫習慣的人(通常至少考過托福的寫作)，就會知道第一段要寫目標，第二段要寫最重要的事、把事項先統整，後條列出來，最後加上總結和點出下一個里程碑。讓客戶讀起來很順暢，邏輯上能接受你的想法，就是成功的英寫能力。&lt;/p&gt;    &lt;p&gt;如果對方是技術供應商，送來一疊磚頭一樣厚的白皮書和上萬行程式碼，有時不見得能得到你預期的東西，不論是文件說明不足還是範例碼不能跑。如果你的英寫能力夠好，你應該可以先觀察你遇到的問題是什麼，你怎麼操作遇到的問題，系統回應的訊息是什麼，清清楚楚列給供應商，不用瞎猜，讓他們幫你解決問題。說不定，建立良好的默契後，還能進一步尋求合作機會。&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;5. 想辦法擠時間出來進修&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;我覺得工程師是一個需要不斷在技術上有所精進的行業；所謂的技術，比較廣泛來說是對語言的掌握、除錯、多線程、效能調校、軟體工程…等等(寫軟體嘛，一定要用程式語言吧、一定會碰到多線程吧，一定需要除錯吧~)。然而每天重複修改程式，用已經熟悉的工作方式去趕一個又一個不斷逼進的時程，其實只是不斷地重複操演熟悉的東西。熟悉的東西不見得不好，不熟悉的東西不見得好，但在花工夫去了解哪裡好哪裡不好之前，就主觀地排斥不熟悉的東西，是一種畫地自限。&lt;/p&gt;    &lt;p&gt;舉個簡單的例子，輸入法。我現在正在學無蝦米的速打。老實說我恨死速打功能了，因為本來打對的字現在都因為不是用速碼打出來的，全都要重打一次。這種感覺跟我當初棄注音學無蝦米很像，一整個超挫折的。但是學會後，打字速度真的加快許多，而且相當準確，沒有選字的困擾。說不定速打練起來後，打字速度又更快了。&lt;/p&gt;    &lt;p&gt;進修的標的非常多，管道也非常多。先想好要往哪個方向精進，不一定非花錢上課不可。網路上有很多免錢的電子書，有論譚，有mailing list，有開源程式。只要你有心想進步，處處都是資源。陣痛期一定會有，要忍過，忍得過就是你的。&lt;/p&gt;    &lt;p&gt;還有另一個方向就是，貴公司的 domain knowledge (e.g., 3D 引擎、系統整合、影像處理…etc.) 也是很好的進修目標。&lt;/p&gt;    &lt;p&gt;另外我想帶到一個觀念，就是工作不要換的太勤快，這對 domain knowledge 的累積傷害很大。我們說隔行如隔山，其實對於軟體來說，換個技術幾乎就是換個山頭。比如說本來做嵌入式，然後跳去寫網站資料庫，然後又去寫搜尋引擎，這些年資對於你下一個雇主來說，是不會累計的。假設這些技術各做三年，你去應徵另一家公司假設也是做嵌入式，你的年資非常有可能只算三年而不算九年。&lt;/p&gt;    &lt;p&gt;選有興趣的領域專注投入，好過於選高薪的工作卻在不同的領域間跳來跳去。&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;6. 主動溝通，不要玩弄制度&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;公司如果員工超過 100 人，溝通一定開始出現斷層，甚至在體質不佳的公司裡，還會出現派系鬥爭。不論你的公司有沒有這些誇張的人事糾紛，你都應該把握一個原則：主動溝通。例如說公司在跨部門的合作上要求有工作單，某次業務單位送一張工單來，要求你出一個測試版本給客戶，但工單上沒有勾還要哪些模組，於是你不知道該怎麼出版本，就把工單丟一邊。然後在部門例會時僅淡淡的說，業務對工單上的項目不熟悉，會中大家對於業務不懂技術抱怨了一番，就沒有下文了。&lt;/p&gt;    &lt;p&gt;一個禮拜後業務部門的主管找上你的主管，說他有張工單送出去已經一個禮拜了怎麼連個屁都沒有。一路問到你頭上，結果你說因為工單沒填好，所以版本沒有送出去。嗯…結局會是如何呢？其實我還滿好奇的。&lt;/p&gt;    &lt;p&gt;這種事情是真的發生過，而且，就在同一間辦公室的兩端而已。試想，如果是業務部門和研發部門分處台北和高雄的話？台灣和大陸？台灣和美國？這個溝通/工作模式上的落差，會需要多少時間來發現？解決？要付出多大的代價？&lt;/p&gt;    &lt;p&gt;一個主動溝通的工程師，會去找到發工單的業務，想辦法把問題釐清。主動釐清問題不是只有幫忙業務滿足客戶，也等於替公司爭取獲利的機會，同時，業務會對你有正面的印像，以後說不準還有互相幫忙的地方。&lt;/p&gt;    &lt;p&gt;這種事情看起來微不足道，但其實大小事都隱藏在公司裡，像蝴蝶效應一樣，小小的一念之間，就有可能造成很不同的後果。重點是，處在一家公司裡，負責某一項產品，如果它賣的好，你的獎金才有著落(當然…這只是種假設… )。&lt;/p&gt;    &lt;p&gt;主動溝通的好處很多，但不代表你應該逾矩去管不歸你管的事。比如說，去質疑業務為什麼要給某個客戶開放這個這個這個模組，這個是業務的考量，除非這些模組的組合有功能性上的重疊、或互斥，你覺得有責任要告知業務的，才提出來，不然就會有多管閒事，甚至給人撈過界的感覺。&lt;/p&gt;    &lt;p&gt;(待續…)&lt;/p&gt; &lt;/span&gt;  </description><link>http://hbtsai.blogspot.com/2009/04/2.html</link><author>noreply@blogger.com (Hong-Bin Tsai)</author><thr:total>0</thr:total></item></channel></rss>