2016年2月12日 星期五

gnu global + emacs 在 ubuntu 中的安裝及使用


  1. sudo apt-get install global
  2. 在 emacs 中執行 M-x list-packages , 進入 elpa ,安裝 ggtags (請注意是兩個 g )
  3. 在要瀏覽原始碼的目錄中執行 gtags
  4. 在 emacs 中,要瀏覽原始碼的 buffer 執行 M-x ggtags-mode
  5. 使用以下指令進行跳轉

key             binding
---             -------

C-c Prefix Command
ESC Prefix Command

C-c ESC Prefix Command

M-. ggtags-find-tag-dwim
M-] ggtags-find-reference
C-M-. ggtags-find-tag-regexp

C-c M-SPC ggtags-save-to-register
C-c M-% ggtags-query-replace
C-c M-/ ggtags-view-search-history
C-c M-? ggtags-show-definition
C-c M-b ggtags-browse-file-as-hypertext
C-c M-f ggtags-find-file
C-c M-g ggtags-grep
C-c M-h ggtags-view-tag-history
C-c M-i ggtags-idutils-query
C-c M-j ggtags-visit-project-root
C-c M-k ggtags-kill-file-buffers
C-c M-n ggtags-next-mark
C-c M-o ggtags-find-other-symbol
C-c M-p ggtags-prev-mark
C-c M-DEL ggtags-delete-tags


2016年2月7日 星期日

"Learning JavaScript Design Patterns" 讀書筆記

*** 重要

**** 函數

***** 函數是物件
****** 可在執行期動態建立
****** 可做為變數值,類似C中的指標/參考, 但又具有屬性/方法
******* 記憶模式 Momento
***** 具有特定的作用範圍
****** hoisting對以var宣告的函數,具有var的作用特性
****** 匿名函式:不污染命名空間
***** 靜態方法vs原型方法;類別呼叫vs物件呼叫

**** 模組模式

***** namespace
以樹狀結構組織功能,捨棄java中利用實體目錄的對應方式
***** 宣告相依性
明確限定範圍、使用區域變數以加速
***** private+public
函數中var宣告的成員均為private,必需以附加到this(或任一全域變數)的函數讓外界存取
***** 匿名立即函式/Closure?
提供private作用域,傳入全域物件,回傳物件(或建構函式)

**** 原型 prototype

***** Function.prototype.bind()--改變作用域
***** 只要是可重複利用的成員 ,例如方法 ,都應該放進原型裏

**** new的作用

***** 產生空白物件,並命名為 this,最後隱含回傳

**** 物件

***** = mutable hash 可改變的雜湊表
***** 成員可用 value = object[key]存取
***** singleton / 自我定義建構式

*** 次要

hoisting: var宣告自動被提前到函式頂端
"use strict": 使this不再自動指向全域物件,減少函數不是為產生物件而撰寫時所造成的意外

2016年2月6日 星期六

javascript 中的"閉包( closure )"

定義

閉包是一種特殊的物件,其中結合了兩樣東西︰函數,和函數所建立的環境。環境由任意的局域變數所組成,這些變數是由在閉包建立的時間點上存在於作用域裡的所有變數。

只要直接在函數裏引用外層的變數,然後當我們將「函數封閉起來傳回」時,該函數仍然可以正常使用,這就是閉包的概念了。
其實許多的 event handler 都已經採用了 closure 的概念了,它不但是一個 callback 的機制,而且還能存取到定義處所見的變數,因此是一個有效的模組化技巧。

當然你可以說 C 不就已經有函數指標,可以拿來當成 callback 的機制了嗎? 是的,但是 javascript 的語法,可以在函數內部定義另一個函數,不管這個語法是有意造成或無意的,它促成了模組化之外更進一步的 namespace 的控制--除了得到 callback 的函數,沒有人看得到這個 callback 。

(有沒有講了半天依然沒聽懂的感覺? 我覺得還是寫個 compiler 之後才會比較了解的XD)

參考資料:

2016年2月5日 星期五

nodejs 在 windows 平台的套件安裝問題--Windows users are not happy. #629

https://github.com/nodejs/node-gyp/issues/629#issuecomment-151018292

我也不高興了,喵的~

原因 


https://github.com/nodejs/node-gyp/issues/629#issuecomment-151018292

解答

我相信對某些人來說 Visual Studio 是必裝的,不過很多人不是OK?(喵的)

而且有 9GB 這麼大(扔)

解答2,大推(最多還是要佔掉4G空間就是,我是被用掉3.3G)


https://github.com/nodejs/node-gyp/issues/629#issuecomment-153196245

下載網址在 https://www.microsoft.com/en-us/download/details.aspx?id=49983

安裝時記得選自訂,還要選安裝SDK


最後設定個環境變數

c:\>npm config set msvs_version 2015 --global

雜感


回過頭來說原作者真是酸度破表卻又不失禮數,沒有問候、4個英文字母、身體的任何部位,真是英文寫作的典範。以下摘錄幾句佳句試譯:

As I said, I'm pretty much a newbie and I don't even know what node-gyp does, but what I DO know is that it's a pain to run Windows and install a project with node-gyp as a dependency.

(如我所言我還是個菜逼巴的新丁,巴啦巴啦巴啦,但是我至少知道在你M$的平台上執行、安裝 node 的專案是有多 TMD 的麻煩了)

It's bizarre that a nodejs developer needs to install visual studio (even the express edition) in order to be able to work on Windows.

(要個 nodejs 的開發者去安裝 VS (即使是最不佔空間的版本也要佔上9G,以SSD時價來說也要兩個排骨便當的錢你看看),這不是很.奇.怪.嗎?)

With that being said, I'd like to know from all of you what should we do to make windows users fall in the pit of success?

(說了這麼多,我倒是真的很想知道 M$ 的諸公們,我們窗戶系統的使用者要怎麼做才能夠不小心的掉到成功安裝/執行的小坑裏呢?)

PS. npm 基本指令

2016年2月4日 星期四

工程師最討厭做的事情--兼論以 org mode 實踐 literate programming

網路上看到的,工程師最討厭做的事情

  • 寫文件 
  • 寫註解 
  • 寫測試 
  • 別人不寫文件 
  • 別人不寫註解 
  • 別人不寫測試
真是說到心坎裡了XD

可是老師,有辦法讓寫文件、註解,就像是一陣風吹過那樣的輕鬆嗎?

曾經有人提出這個想法,叫做 literate programming (神人就是神人,想法總是領先時代)

看看手頭的工具,我覺得內建 /*…*/ 等區塊形式註解的語言比較有辦法無痛的實作它;結合 org mode 的話,就是把說明文字打在註解區塊中,在需要看文檔時切到 org mode 這樣。

2016年2月3日 星期三

GNU GLOBAL / GTAG : 靜態程式碼分析的王者

為何要說 GNU GLOBAL / GTAG 是靜態程式碼分析的王者呢?

相較於 cscope / gnu cflow / ctags / etags 等類似的解決方案,它可以正確的得到巨集展開的結果,而且有 incremental 的更新,在 code base 會變動時是一大利多啊~~

http://www.gnu.org/software/global/global.html 官網,感覺是原作者捐給FSF的

http://www.gnu.org/software/global/globaldoc.html 說明文件

http://ldshyu.blogspot.tw/2013/06/coding-tag.html 中文的各tag系統比較

https://github.com/whatot/whatot-dot/blob/master/vim/global.md 中文介紹

執行 gtags 及 htags 之後,會產生 HTML 目錄,它的子目錄有以下內容:

J: #include 交互參考資料,此標頭檔在什麼檔案的什麼位置被參考到了

D: identifier 交互參考資料,此符號在什麼檔案的什麼位置被參考到了

S: html 化的原始碼

2016年2月2日 星期二

大型專案的原始碼分析--兼論 preprocessor

在分析原始碼的時候,遇到巨集定義總是令人又愛又恨;愛的是它在寫得好的時候(或讀的人狀況好的時候XD)是可以增進理解;恨是是當它寫得不好,或已經看得很累的時候,這時經常理解不能(冏rz)...

可TMD那精美的死線還是擺在那裏啊,怎辦呢?只好直面 preprocessor  了!

(先導知識: GNU: The C Preprocessor 導讀 )

方法一:改寫 Makefile 以展開所有巨集,順便得到 #include 路徑


例如,原來 Makefile 當中有以下指令:
.c.o:
@$(MKDEPDIR)
$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $(PROFILING_CFLAGS) $<


將上述指令改寫
.c.o:
@$(MKDEPDIR)
$(CC) -E $(CPPFLAGS) $(ALL_CFLAGS) $(PROFILING_CFLAGS) -o $@ $<

然後在 terminal 中,執行以下指令
rm *.o
make
rename -v s/\.o/\.i/ *.o

如此可得到副檔名為 *.i 的展開的原始碼,所有的 #include 還有巨集定義等等都被展開了。還有一些 gcc 的參數可以讓輸出比較好看,例如 -CC 可以保留註解等,就按各人需要調整囉~~

(正統的做法參見 http://www.gnu.org/software/cflow/manual/html_node/Makefiles.html#Makefiles)
(前提是你要很熟 Makefile 的語法)

為何需要這個呢?因為目前基於 tags 的原始碼分析程式,無論是 ctags, cscope, gnu cflow ,遇到 INLINE 的函數都失效,只好暫時先這樣處理…但很奇妙的 gnu global / gtags 可以正確處理 ,之後肯定要專文介紹一下

方法二:利用之前執行 make 觀察 stdout 得到的 -I 參數,以 --cpp -I 參數執行 gnu cflow


根據先前執行 make 的螢幕輸出,得到 -I 參數,以 emacs 24.5 的原始碼為例:

cflow --cpp -b --emacs -T \
 -I. -I../lib -I./../lib -I/usr/include/gtk-3.0 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/pixman-1 -I/usr/include/libpng12   -I/usr/include/freetype2       -I/usr/include/libxml2   -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include   -I/usr/include/freetype2   -I/usr/include/freetype2 -I/usr/include/p11-kit-1 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include \
 vm-limit.c dispnew.c frame.c scroll.c xdisp.c menu.c xmenu.c window.c charset.c coding.c category.c ccl.c character.c chartab.c bidi.c cm.c term.c terminal.c xfaces.c xterm.c xfns.c xselect.c xrdb.c xsmfns.c xsettings.c gtkutil.c emacsgtkfixed.c dbusbind.c emacs.c keyboard.c macros.c keymap.c sysdep.c buffer.c filelock.c insdel.c marker.c minibuf.c fileio.c dired.c cmds.c casetab.c casefiddle.c indent.c search.c regex.c undo.c alloc.c data.c doc.c editfns.c callint.c eval.c floatfns.c fns.c font.c print.c lread.c syntax.c unexelf.c bytecode.c process.c gnutls.c callproc.c region-cache.c sound.c atimer.c doprnt.c intervals.c textprop.c composite.c xml.c gfilenotify.c profiler.c decompress.c xfont.c ftfont.c xftfont.c ftxfont.c fontset.c fringe.c image.c xgselect.c terminfo.c lastfile.c \
 -o emacs.b.cflow