Showing posts with label sourcecode. Show all posts
Showing posts with label sourcecode. Show all posts

Apr 21, 2013

golang - Flag 隱藏選項 -help 與 -h

預設的 FlagSet 裡藏了兩個預設選項 -help 跟 -h, 在用 flag 時可以少寫一點 boilerplate code

src/pkg/flag/flag.go

func (f *FlagSet) parseOne() (bool, error) {
    // ignored
    flag, alreadythere := m[name]
    if !alreadythere {
        if name == "help" || name == "h" { // special case for nice help message.
            f.usage()
            return false, ErrHelp
        }
        return false, f.failf("flag provided but not defined: -%s", name)
    }
    // ignored
}

上面那段 code 的意思是程式裡沒有設定 h 或 help 選項,若是執行的時候從 command-line 解析到 h 或 help 就印出 usage (然後 parserOne() 的 caller 收到 ErrHelp 就會結束程式)

demo1.go

package main

import (
    "flag"
    "fmt"
)

func main() {
    optionA := flag.String("A", "", "help message for A")
    optionB := flag.String("B", "", "help message for B")
    flag.Parse()
    fmt.Printf("optionA=%s, optionB=%s\n", *optionA, *optionB)
}

執行結果

$ ./demo1 -h
Usage of ./demo1:
  -A="": help message for A
  -B="": help message for B

若希望能顯示 h 選項,可以改寫預設的 flag.Usage

demo2.go

package main

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

func main() {
    optionA := flag.String("A", "", "help message for A")
    optionB := flag.String("B", "", "help message for B")

    flag.Usage = func() {
        fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
        flag.PrintDefaults()
        fmt.Fprintln(os.Stderr, "  -h   : show help usage")
    }

    flag.Parse()
    fmt.Printf("optionA=%s, optionB=%s\n", *optionA, *optionB)
}

執行結果

$ ./demo2 -h
Usage of ./demo2:
  -A="": help message for A
  -B="": help message for B
  -h   : show help usage

Mar 18, 2012

Random / Math.random() / ThreadLocalRandom

java.util.Random

java.util.Random 亂數演算法會依賴 seed 數值產生亂數,並在產生亂數後重新產生 seed,
在 Multi-thread 下為了保證在各Thread取到不同的亂數, java.util.Random 在實作上使用 optimistic locking 來同步更換 seed ,問題是若所有Thread都使用同個Random物件產生亂數,在大量競爭下會造成不斷的loop計算,進而產生效能問題

Dec 6, 2011

Java時間解析度

Inside the Hotspot VM: Clocks, Timers and Scheduling Events - Part I - Windows 說明作業系統在讀取時間與時間event(schedule/trigger)的限制,因此從java api取得的 nanosecond 的數值並不精確,越高的解析度(nanoseconds > microseconds > milliseconds)精確度越低,文中也提供了些使用上的建議。
  • 需要讀取精確的時間使用 System.currentTimeMillis()
  • 需要比較時間差異使用 System.nanoTime()
  • 需要等待系統回應(e.g. wait/sleep),設定時間別小於10 milliseconds