X the Unknown Becoming an “X'' in an equation.

20八/080

Publish To My Blogger’s Blog Too

为了方便两边的同步而写出来的插件PTMBBT,全称见标题。

其实本来我是想找一个已经有的插件加载一下就算了,懒啊,但是结果找来找去都没什么结果……曾经用了一个Email Publish的插件,不过好像吃小不吃大……昨晚那篇就没成功发布到Blogger去,可能是我不太懂设置……

结果最后还是自己对着一堆文档慢慢看慢慢做,还好不是十分困难,算是做出来了。现在的这篇post,应该也能自动发布到blogger上面了。

不过这个插件不具有普遍适用性,因为hard code了一些和godaddy相关的代码进去,而且必须在Zend Framework的支持下才能运作。可能可以起一个参考作用吧,所以我放在这里供下载了。

PTMBBT v0.1

这也是我第一个做的WP插件哇。

20八/084

Abstract Factory和Factory Method的区别

不得不说这两个囧模式看到我现在都还是不能很确认自己是不是真的了解它们之间的区别了。主要原因估计是Abstract Factory一般通过Factory Method来实现的原因。

(下文中,首字母大写正体的表示一个模式,如Abstract Factory,指的是Abstract Factory这个模式;首字母大写粗斜体的表示一个类,如Factory表示一个Factory的类;小写字母的表示一个对象,如factory表示某个类的一个实例,一个对象;其他的可以通过上下文区分其含义。)

经过多番钻牛角尖和刨书的结果,它们两个的区别,我认为还是比较基本的一点:虽然均属创建型模式,但是Abstract Factory是对象型而Factory Method是类型的(强烈BS一下中译版把这么重要的区别给弄没了)。

更具体一点来说,Abstract Factory把一系列的对象的创建留给了一个factory对象去创建。这里面包含了一个动态的概念:你可以动态地决定你的factory的将创建一堆什么东西(通过选择不同的Concrete Factory)。

而Factory Method则是一个静态的概念,它把一个对象的创建推迟到了子类,我们知道这在C++里面可以通过虚拟函数来实现。之所以说是静态的是因为,Factory Method里面的Product,在你进行类设计的阶段时就已经被固定为是经过Creator通过某个操作来创建的。为了创建一个Product的对象,你必须要通过Creator的这个操作进行。

尽管用什么Creator的子类对象来创建哪个Product的子类对象还是动态的,但是这不是Factory Method关心的范围。这也是因为Factory Method是类创建型模式所决定的:它关心的是CreatorProduct两个类(包括子类)之间的关系:Creator负责了Product的创建,而这种创建将依赖于在Creator上面定义的一个操作(也就是一个factory method,``because it is resposible for "manufacturing" an object'')实现。这其实定义了一个Creator(Factory)->Product的关系。

而Abstract Factory之所以显得和Factory Method很接近——Abstract Factory指定了许多的操作,然后再在Concrete Factory里面定义好这些操作,负责创建对应的Concrete Product——是因为Abstract Factory通过Factory Method来实现的原因(所以,Abstract Factory里面的那些操作都可以称为是factory method)。

但Abstract Factory并非只能通过Factory Method来实现。如果说通过Factory Method来实现Abstract Factory使得Abstract Factory定义的类间和类层次结构与Factory Method很接近的话,通过Prototype来实现的Abstract Factory将可以把这个结构坎掉一大半,让Abstract Factory与Factory Method不再相似,只剩下一堆操作。这堆操作只起到接口的作用,并没有定义像Factory Method中那样的关系:尽管对象还是经由Abstract Factory这些操作产生,但本质上已经不再是Factory->Product的关系了(Prototype模式里面通过拷贝对象原型来产生新的对象,是一种prototype->product的关系。注意字体)。

然而根本不用管是否Factory->Product,因为Abstract Factory关心的只是,提供接口,隐藏内部细节,使得可以通过不同的factory object用相同的接口来产生不同系列的产品对象(其实就是不管如何都是显示为一个factory->product的关系。注意字体)。

这也是为何Abstract Factory定位为一个对象创建型的模式的原因吧。

18八/080

X the Unknown / WP Site is in test.

Visit it via: http://wp.xinside.net/ and help me testing it.

17八/082

试用WordPress

结果到最后我还是放弃了继续修改……把空间切换回linux type,用用wordpress试试了。

不过blogger那边还是会依旧更新的。想找一个wp的插件来完成这活,结果找不到……算吧,手动也不是很麻烦。

wordpress我用的时间没多长,暂时打算先测试一下,没打算现在就马上绑到www.xinside.net的root上面去。

计划中,是会有个wp.xinside.net的子域名来方便访问的,不过godaddy的管理面板又有点rp了……可能要晚点。

So……如果你想提前看看使用分类功能后的xtheukn的话,可以来wp.xinside.net来看看。

其实这也是我换blog engine的最主要目的。

当然,你依旧总是可以通过www.xinside.net来访问xtheukn上的文章。

14八/080

最近的生活

最近的生活都不缺乏激情,不过绝大部分都是来自中国奥运团的捷报频传。今天已经是17面金了,中国队加油!

除了看奥运,最近基本都沉浸在研究迷宫上面——不是研究怎样走,是研究怎样生成。研究的起因大概是这样的:看书,里面有一个与迷宫有关的例子——想起自己曾经玩过的迷宫,想起其中的某个特点——想借助这个特点做一个惊喜——惊喜做完了,效率却……于是就继续钻研了一下。

上网找例程试着学习,找到一个basic的,但发现自己已经看不懂basic的程序……不过实在够短;找到一个C的,不过那个长度比起那个basic的程序……然后就没心情看,倒是从得到了原理上的一些启发,结果还是自顾自的研究去了。结果……算是有点?只不过就现在看来,迷宫的素质……比较囧。

不过相比起起初做惊喜的阶段还是有了不少提升。有机会再写个post记录记录吧。

然后偶尔玩玩游戏,最近的生活就是这样。也就是因为有个奥运才有激情一点吧。

没了奥运的话,估计我还是郁郁闷闷的一天又一天。

11八/080

好久没更新了

Well……真的好久没回来看看了。对上一次写的时候应该是4月吧,那个时候心情正郁闷着,所以想来个“想到什么写什么”系列。不过结果呢……写了(1)就没写下去了。5分钟前,4个月前构思过的(2)的草稿还留在blogger上,不过我现在已经找不回4个月前那个feel了——倒不是说现在心情很愉快,现在的我依旧被各式各样的事情郁闷着,只不过,跟4个月前是完全不一样的。既然这样,那我就干脆推倒重来,(2)就留到以后吧,不过可能跟(1)没什么关系了。

4个月了,其间其实我也不断的想上来写点什么,好让这里不要长太多的草,不过一直都不太满意blogger的分类……不花点功夫的话,和没分类还真看不出什么区别,不同标签的文章都一股脑儿挤到一块了,想分类看?到post尾部的标签里面找找吧,不过不保证马上能找到。对我来说虽然不太满意但也算凑合,对看的人来说应该就比较郁闷:不想听我发牢骚的人偏偏总会在主页看见我的牢骚;想听我扯东扯西的人,偏偏会看到一篇完全不懂的建站手记。

当然,我假设了我写的东西是有人看的。

想换一个blogging system,甚至想自己写一个,不过自己写的话,需求太模糊,我连我自己想要什么功能都不知道;换一个吧……其实没有什么好选择。Wordpress曾经考虑过,但总觉得没blogger来的顺手,加之我完全不懂php,而且空间也是windows type的。

结果我还是觉得,改造吧!blogger提供的功能,应该可以实现我的要求的。

于是,接下来,XtheUkn又要大动工咯~

29四/085

想到什么写什么(1)

又是一夜难静。没办法,总会有不吐不快的时候的。

今晚纠缠的思维没一个明确的主题,就想到什么说什么了。

读心

唐突又奇怪的话题,而其实我也不知道为何我会提起这个。不过即使如此,我这几天老是念念不忘这个突然爆发出来的主题。

说起读心我就老想起在大学泡bbs的时候,见过某一个人的qmd里面写着关于AT立场的说明,并且用“信赖”来阐释了这个概念:

几乎所有人都不会喜欢一个陌生人的不适当的接触或是在耳边的细语,因为这样一种行为侵犯了亲近的敏感性,而这种敏感性正与一个人信赖他人的程度直接相关。

我不懂什么心理学,不过直觉觉得这个对于读心似乎也适用:愿不愿意被别人读出自己的心思,经常是被人之间的关系所主导的。

比如说一对恋人,总是希望对方能了解自己的心思;相反来说对于陌生人——且不论是不是仇人——假若真的被人摸透了自己的心思或者秘密,我想有一半的人会感到不安,并且会有所防范,有时感觉就像是私隐被窥视了一样。假若是仇人,那就更不用说了。

就我自己的经历来说,关于读心,最让我觉得不可思议的在高中。当然有一位女同学,正准备问她的朋友一个问题。她问题还没问出我就想马上想到了我该回答“108”。

不过到最后我没有说出来,只在心里想了,所以也不知道别人到底怎样看这事。那位女同学问的,是银的式量是多少。

大概是我高中的时候学化学学的太热衷了吧。

转过头来看看,发现自己也不知道写了些什么了。不过本来,我是要想到什么写什么的,也管不了那么多了。接下来是……

代价

如果翻找回去年大约是这个时候(大概吧我也记不清了)我写过的文章,大概就知道为什么我会说起代价了。没错,就是侑子小姐和四月一日!

xxxHolic出“继”了,被第一季吸引过来的我当然不会错过。虽然漫画我是看过,不过动画看起来就是有动感一点。

要是我跟家里人说我看动画他们肯定说我幼稚。这个时候我一般不知道怎么回答他们,跟他们慢慢说的话,一般到头来他们还是接受不了,认为动画还是小孩子才应该看的;不跟他们解释,自己又感觉有点委屈。其实我现在的世界观,有不少是从动话、漫话和游戏里面学回来的。“代价”就是一个现成的例子。

跟“代价”有联系的,我所知道的,除了我现在说起的xxxHolic以外,钢之炼金术师就是另一个活生生的例子,只不过“代价”被叫成了“等价交换”。纵使我知道现实生活早已不是单纯的“代价”可以解释得了,我仍然很喜欢用代价去解释我生活中遇到的事情,就像一年前那时。真的不能解释,那就是我在积存RP或者积存的RP开始爆发,最终的结果还是一句:出来混,迟早要还的。

就像我现在这么晚才写帖的代价就是,睡眠不足明天等打瞌睡;再就是,又累又困写不完。

明天继续吧。大概会想说说“误解”吧。

17四/082

我的天是灰色,我的心是蓝色

黑仔传说进行时,今天又黑了一次:开窗的时候手指一滑,指甲撞在窗的锁件上。啪的一声闷响,接着是一阵剧痛,最后才看见了指甲缝开始泛红……

接着是整晚心情跌到谷底,十分烦躁,诸事不顺。

神啊,如果你有意思请个钟点工,考虑一下我吧!

分类: 生活 2 评论
16四/081

最近比较黑……

都不知道自己做错了什么让倒霉附身了。先是星期一,在商店买完东西把钱包塞在裤袋里,没走两步就掉在地上了仍然懵然不知。不过这天还不算完全的黑。首先是,懵懵地走了没多远就发现钱包不见了,马上往回找;然后是,在下班/放学这样人流相对较大的时段,我的钱包躺在地上1、2分钟了居然还没人发现;最后是,在我往回走发现了掉落的钱包的同时,两个初(高?)中生也发现了我的钱包正伸手想捡,被我大叫了一声“等阵!”喝停了。

以上,如果其中一点不发生的话可能我的钱包就已经落在他人手上回不来了……当然,我是以最坏的情况做的估计,比如说,或许那两位学生会主动把钱包还给我什么的。不过既然我黑仔,还是以最坏情况做打算比较好……

最后钱包回到我身边了。钱包如果不见了……身份证就不用说了;银行卡倒是问题不大,有密码;现金有100+;另外还有小破师兄送我的中大80周年纪念版羊城通,里面……没多少钱了,不过卡本身的意义比还有多少钱价值大得多;曾经用过的校园卡等几张卡等等;最后就是钱包本身……虽然买的是全场里面比较便宜的,但也花了我100+。

有惊无险,不算黑?那么今天就真的是黑了。今天工资刚发——等等,我没有黑仔到掉第二次钱包,也没有黑仔到弄丢了刚发的工资——心里算着手机没话费了该是冲冲值了——再等等,我没有黑仔到丢了手机。什么?你不是想说我丢了手机?那么你大概已经猜对了——50元的充值卡买了回来,但手里拿着包包不方便马上充值,塞在裤袋里就打算回屋子了再冲。回到了就忘记了这一回事,直到ww和我说是不是没收到她信息的时候我才记起来了,然后往裤袋一摸……没东西。另一边裤袋再摸……还是没东西。把两个裤袋都翻出来了再看……还是没东西!买葛,难道丢了……?想起自己今天又曾经在商店里买过东西,莫非……在屋子里面翻箱倒柜都找不到那50元的充值卡,看来这个莫非是属实了……

50元啊!就这样不见了……

要命的是今天我穿的裤子跟星期一的是同一条!莫非这条裤子就是倒霉的根源?看来以后不能穿了……

绝望了!我对倒霉的我和裤子绝望了!

这个星期才过了一半……剩下的一半会发生什么倒霉事呢?该不会是屋子又被撬吧……看来这几天我要多注意一下才行……

分类: 生活 1个评论
27三/083

javascript里面的this

昨天的思考中遇到了this的问题。ECMA-262中,this是在执行上下文(Execution Contexts)中被首次提及的,所以或许我应该先了解一下什么是执行上下文。

执行上下文?

Excution Contexts(我简称EC吧),当程序的控制流进入一段ECMAScript可执行代码时,就会进入一个EC。活动EC在逻辑上会形成一个栈,栈顶EC就是当前运行的EC。

ECMAScript可执行代码?

ECMA-262中定义了三类这样的可执行代码:

  • 全局代码:用C的概念类比的话,就是main函数里面的所有语句。javascript程序的源代码,除了函数体以外,都可以看成是全局代码。

    我好像一直在混淆javascript和ECMAScript的概念了?其实ECMAScript可以认为是javascript和jscript的泛化,是一个标准化的规范。虽然我不知道javascript是不是完全兼容于ECMA的规范,不过ECMA中定义的大部分概念,对javascript应该都是适用的。

  • eval代码:eval,但凡解释性语言基本都有的东西。当然apply也是。eval/apply可谓亲密无间的伙伴,不过在这里它不是主角。eval代码就是应用到内建的eval函数的那些字符串。性质类似于全局代码。
  • 函数代码:全局代码里面并没有包括函数体的源代码,函数体的源代码属于函数代码的一部分。当然,函数体的源代码中如果包含嵌套的函数体,嵌套的那部分则是属于另一段的函数代码的。上一篇文章里面说过函数也可以通过new Function来创建,所以new Function的最后一个参数,也就是函数体,也会被看作是一段函数代码。

我猜想EC的并非以一种对象实现的。ECMA-262里面从头到尾都没有提起过所谓execution context object,甚至连context object的概念也没有看见。会有不少对象和引用附加在一个EC上,大概可以把EC理解成一个小型集合吧。

那么this到底和EC有什么关系?
this是EC上附加的一个……引用。this的值与调用者(主要对函数而言)和被执行的代码有关,并且值在进入EC的时候就已经定下来了。this是不可修改的。

this是跟可执行代码类型有关的:

  • 对于全局代码,this引用到全局对象。

    什么是全局对象?

    全局对象是javascript的一类原生对象Global Object,在进入EC之前就已经被创建。它有几个特点:

    • 不能通过new constructor构造。
    • 不能用作函数调用。
    • Global Object的类型以及prototype是跟具体的javascript的实现细节相关的。

    javascript提供的内建值(NaN,Infinity和undefined)、内建函数(eval,parseInt等)以及其他原生对象的构造函数(Object,Function等)都是Global Object的提供的属性。可以向Global Object中添加各种其他的属性。

    Global Object处于作用域链的最高层。至于什么是作用域链……再说吧,现在已经离题很远了。

    根据这些,现在可以猜想到的一点就是,在javascript里面这样的调用:

    eval("alert('hello');");

    其实是等价于下面这样的伪代码:

    global_object.eval("alert('hello');");

    回到this。因为对于全局代码,this引用到了全局对象,所以在全局代码里面使用this,跟没使用效果是一样的orz:

    this.a="hello";
    this.alert(a===this.a);

  • eval代码

    当进入的是eval代码的EC时,上一个EC,被称作调用上下文。eval代码里面的this,与调用上下文里面的this是一样的。如果没有调用上下文,那么eval代码会做与全局代码一样的处理。

    function test() {
    eval("this.a = 'hello';");
    alert(a);
    }
    test();

    不过实际上,这里的this用了跟没有用也是一样的。

  • 函数代码

    this的值由调用者提供。当调用者不是对象时,this将引用到全局对象上。

看到这里,虽然还没弄清楚到底调用者怎样提供this的值,不过可以猜想,如果调用者是对象的话,那么this将会引用到调用者自身。这就可以解释为什么new constructor的时候,this是指向实例化的对象了。如果作为普通函数调用,按照之前对全局代码得出的结论,应该跟global_object.a_function的调用是一样的。这样想的话,调用者就是全局对象了。

那样的话,总算明白了普通函数里面的this有什么意思了……

function test_class () {
this.v1 = '1';
}

/* new constructor方式调用,function code的
调用者为新实例化的对象,this引用到这个对象上。*/
alert((new test_class()).v1);

alert(v1); // 调用失败,v1未定义
test_class(); // 普通函数调用,this为全局对象
alert(v1); // 经过上面的调用,全局对象里面有了v1的定义

不过让ECMA-262里面提到的一点我不太明白:eval代码可能会没有调用上下文。那会是什么样的情况呢?是指eval语句是第一句的情况吗?还是说只有eval一句的情况呢?

说到这里仍然是有很多不明不白,唯一清晰了的就是this在普通函数里面有什么含意……嘛既然标题是关于this的,我也不去想先了。留给后一篇post吧。