安装

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

常用命令

1
2
3
4
5
6
7
8
9
10
11
brew search <package_name>      # 搜索
brew install <package_name> # 安装一个软件
brew update # 从服务器上拉取,并更新本地 brew 的包目录
brew upgrade <package_name> # 更新软件
brew outdated # 查看你的软件中哪些有新版本可用
brew cleanup # 清理老版本。使用 `-n` 参数,不会真正执行,只是打印出真正运行时会做什么。
brew list --versions # 查看你安装过的包列表(包括版本号)
brew link <package_name> # 将软件的当前最新版本软链到`/usr/local`目录下
brew unlink <package_name> # 将软件在`/usr/local`目录下的软链接删除。
brew info # 显示软件的信息
brew deps # 显示包依赖

简介

Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程。它可以同时启动,关闭多个进程,使用起来特别的方便。

组成部分

supervisor 主要由两部分组成:

  • supervisord(server 部分):主要负责管理子进程,响应客户端命令以及日志的输出等;
  • supervisorctl(client 部分):命令行客户端,用户可以通过它与不同的 supervisord 进程联系,获取子进程的状态等。

阅读更多

1
UDF - 2016-11-29 00:00:35 --> tdParams_to==>{"appid":"2005001xxx","eventtime":"1480348772878","spreadurl":"dMxpxx","appkey":"XXbbf2fbaeb64d7b9623ec4ee3cde575","devicetype":"iPhone7,2","adnetname":"UC","osversion":"10.1.1","idfa":"DE055F0E-72D7-4A72-B7A0-C3E45A3A33XX","clicktime":"1480348581122","ip":"117.38.163.147"}
UDF - 2016-11-29 00:00:41 --> tdParams_to==>{"appid":"2005001xxx","eventtime":"1480348766255","appkey":"XXbbf2fbaeb64d7b9623ec4ee3cde575","devicetype":"iPhone7,2","osversion":"10.0.2","idfa":"93271665-1341-499C-BDD6-6797699B9AXX","ip":"58.59.64.234"}

有以上格式的数据,需要将其中的eventtime时间戳筛选出来并格式化

阅读更多

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main

import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)

func check(e error) {
if e != nil {
panic(e)
}
}

func main() {
dat, err := ioutil.ReadFile("/tmp/dat")
check(err)
fmt.Print(string(dat))

f, err := os.Open("/tmp/dat")
check(err)

b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1))

o2, err := f.Seek(6, 0)
check(err)
b2 := make([]byte, 2)
n2, err := f.Read(b2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))

o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))

_, err = f.Seek(0, 0)
check(err)

r4 := bufio.NewReader(f)
b4, err := r4.Peek(5)
check(err)
fmt.Printf("5 bytes: %s\n", string(b4))

f.Close()
}

阅读更多

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
29
30
31
32
33
34
35
package main

import (
"fmt"
"net"
"net/url"
)

func main() {
s := "postgres://user:pass@host.com:5432/path?k=v#f"
u, err := url.Parse(s)
if err != nil {
panic(err)
}

fmt.Println(u.Scheme)

fmt.Println(u.User)
fmt.Println(u.User.Username())
p, _ := u.User.Password()
fmt.Println(p)

fmt.Println(u.Host)
host, port, _ := net.SplitHostPort(u.Host)
fmt.Println(host)
fmt.Println(port)

fmt.Println(u.Path)
fmt.Println(u.Fragment)

fmt.Println(u.RawQuery)
m, _ := url.ParseQuery(u.RawQuery)
fmt.Println(m)
fmt.Println(m["k"][0])
}

阅读更多

简介

Test

1
Package testing provides support for automated testing of Go packages. It is intended to be used in concert with the “go test” command, which automates execution of any function of the form.

testing 包提供了对Go包的自动测试支持。 这是和go test 命令相呼应的功能, go test 命令会自动执行所以符合格式

func TestXXX(t *testing.T) 

Benchmark

1
2
3
4
5
Functions of the form

func BenchmarkXxx(b *testing.B)

are considered benchmarks, and are executed by the “go test” command when >its -bench flag is provided. Benchmarks are run sequentially.

阅读更多

url 为 http://mywebsite.com/index.php?a=1&b=2&c=3

web 形式下访问 url 地址,使用 \$_GET 是可以获取到所有的参数

curl -s http://mywebsite.com/index.php?a=1&b=2&c=3

然而在linux下,上面的例子 $_GET只能获取到参数 a

由于url中有 & 其他参数获取不到,在linux系统中 & 会使进程系统后台运行,必须对 & 进行下转义才能 $_GET 获取到所有参数

阅读更多

在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串:

{"Id":1,"Name":"golang","Message":"message"}

当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来,这时候服务端才进行接收的话就会收到两个连续的字符串,形如:

{"Id":1,"Name":"golang","Message":"message"}{"Id":1,"Name":"golang","Message":"message"}

如果接收缓冲区满了的话,那么也有可能接收到半截的json字符串,酱紫的话还怎么用json解码呢?真是头疼。以下用golang模拟了下这个粘包的产生。

阅读更多

记录网络服务名和它们对应使用的端口号及协议

cat /etc/services

查看某个端口号的使用状态

1
2
lsof -i :6000 (查看哪个进程正在监听6000这个端口)
lsof -i TCP:6000 (只显示监听此端口的TCP连接,上面不加选项的就是指TCP&UDP)

lsof 命令还可以用来显示谁在使用某个文件或文件夹,例如:

lsof  /root/michael/unp(会显示谁当前在用/root/michael/unp文件夹)

阅读更多