https://github.com/golang/dep
https://golang.github.io/dep/
https://studygolang.com/articles/10589
https://golang.github.io/dep/docs/installation.html
root@jian-VirtualBox:~/git/zhonghangxun# dep help
Dep is a tool for managing dependencies for Go projects
Usage: "dep [command]"
Commands:
init Set up a new Go project, or migrate an existing one
status Report the status of the project's dependencies
ensure Ensure a dependency is safely vendored in the project
prune Pruning is now performed automatically by dep ensure.
version Show the dep version information
Examples:
dep init set up a new project
dep ensure install the project's dependencies
dep ensure -update update the locked versions of all dependencies
dep ensure -add github.com/pkg/errors add a dependency to the project
Use "dep help [command]" for more information about a command.
root@jian-VirtualBox:~/git/zhonghangxun# dep help ensure
Usage: dep ensure [-update | -add] [-no-vendor | -vendor-only] [-dry-run] [-v] [<spec>...]
Project spec:
<import path>[:alt source URL][@<constraint>]
Ensure gets a project into a complete, reproducible, and likely compilable state:
* All non-stdlib imports are fulfilled
* All rules in Gopkg.toml are respected
* Gopkg.lock records precise versions for all dependencies
* vendor/ is populated according to Gopkg.lock
Ensure has fast techniques to determine that some of these steps may be
unnecessary. If that determination is made, ensure may skip some steps. Flags
may be passed to bypass these checks; -vendor-only will allow an out-of-date
Gopkg.lock to populate vendor/, and -no-vendor will update Gopkg.lock (if
needed), but never touch vendor/.
The effect of passing project spec arguments varies slightly depending on the
combination of flags that are passed.
Examples:
dep ensure Populate vendor from existing Gopkg.toml and Gopkg.lock
dep ensure -add github.com/pkg/foo Introduce a named dependency at its newest version
dep ensure -add github.com/pkg/foo@^1.0.1 Introduce a named dependency with a particular constraint
For more detailed usage examples, see dep ensure -examples.
Flags:
-add add new dependencies, or populate Gopkg.toml with constraints for existing dependencies (default: false)
-dry-run only report the changes that would be made (default: false)
-examples print detailed usage examples (default: false)
-no-vendor update Gopkg.lock (if needed), but do not update vendor/ (default: false)
-update update the named dependencies (or all, if none are named) in Gopkg.lock to the latest allowed by Gopkg.toml (default: false)
-v enable verbose logging (default: false)
-vendor-only populate vendor/ from Gopkg.lock without updating it first (default: false)
root@jian-VirtualBox:~/git/zhonghangxun# dep ensure -examples
dep ensure
Solve the project's dependency graph, and place all dependencies in the
vendor folder. If a dependency is in the lock file, use the version
specified there. Otherwise, use the most recent version that can satisfy the
constraints in the manifest file.
dep ensure -vendor-only
Write vendor/ from an existing Gopkg.lock file, without first verifying that
the lock is in sync with imports and Gopkg.toml. (This may be useful for
e.g. strategically layering a Docker images)
dep ensure -add github.com/pkg/foo github.com/pkg/foo/bar
Introduce one or more dependencies, at their newest version, ensuring that
specific packages are present in Gopkg.lock and vendor/. Also, append a
corresponding constraint to Gopkg.toml.
Note: packages introduced in this way will disappear on the next "dep
ensure" if an import statement is not added first.
dep ensure -add github.com/pkg/foo/subpkg@1.0.0 bitbucket.org/pkg/bar/baz@master
Append version constraints to Gopkg.toml for one or more packages, if no
such rules already exist.
If the named packages are not already imported, also ensure they are present
in Gopkg.lock and vendor/. As in the preceding example, packages introduced
in this way will disappear on the next "dep ensure" if an import statement
is not added first.
dep ensure -add github.com/pkg/foo:git.internal.com/alt/foo
Specify an alternate location to treat as the upstream source for a dependency.
dep ensure -update github.com/pkg/foo github.com/pkg/bar
Update a list of dependencies to the latest versions allowed by Gopkg.toml,
ignoring any versions recorded in Gopkg.lock. Write the results to
Gopkg.lock and vendor/.
dep ensure -update
Update all dependencies to the latest versions allowed by Gopkg.toml,
ignoring any versions recorded in Gopkg.lock. Update the lock file with any
changes. (NOTE: Not recommended. Updating one/some dependencies at a time is
preferred.)
dep ensure -update -no-vendor
As above, but only modify Gopkg.lock; leave vendor/ unchanged.
dep ensure -no-vendor -dry-run
This fails with a non zero exit code if Gopkg.lock is not up to date with
the Gopkg.toml or the project imports. It can be useful to run this during
CI to check if Gopkg.lock is up to date.
其实第二个就只是用 HTTP 封装的一个接口,使用起来更方便。
package main
import (
"flag"
"os"
"runtime"
"runtime/pprof"
"github.com/MDGSF/utils/log"
)
var cpuprofile = flag.String("cpuprofile", "cpu.prof", "write cpu profile to `file`")
var memprofile = flag.String("memprofile", "mem.prof", "write memory profile to `file`")
func main() {
log.Println("demo start")
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()
}
// ... rest of the program ...
f1()
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
runtime.GC() // get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal("could not write memory profile: ", err)
}
f.Close()
}
}
func f1() {
for i := 0; i < 10000; i++ {
log.Println("f1 loop")
}
}
go build test.go
执行程序 ./test 会生成 cpu.prof 和 mem.prof 两个文件。
go tool pprof test cpu.prof 和 go tool pprof test mem.prof 会进入 pprof 的交互界面
help 帮助信息 web 打开浏览器 top
Package pprof serves via its HTTP server runtime profiling data in the format expected by the pprof visualization tool.
The package is typically only imported for the side effect of registering its HTTP handlers. The handled paths all begin with /debug/pprof/.
To use pprof, link this package into your program: import _ “net/http/pprof”
If your application is not already running an http server, you need to start one. Add “net/http” and “log” to your imports and the following code to your main function:
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
Then use the pprof tool to look at the heap profile:
go tool pprof http://localhost:6060/debug/pprof/heap
Or to look at a 30-second CPU profile:
go tool pprof http://localhost:6060/debug/pprof/profile
Or to look at the goroutine blocking profile, after calling runtime.SetBlockProfileRate in your program:
go tool pprof http://localhost:6060/debug/pprof/block
Or to collect a 5-second execution trace:
wget http://localhost:6060/debug/pprof/trace?seconds=5
Or to look at the holders of contended mutexes, after calling runtime.SetMutexProfileFraction in your program:
go tool pprof http://localhost:6060/debug/pprof/mutex
To view all available profiles, open http://localhost:6060/debug/pprof/ in your browser.
For a study of the facility in action, visit
https://blog.golang.org/2011/06/profiling-go-programs.html
翻译:
就是说想要使用 pprof,只要把
import _ "net/http/pprof"
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
这段代码加入到你的程序中去就可以了。然后你就可以运行你的程序了。在你的程序的运行过程中,执行下面这些命令:
go tool pprof http://localhost:6060/debug/pprof/heap
go tool pprof http://localhost:6060/debug/pprof/profile
go tool pprof http://localhost:6060/debug/pprof/block
wget http://localhost:6060/debug/pprof/trace?seconds=5
go tool pprof http://localhost:6060/debug/pprof/mutex
http://localhost:6060/debug/pprof/ 这个是在浏览器中打开的。
用 ssh 把服务器端口映射到本地电脑,然后在浏览器打开
http://localhost:6060/debug/pprof/
就可以看到当前的协程数据
https://github.com/uber/go-torch
# This will listen on :8081 and open a browser.
# Change :8081 to a port of your choice.
$ go tool pprof -http=":8081" [binary] [profile]
https://studygolang.com/articles/9940
http://www.ruanyifeng.com/blog/2017/09/flame-graph.html
(1)忽略信号。
(2)捕捉信号。
(3)执行系统默认动作。
SIGKILL 和 SIGSTOP
SIGKILL 和 SIGSTOP
调用 abort 函数时产生此信号。进程异常终止。
当用 alarm 函数设置的定时器超时时,产生此信号。
若由 setitimer(2) 函数设置的间隔时间已经超时时,也产生此信号。
当出现某些类型的内存故障时,实现常常产生此种信号。
在一个进程终止或停止时,SIGCHLD 信号被送给其父进程。按系统默认,将忽略此信号。如果父进程希望被告知其子进程的这种状态改变,则应捕捉此信号。信号捕捉函数中通常要调用一种 wait 函数以取得子进程 ID 和其终止状态。
指示一个实现定义的硬件故障。
此信号表示一个算术运算异常,如除以 0、浮点溢出等。
如果终端接口检测到一个连接断开,则将此信号送给与该终端相关的控制进程(会话首进程)。
此信号表示进程已执行一条非法硬件指令。
当用户按中断键(一般采用 Delete 和 Ctrl+C)时,终端驱动程序产生此信号并发送至前台进程组中的每一个进程。当一个进程在运行时失控,特别是它正在屏幕上产生大量不需要的输出时,常用此信号终止它。
此信号指示一个异步 I/O 事件。
这指示一个实现定义的硬件故障。
这是两个不能被捕捉或忽略信号中的一个。它向系统管理员提供了一种可以杀死任一进程的可靠方法。
如果在管道的读进程已终止时写管道,则产生此信号。
当用户在终端上按退出键(一般采用 Ctrl+\)时,中断驱动程序产生此信号,并发送给前台进程组中的所有进程。此信号不仅终止前台进程组(如 SIGINT 所做的那样),同时产生一个 core 文件。
指示进程进行了一次无效的内存引用(通常说明程序有错,比如访问了一个未经初始化的指针)。
这是一个作业控制信号,它停止一个进程。它类似于交互停止信号(SIGTSTP),但是 SIGSTOP 不能被捕捉或忽略。
该信号指示一个无效的系统调用。例如:若用户编写了一道使用新系统调用的程序,然后运行该程序的二进制可执行代码,而所用的操作系统却是不支持该系统调用的较早版本,于是就出现该情况。
这是由 kill(1) 命令发送的系统默认终止信号。由于该信号是由应用程序捕获的,使用 SIGTERM 也让程序有机会在退出之前做好清理工作,从而优雅地终止(相对于 SIGKILL 而言。SIGKILL 不能被捕捉或忽略)。
指示一个实现定义的硬件故障。
交互停止信号,当用户在终端上按挂起键(一般采用 Ctrl+Z)时,终端驱动程序产生此信号。该信号发送至前台进程组中的所有进程。
当一个后台进程组试图读其控制终端时,终端驱动程序产生此信号。
当一个后台进程组试图读其控制终端时,终端驱动程序产生此信号。
此信号通知进程已经发生一个紧急情况。在网络连接上接到带外的数据时,可选择地产生此信号。
这是一个用户定义的信号,可用于应用程序。
这是另一个用户定义的信号,与 SIGUSR1 相似,可用于应用程序。
当一个由 setitimer(2) 函数设置的虚拟间隔时间已经超时时,产生此信号。
如果进程用 ioctl 的设置窗口大小命令更改了窗口大小,则内核将 SIGWINCH 信号发送至前台进程组。
如果进程超过了其软文件长度限制,则产生此信号。
ctrl + C,发送 SIGINT 信号
关闭 ssh 终端,发送 SIGHUP 信号
./a.out &
& 会让 a.out 程序忽略 SIGINT 信号,所以执行 ctrl + C 的时候,程序不会退出。但是直接关闭 shell 的话,程序会收到 SIGHUP 信号,程序还是会退出的。
nohup ./a.out
nohup 会让 a.out 程序忽略 SIGHUP 信号,所以执行 ctrl + C 的时候,程序是会退出的。但是直接关闭 shell 的话,a.out 进程还是存在的。
nohup ./a.out &
所以同时使用 nohup 和 & 会让程序同时忽略掉信号 SIGINT 和 SIGHUP。
#include <stdio.h>
#include <unistd.h>
int main()
{
int x = 0;
while (1)
{
printf("hello x = %d, pid = %u, ppid = %u\n", x++, getpid(), getppid());
sleep(1);
}
return 0;
}
Note:另外,在使用一些开源的软件的时候,只加了 &,没有使用 nohup,发现关闭了终端之后,程序一样不会被关闭,应该就是在代码里面忽略了 SIGHUP 信号了。
问题:
有2个骰子,每一个骰子都是6面的正方体,每一面上只能放0到9的数字一个,问这2个骰子如何组合,可以达到显示日历的效果(从01-31)?
答案见底部
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|/
分析:
这道题的逻辑是这样的。首先,大多数人都会想到,我们有两个立方体,那就一共12个面。现在有0-9,一共10个数,放到这12个面上,所以,一定有数字是重复出现在两个立方体上的。
那么,哪些数是会重复出现的呢?
想到我们的目的是用这两个立方体表示日历,也就是01-31这一串数字。那么,有哪些数字是在个位和十位上都必须有的呢?
我们有11号和22号,所以1和2这两个数字在两个立方体上必须都出现,那这样一算,正好就是12个数字和12个面,可以一一对应了。
但是如果你细想想,就会发现不对啊,当日期是一位数的时候,0还需要在十位的位置上补位呢,所以0也必须同时出现在两个立方体上。
如果0也必须出现2次,那就有13个数字,要出现在12个面上了。这样就少了一个面。怎么办?
其实如果你能想到这里,就已经能拿到一半的分了。
那少的这一面该怎么办?怎么在12个面上放13个数字?有没有数字能重复用?
有,那就是6和9。到这为止,这个问题就解决了。
那这个问题考核的是什么呢?
这里的考点叫”跨越思维”,也就是跳出固定框架去思考的能力。如果你觉得6就是6,9就是9,那就是没有跳出固定的思维框架。
这种跨越思维的能力,在现实生活中,极其重要。
比如,谁说冰箱的冰格,一定要在冰箱里面呢?如果把冰格放满厨房呢?这就是”分布式冰箱”。跨越思维,是创新的源泉。我们对创新能力要求高的人,非常重视对这种能力的考核。
同样,如果我感觉到你对这道题很熟悉,后面还有几十道其他类似的题等着。再次记住,思维方式,比答案重要。
来源: 刘润老师的微信公众号
问题:
昨天,我早上8点爬山,晚上8点到山顶。睡了一觉后,今天,我早上8点从山顶原路下山,晚上8点到山脚。请问,有没有一个时刻,昨天和今天,我站在同样位置?
答案见底部
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|/
分析:
你可以把这道题转换成这样的一道题:你和另一个人,一个从山顶往下走,一个从山脚往上走,走的是同一条路,是不是一定会相遇?
这个”转换思维”有什么用处呢?
就是用”其实就是”这四个字,看透问题,然后找到解决方案。
顾客吃完饭结账,200元。服务员说,”对了,我们今天有个充值免单活动。您只要充值1000元,这顿饭就可以免单,很划算呢”。全额免单?这是莫大的优惠啊!你可能充了1000元。
但是,如果有”转换思维”,你就会想到,这”其实就是”花1000元买1200元的东西。相当于打了83折。
来源: 刘润老师的微信公众号