來源請求.js

很早以前就想講了,但講了大概又會被戰。相較於英文維基百科,中文維基百科在社會和歷史條目充滿了 systemic bias。但是那些主觀論述又不是編輯者有意加進去的,而是某種編輯者存在的社會所給予的暗示(Inception?)與集體共識,而不是原本百科全書應該有的可驗證的事實。因為是暗示又是共識,所以有自覺的百科編輯者反而是少數;中文維基只好長成現在這個樣子了。

總之我昨天還是在噗浪上提了,還被協會的人看到 XD。想想作為一位 Web Developer,我還是用寫 code 的方式來貢獻維基百科好了,別花時間跟別人吵架好。

所以,來源請求.js到底是幹嘛的呢?這是一個可以安裝到 Wikipedia 帳號的 User Script,安裝之後,每次在文章裡面選一段文字,旁邊就會出現 [citation needed] 按鈕,按下去確認之後就會自動編輯文章,加上「[來源請求]」的標記。

安裝方法是,登入之後到 Special:MyPage/common.js 頁面,編輯插入下列程式碼:


importScriptURI(
    'https://raw.github.com/timdream/citationNeeded.js/master/citationNeeded.min.js?'
    + Math.floor((new Date()).getTime()/1000/60/60/24).toString(16)
);

安裝之後,下次在維基百科上看到有什麼需要引用來源的資料,只要選起來,按游標旁邊的按鈕,「來源請求」標記就會自動被加上去。

至於維基百科何時能夠解決這個問題呢?我想等到「抗日戰爭」這個條目的名稱被改掉那天之後才有可能吧。噗浪上大家的 comment 值得一讀。

Wikipedian Protester

(via xkcd)

還有,這個 script 只花我 1 小時查資料跟寫功能,但是又花 1 小時完善 UI,2 小時寫文件(含這篇)。是有沒有這麼閒 orz

World IPv6 Day – COSCUP 2011 網站

IPv6 Day Logo噗,結果最近做的事情都沒有來 Blog 介紹。

今天是 World IPv6 Day,也就是各大網站正式將網址加上 IPv6 AAAA 紀錄解析的日子。最近弄的 COSCUP 2011 網站沒有上 quad-A 紀錄,而是用 script 對首頁加上了一點動態偵測的圖示。

  • 如果用 IPv4 連 coscup.org 但其實電腦有 IPv6 連線的話,會出現徽章,提示說可以改用 IPv6(使用 ipv6-test.com 的 API測試)
  • 如果用 IPv6 連 ipv6.coscup.org 會出現徽章與您正在使用 IPv6 連線的說明。

就這樣。不知道我在我們退休前有沒有「IPv4 shutdown day」…

F.lux 螢幕調光程式

這個真的要推薦一下,F.lux 螢幕調光程式。它的原理是根據日出日落時間,把螢幕的色溫調到符合室內光的溫度,以免晚上看著過亮的螢幕影響退黑激素分泌,打亂生理時鐘。

用了一個星期的效果是真的睡得比較好,而且不會因為晚上繼續用電腦變得越來越晚睡。對靠看電腦過生活的人來說很好用,不然這樣下去其實也是職業傷害。如果是白天的時候安裝,螢幕是不會變色的,會一直到太陽下山的時候才會注意到,而且用久之後會完全忘掉它,反而是把它關掉的時候會被螢幕刺到。

作為 Web Developer 的胡思亂想是,說不定可以把時間 vs 色溫這個概念放進 Responsive / Adaptive web design 的概念裡?這樣的話要讀一點色彩學的書了。

Word Cloud – Open source “Wordle” in HTML5

中文:HTML5 文字雲現在是開源專案,歡迎到 Github 索取程式碼。自從公開之後新增的功能有隨機旋轉文字、彩色文字、支援 IE9 與 iPhone/iPad(很慢,不建議使用)。

HTML5 Word Clouds is a HTML5 technical demo that generate a Java-based Wordle-like word cloud.

Under the hood, functions are devided into a library and two jQuery plug-ins:

  • jQuery.getContent that fetch text remotely or locally using FileReader API
  • WordFreq that run the text against Porter Stemming Algorithm (English) or N-gram analysis (Chinese) in Web Workers
  • Finally, jQuery.wordCloud draws beautiful word cloud on <canvas>

For Mobile Safari and IE9 that doesn’t support Web Workers, I wrote Simulated Worker that put the worker script into an iframe scope (instead worker scope).

You are welcome to play around, grab the source code and run the testcases to see their capabilities.

Simulated Web Workers

So you put your complicated computation in Web Workers, but you just realized the computation is not that complicated at all. Also, you denied the browsers without web workers to ever running your hard work – Mobile Safari, all IEs up to version 9.

Here is the solution I took, something might be useful to you: Simulated Web Workers – a library that creates a pseudo-web worker (that runs at fore-ground), while expose the same interfaces. Well, almost.

By almost, I mean the following:

  • Instead of calling postMessage() to send the result, in IE you must call workerPostMessage() – because IE doesn’t allow me to overwrite the aforementioned function.
  • Since anything runs at fore-ground right now, they are subjected to runaway Javascript timer imposed by browsers – the while(true) example given by Wikipedia won’t work. The setTimeout() trick however would make it work again (in a not-so-efficient way) – please check the library tests.

You could say Simulated Web Workers is like exCanvas for canvas, but of course the interfaces of web workers are not that many. Anyway, have fun with your next web workers project.

HTML5 文字雲

Update: Here is the introduction in English.

猜猜看這是哪個 blog 的最常出現的詞彙?

文字雲是最近在嘗試的 HTML5 瀏覽器 Demo,目標是使用前端技術來完成 Java 撰寫的 Wordle,順便可以拿來測試瀏覽器效能,以及分析一些文字來源。

目前程式可以接受硬碟裡的檔案或是 RSS Feed 的文字(從 Google Feed API 拉資料),經過詞頻分析,以出現的數量來決定文字大小,排進 HTML5 canvas,像這是這個 blog 的分析結果:


最前面貼的第一張圖則是來自地圖會說話,其他像是 New York Times 的文字雲可以看出最近的新聞 buzz word 是什麼。

文章詞頻分析

中文用的是很標準的 N-gram(我做到 N=6),把字組切出來算頻率。英文的話則引用了資料庫常用的 Porter Stemming Algorithm 來歸一化字的變形(複數型、正在進行式等等)。想起來中文的分析還真的是知難行易,完全不做任何過濾效果就會很好(後來有濾掉一些不是詞的字組就是),而且唯一的 stop word 只有「的」。

測試的時候懷疑瀏覽器執行這些文字操作的效能,所以就把這段程式碼放進 Web Workers。放完發現效能沒有提昇多少,真正卡住的東西是畫 canvas … 不過還是保持這樣,因為使用者有可能會放大量文字進來(但只差 Web Workers 就可以執行的 IE9 就抱歉了)

使用前端額外的好處是使用者可以載入自己的檔案來分析,而且檔案不需要傳到主機上。測試的時候曾經跟別人要了在學校寫的報告,圖像很好玩。大部分的部落格最大的詞都是「可以」,不知道是不是口語中文的現象。

文字雲圖像

圖則是仰賴 canvas 的填入文字(fillText)功能。有一個二維 Array 來儲存哪裡還有空間的資訊,每次填入文字之後再用 getPixelData 偵測文字筆劃的位置,更新 Array。在 Chrome 上面,文字大小會受設定裡面的最小字型大小的影響,所以最後會有很多不太小的小字。另外就是 Firefox 的 getPixelData 效能有問題,只有別人的 1/6 甚至更慢,為了避免瀏覽器卡死只好放了偵測所花時間,超過就跳出警告訊息的程式碼。Firefox 另外還有一個 canvas 有更新但是卻不顯示結果的 bug,不是很 reproducible 而且好像每台電腦行為都不一樣,只好先放著(canvas 的效能和問題都跟硬體加速有關)。

使用者介面

這東西為何會被我放在硬碟裡快一個月就是因為 UI 搞不定 orz … 做了兩個版本,每次 show 給別人看的時候都很容易操作錯誤;現在這個是 2.5 版,流程變成仰賴網址的 Hash 和 onhashchange 事件。對於寫出有用但是 UI 失敗的程式,我也感到很無奈 orz

接下來?

歡迎大家玩玩看。字頻分析和文字雲兩個功能都包成 library 了,拿去做其他應用應該很方便。不過我希望先保留程式碼兩個星期,之後再公開;目前網站上的是 minified script。

有空的話會想要支援更多自然語言(日文、韓文等),還有拿字頻做其他 visual(或是 audio?Bob 給了一個的點子,我才注意到其實字頻分布跟 FFT 轉換後的聲音頻譜還滿像的?)

最後,喜歡的話賞我一個讚吧 XD 寫不少東西但是不太知道反應,也不知道要去哪裡推。