#導覽列 #文章列表 #許洛豪
在光之翼的守護下訴說著一段段的英雄傳說。 [ 首頁 | 網誌 | 相簿 | 留言 | 訂閱 ]

本週的自言自語(2010-09-04)

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

Powered by Twitter Tools

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-09-04 (週六) 00:00:00

[Scala] 轉換非 Big5 至 XML 脫逸字元。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

話說前一陣子 Scala 社群裡面在吵 Scala 這個程式語言到底簡單還是難,剛好這幾天在看程式時發現這個讓人想大喊 WTF,然後投稿到 The Daily WTF 上的 Java 函式,所以就拿它來開刀了……

原本的 Java Code 長的像下面這樣:

public static String isNotBig5(String ori)
{
    char[] c = ori.toCharArray();
    char[] c1 = new char[1];
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < c.length; i++) {
        c1[0] = c[i];
        //System.out.println(c1[0]+" "+(int)c1[0]); //
        String onechar = "";
        try {
            onechar = new String( (new String(c1)).getBytes() , "Big5");
        }
        catch (Exception e) {}
        if (onechar.equals("?") && (int)c[i] != 63) { // ?是正常的"?"
            sb.append("&#");
            sb.append(Integer.toString(c1[0]));
            sb.append(";");
        }
        else {
            sb.append(c1[0]);
        }
    }
    return sb.toString();
}

因為這段程式實在醜到一種極緻,完全違反了所有 Clean Code 的原則。老實說,雖然一開始我知道這個函式是幹啥用的,但我完全無法理解這個函式到底在搞什麼鬼(看那和實際用途差了十萬八千里的函式名稱),而且它完全無法在非 Windows 的作業系統上正常使用。

最後,經過一連串的實驗,我終於看出來這個函式的演算法了(雖然他的實作是有問題的),其實這個演算法很簡單:

  1. 針對字串裡的每一個字元,做下列的動作
    1. 檢查該字元是不是在 Big5 可以表示的範圍內
    2. 如果是,將該字元轉成字串,例如從 ‘A’ 到 "A"
    3. 如果不是,將該字元轉成 XML 字元參引,例如 ‘喆’ 轉成 "&#21894;"
  2. 將上一個步驟所產生出來的所有字串,合併(連接)成單一字串。

所以,為了讓我自己往後好過一點,我用 Scala 照著同樣的演算法幹出了另一個版本,不完美,但我想應該至少清楚很多,以下就是 Scala 版的程式碼,其中 normalizeString 的角色就是原來 Java 版中的 isNotBig5():

def normalizeString (string: String) =
    string.flatMap(escapeNonBig5Character _)

def escapeNonBig5Character (character: Char): String = {

    def isNotBig5 (character: Char) =
        character.toString.getBytes("Big5")(0) == '?' &&
        character != '?'

     // 不是 Big5 的字元就轉成字元參引
     // 不然的話維持原樣
    isNotBig5(character) match {
        case true => "&#%d;" format(character.toInt)
        case false => character.toString
    }
}

def example () {
    val content = "我是陶喆\n我是游鍚堃\n這是測試"
    println (normalizeString(content))
}

如果你是從 Java 背景來的,那麼注意下面幾點應該就可以看懂這個程式:

  • String#flatMap 是指針對字串裡的每一個字元,套用一個將字元轉成字串的函式(所以這時計算出的東西會是 Array of String),最後再將此 Array of String 合併成單一的字串。
  • escapeNonBig5Character 會將字元轉成字串,規則如下:
    • 如果該字元可以在 Big5 編碼下表示,就維持原樣,但轉成字串,也就是從 ‘A’ 轉到 "A"
    • 如果該字元無法以 Big5 編碼表示,那就將該字元轉成 &#XXXXXX; 的格式
  • 判斷字元可否在 Big5 下表示的方式:
    • 例用 String#getBytes("BIG5″) 將其轉碼到 BIG5,如果他本來不是問號,卻變成問號(解析不能),那這個字就無法用 Big5 來表示。

老實講,是很簡單的轉換法,但上面那段看了就想大喊 WTF 的程式碼,我不知道為什麼能把這麼簡單的東西給搞到這麼複雜……

至於 Scala 到底難不難?!我想這真的很難說,如果你不知道什麼是 High order function (flatMap 就是一個例子),那麼 Scala 版的可能你也覺得不好懂,但相對的,我每次在寫 Scala 時都覺得真的很像在『用嘴巴寫程式』。

仔細對照一下,你會發現 Scala 的版本非常接近於一開始我們針對 Java 版的演算法所做的『描述』,所以,快點把 Java 給丟了唄(大誤)!

BTW,到目前為止我最認同的是這句話:I don’t expect a car to be built by average people, but by people with proper engineering background.

畢竟當你讓一個專業的來的時候,Scala 難不難根本不是個問題……

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-09-03 (週五) 14:16:57

本週的自言自語(2010-08-28)

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

Powered by Twitter Tools

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-28 (週六) 00:00:00

今日戰利品。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...
2010/08/22 戰利品2010/08/22 戰利品
2010/08/22 戰利品(View at PicasaWeb)

話說昨天是阿嬤的百年壽宴,但同時也是奶茶的脫掉高跟鞋演唱會,本來票都已經買好啦……但無奈撞期。:(

所以,我就在今天自暴自棄地跑去地下街把本來聽演唱會的預算拿去買表演工作坊的『我和我和她和她』,還有鶴屋學姐的 PVC 了。

話說回來,今天逛地下街的感想就是:

  • 絲茉茉妳怎麼那麼可憐,在三個一百的專區被放置 play,而且數量特多。
  • 斷頭太久果然是比較難騙錢,1/16 的鶴屋學姐竟然只剩 150 了……
跌到 150 的鶴屋學姐。跌到 150 的鶴屋學姐。
跌到 150 的鶴屋學姐。(View at PicasaWeb)

因為鶴屋學姐實在跌得太誇張,所以一不忍之之下,我就把他帶回家。(話說回來,我怎麼都沒看過遠子學姐。>_<)

回到正題,其實『我和我和她和她』我在大學的時候就看過了,也是圖書館裡的收藏,不過是 VCD 版的,畫質實在是……

但即便如此,它依然是我很喜歡的戲,裡面有我喜歡的金士傑,整體的劇本有濃濃的後設味,而劉亮佐飾演的各式角色也很歡樂,讓整齣戲不會顯得沉重過頭。

雖說我第一部接觸的舞台劇,是電影片的暗戀桃花源,但真正讓我迷上舞台劇這個表演形式的,則是這部『我和我和她和她』。

也有很多人說,暗戀桃花源是賴深川和表坊的顛峰之作,很難再有超越暗戀桃花源的作品出現了。

學姐的新鄰居。學姐的新鄰居。
學姐的新鄰居。(View at PicasaWeb)

可是真要我排名的話,不用說,第一名一定是『如夢之夢』,明明戲長七個小時,但看完後卻覺得不過癮,不想離席,這個經驗是無法取代的。

第二名就是這部『我和我和她和她』,原因我說不出來,我只能說這部戲實在太合我的味口了,我也很喜歡金士傑在戲中的爆發力,他那句:『我們站在香港的高山頂上,對著整個天空宣誓,說,我們是沒有過去的人。我們把所有的過去,通通過去了。』始終縈繞在我的心頭,至今仍未散去。

所以,這次就決定先敗這部了!畢竟,VCD 的畫質實在慘不忍睹啊……胃口真的被現在的科技和愈來愈大的螢幕給養壞了啊。orz..

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-22 (週日) 22:33:04

[調教學姐] Gentoo Linux on Aspire Aspire 3820TG.

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...
我現在的工作主力--學姐機。我現在的工作主力--學姐機。
我現在的工作主力--學姐機。(View at PicasaWeb)

話說年初的時候買了一台 Acer Aspire TimelineX 3820TG ,也就是我現在用的這台學姐機。

當初看到這台機器的消息時就很高興,雖然並不像 MacBook AIR 那麼輕,但價錢、重量、效能等等,都在我能夠接受的範圍內,而那時候買這台機器,主要的目的就是以下三點。

  • 在 Windows 下用獨立顯卡玩遊戲(雖然最後都沒時間玩)
  • 平時工作時在 Linux 下當開發程式桌機
  • 出門到咖啡廳或研討會時可以用 Linux 上網

當然第一點是沒有什麼大問題的,但問是在第二三項的 Linux,而說到 Linux 的話,對我而言似乎沒有什麼選擇,第一個想到的就是已經用到習慣的 Gentoo 。

但是買了好幾個月,雖然在上面灌了 Gentoo ,但感覺上用下來還是有好幾個不滿意的地方,列舉如下:

  • 我的 ATI 官方 Driver 跑不起來
  • Xorg 的 ATI Driver 外接螢幕無法工作
  • 電池續航力大約只有 2 到 2.5 個小時左右

老實說這些並不是什麼大問題,但用起來很不爽,因為如果外接螢幕無法工作,那麼簡報時就很麻煩,而電池續航力在像 COSCUP 等研討會上更是勝負的重點!

而在 COSCUP 會後在噗浪上看到有人聲稱這台 3820TG 在 Linux 下面的續航力是可以到五個小時的,所以我就下定決心要研究出來要怎麼調教我的 Gentoo 也能達到類似的續航力。

所以這一篇就是來講我的調教方式(誤),呃,我是說,我的驅動程設定,所使用的核心版本是 gentoo-source-2.6.35-r1。

基本上下面是目前我的學姐機上面可以正常工作的硬體以及驅動程式核心設定名稱,你可以在 Kernel Menu Config 裡面按下 / 後輸入設定名稱尋找他的位置以及相依性。

  • 音效卡 Intel HD Audio (CONFIG_SND_HDA_INTEL=m)
  • 乙太網路卡 Atheros L1C (CONFIG_ATL1C=m)
  • 無線網路卡 Atheros 802.11n (CONFIG_ATH9K=m)
  • 讀卡機(理論上是 USB Mass Storage 打開就行了)

至於 WebCam 因為沒有在用,所以不確定要用哪個 Driver。

以上都是一些基本的設定,也就是我之前用得很高興的部份,而接下來要解決的就是顯示卡和電池續航力的問題了。

經過一些思考後,可以歸納出其實上述的三個問題,本質上都是相同的--如何把獨立顯卡給關掉,完全使用內建的 Intel 顯示晶片。

經過許多試誤後,我終於找出正確的 Kernel Configuration 了,請注意,這裡的設定請盡量一模一樣,不然螢幕可能會完全出不來。

  • 首先是把基本的顯卡設定打開

    • CONFIG_AGP=y
    • CONFIG_AGP_INTEL=y
  • 打開 DRM 以及 ATI Driver,但不要打開 ATI 的 KMS

    • CONFIG_DRM=y
    • CONFIG_DRM_RADEON=y
    • CONFIG_DRM_RADEON_KMS=n
  • 打開 Intel i915 Driver 以及 KMS

    • CONFIG_DRM_I915=y
    • CONFIG_DRM_I915_KMS=y

基本上有了上面這些設定,你的 Gentoo 現在應該可以正確的在開機的時候抓到 Intel 的顯示晶片,並且在啟動 X 視窗的時候,也自動使用 Intel 顯示晶片。

而因為 i951 的顯示晶片驅動程式已經算挺成熟,外接螢幕也可以很順,用 xrandr –auto 就會自己設定了。

但這個時候如果使用 acpitool 觀看電池續航力,會發現和使用獨立顯卡時並沒有太大的差距,這是因為我們並沒有把獨立顯卡的電源給切斷。

這個時候需要以下這個核心模組來幫忙。

  • # git clone git://github.com/brianhsu/timelinex_acpi.git
  • # cd timelinex_acpi
  • # make install
經過調教後的學姐機續航力。經過調教後的學姐機續航力。
經過調教後的學姐機續航力。(View at PicasaWeb)

然後在 X Server 關閉的情況下,用 modprobe timelinex_acpi 來載入這個模組,這個時候核心會顯示 timelinex_acpi: disabled the discrete graphics card 的訊息,可以用 dmesg 觀看。

這個時候再使用 acpitool 看電池續航力,應該會發現可用時間會漸漸地往上飄,這就代表確實把獨立顯卡的電源給觀掉了。

當然,如果你想要讓電池續航力達到四小時左右的話,光是關掉顯示卡可能不夠,還是需要一些額外的設定幫忙,以下是我的設定。

  • 打開 ACPI CPU 變頻功能

    • CONFIG_CPU_FREQ=y
    • CONFIG_CPU_FREQ_GOV_PERFORMANCE=m
    • CONFIG_CPU_FREQ_GOV_POWERSAVE=m
    • CONFIG_CPU_FREQ_GOV_USERSPACE=y
    • CONFIG_CPU_FREQ_GOV_ONDEMAND=m
    • CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
    • CONFIG_X86_ACPI_CPUFREQ=m
    • CONFIG_INTEL_IDLE=m
  • 安裝 sys-power/cpufreqd,並且在電池模式時使用 powersave

  • 下面是 sys-power/powertop 建議的,但我不知道是不是真的有用

    • CONFIG_PM_RUNTIME=y
    • CONFIG_PCIEASPM=y
  • 據說 sys-power/powertop 會給很多建議,不過我自己覺得我的學姐機現在的表現已經很不錯了。

經過以上的設定,基本上我的學姐機總算是可以發揮出他應有的工能了,只是……為什麼我是在 COSCUP 之後才找出這個設定啊!害我兩天下午在 Room 3 只能看著一片黑的螢幕……

最後順道一提,其實這樣的設定還有兩個問題我還沒解決。

  • 設成內建顯卡後,螢幕亮度不能調了,囧。

  • 有的時候很明顯會一頓一頓的,看燈後是在讀硬碟,但我不知道是為什麼,有的人說是因為 AHCI 的關係,在 Windows 下也會發生,在 BIOS 調成 IDE 模式就會好,但我還沒試。

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-22 (週日) 21:45:35

本週的自言自語(2010-08-21)

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

Powered by Twitter Tools

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-21 (週六) 00:00:00

[Linux] 我的 Gentoo 在 Aspire 3820TG 上的問題。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

Gentoo 是個很棒的 Linux distro,我非常喜歡他的 Portage 套件管理系統,以及所有設定檔都可以用純文字改動的方式(很且很好找),但 Gentoo 在我的 Aspire 3820TG 上遇到了一些問題,雖然不至於無法使用,但用起來總是不夠爽。

所以這幾天在思考一下是不是該找一些其他的 Distro 來試試看,目前考慮的有以下兩個:

  • Ubuntu 10.04 這就不用說了,非常多人用,或許會比較成熟,有問題也比較找得到資料
  • Sabayon Linux 5.3 和 Ubuntu 與 Debain 的關係一樣,Sabayon 的底層是 Gentoo,而且 5.3 是兩個月前才發佈的,或許問題會比較少。

下面則是簡單的記一下我目前面臨到的問題:

  1. 電池續航力(有噗友說可以到 5hr,但我目前最高到 3hr,還是差很多)
  2. 雙顯卡的控制(我目前如果 BIOS 沒有調成獨立顯卡,會有很奇怪的行為,偶爾會 hang 住)
  3. ATI flgrx Drvier 跑不起來
  4. Xorg 的 Radeon Driver,無法使用外接螢幕
  5. Framebuffer/DRI/X Driver 的複雜交互作用搞到死
  6. Disk IO 的 Performance 好像不是很理想

大致上是這些問題,都不是大問題,但就像蚊子或蒼蠅一樣,時不時就來搞我一下,讓我有點煩。

當然,就算換了其他的 Distro 來試,最終的目的還是要回到 Gentoo 的懷抱滴,只是打算從其他 Distro 那邊找找看解決方案而已。沒辦法,Gentoo 的整個架構實在太美了,一整個打中我的痛點吶!

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-18 (週三) 22:53:46

COSCUP 2010 我給 150 分!

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...
COSCUP 2010 上魔法設計師帶來的 MikuCOSCUP 2010 上魔法設計師帶來的 Miku
COSCUP 2010 上魔法設計師帶來的 Miku(View at PicasaWeb)

COSCUP 2010 在星期天終於結束了,連續兩天的活動全程跑下來,感覺比上班還要累啊……

話說如果要評分的話,這次 COSCUP 如果滿分是一百分,要說我會給兩百分那就是矯情了,我大概會給個一百二十到一百五十分吧。

其中被扣分的地方是報名系統這次出的包實在是太大了,讓參加者洗了一次三溫暖,然後工作人員的負擔也加重(工作人員也是人啊)。

不論如何,這次 COSCUP 辦得很成功是無庸至疑的,唯一的問題在於我覺得我自己的那一場因為準備不足,實在講得很糟糕啊,內容很虛而且時間也沒掌握好。(掩面奔)

所以,我明年也會繼續投稿 COSCUP 來雪恥!而且我的 LT 題目也已經想好了:Live IRC 救 Presentation(誤)。

回到正題,這次 COSCUP 或許是和 GNOME.Asia 合辦的關係,主題涵蓋的相當廣,而且四軌議程同時進行,這個時候就會好想要有影分身術啊!因為常常四場都很想聽。

但這次印象比較深刻的應該算是 FLOSS & Digital Art  這一軌的議程。

其中聖博介紹的 Processing 早有耳聞,但一直不知道他到底可以做到什麼樣的效果,這次透過聖博的 Live Demo  和作品介紹,總算稍微了解 Processing 好玩的地方了!(透過寫程式來做 MV 實在是太好玩啦,害我也想試試看拿來做 MAD)。

而魔法設計師的那一場,雖然感覺和自由軟體沒啥關係,但因為出現了初音的 PVC  所以加一百分!(誤)

喔,不是,我是說他的那一場給我對於音樂又一種不同的看法,而第二天的茶點時間跑去和他攀談,問了一些像是我這種五音不全又沒節驟感的人要怎麼樣接觸音樂之類的問題。

聽了他的說法後,害我想去買一把烏克麗麗來玩了啦。>_<

最後,第一天下午依瑪貓示範的 OpenOffice.org 魔術真的超神奇的說,我完全沒有想過竟然可以透過網路來即時操作 OpenOffice 耶!杰克,這真是太神奇了!

總而言之,這次的 COSCUP 我只能說,我給所有人一個 GJ (除了我自己之外)。

但話說回來,我不同意這句『今天參加完coscup,我覺得更確定自已喜歡的東西是什麼了!!』。

因為,每個人講的東西都好好玩,害我更加不知道我應該要先玩什麼了啦!>_<

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-18 (週三) 13:55:50

本週的自言自語(2010-08-14)

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

Powered by Twitter Tools

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-14 (週六) 00:00:00

Windows 上架設 Git 伺服器。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

到中研院上工一個多月,現在慢慢接手一些東西,主要是一台 Windows 2003 的伺服器,以及一些有些雜亂或是老舊的小工具程式。

要說到雜亂的程式碼的救星,那當然就是版本控制系統啦!也因為這樣,這幾天在規劃的就是要怎麼樣一步一步來整理這些程式碼,以及劃出一條安全的防護線,例如說至少所有的程式碼從此刻起都要進到版本控制系統來控管才行。

雖說這台 Windows 2003 上已經有了 Subversion 的服務存在著,不過你也知道的……習慣了強大的 Git 之後,回去使用 Subversion 真有一種綁手綁腳的感覺。

於是,我想把一些目前是只有我自己在維護的東西,給放到這台伺服器上並且使用 Git 來做管理,並且讓這台 Windows 2003 成為一台 Git Server。

但很不幸的……要在 Windows 上架設 Git Server 好像很麻煩,Google 了一下,幾乎都是教你用 CopSSH 來做,但不知道為什麼,我就是沒辦法試成功。

最後,我發現如果你只是要很簡單的 remote access,而且不在意傳輸過程沒加密的話,以下的步驟可以讓你超簡單在 Windows 上架設 Git Server。以下假設我們將所有 Git 的 repository 集中放在 D:\GitRepo 這個資料夾下。

  1. 安裝 msysgit
  2. 執行 GIT-bash
  3. 在 git bash 裡執行下列指令
    1. mdkir /d/GitRepo # 建立檔案庫資料夾集散地
    2. mkdir /d/GitRepo/testRepo
    3. cd /d/GitRepo/testRepo
    4. git init # 建立 Git repository
  4. 接著,直接把 D:\GitRepo 用網路芳臨開分享就好啦,權限控管也是在這邊設定
  5. 接著,在 Client 端把你開出的網芳分享掛到 Z: 磁碟機
  6. 然後就可以在 git bash 裡面用 git clone /z/testRepo 來複製這個 repo 了!
  7. 當然,git push/pull 也都是可以用的。

就是這樣簡單,我們都想太多了……Git 本來就可以直接對躺在本機檔案系統上的 repo 做 push/pull,所以我們只要能讓遠端的檔案系統看起來像本機的檔案系統就解決了!

夠簡單了吧?可是我不知道為什麼之前都沒人告訴我啊!>_<

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2010-08-10 (週二) 21:42:12