Pinned Post

Recent Posts

解决阿里云恢复 mysqldump 文件时没有权限的错误

在阿里云 mysql -uxx -hxxx -p dbname < file.sql 恢复文件时由于 RDS 没有 Supper 权限所以报错:

Access denied; you need (at least one of) the SUPER privilege(s) for this operation

解决方法: 去除 GTID_PURGEDDEFINER 子句:

sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/ ' your.sql > your_revised.sql
awk '{ if (index($0,"GTID_PURGED")) { getline; while (length($0) > 0) { getline; } } else { print $0 } }' your.sql | grep -iv 'set @@' > your_revised.sql

详见: https://help.aliyun.com/knowledge_detail/41701.html

go modules 中通过 go.mod 文件 设置替换 golang.org 到 github

replace (
    golang.org/x/net v0.0.0-20180821023952-922f4815f713 -> github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
    golang.org/x/text v0.3.0 => github.com/golang/text 0.3.0
)

elastic 自定义搜索高亮关键字:


array(3) {
  ["index"]=>
  string(11) "enterprises"
  ["type"]=>
  string(11) "enterprises"
  ["body"]=>
  array(4) {
    ["query"]=>
    array(1) {
      ["match"]=>
      array(1) {
        ["name"]=>
        string(6) "中铁"
      }
    }
    ["size"]=>
    int(10)
    ["from"]=>
    int(0)
    ["highlight"]=>
    array(1) {
      ["fields"]=>
      array(1) {
        ["name"]=>
        array(2) {
          ["pre_tags"]=>
          array(1) {
            [0]=>
            string(26) "<em class="searchKeyword">"
          }
          ["post_tags"]=>
          array(1) {
            [0]=>
            string(5) "</em>"
          }
        }
      }
    }
  }
}

在需要高亮的字段(本例中的 name )定义高亮关键字前后的标识:pre_tags、post_tags, 如果 name 字段直接是个空对象 stdClass 则使用 Elastic 默认的: <em>..</em> 来标识关键字。

Links

适合程序员使用的字体:

'Fira Code','Operator Mono', 'mononoki','Source Code Pro', Menlo, Monaco, 'Courier New', monospace  

Fira Code:为程序员设计的一款等宽字体,特别对一些编码中会用到的符号(如:<= 等)进行了重新设计(在 VS Code 中把 Font Ligatures 连字选项打开才有效果) https://github.com/tonsky/FiraCode
Operator Mono:字体很美,但斜体是手写体,看上去辩识度略低。

About

关于我


王小帅:

  • 粗糙的软件开发者;
  • 半调子摄影师;

关于博客

最早使用 WordPress,功能很强大,也比较繁琐,后来改为相对简洁的 Typecho,再后来,试了段时间 hugo 之类的静态博客生成工具。

用下来都不是很满意。

我期望中的博客应当有以下功能:

  • 不用写标题: 对我来说这是最大的需求,因为很多时候我不想一本正经的去“写文章”,我只是随意记录而已:可能是记录一些笔记、当时的一些想法而已;

  • 易于部署: 我希望它可以很方便的部署,基于这一点大部分解释型语言编写的博客基本不符合这条需求;

  • 发布内容方便: 静态博客生成工具确实不错,但每次发布内容太麻烦,不适合作随手记录,排除。

所以,最后我基于 Go+SQLite 自己写了这个简单的博客系统,主要使用了以下库:

  • 使用 Gin 进行路由解析和请求参数处理;
  • 使用gomarkdown 进行 markdown 渲染;
  • 使用 Viper 进行配置文件解析;
  • 使用 zap 进行日志处理,使用 lumberjack v2 进行日志切割;
  • 使用 GORM 进行数据库操作;
  • 使用 modernc.org/sqlite 作为 SQLite 驱动(因为这个驱动库不需要 CGo,当前在 M1 芯片上交叉编译包含 CGo 的项目会失败);
  • 使用我糟糕的前端技能弄了个简单的界面。

go gui 库:

MYSQL 使用 FOUND_ROWS 获取 SQL_CALC_FOUND_ROWS语句中符合条件的记录总数:

SELECT SQL_CALC_FOUND_ROWS `id`,`title`... FROM ... WHERE ...  ORDER BY... LIMIT m,n;

select FOUND_ROWS();

注意:在数据量较大的情况下 SELECT SQL_CALC_FOUND_ROWS 的开销会比较大。

git 将当前仓库的 branch_a 分支导出(归档)到 branch_a.zip

git archive --format zip --output "./branch_a.zip" branch_a

现在公司老板的口头禅就是 『把数据库遍历出了不就行了么?』?

go 判断进程是否存在

		if err = syscall.Kill(pid, 0); err == nil {
			isRunning = true
		} else {
			isRunning = false
		}

		// p, e := os.FindProcess(pid)
		// if e == nil {
		// 	fmt.Println("WTF???", p)
		// 	isRunning = true
		// } else {
		// 	isRunning = false
		// }

encoding/gob 包可以实现二进制数据流的编码解码转换

貌似禁用掉 KeepAlive 后就会立即关闭了(有待继续观察),难道是为了连接复用?

	var client http.Client
	proxy := func(_ *http.Request) (*url.URL, error) {
		return url.Parse("http://xx.xx.xx.xx:xxxx")
	}
	transport := &http.Transport{
		Proxy:             proxy,
		DisableKeepAlives: true,
	}
	client = http.Client{Transport: transport}

好像 Go 的 http.Client 连接完后并没有马上释放掉连接?(即使 response.Body.Close() 后好像也并没有)

go 获取运行时内存使用情况:

var mem runtime.MemStats
runtime.ReadMemStats(&mem)

runtime.MemStats 结构:

Alloc:69257680 //golang语言框架堆空间分配的字节数 大概68M
TotalAlloc:79489528 //从服务开始运行至今分配器为分配的堆空间总 和,只有增加,释放的时候不减少。大约79M
Sys:1345724664 //服务现在系统使用的内存, 大约1345M
Lookups:3 //被runtime监视的指针数
Mallocs:307494 //服务malloc的次数
Frees:9105  //服务回收的heap objects的字节数 free次数
HeapAlloc:69257680 //golang语言框架堆空间分配的字节数 大概68M
HeapSys:71434240  //系统分配的堆内存 大概71M
HeapIdle:974848 //申请但是未分配的堆内存或者回收了的堆内存(空闲)字节数 大概1M
HeapInuse:70459392 //正在使用的堆内存字节数 大概70M
HeapReleased:0 //返回给OS的堆内存,
HeapObjects:298389  //堆内存块申请的量
StackInuse:1220804608 //正在使用的栈字节数 约1220M
StackSys:1220804608 //系统分配的作为运行栈的内存 约1220M
MSpanInuse:6924360  //用于测试用的结构体使用的字节数 不受GC控制, 约7M
MSpanSys:6979584 //系统为测试用的结构体分配的字节数 约7M
MCacheInuse:6816 //mcache结构体申请的字节数(不会被视为垃圾回收) 约6K
MCacheSys:16384 //操作系统申请的堆空间用于mcache的字节数,约16K
BuckHashSys:1468496 //用于剖析桶散列表的堆空间 约14K
GCSys:40984576 //垃圾回收标记元信息使用的内存 约40M
OtherSys:4036776 //golang系统架构占用的额外空间 约4M
NextGC:135394784  //垃圾回收器检视的内存大小 约135M
LastGC:1506577064496115700 //最后一次GC的时间戳
PauseTotalNs:1834800 //系统暂停的时间,大约1.8毫秒

go 读取用户输入, fmt.Scanln(&startAt) 读取用户输入时,若有空格则只会读取空格后面部份,可使用 bufio.Reader 来读取:


var inputReader *bufio.Reader
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("请输入开始时间")
startAt, err = inputReader.ReadString('\n')

go 获取程序运行时路径, 兼容 linux/mac/windows


tmp, _ := exec.LookPath(os.Args[0])
tmp, _ = filepath.Abs(tmp)
pathArr := strings.Split(tmp, dirSplitStr)
pathArr = pathArr[0 : len(pathArr)-1]
AppRootPath = strings.Join(pathArr, "/")
if strings.HasPrefix(AppRootPath, "/var/folders") { // 通过 go run 运行时的临时路径
    AppRootPath = "/Users/jetking/work/golang/src/spider"
}

阿里云谷歌云计算平台(GCP) 给我最明显的感受就是:
阿里云更像是给普通用户使用的商业产品,这些用户可能是老板、可能是网管、也可能是开发者;GCP 更像是给专业技术人员使用的产品,一股浓郁的 Geek 味。
当然,个人认为这两个都不及 AWS

go 跨平台交叉编译

跨平台交叉编译

# 编译到 linux 64bit
$ GOOS=linux GOARCH=amd64 go build
# 或者可以使用 -o 选项指定生成二进制文件名字
$ GOOS=linux GOARCH=amd64 go build -o app.linux

# 编译到 linux 32bit
$ GOOS=linux GOARCH=386 go build

# 编译到 windows 64bit
$ GOOS=windows GOARCH=amd64 go build

# 编译到 windows 32bit
$ GOOS=windows GOARCH=386 go build

# 编译到 Mac OS X 64bit
$ GOOS=darwin GOARCH=amd64 go build

编译选项

-ldflags '-w -s'

-w 禁止生成debug信息,注意使用该选项后,无法使用 gdb 进行调试
-s 禁用符号表