沒穿方服

首頁

2014 生祥樂隊「我等就來唱山歌」發行 15 週年紀念演唱會,6/7 在 Legacy Taipei。

台灣流行音樂是不是庸俗的製造工業,我們有沒有嚴肅的狹義搖滾? 需要最硬最深刻的音樂要找誰?我的答案就是交工樂隊,而且僅此一支,遺憾的是從沒看過現場,解散了嘛。 幾次看生祥演出風神 125,總覺得少了嗩吶還是欠一味,這回總算逮到機會,看到編制就確定買票。

特別跟台灣的金屬樂團怨一聲,你要嘛夠幽默,要嘛有文化,不然再黑再兇也硬不起來啊。

意外的早 SOLD OUT

通常我聽的音樂,票都賣不完,而且 indievox 這次居然只能 iBon 取票,基於抵制統一我就沒急著搶,結果 5/27 就沒票了…… 幸好發生好運 no.1 徵到一張,否則真會嘔死。 非常感謝你錢同學。

生祥的音樂我身邊愛的不多,他們不喜歡主唱客家人扁扁的嗓音 (?),而交工樂隊解散後,沒了嗩吶和鑼鼓也變得比較清淡,和現代流行音樂的刺激度有差。 這次這麼快完售(700 張票)其實有點意外。

當晚我就開演前 10 分鐘才到 legacy —— 裡面居然是滿的,還列了椅子! 我怎麼能坐著聽搖滾呢?

更慘的是要坐在後段的位子,跟預期完全不符。 坐了幾分鐘覺得不行,就往前尋覓,終於出現好運 no.2,四排有個非「這邊有人坐喔」的空位,非常感謝妳美女。

見證新音色、新編曲

開頭曲也是專輯的開頭曲「下淡水河寫著我等介族譜」,阿太的阿太太的時節啊(曾祖父、曾曾祖父的時候)……
起頭是一段月琴伴奏的清唱,講美濃人的族譜,立刻帶進一股時光滄桑的悠久感,感覺我們好老,還好電月琴是新的。

這首中間就進入全編制讓大家第一次聽見所有樂器的聲音。 我還沒聽過「我庄」這兩張,所以連大竹研的電吉他(印象中都彈木吉他)和早川徹的電貝斯都覺得新鮮, 加上打擊(吳世墉)和吹奏(黃博裕),確定水準完全超出預期,中樂透。

重現反水庫,「好久沒有唱這些歌」

「夜行巴士」插電版。 這首重 riff 的歌,插電後大幅翻升的威猛度先不說,賺我一把老淚的,果然還是鐘永豐的歌詞。 好的故事在現場聽對的代言人講述,果然不是錄音可比擬。

「想我這一生人就要無效喂,但是這次我不會再膦棍喂」

整場演出後面都有投歌詞字幕(看得懂的,非客語用詞),雖然有點礙眼,但我自己也偶爾要偷瞄,就接受吧。

之後的「我等就來唱山歌」「山歌唱來解心煩」「水庫係築得,屎嘛食得」(不照順序)都是全場合唱。 生祥直接說有分軌錄音,也有教台下綵排,出來效果很棒,大家都很支持反水庫運動。

中間聽生祥說起,肯定這次大腸花的療瘉效果,他們那時還沒有「運動傷害」的說法,我才確知美濃反水庫最後是沒有成功的,拖了五次表決才終告失敗,鄉親回去的第二天也是一場飆髒話的聚會。 時代有進步,318 算是成功的,希望長輩們欣慰。

美麗島

插了兩首新專輯的歌,便從合音組請出特別來賓楊祖珺,「我相信台下很多朋友一定會唱這首歌」,結果我不會唱。

縣道 184

到這首歌有種駛入 disc 2 的感覺,第二張專輯「菊花夜行軍」的序曲「縣道 184」。 接著中間沒有休息,平靜地銜接「風神 125」,原來不是安可曲嗎? 大概就是這樣安排的有戲,所以不知不覺就唱掉 2 小時,坐得有點酸。

風神 125,請務必發行 live 錄音,整場下來的新編曲,以後聽不到怎麼辦呢。

菊花夜行軍~安可曲

由當年(參與錄音)還在念小學的羅景賢扮演大黃(菊花品種),現在已經是學運青年了,養兵成功。

安可曲是「我庄」的「草」,其實我是第一次聽這首歌,最後的樂手 solo 有過癮到,可接受喊第二遍安可時,生祥用「我的腰已經不行了啦」躲過。

這次的觀眾從學生到阿婆都有,有昏睡的小細阿妹,有穿樂生 T 的女孩熱切想跟大竹研合照(魅力強大),也有像我這樣的硬漢。 本人判斷,社會上願意關懷、包容抗爭的人變多了,對搖滾的需求也增加了,歡迎資本主義社會多來賺我們的錢。

Firebug 2.0 即將於 6/10 登場,底層引擎換成 JSD2,可望解決這段時期常感受到的龜速、死雞、蟲蟲問題,感謝 Firebug Team 的努力!

Getfirebug blog 對每個 beta 發行都有相關介紹,爬文請見 Firebug Releases


UI 改善

支援 Australis,把 Firebug 整合到新的 Firefox 選單按鈕,在不同 OS 也有與系統原生介面相合的設計了。

不過比起 Australis,更實用的還是其他細節的改善,例如「主控台」面板右上角多了一顆小箭頭,用途是「開關指令碼編輯器」,雖然跟右下的紅箭頭功能相同,但介面跟其他面板「開關側面板」的按鈕更一致,我現在幾乎不會按舊的按鈕了。

新版介面

舊版擷圖 舊版介面

主控台 log 合併的計數顯示,也改為放在左邊;

log 合併

舊版放在右邊,比較不容易看。
舊版的 log 合併


即時語法上色 (syntax highlighting)

Script 面板終於有顏色了!
(擷圖左邊是舊版,右邊是 2.0) Script 語法上色
Script 語法上色(逐步除錯中)

HTML、CSS 面板的「即時編輯」也一樣,按 Enter 換行時也會自動縮排,更像一般編輯器了。
CSS 語法上色
HTML 語法上色


Script 面板的 Pretty Print 功能

按一下「{}」按鈕就能把壓縮過的 JS 轉為易讀的格式。

Pretty print


檢測/修改函數的 return value

導入 JSD2 後,可以在 return statement 作逐步除錯了,如下圖在 return 行放中斷點,中斷後再 Step Over (F10) , debugger 會停在同一行,但右邊「監看」面板會得到 foo() 的回傳值,而這個值也可以當場編輯。

檢測 return

可以在 Getfirebug 的 DEMO 頁試試: Issue 6857: Give the ability to modify the returned value


自動完成

命令編輯器(Command Editor)可以按 Tab 自動完成。

指令碼編輯器的自動完成

設定中斷點條件時,也能自動完成該 scope 中的變數。

中斷點條件設定的自動完成


錯誤、中斷點相關改善

2.0 對「在所有錯誤中斷」和「在這個錯誤中斷」(就是放置中斷點)功能作了一些修正。

Thanks to JSD2 API Firebug could finally implement it correctly.

不是新功能,應該只是修正而已。

在所有錯誤中斷
放置中斷點

另外新增了「在例外中斷」功能,也能「忽略已捕捉的例外」忽略程式中已有 catch 區段的例外。

在例外中斷


Script 面板的其它改善

  • 滑鼠 hover 語句時顯示(運算值)預覽的行為,變得比較細緻。
  • Script 中的物件都能檢測,也能「在命令列中使用」(舊版曾有此功能,但常出錯)。
  • 滑鼠選擇起來的 expression 片段也能檢測,也能在命令列中使用。

HTML 面板可以使用正規表示搜尋

正規表示搜尋


以 JSON 格式匯出 cookie

註:需要自己在 about:config 打開 extensions.firebug.cookies.jsonClipboardExport 才能使用。

匯出為 JSON


Console API in Web Workers

Worker thread 中也能使用 console.log 等方法。


檢測 DOM 事件

繼 Firecookie 被整併後,EventBug 也變成 Firebug 的一部分了。

HTML 面板新增的「事件」側板會列出 DOM 節點上有效的事件監聽器(event lisenter), 顯示事件類型、函數名稱、是否 useCapture 等資料。

列出的監聽器,除了元素上用 addEventListener 註冊的「直接」監聽器之外, 若事件 bubble 上去有其它 target 監聽,就會以「監聽器 來自 div#foo」(原文 "Listeners from")型式列出。

另外還有註冊於 window、document 上的監聽器,因為無法在 HTML 面板找到元素,所以不管檢測什麼節點時都會列出,顯示為「其它監聽器 Window」(原文 "Other listeners for")型式。

其它監聽器

點函數名稱會跳到 Script 面板;也可以像 CSS 一樣,在名稱前面按一下就啟用/停用監聽器。


監聽器的 wrapped function 顯示

使用一些 JS library 監聽事件時,例如 jQuery 的 element.on('click', handler),實際綁在元素上的將不是 handler 本身,而是一個把 handler「包」起來的 wrapper 函數,事件發生時,再由 wrapper 呼叫 handler 並把結果回傳。

問題是我們除錯時,通常對 wrapper 函數沒興趣,「被包裹」的 handler 才是我們想看的東西, 這時就可以開啟「顯示被包裹的監聽器」選項,Firebug 就會連被包裹的函數也一起列出來了。

顯示 wrapped 函數
wrapped 函數

若 handler 是採用 jQuery 綁在上層元素,但只對特定 selector 起反應的 delegation 方式,Firebug 也會把「jQuery selector filter」標示出來。

jQuery selector filter


Firebug 2.0 只支援 Firefox 30 以上的版本,而 Fx 30 目前也在 beta,預定 6/10 釋出。 若想試試 Firebug 2,就安裝 beta channel 的 Firefox 30 吧。

簡言之,編輯完衝突的檔案、用 add stage 起來後,下一步應該是 rebase --continue 才對; 但我一直是 commit,然後才 rebase --continue,大錯啊!

學習 rebase 時一直疑惑「fix conflicts and then run "git rebase --continue」裡的「fix conflicts」到底是什麼動作,最後試出來是 git commit(錯),就一直錯到現在。


示範一下 commitrebase --continue 誤用的慘狀。

  1. 我在 upstream branch。
    Log 最下面的 commit 是沒問題的,但上面兩個 commit 等下會有衝突。
    註:純 demo 方便,通常不會在 upstream 作 rebase

    upstream 的 log
  2. 另一個 branch demo,我做了一個 commit,等下 rebase 時會衝突。

    demo branch 的 log
  3. 開始 git rebase -i demo,果然衝了。

    進行 rebase,產生衝突

    出現 git 提示「fix conflicts and then run "git rebase --continue」。

  4. 手動編輯衝突的檔案(解除衝突),過程省略。

  5. git add . 把解好的部分 stage 起來,到此為止的步驟都沒有問題。

    將檔案 stage 起來,視為已手動解完衝突
  6. 錯誤的做法:git commit
    會進入編輯訊息畫面,預設訊息還會附上 Conflicts: src/vars.js

    使用 git commit 時的 commit 訊息編輯畫面

    雖然覺得奇怪(不是解了嗎?)但習慣後就不會再卡了,還會視情況把 Conflicts: 部分刪掉……

  7. git commit 的結果:

    commit 後的結果

    糟糕的事發生了,author 和 committer 都變成我了,這不能接受啊!

    git 用這麼久,怎麼可能沒發現呢?
    其實印象中有幾次 rebase 後作者變成我,覺得很怪就沒 push 出去,但發生次數很少,大概是不常收 pull request、解衝突時幾乎 author 都是自己吧。

  8. 正確做法 git rebase --continue 後的預設訊息。

    使用 git rebase --continue 時的 commit 訊息編輯畫面

    不但沒有 Conflicts:,也有顯示原作者是誰。

  9. 正確結果,committer 是我,但 author 保持不變。

    continue 後的結果

git config 調整

Git 2.0 RC 1 了,確認一下 push.default 設定。

[push]
  ; git 2.0 以前預設為 matching, 會將所有同名 branch push 出去
  ; git 1.7.6 以前可以用 tracking (deprecated),等於後來的 upstream
  ; git 1.7.11 開始可以使用 simple,即 2.0 預設值
  default = tracking
  default = simple

參考 git-config Documentationpush.default 條。 進行 git push,沒指定 refspec 時,舊預設值 matching 會把 local 的所有 branch,只要 remote 有一樣名字的就推出去。 但通常我們只會改一個 branch,也只有這個 branch 是要給別人看的,如果意外把其它 local branch 也推出去就糟了。 所以選 simple 比較適合,會先試 upstream 的作法把「目前的」branch 推到它的 upstream(可以用 git branchgit push--set-upstream 設定,或直接在 .git/config 中設 [branch.foo] 的 remote);如果 git 找不到已知的 upstream,會再嘗試 current 作法,推到與目前 branch 同名的 branch。


看過 doc 後也順便改了:

  • Config 的各個 key 不分大小寫,但預設產生的是全小寫,於是手動改成 camelCase。
  • [log]
      abbrevCommit = true

    只顯示 hash 的前幾個字,這樣 tmux copy-mode 複製時,用 word selection 取到的東西比較簡短。

  • git branch 的 alias 預設加上 --verbose 選項。

    zshrc:

    alias gitb='git branch -v'

    git branch -v

移除 Web Developer 後發現少了「清除 domain cookie」功能,於是補寫一個 FireGestures script,設定為 ← ↓ → ↑ ↓ (LDRUD)Cookie、上下為關閉)取代之。

先詢問再砍 結束時 alert 找不到 domain cookie 時

// Require Firefox 17
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/Services.jsm");

var
  manager = Services.cookies,
  prompter = Services.prompt,
  hostname = gBrowser.currentURI.host,
  cookies = manager.getCookiesFromHost(hostname),
  cookie,
  dialogTitle = 'FireGestures script',
  kills = [];

while (cookies.hasMoreElements()) {
  cookie = cookies.getNext().QueryInterface(Ci.nsICookie2);
  if (cookie.rawHost === hostname || hostname.endsWith('.' + cookie.rawHost)) {
    kills.push(cookie);
  }
}


if (kills.length) {
  if (prompter.confirm(
        null,
        dialogTitle,
        [
          hostname,
          '移除 ' + kills.length + " 個曲奇?",
          "\n  " + kills.map(function (cookie) { return cookie.name; }).join("\n  ")
        ].join("\n")
      )) {
    kills.forEach(function (cookie) {
      manager.remove(
        cookie.host,
        cookie.name,
        cookie.path,
        false
      );
    });
    window.alert('已移除 ' + kills.length + " 個曲奇。");
  }
} else {
  prompter.alert(
    null,
    dialogTitle,
    hostname + "\n沒有需移除的曲奇。"
  );
}