Hero Image
golang pprof 实战

golang pprof 实战 炸弹程序 package main import ( // 略 _ "net/http/pprof" // 会自动注册 handler 到 http server,方便通过 http 接口获取程序运行采样报告 // 略 ) func main() { // 略 runtime.GOMAXPROCS(1) // 限制 CPU 使用数,避免过载 runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪 runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪 go func() { // 启动一个 http server,注意 pprof 相关的 handler 已经自动注册过了 // /debug/pprof/ if err := http.ListenAndServe(":6060", nil); err != nil { log.Fatal(err) } os.Exit(0) }() // 略 } http://localhost:6060/debug/pprof/ 类型 描述 备注 allocs 内存分配情况的采样信息 可以用浏览器打开,但可读性不高 blocks 阻塞操作情况的采样信息 可以用浏览器打开,但可读性不高 cmdline 显示程序启动命令及参数 可以用浏览器打开,这里会显示 ./go-pprof-practice goroutine 当前所有协程的堆栈信息 可以用浏览器打开,但可读性不高 heap 堆上内存使用情况的采样信息 可以用浏览器打开,但可读性不高 mutex 锁争用情况的采样信息 可以用浏览器打开,但可读性不高 profile CPU 占用情况的采样信息 浏览器打开会下载文件 threadcreate 系统线程创建情况的采样信息 可以用浏览器打开,但可读性不高 trace 程序运行跟踪信息 浏览器打开会下载文件,本文不涉及,可另行参阅《深入浅出 Go trace》 排查 CPU 占用过高

Hero Image
Parse Command Line Arguments in Bash

Parse Command Line Arguments in Bash getopts getopts optstring opt [arg ...] #!/bin/bash while getopts 'abc:h' opt; do case "$opt" in a) echo "Processing option 'a'" ;; b) echo "Processing option 'b'" ;; c) arg="$OPTARG" echo "Processing option 'c' with '${OPTARG}' argument" ;; ?|h) echo "Usage: $(basename $0) [-a] [-b] [-c arg]" exit 1 ;; esac done shift "$(($OPTIND -1))" optstring represents the supported options. The option expects an argument if there is a colon (:) after it. For instance, if option c expects an argument, then it would be represented as c: in the optstring When an option has an associated argument, then getopts stores the argument as a string in the OPTARG shell variable. For instance, the argument passed to option c would be stored in the OPTARG variable. opt contains the parsed option. #!/bin/bash while getopts ':abc:h' opt; do case "$opt" in a) echo "Processing option 'a'" ;; b) echo "Processing option 'b'" ;; c) arg="$OPTARG" echo "Processing option 'c' with '${OPTARG}' argument" ;; h) echo "Usage: $(basename $0) [-a] [-b] [-c arg]" exit 0 ;; :) echo -e "option requires an argument.\nUsage: $(basename $0) [-a] [-b] [-c arg]" exit 1 ;; ?) echo -e "Invalid command option.\nUsage: $(basename $0) [-a] [-b] [-c arg]" exit 1 ;; esac done shift "$(($OPTIND -1))" Note that we’ve updated optstring as well. Now it starts with the colon(:) character, which suppresses the default error message. The getopts function disables error reporting when the OPTERR variable is set to zero. Parsing Long Command-Line Options With getopt #!/bin/bash VALID_ARGS=$(getopt -o abg:d: --long alpha,beta,gamma:,delta: -- "$@") if [[ $? -ne 0 ]]; then exit 1; fi eval set -- "$VALID_ARGS" while [ : ]; do case "$1" in -a | --alpha) echo "Processing 'alpha' option" shift ;; -b | --beta) echo "Processing 'beta' option" shift ;; -g | --gamma) echo "Processing 'gamma' option. Input argument is '$2'" shift 2 ;; -d | --delta) echo "Processing 'delta' option. Input argument is '$2'" shift 2 ;; --) shift; break ;; esac done -o option represents the short command-line options --long option represents the long command-line options

Hero Image
Tcpdump 使用总结

Tcpdump 使用总结 命令使用 tcpdump 采用命令行方式,它的命令格式为: tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] [ -i interface ] [ -m module ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret, ... ] [ -y datalinktype ] [ -Z user ] [ expression ] tcpdump 的简单选项介绍 -E spi@ipaddr algo:secret , ...,可通过spi@ipaddr algo:secret 来解密 IPsec ESP 包。secret 为用于 ESP 的密钥,使用 ASCII 字符串方式表达。 如果以 0x 开头,该密钥将以 16 进制方式读入。 除了以上的语法格式(指spi@ipaddr algo:secret), 还可以在后面添加一个语法输入文件名字供 tcpdump 使用(即把 spi@ipaddr algo:secret, … 中…换成一个语法文件名)。 在接收到第一个 ESP 包时会打开此文件, 所以最好此时把赋予 tcpdump 的一些特权取消(可理解为,这样防范之后,当该文件为恶意编写时,不至于造成过大损害)。 -T type 强制 tcpdump 按 type 指定的协议所描述的包结构来分析收到的数据包。 目前已知的 type 可取的协议为: aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议,在 Ad hoc(点对点模式)网络中使用), cnfp (Cisco NetFlow protocol) rpc(Remote Procedure Call) rtp (Real-Time Applications protocol) rtcp (Real-Time Applications con-trol protocol) snmp (Simple Network Management Protocol) tftp (Trivial File Transfer Protocol, 碎文件协议) vat (Visual Audio Tool, 可用于在 internet 上进行电视电话会议的应用层协议) wb (distributed White Board, 可用于网络会议的应用层协议) 实用命令实例 截获主机 210.27.48.1 和主机 210.27.48.2 或 210.27.48.3 的通信

Hero Image
iPhone 鈴聲製作教學,將 MP3 音樂換成電話鈴聲或鬧鐘鈴聲

iPhone 鈴聲製作教學,將 MP3 音樂換成電話鈴聲或鬧鐘鈴聲 影片版的 iPhone 鈴聲製作步驟 步驟一:準備想換成 iPhone 鈴聲的 MP3 音樂 首先第一步是準備好你想當成鈴聲的音樂,建議是 MP3 檔,然後儲存在「檔案 App」的資料夾內 步驟二:透過 Garageband App 製作 iPhone 鈴聲 接著,請開啟 iPhone 內建的「Garageband App」(如果你刪除了請先下載回來),點選「製作歌曲」,然後選擇「錄音機」。 點選音軌: 現在進入了錄音機的頁面,點選左上角第三個圖示進到音軌,然後再點選右上角倒數第二個圓圈圖示 將 MP3 音樂拖曳到音軌上: 這步驟很關鍵,將分頁切換到「檔案」,然後找到你剛剛下載好的 MP3 音樂,將它拖曳到左邊的音軌上。 編輯鈴聲: 接著,你可以拖拉音樂的前後來編輯你想要的鈴聲片段,也可以按播放鍵來試聽目前的鈴聲是否符合你的預期。 儲存歌曲: 確認沒問題之後,點選左上角的「三角形圖示」,然後按一下「我的歌曲」,你會看到該檔案已儲存成功,接著請長按它。 製作鈴聲: 長按該音訊檔案後,選擇「分享」,然後點選「鈴聲」。 輸出鈴聲: 而在這邊你可以編輯該鈴聲的名稱,編輯完後點選右上角的「輸出」,這樣就完成自訂 iPhone 鈴聲了! 步驟三:iPhone 電話鈴聲設定 開啟 iPhone 上的「設定」app,點選「聲音與觸覺回饋」>「鈴聲」,在鈴聲這區塊內你就會看到剛剛製作好的鈴聲囉。 步驟四:iPhone 鬧鐘鈴聲設定 開啟「時鐘 App」點選左上角的「編輯」,然後選擇任一個你想更換鈴聲的的 iPhone 鬧鐘。 點選「提示聲」後,將「鈴聲」改為你剛剛製作好的 MP3 音樂鈴聲就可以了。