2019年10月27日 星期日

PHPStorm使用Remote的Xdebug與phpunit

續前一篇,在Docker中執行PHP,選擇使用 PHPUnit 執行時,會發生錯誤


錯誤為找不到PHPUnit



PHPStorm與遠端(Remote)Docker整合

以前開發PHP時,修改後需要手動上傳到遠端伺服器上,然後再測試執行結果
使用PHPStorm之後只可以減少手動執行的步驟,PHPStorm可以自動將變更的檔案佈署到遠端伺服器上(或者是多台的伺服器群組),在透過遠端的Docker執行單元測試

使用Docker來做單元測試是可以保持環境的一致姓,因為平時開發環境可能會安裝多個版本的PHP或者調整php.ini的關係造成與實際佈署環境不一致的情況,每次執行單元測試的容器都是一次性使用的,執行完單元測試後就會自動銷毀


PHPStorm with remote Docker 架構圖

2019年10月22日 星期二

啟用Docker的Restful API功能

這篇文章適用於Docker 19.03 CE版於ubuntu19.04與CentOS7

因為Docker的Restful API並未提供認證功能
所以啟用此功能務必確認網路是封閉或測試需求
不要在正式環境下開啟此功能


2019年10月20日 星期日

PHPStorm偏好設定(Preferences)

最近開始使用PHPStorm開發,使用一段時間發現有些不適應的地方(之前用VS Code)

1.啟用滑鼠滾輪可縮放編輯區字體(鍵盤Ctrl+滑鼠滾輪)
使用VS開發時大概調130%在編輯區也有一個dropdown可以選















2.未使用項目(unused symbol)顯示顏色調整
因為使用Material darker配色所以編輯區是黑色的,而未使用項目(函數、變數)會顯示呈灰色
尤其是剛打的變數或函數參數會立即變灰色很難辨識





























3.自動完成(code completion)忽略大小寫
預設是區分大小小寫,例如有一個函數為Init()
輸入i開頭會出現但是輸入in就不會出現了

















Refense

https://www.jetbrains.com/help/phpstorm/auto-completing-code.html

使用gdb偵錯crash的程式

最近遇到升級pmacct版本之後發生子程序crash的情況
可以使用gdb配合core dump檔案偵錯
因為沒什麼C語言除錯的經驗,怕忘了所以筆記一下

1.啟用Core Dump
ulimit -c unlimited

2.執行gdb 選擇要執行的程式
輸入參數開始執行 run -f pmacct.conf
出現錯誤之後可Ctrl - C 回到gdb再輸入quit離開




3.崩潰後產生的coredump檔案(結尾為pid編號)














4.載入coredump
gdb [執行檔] [CoreDump檔案]
輸入bt































從#0可以看到產生崩潰的是memcpy這個函數
使用的地方是#1的pgsql_plugin.c:475的位置

2019年9月29日 星期日

Docker筆記

最近工作上用到Docker買了些書還跟同事參加K8s的研討會,回來後就投入把目前開發環境從windows server轉移到ubuntu+docker的模式,也踩了不少坑


2019年8月2日 星期五

Auto update script for GoDaddy DDNS on RouterOS

Follow the steps below to get the API KEY

https://www.instructables.com/id/Quick-and-Dirty-Dynamic-DNS-Using-GoDaddy/


#GoDaddy DDNS Update Script
#Test with RouterOS 6.45.2 (Minimum version RouterOS 6.44)
#Date:2019/08/02
#The read,write,policy,test that all of these policies need to be set in script for the global variable
#ref1 https://www.instructables.com/id/Quick-and-Dirty-Dynamic-DNS-Using-GoDaddy/
#ref2 http://www.minitw.com/post/2018/05/09/routeros-ddns-namecheap
#Easy Test
# /tool fetch url="https://api.godaddy.com/v1/domains/[domain]/records/A/[hostname]" http-method=put http-data="[{\"data\": \"10.10.10.10\"}]" http-header-field="content-type: application/json,Authorization: sso-key [API_KEY]:[API_SECRET]"
#Create Schedule running
# /system scheduler add name=update-ddns interval=1m on-event=godaddy-ddns
#kye token format is [API_KEY]:[API_SECRET]
:local ddnkey "Authorization: sso-key [API_KEY]:[API_SECRET]"
:local ddnsdomain "[domain]"
:local ddnshostname "[hostname]"
:local ddnsinterface "pppoe-adsl"
#Use global variable to check if need update
:global ddnslastipADSL1
:global ddnsipADSL1 [/ip address get [/ip address find actual-interface=$ddnsinterface] address ]
:if ([:typeof [:global ddnslastipADSL1]] = nil ) do={ :global ddnslastipADSL1 0.0.0.0/0 } else={ :set ddnslastipADSL1 $ddnslastipADSL1 }
:if ([:typeof [:global ddnsipADSL1]] = nil ) do={
:log info ("DDNS: No ip address present on " . $ddnsinterface . ", please check.")
} else={
:if ($ddnsipADSL1 != $ddnslastipADSL1) do={
:local ipFormat [:pick $ddnsipADSL1 0 [:find $ddnsipADSL1 "/"]];
:log info "DDNS-Update use $ddnsinterface IP : $ipFormat"
:local ddnsurl "https://api.godaddy.com/v1/domains/$ddnsdomain/records/A/$ddnshostname"
:local ddnsipjson "[{\"data\": \"$ipFormat\"}]"
:local result [/tool fetch url=$ddnsurl http-method=put http-data=$ddnsipjson http-header-field="content-type: application/json,$ddnkey" as-value output=user]
:if ($result->"status" = "finished") do={
:log info ($ddnshostname . "." . $ddnsdomain " Update IP " . $ipFormat . " Success")
:global ddnslastipADSL1 $ddnsipADSL1
} else={
:log info ("DDNS Update Error".$result->status)
}
} else={
:log info "DDNS: IP No Change"
}
}