2016年12月31日 星期六

Stanford parser初探(2)

2010年在 Stanford parser初探 一文中,使用的是文字的介面,但是在 http://nlp.stanford.edu/software/lex-parser.html 上釋出的最新版 3.7 中,已經可以使用 GUI 來進行分析:

不幸的是分析結果與 Stanford Chinese Segmenter 在斷字上並不吻合,不然結果應該會更正確一些…(雖然 Stanford Chinese Segmenter 也是有不準的時候)

自行斷詞後的分析看起來滿像一回事的:
不過像"告訴"這種授與動詞,分析結果仍然不令人滿意。即使是斷詞正確度極高的 sinica
目前的局勢看來,tree bank / tree structure 仍然是高度未統一的狀態,這在機器翻譯或人工智慧的應用上,是很不利的。

程式化的調用,可以參考以下網頁
stanford parser使用
[TextMining][StanfordNLP]Stanford parser 使用方式

2017/08 更新:

今年六月釋出的新版,品質上有極大的進步,感覺上 SyntaxNet 短期內還難成對手




附上原文:

第一年住院医师,做阑尾切除手术时,找不到阑尾在何处,你若是他的主治医师,请你告诉他下列何种方法最容易找到阑尾?

Stanford Chinese Segmenter初探(三)

2010年在 Stanford Chinese Segmenter初探 一文中,繁體中文還不能正常處理,但在官網 http://nlp.stanford.edu/software/segmenter.shtml 上的最新版 3.5 已經可以處理繁體中文。

測試句為
第一年住院醫師,做闌尾切除手術時,找不到闌尾在何處,你若是他的主治醫師,請你告訴他下列何種方法最容易找到闌尾
第一年住院医师,做阑尾切除手术时,找不到阑尾在何处,你若是他的主治医师,请你告诉他下列何种方法最容易找到阑尾
pku的處理結果如下
第一 年 住院 醫師 , 做 闌尾 切除 手 術時 , 找 不 到 闌尾 在 何處 , 你 若是 他 的 主治 醫師 ,請 你 告訴 他 下列 何種 方法 最 容易 找到 闌尾
第一 住院 医师 阑尾 切除 手术 阑尾 何处 若是 主治 医师 告诉 下列 何种 方法 容易 找到 阑尾
ctb的處理結果如下
第一 年 住院 醫師 , 做闌 尾 切除 手術時 , 找不到 闌尾 在 何處 , 你 若是 他 的 主治 醫師 , 請 你 告訴 他 下列 何 種 方法 最 容易 找到 闌尾
第一 住院 医师 阑尾 切除 手术 找不到 阑尾 何处 若是 主治 医师 告诉 下列 方法 容易 找到 阑尾 
看來對於繁體中文,pku和ctb的處理結果各有高下,不是百分百正確,"手術時"等處斷得不對。請看中研院 http://ckipsvr.iis.sinica.edu.tw/
 第一(Neu) 年(Nf) 住院(VA) 醫師(Na) ,(COMMACATEGORY)
----------------------------------------------------------------------------------------------------------------------------------
 做(VC) 闌尾(Na) 切除(VC) 手術(Na) 時(Ng) ,(COMMACATEGORY)
----------------------------------------------------------------------------------------------------------------------------------
 找(VC) 不(D) 到(P) 闌尾(Na) 在(P) 何處(Nc) ,(COMMACATEGORY)
----------------------------------------------------------------------------------------------------------------------------------
 你(Nh) 若是(Cbb) 他(Nh) 的(DE) 主治(VB) 醫師(Na) ,(COMMACATEGORY)
----------------------------------------------------------------------------------------------------------------------------------
 請(VF) 你(Nh) 告訴(VE) 他(Nh) 下列(A) 何(Nes) 種(Nf) 方法(Na) 最(Dfa) 容易(VH) 找到(VC) 闌尾(Na)
----------------------------------------------------------------------------------------------------------------------------------
上述括號中的詞性代號說明請見 http://linganchor.sinica.edu.tw/data/file/la00033.ppt

我想還是要先研究一下英文斷字的結果,再來回頭看中文斷字的問題。

原始碼的編譯/執行(以 windows 平台為例)

以下假設工作目錄為 C:\stanford-segmenter-2015-12-09\

原始碼

下載的壓縮檔解開後包含 stanford-segmenter-3.6.0-sources.jar ,把它解開到 src 子目錄下

編譯程式

要裝個 JDK ,我抓了 jdk-8u121-windows-x64.exe 下來裝
還要裝個 ant ,我抓了 apache-ant-1.10.0-bin.zip 下來裝

建立環境

windows 10的 cmd.exe 中下達指令(記得改成實機安裝的目錄):
set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk1.7.0_51
set PATH=%PATH%;%ANT_HOME%\bin

編譯

執行 ant 會把 src 子目錄中的所有檔案編譯為 class 放到 classes 子目錄中

執行

java -mx1024m -cp C:\stanford-segmenter-2015-12-09\classes;C:\stanford-segmenter-2015-12-09\slf4j-api.jar;C:\stanford-segmenter-2015-12-09\slf4j-simple.jar edu.stanford.nlp.ie.crf.CRFClassifier -sighanCorporaDict C:\stanford-segmenter-2015-12-09\data -readStdin -inputEncoding UTF-8 -outputEncoding UTF-8 -sighanPostProcessing true -keepAllWhitespaces false -loadClassifier C:\stanford-segmenter-2015-12-09\data\pku.gz -serDictionary C:\stanford-segmenter-2015-12-09\data\dict-chris6.ser.gz

serDictionary 參數若需要多個字典檔,必需以','逗號分隔,而不是java程式常用的';'分號;字典檔一辭一行,以ser.gz結尾的檔案需要壓縮,一般而言我們還是用純文字檔就好。

2016年12月30日 星期五

每日一諺



每一個複雜問題的背後,都有一個清楚、簡單,卻錯誤的答案——H.L.Mencken
"For every complex problem , there is an answer that is clear , simple and wrong."

參 https://en.wikiquote.org/wiki/H._L._Mencken

原文應為:

Explanations exist; they have existed for all time; there is always a well-known solution to every human problem — neat, plausible, and wrong

補上所謂"捷思"的定義,為上面這個諺語下個註腳

一知半解(Congnitive Heuristics)
  人類以理性動物自許,認為靠著與生俱來的智慧,可以認識周遭人、事、物,不但 「知其然」,也「知其所以然」。社會心理學中的歸因理論(attribution theory)就認為在日常生活中,每個人都自以為是科學家,對別人的行為或表現的原因好奇、觀察、分析、比較且驟下斷語。   
  近年來認知心理學研究顯示,人能即時處理的認識訊息有限,為避免過分操心或增加處理的效率,常用簡略的認識作用或「信手捻來的法則」(rules of thumb),處理有關人、事、物的訊息。這是一種「認識吝薔鬼模式」(cognitive miser model),常犯「偷懶」式認識作用,就是一知半解。
   社會心理學家探討的一知半解有:
(1)類型代表(representativeness):即判斷對方的類型時,根據與典型的相似度下判斷。如在校園看到穿運動服且皮膚黝黑的男老師,通常猜他是體育老師或生活輔導組長。這種判斷雖也不無道理,卻可能忽略了其他情況,犯了忽略「基本數據誤差」(base-rate fallacy)。
(2)手頭記憶(availability):憑臨時記憶或粗略思考所及,判斷事件發生的可能性。如偶然飛機失事,便誤認飛機是最危險的交通工具,忘了機車事故頻率更高。因而造成「誤信效應」(false consensus effect)。
(3)引導作用(priming):即刻收到的訊息,影響相關的回憶,即據以判斷。如剛看過恐怖電影的人,走進黑漆漆的巷弄會害怕。
   其他的一知半解如定錨作用(anchoring),指受先前事件的誤導;框架作用(framing),指受主題鋪陳方式影響;模擬作用(simulation),指受想像可能狀況的影響,這些都使人不假深思,妄下判斷,造成一知半解的情形。]
wiki上的 認知偏誤 列出100多種類型,讓我為人類的認知的正確性捏把冷汗啊…

例如某報導說,大考中心研究指出,學測入學的學生在校表現較好。這就是一種因果謬誤,我相信就像當初批評明星高中的論點一樣,我們只要讓指考比學測先實測、分發,就會得到相反的結論。

2016年12月27日 星期二

AI及自然語言處理在精神醫學上的進展

最近一篇網路文章 "在評估心理健康問題時,AI 真的要打敗人類醫生了" 介紹了一些AI及自然語言處理在精神醫學上的進展,的確令人期待。自殺的預防本身難度很高,下這篇評論有所著墨:
Large, Matthew, Christopher Ryan, and Olav Nielssen. "The validity and utility of risk assessment for inpatient suicide." Australasian Psychiatry 19.6 (2011): 507-512.
語言,尤其是所用來思考的形式,很可能與意識的形成有關。或許就像影集 Westworld 中通過Turing test的人工智慧,很快就要問世了。

2016年12月21日 星期三

在 win10 上,平行於現有 emacs 環境,安裝 spacemacs (3)--從0.105.22版更新到0.200.5

如果從2016年9月後就沒更新的話,按照官網說明要自動更新時會出現"your emacs directory is not clean"的錯誤訊息=>是假的,你眼睛業障重啊

此時請服用使用者版本的手動更新,參
https://github.com/syl20bnr/spacemacs#manual-update-on-master-branch


  1. 進入安裝目錄,通常是某個 .emacs.d 的地方
  2. git fetch
  3. git reset --hard v0.200.5

2016年12月15日 星期四

github electron套件從0.36.x更新到1.4.x的問題

大約在2016年中時,electron中原本命名為 electron-prebuilt 的諸多事物正名為 electron

所造成的問題,害我斷斷續續搞了快一整天 hahaha ,而且錯誤訊息是假的,你眼睛業障重啊沒什麼說明力

(參考討論串 https://github.com/electron/electron-quick-start/issues/30 ),解決步驟:
  1. 專案中的 package.json 中凡是有 electron-prebuilt 字樣,都要改成 electron,版本就用最新的 "^1.4.12"吧
  2. 刪掉專案目錄 node_modules ,然後 npm update 讓它全部重抓
  3. 如果是 windows 系統的話, electron.exe 現在位置變成是在 node_modules\electron\dist 下面,凡是任何環境變數、批次檔有指到electron-prebuilt 字樣的地方,都要改成 electron
20171011 更新:
全局安裝請參 https://github.com/electron/electron/issues/10604

指令為:

sudo npm install -g electron --unsafe-perm=true --allow-root

2016年12月7日 星期三

利用Google Calendar api 存取 Google 行事曆--使用nodejs

參考 [Javascript] 利用Google Calendar api 存取 Google 行事曆 以及官方說明網頁

nodejs 不同在"建立用戶端 ID"這一步,及一些衍生出來的平台問題;如果使用windows建議修改第9行如下:

var TOKEN_DIR = (/*process.env.HOME ||*/ process.env.HOMEPATH ||

這樣修改的原因是:

  1. process.env.HOME 會隨執行程式的位置而變化,你不一定會用預設的 shell(當然這有可能是你想要的效果,如果是這樣的話要知道會發生什麼事…)
  2. process.env.HOMEPATH 具有平台可攜性

2016年12月2日 星期五

以 atom 開發 node.js 的設定

atom的定位原本是個文字編輯器,要拿它來開發node.js專案至少要做到兩件事
  1. 語法提示 / autocomplete
  2. 自動呼叫 node 執行程式檔

參考 配置 Node.js 开发环境——使用Atom 是使用了 atom-ternjs 及 script 兩個 package 來解決這兩個問題。 atom-ternjs 是為了去 parse 程式碼以給出建議,script則提供立即執行並觀看結果的快速鍵。由於版本演進飛快,此網頁中提到 plugin的設定已經可以用UI來解決:



詳細的說明文件可以參考 http://ternjs.net/doc/manual.html#plugins

2016年12月1日 星期四

graphviz在atom上的編輯、檢視

javascript 就要統一地球的預言還言猶在耳,就發現…這一天好像也不遠了XD

安裝 graphviz-preview-plus 套件即可預覽、產生圖檔,它還自己挾帶 vis.js !!安裝 graphviz 都免了
(語法高亮則是安裝了 language-dot 套件)

(塊逃啦 eclipser ,atom才是王道啊…)

2016年11月30日 星期三

win10上以emacs開發node.js的安裝、設定


  1. 執行 emacs
  2. 以M-! path執行系統路徑檢視,看看目前環境設定中是否已有舊版node.js,記錄其位置,在安裝新版時可以考慮安裝在同一位置以覆寫之
  3. 到 https://nodejs.org/en/ 下載最新版(我抓的是 node-v6.9.1-x64.msi )並安裝
  4. 接下來試試新模組的安裝,以此模組為例 https://www.npmjs.com/package/google-scholar
  5. 新建並進入測試目錄,以放置範例程式及所用到的模組
  6. 在命令列視窗執行 npm install google-scholar --save
  7. 範例程式如下,C-x C-f新建此檔案,輸入完整目錄、檔案名稱(記得副檔名為js),複製貼上以下內容
'use strict'
let scholar = require('google-scholar')
scholar.search('CRISPR')
  .then(resultsObj => {
    console.log(resultsObj)
  })

  1. M-! node 完整目錄、檔案名稱(記得副檔名為js),結果會出現在另一視窗
  2. 一些 emacs 上執行命令的方式列舉如下,自己看者辦囉
    M-! cmd RET
    Run the shell command line cmd and display the output (shell-command).
    M-| cmd RET
    Run the shell command line cmd with region contents as input; optionally replace the region with the output (shell-command-on-region).
    M-x shell
    Run a subshell with input and output through an Emacs buffer. You can then give commands interactively.
    M-x term
    Run a subshell with input and output through an Emacs buffer. You can then give commands interactively. Full terminal emulation is available.
    M-x eshell
    Start the Emacs shell.

2016年10月11日 星期二

在 win10 上,平行於現有 emacs 環境,安裝 spacemacs (2)

參考 spacemacs 的 github 文檔,總共列出了三種安裝位置/方式:

  1. 預設目錄 ~/.emacs.d
  2. 自訂目錄,並修改 HOME 環境變數指向此目錄
  3. 自訂目錄,並修改 ~/.emacs.d/init.el 檔案,以 load-file 指令載入自訂目錄下的 spacemacs
其實方法2和3是可以合併使用的,這兩個方法的不同之處是,方法2讓 spacemacs (暫時的)全面掌控設定,而方法3可以在載入現有設定後,再載入 spacemacs 。方法2可以用來維護多個平行的環境 ,此時 spacemacs 的位階是等同於 .emacs.d ;方法3之下, spacemacs 的位階則低於 .emacs.d 。因此我們可以利用方法2來安裝不同版本的 emacs(及其設定檔/目錄) ,而利用方法3來獨立地安裝 spacemacs。

新版的 spacemacs 多了一些預設的要求,在 windows 平台上需要預先加以處理。一是要安裝 adobe 提供的開源字型 ,下載網址在 https://github.com/adobe-fonts/source-code-pro ,解壓後進入 ttf 子目錄,選取所有字型,按右鍵,執行 "安裝"。二是要安裝 gnutls ,下載網址在 http://alpha.gnu.org/gnu/emacs/pretest/windows/ ,安裝方式可參考此頁 ,基本上就是把抓下來的 emacs-25-i686-deps.zip 解壓到當初安裝 emacs 的目錄下。

最後還有一個伏筆,就是 gnutls 需要對應的簽名檔才能正常工作。 現成的簽名檔可以從 https://curl.haxx.se/docs/caextract.html 抓到,我把它放在 HOME 目錄下,執行 M-x customize-option gnutls-trustfiles,新增一筆資料指向所下載的 cacert.pem 檔。最後重啟 emacs ,此後 spacemacs 就能正常下載並更新,啟動時也才不需加上 --insecure 參數。


2016年9月20日 星期二

pdf.js\web\viewer.js 下預設的快速鍵及功能說明

ctrl f : 搜尋
ctrl g : 下一出現處
ctrl + : zoom in
ctrl - : zoom out
ctrl 0 : zoom 100%
ctrl s : download 此 pdf 文件
ctrl alt p : 全螢幕模式
ctrl alt g : 輸入焦點移至頁碼欄

當輸入焦點在 INPUT/TEXTAREA/SELECT 時,以下快速鍵無效(因為是單純輸入(大小寫)字母鍵)

向上箭頭,PageUP,backspace (此三者在非全螢幕模式、縮放非整頁模式時才有作用),向左箭頭(非整頁模式時才有作用),k,p : 上一頁
向下箭頭,PageDOWN,space (此三者在非全螢幕模式、縮放非整頁模式時才有作用),向右箭頭(非整頁模式時才有作用),j,n  : 下一頁
esc : 關閉搜尋列或第二工具列
Home : 到第一頁
End : 到最末頁
h : 切換手掌工具
r : 順時針旋轉90度
shift space : 上一頁(在非全螢幕模式、縮放非整頁模式時才有作用)
shift r : 逆時針旋轉90度
alt 向左箭頭 : 上一瀏覽歷史
alt 向右箭頭 : 下一瀏覽歷史

2016年9月8日 星期四

在 win10 上,平行於現有 emacs 環境,安裝 spacemacs

參考 https://github.com/syl20bnr/spacemacs
假設 emacs 安裝路徑為 C:\Program Files\emacs-24.5\bin\emacs.exe
假設使用者名稱為 AAA

  1. 建立安裝設定檔的目錄,例如 C:\user\AAA\spacemacs
  2. git clone https://github.com/syl20bnr/spacemacs C:\user\AAA\spacemacs\.emacs.d
  3. 撰寫一批次檔 spacemacs.cmd ,並在桌面為它建立捷徑以方便執行,批次檔內容為

@echo off
SETLOCAL
set HOME=C:\Users\AAA\spacemacs\
start "" "C:\Program Files\emacs-24.5\bin\emacs.exe" 

2016年9月1日 星期四

melpa.milkbox.net is now melpa.org

參考 http://stackoverflow.com/questions/29085937/package-refresh-contents-hangs-at-contacting-host-elpa-gnu-org80

執行 M-x package-list-packages 時發現 melpa 連線出錯,輾轉發現 melpa 的 url 在一年多前改了

2016年7月15日 星期五

ubuntu 上 r 的更新

參考 http://askubuntu.com/questions/503270/problem-with-project-r-installation

其中有一個指令非常重要:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9

少了它就無法更新喔!!

2016年6月26日 星期日

The rise of CRISPR

玩一下新玩具 rentrez




使用rstudio的rentrez查詢ncbi提供的資料庫

首先當然要安裝好 rstudio ,請參考本站2015年7月的舊文

然後安裝 rentrez

install.packages("rentrez")

啟用 rentrez

library("rentrez", lib.loc="/usr/local/lib/R/site-library")



以下操作參考自 https://cran.r-project.org/web/packages/rentrez/vignettes/rentrez_tutorial.html

> library("rentrez", lib.loc="/usr/local/lib/R/site-library")
> entrez_dbs()
 [1] "pubmed"          "protein"      
 [3] "nuccore"         "nucleotide"  
 [5] "nucgss"          "nucest"      
 [7] "structure"       "genome"      
 [9] "annotinfo"       "assembly"    
[11] "bioproject"      "biosample"    
[13] "blastdbinfo"     "books"        
[15] "cdd"             "clinvar"      
[17] "clone"           "gap"          
[19] "gapplus"         "grasp"        
[21] "dbvar"           "gene"        
[23] "gds"             "geoprofiles"  
[25] "homologene"      "medgen"      
[27] "mesh"            "ncbisearch"  
[29] "nlmcatalog"      "omim"        
[31] "orgtrack"        "pmc"          
[33] "popset"          "probe"        
[35] "proteinclusters" "pcassay"      
[37] "biosystems"      "pccompound"  
[39] "pcsubstance"     "pubmedhealth"
[41] "seqannot"        "snp"          
[43] "sra"             "taxonomy"    
[45] "unigene"         "gencoll"      
[47] "gtr"          
> entrez_db_summary("geoprofiles")
 DbName: geoprofiles
 MenuName: GEO Profiles
 Description: Genes Expression Omnibus
 DbBuild: Build141002-1115.90
 Count: 108708851
 LastUpdate: 2016/06/21 04:48 

> entrez_db_searchable("geoprofiles")
Searchable fields for database 'geoprofiles'
  ALL All terms from all searchable fields
  UID Unique number assigned to publication
  FILT Limits the records
  ORGN Exploded organism names
  ACCN Accession for GDS (DataSet), GPL (Platform), GSM (Sample), GSE (Series)
  GDST GDS text from title and description
  GEOT Sample titles
  RTYP Platform reporter type, e.g. genbank, clone, orf
  GTYP Type of dataset
  VTYP Sample value type, e.g. log ratio, count
  NSAM Number of samples
  SRC Sample source
  ID Spot ID from GEO Platform, SAGE tag, Affy ProbeSet ID
  NAME Name or identifier for the spot, e.g. GenBank accession, CLONE_ID, ORF etc.
  SYMB Gene symbol (name) from Entrez-Gene or Entrez-UniGene.
  GDSC Gene Description
  RSTD Ranked standard deviation
  RMAX Maximal value of ranks
  RMIN Minimal value of ranks
  FINF Indicates an interesting or notable uid in the GDS context
  FTYP Type of flag that indicates a uid of interest, or outliers etc.
  GI GenBank Identifier
  ATYP Type of annotation (gene, unigene, nucleotide)
  GO Gene Ontology
  CHR Chromosomes
  CPOS Chromosome base position 

2016年6月17日 星期五

腳本語言強勢回歸

下圖截自 http://www.tiobe.com/tiobe_index



python, perl, ruby 三劍客同時擠到10名內,相對的 C 的rating降了不少。其實本該如此不是嗎? 一般人要處理的工作,應該要用腳本語言就能很快處理,對應到C/C++,不知道要寫多少倍程式行、多花多少時間。

話說 C# 和 objective-C 看來也危險了…

2016年4月3日 星期日

windows 作業系統 "檔案名稱將會太長 目的地資料夾無法接受"的問題

https://support.microsoft.com/en-us/kb/2891362

http://answers.microsoft.com/en-us/windows/forum/windows_10-files/source-path-too-long-bug-in-windows-10/b0cb82b0-85c1-4fcf-81cd-041b2175563e?page=3

windows 10 目前竟然還沒有修正…sigh


2016年3月5日 星期六

What is the rationale behind the magic number 30 in statistics? What's the difference between LLN and CLT?

n>30?

單就中央極限定理,並無法證明 n>30 時抽樣分配近似常態、即可以用標準常態分配取代t分配,可見以下連結

https://www.researchgate.net/post/What_is_the_rationale_behind_the_magic_number_30_in_statistics

目前看來還是要依不同狀況來計算所需的檢定力,反推出至少要抽多少樣本

抽後放回,連抽n次 vs. 一次抽n個


歷史上常態分配的推導是來自於二項分配,絕大部分不是數理統計背景的作者,都誤會了"中央極限定理(CLT)"中的n,它不是一次抽取n個樣本,而是"n次伯努利實驗",也就是觀測的"次數",參見以下連結:

https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%BF%83%E6%9E%81%E9%99%90%E5%AE%9A%E7%90%86

LLN


在論證中央極限定理前,有一個小標題經常被忽略掉了,叫做"大數法則(the law of large numbers (LLN) ),它的意涵才是"一次抽取n個樣本,n愈大時,樣本均數愈接近(收斂至)母體均數",但是除非母體分配是 well behaved (最好是常態或接近常態),不然是有可能不會成立的!!

而當母體為有限母體時,則必需由樣本變異數所估計的母體變異數需以"有限母體校正因子"校正,因前者持續(一致)地高估了母體變異數 。嚴格來說在 LLN 的篇幅中交代變異數是沒有必要的,也容易造成初學者更多的誤解,最好在後續的抽樣分配課程中再來介紹會比較適當。

今日之所以在統計程序上的計算少見此類校正,乃是因為各種樣本分配已經建立在未校正變異數之上,所以即使所用的標準誤不是無偏估計量,大家也都無感…

CLT


回到CLT,它的意涵是"我管你一次觀測抽幾個樣本去平均,做了 n 次觀測後,再來取這 n 次觀測的平均,這樣所得到的 mean of means ,當 n 愈大,其分配愈接近常態,不論母體分配為何,只要 n 夠大(很好很強大,這才是重點…)。

so, why do we use t-test when n is relatively small (like <30 anyway)


當樣本數小時,Z值公式所得到的分配會得到較標準常態分配矮胖的 t 分配,顯見樣本標準差被一致的低估了,這一現象勉強可以和LLN扯上一點關係…

2016年3月4日 星期五

one feature for one commit

想提升工作效率嗎?聽聽 Facebook 高效能工程師怎麼說!

當然,架構的改變可能不是幾行可以解決。那就把大目標再次分拆為小目標,並修正說明文字吧!

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

2016年1月31日 星期日

15分鐘學會 emacs (in my dreams)

http://emacs-doctor.com/learn-emacs-lisp-in-15-minutes.html

15分鐘…話是這麼說啦,但是總覺得…不太實際啊XD

不過順便自賣自誇一下 3 年前寫的 emacs 24中的lisp程式碼導航(code navigation)--Slime-style ... 這篇所介紹的 elisp-slime-nav ,搭配上 Xah 寫的 How to Edit Lisp Code with Emacs ,我覺得是很有幫助的,尤其是前者,它連你要找的 elisp 原碼是用C寫的都知道,而如果你真的給它原碼的位置,它也真的會幫你找到。真是太神啦~~


2016年1月30日 星期六

The Roots of Lisp 讀後心得

兩年前我曾經想讀這篇 The Roots of Lisp (ref. 使用perl及mozrepl操控firefox,以及repl的引入 ), 今天再細讀了一次,總算大概明白了作者想要講的東西。

資料(data)可以變成程序(procedure)

因為資料是演算的對象、結果(=>客體),如果我們可以將它變成 procedure ,那麼 procedure 就變成是有因時制宜能力的、有智慧的程式,那不就是人工智慧(AI)了嗎?以結果論的話,那就是程式產生程式。至於中間是一定要經過演算的,那麼演算的對象、結果是以資料的形式存在,如何將結果用來產生程式?那就是 The Roots of Lisp 當中的 "eval." 求值函數的作用(之一)了。

你可能會問說那 procedure 可不可以變成 data 呢?當然可以,不過那是沒有意義的,因為 procedure 是演算的主體,它本身不承載演算的對象、結果,因此演算前後它不會變動,那麼把它變成 data 是無謂的。

當然以 John McCarthy 的所處年代,他看到的東西未必和 Paul Graham 或今日的我們看到的東西是一樣的。他做的是試圖把演算"公理化",而結果就是一套演算法/公理,只要基本的 7+2 個基本算子,就可以建構出任意複雜度的演算/程式。求值函數除了求得函數值以外,還可以把資料(函數的定義)變成程序,而在執行期賦予程式高度的可變性。

所以其實到 programming 這端其實有沒有用 eval. 其實已經不重要,在整個 Lisp 的環境中, eval. 已經默默的工作了許久了…


2016年1月29日 星期五

Crash Course in Spacemacs


  1. Button 'SPC' = M-m in vanilla Emacs mode (why oh why should I spend 10 minutes googling it...)
  2. check it out: https://github.com/syl20bnr/spacemacs/blob/master/doc/QUICK_START.org
  3. ditto           : http://thume.ca/howto/2015/03/07/configuring-spacemacs-a-tutorial/

2016年1月28日 星期四

純 C 語言專案的 call graph 產生方式

參考 分析函數調用關系圖(call graph)的幾種方法 可以有個概念,目前傾向於使用 gnu cflow ,因為得到的是文字檔,既可直接進行文字註解,也可以產生圖檔,較富有彈性。安裝及使用可參考 Call Graph for C - cflow 。更詳細的說明可參考 好用的 Trace 工具 cflow 。當然,如果只有做到這樣,那 emacs 就沒有什麼好拿來說嘴的了;請安裝 cflow-mode ,直接在 call graph 中進行原始碼跳轉。直接在 emacs 中產生 cflow 的 call graph ,也只要寫個腳本就好了。

emacs的cflow-mode的快速鍵有這些:
key             binding
---             -------

TAB cflow-hide-or-show-subtree
SPC cflow-scroll-other-window
1 delete-other-windows
? cflow-get-stack
E cflow-edit-out-full
R cflow-recursion-next
b cflow-backward-same-level
d cflow-display-function-other-window
f cflow-forward-same-level
n cflow-next-line
o cflow-find-function-other-window
p cflow-previous-line
r cflow-recursion-root
s cflow-find-function
u cflow-up-level
x cflow-goto-expand
DEL cflow-scroll-other-window-down

以 emacs 24.5 的原始碼來說, call graph 是非常巨大的,建議一定要加上 -b 參數; reverse graph 的話,一樣很巨大,除了加上 -b 參數這條路之外,-d 2 也是一個選項,不過減少的檔案大小大概只有25%左右,但少了一堆資訊,看各人的需求囉~~


P.S.為了在源碼間跳轉的話,可以使用 cscope ,參考2013年的拙作: ubuntu上為emacs安裝cscope以進行code navigation

2016年1月27日 星期三

git "daily workflow"


一早起來,手上的程式還沒 push , repo 的版本已經往前狂跳了(驚),怎麼辦?

兩年前我寫過這篇:

不過時間隔太久了,我竟然要 google 才抓得到這篇文。顯然對於每日開工的流程有必要好好重新整理啊(抓頭)~~

正常來說,工作到一個預定的 milestone ,一定會主動進行 git push ,這你知、我知、獨眼龍也知,所以應該不會出現在一天開工的時候。開工時發現 repo 上的變動,大概可以分成三種:不需要 merge 、 不想 merge (喂) 、 有 conflict 需要 merge  。
  • Scenario I: Nothing serious done...(那就沒什麼好擔心的啦~~)
    • git pull origin master
  • Scenario II: Something done, wanna undo, no conflict => rollback changes (這什麼情況?就是人家做得好,直接接收啦~~)
    • git reset --hard HEAD^ 
      • 恢復到本地端最後一次 commit 前的狀態, 但修改過的檔案仍會還原
    • git pull origin master
  • Scenario III: Something done, conflicts BIG TIME !!
    • IIIa. just merge it (這什麼情況?就是人家做得好,merge的部分好解決,直接接收啦~~)
      • git pull origin master
        • merge XXXX...YYYY
    • IIIb. stash->rebase->reset (merge 會很麻煩,剛開工先不要處理這麼硬的工作,晚點再說啦~~)
      • git add .
      • git commit -m "push to stash"
        • 這個動作很重要,任何pull之前,要確保本地變動有存下來!!
      • git pull --rebase origin master
        • merge XXXX...YYYY (保留 repo 的版本,捨棄 local 的變動)
      • git reset --soft HEAD~1 
        • 恢復到本地端 commit 前的狀態, 但修改過的檔案仍不變
參考資料:

emacs magit workflow

http://ergoemacs.org/emacs/emacs_magit-mode_tutorial.html

(Install magit from elpa/melpa first)


Run once under terminal/command prompt:


  1. git clone https://github.com/AAA/BBB.git & cd BBB(if required)
    • if start from scratch, run "git init" instead

Run as you change code / debug under emacs :

  1. M-x magit-status (to bring up magit)
  2. S (= git add .)
  3. c c MMM C-c C-c (= git commit -m "MMM")
  4. P p (= git push origin master)

2016年1月26日 星期二

windows 下 emacs magit 無法 push 的問題

https://github.com/magit/magit/wiki/Pushing-with-Magit-from-Windows

真的是大杯無鹽…

emacs中bookmark plus (bookmark+)的使用 v.20160125

http://www.emacswiki.org/emacs/BookmarkPlus

用elpa裝好了以後,原則上按鍵組合與原先bookmark是相同的

(20170117特急通知:請勿更新 org 到 9.0以上版本,否則以下部分功能無法正常使用)

多個書籤檔的建立/切換


‘C-x p L’ (or just ‘L’ in the bookmark-list)(‘bmkp-switch-bookmark-file-create’)

新增bookmark: bookmark-set `C-x r m', `C-x p c m'


這不就最基本款的嗎?是的,不過它幕後記載了不少東西,使得某些功能更為強大了,例如它會記得這個buffer上次bookmark的名字;嚴格來說它有辦法撈出最近一次的bookmark,所以當它問你這次要給bookmark什麼名字時,按下 `C-M-u' 就直接幫你打出這個名字來,文件上說真的就像實體的書籤一樣,我們通常洗手間都會擺一本連著看很容易睡著的小說,這裏面是一定要夾一個書籤的不是嗎?它就是用來記得上次看到那兒的…

預設在問你要給什麼名字的時候,提示的是這個buffer中曾經設置過的所有bookmark名字;我通常會在文章中copy一段有代表性的文字,在它提示要輸入名字時按下 C-y ,省去打字的功夫。

檢視bookmark list


‘C-x p e’ or ‘C-x r l’ (command ‘bookmark-bmenu-list’)

跳到指定的 bookmark


‘C-x j j’ (‘bookmark-jump’)
‘C-x 4 j j’ (‘bookmark-jump-other-window’)

與 org mode 整合,在開發程式時做文件以跳轉到原始碼,或是為你不能check out只能clone/rebase的原始碼做注解


文件寫一寫要對照原始碼時,總要回去看一下原碼,如果結合org mode在裏面加link,就可以跳轉到原始碼,這不是太好了嗎?就是有這麼好的事, bookmark 可以成為link的目的地以進行跳轉。有兩個步驟:

  1. 複製連結。有兩種作法,一是先按個 C-x r l 把bookmark list先帶出來,然後 C-c l (‘org-store-link’) 複製連結;嫌麻煩的話直接在 org 檔中使用 M-x bmkp-store-org-link 在跳出的對話盒選取之前存下來的 bookmark 也行。
  2. 最後在要插入 bookmark link 的 org 檔中按 C-C C-l 插入連結。


結合dired記得整個buffer內容


dired就有點像文字版本的檔案管理員,把emacs當ide時可以把它放在左上角。在這個major mode中,bookmark+會把整個dired的配置都記得,把它拿來當成專案檔的話是滿不錯的…dired的說明:

http://ithelp.ithome.com.tw/question/10138296
http://ithelp.ithome.com.tw/question/10138547
https://yfwu.gitbooks.io/emacs-manual/content/chapter3-dired.html
http://kuanyui.github.io/2014/06/21/dired-tutorial-and-essential-configs/
https://twitter.com/emacstw/status/479866473226055680

bmkp-make-desktop-record 記得桌面配置 C-x p K


當桌面割得亂七八糟時,你會需要它的…

編輯bookmark list


http://www.emacswiki.org/emacs/BookmarkPlus#toc26

重要預設值


預設書籤檔位置    bmkp-last-as-first-bookmark-file

「org mode bookmark plus」的圖片搜尋結果

2016年1月21日 星期四

emacs lisp 學習計劃

Emacs 令人著迷卻又難以客製的原因,我想都是出自於所使用的 emacs lisp 語言。

lisp 現在的主要兩本教科書,分別是使用(號稱)精簡版的 scheme 語言的 sicp ,及使用 common lisp 的 paip。

根據此文所言,emacs lisp 應該是比較接近 common lisp ,因此似乎以學習 common lisp 是比較好的選擇。李殺則認為 common lisp 甚至不應作為學習的起點,而應該直接學習 emacs lisp;李殺網有不少學習的資料,值得好好看看,他也認為適當的結合其它腳本語言可以事半功倍,但是複雜的情況仍然需要直接使用 emacs lisp 當中的 buffer 概念來處理。

2016年1月20日 星期三

這次安裝 ubuntu 15.10 遇到的問題彙整

網卡驅動程式安裝

http://www.howopensource.com/2012/05/install-broadcom-sta-b43-wireless-driver-in-ubuntu-12-04-11-10-11-04/

安裝英文版,使得中文字體全變標楷體

移除2個設定檔
http://brianhu.logdown.com/posts/222914-ubuntu-14-04

變更系統字型

使用 Ubuntu tweak
http://blog.csdn.net/tao_627/article/details/24180781

Dropbox 的安裝/執行

https://www.dropbox.com/install?os=lnx

Ubuntu 14.10與嘸蝦米 - 使用fcitx

http://jyc-blog.blogspot.tw/2015/02/ubuntu-1410-fcitx.html
http://yuanfarn.blogspot.tw/2015/04/ubuntu-1504.html
http://www.pinyinjoe.com/linux/ubuntu-12-chinese-setup.htm

20171011更新:
下面這個連結比較精確
http://gitqwerty777.github.io/install-boshiamy-in-linux-by-fcitx/