json2.js 和 toJSON()

JSON 有認識加上有寫過 JavaScript 來處理 JSON 的人或許都知道 "json2.js":http://www.json.org/js.html 這個 Douglas Crockford 寫的 JSON 處理器,他可以安全的轉換 JSON 和 JavaScript 的物件,不過我因為資料封裝的問題,希望能自己實作子物件的 toJSON function,本來看了一下 json2.js 的原始碼以為他可以支援,不過實際測試後才發現直接用 json2.js 會造成 toJSON 函式產生的字串會多過一次 quote 的動作,舉例來說{"a":3}會被轉成{"a":3},結果就是造成轉回物件的時候得到錯誤的結果,為了處理這個問題,我寫了 一個 function 來包 json2.js,用法可以參考 test 頁的原始碼,不過簡單說,就是把物件丟給他,他會傳回一個 function,執行這個 function 就會得到 JSON 格式字串,當然子物件有toJSON的話就會先用它,沒的話才會用JSON.stringify

不過使用上有個小小的安全性問題要注意,我是假設 toJSON 傳回的字串是安全的,當然這樣假設很危險,所以我自己的物件實作 toJSON 時也是把想要傳回的物件先建立起來,然後丟給 JSON.stringify ,如果考慮到自己的子物件也有實作 toJSON 的話,那丟給我寫的 toJSON 也是可以的。

查了一下 YUI 的文件 ,發現原來 JSON2.js 的設計裡,物件自己作 toJSON 的方法是傳新的物件,而不是傳已經轉成 string 的。


Screen 支援 256 色

之前把 256色終端機環境弄好後 一直還有個問題,就是跑 screen 的話,screen 裡面的 bash 還是沒有 256 色,本來一直以為是 $TERM 和設定的問題,結果剛剛又花時間找資料才發現是我編譯 screen 的時候根本沒開256色的支援編譯前要先 ./configure --enable-colors256


新相機

My E-P1

前陣子入手我的新相機了,我的第一台數位相機是 Fujifilm F30,不過某天弄丟了,事後回想應該是拿出來放忘了放回去,F30 不見後就趕快買了 Fujifilm F100,基本上就當傻瓜相機開自動模式用,手上大部分的照片也都是用它拍的,直到最近才更新到 Olympus E-P1,其實我一直都蠻喜歡亂拍照的,對於玩相機也是一直小有興趣,不過都沒有真的踏進來,一來是因為覺得數位單眼都太大台了,二來是應該很花錢,買了 E-P1 後,真的,很花錢,我本來只是買一棵 14-42 鏡頭組,不過沒多久又買了 17mm 定焦鏡, FL-20 閃燈,還有 Panasonic 的 14-45 kit 鏡,算了一下,多花的錢已經快要可以買第二台了,不過買了這種價位的機器才真的會開始研究和思考怎樣拍的照片才會比較好,順便,當然一定要玩的就是大光圈淺景深啦~~

閱讀「新相機」全文

Vim 儲存完 JavaScript 檔案後自動用 yuicompressor

因為每次存完 js 檔案還要 Ctrl+Z ,然後手動跑 yuicompressor 才能去看效果,有問題還要 fg 回來繼續改,所以我剛剛終於受不了去研究 vim script 了

function Js_css_compress ()
    let cwd = expand('<afile>:p:h')
    let nam = expand('<afile>:t:r')
    let ext = expand('<afile>:e')
    if -1 == match(nam, "[\._]src$")
        let minfname = nam.".min.".ext
    else
        let minfname = substitute(nam, "[\._]src$", "", "g").".".ext
    endif
    if ext == 'less'
        if executable('lessc')
            cal system( 'lessc '.cwd.'/'.nam.'.'.ext.' &')
        endif
    else
        if filewritable(cwd.'/'.minfname)
            if ext == 'js' && executable('closure-compiler')
                cal system( 'closure-compiler --js '.cwd.'/'.nam.'.'.ext.' > '.cwd.'/'.minfname.' &')
            elseif executable('yuicompressor')
                cal system( 'yuicompressor '.cwd.'/'.nam.'.'.ext.' > '.cwd.'/'.minfname.' &')
            endif
        endif
    endif
endfunction
autocmd FileWritePost,BufWritePost *.js :call Js_css_compress()
autocmd FileWritePost,BufWritePost *.css :call Js_css_compress()
autocmd FileWritePost,BufWritePost *.less :call Js_css_compress()

把上面的指令加到 vimrc 檔裡面就可以了,前兩個分別是會把 blah.src.js, blah_src.js 轉成 blah.js 用的,第三行則是會把 blah.js 檔轉成 blah.min.js ,慎用之~~

加上第四行,會先檢查 blah.min.js 存不存在,存在的話才用 yuicompressor ,另外 code 在 gist 也貼了 一份

改版成 function 形式了~~

更新:支援 less,有 Google Closure 的話會先用它壓縮 js 檔。


TinyMCE Compressor 的 bug

有在 Twitter follow 我的人大概上週五會看到 這篇 ,會發出這樣的叫喊其實要回朔到五個月前,那時無知的我還在快樂的試著玩 TinyMCE Compressor,這東西可以減少 TinyMCE 的 HTTP Request 數,減少 loading 時間、頻寬,還可以讓使用者體驗更好,不過那時的我怎樣弄就是弄不成功,沒有錯誤訊息,但是用 FireBug 之類的開發工具檢查 HTTP Request 就是會看到多餘的那些 Request ,百思不得其解,直到上週五經過更嚴密的交叉比對後,終於茅塞頓開,發現問題的癥結,也跟著從內心喊叫出:「 幹,split 完要 trim 一下啊!! 」這句肺腑之言啊。

狀況是這樣的, TinyMCE 裡面有個地方用來記錄哪些 plugin 已經呼叫過,如果還沒呼叫過,那需要用到時就會建立 Request 來跟 server 要檔案,TinyMCE Compressor 自然也會需要對這個地方作些處理,它會把已經包在檔案內的 plugin 都標註為已經呼叫過的狀態,問題就出在這,我本來用下面的設定:

tinyMCE_GZ.init({
	plugins : 'style, layer, table, save'
});

每個逗點後面都有個空白,我覺得這樣的 coding style 也比較好,結果 TinyMCE Compressor 在做 plugin 呼叫註記的時候,沒把空白去掉(不過 php 端可以正確把 plugin 包進來),接著到了正式初始 TinyMCE 時用一樣的 pluing 設定:

tinyMCE.init({
	plugins : 'style, layer, table, save'
});

這裡卻有把空白去掉,結果它自己認為這些 plugin 沒呼叫過,就重新呼叫了一次...orz,目前是有去回報 bug ,不過不知道會不會受理,總之有要用 TinyMCE 的就小心逗點後面不要加空白吧。


更之前的文章