2016年2月29日 星期一

ubuntu 上用 apt-get 安裝/更新 node.js

警告:heroku 用戶請勿進行此動作,否則後果自負。(heroku 有自己的版本)

參考 https://github.com/nodesource/distributions

簡單來說就是新增個來源位置,然後直接 apt-get

curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -

sudo apt-get install -y nodejs

20171010更新:

同樣的道理,要裝 6.x 版就是把5改成6,要裝 8.x 版就是把5改成8,依此類推


什麼是 sci-hub ? 能吃嗎(誤)

Sci-hub的故事

端聞 被美國關停的學術論文免費下載網站Sci-Hub復活了

sci-hub —— 如何简洁而优雅地下载文献

下載論文不求人,超過4,700萬篇論文透過Sci-Hub免費下載

2016年2月28日 星期日

抽樣分配的整理

http://lmh-ymh.myweb.hinet.net/Stat1/ch7.htm

這個網頁整理得很完整,還包含了理論分配的整理

http://homepage.ntu.edu.tw/~huilin/2008-1/ch9.pdf

詳盡的說明

http://sites.stat.psu.edu/~ajw13/stat500_su_res/notes/lesson05/lesson05_03.html

英文的網頁,寫得滿不錯

https://www.ma.utexas.edu/users/parker/sampling/repl.htm

有些重要的概念,像標準誤(standard error),就是樣本均數的標準差;with replacement (每次抽後放回) 才是母體變異數/n 的無偏估計量;without replacement (每次抽後不放回,相當於一次抽n個) 並非母體變異數/n 的無偏估計量;這些概念在這個 UT 的網頁都解釋得很詳細。

http://homepage.ntu.edu.tw/~sschen/Book/Slides/Ch14TS-Boot.pdf

所以回過頭來說,抽樣數是否必需小於樣本數呢?當然是不需要的。實務上最廣泛的應用就是蒙地卡羅法模擬法的好兄弟, bootstrap (提靴法) 這種重新取樣 (resampling method) 。

git 最佳實務/指令速查表

Git Commands and Best Practices Cheat Sheet


有人畫成了美圖出來了,這才是實際上的工作流程啊…

2016年2月24日 星期三

javascript 中等效於C的 sprintf 的解決方案

https://www.npmjs.com/package/sprintf-js

喵的~~有npm真好啊

2016年2月20日 星期六

用 R 結合 org mode 來學"統計學"

因為能與 org mode 整合,因此打算慢慢整理一些資源,平台暫以 ubuntu 為主,這樣的組合比較符合開源的精神

安裝


請參考去年7月的拙作 在ubuntu 14.04上安裝 R & RStudio

書單


ptt 上 andrew43 開的書單: https://www.ptt.cc/bbs/R_Language/M.1383500407.A.55D.html

資源


就敘述統計的部分為例

wikibooks


https://en.wikibooks.org/wiki/R_Programming/Descriptive_Statistics

SAS and R


http://sas-and-r.blogspot.tw/search/label/descriptive%20statistics

2016年2月18日 星期四

ubuntu 上安裝官網上的最新版 nodejs

警告:heroku 用戶請勿進行此動作,否則後果自負。(heroku 有自己的版本)

  1. mkdir -p ~/opt/packages && cd $_
  2. nodejs 首頁抓編譯好的執行檔,放在剛建好的目錄
  3. tar Jxvf node-v4.3.1-linux-x64.tar.xz #(檔名請依實際抓到的檔案修正)
  4. ln -s ~/opt/packages/node-v4.3.1-linux-x64/ ~/opt/node #(目錄名請依實際抓到的檔案修正)
  5. gedit ~/.profile #(gedit可換成任何習慣使用的文字編輯器)
  6. 在末尾加上以下文字,存檔後重開機
# include locally installed packages in PATH
if [ -d "$HOME/opt" ]; then
    PATH="$HOME/opt/node/bin:$PATH"
fi

參考: http://exponential.io/blog/install-nodejs-on-linux/

(改變了兩個動作,一是解壓縮,二是 PATH 的設定;前者是因官網抓的檔案壓縮格式有改變,後者是因為 $HOME/opt/node/bin 需要放在前面以蓋掉原來的設定)

上帝存在的證明

前幾天看到 GEB 這本書的介紹,暗忖是不可能有時間去看。但是不小心瞄到 哥德爾不完備定理 的說明,正在猜是否能用來上帝存在/不存在,結果一 google 就發現, 哥德爾本人早就做了這個工作

結論是,上帝存在。但是這個結論是建立在很多(看似沒有必要的)假設之下的,所以初見時未必是大家心中所想的那個形式,而神學界對此似乎也仍有爭議。不管如何,滿高興這結果,至少不是一面倒的否定(撒花~)

另外一點值得高興的是,這麼難的題目,有聰明的哲學家來幫我們傷腦筋,平凡的我們還是努力的提升自己吧,不管你信不信有上帝。(至少我是信的,阿們)

2016年2月15日 星期一

Yet another social bot for Twitter, Facebook, etc

https://www.livecoding.tv/rancoud/

有空也想來玩玩,先記著先;作者是法國人的樣子,他的專案放在

https://github.com/rancoud/RTwitterBot

顯然很多社團被重覆、相同文章洗版,在技術上是沒有什麼問題才對

2016年2月14日 星期日

machine learning 資源

0214這種日子就乖乖待家裏整理環境,別出去丟人現眼了(眼神死)

魯蛇的情人就是電腦啊~~~哈哈哈

欣聞林軒田老師開放 machine learning 資源供下載,轉錄其動態如下:

_________________________________________________________________

「機器學習技法」在 NTU-Coursera 上短期內的最後一次重播也已經結束。近期借調至 Appier 後非常忙碌,短期內應該不會重開線上課程。

和「機器學習基石」一樣,我個人的看法是已經錄好的課程最終應該成為公共財。所以利用今天坐火車回台北的時間,我把「機器學習技法」的十六講六十五段影片標題整理了一下,即日起在 Youtube 上公開該課程所有的影片。

https://www.youtube.com/playlist?list=PLXVfgk9fNX2IQOYPmqjqWsNUFl2kpk1U2

投影片則早已放在這裡給大家參考。

http://www.csie.ntu.edu.tw/~htlin/mooc/

敬請各位朋友繼續討論指教,謝謝。

祝大家新春佳節愉快,情人節快樂,也許可以想像未來用機器學習幫你找到最速配的情人!
同場宣傳:「機器學習基石」的影片們

https://www.youtube.com/playlist?list=PLXVfgk9fNX2I7tB6oIINGBmW50rrmFTqf

___________________________________________________________________

2016年2月13日 星期六

github 上托管之 javascript 專案以 node.js 執行之 console 程式之持續整合 (CI)

what's CI ? why ?


從戰略的高度來看,整個 use case 可以由這篇來總結: CI 怎樣帶你遠離平庸?

用比較通俗的話來說,就是建立一個低成本的工作流程以讓人不可自拔地沉淪於攻城獅的角色之中

四年前的拙作: Ubuntu上Jenkins的試用 ,針對的是自建環境而非 github ,因此重新 survey 了一下最佳實務,而作此文(啊寫得像XX樓記的感覺…)

where & when


如標題所言,本文特別要討論的場景是:“github 上托管之 javascript 專案以 node.js 執行之 console 程式”,因為這剛好也是手上案子的實際情況

how


從戰術的高度來說,目前 github 上流行的套餐可以如此總結: mocha + chai + Travis CI + Codecov 使用流程

简单来说,就是使用 mocha 作为测试框架,chai 作为断言库,将项目交给 Travis CI 做自动测试,交给 Codecov 做覆盖率测试。

如果工作流程套用的是 github flow ,那麼協作者會提出 pull request , 此時 code review 可以再參考 代碼審查(Code Review)with GitHub Flow

p.s. github 專案上炫目的 icon 要如何打上去呢? 參考 在github中加入图标

which (alternatives)


Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率 ,覆蓋率測試使用的不是 codecov 而是 istanbul , 另外還有 “自动触发mocha测试” 的小技巧

ref




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