2013/09/15

Hackintosh kernel panic after update to OS X 10.8.5 from AppStore

My Hackintosh Hardware硬体配備:

  • GA Z77-DS3H rev 1.1
  • intel core i7 3770

Symptom 症狀

Kernel panic in AppleHDA.kext

 Resolutions 解決方法:

http://www.tonymacx86.com/articles/108809-article-os-x-10-8-5-update-5.html#post662835
http://www.macbreaker.com/2012/01/list-of-common-hackintosh-boot-flags_29.html
在chimera boot options 不要直接按Enter,要輸入 -v -x -f -s 進入verbose 、安全模式、不用cached kext (kernel module) 單人模式

$ /sbin/fsck -fy

$ /sbin/mount -uw /
用vim 或 vi或 emacs編輯 /Extra/org.chameleon.Boot.plist

$ vim /Extra/org.chameleon.Boot.plist
  1. 尋找 EthernetBuiltIn把下一行的Yes 修改成No
  2. 尋找Kernel Flags,把下一行的選項 -npci=0x3000砍掉
  3. 離開vim,exit 重開機

2013/08/19

[Cpp11] C++11 Move Semantics and RValue-Reference

為了回應 COdE fr3@K大大的Coscup2013講稿“C++: 誰說只能硬著來?”,我回家用g++49 -std=c++11實驗了,是否用std::move 搭配 RValue-Ref in constructor可否達到ZERO COPY
#include <utility>
#include <algorithm>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;
class mystr{
public:
    int   len;
    char* buf;
    mystr()
        : len(0) , buf(NULL)
    {
        printf("trivia ctor\n");
    }
    mystr(int l)
        : len(0) , buf(NULL)
    {
        printf("length-spec ctor, l=%d\n", l);
        buf = (char*)malloc(len);
        len = l;
        memset(buf, 0, len);
    }
    mystr(const mystr& rhs){
        printf("copy ctor const& \"%s\", len=%d\n", rhs.buf,
                rhs.len);
        buf = strdup(rhs.buf);
        len = rhs.len;
    }

    ~mystr(){
        if(buf){
            printf("dtor free (\"%s\"), len=%d\n", buf, len);
            free(buf);
            buf = NULL;
            len = 0;
        }
        else{
            printf("dtor nothing to free\n");
        }
    }
    mystr(const char* rhs)
        : len(0), buf(NULL)
    {
        printf("ctor from char* \"%s\"\n", rhs);
        buf = strdup(rhs);
        len = strlen(buf);
    }

    mystr(mystr&& rhs)
        : len(0), buf(NULL)
    {
        printf("ctor RRValue; swap: buf=\"%s\" len=%d \n", rhs.buf,
                rhs.len);
        std::swap(buf, rhs.buf);
        std::swap(len, rhs.len);
    }


    mystr& operator=(const mystr& rhs){
        printf("assignment copy: \"%s\"\n", rhs.buf);
        if(buf)
            free(buf);
        buf = strdup(rhs.buf);
        len = rhs.len;
        return *this;
    }

    mystr& operator+=(const mystr& rhs){
        printf("concat \"%s\" + \"%s\", len=(%d + %d)\n", buf,
                rhs.buf, len, rhs.len);
        char* newbuf = (char*)malloc(len + rhs.len + 1);
        memcpy(newbuf, buf, len);
        memcpy(newbuf+len, rhs.buf, rhs.len);
        newbuf[len+rhs.len]=0;
        free(buf);
        buf = newbuf;
        len += rhs.len;
        return *this;
    }
};


mystr foo(mystr rhs){
    printf("etner foo\n");
    mystr ret("foo ");
    ret += rhs;
    printf("[foo] return \"%s\"\n", ret.buf);
    return ret;
}
int main(){
    mystr a("apple");
    mystr fooapple = foo( std::move(a) );
    return 0;
}

執行結果

 passing 到 foo() 函式時,若是使用std::move(),的確是ZERO COPY。看 ctor "apple"的個數,只有一開始在main()的那唯一一個,確定是zero copy
ctor from char* "apple"
ctor RRValue; swap: buf="apple" len=5
etner foo
ctor from char* "foo "
concat "foo " + "apple", len=(4 + 5)
[foo] return "foo apple"
dtor free ("apple"), len=5
dtor free ("foo apple"), len=9
dtor nothing to free

2013/04/02

[FFMpeg Concat] Use FFMpeg to concat MP3 files of 地球村高級美語CD

#!/usr/bin/env python

# you must have ffmpeg in $PATH
import os, sys, glob

for i in range(1,14):
    flist = "|".join(glob.glob("%02d??-A.mp3" % i ))
    os.system('ffmpeg -y -i "concat:%s" -acodec copy %02d.mp3 '\
         % (flist,i) )

2013/03/27

[history of C] 為什麼Caesar古拉丁語是唸「凱撒」,但英語是唸「西撒」?

古拉丁語的C是發/k/或/g/,/k/與/g/之間只是送氣與不送氣的差異,這很好理解。但英語字中的C有時唸/s/有時唸/k/;/s/是齒齦擦音,/k/是軟顎塞音,這也差太多了吧?

西元五世紀之前,羅馬帝國版圖擴張,從原本的義大利半島擴張到大半歐陸與西亞、北非。帝國底下人民牛蛇雜處,古典拉丁語發展成了通俗拉丁語,C開始「顎化」。C碰到「軟母音」(如 Ce, Ci)時顎化成/tʃɛ/或/tʃi/。這就像中古漢語「權」是唸/kɛn/,但現化漢語是唸/tʃɛn/;中古漢語「氣」唸/ki/,現代唸/tʃi/。

西羅馬滅亡後,六世紀到九世紀間,羅曼語族(法蘭西與伊比利半島)取代通俗拉丁族,CeCi變成/tsɛn/與/tsin/。大約12世紀,法國人進行拼音改革,用C去取代一些原本發ts的音的拉丁文,比如 gratia grace。到了13世紀末,/ts/音完全「去爆擦化」(de-affricated) 變成/s/音。從此 CeCi就發/sɛ/與/si/的音。

再來,雙母音ae在古典拉丁文是唸/ai/,但雙母音在中古英語末年遭遇「母音大推移」,發音會把前母音省略掉,如oe→e,ae→e。Caesar此字在英文中雖仍保持古拉丁語的模樣,但a不發音了,變Cesar,然後C從/tʃ/變/ts/再變/s/,所以現代英語是發/ˈsizɚ/。

2013/03/23

[English Phonology] 美式英語發音,是否有任何規則可循?

在地球村跟外國老師學美語三週以來,發覺我聽力差的問題是在於我的發音不正確。尤其是在syllables(音節)大於三個的word時,stress(重音)位置錯誤。

第一種:字首為"re-"者,重音不一定在第二音節,要視詞性與音節數

字首為"re-"者,且之後接的是熟悉字根(root)時,重音通常在"re-"之後,例如:rebuild,react,refine。

但對某些古老的字而言,字首"re-"並非可拆解的,這時,重音的位置,就要看此字是動詞還是名詞/形容詞。動詞時,重音在第二;而做名詞/形容詞時,重音在第一。請參見 Initial-Stress-Derived noun
  • related(與..有關) 有三音節,發音為 /rɪˈletɪd/,重音在第二音節,因為它是動詞。
    relative(相對;親戚)也有三音節,發音為/ˈrɛlətɪv/,重音移至第一音節,因為它是形容詞/名詞。
  • record當動詞時,發/rɪˈkɔrd/,重音在第二音節。
    record當名詞時,發/ˈrεkɝd/,重音移至第一音節。

例外

  • reconcile為動詞「調停」,但重音在第一音節/ˈrεkənsaɪl/
    這是從古拉丁文reconcilare來的,所以字首"re-"是不可拆解的。
  • resort不論是當動詞「訴諸」還是名詞「旅遊勝地」,重音都在第二音節 /rɪˈzɔrt/


第二:非重音音節/ə/的消失

此規則只適用在三音節以上的word,因為人發音有惰性,一個字的音節能越少越好,但絕不能減少到只有一個音節,不然字與字之間將失去辨別性。某些部落對數字的概念只有「一、二、多」,我想「三就是太多」此概念是普遍存在於全人類腦中。
參見維基百科「Schwa /ə/ 的消失

  • factory本來發/ˈfæktərɪ/,但常省略成/ˈfæktrɪ/,從三音節變兩音節。
  • interesting本來發/ˈɪntərɪstɪŋ/,但常省略成/ˈɪntrɪstɪŋ/,從四音節變三音節。
  • decorative 字典音標為/ˈdεkəretɪv/,但地球村所附CD發音為/ˈdεkrətɪv/,Google發音為/ˈdεkɚtɪv/,都是從四音節變三音節, 然後第二音節從/re/弱化成/rə/再變成/ɚ/,就如同centre發/ˈsεntɚ/而非/ˈsεntrə/。
  • reciprocity字典音標為/rεsəˈprɑsətɪ/五個音節,但實際上口語會唸成/rεsˈprɑsətɪ/四個音節,或甚至/rεsˈprɑstɪ/只有三音節。


第三:雙音節的/ɪ/強化成/aɪ/

  • Iraq字典標音為/ɪˈrak/,但老美常唸成/aɪˈræk/。Iran也是如此。
    這中間的強化演變為:
     /ɪ/ → /ɪ:ɪ/ → /əɪ/→ /aɪ/
    從閉口音變成開口音。
  • Pisces(雙魚座)字典標音為/ˈpɪsiz/,但實際上老美是唸/ˈpaɪsiz/
  • Jedi(星際大戰中絕地武士)發音為/ˈdʒɛˌdaɪ/
  • mobile 字典標音為/ˈmobil/,但有些老美唸/ˈmobaɪl/
  • 另一例子,one在中古英語發音為 /onɛ/但現化人發/wʌn/,此強化順序為:
    /o/ → /o:o/ → /ᴜo/ → /wo/ → /wʌ/



第四:"stion"念成/stʃən/而非/sʃən/

"stion"不念成/sʃən/的原因為,雙重絲音(/s/與/ʃ/)將使尾音節難以辨識,所以要發成/stʃən/。
  • question發音為/ˈkwɛstʃən/
  • suggestion發音為/səˈdʒɛstʃən/
  • ingestion發音為/ˈɪndʒɛstʃən/


第五:非頭音節的h不發音

三音節以上的字,若/h-/字首的音節出現在第二、第三等位置,h不發音。
  • annihilation 發/ənaɪəˈleʃən/
  • rehabilitation 發/rɪəbɪləˈteʃən/
    但是rehabilitation 簡稱為 rehab 發/riˈhæb/
uninhabitable中間的h有發音,因為其字根分別為habit。

第六:「外來語」

resume 有兩種發音,當動詞「回復」時發 /rɪˈzjum/ ,重音在第二音節。
當名詞「履歷表」時發/rɛzᴜˈme/ ,重音在最後一個音節(第三音節)。因為此字是法國外來語,法語偏好將重音放在最後一個音節。
另外一提,老美常以CV(curriculum vitae)來指履歷表,而不用resume。

參考