趣闻两则

今天在网上看到的两个趣闻,真假莫辨。

第一个在solidot看到的,说欧洲企业计划以加热设备的名义销售白炽灯泡,简讯结尾总结:“如果有想象力任何法律都能绕过。”,看新闻关键是看评论:“如果逆命题成立的话,那么我就敢大声对世界说,看谁还敢说中国人没想象力!”。不由的说,中国人就是牛。

第二个比较累了,从dapenti看到的:

问:“上世纪30年代,美国发生经济危机,于是农场主把过剩的牛奶倒进河里。今天中国也发生了类似的现象,请问有什么不同?”答:“中国的鱼得了肾结石。”

鱼,牛奶,肾结石有什么关系?为此,我特地搜索了一番,用“牛奶 鱼 肾结石”搜索,未看到明显答案,用”倒 牛奶 鱼 肾结石”搜索,终于知道了些答案。原来是很早之前的事情了,看来这两年的热点问题实在太多了,这不,我就快要忘了之前的宜黄事件了。稍微扯远了,这里不贴原文,免得有人说我造谣,但大致说下意思:“之前的三鹿奶粉事件中,有奶农将牛奶倒入河中,以引起注意,但被倒的牛奶很可能是含有有毒物质的,鱼吃了之后,可能会有问题,就像吃被撒了农药的蔬菜一样”。自然,鱼有无肾结石病一说,我也不清楚,至于对人有何影响,这更说不清楚了。

手机通过Gravity上twitter

在国内实在是太闷了,闷的最近几年上访的人数也来越少了,他们都被安元鼎安元了。虽然目前还可以通过博客来透透气,在手机上看看河蟹写的文章,但看多了都不知道自己到底是在梦中还是在梦中了。

前几天毅然决定让我的破S60v3手机去被twitter从这片死海中捞起,于是开始了一番折腾。从网上下载下最新的Gravity,结果发现不支持自定义twitter的API。然后下载老的版本,使用twip架起梯子,结果发现网站不支持。申请免费网站,还是不支持。通过大神google的GAE,PC支持了,手机根本就不让访问.appspot.com。后来觉得家里的wii(通过DMZ,可以被公网访问)作为linux服务器实在太浪费了,天天耗电不干活,应该给它加点口粮了。于是就制定了一个方案:

将wii变成代理服务器。手机这边设置代理服务器为wii的地址,然后wii再将请求翻墙发给目的地。

linux这边翻墙还是有很多办法的,我是通过SSH的,于是调用fuck_gfw(我将ssh的翻墙放到了一个叫fuck_gfw的执行脚本中),端口绑定在7070,在别的电脑上设置socket代理,结果发现不可以。不过没关系,这不是最终目的,关键是fuck_gfw是可以fuck掉gfw的。然后就是让程序将http的请求变为socket转发到7070端口上。我想起了tor时代的polipo。(squid不知道是否可以,没做考察)

在wii上apt-get install polipo。默认安装完之后就自动启动了。调用:

       service polipo stop
       

停掉。默认的polipo绑定在8123端口,8123就8123吧,我没太大关系。关键是配置其他的:

proxyAddress = “0.0.0.0”

#allowedClients = 0.0.0.0 #这句话可能必须得注释掉,因为要通过公网访问

socketsParentProxy = “localhost:7070” #设置上层代理,必须

socketsProxyType = socks5 #通过socket

当然,你也可以通过其他的上层代理的方式,配置文档的注释写的比较详细的,我这里是socket的。

然后使用service polipo start 启动polipo。

接下来就是手机端了。安装gravity,不用说,这个做的太漂亮了。在连接设置里面,设置代理服务器为公网IP:8123,比如我的设置为:220.x.x.x:8123,不用带http://的,然后你就可以twitter了,其他的浏览器也可以一样的设置。你可以在任何地方通过使用这一代理太fuck gfw了。

在此途中,感谢 @vvoody的帮助和鼓励。其实手机上可以通过红杏什么的来翻墙,不过在我的案例中不支持而已。这种方式应该说比较普遍的,网上有很多路由器翻墙的教程,我也想直接修改路由器,这样功耗更小,但综合考虑,还是不冒这个险(刷路由器)比较好。

为什么有的程序看着不舒服

首先必须要说的几点,我不保证这篇文章中的都是正确的,这篇文章也不能保证给你正确的解决方法。换言之,这是一篇牢骚贴。

我本人这些年一直从事手机游戏的移植方面。绝大部分是将java代码移植到C/C++平台的。看到过各种各样的代码,有写的非常漂亮的,也有非常差的,看到好的代码,有一种如鱼得水的感觉,差的代码,犹如如鲠在喉,要命的是,还必须忍受着强迫自己看完,那种感觉,简直无法表达。我一直想要找一个可以解决的办法,然后弄个什么写好代码的方法之类的,最后还是放弃了,但挑刺总比拨乱反正要好的多,所以就有了这篇。

1、代码的格式化问题。代码最好有一个统一的格式,不管是gnu风格还是k&r风格或者你自己创造的风格,最好能统一并保持一直,不能在一个文件中使用几个风格。写代码的风格并不能保证你的代码编译后的质量好与坏,但可以让看代码的人感到舒心,且觉得你这个人还是比较有那么些规矩或者原则的。谁也不愿意看到看上去像飞机或者其他什么东西的代码,而如果你弄出这样的代码,并不能提升你在程序方面的水平,只能觉得你比较无聊,只有无聊的人才能写出这样的IOCCC。统一的格式化还有一个好处就是可以快速的融入到团队中,如果你技术很好,而不注意这一点,其他人则跟着你很累,如果你技术不好,其他人觉得和你配合很累。所以,赶快养成好习惯吧。(我现在拿到别人代码的首先一件事情是格式化。)

2、注释问题。注释并不会被编译到最终程序中去,可以说,有无注释完全对你程序的执行并不重要。但如果接手你项目的人看到你的代码的话,则可能一头雾水。他/她完全无法知道你的思想,你所有的思想都融入到程序中了,但他/她则没有那么多的时间去一一仔细辨别,这时候好的注释就起到作用了。准确的注释可以让他/她节省90%的时间。所以,如果你有浪费别人生命的喜好的话,删除掉注释吧。

3、文件长短的问题。这有关系吗?现在的项目越来越大了,代码越来越多了,A写的代码,B写的代码,C写的代码,最后越来越多的代码扔到了一个文件中,起个名字叫fun1,fun2之类的。虽然现在辅助看代码的工具不少,功能也越来越强大,但你考虑过看你代码的人,用鼠标回滚了N次,就为了看你的声明或者注释或者实现之类的感觉吗?不要尝试在一个桶里装下所有东西,不过我家倒是有一个这样的桶:垃圾桶。

4、文件的组织形式。我个人并不喜欢把文件扔到很深的目录中,不幸的是,java很喜欢这样的目录,什么com.java.什么的,更不幸的是,android也延续了这一作风。于是,我不得不一次次的进入很深的目录中去,就为了看下某个文件。不过,想比java更不幸的是,有些人的代码文件的组织形式更加令人风中凌乱。我曾经看到一个项目中的目录中有source,src,include,若干.java,然后我就完全莫名奇妙了,如果source中的代码是原始代码的话,那么src中是什么,外面的那些.java是干什么用的,include中包含的仅仅是些宏定义或声明之类的还是会包含很多的java实现代码。然后不断的询问才理清楚所有的关系。

5、函数的长度。有的人喜欢写长长长长的函数,几乎将所有的内容都塞到一个函数中,在我刚学程序的时候,也是如此。最后实在觉得每次滚鼠标太累了,记住所有的事情太累了,只好作罢。我不喜欢看一个函数超过两屏,我更喜欢建议看看linux内核的编码规范。不过,我看到的很多代码倒是喜欢这样做。

6、版本管理。不管是svn也好,cvs也好,git也好,我都建议别人有一个版本管理,并经常性的备份。几乎所有的版本管理都支持差异比较,从代码的比较中,不仅仅可以感受到一种成就(那种项目从无到有的感觉),还能体现出想法或者思路的更改。如果你仅仅用来做一个初始化版本管理,然后只在最后完成之后提交一次的话。这些话算我没说过。

7、编译语言的差异。其实这个不是谁对谁错的事情,你必须尊重并理解这种差异,尤其像我这样以移植项目为主的。不同编译语言的移植项目一般要求至少精通两种语言(奇怪的是,有些人总认为这些很容易),不仅仅要熟悉各个语言的风格,还要了解其优缺点,这非常不容易。往往最初学习的那个语言对人的影响力比较大(例如我学的汉语),我虽然经常的写C++代码,但其实还是比较喜欢看C代码(我正式学的第一个语言)的。我很擅长汇编(这是我很认真的学习了的语言),但在项目中还是仅可能的避免使用,即使使用也是尽可能的简短。在我眼里,lisp是苦涩的,C是简洁的,汇编是高效的,C++是冗繁的,java几乎是个累赘。不管你同意与否,这只是我个人的观点,但我无法说他们谁好与不好,只是在不同的场合下,都有各自的优缺点。

8、我还没有想到的,其实还有什么函数命名之类的,鉴于我看到的代码越来越少了,这些就不说了。

产品定位及用户选择

在一个本该睡懒觉的时间里还要上班,中午吃饭的时候,和朋友聊起了最近QQ群被半封闭的事情,他说知道后台监控之后,不到必须,就不使用QQ,但是gtalk用户好少,几乎没有什么人。于是,就说到了产品定位和用户选择上面了。

我的意见是,就产品竞争来说,举个现实的例子,msn和QQ几乎同时发展,但msn不管如何,从一开始注定要败于QQ。从最简单的用户名选择来说,你不能指望所有的国内用户都可以简单的打印英文字母以及清楚的记得它们,而数字则不用。虽然数字难以记忆,但可以让产品所针对的用户群直接从初中降低到幼儿园的水平,因为数字虽然难记,但用上几次,还是可以记得住的,在大量使用手机中的通讯录之前,可能都必须要记上几个电话号码,这些号码,往往还要比QQ的用户名要长。而字母在国内却不一样,你不能指望像我丈母娘那样的人很简单的记住A和a是一样或不一样的,还有26个字母的键盘位置,还有英文标点.和中文标点是一样不一样的,还有输入法的状态,天,一个老年人怎能记住这么多的事情呢,但数字就不一样,0~9,就那么一排,位置明显有序,从这一点来讲,msn不可能让所有人使用(当然,gtalk就更不可能了,我如果用语音来告诉别人我的gmail帐号的话,则不得不把A和i强调好多遍,如果使用文字的话,不得不把l(字母)和1(数字)强调一下),而QQ则不存在这些问题,从幼儿园的小朋友,到80~90岁的老头,都可以使用,而且表达清楚。另外,早期的QQ号码往往相对现在来说,都比较短。

从另外一个角度来比较,icq,也是使用数字的,但就以国内来说,还是无法和QQ抗衡的,放到国内,也会水土不服的。许多的跨国企业,在国内却往往无法像世界上其他地方那样成功,这既是文化的区别,也有政策的区别。在国外,想比而言,比较注重用户的隐私,关注个体的利益,因此,想象一下,如果icq在国内做起来的话,政府势必要对用户的言语进行监控过滤,如果icq想在国内发展的话,只能和政府合作,而国外的用户如果知道这件事情的话,势必会反对,从而可能会放弃它,这正是捡了芝麻,丢了西瓜的事情(朋友提到最近的黑莓就是一个例子)。因此,也只有QQ,能在中国立足,也只有能在中国发展,符合有中国特色的QQ。

因此,企业在做产品的时候,不仅仅要为用户考虑,还要重视用户自身选择的权利和能力。当然,腾讯能有目前的强大,自身的发展也是其中的一个原因。

PS:其实这次的题目有些牵强,之所以想写出来,是正好上周末与另外的朋友喝酒,也说到了类似的话题,只是例子和场景不同,那次讨论是关于管理方面的,但本质上则是相差不大的。

【一起做网游吧10.0】Start Game:加载地图

虽然从目前的角度来说,这个教程在不断的前进着。但从寻找资源来说,进展困难,我本来想让10.0的教程的内容为实现一个玩家在地图中行走,但资源找来找去,只找到了相对合适的地图资源,人物的资源一直没有找到,因此就先实现了地图资源。

考虑到目前客户端j2me的局限,我决定j2me的jar中,仅留有代码,所有的地图资源等,都通过服务器下载。因此服务器端必须对这一点进行支持。也因此增加了两个命令。而代码的更新,更大的体现在客户端。

先看下目前客户端的截图吧:

上述截图的资源完全来自开源的daimonin,我本身不会进行美工的工作内容,如果可以的话,就不用这么辛苦的找资源了。

为了实现资源的下载,在客户端,我修改了底层传输支持的Netstream的机制:

继续阅读【一起做网游吧10.0】Start Game:加载地图