在 Trac 裡把參與者自動加到 cc list 裡面的 plugin

之前在 Trac 裡會想要達成「當使用者參與這張票時,自動加到 cc list 讓他收到後續的更新」這樣的功能。之前沒有仔細研究要怎麼在 Trac 裡面實踐,就直接在 template (也就是 site.html) 裡面用 javascript 在 client 做掉...

先拉出 authname

<script>
(function() {
    window.authname = "${authname}";
})();
</script>

然後再攔截網址裡有 /ticket/ 的頁面,當 form 符合條件時攔截 submit 事件,在 cc list 裡面沒有自己時把自己加進去:

// Add myself into cc list, if I am not in cc list now.
(function() {
    if (-1 === document.location.href.indexOf('/ticket/')) {
        return;
    }
    var cc_list = jQuery('input[name="field_cc"]').val().split(/[ ,]+/);
    for (var i in cc_list) {
        if (window.authname === cc_list[i]) {
            return;
        }
    }

    jQuery(function() {
        jQuery('form#propertyform').submit(function() {
            var cc = jQuery('input[name="field_cc"]');
            cc.val(cc.val() + ',' + window.authname);
        });
    });
})();

這樣是可以達成目的啦,但有種惡搞的感覺... 所以這次還是寫了個 Trac plugin 來解決,這樣不用擔心當網頁界面改版時會產生問題:「104corp/trac-addtocc-plugin」。

CC BY-SA 4.0 的素材可用於 GPLv3 的作品裡

Creative Commons 在經過幾個月的分析後,認為 CC BY-SA 4.0 相容於 GPLv3 的要求:「CC BY-SA 4.0 now one-way compatible with GPLv3」。

In January we officially opened a public consultation (blog post) on CC BY-SA 4.0 unilateral compatibility with GPLv3, in accordance with our ShareAlike compatibility process and criteria. Following additional months of detailed analysis, discussion and deliberation with the Free Software Foundation and other stakeholders, we are very pleased to announce that we have added a declaration of one-way compatibility from CC BY-SA 4.0 to GPLv3 to our compatible licenses page!

也就是說,CC BY-SA 4.0 的素材可以放到 GPLv3 的作品裡使用並且散佈。不過要注意的是,這是 CC 的分析,而不是法院判決的結果...

Yuren Ju 的 ptt redirect:從轉載網站自動轉回 Ptt 原文

Twitter 上看到的 Google Chrome Extension 專案,針對轉載自 Ptt 的網站自動轉回 Ptt 原文:

程式在「ptt redirect」這邊,而原始程式碼在 GitHub 的「yurenju/ptt-redirect」這邊。

目前只支援 disp.cc,應該還有好幾個站可以支援...

C 語言的 extern 與 static...

把十年多的 BBS source code porting 到 Ubuntu 上,被迫要用 GCC 4.6 而一路找出來的...

在 BBS 內有這樣的資料結構要處理:

typedef struct p {
    struct p *pointer;
} P;

static P p1 = { &p2 };
static P p2 = { &p1 };

兩個要互指,但在指定 p1 時 p2 還沒有被定義,所以要用 extern 先宣告:

typedef struct p {
    struct p *pointer;
} P;

extern P p2;

static P p1 = { &p2 };
static P p2 = { &p1 };

這個語法在舊版的 GCC 沒問題 (3.4),但在新版的 GCC 4.6 上不接受這個寫法,會抱怨後面的 p2 實際在宣告是 static,與前面的 extern non-static 不符。

後來在 Stack Overflow 上找到「static extern vs extern static」這篇說明,要先定義 static 再定義 extern:

static P p2;
extern P p2;

這樣寫的原因在原文的下方有說明,所以是 C99 定義的關係?

回新竹參加婚宴...

塞車塞到爆炸 (坐客運還遇到前一台發車的車子拋錨,乘客在高速公路上換到我坐的這台車...),然後就遲到快一個小時了... +_+ (圖片就是抛錨的三重客運 XD)

抛錨的三重客運

星期五先去天瓏TCP/IP Illustrated, Volume 1,結果到現場發現沒精裝本,只有 Volume 2 有精裝本...

書本身的故事就不講了 (當天兩位新人解釋了老半天 XD),下面是請 Blake 學長頒獎的照片:

婚宴後先跑去交大門口的土地公廟拜拜,然後發現二餐改建中,就整群人跑到資工系系計中... (發現都不太認識了 XD)

系計中新機房整理的真不錯啊,而且機房冷氣超冷,跟以前比起來舒服多了...