2015年8月19日 星期三

在 Asciidoc 輸出結果中加入區塊圖示

在 Asciidoctor 的工具輔助之下,一些預設就有區塊內容,像是「TIP」、「NOTE」⋯ 都能夠在輸出的時候被加上預設的圖示。只要在最開頭的設定值中加上⋯
:icons:font

就可以在輸出 HTML 的結果中,看到本來醜醜的介面被加上的圖示。

沒有深入研究是 asciidoc 本來就有的,還是 asciidoctor 加上的項目。總之,能夠讓輸出的結果更加賞心悅,是一件不錯的事情。

2015年8月13日 星期四

[Soma.js] 設定要注入的物件名稱

依賴注入似乎已經成為許多軟體框架的必要元素,它的概念仍然不易被人熟悉,但其方便性以及能夠帶給軟體開發的彈性是很大很大的。 Soma.js 是 javascript 的一個以 infuse.js 為基底開發的依賴注入程式框架(framework),依循它所提供的規則,可以自動偵測到建構式所需要的參數,使用 this 定義的物件變數,Soma.js 將在所有註冊在它身上的變數中,尋找相同名字的變數置入。

換言之⋯ 只要取相同的名字, Soma.js 能夠自動完成變數對應的工作。很方便,但也是其限制。要是一旦名字不同了呢?要是不同時期開發出來的程式,用了同一個名稱表示不同的名字呢? Soma.js 的對應機制是不是就無法順利運作了?

另一個會改變名字的地方在於程式的最小化,為了極致地減少程式碼所佔用的空間,會以較短的文字(像單一字母)取代變數名稱。如此處理的程式碼,很有可能會使得依賴注入失效。

同樣的情形也出現在同為 javascript 的 AngularJS 框架中,而 AngularJS 的處理方式,是在建立 controller, service 的地方,以陣列取代原先傳入建構函數的地方。陣列中列舉了每個注入引用的名稱,最後一個陣列元素才是建構式。由於程式最小化不會對字串進行處理,因此可以避免注入的對應出錯。

那麼回到 Soma.js 身上,它使用了 injector.createInstance 方法來建立物件,然而只接受一個參數,也只能是建構函數。它是支援在建構函數後頭增加其它的參數,依序作為建構函數的參數,不足的部分的由既有的注入對應機制處理、補齊。

不過,如果傳入的參數是要注入項目的名稱,會發現該名稱的字串,會直接作為參數傳入建構函數,而不是該名稱所對應的物件。因此,如果要傳入注入名稱的對應,不能使用 injector.createInstance 函數來達到。

最後的由其的基底 infuse.js 的文件中找到,它的作法是在建構函數上定義 inject 變數,其對應到建構時所注入物件名稱,經過實測的結果是能夠順利運作。至於物件內的變數要怎麼對應,這個部分就留待未來有需要再進行測試。

以下列個簡單的物件宣告⋯ (注意 inject 是定義給建構函數,而不是建構出來的物件上)
function MyClass(opt1, opt2) {
  // some code...
}
MyClass.inject = ['optName', 'otherOption'];
module.exports = MyClass;

2015年8月11日 星期二

在 asciidoc 文件中使用語法高亮

許久前照著範例輸入,卻怎麼也作不出上面講的語法高亮的效果。輸出的 HTML 還是「平平的純文字」,後來才發現,原來要在文件的開頭加上宣告,似乎這樣會多引入一些額外的 CSS  ,才能讓高亮的效果出現。

在主標題(文件最開頭,寫大標題的那區)加上⋯

:source-highlighter: pygments
這樣在輸入高亮語法時,就會被處理了。

除了 pygents 之外,還可以改成 coderay, highlightjs, prettify 。應該是其它幾種 CSS 主題吧~ 就沒有特別再去測試了,目前這種就讓我很滿意了。

語法的宣告很簡單,只要「[source,語法名稱]」就可以了。像是 javascript, php 這種比較單純,有一些則是要嘗試一下,像是我試了「shell, bashell, hash」三種,最後只有 bash 才被正確解析。

哪天有空再找找有沒有什麼表格,把所有支援的語法都列出好在未來作查詢。

另外,讓我有點意外的,也有支援 livescript 語法。算是一個驚喜吧~

[2015-10-5 補充]
重灌 mac 後發現,如果要使用 pygments 樣式的話,需要安裝 pygments.rb 這個套件。不確定在原來在打這篇文章之前就裝過,還是因為後來的 asciidoctor 安裝不會將它裝入。總之包含其它的樣式(coderay, hightlightjs, prettify)應該都要先安裝對應套件才能使用。

[2016-10-23 補充]
使用以下指令安裝 pygments.rb

gem install pygments.rb

2015年6月26日 星期五

Sinopia 試用

工作需要開發一些能夠重覆使用的 Javascript 模組,當然具有許多支援的 commonjs 與 nodejs 格式是首選,唯一的問題就是一方面希望能夠使用 npm 裡眾多的模組,但另一方>向自己所開發的一些內部使用的私有模組就不方便公開了。

花了一些時間尋找,看了 npm 那個要付費使用的私有模組庫,之後就遇到了這篇要提的 Sinopia。

Sinopia 並不是一個英文單字, Google 翻譯認為它是荷蘭文,是一種楬紅色顏料的名字。看不出和軟體本質的關連,就此打住不提。

它是一個依靠 Nodejs 建立網站的方式,建立一個能和 npm 套件溝通,提供自定模組的服務。當然,如果對它要求不存在於自身裡的模組,它會將要求轉向發到公開的 npm 主機。幫你把公開的套件抓回來。

除了抓下套件之外,也提供了在上面註冊帳號,讓自訂的模組也能使用 npm 既有的公開(publish)模組流程,將新的版本上傳。


試用了幾天之後,感覺還不錯,找個時間再試試看它能不能在 windows 上也順利運作。這樣平常工作的開發,應該會順利許多。

2015年6月5日 星期五

翻譯 LiveScript Style Guide

前陣子同事在說明專案要用到的 LiveScript ,提到網路上有個 LiveScript 的語法建議。個人還滿認同程式的寫作風格一致所能帶來的好處。因此就把網路的版本抓回來,由原來的 markdown 語法,改成另一個我正學習的 asciidoc 格式。

同樣把內容放在 github 上,也許第一次翻譯這種東西,多少會有所缺失。不過好歹也算是有個起頭,希望哪一天能夠幫到對它內容有興趣,但英文不好的程式同好。

翻譯的內容在這裡

2015年4月29日 星期三

fswatch 使用筆記

最近時常使用 asciidoc 的格式在建立文件,撰寫筆記。也練習使用 vim ,看看能不能如人家所說的「vim 成為最後一個學習的文字編輯器」。過程中遇到一個問題,雖然在 vim 中可以直接呼叫命令列指令來編譯出 Asciidoc 格式的文件。但是每次作點小修改,就得重複 :w 與 :!asciidoctor % 兩個指令,打久了很煩。
有沒有一個偵測到檔案儲存,就能自動替我執行 asciidoc 指令的方法呢?所以我找到了 fswatch 這個東東。

2015年4月22日 星期三

提醒、改變別人

騎車在路上,偶而會遇上一種特殊的「塞車」,明明機車等待區空上許多的位置,但就是會有機車只顧自己進入,沒有留位置給其它人。和汽車之間產生我稱之外「關門」的狀態,進不了等待區的車子,就這樣一台台往後面堆,輕微的時候只卡了兩三台,嚴重的時候超過十幾台。

每次看到都覺得,這種行為真是自私又白目啊!

幾次由汽車的另一側繞過進入等待區,默默觀察了這種人的反應,結果仍然是一無所覺。後面的機車似乎和他們一點關係都沒有。對於可以避免的塞車狀況,他們完全沒有意識到只要一個小小動作,像是往前一些或是向兩旁的一個車位,後面幾乎所有的機車都能進入等待區,而緣燈亮時,大家都能很順的起步、加速。不會有卡成一團的狀況。

同樣的狀況也發生在其它地方,像是有些人一進了電梯或是進到捷運車廂後就馬上慢了下來,甚至完全不動。而在後面要進入的人就被堵在門口。只是直覺得認為「我進來了」就什麼都不想了,結果造成其它人的困擾。也許本身沒有什麼惡意,但造成的困擾卻也是事實。

對於這種人,不會出聲去提醒。因為「人無法改變其它人」的觀念根深蒂固,所以會認為這個人的個性就是如此自私,與其花費力氣去提醒,不如用點精神找其它路走。因為我的成長過程中,沒有多少次由旁人教導提醒。大多的觀念是在生活的觀察和體悟得到。因此對於「教好別人」這件事,並沒有什麼興趣。把它認為是「本性的一種」,覺得每個人都應該自己找到對的答案,不需要由別人教。

教別人程式的時候,如果發現對方的學習態度不佳,或自以為是的往錯的路子上走。說個兩三次後通常就放棄了。教學的極積性會因為學習者的態度不佳而急速下降,最終進入「放生」的階段。理由是「既然自以會學夠足夠的東西,不需要我指導,那麼我也不白費力氣」。

態度夠好的留下,態度不佳的直接踢除,這種模式似乎曾經在其它地方看過。思考一下我找到了答案,就跟某些公司的老闆只想要現成的員工,即戰力就留下來,而沒有經驗的就踼掉重找。培養員工從來不在這種老闆的心中出現,那麼,我的思考邏輯,是不是和這種老闆沒有不同?

回頭審視過去的自己,並不是每一件事情都能夠「悟」出正確的作法。也受過其它人不少提醒,若是少了這些改進的建議,我應該達不到現在的水平,也沒有今天這樣的價值觀。以自身的經驗為例,人也許不能很輕易地完全改變另一個人的想法,但卻能夠影響價值觀,或是待人處事的方向。

如果自己都無法只依靠本身的力量找到每件事情的答案,那麼,又有什麼資格要求人去「自行成長」呢?就好像小時的聽到大人常說「長大就懂」的感覺是一樣的。

所以,如何去提醒而不傷人自尊,又能有效的傳遞訊息。以及如何篩選合適的人,把自己的心力用在對的人上面,畢竟這個世界不缺蠢人,那種人就真的救不了,也不必去救了。這些都會成為我未來人生中的一個重要課題。

今天並不是等待這個世界會變好,而是在自己能力所及的範圍內,去作一些些的改變。