莫一哲

VUE版本正在开发中,这个golang template版本即将退役 2018-11-07 22:29 by fifsky

玥玥开始攒肚了,每日每夜的睡,这爹妈不好当啊,不睡吧崩溃,睡不醒吧又担心是不是有问题~~ 2018-10-26 09:00 by fifsky

小玥儿满月了,能吃能睡,一切安好 2018-10-21 20:19 by fifsky

驱车来回500公里给小家伙上户口,我们家第一个城市身份证号码诞生了 2018-09-30 18:46 by fifsky

折磨我的老腰啊,可是这个小家伙依然没有出来的意思 2018-09-13 19:40 by fifsky

是时候学习VUE了,为了防止被前端淘汰 2018-08-24 01:04 by fifsky

Ant Design 无法保证业务产品能否成功,但是能帮助业务产品『正确的成功』或者『正确的失败』 2018-08-22 14:19 by fifsky

我慢慢地品,雪落下的声音,仿佛是你贴着我叫卿卿 2018-08-19 10:41 by fifsky

想写一点骚柔的文字,可以盯着屏幕久久的不知道该写点什么 2018-07-28 23:58 by fifsky

现在很少听李志的歌了,有人说,是现在的生活没那么苦了,可是,也许我们早已经习惯生活的苦了,致敬,逼哥的歌 2018-03-08 13:49 by fifsky

Golang x509.ParsePKCS1PrivateKey解析错误

今天遇到一个非常奇怪的问题,使用openssl生成的RSA256证书始终不能使用Golang进行签名,提示错误:

 asn1: structure error: tags don't match (2 vs {class:0 tag:16 length:13 isCompound:true})

 {optional:false explicit:false application:false private:false defaultValue: tag: stringType:0 timeType:0 set:false omitEmpty:false}  @5

查阅了一圈文档,尝试了各种方法都没有解决,最后在google groups里面找到11年的一篇帖子https://groups.google.com/forum/#!topic/golang-nuts/hHFbXwyePDA

AGL说会在未来改变,以兼容openssl 1.0一上新的RSA结构,目前已经是golang 1.11.2版本,看来这个问题依旧没有解决,golang github issuse说是和曲线有关,要在openssl生成证书添加特定参数,但是我们的证书已经在线上使用,不想更换证书,于是使用AGL提示的方式,对证书进行了转换,就解决了问题

openssl rsa -in key.pem -out rsakey.pem 


Vue对$route.query引用导致的BUG

最近一直在研究Vue,正在使用Vue重写本博客,今天遇到一个非常奇怪的问题,我在分页触发的methods函数里面希望router跳转到当前页并且保留当前的query参数,但是路由watch始终没有监听到任何的路由变化,代码如下

methods: {
    changePage(pageNum){
        this.page = pageNum
        let q = this.$route.query
        q.page = pageNum
        // console.log(this.$route.query,q)
        this.$router.push({name:this.$router.name,query:q})
    }
},
watch: {
    '$route'(to, from) {
        this.loadList(to.params)
    }
}

代码很简单,分页触发changePage事件函数之后路由跳转到当前路由,变更page参数,保留其他query参数,打印日志发现当修改q.page的值,this.$route.query.page的值也会改变,瞬间恍然大悟,Vue watch路由变化肯定是将push的路由和this.$route作比较,而在JS里面对象是引用类型,q的改变会直接改变this.$route,从而导致Vue比较路由变化是发现没有变化,因此也就不触发watch,知道问题就非常容易解决,做一个深拷贝即可,我直接引入了lodash,使用了clone函数如下

changePage(pageNum){
    this.page = pageNum
    let q = this.$lodash.clone(this.$route.query)
    q.page = pageNum
    // console.log(this.$route.query,q)
    this.$router.push({name:this.$router.name,query:q})
}


ngrok证书错误

最近项目里面需要用到ngrok代理本地vnc实现远程协助功能,于是要在服务器搭建一个ngrok server并且编译一个windows i386的ngrok client,但是编译后的程序连接server的时候始终提示证书错误

 [WARN] [tun:15dd7522] Failed to read message: remote error: bad certificate

但是我仔细核对了证书域名,并且重新编译了多次依旧有问题,参见文章

http://tonybai.com/2015/03/14/selfhost-ngrok-service/

http://www.haiyun.me/archives/1012.html


最后实在没办法,发现ngrok客户端有日志参数-log=log.txt,发现一个证书过期的错误,后来发现是自己XP的虚拟机的时间和当前时间不同步了,调整为当前时间之后即可,记录在这里希望对遇到同样问题的人有所帮助,另附加一个windows下ngrok后台执行的命令


 start /b ./ngrok -config=ngrok.cfg -log=stdout -log-level=WARNING start vnc > ngrok.log 2>&1


go对URL参数的处理类似PHP(http_build_query)

开始用GO写一些小代码,还是无法摆脱PHP的固定思维,在请求接口的时候php很容易就想到了http_build_query,到了GO里面就不知道改怎么处理了,特别是GO的强类型,处理起来异常痛苦,今天看到文章发现我自己实现的方式太山寨了,贴一下标准做法和山寨做法,如果你有什么更好的方式,欢迎交流

 func HttpBuildQuery(params map[string]string) (param_str string) {

	params_arr := make([]string, 0, len(params))

	for k, v := range params {
		params_arr = append(params_arr, fmt.Sprintf("%s=%s", k, v))
	}

	//fmt.Println(params_arr)

	param_str = strings.Join(params_arr, "&")
	return param_str
}


func main(){
	params := map[string]string{
		"action":        "getAccessToken",
		"client_code":   "aaaaa",
		"client_secret":  "ccccc",
		"interface":     "wxapi",
		"time":          strconv.FormatInt(time.Now().Unix(), 10),
	}
       
	param_str := HttpBuildQuery(params)

}

标准做法如下

q := url.Values{}

q.Set("action", "getAccessToken")
q.Set("client_code", clientCode)
q.Set("client_secret", clientSecret)
q.Set("interface", "wxapi")
q.Set("refresh", refresh)
q.Set("time", strconv.FormatInt(time.Now().Unix(), 10))
fmt.Printf(q.Encode())
 


Vagrant中nginx服务器JS/CSS文件输出乱码

刚开是在mac下用Vagrant的centos开发时遇到过一个问题,JS和CSS文件里面会出现奇特的乱码字符,从而导致JS错误,当时查了很多资料,走了很多弯路,最后在GitHub找到一个正确答案,今天突然想起来,顺便记录一下

在nginx配置文件中加上


sendfile off;
重启nginx就正常了


Can't create test file /home/mysql/dev01.lower-test

由于迁移mysql数据库目录到磁盘的/home分区,完成之后重启mysql提示这个错误(141107 16:43:38 [Warning] Can't create test file /home/mysql/dev01.lower-test),权限都是mysql肯定不会有错,在网上找到一篇文章,解决了这个问题

编辑 /etc/apparmor.d/usr.sbin.mysqld 文件,可以看到

/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
添加新的/home/mysql目录如下
/home/mysql/ r,
/home/mysql/** rwk,
保存,重启apparmor,/etc/inid.d/apparmor restart

然后就可以启动mysql了

mysql大数据量order by导致速度变慢

最近处理一个3700W的数据,其中一个字段使用的全文检索,索引比较大达到5G,测试的时候还挺快的,放到服务器之后变慢了,一开始以为是索引出问题(因为服务器的索引文件MDI是直接从本地拷贝到服务器的),后来发现本地也变慢了,对sql分析之后发现问题,一开始我测试的时候SQL是不加order by的如


SELECT * FROM yuliao WHERE MATCH(split_content) 
AGAINST ('我们' IN BOOLEAN MODE) limit 100


速度很快基本是毫秒级别,后来画蛇添足加了order by之后


SELECT * FROM yuliao WHERE MATCH(split_content) 
AGAINST ('我们' IN BOOLEAN MODE) order by id asc limit 100


这下居然需要21秒了,explain一下发现Using where; Using filesort,走的是fulltext的全文检索,并对内容重新排序,错就错在为毛要对结果集重新排序呢?,为毛不走id主键索引?这个需求为毛尚且可以去除order by id asc,因为默认就是走主键索引的,但是如果需求是需要order by id desc呢,测试表明同样很慢,目前只想到强制走id索引的方法解决,如下


SELECT * FROM yuliao force index(primary) WHERE MATCH(split_content) 
AGAINST ('我们' IN BOOLEAN MODE) order by id desc limit 100


如果你有更好的方案,欢迎留言讨论


  • 1
返回顶部