bookmark_border看Log排错排到恶心

公司的工作闲了下来,继续弄我的卡牌服务器。

在公司开发服务器端的时候用的是php,公司在所有人都没有可以单步调试的IDE的条件下,仅靠着var_dump啊print_r什么的,竟然也开发完了一个网页游戏。我写了几天,就被自己满屏的print_r给恶心坏了,花了半天时间,装上了eclipse和pdt和xdebug,在自己的虚拟机里快快乐乐的单步调试了起来。

现在回到我的卡牌游戏,相比逻辑简单而且只是一问一答的php,我的node.js游戏内逻辑的调式环境可说是更加险恶了。
因为至今为止规模都不大,所以我一直没有搞单步调试环境,全靠输出log来排错。但是今天在我的一个稍微底层的地方出现了逻辑错误,为了排错,我不得不添加了大量的console.log输出代码。虽然最后总算是把bug排掉了,但log信息已经海量到没办法轻易查找其他小地方不定时出现的错误信息。顺便说一下,我觉得看log排错是一种很恶心的体验= =

接下来怎么办呢。因为是开发阶段,我搞个单步调试环境应该不难,但是听说因为服务器一旦开起来,轻易就不好关了,想收集生产环境中出现的错误,拿到本地再现,改正,然后在短暂的停服更新期间打补丁的话,log输出方面的设计就必须重视起来。

嗯,可是我刚和log大战了30分钟,正犯恶习,现在不太想深入思考这个话题。再说这次只是个练手作品,处处都抓就坑了。总之先记录下来,至于解决方案,就容我暂时搁置一下吧。

bookmark_border程序员的交流能力还真是非常的重要

程序员的交流能力还真是非常的重要。

情况是,tableA有N个逻辑列,另外还有两个列存储在tableB上。本来tableB上的这两个列和tableA上的逻辑列地位完全一样,就应该放进tableA里的,但是因为想兼容操作tableB的代码,所以这两列不得不和tableA分着家。
同事让我在去tableA的值的时候也可以取到这两列,我就在根据给出的逻辑列id取对应值的函数里做了一点改动,让存储在tableB中的数据像tableA上的虚拟数据一样访问,对使用者透明,而且没有任何额外的查询和处理效率上的额外负担。举例来说:
以前是 getRow( keyId, [ col_1, col_2, col_3 ] )
现在可以用 getRow( keyId, [col_1, col_2, col_3, virtual_col_4, virtual_col_5] )来取那两个值了。
但同事表示他希望另做一个总是取所有列的函数,在那个函数里单独select这两列,最后合并为结果返回。我说如果有人想单取这两个值,也不得不取所有值吗(因为是逻辑列,实际上是分布在多个table上的很多行,取所有值的代价很大)。他想了想,说那可以再做一个专门取这两个值的函数。
他的意思是让每个操作都尽量简单,但是getRow这个函数已经是一个一行的函数了,非常的简洁明了原子。本来这两个值在概念上就是和其他列同等的,做成虚拟列比单取更优雅。他则坚持他的观点。我用日语跟他争辩,本来就很耗费精力,再加上他年纪比我大,就更不想跟他争了。最后我说这是编程哲学上的分歧了,如果你想这样做,那我就这么给你实现吧(说的时候尽量露出笑容)。他大概看出我的不满,还在给我解释为什么那样好,我只好硬挺着微笑着跟他说,这件事是こだわり(个人执念)方面的问题,我不想继续讨论这个问题了。
确实是个人执念的问题。事实上,就在之前,我们已经彻底废除了tableB的原有功能,所以兼容已经不是理由了。这时候如果他说把这两列写进tableA里,我还可以接受,可是在项目代码本身并没有统一的设计风格,我代码已经写成,可以正常运转的情况下要我撤下现有设计,改换接口和所有相关调用,实在只能用こだわり来解释。

在这种程序设计的选择方面,如果充分交流,我有信心证明自己的做法更优越,但当时就突然觉得很累,心理资源暂时性用尽,于是放弃了交流。我写过的大部分代码都是一个人完成,没有人插手的,所有实现和重构都由我一个人统一风格,结果上也总是能达到我预期的灵活性和接口的优雅美观。如果项目本来有统一的风格,我肯定是要遵守现有风格的,可现实并不是这样。
放弃交流,最先影响到的是热情,这个我对现在的山寨外包工作本来就没抱有,所以没什么。既然没什么,那就算了吧。
现在上班是为了积累经验,好用到下班后的项目里。等个人作品完成以后,跳槽去个让人更有热情的公司去吧。

说到个人作品,现在越发觉得是个越挖越大的坑。我历来勇于挖掘,怯于填埋。这次这个卡牌游戏我本来是想只做个服务器端,好拿去找工作的。后来越想越多,要跨PC,android,ios平台,在后来看到cocos2d-html5了也想跨到网页版了。结果,坑大了,前面望不到头了,进度反而慢了下来。最近开始收小阵地,客户端只用javascript命令行,做一个文字版的卡牌客户端先。要限制欲望的膨胀。要做一个Demo,只关注我所关注的部分——服务器端。

今天又下了一遍笃志的代码,wc -l统计了一下行数:引擎8w多行,棋牌5w多行(不含depend)。这些都是业余项目啊(望向我1800行的服务器端)。一个月要写1w行的话,一个工作日要写500行。我现在的下班时间和周末已经完全被lol占满了,每天凌晨4点睡,周末上午7、8点钟睡已经是家常便饭。服务器端的代码每天只能在单位写一点点,照这样下去,到我预计的5000行,怕是要等到下半年了。可跳槽要趁早啊,我TOEIC和N1都考出来了你就给我说这个?

冷静。回想一下研究生时代,这又是新一轮的拖延型消沉。当时我自责了两年半,不仅没有解决问题,还让情况越发严重,精神痛苦,最后一年几乎是哭着等待毕业的。痛苦是可以熬,但是这种自责带来的痛苦并不是熬完了就能解决问题了。首先它也熬不完,我会严厉的批评自己一辈子不动摇的,这种倾向很明显。其次,这和解决问题是完全相反的方向,它从最开始就不值得我忍受。

要用力原谅自己。
我对人太严格挑剔了,对自己尤甚,看谁都有无法容忍的缺点,也就很少能在哪个集体里感到自在放松。别人可以不接近我,但是我没办法和自己保持距离,接近自己又被批得太痛苦。我为自己一天不能写14个小时程序而怒其不争,而事实是我现在在假日里连14分钟的程序都写不了,怎么可能满足这么高的自我要求?

什么事一深想都会牵扯出一套自责的理论来,要么自责,要么自责自己的自责。这种时候最需要的,就是把脑袋空一空。玩就玩了,该高兴就高兴。不过其实玩游戏并不能带给我真正的快乐,按知乎上看到的理论,游戏属于被“渴望”系统刺激出的欲望,让自己有强烈的“做了就会快乐”的错觉,而事实上去做了也不会获得快乐。

我需要区分“渴望”和真正的快乐。我始终逃避的工作之外的“集体活动”、“与人相处”等等,实际上却总是会为我带来超出预期的巨大快乐。以后做事时先回忆一下以前做玩类似事情之后留下的是快乐的回忆、还是麻木的回忆。忍耐带给我麻木的“渴望”,忍耐逃避可以创造快乐回忆的活动的冲动。

具体来说就是,(逐步)减少lol的时间,出席社团的chat会议,约朋友出去吃饭看电影,早睡早起(意外地会带来好心情),给朋友打电话。

bookmark_border坑我半个工作日的php和mysql问题记录

今天公司内部换位置,自己的ip也跟着换了,然后就各种无法正常开发,想了想肯定是环境问题,结果来说也确实是这样。

坑我的主要是两部分,下面列个表记录一下。

(一)php的xdebug部分:

症状:

1. php打开极慢,开phpmyadmin的登录页面需要3分钟以上。

平时我开着xdebug也不过5、6秒而已啊,虽然已经很慢了。

2. eclipse的xdebug插件下的断点不会停了,即使下在第一行。

解决:修改服务器上的php.ini里指定的可以用xdebug的ip地址。

因为是指定地址以外的ip访问,所以超级慢,而且eclipse内不能下断点。

 

(二)mysql部分:

1. 初始化PDO失败时,看看错误信息,是不是’@’之后的部分不在这个user的host指定范围内。是的话,需要用grant命令修改权限。
2. 想grant之前,先看看自己的账户有没有grant权限
3. 有grant权限却不能grant时,看看是不是需要mysql_upgrade一下
http://stackoverflow.com/questions/8484722/access-denied-for-user-rootlocalhost-while-attempting-to-grant-privileges
4. mysql_upgrade执行了两行就失败了还不给理由时,看看是不是没有输入用户名和密码
http://serverfault.com/questions/527422/mysql-upgrade-is-failing-with-no-real-reason-given

bookmark_border有目标就出手啊,在这里矫情个什么劲儿!

据观测,我的学习生产效率最高的时段是坐在公司电脑前的时间段。
回到家就是上网玩游戏看新闻看博客查各种奇怪的知识和突发奇想,有lol就晃到3点多没lol就晃到2点多,然后睡觉。第二点早晨9点50起床急急忙忙赶电车上班。
最近开始有工作进来,在公司的无压力自学状态已经结束了。但懒散了一个多月两个月,已经习惯了早走(20点一过就走),丧失了后续的学习时间。
想回到以前和末班车同进退的生活吧,竟然有点怕,不敢了。
这种变化让我惊讶。
我才25,能耐得住每晚凌晨3点睡,正是拼命学习的好时候。现在受享乐情绪的控制,未免太早、太不是时候了吧。

肯吃苦,吃苦半辈子,怕吃苦,吃苦一辈子。

今天立贴为证,2014年2月(除影响到交通的极端恶劣天气外)的每一个工作日,我都要在23点30以后回家。

哪怕是赖在公司看新闻写博客,也不许回家

 

—- 02-17 —-

特别想回家,好痛苦。工作也不想做,设计自己的卡牌服务器端逻辑流程倒还是觉得挺有趣的,但这股消极情绪实在是很强烈。

上周五因为东京历史级的大雪而提前回家,今天又不能保证11点半,真是…

算了,自责是最不解决问题的。目前我的自信心问题比责任感问题严重得多。

这股低潮的理由我也许知道,不过无能为力。还是回家逛个超市,泡个澡,喝点小酒,看着漫画睡觉吧。《将太的寿司》,虽然给我看略显低龄了,不过还是挺有趣的

bookmark_border东西不多,常总结(很多服务器端进展,一点个人心情)

公司放我自由自在了一个月,收获颇丰。

现在已经用pomelo做了一个联机猜拳的练手服务器端,可以用chrome的javascript console命令行与之交互。

目前服务器端实现了

  1. 自定义用户名登录大厅
  2. 创建并进入任意名称的房间,获取当前存在的房间列表,进入还没有达到人数上限的房间
  3. 对房间内的空座位开启或关闭AI玩家
    AI玩家是用pomelo-bt 行为树做的,现在只会随便出拳,和人类玩家全离线时立即退出房间。
    顺便说一下,行为树听起来好高端,入门了一下才发现概念真简朴,自己实现一个也不难= =
  4. 开始游戏后有5秒读秒时间,在这段时间内有玩家退出的话游戏自动终止,大家回到房间(向war3致敬,兼提出我针对秒退的对策)
  5. 正式开始游戏以后,每个人可以出拳并随时可以更改手势。
    当房间内每个人都已经至少出拳一次时游戏结束,所有人回到房间。
    也做了可以玩3回合然后游戏结束。不过想了想做猜拳demo就是为了去掉游戏逻辑,锻炼写游戏大厅这部分,所以后来就没再改善过游戏规则了。
  6. 玩家因某种原因意外断开连接时,也会正确处理退出游戏,退出房间,退出大厅的逻辑。
    这部分其实都是pomelo的功能。不过让我知道了这里需要这种逻辑也就够了,以后需要我自己实现C++服务器端时我也会去做便于开发这种事件驱动型服务器的框架的。

客户端是cocos2d-x 2.2.2(好2!>_<),用上了最近刚刚加入引擎的cocostudio的gui类。哎——,用别人写好的UI控件真是幸福,想到什么就能立刻安上去,安上了就能正常运转。想我之前用SDL写游戏,其实大半都是在写2D游戏引擎啊。SDL除了个surface和blit以外啥都没有,我当时也年少无知,看了一个用SDL做的仙剑,就兴奋地决定我的C++入门之作将是一款SDL开发的2D游戏,从此,走上了自制一切之路。

跑题了。还是说我的猜拳客户端。客户端现在只做功能,不在意卖相。功能上是实现了输入任意用户名登录大厅,刷新房间列表,进入已有房间,还没有做创建房间的部分,开启或关闭空座上的AI开关滑块,开始游戏,出拳,还没有做退出游戏、退出房间、换座等功能,游戏也没有任何美术,游戏进程都是通过文字显示在屏幕中央。

 

接下来要好好收拾一下游戏的UI动画和游戏内各种美术元素。不是找美丽的UI素材,而是做出可以使用动态美术素材的各种美术类。

在公司做了几个月商业游戏的2D程序以后我感觉到,游戏系统其实好做,繁琐而困难的是那些难以归类、思路不统一、很脏很没有道理的UI动画效果。当然也可能是我至今为止一直在重系统清画面地做游戏,这方面没有得到很好的训练。不管怎么样,这次我要好好训练一下自己驾驭2DUI动画特效逻辑的能力了。我要设计各种花哨无意义的2D特效,以最华丽的外在美,来包装这个SB猜拳游戏。目标是证明“外在美才是真的美,内在什么的没人会在意”!

 

——– 文理分界线 ——–

心情方面,最近还是感觉在工作上显得很幼稚,很被动,不去主动为还没有定案的策划写代码,对工作没有热情。不过说真的,我对公司开发的山寨游戏的服务器端真是没兴趣(没错,我们公司在做国外热门app的山寨手机游戏,你让我怎么提的起热情 = =),不想浪费时间在了解这个工作上。这次的游戏是两个有一个手机游戏项目经验的前辈加我一个完全的新人来做。因为有责任归属问题,所以设计和客户端通信是交换数据的json内容和数据库的工作我不能插手,可这两个不定下来我的php逻辑就没法写。一开始我看策划草案挺简单的,这两个人又是有开发经验的,我的被闲置状态应该顶多一周就能结束了吧,结果这一闲就是一个月= =。我看他们这一个月几乎没写出多少东西来,好不容易出来一点定案,我都马上把php逻辑给他写好了,结果是我各种闲。一开始我还挺扭捏,不好意思在公司里看我的练手项目技术相关的东西。后来我也放开了,该上服务器上服务器,该开vs开vs,屏幕上都是和php无关的东西,一派死猪不怕开水烫的架势。万幸,倒也没事。

我想,今后制作我不喜欢的游戏将是我行业生涯的主要内容,虽然无奈,但也比做和游戏无关的工作好太多了,至少我练的是和我喜欢的东西有关的技能,等将来遇到了真爱,不至于拿不出真材实料,为她奉献。

 

关于工作之外,其实我们公司有一个不定期程序员交流大会,是一个程序主管一直在推的活动,可是每次都是没有素材,结果就成了各个项目组自我介绍和汇报工作进展的会议。最近开始有技术讲座了,可惜大家不是很重视,准备的人也只讲5分钟左右,ppt和我在研究室时花10分钟准备的早会ppt是一个档次。我跟我前一个项目的主程说我想参加,给你们讲讲用umdh寻找程序中隐藏的内存使用瓶颈的问题,主程也很高兴地说有机会帮我跟上级说说。不过其实我这个公司是个小型公司,上下级之间没那么远,我真的要讲完全可以直接联系那个主催的程序主管,他也绝对会高高兴兴让我讲的。让事情迟迟没有朝这个happy ending发展的人,就是我。我的被动的性格。怎么改,也许以后慢慢就会变主动了?也许,不会。

 

业余时间方面,这几个月是没有什么拿得出手的成绩的,可以说完全是在浪费时间。该业余时间学的东西,我在上班时间学得专注,到家了却跑去lol,夜夜打到凌晨3点。删游戏,安游戏,安游戏,删游戏。以前网速慢,删游戏还有一定的物理上的限制作用,现在100M光线入户,最后一道屏障也已被突破。能保护我的未来不被堕落侵蚀的,只剩我的精神立场。我那柔软,稚嫩,脆弱,敏感,理想主义,精神洁癖,难以控制的A.T.Field.

 

精神方面,依然是各种失态。有时候我觉得自己的情绪变得比较稳定了,结果下一次遇到事情时时还是很快闹起情绪,事后总结是我很久没崩溃是因为我很久没和人类接触了,接触就崩溃。对工作有怨言,对公司有怨言,对自己有不满,对亲近的人撒娇发脾气,对陌生的人不愿接近,个人能力有进展觉得是理所当然的小事根本不值得高兴甚至对自己和神的距离依然遥远而感到沮丧(即使理智想想能意识到这些进展放到另一个普通人身上能让他多么的骄傲自豪),反复咀嚼微不足道的小事直到自己觉得这是件值得焦虑的事情然后为之焦虑(这就是我在写这个自然段时所抱有的情绪)。每隔一段时间我就会搜索一遍“提高情商”,“智商弥补情商”,“how to improve emotional intelligence”之类的关键词,然后找到一些文章和维基词条,看到一些人说“谢邀。虽然我一直是个情商极低的混蛋,但还是让我来给你讲讲如何提升你的情商”之类的短文然后一阵恶心关掉标签页。最后意识到短文无法说服我,我需要大部头,需要我最善于吸收理解的东西:书,教材。然后就是找心理学书籍,下载心理咨询师教材和习题,然后发现这些pdf早已被我下过一遍,现在正躺在我的图书文件夹下等待检阅,然后想起来我上一次走过这一套心理变化和行为时也是到这一步收的尾,然后我这一次的流程也在这里收尾了。这是个可悲可笑的无限循环,我想,总有一天,我会去系统学习心理学,然后读一个心理学第二学位,或者至少考取初级心理咨询师执照。我读书考试很行,对这一点我还是有信心的。对于这种”总有一天“型的想法,我一度以为只是一时兴起的说辞而已,但最近几年我发现我一步步实现了之前的一些”总有一天“。我想,这是一种心理暗示,而我心理脆弱敏感很容易被暗示所支配,最终稀里糊涂朝目标走去,莫名其妙的实现了目标。如果事实真的是这样,就可以解释为什么我总觉得有一种”运气“在刻意帮助我。再进一步,如果我理解并掌握了这种技术,也就间接实现了自控力——通过控制可以控制自己的工具达到了控制自己的目的。听起来有点tricky,不够刚正面,不够精神强壮,但这又怎样呢,结果好,才是真的好嘛(笑)