盗賊の極意

Feed Rss

百度空间也走了

05.07.2015, 6 条评论, 未分类, by , 2,621 views.
百度空间关闭

百度空间关闭

又一个我认真待过的日志空间关闭了,上次是msn space。

我虽然很久不用百度空间了,但对他一直很有亲切感。提起百度空间,就会想起我的整个大学生涯,兼一半的留学生涯,我的第一批“网友”,我的一百多幅画,我初学编程时为一点小成就而喜悦,我意志薄弱时任性的吐槽发牢骚。

好东西为什么总是死的早?也许不是他很好,而是我对他产生了感情,感情深到同类产品的优势不足以抵消我对老朋友的留恋。确实,相比探险与开拓,我更倾向于恋家和守旧。

msn space, google reader, baidu空间,还有fileden网络硬盘,大的还可以算上verycd,115,以前的迅雷,我没用过的像google wave,google code,google buzz(...google你是关闭了多少业务= =),delicious书签,等等。现在我还用着的evernote,dropbox,youtube,gmail,weibo,qq,xiami,github... 考虑到现在复杂的大环境,我越来越觉得把所有数据都管理在自己手里是很重要的。

现在我家里有一台synologyNAS(3TB,800MHz,128MB),一台HP小服务器(500G+3TB,2*2.2GHz,4GB),有一个同学的VPS的账号,一个同学的网页服务器的账号。

作为一个业余爱好,我想把我需要的数据都管理在自己手边。新业务出来了,只要把自己的数据导入导出一下就可以用,定期把网络上的数据同步回本地永久保存。嗯,能做到就好了。不过其实这事情本身意义不大,还是玩的成分居多。

不过,等我年纪再大一点,想回顾自己年轻时的足迹时,发现百度已经把日志彻底删除了,微博已经被新社交环境淘汰了,动画漫画已经没地方下了,就该骂现在的我为什么不勤快点把收集做好吧。所以这事情要说有意义呢,也算是有点意义。等闲下来好好计划一下,在github上开一个收集各平台数据的爬虫,和在本地管理各种数据的框架的坑吧^_^

程序也是,画画也是,日语英语,科研,都是二半吊子,不上不下的。
这几项我比初学者都强太多,想找水平相当的人一起学吧,找不到。
做到这些领域的业内名人的大有人在,也好找,可他们比我强太多,也聊不到一块儿去。
寂寞。
大学时代三年画室生活让我彻底领教到学习环境的重要性。有一批水平跟自己差不多的人在一起学,有一个老师会根据你当前的表现和做法适时提出评价和建议甚至示范,这种环境带来的学习效率让我震惊。之后我一直很在意寻找这种学习环境,可惜成功再也无法复制,我只好继续自己擅长的自学之路。

其实自学能做到的事情是很有限的。不是说我自学能力不强,事实上我身上最强大的属性就是快速的正确自学的能力。无论是大学时代考前突击拿一等奖学金,还是留学前自学过托福过入学考试,都是我强大自学能力的体现。但你看像画画这件事,在去画室之前我大概自己凭兴趣临摹漫画有500小时左右,当时感觉已经是画得很好了,视野范围内无敌手,周围的同学也是一片赞美,但现在回头一看就知道当时我的水平和视野是多么的有限。

我的自学能力仅限于知识领域,也就是看书就会的部分。画画的理论部分其实非常简单,我从画室也只是学到了物体分光影,重点刻画明暗交界线,定位时利用虚拟水平垂直辅助线进行肉眼测量等等,三两句就能说完。画技的提升,靠的是手感,是实战经验。但你闷头画效率也不会很高,因为你不知道应该注意什么,提高什么,不知道障碍的突破点是什么,甚至根本不知道是什么障碍。那种憋着一股子劲儿却只能打在棉花上的无力感会很快耗尽我的热情。

热情是我保持行动力的核心燃料,非常珍贵。有老师指导可以很节能的持续学习,还外带一个固定的学习时间带,保证了一个稳定的学习时间,反正特别特别好。现在想找老师带我画CG,可惜怎么找也找不到了。在网上看了一圈在线授课的东西,学员学完以后依然水平太低,看得我害怕。老师画画是真有水平,但是上课只是自己在那边画画,再自言自语几句,或者回答一下学生问题。只是这样的话,网上发自己作画过程的高手千千万,我为什么要花上万人民币看你一个人在那直播呢?画完以后的作品点评也非常没有意义,这种点评到处都可以要到,对高手们来说只是举手之劳而已。既然授课,就要有最核心的“在我作画的过程中给出评价,甚至中途接手修改,改过后给我接着画”的服务。没有这一条的所谓授课都是耍无赖,没有参与价值。

当年对画画一窍不通的时候被各种“大师”的教程教材坑苦了,现在虽然学会了绕过各种陷阱,却遗憾地发现已经找不到适合我的学习环境了。或者说,找不到比我自学的效率高很多的学习环境了。

所以我继续自学画画不就好了么?
其实自学成才的人很多,我的程序也完全是自学成材的。但人是有属性倾向的,我就是写程序消耗的燃料少,画画消耗的燃料多,燃料的追加时机和追加数量是随机的,这就是我的属性。两件事都让我很快乐,很有成就感,都是我乐于花一生时间培育的手艺。现在程序方面顺风顺水,画画这边卡住了。以励志小故事的观点来看,这里我应该克服自己的惰性,修改自己的燃耗属性,逆天改命,翻盘取胜。而实际上呢,我还是会一如既往地等待某个转折条件的到来,等待一个改变当前局面的契机(而不是奇迹)。我是很固执很不听人劝的,改变自己远远难过改变环境。在至今为止几乎所有的人生重要转折点上,我都是靠“改变环境”来取胜的。当然这里有点夸张的成分,毕竟有些改变真的只是运气好而已=w=。

接下来怎么办呢?接下来我依然会细心照顾现在进展顺利的编程分支,并不断为自己制造可能激发我绘画热情的机会,等待其中某个机会真正生效,然后一举翻盘~嗯?怎么听起来不太像改变环境?哎,反正是【在不改变我自己对学习环境严苛挑剔性的前提下使自己可以继续画画】 ==>【 创造一个让自己满意的环境】==>【改变现有坏境】的感觉啦~!

我是很偏执固执,又睿智强大的,能驾驭这种性格的话,我的产出可以抵上一个小队。为了能随心所欲的使用自己的能力,我得看点心理学基础,考个二级心理咨询师什么的了。真期待看到将来和我一起生活的人会怎样习得“我”的使用方法(笑)。

公司没有写服务器端的经验,之前用某服务器端引擎提供商提供的示例代码改改出了一个游戏。这次轮到我当服务器端程序(一个人负责C++全部,哈哈),看原来的代码没用到的示例功能特别多,很碍眼,想重写一个清爽简洁版的服务器端,但是这需要好好理解哪些代码可以删,哪些不能动,偏偏引擎是闭源的,我只有header和示例的注释可以看,初始化时七八个管道啊连接器什么的实在猜不出是干什么用的,读所有那些header也很花时间,犹豫了。
从吸收知识的角度来说,肯定是好好理解一下比较好。但是我毕竟是拿钱工作的,消化任务列表的速度太慢,可能被公司添加新人进来——其实已经听说准备招人加入服务器端开发了——我独占服务器端开发的时间有限,在别人来以前尽量多推进一些也许比较好?比如公司看我一个人也写得挺快,就让我自己干了什么的。我这段时间刚投了简历准备跳槽,挺希望能在走之前给这个项目搭好稳固的地基(最好干脆让我干完再走更有成就感)。反正就是各种时间不够用。偏偏我上一个项目的php工作太悠闲,已经很难集中精神读大段代码了(写还是没什么问题,写比较容易投入)。坐在座位上开开微博,看看邮箱,干着急就是不去读代码。
现在也是,我看我实在是不肯干,就索性出来写写日志放松一下,也让文字帮助我思考,看看这个问题到底出在哪。
这个服务器端怎么写,我心里大致已经有数了,上周也刚写好对战部分提交了。今天开始要写游戏房间、匹配等等进入战斗前的部分。虽然代码还没细看,但我们有rpc定义文件,仔细读了一遍,知道客户端可以调用哪些功能,对这个匹配服务器怎么做也就有了大致的印象。就像笃志说的,架构一看就懂的感觉。
架构虽然懂了,落到实现还是很犹豫的,毕竟实现方法太多了。而我又好多想,希望在架构设计阶段就把之前困扰我的服务器端调试功能也搞定,这下更不敢动手了。其实服务器端调式,我的终极理想是做成跨平台,让vs也能编译运行服务器端,这样调试就不是问题了。不过我们的引擎商只给了我一个老版的windows端lib,只有linux版的.a是最新的,这链接上去谁知道跑得对不对呢。还有我们现在的服务器端主要靠引擎商的示例代码,里面直接用到了fork函数,这个我真是没法在windows下模拟,平台跨不起来。要么大改逻辑,但那样工时就会花很多,上头问下来我说我搞个人研究重构着玩儿掉了5个工作日什么的,那还得了。我现在能做的,就是一层一层的分开,让这个项目尽可能多的部分可以被windows编译运行。战斗部分因为可以独立运行,现在已经实现在windows下运行了,不过debug还是不是很顺手,看来只有vs也不能解决问题。我们公司是没有这方面的经验,真没有,连gdb的存在和用法都是我教他们的,在那以前他们完全靠log来debug服务器端。
好了,再说回来,这个服务器端调试不顺手。因为客户端和服务器端通信有一个顺序和时间间隔,我想做一个操作顺序就要改一次客户端代码,不方便。这里我的理想解决方案肯定是导入lua,毕竟以后也需要测试机器人这一点已经确认了,早晚要做这个功能。不过做测试机器人的任务有它自己的工时,现在做是占用我做匹配服务器的工时,不好。另外还有一点,是不能同时停下两边。一边下了断点停下了,另一边很容易超时。尤其gdb我玩得还不是很得心应手,比起下条件断点,我更常做的是最开始就下好断点,然后每次被断了就continue,直到我想要的那个条件的到来。说是每次,其实也就两三次啦,但客户端那边是有固定时序的。我每次打continue或者c的时候,时间误差都会累积,最后时序就不是我预期的样子了。这一点真的烦,习惯了vs上开发单机游戏时尽在掌握的调试能力,现在是各种憋屈恼火。服务器端调试已经是太钝的斧头了,需要我磨刀一下才不会耽误今后大量砍柴的任务。当然,这个耗费的工时只能自己挤出来了。问题是,我肯出这个时间,也不知道该怎么改良。如果断下来之前先通知另一端,就需要一个类似break()函数,里面是rpc通信,但这就失去了断点可以实时添加的便利。我每加一个断点,都要重新编译一遍的话,我宁可自己读代码找bug。一个想法是,两边的超时行为应该默认不发生,直到我手动发出一个超时信号,才出发当前阶段的超时。这样一边进入断点也不用着急,算是为调试专门设计的环境,可能需要定义特别的编译宏来开关这个功能什么的。为了今后的等待也能被这个调试方式管理,程序中所有的超时管理应该使用统一的方法。在服务器端,我估计会有控制时间流这方面的需求,所以已经做了一个GameTimer类,游戏中所有的时间都是询问GameTimer来获得的。那么调试模式下,每次启动GameTimer时它都不动,直到收到debug超时信号,就一口气走过一个巨大的数字,保证什么逻辑都超时。甚至debug超时信号中可以自带走过的时间,让时间的流动尽在掌握。嗯,听起来有点靠谱了,不愧是靠写字思考的男人,写博客果然有效,哈哈。
哎,我就喜欢琢磨这些基础建设,因为以后都能从中获益。游戏逻辑的具体实现是写过就算,对我来说属于用过即弃的代码,没有沉淀,没什么兴趣。

 

工作几乎没有,每天到公司看一天网页,写一点点代码,偶尔改几行bug,到点走人,回家玩6小时lol,凌晨3点睡觉。
这种生活也许称得上清闲,40年后过这样的生活的话我也许会满意。可问题是现在的我完全不能承受这种被搁置的生活,每时每刻都是煎熬。
我心里还是那个迫切需要吸收新知识新技术来维持快乐和满足的年轻人,但我的无力也显而易见——我很难扭转已经步入轨道的生活状态。借口也好什么也好,现在的事实就是如此。
现在手里唯一可以抗衡这股惯性的武器,就是“6月底完成demo和求职简历一起投出去”的这个决定。每天6小时lol,别说demo了,清醒地工作这个底线都快完不成了,但是有“截止日期”这个倒计时加速器在,我对完成demo还是抱有一定自信的。结果可能是各种妥协,比如放弃移动平台,只做html5版,甚至只放截图和描述,不提供在线访问的连接等等,但肯定会在妥协到某一步的时候完成demo。毕竟是有着“每一届寒暑假都能且只能在最后一天(在有一定偷懒的基础上)完成作业”的传奇般的男人,哇——哈哈哈哈。
在截止日期发挥功效之前的这段低谷,就让我用lol(和伏特加)麻醉自己吧!

/* 

一个混淆数字userid的简单方法

效果是 encode: 1234 => 48915174

decode : 48915174 => 1234

*/ 

function encodeNumber( $number, $modulo, $prime ){
    return ( $number * $prime ) & $modulo; // &操作等价于取模
}

function decodeNumber( $code, $modulo, $primeInverse ){
    return ( $code * $primeInverse ) & $modulo; // &操作等价于取模
}

// 例:
// magic number 可以用在线工具事先算出来 http://planetcalc.com/3311/
$modulo = pow( 2, 26 ) - 1;
$prime = 7381371;
$primeInverse = 5555;

$id = 1234;
function show( $number ){
    global $modulo, $prime, $primeInverse;
    $encoded = encodeNumber( $number, $modulo, $prime );
    $decoded = decodeNumber( $encoded, $modulo, $primeInverse );
    print_r( [ 
        "id" => $number, 
        "encoded" => $encoded,
        "decoded" => $decoded,
    ] );
}
show( $id );

----------------  代码文字分隔线  ----------------

有兴趣可以在 http://www.compileonline.com/execute_php_online.php 上演练一下,复制粘贴就好。

简单介绍一下。

出处是这里,我是从stackoverflow上看来的。原理是利用模逆元素的特性,blablabla。
模用2的幂减1是为了求模计算的效率。

限制是可以混淆的数字不能大于模,否则编码后的数值会有重复,或者说会从头开始新一轮循环。
另外这毕竟不是加密,用途类似base64吧,不过不会像base64那样一眼被人识破然后被轻易解读。

密码保护:做一个有偏见的人

06.11.2014, 要查看留言请输入您的密码。, 未分类, by , 1,205 views.

这是一篇受密码保护的文章。您需要提供访问密码:

手游outgame部分的php工作真的是无脑体力活,纯粹的把企划书翻译成sql代码而已,学不到东西又得不到闲。

这种东西写10年也没有什么积累,高中生教育一下再写3个月一样能代替你。

目前这种东西我已经写了半年了,下一个项目貌似还要让我干这个= =

这还不认真准备跳槽就是对自己不负责了啊,
功能先放一放,专心提高卡牌demo的美工部分,做到可以见人了就去找工作吧!

上海,我来了!

04.07.2014, 11 条评论, 未分类, by , 6,102 views.

五一回家,机票多少钱也要回!

用cocos2d-html5重现一个示例的时候,总是出现各种诡异的显示bug。一开始不够重视,只是让自己的代码越来越接近原本的示例代码,但眼看我整个复制粘贴都不能重现,我就急了。
示例是cocos2d自己的大sample,有一部分framework的,我不能全复制,所以我开始还是怀疑框架中某部分我没有做到。但是朝这个思路走怎么也走不通,甚至一点点苗头都没有,我折磨得肚子都疼了。
真的,因为心急而导致如此明显的生理反应,这已经是多少年不见了……搞不好是第一次遇到这种情况(汗)。
好,你不仁,莫怪我不义。于是开始逐行深入地跟踪,对照着同时单步调试可以正确运行的示例和我的程序。
突然!我发现在让程序停在某个断点处再重新执行的话,断点后面的部分就可以正常显示了!我靠,还有这种bug?我最先想到的是多线程bug,但是在想不通这框架哪里需要用到多线程呢。一边琢磨,一边拿到firefox下试了试,同样是断点后的程序执行正常,排除了跨平台bug的可能。有这个线索就好办了,我一行一行移动这个断点,找到一个关键行“default_item.setSize(default_button.getSize());”。调试时发现getSize值正确,把断点下在下一行,set的结果为0。这样看来是setSize比较可疑吧。一看,setSize果然不是单纯的赋值操作,里面根据几个flag,行为会完全改变的!其中有一个根据this._running来改变行为的逻辑,我想了想,是不是多线程,让这个_runnding时false时true,所以我得到的结果时好时坏呢?朝着这个方向又调试了半天,无果。至此,我调试中作出的每一个预测都落空了。我终于对自己失去了信心,开始无脑单步调试。最后发现getSize的返回值是0(刚才为什么不是0!欺骗我的感情!)。再进一步,是图片取到的size是(0,0)。到这里,我总算是正确理解到问题的原因了。回头想想,确实,helloworld那种只有三张图片的程序里都有一个resource.js文件,还正儿八经的预读了一下,看来预读是很有必要啊。再细追踪了几步,确实是取的图没有在cache里,从这里开始和示例程序的执行流程不同了。这就可以了,不跟踪了,三两下填上预读列表,再试,成功。
其实我之前所在的C++3D射击游戏项目组一直是异步读取图片的(我估计大型游戏都需要异步读取资源)。明明有轮询资源读好了没读好了没的模式的编程经验,自己遇到时却完全没有想到这个原因。反省了一下,应该是我平时自己写程序规模都太小,全是同步读取资源,这么多年思维定势严重了。得赶紧找个大项目参与一下,换换脑子了。

最近写代码的积极性非常差,想想去年白天读代码,晚上学D3D9的旺盛斗志,深感惭愧。

于是今天买早饭时顺便买了速溶咖啡和咖啡用牛奶,准备尝试一下传说中的程序员的觉醒剂了。

咖啡这东西,高中时代为了晚上不困,整包倒嘴里当药吃过几次,无奈当时作息是雷打不动的10点45睡4点55醒,咖啡也没能改变什么。而且现在看来,当时根本是黄金作息,我为什么要尝试晚睡呢,莫名其妙。
印象最深的一次咖啡生效是硕士论文截稿前冲刺的时候,靠同学的一桶咖啡,连写了31小时论文,又因为后劲,最后达成40小时不眠的个人记录。当时真的是感觉到自己进入了一个神器的状态,虚弱,但不困不累,平时活跃得烦人的各种突发奇想都平静了,脑中只处理主业相关任务,有点像考试时的高度集中状态。当然,那肯定也和事关毕业与否的外部条件相关...
总之这次是重新开始挑战咖啡了,希望它带我回到疯狗一般的麻木开发状态。