2021年8月22日 星期日

JavaScript 去除小數字串後面多餘的零

例如,"1.00200" => "1.002"

可以將小數字串轉型成數字,後面的零會自動去除。 
如果不想轉成數字,可以用正規表達式處理:

  1. \.0*$」:符合 ".0"、".00"、".000"....這類的字串尾,找出來,去除。
  2. (\.\d*[1-9])0+$」:符合".10"、".010"、".0100"、".100100000"....這類的字串尾,找出來,去除後面連續的"0",並將前面小數點「.」到最後一個不是「0」的部分,保留暫存為第一個變數「$1」。
  3. 用OR將兩者綜合起來:
    • 小數字串.replace(/\.0*$|(\.\d*[1-9])0+$/, '$1')
    • 第一個條件「\.0*$」,沒用「()」小括號紀錄符合的部分,所以沒有$1的值,效果猶如直接去除符合的部分。
      (如果這個條件也用了小括號儲存變數,連後面第二個條件的小括號,整個比對樣式共有兩個小括號,會變成第一個括號為$1,第二個括號為$2)
    • 第二個條件「(\.\d*[1-9])0+$」用「()」小括號將符合的字串範圍中,要保留的部分存成$1變數,整個符合範圍用$1取代。
/**
 * 去除小數字串後面多餘的零
 * @param {String} num_str
 * @returns {String}
 */
var removeFloatTrailingZero = function (num_str) {
   //new String("test"),typeof 是 object,所以多一個 instanceof 判斷
    if (typeof num_str === "string" || num_str instanceof String) {
        //字串
    } else {
       //避免隨意傳入非字串變數,導致後面replace()出錯
        num_str = String(num_str);//null、undefined 不能用 toString()
    }
    return num_str.replace(/\.0*$|(\.\d*[1-9])0+$/, '$1');
};

Regular Expression 取代效果:
https://regex101.com/r/l4FOO8/1/

測試字串:
0
0.0
0.00
1.0
10.00
100
200.010
200.01023000
200.100
200.1002
去除符合樣式,保留$1的最終結果:
0
0
0
1
10
100
200.01
200.01023
200.1
200.1002


其他:
若改成用「#$1」取代
數字字串.replace(/\.0*$|(\.\d*[1-9])0+$/, '#$1'),
可較清晰的觀察比對樣式條件OR、變數$1的取代邏輯。
https://regex101.com/r/Ng06RE/1
0
0#
0#
1#
10#
100
200#.01
200#.01023
200#.1
200.1002



2021年7月6日 星期二

php-fpm.conf 中的 request_terminate_timeout 設定

 request_terminate_timeout:

  • 預設值0,代表off
  • 可設定單位:s(秒、預設)、m(分)、h(小時)、d(日)
  • 效果:執行逾時,會發生錯誤中斷執行
  • 錯誤訊息:
    PHP error log => execution timed out, terminating
    Nginx => 502 Bad Gateway
  • 使用時機:當 max_execution_time 執行超時限制無作用時,又有需求須中止執行時,可考慮設定此參數。

官網說明:
request_terminate_timeout mixed
The timeout for serving a single request after which the worker process will be killed.
This option should be used when the 'max_execution_time' ini option does not stop script execution for some reason.
A value of '0' means 'Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.


max_execution_time 說明:
max_execution_time 只算 PHP Script 本身執行的時間。
system calls using system(), stream operations, database queries...這些不列入計算。
例如,使用 sleep()延遲執行花的時間、curl_init()抓取網站花的時間,都不屬於PHP本身Script執行時間,都不會導致超過 max_execution_time 限制產生逾時。
若這些時間也要加入執行逾時考量,可以考慮使用 request_terminate_timeout 參數。





參考:



2021年6月19日 星期六

Go 語言取得命令列參數

[cmd_arg.go 內容]
package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    //取得命令列參數(變數為指標)
    varAA := flag.String("aa", "ABC", "字串參數")
    varBB := flag.Int("bb", 123, "整數參數")
    varCC := flag.Bool("cc", false, "布林值參數")
    //取得命令列參數(將現有變數,設定為接收為參數)
    var varDD string
    flag.StringVar(&varDD, "dd", "DEF", "字串參數")

    flag.Parse()

    fmt.Println("aa:", *varAA)
    fmt.Println("bb:", *varBB)
    fmt.Println("cc:", *varCC)
    fmt.Println("dd:", varDD)
    fmt.Println("不在規定內,其他形式的參數:", flag.Args())
    fmt.Println("另一個方式,使用os.Args取得參數陣列 os.Args   :", os.Args)
    fmt.Println("另一個方式,使用os.Args取得參數陣列 os.Args[0]:", os.Args[0])
    if len(os.Args) > 1 {
        fmt.Println("另一個方式,使用os.Args取得參數陣列 os.Args[1]:", os.Args[1])
    }
}


[結果]
D:\Go>go build cmd_arg.go

D:\Go>cmd_arg -h
Usage of cmd_arg:
  -aa string
        字串參數 (default "ABC")
  -bb int
        整數參數 (default 123)  
  -cc
        布林值參數
  -dd string
        字串參數 (default "DEF")

D:\Go>cmd_arg
aa: ABC
bb: 123
cc: false
dd: DEF
不在規定內,其他形式的參數: []
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg

D:\Go>cmd_arg -bb=99 -dd=XYZ ww xx dfs
aa: ABC
bb: 99
cc: false
dd: XYZ
不在規定內,其他形式的參數: [ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg -bb=99 -dd=XYZ ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg
另一個方式,使用os.Args取得參數陣列 os.Args[1]: -bb=99

D:\Go>cmd_arg -bb=99 -dd=XYZ ww xx dfs
aa: ABC
bb: 99
cc: false
dd: XYZ
不在規定內,其他形式的參數: [ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg -bb=99 -dd=XYZ ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg
另一個方式,使用os.Args取得參數陣列 os.Args[1]: -bb=99

D:\Go>cmd_arg -bb 99 -dd XYZ ww xx dfs
aa: ABC
bb: 99
cc: false
dd: XYZ
不在規定內,其他形式的參數: [ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg -bb 99 -dd XYZ ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg
另一個方式,使用os.Args取得參數陣列 os.Args[1]: -bb





參考:


Go 語言跨平台編譯

Go 語言可以在另一個平台(作業系統)上,編譯出另一個平台(作業系統)的執行檔。


[參數]
GOOS:作業系統(android、ios、linux、windows...)
GOARCH:作業系統架構(arm、amd64...)
CGO_ENABLED:是否啟用CGO (不能啟用CGO,故設為0)

例1:windows 上編譯出 Linux 執行檔(僅用SET,沒用-w設定的環境變數,僅在此次開啟的termial有效)
SET CGO_ENABLED=0 
SET GOOS=linux
SET GOARCH=amd64
go build main.go


例2:Linux 上編譯出 windows 執行檔
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go



[查詢支援的平台]
>go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
openbsd/mips64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
windows/386
windows/amd64
windows/arm





參考:


2021年6月11日 星期五

JavaScript 複製文字

<a class="link" href="http://example.com" target="_blank">http://example.com</a>
<input type="button" name="btnCopy" value="複製">

<script type="text/javascript">
    $(function () {
        $("input[name=btnCopy]").click(function () {
            var node = document.querySelector('.link');
            var range = document.createRange();
            range.selectNode(node);
            window.getSelection().removeAllRanges();
            window.getSelection().addRange(range);
            try {
                var successful = document.execCommand('copy');
                if (successful) {
                    alert("複製成功");
                } else {
                    alert("複製失敗");
                }
            } catch (err) {
                alert("複製失敗!");
            }
            window.getSelection().removeAllRanges();
        });
    });
</script>



參考: