Author Archives: mine260309

西山自驾-艾威学友会活动-流水帐

    今年的艾威学友会活动很多,计划中会有三次旅游,5月下旬,正是采枇杷的好时节,西山自驾就成了今年的第一次旅游活动。

    周六早上,车队在G42江桥收费口集合,8辆车,26个人,分发手台,贴好车标,向苏州西山出发~
    车队的Ground Rule很简单: 1号车作为头车,不能超;8号车作为尾车,保持在最后;一切路线听头车。
    不过,再怎么简单的Ground Rule,假如有沟通问题,也很容易出事——这不,在将要转向苏州绕城的时候,本来车队需要先停一下以确保大家都一起转,但是沟通太晚,结果有某车不小心错过了这个口,于是车队不得不继续前行,然后从苏州新区出来一路往南到了西山,比计划的时间晚了大约1个小时。。。

    到达西山,在农家确认好住宿,直接爬山,目标缥缈峰。这回的爬山,那真是爬山了,没有台阶,只有野路和山路,还有无数的花草树木,枇杷、青梅、杨梅、石榴,各种水果都有。现在是枇杷的时节,路上偷吃几个,心情愉快~
    缥缈峰并不高,很快就登顶了,看来各位学友体力都不错。山顶上号称“太湖第一峰”,还有一个国家测绘局的地标,不知道干嘛用的。

    晚上的活动,还是一如继往的“干瞪眼”了,这个超简单的扑克,人越多越起哄越好玩,这回最多9、10个人一起玩,很有意思的,尤其是老杨一共参加了了两把,都输了,钻了两次桌子。。。
    10点半之后,很多人都睡去了,剩下几个夜猫子开始夜观天象,无数的星星,说明这里的空气真是不错的。在Google Skymap的帮助下,又认了一把北斗七星,北极星,火星,织女星,etc…
    btw,这回睡的大斌的帐篷,总算学到了怎么支帐篷,怎么把睡袋收起来(卷一下很难塞的说),新的体验感觉不错,准备去搞个帐篷了~

    第二天早上,开始摘枇杷,这户农家的枇杷树也在山里,农家带着我们到了他们的树下,关照好不要去摘别人的树,大家就自由行动了。刚从树上摘下来的枇杷确实新鲜,有的还有点酸,但酸得正好,比只有甜味没有枇杷味的要好多了~ p.s. 摘枇杷20元/人;带出来20元/斤。卖得有点小贵,如果只想买枇杷,建议下午在路边买,最便宜的有30元/篮(大约5斤)

    中午去包山禅寺“化缘”,没错,差不多真的算是化缘了——一行人饥肠辘辘地来到包山禅寺,发现和尚们已经用完餐了,木有吃的;后来在一位和尚的指点下,找到了做饭的地方,他安排好了厨房做了两大面盆的白菜豆瓣素面,至于多少钱,俺们施主放到功德箱就行。
    包山禅寺很清静,香火不断的殿堂,池塘里晒太阳的乌龟,看上去似乎得道的狗狗,和尚们收留的小猫,一切都很和谐的感觉。

    大斌在这里联系上了寺院的“CEO”,介绍俺们去了在建的观音寺,规模不小的工程。有幸在这里近距离接触了正在建设的观音像,摸一下如意、抱一下佛脚,但愿一切好运。

    回上海的时候,顺路去了传说中的废弃电厂,很久以前俄罗斯留下来的一个建筑,红墙穹顶,很有特色。似乎是个无主之地,俺们很yy地讨论怎么改造它,有的说搞个“西山红楼”,有的说搞个别墅,俺想了个名字“西山回眸”,自我感觉良好,哈哈~

    考察完电厂,在西山的太湖大桥上堵了很久很久。。。直到上了高速,才很爽地一路开回上海,这两天的西山自驾也就完满结束鸟。

Share

Android上的psf播放器 MinePsfPlayer

很久以前就想在Android上做一个psf的播放器,耽搁了许久,现在总算搞出了第一个版本。

稍微介绍一下历史:
1) 最早是基于sexypsf library (http://projects.raphnet.net/#sexypsf),在PSP上写了一个能播放psf音乐的demo;不过后来不知道什么原因,没有继续做下去;
2) 后来发现了Audacious,一个从XMMS派生出来的开源播放器,里面有psf plugin,从code里看,psf的解码也是基于sexypsf的,但里面还包含了psf2的lib,在linux上工作良好;
3) 于是用了这个lib,在SDL库的基础上写了一个demo,可以在Windows/Linux上可以播放psf的demo;
4) Android出来之后,就想在上面写个psf播放器,不过刚开始没有NDK,感觉搞不定;
5) NDK出来之后,终于可以在android上写一个播放psf的demo了,在模拟器上跑,效果惨不忍睹,解码得太慢了;当时还没有Android手机,以为性能会有问题,作罢;
6) 买了Milestone之后,在实际的手机上跑了一下,发现性能上基本上没问题,但是有各种问题(实际上是code里的bug),当时在搞短信震动的app,psf的播放又往后拖了很久;
7) 现在终于搞定了psf的播放器!(在手机上听各PS经典游戏的原声,内牛满面啊)

TODO: 最高优先级的当然是PSF2的播放,这样就可以在手机上听FFX的音乐了,但愿不会拖太久。。。

总之,欢迎下载~
https://play.google.com/store/apps/details?id=com.mine.psfplayer
MinePsfPlayer_GooglePlay

Share

杂记(2012.04)

· 四月份的活动似乎还不少,两周前在艾威玩了桌游,昨天又去桌游展逛了一下,见识了几款很经典但以前没玩过的桌游。
“卡坦岛”和“七个奇迹” – 都是占领、获得资源,然后发展商业(或者科技、军事)、获得新资源,最后计算得分的游戏。卡坦岛兼具策略性和运气,因为还是要靠掷骰子的;虽然知道各个数字的概率,但有的时候你想要的资源就是得不到,很没脾气。七个奇迹也很有策略性,运气成分会稍微小一点,基本上一开始就要规划好走哪条路线,想回头是很难的。。。
在桌游展上玩了“地产大亨”和“万智牌”。地产大亨乍一看很像大富翁,也是买地收钱,不过似乎更复杂,有红、黑建筑可以限制对方。可惜现场的coach很不专业,很多规则都不懂还得让我来看说明书。。。
万智牌是经典的卡片游戏了,有点类似“游戏王”(或者说游戏王是跟它学的)根据“资源”召唤各种怪物或者魔法,各种攻击与防御,可谓博大精深了。买了一幅新手包,有兴趣的可以一起玩,呵呵。

· 上个周末公司春游,去了宁海温泉与浙东大峡谷。温泉嘛都类似,不过服务还挺好的。浙东大峡谷,更确切地说是小峡谷,环境是很不错的,但真的很小,而且人为的因素很明显,各个“景点”都有点生搬硬套的感觉。不过不管怎么说,青山绿水,瀑布碎石,在里面走走比在办公室里上班要好太多了,哈哈。

· 在Kindle的帮助下看完了《Steve Jobs》,除了教科书外,这算是第一本我看完的英文书了,值得纪念一下,呵呵。书中大部分都是很客观地给读者展示了一个真实的乔布斯,有着”Reality Distortion Field”的商业上的谈判天才,与Wozniak这个技术天才一起创办了Apple,于是在乔帮主的带领下它的产品都追求各个细节上的完美,有了后来的Mac, iPod… 期间他曾抛弃了第一个女儿,后来后悔承认了这个女儿;他出走Apple,创办了Next收购了Pixar,后来又被请回了Apple让这个公司起死回生,到今天成为市值最高的公司。
的确乔帮主绝对是个追求完美产品的商业天才,有光辉的事迹和无数的粉丝。不过我对此只有佩服,却完全喜欢不来这样的“偶像”。
我喜欢和诚实的人共事,因此Jobs今天说A是shit明天说A是brilliant并且是我的主意,我实在觉得disgusting。
Jobs追求的完美,更多的是外形上的完美,因此你可以说iPhone iPad很漂亮用户体验很好,但是真正给用户用的功能却有各种限制,比如功能有限的蓝牙,时不时断线的wifi,不能更换的电池… (更别提不能用左手握的天线了)
最关键的,Jobs曾经是以叛逆者的姿态挑战IBM的,因此有了著名的《1984》广告。然而看Apple后来出的产品,一个比一个封闭,不给用户自由,它自己成了Big Brother。这是真正的矛盾吧。

· 《昂山素季》看完了。这不是一部很好的电影,但对现在的中国人来说,这是一部很有意义的电影。电影更多的表现了昂山素季作为一个妻子、母亲的温柔与坚强,而她作为人民追求自由的希望,却着墨不多。但很显然我们去看这部影片,更希望看到的是她是如何抗争,如何最终让政府军妥协的,我们看不到。也许也没多少人知道。
最具象征性意义的,也是我最有感触的,不是昂山素季正对着枪口缓缓向前走的那一幕,而是诺贝尔和平奖的颁奖典礼,她仍被软禁在家,只能听着收音机获知这一切。这很难不让人想起前年诺奖颁奖典礼上的“空椅子”,以及之前一直被软禁在家,最近才逃出去的某个盲人。

Share

关于C++里”Pure Virtual Function Called”的问题

前几天项目里遇到一个crash的bug,直接原因code执行时报了一个”pure virtual function called!”的错,然后挂了。
直觉上来说pure virtual function是在编译阶段就会报错的,不应该出现这样的问题。但问题既然出现了,必然是某个地方真的调用到了纯虚函数。这个问题挺有趣,搞定之后决定记录下来。

Google之,第一个结果就是最完美地解释这个问题产生的原因的。http://www.artima.com/cppsource/pure_virtual.html 不过这里稍微再解释一下。

产生这个问题的原因主要有二:
1) 在基类的构造函数里调用了纯虚函数,这个很容易理解,很显然俺们的项目里不会有这种低级错误,否则一跑就crash… 总之,这个错误就忽略了;
2) 某个继承类的对象调用一个虚函数时,这个对象已经被析构了,这时可能是内存错误,也可能是pure virtual function called

具体点,上code:

class Base
{
public:
  virtual ~Base() { sleep(1); }
  virtual void DoIt() const = 0;
};

class Derived : public Base
{
public:
  virtual ~Derived() { /*sleep(1);*/ }
  virtual void DoIt() const {
    std::cout<<"Derived::DoIt()"<<std::endl;
  }
};

void* Task(void* const p)
{
  const Base * const b = reinterpret_cast<const Base*>(p);
  while (1) {b->DoIt(); usleep(50000);}
  return NULL;
}

int main()
{
  pthread_t t;
  Derived * const b = new Derived();
  pthread_create(&t, NULL, Task, (void*)b);

  delete b;
  pthread_join(t, NULL);
}

执行结果(gcc版本4.6.1):

pure virtual method called
terminate called without an active exception
Aborted

稍微解释一下:
1) Base的析构函数里会sleep 1秒;
2) 线程里不停地调用 b->DoIt()函数;
3) 在delete b之后,继承的类Derived已经析构,而Base还存在,因此这时去调用DoIt()时就出现了pure virtual method called的error

如果想做backtrace,可以实现自己的handler。在gcc里,这个函数是__cxa_pure_virtual,自己实现一份

extern "C"
void __cxa_pure_virtual () {
  std::cout<<"In My Pure Virtual Call!"<<std::endl;
}

执行结果是:

In My Pure Virtual Call!
In My Pure Virtual Call!
...

用gdb加个断点,看backtrace就搞定了。

Share

欧冠奖杯展!

    上个周末,欧冠奖杯的全球巡回展来到上海(据说还是亚洲的唯一一站?),那肯定是不容错过的了。
    现场有最近几届欧冠决赛的介绍,大幅照片、比赛用球、签名球衣、奖牌实物,当然,最重要的,欧冠的奖杯!难得有机会这么近距离接触这个大耳朵杯啊,哈哈~
    除此之外还有前著名球星古力特、罗纳德·德波尔的签名,有AC米兰球迷说,他只要古力特的签名,我表示完全理解——因为我甚至都不想要古力特的签名。。。
    有图有真相。


99年俺们家~


08年俺们家~


Mine近距离(可惜不能零距离。。。)接触大耳朵杯

Share