愤青日志(002)——搜索引擎

据央视“新闻30分”报道 患者身体不适,上百度搜索医院就诊,结果却有假医院排在其中。昨日(2008年11月15日),央视对百度搜索引擎竞价排名提供虚假网站予以曝光。

百度CEO李彦宏一份“内部邮件”昨天曝光。李彦宏在这份发送给“同事及合作伙伴”的邮件中表示,央视对竞价排名的连续曝光对百度品牌形象造成了伤害,他为此感到“痛心疾首,并将承担全部责任。同时记者昨日(2008年11月19日)发现,在百度上搜索关键词“老虎机”时,前7条检索结果均为竞价排名结果。

本博点评:

以前不知道怎么做搜索引擎,经王小峰提醒,终于觉悟:原来,百度的搜索引擎是用Excel做的。

王小峰说的好:央视跟百度倒有点像,其实央视也有一种“竞价排名”,据说一些曝光社会问题或产品质量问题的节目经常遭遇“竞价”,谁花的钱多,谁的关系硬,谁就可以把问题压下去。

百度说:谁给的钱多,我就让谁上。

CCTV说:谁的后台硬,我的大裤衩就让谁脱。

我准备以后用Microsoft的Excel+Google的Pagerank+百度的竞价排名做一个搜索引擎,争取赶上微软做live、腾讯做soso、网易做有道、大家做搜索的末班车……

 search_engine_origin

排名前

  search_engine

排名后


索引:

CCTV.com 2008年11月17日 11:36: 百度竞价排名被指含假网站 涉嫌屏蔽不交钱企业

CCTV.com 2008年11月20日 08:53: 李彦宏发内部邮件“道歉” 敏感关键词仍在竞价

CCTV.com 2008年11月20日 10:03: 李彦宏:法律没有要求百度对付费信息负责

王小峰 2008-11-20 12:05:23: EXCEL教程


本博愤青贴言论一律不自由


引用通告:http://www.yulefox.com/index.php/20081120/angry-youth-search-engine.html/trackback/

愤青日志(001)——政务公开

辽宁沈阳市民温洪祥递交了一份申请表,要求市财政局、审计局和政务公开办等部门,公开政府招待费等财务账目。市政务公开办相关负责人说,公开政府招待费,“国内还没有先例,政府部门财务信息又极其敏感,难度极大”。(11月17日人民日报——沈阳市民要求政府公开招待费 官员称难度极大)

本博点评:

沈阳市民温洪祥遇到麻烦了:

温洪祥辛辛苦苦挣钱,除了留点零花钱之外一律上缴给了自己的老婆。本来他是为了让老婆管好这个家,他都不敢包二奶、养情妇,结果最后让老婆把这些开销报一下,他老婆跟他耍上了小姐脾气,说什么“极其敏感,难度极大”。

温市民说:我要碰你一下,你就全身都是敏感地带,我要查你一下,你就说难度极大。平日看你似乎也没这么矜持吧?你这不是扯淡吗?

依我看,这么着下去也不是办法,之所以他老婆感觉现在全身都是敏感地带,多半是因为没有被摸过,被摸的次数多了,自然就习惯了,查的次数多了,自然也就没有那么紧了。

毕竟,这老婆嘛是为你服务的,你总不能一直带着这顶帽子,让自己的钱花的不明不白,到最后连到底在养谁都不知道吧?不能就这样一直怂着吧?

所以,给温老婆提个建议:回去该好好学学宪法、婚姻法之类的,清楚一下自己的权利和义务。相信自己的老婆是对的,但你也该展示一下你的真面目啊,天天这样不让温市民上,人家凭什么相信你啊?

政务公开 漫画/邱炯绘

 

 

索引:

11月17日人民日报——沈阳市民要求政府公开招待费 官员称难度极大


本博愤青贴言论一律不自由


引用通告:http://www.yulefox.com/index.php/20081120/angry-youth-gov-publish.html/trackback/

设计模式(三)——Singleton

不知道Singleton算不算用的最多的,平时用的时候,往往都是直接敲下面一段:

class CSingleton
{
public:
    static void Initial(void) { if( NULL == m_pInst ) m_pInst = new CSingleton; }
    static void Release(void) { delete m_pInst; m_pInst = NULL; }
    static CSingleton* GetInst(void) { return m_pInst; }

private:
    CSingleton() {}
    ~CSingleton() {}
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton &);
    static CSingleton* m_pInst;
};

不是不想改,就是懒,敲多了已经不觉得这么写多浪费时间了,按大家的说法,这样写至少有这么几个缺点:

1. 必须在程序结束前手动释放,这不仅是RP问题,如果你借了内存不主动还,说明你RP差,但被别人搞丢了(宕机)导致你还不上,说明别人RP差?所以,这还是个问题;

2. 线程同步问题,如果Singleton实例跨线程使用,上例不安全,在Initial和Release时加锁可以解决;

3. 最大的问题:不能重用。

有人给出了下面的实现:

template<class T>
class CSingleton
{
public:
    static T& instance()
    {
        static T _instance;
        return _instance;
    }

private:
    CSingleton() {}
    ~CSingleton() {}
    CSingleton(const CSingleton<T>&);
    CSingleton<T>& operator=(const CSingleton<T>&);
};

除了线程同步问题之外,其他都解决了。

至于线程问题,我们可以把多线程问题转化成单线程问题:在进入main函数前初始化。Boost提供了一个这样的Singleton:

template <typename T>
struct singleton_default
{
  public:
    typedef T object_type;
    static object_type & instance()
    {
      static object_type obj;
      create_object.do_nothing();        // 需要create_object的初始化
      return obj;
    }

  private:
    struct object_creator
    {
      object_creator() { singleton_default<T>::instance(); }  // 创建实例
      inline void do_nothing() const { }
    };
    static object_creator create_object;
    singleton_default();
};

template <typename T>
typename singleton_default<T>::object_creator
singleton_default<T>::create_object;

由于create_object将在被调用(static object_type & instance())之前进行初始化,因此singleton_default对象的初始化被放到了main之前。

非常巧妙的一个设计。

这样一来,我们可以通过下面这样一个简单的宏完成Singleton的使用:

#define GetInst(CLASS_NAME) \
    singleton_default<CLASS_NAME>::instance()

在后面需要使用到某个类的Singleton时,直接使用该宏即可。

Kevin之前提到关于静态变量的初始化顺序问题,今天查了一下ISO C++,3.6.2(Initialization of non-local objects)有段话:

// – File 1 –
#include “a.h”
#include “b.h”
B b;
A::A(){
b.Use();
}
// – File 2 –
#include “a.h”
A a;
// – File 3 –
#include “a.h”
#include “b.h”
extern A a;
extern B b;
int main() {
a.Use();
b.Use();
}

It is implementation-defined whether either a or b is initialized before main is entered or whether the initializations are delayed until a is first used in main. In particular, if a is initialized before main is entered, it is not guaranteed that b will be initialized before it is used by the initialization of a, that is, before A::A is called. If, however, a is initialized at some point after the first statement of main, b will be initialized prior to its use in A::A.

大致意思是说如果在进入main之前初始化,a和b的初始化顺序将不能确定,如果希望初始化顺序可以确定的话,就应该像上面的singleton一样在逻辑上为他们人为建立依赖。



相关链接:

Boost: http://www.boost.org

CppBlog: http://www.cppblog.com/dyj057/archive/2005/09/20/346.aspx

Wikipedia: http://en.wikipedia.org/wiki/Double-checked_locking

Double-Checked Locking: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

Kevin: http://www.cppblog.com/kevinlynx/archive/2008/11/11/66623.html


昨天还在说设计模式停了很久,今天上午coding的时候,就想写一个好点的Singleton模式。每次都要这么敲,敲多了想想也烦,之所以不想写个基类,两个原因:一是因为我对继承天生没好感,二是我对模板天生没好感。似乎水平越不怎么样的coder身上臭毛病越多啊?


引用通告:http://www.yulefox.com/index.php/20081119/design-patterns-03.html/trackback/

设计模式(二)——State

State模式对应到C++的多态特性。

State模式适用较广,这儿给出比较常见易懂的两种情况:

1. 当怪物在面对不同职业和特性的玩家时对应不同的AI处理和技能释放:

CSkill* pAttackSkill;

if( pPlayer->MagicImmune() ) pAttackSkill = SomePhysicalAttackSkill;

else if( pPlayer->PhysicalImmune() ) pAttackSkill = SomeMagicAttackSkill;

pAttackSkill->Begin();

或者使用分支结构:

CSkill* pAttackSkill;

switch( pPlayer->GetOccupation() )

{

  case WARRIOR: pAttackSkill = SomeLongRangeSkill; break;

  case MAGICIAN: pAttackSkill = SomeForceSkill; break;

  case NIMROD: pAttackSkill = SomeMagicSkill; break;

}

pAttackSkill->Begin();

2. 我们也可以封装一个显式的转换接口:

CSkill* pAttackSkill;

pMonster->ChangeState(pPlayer->GetOccupation(), PAttackSkill);

pMonster->Attack();

这儿的CSkill类就是所谓的State,作为怪物的一个行为被封装,并因为各种上下文的不同而被赋予不同的实例。

上面提到的是State模式的一些使用方法并不严谨,却可以为我们探究State模式的特性打下很好的一个基础。

既然称为状态模式,我们可以将其与状态机联系起来,二者的共同之处在于状态转换状态模式中各状态之间即存在一定的转换关系,这种转换关系可以像上面的例子那样放在上下文中,也可以放到各状态中。仍以怪物AI为例,一般情况下怪物的状态转换关系如下:

Init->Find->Attack->Defence->Hurt->Dead->Relive

这些状态的某些状态之间存在多种转换,但即使是多种转换也是可以确定的,比如一个怪物只有活着并且没有被攻击(我们认为被攻击时敌人就是攻击者,不需要附加寻找状态,虽然攻击者的确定可能会复杂些)的情况下才会寻找敌人,如果怪物不是被攻击(我们认为被驯服、被诅咒、被染病都属于被攻击)的话,不会防御、受伤和死亡(被服务器Kill掉例外),如果怪物没有死亡的话也不会被复活,等等。

这样一来,状态的转换就可以放到各具体状态内部去触发,这更符合状态模式的意图本身,而状态在内部还是外部被触发和转换是没有太大区别的,因此上面讲到的例子还是可以说明这一点。

其他应用包括像:

根据服务器的不同状态确定客户端的不同行为转换:Create->Bind->Listen->Accept->Recv->Send;

根据用户的不同操作实现特定的效果或行为转换等:Select->Attack->Gain->Hurt->Dead->Relive。

状态模式本身并不复杂,抽象出各状态及其转换关系并设计出完整、合理、易扩展的模型更重要。

在学习设计模式时,也有这样一个状态模型:

读懂模式的结构->思考模式的意图->构建模式的模型->拓展模式的应用

之所以看过会忘,也是因为你对这样一个状态转换还没有达到完整、合理、扩展的要求。


相关链接:

设计模式(一): http://www.yulefox.com/index.php/20080806/design-patterns-01.html/

Wikipedia: http://en.wikipedia.org/wiki/State_pattern

Source Making: http://sourcemaking.com/design_patterns/state

Data & Object Factory: http://www.dofactory.com/Patterns/PatternState.aspx


最近一直在加班,同事在看我Blog的时候,说我的设计模式只写了一篇就没了下文。我不好意思的解释说忙,系列的文章写起来累,而且我对设计模式说不上融会贯通,怕误导别人,也怕被骂。

但这个系列的确是我非常想写完的一个系列,所以就在这儿补上,慢慢补吧,毕竟欠下的还多的很。

但为了节省时间,我能不写代码就不写代码了,尽量把模式介绍清楚就是了。


引用通告:http://www.yulefox.com/index.php/20081119/design-patterns-02.html/trackback/

你是精神病吗?

首部网络成瘾诊断标准发布 明确五种上瘾症状,10月8日,我国首部《网络成瘾诊断标准》通过专家论证。

网络成瘾指个体反复过度使用网络导致的一种精神行为障碍,表现为对使用网络产生强烈欲望,突然停止或减少使用时出现烦躁、注意力不集中、睡眠障碍等。按照《网络成瘾诊断标准》,网络成瘾分为网络游戏成瘾、网络色情成瘾、网络关系成瘾、网络信息成瘾、网络交易成瘾5类。标准明确了网络成瘾的诊断和治疗方法。

网络游戏成瘾:你玩过网络游戏吗?你上瘾吗?同学,你沉迷了。

网络色情成瘾:你看过艳照门图片吗?你看了还想看吗?同学,你沉迷了。

网络关系成瘾:你知道QQ、MSN、校园网、51网、开心网了吗?你常去吗?同学,你沉迷了。

网络信息成瘾:你看博客、播客、迷你首页、门户网站吗?你知道Google吗?同学,你沉迷了。

网络交易成瘾:你知道淘宝、拍拍、当当、卓越吗?你经常网络购物吗?同学,你沉迷了。

如果,以上五条中的任何一条中的两个问题中的任何一个问题你的答案都是:嗯(或者是、对……),告诉你一个很不幸的消息:同学,你网络成瘾了。

如果,你早就知道你是网络成瘾,那么,再告诉你一个不幸的消息: 网络成瘾被正式纳入精神病诊断范畴,也就是说,你成为一名精神病患者了。

以下内容为本人不经意Google到的,不具有任何意义,请勿YY:

我国刑法第十八条规定:“精神病人在不能辨认或者不能控制自己行为的时候造成危害结果,经法定程序鉴定确认的,不负刑事责任,但是,应当责令他的家属或者监护人严加看管和医疗;在必要的时候,由政府强制医疗;

间歇性的精神病人在精神正常的时候犯罪,应当负刑事责任;

尚未完全丧失辨认或者控制自己行为能力的精神病人犯罪的,应当负刑事责任,但是可以从轻或者减轻处罚。”

本人严重网络成瘾:经常玩网游、偶尔看艳照、天天挂MSN、时时看信息、很少搞网交(网络交易),经本人初步诊断为间歇性尚未完全丧失辨认或者控制自己行为能力的精神病患者

我是精神病,你是吗?

这年头,如果你不是精神病是要被鄙视的哦:没有网游成瘾、网交成瘾,说明你在当前严峻的全球金融危机面前不能拉动内需;没有网络色情成瘾、关系成瘾、信息成瘾,说明你不能与时俱进、不会搞好关系,影响民族团结、社会和谐

估计这样一来,也就制定《网络成瘾诊断标准》和参与实施(医院负责诊治)的这帮人肯定是没有精神病了。

我看,以后大家会这样骂人:你才没精神病,你们全家都没精神病


引用通告:http://www.yulefox.com/index.php/20081117/are-you-crazy.html/trackback/

无名的创造力

前几天在云风的Blog上看到一个网友下面的评论,当时没有太多注意,但还是有印象,今天想起来什么,刻意找来:

克里希那穆提曾说:

你是否曾经思考过这点,我们都想成为有名的作家、诗人、政治家、歌星,或者你所渴望的名望。为什么呢?因为我们实在不喜欢我们正在做的事,如果你爱唱歌、或者爱绘画、或者爱写诗——如果你真的热爱它——你不会关心你是否会成名。想要成名是华而不实、琐碎无聊、愚蠢乏味的,是毫无意义的;但是,我们并不爱我们手头正在做的事,所以我们想用名声来丰富自己。我们现在的教育是腐朽的,因为他教育我们热爱成功,而不是手头正在做的事。结果已经成了比行动更为重要了。

你知道,你最好不要锋芒毕露,而要隐姓埋名,去爱你手头正在做的事而不要丢人现眼;最好是行善而不求名。不要使你出名,不要把你的照片登在报纸上。政治家们也不会来敲你的门。你只是一个默默无闻地生活着而具有创造力的人,而其中蕴藏着丰富和优美。

克里希那穆提被尊为世师,有点像中国的六祖慧能,基本属于顿悟型智者,常有惊世之语。窃以为闻之尚可振聋发聩,催人反思,为之则实在难比登天。

倘使我等皆奉诸行无常、诸法无我、涅磐寂静之皮相,消极遁世,实悖之远矣。

贪、嗔、痴,是人性使然,关键不是看你怎么想,而是看你怎么做,做的底线就是你达到目的的手段不能损害别人的利益。

能为别人带来利益,则是大仁大爱了。

名我所欲也,利亦我所欲也,本就在世俗之中,我是免不了俗了……

在大彻大悟之前,你成功与否的衡量指标之一就是:你手头正在做的事是否被人认可


引用通告:http://www.yulefox.com/index.php/20081114/success-fame-gain.html/trackback/

推荐两篇文章

先来一段废话,没兴趣的直接跳到下一分割线。

杨某人说我在Blog上贴代码,没人愿意看,想想也是,除了从CppBlog过来的朋友会看上两眼,其他人大多不是冲代码来的。

但让我放弃纯技术的Blog也不现实,也不可能不往这儿贴啊,毕竟这儿才是我的家。

看了一下CppBlog的Google订阅,貌似从100+跌到99了,而这儿的Google订阅居然激增到30+。

在这儿乱贴膏药的一个好处就是:我的地盘我做主


今天介绍看到的两篇比较好的技术文章,后面单独开贴分别讨论:

第一篇是纯数据结构的:红黑树的实现源码(第二次修订版),STL的map正是使用红黑树(Red-Black Tree,RBT)操作的,大学教材里一般只讲授平衡二叉树(AVL树,发明者 G.M. Adelson-VelskyE.M. Landis)。

第二篇是关于游戏服务器崩溃恢复的:崩溃后重启,用共享内存恢复你的数据


我写代码比较注意效率,最近在做搜索的时候,对于将具有大量属性值的原始map按具体属性搜索涉及较多,因为map只能对作为key的first提供快速查找,对second的查找只能靠遍历,为了实现非key属性的快速查找,只好建立非key属性与key的新的映射。这样做就类似于数据库的操作了,之前跟Bugs讨论过,似乎也只能这么做。我虽然不甘心,也没有更好的办法,如果你有,请不吝赐教。

如果我们在实现代码的时候能更多从存取结构和算法上提高代码执行效率(微观)、从设计模式和重构上提高代码易重用和易读性(宏观)上下功夫,好的项目和产品自然就出来了。我非常期待能有这样的学生朋友加入我们公司


引用通告:http://www.yulefox.com/index.php/20081113/recommend-two-articles.html/trackback/

果然是被挖墙角……

前几日提到腾讯诉15员工竞业限制案,记得当时私下议论,这种事不可能是个人行为,能让腾讯如此大动干戈的,一定是被集体挖墙角,不是挖墙角,可能是挖墙根。

今日,就看到有相关报道陆续出来了:

51.com挖墙脚,竞业禁止起波澜

51.com挖角腾讯:律师称竞业补偿费不合理

挖墙根的居然是51.COM,老史整的好哦!

至于起不起诉、如何起诉,赔不赔偿、如何赔偿,那是法律问题,我关心的还是,企业如何能够稳住员工的人和心,如何保证圈内的良性竞争,建立和谐的行业规范。

和谐这个词太好了,不知道使用什么形容词的时候,用和谐。听我的,没错。


引用通告:http://www.yulefox.com/index.php/20081112/undermine-tencent-foundation.html/trackback/

中文维基

中文维基百科什么时候能有国内镜像呢?

我是不是太贪心了?能让你打开就不错了,还敢想国内镜像。

记得中文维基百科最近一次开放是奥运前几个月,之后似乎没再封过。当然是屏蔽了敏感词的,不过这已经委实不易了。

还记得当初查维基百科的的时候,因为英文读起来慢,我甚至直接读日语链接,太凄凉了。

近来重读苏轼《贾谊论》,又不免一番长吁短叹。给出全文,源自:http://zh.wikisource.org/w/index.php?title=賈誼論&variant=zh-tw

賈誼論    蘇 軾

  非才之難,所以自用者實難。惜乎,賈生,王者之佐,而不能自用其才也。夫君子之所取者遠,則必有所待;所就者大,則必有所忍。古之賢人,皆負可致之才,而卒不能行其萬一者,未必皆其時君之罪,或者其自取也。愚觀賈生之論,如其所言,雖三代何以遠過?得君如漢文,猶且以不用死,然則是天下無,終不可有所為耶?仲尼聖人,歷試於天下,苟非大無道之國,皆欲勉強扶持,庶幾一日得行其道。將之,先之以子夏,申之以冉有。君子之欲得其君,如此其勤也。孟子,三宿而後出晝,猶曰﹕「王其庶幾召我。」君子之不忍棄其君,如此其厚也。公孫丑問曰﹕「夫子何為不豫?」孟子曰﹕「方今天下,舍我其誰哉?而吾何為不豫?」君子之愛其身,如此其至也。夫如此而不用,然後知天下果不足與有為,而可以無憾矣。若賈生者,非漢文之不能用生,生之不能用漢文也。

  夫絳侯親握天子璽,而授之文帝灌嬰連兵數十萬,以決之雌雄,又皆高帝之舊將。此其君臣相得之分,豈特父子骨肉手足哉!賈生洛陽之少年,欲使其一朝之閒,盡棄其舊而謀其新,亦已難矣。

  為賈生者,上得其君,下得其大臣,如之屬,優游浸漬而深交之,使天子不疑,大臣不忌,然後舉天下而唯吾之所欲為,不過十年,可以得志。安有立談之閒,而遽為人痛哭哉?觀其過,為賦以弔屈原,縈紆鬱悶,趯然有遠舉之志。其後以自傷哭泣,至於夭絕,是亦不善處窮者也。夫謀之一不見用,則安知終不復用也?不知默默以待其變,而自殘至此。嗚呼!賈生志大而量小,才有餘而識不足也。

  古之人,有高世之才,必有遺俗之累。是故非聰明睿智不惑之主,則不能全其用。古今稱苻堅王猛於草茅之中,一朝盡斥去其舊臣而與之謀。彼其匹夫,略有天下之半,其以此哉!愚深悲生之志,故備論之。亦使人君得如賈生之臣,則知其有狷介之操,一不見用,則憂傷病沮,不能復振。而為賈生者,亦謹其所發哉!

已经懒得多说什么了,都一个样……


引用通告:http://www.yulefox.com/index.php/20081112/chinese-wikipedia.html/trackback/

她比烟花更寂寞

红颜自多情,薄命自爱生。自古红颜多薄命……

侬本多情,却也只贪点依赖,贪点爱……

张曼玉演绎的阮玲玉,像纪录片一样描绘着她的一生。两代名伶,因着灵魂的相吸,气质的相通,穿越时空在旧上海相遇了,让我迷惑于到底是她,还是她。喜欢看台上骄傲的若无他人的独舞,绰绰红唇;喜欢看她人后吞吐的烟雾,灰暗的旗袍。不管是欢笑着的千娇妩媚,还是静寂着的若有所思,渗透着无限寂寥。当寂寞渗入骨髓,浸蚀她的心,她似乎无力再若无其事了。于是,她选择用最残忍、直接的方式告别,这个结局,却也成就了她完美的一生。

等待半生,缘也尽了,人也回不去了……

有多少女子在张爱玲笔下的旧上海绽放美丽,曼桢便是其中之一。她的美丽,她的青春,还有爱情,却扯上了女人心中最忌讳的强奸,有时候命运似乎喜欢把最美好的东西毁给你看。等待半生,多少期待,换来一次相遇,多少不舍,却有时间隔在了两人中间,一直记得曼桢一字一字地说出:我们回不去了……带着多少年希望的破灭,且不说是因为命运,还是因为男人,有时候你得随他们去了,一样的任性,一样的无奈。

禁得住等待,禁不住背叛;受得了失去,受不了不爱……

烟花女子的爱情多曲奇,多浪漫,也多悲情。原本可以不管不顾的菊仙爱上了小楼,就变的处心积虑,步步为营了,只为嫁他。只是当风暴来临,男人却总也没有女人想像中的坚忍,对待爱情,男人似乎也真真没有女人的坚贞。他们总是让你喝却不会让你醉,总是让你等待,却不愿给你结局,多情而又寡断,穿梭于此类男人,成就了一个又一个平凡女子的美丽,菊仙穿上那件红嫁衣匆匆去了,没有了留恋,只剩下愁怨。

林花儿落,连心也埋……

他日鸿燕归来,身已不在……


引用通告:http://www.yulefox.com/index.php/20081110/beauty-dolefulness.html/trackback/