莫一哲

看完《找到你》,心情非常沉重,这部电影把人生的苦刻画到了极致,做父母的最难接受的就是孩子的不幸,我们宁愿自己承担,也不愿孩子受苦,但愿天下所有的宝贝们都能平平安安长大。 2018-12-08 20:06 by fifsky

豆豆换牙了,时间过得真快啊,不知不觉已经成小大人了 2018-12-02 09:06 by fifsky

小宝贝互动越来越多了,一如既往的能吃能睡,太胖了,要控制了 2018-11-26 13:28 by fifsky

真的没想到有些企业家居然可以在公众场合这么的口无遮拦,简直是三观尽毁 2018-11-19 12:59 by fifsky

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

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})
}


致我们终将逝去的青春

        今天无意中翻出了大学时期投过稿的电子杂志,一度以为丢失了,听着杂志的背景音乐,思绪一下子回到大学时代,那个时候除了写着充满BUG的代码,时不时还喜欢挤点酸涩的文字,于是和几个志同道合的朋友(阿尤、徐景见、麦斯威尔、还有很多连名字都记不清了)一起组建了文学社,并认识了网络作家网的创本者老韩还有千里烟。

        那个年代互联网还不像现在如此的碎片化,论坛还是主流的沟通交流方式之一,寂寞地铁 、 追忆。白 、 汐草街 、 还有我最喜欢的  花火流年 。如今多半的链接都已经无法访问了,寂寞地铁也早已变寂寞了。

        时间是最温柔的,它可以抚平一切的伤痛,时间也是最残酷的,它会不知不觉的掩埋纯真。但当你不经意间松动了内心的尘埃,你会突然发现这些年,似乎我们一直在丢失着什么,却又说不清到底是什么,只是感觉现在的快乐不在那么纯粹,现在的伤痛也总是刻意的隐忍。

        高晓松说民国时期是最美好的年代,那个时代人才辈出,大师云集。回头看看如今我们生活的时代,科技改善了生活,同时一样也将我们的生活分割得支离破碎,似乎我们早就已经成为各种App和各种算法的奴隶,每天看着主动推送到面前的信息大餐,毫无营养的吞食下去,然后很快的被遗忘。

        夜深了,可曾还有人给你道一句晚安



快速将当前目录加入到GOPATH

编辑 `vim ~/.zshrc` 将下面代码添加到底部,即可在命令行快速切换当前目录为GOPATH目录`gop`查看当前GOPATH,`gop a`设置当前目录为GOPATH

function gop(){
case $1 in
 a )
     currpath=`pwd`
        if [[ -d "$currpath/src" ]];then
            export GOPATH=${GOPATH%%:*}:`pwd`
            echo current ${GOPATH}
        else
            echo "dir not fund src"
        fi
 ;;
 * )
     echo current ${GOPATH}
esac
}


十年,Go!

从十年前的Asp版到现在的Go版本,这个博客见证了这十年的的技术变迁,也见证了我技术的成长,Go版本算是学习Go的一个拙作,源码在github上,有兴趣的可以fork下,希望对你有帮助

https://github.com/fifsky/goblog

技术文章迁移

由于工作原因,今年开始采用nodejs编写了大量代码,因此开始喜欢上这门语言,加上对markdown的偏爱,决定开始采用markdown来记录技术笔记,一方面代码高亮比较容易处理,另一方面静态博客逐渐成为主流,所以采用hexo和github pages搭建了技术笔记的博客,这边的技术内容全部删除了,转移到blog.fifsky.com(导航技术栏),目前文章不多,因为之前很多笔记都是记录到Evernote里面了,后面有时间陆陆续续整理分享出来,很多都是自己平时工作遇到的问题,解决方案大多也是google查询到的,分享出来也希望能对新人有所助益。

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


nodejs中对已加载的模块进行重载

最近开发nwjs的时候,有一个需求需要重新加载nodejs已经加载过的module,在nodejs的机制里面一个module只会加载一次,比如


var api = require("./lib/api");

然后在其他任意地方require这个api模块都不会再重新载入,而是直接从require.cache里面获得,可以console.log(require.cache)查看,既然知道原理,重载就比较容易些了


 //重新加载已经被加载过的nodejs模块
var reload = function (name) {
    var id        = global.require.resolve(name),
        old_cache = global.require.cache[id];
    delete global.require.cache[id];
    try {
        return global.require(id);
    } catch (e) {
        return old_cache;
    }
};
api = reload("./lib/api");


代码比较简单,基本就是delete删除cache,然后重新require


nwjs下编译sqlite3

由于网上查找的资料基本不对,特别是最后还需要手动修改build的文件夹名称,这个也是想当然的解决方法,如果使用原生node命令调试会始终报Error: Module version mismatch. 


OK,具体步骤如下

1、npm install nw-gyp -g

2、git clone https://github.com/mapbox/node-sqlite3.git 到node_module/sqlite3目录下,你也可以不clone直接npm install sqlite3,但是我测试失败,所以只好先下载

3、cd node_module/sqlite3

4、npm install --build-from-source --runtime=node-webkit --target_arch=x64 --target=0.12.3   最后的--target是你的nwjs的版本

build成功之后会生成node_module/sqlite3/lib/binding/node-webkit-v0.12.3-darwin-x64/node_sqlite3.node文件,其实这个时候就已经成功了


但是如果你npm test是通不过的,因为npm test是使用node来执行,而这个模块必须在nwjs里面执行,因此会报module找不到的错误,于是网上的答案就是想当然的把文件目录修改为node-v11-darwin-ia32之类的,这是不对的,目录不需要修改,直接在nwjs代码里面测试sqlite就可以通过了


PS,如果npm install 依旧不能安装成功,可以试试先安装npm install node-pre-gyp -g模块,然后在目录下手动编译


node-pre-gyp rebuild --runtime=node-webkit --target=0.12.3

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())
 


返回顶部