为什么go build 时报gcc找不到的错误

问题

写了好几天的Go程序,都没有感觉到还会用到gcc,今天突然在go build 时报如下错误:

exec: “gcc”: executable file not found in %PATH%

原因

今天想了解一下Go语言中如果做字符集转换,发现基础类库中没有这部分,但是有几个第三方的可以使用,比如: https://github.com/djimenez/iconv-go ; 这个是将C版的iconv用Go包了一下,说到这里就水落石出了,因为我引用的iconv-go是C的一个wrap;

注意: Go 可以编译出来不同平台架构下的程序,但是如果使用的C的类库是32位的,但是却试图编译成64位的程序,将会遇到如下错误:

sorry, unimplemented: 64-bit mode not compiled in

当然,有完全Go版的字符集转换类库: http://godoc.org/code.google.com/p/go-charset

关于goroutine的一些理解

 

参考资料:

  1. http://blog.zhaojie.me/2013/04/why-channel-and-goroutine-in-golang-are-buildin-libraries-for-other-platforms.html      这篇文章讨论的好激烈
  2. https://github.com/dafang/notebook/issues/88    Golang适合高并发场景的原因分析
  3. http://ieqi.net/
  4. http://xiezhenye.com/2012/08/%E5%86%8D%E6%8E%A2-goroutine.html
  5. goroutine 没有完全抛弃线程,而且关系有些暧昧,仔细读这篇文章(评论更精彩): http://xiezhenye.com/2012/08/%E5%86%8D%E6%8E%A2-goroutine.html

jQuery.ajax处理302重定向

问题

为什么jQuery.ajax() 没有默认支持302重定向?

解答

jQuery.ajax 是通过xmlHttpRequest来实现的,而这个东西存在跨域问题,如果302跳转到的地址还是当前域,则服务器端几乎没有302重定向的必要;如果302跳转到的地址不是当前所在的域,则必然存在跨域问题。可能就是这个原因吧。

但是:

出于跨域资源共享的需要,很多浏览器开始支持cors,如果浏览器支持了cors(假设server端也做了相应的配置),则,jQuery.ajax似乎应该支持302才是,如果自己实现,请注意,如果需要上行cookie(一般是需要的),需要设置  xhr.withCredentials=true

 

如何实现302

对于jQuery.ajax来讲,302是一个错误,可以通过实现 ajaxComplete 事件来完成,具体参考: http://api.jquery.com

参考文章:

http://stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call

http://stackoverflow.com/questions/6955308/in-an-ajax-call-302-is-not-followed

http://www.cnblogs.com/Darren_code/p/cors.html

http://blog.csdn.net/hfahe/article/details/7730944

 

PHPStrom 写Go程序

写在前面

当习惯了PHPStrom之后,写啥程序都会首先想到使用这个IDE;或许你会说,写Go不需要IDE,但是俺就喜欢使用IDE;于是,在PHPStrom的插件管理中搜到了一个叫做golang的插件;创建一个新的Go工程时,就可以选择创建一个Go工程了(当然,Go环境需要提前配置哦),而且会自动创建bin pkg src目录,好生专业。

问题

当我想把自己的Go代码使用github来管理时,我遇到了问题:

  1. 我想基于github上拉下来的目录创建一个Go工程
  2. golang插件不允许在一个已存在的目录上创建Go工程
  3. PHPStrom如果不用golang插件创建Go工程,则没有一个地方可以设置加载Go类库
  4. 如果先使用golang插件创建Go工程,再从github上拉取代码,则git会因为目录非空而不进行clone

解决办法

办法1:

  1. 创建Go工程(如果不喜欢自动创建的目录,可以直接删掉,我就是这样做的)
  2. 使用git clone github上的代码到一个非工程的目录
  3. 手动copy github代码目录(含 .git 目录,方便在IDE中提交代码)到Go工程中某个你喜欢的目录(甚至是根目录)

办法2:

  1. git clone github上的代码到你喜欢的目录(一般是$GOPATH/src下的某个目录)
  2. 使用PHPStrom打开该目录,则该目录下回生成 .idea 目录
  3. 对 idea/misc.xml 做如下修改后,重新打开该工程,就会发现Go类库已经加载了

<component name=”ProjectRootManager” version=”2″  />

<component name=”ProjectRootManager” version=”2″ project-jdk-name=”Go SDK go1.3 windows/amd64″ project-jdk-type=”Google Go SDK” />

PHP中信号的处理

缘起

刚刚了解PHP中如何处理信号的时候,我认识了declare(ticks=1),就这样,我便给自己挖了个坑;终于有一天,我发现自己的程序总是有大量的如下系统调用:

rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

虽然没觉得这个东西开销有多大,但至少是不应该的。

分析

当声明 了declare(ticks=1); PHP会在每执行1条可计时的低级语句后就执行上面的信号处理的系统调用。

解决办法

不使用declare,代之以在合适的地方调用 pcntl_signal_dispatch(); (该函数在PHP5.3才开始有的),该函数触发的就是上面提到的系统调用,这样就可以使得该系统调用不会太频繁

为什么修改密码时需要重新输入旧密码?

如题:

回答:

  1. 加入小张登录账号A后,临时离开一下,这是小王看见小张没关电脑,想把小张的A账号据为己有,将密码修改为自己的,如果需要输入原密码,则,这坏事儿就干不成了
  2. 对于已登录用户,如果修改密码不需要输入原密码,则很容易被跨站请求攻击的

结论:

不仅仅是修改密码,其它一些重要操作都应该是这样的,就比如,浏览器记录了你大量密码,而且,浏览器提供了查询明文密码的功能,前提是,你必须验证操作系统账号的密码;(其实,只要做一次登录并且抓包就能看到了)

关于Cookie的思考

问题

如何能使得一些信息可以存储更小?

分析

常见的存储方式:

key_len + key + value_len + value + …

优化方法

  1. 如果key是定长的,则: key_len 可以省略
  2. 如果对key编号,则,key可以更短
  3. 如果按顺序存储,则key_len 、key都可以省略
  4. 如果value是定长的,则value_len 可以省略; 延伸: 对于定长的value,省略value_len,非定常的value,不省略
  5. 如果顺序存储,对于空字段也要保留1个字节的value_len  (value_len = 0),这里可以设计1个元字段,标识哪些字段为空(或非空),这样就不再需要1个字节的value_len 了
  6. 设置默认值; 对于出现次数频繁的value,设置为默认值,不做存储,而且,如果出现频繁的value为多个,则可以通过2bit的信息标明默认值为1、2、3; 不宜设置太多的默认值,那样就不会节省空间了

 优化原理

  1. 信息没有丢失,而是藏在了逻辑(或代码)当中