官方地址: http://emberjs.com/
简介: A FRAMEWORK FOR CREATING AMBITIOUS WEB APPLICATIONS.
你见过这样的script吗?
感想:
有想法并且去实现了,就是好的
DevOps
官方地址: http://emberjs.com/
简介: A FRAMEWORK FOR CREATING AMBITIOUS WEB APPLICATIONS.
你见过这样的script吗?
感想:
有想法并且去实现了,就是好的
参考: https://code.google.com/p/go-wiki/wiki/GoGetTools
The go get fetching of source code is done by using one of the following tools expected to be found on your system:
Refer GoGetProxyConfig for setting proxies for these tools.
如: 安装 code.google.com/p/goprotobuf/proto :
go get code.google.com/p/goprotobuf/proto
但是,这里需要hg这个命令,可以使用yum安装:
yum install *mercurial*
而对于github上的go包,需要先安装git,然后使用go get, 例如:
go get github.com/golang/groupcache
代码会自动安装在GOPATH 下的src目录中
补充说明:(其实这个写在前面更好)
go get是可以自动管理依赖的,比如,上面的groupcache以来proto,如果先安装hg这个命令的话,直接安装groupcache时,是可以自动安装proto的; 不过如果不太幸运的话,有些包会安装失败的,下图就是一个例子:
工具下载地址: http://sqlmap.org/
工具使用:
./sqlmap.py -u ‘your url’
示例:
./sqlmap.py -u ‘http://test.phpor.net/sql_inject.php?id=1’
结果显示:
http://blog.jobbole.com/73125/
参考文档: http://blog.studygolang.com/tag/directory/
GO语言最佳实践: http://blog.jobbole.com/44608/
视频资料: http://vimeo.com/69237265
go 的channel和os的pipe是不是很像?你们go的channel是通过pipe来实现的吗? 答曰: 不是
pipe是用啥实现的channel就是用啥来实现的?
有一个日志文件,很大很大;当想看最新的写入的时候,首先想到的是tailf,大概是因为 tailf 比 tail -f 少2个字符吧。但是,许久没有输出,感觉不应该的,不管文件有多大,从文件尾部开始查还是比较快的;换用tail -f 试试,很快就出结果了。
1. tailf 总是从文件开头一点一点的读, 而tail -f 则是从文件尾部开始读
2. tailf check文件增长时,使用的是文件名, 用stat系统调用;而tail -f 则使用的是已打开的文件描述符; 注:tail 也可以做到类似跟踪文件名的效果; 但是tail总是使用fstat系统调用,而不是stat系统调用;结果就是:默认情况下,当tail的文件被偷偷删除时,tail是不知道的,而tailf是知道的。
fstat与 stat() 函数相似,不同的是,它是作用于已打开的文件指针而不是文件名
如果filename被打开了,不是每次都重新打开文件,而是用fstat检查文件是否变化,隔几次才使用open方法检查文件是否还在,如果成功打开了,则fstat检查一下是否依然是原来的那个文件,如果是,则直接关闭本次的文件描述符,依然使用原来的监视;如果不是,则开始监视新的文件,strace跟踪如下:
strace -F a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
open("a", O_RDONLY|O_NONBLOCK) = 3 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 lseek(3, 0, SEEK_SET) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 read(3, "a\n", 8192) = 2 write(1, "a\n", 2a ) = 2 read(3, "", 8192) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 open("a", O_RDONLY|O_NONBLOCK) = 4 fstat(4, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 close(4) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({1, 0}, NULL) = 0 |
默认情况下, tail -f filename 当filename不存在时,则直接退出; 但是,如果使用–retry选项,则会不断尝试打开该文件,而不是直接退出,这在有时候是有用的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
open("a", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2af8e0b98000 read(3, "a\n", 4096) = 2 read(3, "", 4096) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2af8e0b99000 write(1, "a\n", 2a ) = 2 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 stat("a", {st_mode=S_IFREG|0664, st_size=2, ...}) = 0 nanosleep({0, 250000000}, NULL) = 0 |
参考资料:
http://codingstandards.iteye.com/blog/832760