临放假前和同事以及哥们一起买了PS Vita准备欢度龙年,裸机+8G卡=¥2390,略贵,但便宜的美版还要一个月,等不起。
回来后就升级到了最新版本软件(两次,够频繁的),游戏也及时升级了,没出现过死机现象。
和之前在网上预先看到的相同,屏幕、机能的改进不是一星半点。主屏上的图标有明显的马赛克,后来仔细一看是3D模型造成的,屏幕本身就算屏气凝神也几乎看不到像素点的边界。既然屏幕大了,必然整体尺寸比PSP大了不少:

游戏方面不锁区确实很好。《神秘海域》值得入手,画面效果和游戏时间综合来看性价比不错。《三国无双NEXT》卖得也太贵了,1.5G的游戏容量,而且只有一条故事线原来是还没玩通的缘故,本作依然有光荣最喜欢的架空历史,虽然把刷各种奖杯的时间算上能延长不少游戏时间,但整体来说比《神海》还贵的价格真是让人觉得诧异。《天启之王》的手感不错,游戏方式类似于MH,如果没有人联机的话乐趣会大大减少。

PSV自带个有趣的功能NEAR,可以看到附近的玩家和热门游戏,例如我周围方圆1公里范围内有60多个人在玩(这么多?今天已经74了)。

总体体验非常好,掌机的未来还会是“专一”功能的。如果玩了3DS和PSV,还有人鼓吹手机游戏是便携型类型游戏的未来,那真的只能笑而不语了。
28 一 2012 in 游戏
Comments [0]
这几天在刷PSV奖杯,结果看到这么个东西:微软的Visual Studio Achievements扩展。

作用就是在程序员完成一些“成就”后给予提示和记录,获取相应的称号。例如:
- 在一个类里面声明100个成员变量(Field Master)
- 一行代码写300个字符(Scroll Bar Wizard)
- 使用“Close All But This”10次(Obsessive Compulsive Disorder)
- ……
看来以后可以加班刷成就啦!
19 一 2012 in 程序
Comments [2]
去年因为项目需要临时学了一段时间Objective-C,可惜直到现在都适应不了这门语言。学习过程中根据不同主题记了一些东西下来,发出来共享,但愿能帮到一些同为入门菜鸟的Objective-C学习者,不过笔记中肯定有错,这个我比较有自知之明。笔记中的所有时间表达(昨天、这段时间)都不以现在为准,因为是好几个月之前写下的。
目录
- 构造和拷贝构造
- 动态特性和RTTI
- 内存管理和标准C区别
01构造和拷贝构造
首先是有关构造函数
我想实现子类基类不同数量参数的构造方式,结果昨天试验了几种方法都不行。
参见下面的代码,Person是基类,实现了一个两参数的构造函数initWithArgs。子类Coder重载了这个方法,多了一个参数,试图重用基类的方法:
// person的构造函数
- (id) initWithArgs : (NSString*) aName andAge:(int) aAge {
Person* person = [[Person alloc] init];
[person setName: aName];
[person setAge: aAge];
return person;
}
// coder的构造函数
- (id) initWithArgs : (NSString*) aName andAge:(NSInteger) aAge andLanguage:(NSString*)aLanguage {
return ??? //这里要返回什么
}
结果昨天尝试了N种方法,全都不行!
// 不行, crash!
if ( self = [super initWithArgs:aName andAge:aAge] ) {
[self setLanguage:aLanguage];
}
return self;
// 不行,没有crash,但是基类的参数name和age都设置失败
[super initWithArgs:aName andAge:aAge];
[self setLanguage:aLanguage];
return self;
// 好用,但我们的基类构造函数不就没用了吗
Coder* coder = [[Coder alloc] init];
[coder setName:aName];
[coder setAge:aAge];
[coder setLanguage:aLanguage];
return coder;
问题在于基类的构造定义,要用[self class]获取到当前self指针的类型才对
Person* person = [[[self class] alloc] init];
子类的构造函数:
Coder* coder = [super initWithArgs:aName andAge:aAge];
[coder setLanguage:aLanguage];
return coder;
或者用更单纯一点的调用:
[self initWithArgs:aName andAge:aAge];
[self setLanguage:aLanguage];
return self;
Read more >>>
17 一 2012 in 程序
Comments [1]
终于到了2011最后一天,可以发各种总结了。阅读还是用http://imnerd.org/douban/进行统计。
题外话:动画和游戏
至于动画、游戏什么的,自然用Bangumi的年鉴功能。懒得单发,记录在此了:
「Bangumi 2011 年鉴」 2011 年,我看了 28 部动画,读了 本书,听了 1 张音乐,玩了 7 部游戏,看了 1 部剧集,参与了 73 次讨论,进行了 0 次条目编辑。
在这28部动画中印象最深刻的是还在放送的《ちはやふる》(歌牌情缘),游戏里面觉得最好的是一款老游戏《枪声与钻石》。当然今年玩游戏太少了,而且基本都是PSP上的AVG,最近这三个月已经写了大概四篇相关的玩后体会。
数据
回到正题,2011年的阅读数量为112,较之前年回落较多。原因不外乎是工作太忙,另外则是去掉了漫画,轻小说也只保留第一卷,确保统计水分不太大。

尽管如此,其实这112本书中有80%还是推理小说/轻小说,专业书以及学习类书籍大概只有10本……?所以推荐列表还是从推理小说开始吧(书籍链接在图片上)。
推荐的推理小说/轻小说类作品

- 东野圭吾《新参者》:带有主线的短篇集,东野今年在华语地区出版的最好的一本。本来对加贺刑警系列(为什么要专门写成刑警系列……一定不是《便当》的影响)并不感兴趣,但此本改变了我的想法。
- 虚渊玄《Fate/Zero》:爱的战士真的有两把刷子,比起Fate/Zero来说,Fate Stay/Night就是青春偶像剧了。
- 若竹七海《我的日常推理》:被喜欢/厌恶两个极端明显的一部推理作品,有人认为诡计是故弄玄虚,有人觉得喔喔喔这个安排简直超神了。我最喜欢里面利用虚拟的“公司杂志”目录作为章节分隔的做法。
- 小酒井不木《恋爱曲线》:日本侵华战前的推理集子,其时髦程度放在现在也很高,整本读下来非常痛快。
- 奈須きのこ《空之境界》:先看的动画剧场版,文字的力度甚至强于直观的画面表现。
- 逢坂刚《百舌呐喊的夜晚》:够冷够硬但又好读,简体也要买本!
其他类别的书籍推荐

- 禄是遒《中国民间迷信(崇拜)》系列:徐家汇藏书楼的良心作,虽然每本都是薄薄200-300页卖到40块,但总体来说是一套很有趣的风俗讲解和记录丛书。
- 艾伯特《神奇的二维国》:小说形式的科普读物,要考虑到这是1884年的作品,那只有用“神作”才能形容。希望大家都读读,为适应二向箔打击带来的新世界做好准备。另外推荐给妄图二次元去把虚拟妹子的2D厨。
- 杨显惠《夹边沟记事》:神作。
- 王爽《汇编语言》:从未见过一本语言类教程能写得如此让人看完一章还想看下一章。在遇到此书之前数次学习汇编都是半懂。用了半个月的业余时间看完后顺利入门。
- 比目鱼《虚拟书评》:之前在比目鱼Blog上看到这种形式的文章,太好玩了。见到此书变为实体还以为也是虚拟的……
- 王新禧译本《徒然草·方丈记》:王老师文笔真是巨好——除巨好以外我词穷找不出其他可形容的了——古风浓郁但又读起来不晦涩 (当然是对于我这种古文门外汉来说) ,实是译文典范。
- Jeffrey Richter《CLR via C#》:夯实基础的必备知识,对于.net程序员来说不是只知道string有多少方法就行了。
雷区
既然有推荐肯定也有扫雷:
- 内田康夫《贵宾室的怪客》
- 东野圭吾《以眨眼干杯》。骗版税代表作。看完《新参者》再看这部,都会以为“东野圭吾”是个拥有数名文风迥异水平有天地之差的作家的写作团体。
- 麦家《风语》系列。作为麦家的死忠读者,我都以为买到盗名之作了。
- 二阶堂雷人老师的一切作品,以《双面兽事件》为代表。
31 十二 2011 in 读书
Comments [0]
第5章 构造析构和拷贝
虚函数
对于抽象类而言,是否应该自己负责初始化类内的数据成员?(别忘了抽象类也可以有非纯虚函数和数据成员)
- 一般情况下被认为子类要负责从基类继承来的数据成员的初始化
- 或者基类必须提供一个显式的构造函数用于自己数据成员的初始化
- 最好的方法则是将行为和数据分离,提供接口专门用于定义方法
class A_B
{
public:
virtual ~A_B() = 0;
virtual void Say() const = 0;
inline char const* GetData() const { return iData; }
protected:
A_B( char* aData ) : iData( aData ) { }
protected:
char* iData;
};
inline A_B::~A_B() {}
class C_D : public A_B // concrete derived class
{
public:
C_D( char* aData, char* aData2 ) :
A_B( aData ), iData2( aData2 ) { cout< <"c_d ctor"<<endl; }
virtual ~C_D() { delete iData2; }
virtual void Say() const { cout<<"c_d says: "<<iData<<endl; }
void Say2() const { cout<<"c_d says2: "<<iData2<<endl; }
public:
char* iData2;
};
纯虚函数
- 拥有定义的纯虚函数(这还叫纯虚函数么)可以在子类中进行调用。不过就是什么用都没有罢了。
//定义
inline void A_B::Say() const { cout< <"hey!"; }
//调用,发现hey!并没有打印出来
virtual void Say() const { A_B::Say(); cout<<"c_d says: "<<iData<<endl; }
- 实际上是否让纯虚函数拥有(没用的)定义由程序员说了算。
- 但唯一的例外是纯虚析构函数,必须像上面那样进行显式定义 A_B::~A_B() {}
- 否则就会出现错误,严格来说并非编译错误,而是链接错误。
- 原因很简单,析构函数和构造函数一样,子类的都会由编译器进行扩充,调用基类的版本。
- 不希望这么定义的话,解决方法只有生命非纯虚的析构函数
Virtual Specification
- 不加选择地将函数设定为virtual在效率上会不升反降,不能依赖编译器的优化
- 应付const也会令人头疼,例如在基类中不需要修改的const ref或者const pointer,到了子类就需要修改了。目前最好的方法是不用const(……无语)
- 需要考虑到的(不全)
- 抽象类的构造函数需要负责初始化自己的数据成员,可以声明为protected避免外部访问
- 缺少多态需求的函数不要设定为virtual,尤其是inline函数
- 慎用const,除非确定派生类也不会修改const修饰的对象
14 十二 2011 in 未分类, 程序
Comments [2]