make整理

makefile: makefile, Makefile, GNUMakefile

一般結構採用top-down,從general寫到details

make -n 只印不執行,適合用在debug

make規則整理:
第一條rule為default rule (以cmake為例,第一條是 default_target: all)
rule分成target, prerequisite, command

target: prerequisites
command

prerequisite定義target的相依項目,command定義生成target

make解析順序: 對prerequsites recursive更新檢查,再對target更新檢查(如果prerequsites時間較新,則要重新生成target)
target因為是後生成,除非prerequsites有更新,不然一般要比prerequsites新

prerequisite: 除了檔案或是target,也可以是-lNAME (會搜索 libNAME.so => libNAME.a) 但一般不建議利用make來搜尋library是否存在,原因是通常在compiler選項會設定其他的library search path

target跟prerequisite比更新時間,
如果沒有prerequisite時,只有不存在target才會生成

同樣的target可以分開寫,會依序執行檢查

libname.a(module.o) lib target: ()是member

phony target: 可以想成代表command scripts的label,不對應檔案 (要標記 .PHONY)

.PHONY也是target的表示法,為special target(還有其他的sp target如.INTERMEDIATE
.SUFFIXES)
phony target 總是被執行(可想成總是outdated)
phony target作為prerequisite也會總是被執行

rule分成 explicit rules, pattern rules, implicit rules(built-in rules)

static pattern rules:

$(OBJECTS): %.o: %.c
對於$(OBJECTS)列出的檔案apply

.SUFFIXES know suffix (suffix rule會用到)

TAB: command以TAB起始
#: # 之後為註釋會被ignore,但注意command列中的#部會被忽略而會傳下去
\: line continuation

variable: case sensitive $(VAR) or ${VAR}, single character variable不用括號

variable naming convention: 代表command變數或環境變數全大寫, makefile的變數全小寫以 – 分隔

automatic variables

order is preserved (為了保留傳進去link order)
$@ target
$^ all prerequisites (duplicate filename removed)
$+ all prerequisites (duplicate filename reserved) <-為了lib link circular dependency $< first prerequisite $? prerequisites newer than the target (可用在update archive)

變數設定
lazy: VARIABLE = value (expand when variable is used)
immediate: VARIABLE := value (expand when variable is declared)
https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a

variable可以來自: command line, Makefile, environment variables,


make CFLAGS=-g 會蓋過 Makefile內部assignment與環境變數

?= 方便用在處理外部設定變數並提供預設值

explicit rule -> implicit rule (make --print-data-base, make -p / 關掉--no-builtin-rules, make -R)

local directory -> VPATH

%在pattern中只能出現一次,代表word stem(至少一個字元)

gcc -M 產生Makefile可讀的 header dependency (automatic dependency generation)

-include (- 會 suppress warning) 常配合 .d的使用,因為一開始有可能depend file還沒有generate出來

macro定義

define this-is-macro-def
endef

$(this-is-macro-def)
macro使用時 command TAB會使macro內部所有列都apply

make執行時,分成兩階段,
第一階段是宣告期: 處理include並產生dependency graph
第二階段是執行期: 檢查必須要update的項目並執行command
deferred evaluation都是在第二階段

target, prerequisite 是第一階段展開,command script在在第二階段展開

待補...

Posted in Tips | Leave a comment

tcp dynamic port number

在服務器listen port時,port選擇需要注意衝突問題。以windows os來說,

Microsoft has increased the dynamic client port range for outgoing connections in Windows Vista and Windows Server 2008. The new default start port is 49152, and the new default end port is 65535. This is a change from the configuration of earlier versions of Windows that used a default port range of 1025 through 5000.

早期的dynamic port range選在1025-5000,目前windows按照IANA的建議選在49152 – 65535。 (client program port)

因此server port選在49152 – 65535則會有衝突的可能,若client的連線剛好占用到此port,這樣一來就無法bind成功。看起來就是server偶爾會listen失敗,通常遇到的時候看錯誤代碼應可推敲出問題,但這類的錯誤出現是機率性的,在測試時不一定會發生,因此在一開始設計時必須要理解有這樣的問題可能。

Linux可參考 /proc/sys/net/ipv4/ip_local_port_range (32768 60999)

參考:
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
https://support.microsoft.com/en-us/help/929851/the-default-dynamic-port-range-for-tcp-ip-has-changed-in-windows-vista

Posted in System Administration | Leave a comment

js convert to number

在要轉成number型態時
可用 |0的方式

null | 0 = 0
undefined | 0 = 0
“” | 0 = 0
true | 0 = 1
false | 0 = 0

但注意 | operator有32 bit限制

如果是像 unix timestamp milliseconds的”字串” (例如從網路傳上來)

轉成number時 “1534478379792”|0 = 1175055120 overflow了!!

這邊可以利用 “1534478379792” * 1 = 1534478379792來解決

不過要小心如果不是數字字串 * 1會得到NaN

Posted in nodejs | Leave a comment

async常用function整理

concat, concatSeries 連接results in array
each, eachSeries 分別執行
every, everySeries 分別執行並加上true/false判斷(false即返回)
filter, filterSeries 分別執行並加上true/false判斷(只回傳true的coll), 與reject相反
map, mapSeries 分別執行並回傳results
reduce 分別執行並往下傳result
series 分別執行function, 返回值統一在callback results
waterfall 分別執行function, 返回值往下傳

實際上大概 mapSeries, waterfall比較常用到,特別像是在一個api裡要執行一連串SQL時。

waterfall則用在SQL根據上一個返回結果動態生成時方便使用

參考: https://caolan.github.io/async/docs.html

Posted in nodejs | Leave a comment

link -l tips

ld

-l namespec
搜尋 libnamespec.so => libnamespec.a

-l :filename
搜尋 filename

另外注意 -l ordering
link library需要的dependeny會往後找而不是往前找,如果有前後循環相依的問題可用–start-group archives –end-group來處理

-static or -Bdynamic: it affects library searching for -l options which follow it.

參考: https://sourceware.org/binutils/docs/ld/Options.html

Posted in Tips | Leave a comment

gcc rpath

linux環境在執行程式時,為了將.so library統一放在特定地方而不想更動LD_LIBRARY_PATH或是/etc/ld.so.conf時,
可透過在gcc編譯選項加上

-Wl,-rpath=.
-Wl,-rpath=./lib

這樣會搜尋執行檔當前目錄的相對路徑(. 即是當前目錄, ./lib 即是當前目錄/lib)
但注意當前目錄不等同執行檔所在位置的目錄(也就是從其他目錄執行程式),
所以如果.so是放在執行檔所在目錄下的lib,而從其他目錄執行時,一樣會報錯。
一般情況預期的相對目錄是相對於執行檔的目錄,這時候就需要加入$ORIGIN 標示。

-Wl,-rpath,’$$ORIGIN/.’

注意Makefile裡以上是兩個dollar sign
確認是否正確可用readelf debug: readelf -d executable|grep PATH

少一個$ '$ORIGIN/.'
0x000000000000000f (RPATH) Library rpath: [RIGIN/.]

這邊rpath描述的是執行時的,另外有一個rpath-link是編譯時期的
參考:
https://linux.die.net/man/1/ld
https://stackoverflow.com/questions/24573732/difference-between-relative-path-and-using-origin-as-rpath
https://stackoverflow.com/questions/38058041/correct-usage-of-rpath-relative-vs-absolute

chrpath

Posted in Tips | Leave a comment

check object path

在處理json回傳內容時,常常需要驗證內容是否符合預期,
或是要存取object nested field,如要檢查該field是否存在

{
  "a": {
    "b": {
      "c": 1 
    }
  }
}

時,可用

if(data.a && data.a.b && (data.a.b.c !== undefined)){
}

但這樣稍嫌麻煩,可用 lodash _.has來處理

if(_.has(data, "a.b.c")){ 
}

參考: https://lodash.com/docs/4.17.10#has

Posted in Front-end | Leave a comment

svn ignore tips

編輯 svn:ignore list
注意dirname尾巴不要slash /

svn propedit svn:ignore .

刪除svn:ignore

svn propdel svn:ignore

Posted in System Administration | Leave a comment

js polyfill tips

polyfill的作法

這個方法是在webpack doc (https://webpack.js.org/guides/shimming/)看到的,
但其實動態load script的方式在很多地方都有應用,例如JSONP



  
    
      Getting Started
+     
    
    
      
    
  

在browser內javascript環境下的io都是asychronous的,所以為了要動態load script並確保執行順序,利用動態插入<script> tag 以及script synchronous load的特性來完成。

Posted in Front-end | Leave a comment

chromium os tips

下載
https://chromium.arnoldthebat.co.uk/?dir=daily
參考此篇安裝

How to Run Google Chrome OS From a USB Drive



其他
進console: Ctrl+Alt+F2
預設帳號: chronos
有些指令是要sudo 例如fdisk

預設是boot from usb 安裝寫入hard disk: root權限 chromeos-install –dst /dev/mmcblk0 (裝置路徑 如/dev/sda)

Ctrl+Alt+/ => hot key tips
Ctrl + F5 print screen

Posted in Tips | Leave a comment