尝试Git中

今儿终于成功把一个svn的项目迁移到了git上。之所以用git不用svn是因为这个项目文件太琐碎,托管项目的服务器走svn实在太慢了。昨天恰好发现它已经提供了git支持,于是乎就决定尝试一下。话说加了新feature为什么没有给我邮件通知啊,这家做SCM的太低调了。当然,我最终没用hg的原因也很简单,因为没有hg嘛……= =b

由于我用svn用的比较随意,大部分时间是当一个文件管理工具来用的,所以转移到git的时候被branch这个东西搞了半天,怎么也想不通要如何映射到git上。仔细琢磨了一下,发现git和svn在概念上是有本质上的区别的,很多文章用类比的方法来讲svn迁移到git是不合适的。譬如svn是可以单独checkout某个目录,而git如果想clone就必须全部搞下来。例如我总觉得svn的repo建起来比较麻烦,所以经常在trunk下同时搞着几个独立的project,这时候就很难直接把svn整个映射到git中。

而且git的强项不单单是分布式管理,还有强大的branch,所以按照svn的思路来用git也纯属蛋疼,没什么实质意义。因此我考虑比较合适的映射方式不是用git-svn把branch, trunk神马的直接搞成git的branch和master,而是需要先分析一下svn中的项目构成,逐个目录的建立git repo。例如原先我可能在trunk中放了好几个project,foo1和foo2,那么我觉得比较合适的方法是各搞一个git repo来管理。

全部搞定之后,托管服务器的SSH Public Key一直不生效,搞了大半天。最后终于成功push,平均速度达到80k/s,相当给力。

Android版SDL编译

NDK刚刚发布的时候,我想试试看怎么用于是去找了个开源的游戏,发现这个叫做《Alien Blaster》的游戏源码中带着移植好的SDL。最近搜了一下,这个作者貌似专心去搞SDL的Android移植了,具体可以看http://libsdl-android.sourceforge.net/。众所周知SDL是个适用范围挺广的跨平台图像库,所以这个东东一旦被移植到Android上,很快就可以出现一大堆其他移植作品。

于是从github上得到最新的代码,我开始尝试在cygwin下编译它。相比起早先的那个alienblaster项目,这个sdl-android的编译还挺诡异的,主要是作者自己在makefile外面包装了一堆自动化的东西,再加上linux和cygwin不完全一样,折腾了半天才搞定。稍后再吐槽……

先得确定NDK的版本,按照他目前的说明得用r4b,而SDK版本需要2.2,不过编译出来的程序可以跑在1.6上。在这里我不得不吐槽这帮搞android的家伙,头三个NDK版本都做的无比奇怪,想编译还得把自己的项目放在NDK的app目录下才行。到了r4终于不用把工程目录诺来挪去了,结果SDK的tools目录内容又起了大变化。还真是热爱折腾啊……

在确定NDK工作正常之后,进入sdl-android里面那个commandergenius目录,需要编译的脚本都已经放在里面了,可惜在Cygwin下需要修改才可使用。首先是他在代码文件中用了linux下的符号链接,目前发现的就是sdl-1.2里面很多文件都是链接到1.3里面的,需要修改。我是选择把1.3里对应的文件直接拷贝到1.2的目录里,省得麻烦。

在project/jni里面是各种lib的代码,比如我们最关心的SDL,还有其他一些开源的库,project/jni/application里面是各种独立的应用。按照readme里面的介绍,想编译哪个应用,就通过ln命令,把project/jni/application/下的源码目录做符号链接到project/jni/application/src,然后进行编译。这样makefile始终是编译project/jni/application/src下的东西。例如按照readme里面说的:

rm project/jni/application/src

ln -s ballfield project/jni/application/src

然后就是比较奇怪的地方了,这个作者喜欢在编译期决定各种配置,执行ChangeAppSettings.sh -a会生成一个配置文件,然后根据配置文件又修改了project/java下的java代码模板拷贝到project/src中。主要是配置项目有将近20个,执行脚本的时候会不停的询问各种问题,搞得无比烦躁。其实都是可以在运行时修改的东西没必要在编译期出来烦人的。后来发现每个appliction下的目录中都有一个现成的AndroidAppSettings.cfg,可以把这个直接拿来覆盖掉commandergenius/的那个,这样每次提问开始的时候直接回车就可以使用默认配置。

这步执行完毕之后再执行android update project -p project得到build.xml用于编译apk。至此就完成了一大半了。

接下来修改build.sh,把自己的NDK路径配置好。值得注意的是NDKBUILDPATH里面如果有空格记得加上引号,例如我是这样的:

NDKBUILDPATH=$NDK4:$PATH

#.....各种省略

cd project && env PATH="$NDKBUILDPATH" nice -n19 ndk-build -j4 V=1 && \

#.....各种省略

咱对linux各种不熟,env这一行卡了好久,感谢贾生同学指点迷津。嗯嗯,最后调用sh build.sh就可以开始编译了。基本上是执行了ndk-build之后再使用ant来编译java代码,大概都觉得eclipse太重口味了吧……build.sh里面包含了对adb install的调用,所以记得把SDK的platform-tools目录也加到PATH中。手动进入project目录编译lib,然后用eclipse编译安装也一样。

总结一下,我个人觉得这个SDL的移植版还是比较有用的,可惜java端的包装就有点粗糙了(或者说繁缛)。所以自己想用的话,还是得做一些额外的工作才行,除非接受作者的设定,例如从AndroidData或者设定的url下载数据自动解压安装屏幕上有奇怪的软件虚拟键盘还有要填写十几个问题的config问卷什么的= =b

强烈的失忆中

整理一个旧坑的时候,怎么也想不起来代码是基于哪个版本搞出来的。各种回忆加分析最后才理清了头绪,其实也就七八个月没有碰嘛,怎么就忘得干干净净了呢。

然后吐槽一下svn的诡异的扫描文件方式……假如我单独check-out目录/branches/foo到某处,比如c:\foo,然后check-out整个/branches到某处,比如c:\branches。当我用c:\foo替换掉c:\branches\foo之后,对foo的更改必须在foo目录下做commit才能感应的到。如果是在c:\branches下做commit,则TortoiseSVN表示神马更改都没有发现。

也就是说,branches下面的foo必须是它自身check-out的时候搞出来的才算数……唉……就因为这个问题,漏提交了几个文件,直到今天搞大清理才被我发现。

怒吼之后

其实SC2已经1个多月未上线了,MHP3准备减速,毕竟已经220个小时了,剩下个岚龙慢慢搞死就行。为了武器而刷素材什么的,我肯定会上瘾的,需要节制一下。

所以说,该干嘛了?

这就是人生啊

iPad居然降了1100块,于是果断入了。其实本想入个什么ViewPad 10s尝尝鲜的,这下不用纠结了。

我觉得平板这种东西,3000左右的价格才是可以接受的,太贵的话就没劲了……好吧,我作为一个月光族有这样的想法也是没有错的嘛。接下来体会体会平板到底是个怎么回事的东西,然后静待Xoom降价= =b

MHP3和SC2差不多都停了,估计SC2还有断断续续的玩一玩,毕竟连白银都没有到有点说不过去。而最无力的还是PS3吧,灰尘已经能看到了……所以我真的不该搞白色的版本。

2011开场很不错,年内要加油了。填坑填坑……

SC2如火如荼

隔了一年才真正开始玩SC2,我可真够能忍的。

话说当年SC刚刚出来的时候,我第一时间玩穿人族剧情。然后发现大家都打对战,没人理剧情是怎么回事。我尝试参与,结果被狂虐几把几次之后失去信心从此不碰对战。后来War3出来,下决心练习NE,结果还是玩了半天剧情木有怎么折腾对战,被各种虐之后再次放弃。再后来是神马3C啊,DotA啊,统统在试了试之后缩卵不玩了。我不喜欢研究和人对着干的游戏,挫败感太强了……果然我骨子里是个安安静静看剧情的RPG党……

不过这次SC2不同,它的战网系统做得不错,电脑自动找排名相近的来战,还是有机会打赢的说。于是再次燃起了对战的欲望!几天下来,已经被狂虐几十把,还好赢了那么几次不至于彻底崩溃。看了那篇100天钻石的故事,我觉得我花100天从青铜到白银应该不是奢望吧?

当然,作为一个RPG党,剧情第一时间已经通关了。虽然很多人评价一般,但我觉得关卡设计的都不错啊,可惜的就是剧情中的很多科技在对战里面是木有的。期待下一部的虫族故事吧,女王会带来怎样的惊喜呢?玻璃渣你别老鬼扯什么萨尔纳加了,多讲讲女王的故事吧=v=

12月……呃

怎么一下子就月底了啊!到底发生了什么啊啊啊啊啊!

话说因为帝都明年要限车……所以在年底大败家入了一堆电玩产品……(到底有什么关系)

呃……其实我想说的是,电玩产品相对于枪车球(误)来说还真是廉价的消费啊。

接下来就是在年底的假期中high一下,哼哼~

12月必须不忙

c++,GUI

(动笔于2010年12月6日晚11点40分,搁置若干年之后于2018年4月3日补完)

眼看着2010快到头了,再不写的话,真要成微博了。由于我追求的是博大精深,微博不符合我的世界观价值观人生观,所以我必须多写两句。(补记:谁知道我直到2018年才放弃微博=v=)

俗话说吐槽要趁热,挖坑要趁早,时间一长就没兴致了。我本来想大力吐槽某个诡异的Win32API,时隔2个月,我都记不太清楚细节了。总之,故事是这样开始的……

在一个阳光明媚春暖花开的日子里,我决定使用API画一个窗口。

自从Windows诞生以来,就有无数仁人志士前仆后继翻来覆去的画窗口。更有蛋疼者,不喜欢方形的窗口,非要搞成其他形状。于是M$提供了SetWindowRgn,满足了他们搞怪的欲望。

然而蛋疼是病,得治。在M$的娇惯下,蛋疼的人们不满足于这种用Region来定义外形的方式,因为各种奇形怪状的窗口已经成为流行趋势,仿佛用方形的外观就是土老冒儿(补记:2018年再看特别有意思,现在又流行方块和扁平化了)

总之长话短说,我阅读了API手册,准备好Mask图层,设置Colorkey,在WPF里调用Win32API,终于成功的搞出了镂空效果。也许WPF有什么其他设置可以完成同样 的工作,但我实在懒得研究这个庞然大物了。

本以为大功告成,然而程序在WinXP上运行效果正常,放到Win7就变回了难看的方形窗口,似乎Colorkey完全失效了。

在GetLastError()也没有报错的情况下,我百思不得其解。上网研究查询了一大堆文档之后也没有头绪,只能随便乱试。结果意外的发现,我只要使用“纯绿色”来做为Colorkey,这个Mask就可以生效。

这样一来总算凑合能用,我隐约猜到了问题的原因。于是乎联系了M$的朋友,拜托他帮忙看看这API的实现到底是肿么回事……

侯捷大大说过,“源码面前了无秘密”。朋友告诉我,Win7版的API不知道为啥把RGB的顺序调整了。果然是RGB在新的代码里被认成了BGR,当Colorkey包含其他通道的数据,颜色就乱掉了。如果只有Green通道,就能阴差阳错的避开这个坑。

事到如今真相大白,也不知道这算不算Bug,或许只能去问The Old New Thing的作者了:)