最近由于业务需要,写了一个 java server用来与我们的游戏服务器实现交互。

server只实现了最基本的功能: 维护多个长连接,发送与接收消息;连接建立及断开(主动与被动)。

在实现的过程中,最有意思的是java nio里的buffer,但我认为这是一个失败的设计。

java nio buffer三个主要的属性,position, limit, capacity.

通常来讲,传统的ringbuffer都会有一个read index和write index, 但buffer nio将两者统一为postion,然后弄出了读写模式切换的概念。

当从buffer里取出数据,即buffer.getXXX或者channel.write(buffer),

当往buffer里放入数据,即buffer.putXX或者channel.read(buffer),

的前后,经常要考虑模式的切换,比如调用flip,这样的设计增加了复杂性,对库的使用者带来困难(笔者才疏学浅,一直疑惑他们为什么这么设计,求高人指教),这本质上是因为position属性既要当作readindex来使用,又要当作writeindex来使用。

另外一点就是由于postion的大小不能超过limit和capacity, 导致使用的过程中经常需要compact, 每次compact会导致额外的内存拷贝;传统的ringbuffer会在writeindex < readindex在的时候才可能涉及到额外内存的拷贝。

也难怪,netty里抛弃了这种设计。

最近用libcurl向某商web服务器作登录校验踩了一坑。

事情的表象是这样的,在windows上没有问题,linux上投递过去的数据乱码。但是如果将curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data)中的data写死,即写成字符串常量,也是没有问题的。

开始以为一些参数和环境的问题,查了半天问题依旧,才怀疑到变量生存周期的问题,将data生命期拉长,就好了。

关于shadowsocks

平时其实很少使用VPN,多是Mac上SSH+Socks代理,Windows上就myentunnel+Socks代理。近来工作原因,手机上需要VPN才用的较为频繁,然而最近经常不好使了,  换了几个,一直都不太稳定,原因嘛你懂的。

于是在自己国外的VPS上搭建了一个VPN,用的是shadowsocks搭建的服务器.

客户端的话Mac,  Android , Windows应该都有免费的,iPhone上现在要花16元。

搭建好,用的是443端口。一天之后,发现不行了,然后换了个端口,现在已经流畅运行好几天了,很开心:)

一般的翻墙,通过设置浏览器http代理或者socks (5)代理就可以了。shadowsocks显然做的更多。

出于习惯,想了想这个自己弄应该怎么实现。去看了下代码,服务端用的python,几千行代码挺简洁的; 客户端需要解决的问题复杂些, 涉及到TCP/IP协议栈。

去年年底在得到APP上花费199元订阅了李笑来老师的这个专栏。

以前看过他的《把时间当作朋友》, 那时还经常把这本书推荐给身边的朋友。

这个专栏里的内容比较有深度,普适性也比较强, 讲了不少的方法论, 对我而言挺有启发和帮助。

还等啥呢, 赶紧下来看看吧, 亲。

 

这周弄海外版的Google登录没少折腾,期间踩了不少的坑,记录一下,避免后来者少走些弯路。

环境:我们用的Cocos2dx2.2.6版本,这个版本不支持Android Studio,因此我们用的是Eclipse环境。而官方文档,网上资料也都是基于Android Studio环境的。这个也是造成坑比较多的重要原因:文档资料匮乏。

主要的几个坑和重要步骤:

(1)  用Eclipse的Android SDK Manager安装一个最新的Google Play services.

(2) 下载后在extras/google/m2repository/com/google/android/gms/目录下有一系列各模块各版本的包,aar的包可以直接命名成zip文件解压缩。

(3) 合适的版本是最重要的一步,最新的是10.2.0版本,6.5.87版本及之前是作为一个包整体存在的,而最新的SignIn相关的API是在8.3.0版本开始的,顺便吐槽下Google,API的变动也实在太大了,而且基本上很难找到旧版本的相关API使用说明或者对应的Sample。我反复试了5个版本(包括10.2.0和6.5.87),最终发现8.3.0比较合适(2015年11月发布,相关的变更历史参考https://developers.google.com/android/guides/releases)。

(4)  登录相关的API涉及到play-services-basement和play-services-auth两个包,将解压后的两个文件夹导入成两个工程并作为库。

(5)  在主工程中使用上面两个库。

(6)  Cocos2dx唯一的改动是Cocos2dxActivity继承自FragmentActivity, 这需要导入android-support-v4包或android-support-v7包。

(7)  然后参考官方的API和网上相关文档即可。

(8)  注意相关的配置。

(9)  过程中出现各种各样的编译错误也是很正常的,没关系,一个个的消灭,直到弹出Google的登录界面基本上意味着快要大功告成了。

(10)  实际登录成功需要到处签名的Release APK,没有签名的Debug会导致登录失败。

(11) 出于安全需要一个Token,requestIdToken的参数应该是一个web application类型的clientId, 而不是一个android类型的,这个非常让人混淆。