怪怪 | Nothing, Everything

"有过一个发疯的时刻,有感觉的钢琴以为它是世界上仅有的一架钢琴,宇宙的全部和谐都发生在它身上." - 狄德罗
随笔 - 80, 文章 - 2, 评论 - 1597, 引用 - 38
数据加载中……

置顶随笔

[置顶]系列讨论初步考虑的备忘

     摘要: 先把一些相关的内容, 想到的目录记录一下。 这些标题是散乱的, 甚至不是一个层次的, 仅仅做一个备忘的笔记。

顺便说一句, 这个系列不是忽悠大家去用某一门“表达方式更丰富”的语言, 或者给出什么解决方案。 对于大多数程序员, 身处环境和项目当中, 更换语言是不现实的。 更何况说实在的, 现在还没有一门语言能够完美的达到我想要的效果或标准; 即使那些能够做到的语言, 我们可以采取的表达方式也是极其丑陋的。 并且, 在这系列文章的讨论所涉及的一些工作,如对语言本身的改进, 也不是大多数程序员任务。

但是我们仍然可以因为一些深入讨论, 知道问题的症结所在; 从而在能避开的时候避开, 在不能避开的时候, 不会殚精竭虑的去寻求不切实际的解决办法。 同时, 在这个系列中, 我们也可以找出一些外围辅助的方式处理好其中一些问题, 暂时不能治本, 指标也好。 更多的, 我们可以通过讨论,把现今那些浮躁的解决方案先放到一边,努力的去试着看清未来10年一些可能发展的方向。如果10年之后, 你我还在做技术, 即使没有预测准, 这样的尝试也不能说是无意义的。
  阅读全文

posted @ 2008-05-24 09:14 怪怪 阅读(5570) | 评论 (11)编辑

[置顶]最近闲话比较多了, 应该消停点~

提醒一下自己, 该干活干活, 少那么多废话; 再不行就拔网线了。
多提醒一次, 少发表对谁都没有帮助的意见。

posted @ 2008-03-13 19:59 怪怪 阅读(712) | 评论 (10)编辑

2008年7月2日

妈的

最近的一些感受。

首先,deerchao说的是对的, Community Server 2008要比2.1强太多了, 当然, 对于我来说还是不够好; 不过, 既然我自己没有能力拿出一个若干万行、并且好多人都在用的产品, 我就别他妈的JJWW了。 这件事的一个想法是: 有谁愿意提炼和修改Community Server 2008的,我愿意参与,我的想法是:

1.继续精简和重构。
2.改进对中文的支持。
3.重新开源之。

为了目标1和3,一些代码不妨重写。 这样的产品, 难说什么专利, 只要重构的程度跨过某一水平线, 版权不是什么问题。

第二件事, 我为了试一个软件是否存在时间过期, 调整了系统时间, 重启前也忘了改回来; 结果Windows 2008让我激活, 在这里提醒一下那些像我一样靠240天评估期使用非盗版Windows的同志。

第三件事, 重装的时候, 忘记旧软件应该先装, 比如Sql Server 2005应该在Visual Studio 2008之前。 有时候一些最简单的事情也会犯错, 所以细心和把细心的结果形成习惯,还是必要的。另外, 了解了一下Installer安装组件和Hotfix的思路, 发现一些问题还真是难处理;初步感觉,其实我们自己设计真正的软件时,也可能会碰见类似的问题,看看能不能沉淀一下,变成可以触发的联想的知识和经验。

第四件事, 我决心调整重点, 把Web框架作为次要工作了,我现在就必须开始P2P的研究。 从06年年底开始到现在, 一直没进入真正的产品阶段, 我想这绝不光光是因为我懒, 而是存在深层次的问题。 分布式、非集中的网络,才是我的信仰;我是不是真的愿意做Web框架,还是因为从事过一些Web开发就习惯性的走到这个道路上,我没法去分析清楚。

但是我自认对Web开发的方方面面,有一些体会还是很准确的。我希望我的实验成果还能为别人发挥一些作用,所以我还会把它当作一个副业继续。也许这样,心态反而会变好,作为一个副业,效率比这1年半还高也不是不可能的事情。

关键是了解自己,管理自己,这才是重中之重。

Update:
多加一件事, ATI的程序员不是人。 就是因为有了这样的程序员, 一般群众对.NET的印象就越来越坏。

posted @ 2008-07-02 07:53 怪怪 阅读(820) | 评论 (8)编辑

2008年7月1日

最近回帖整理:

原帖,针对第四点:

看看客户所说的话, 能不能整理为一个自然语言的子集:与业务相关的小语言,并形式化。 实现过程可以三步走:

1. 对需要变化的业务规则建立统一的模型。

2. 使用解释器模式配合配置文件来表达小语言,应对变化。

3. 当2变得复杂和难于掌握, 考虑实现一门业务小语言, 难度较深。

纸上谈兵, 没机会实战过, 而且我估计这个成本对于承接项目的公司恐怕难于接受; 除非在市场上有多家公司需要这种东西, 这样算是预支成本吧。

对于一般技术人员, 可能认为难度在于实现小语言。 其实最难的一部分是如何将业务规则及其变化归纳为一个可接受的表达形式。

posted @ 2008-07-01 06:17 怪怪 阅读(900) | 评论 (4)编辑

2008年6月29日

怪怪论三国:到底该关注些什么

发现博客园对三国感兴趣的人很多,不过关注点似乎和我都有所不同。要是让我看,三国时期只有一个英雄那就是曹操,除此之外就只剩下层次高低不等的流氓及其团伙一干人等。说实话,曹操身上最大的一个弱点,或许就体现在“天下英雄唯使君与曹尔”这句话中了,这说明他的精神境界中还有一些和刘备一样低劣的东西,如果曹魏最终的衰亡真有曹操自己的因素的话,恐怕就在这里了。

有人说三国志中曹操传比别人长比别人详细, 是因为作者以魏为正统, 个人不以为然: 比较一下职业生涯中,在动作的大小和频率方面,刘孙与曹操之间存在的不可弥补的差距, 就可以知道刘备、诸葛亮等作为与日月争辉的星星,不过尔尔。 有兴趣的, 以对于孙刘而言是大动作的粒度, 对曹操阵营的动作做一个列表, 比较一下三者的长短, 再配合时间轴一看, 这些都一清二楚。 这个故事本来一点也不复杂, 只是后面那些只知道拿三国吃饭的学者们把它弄复杂了。

很多人关注三国,着眼于做人,比如曹操所谓的权谋, 这实际上只是旁枝末节。 曹操此人身上所蕴含的巨大而无可匹敌的能量,才是真正无法忽视的根源;即使他做事方法变一个样,结果也不会逆转。 曹魏的命运, 也许可称的上“天亡我, 非战之罪”。 这个问题我没有足够的知识与能力关注,只说两点: 曹虽然起家于官宦家庭, 但其势并不比陈胜吴广项羽刘邦更好;客观历史环境所导致,那个时代的创业者比任何一个其他时代需要做都要多,以他的寿命是无法完成的。

要说做人,我们真正要看到的是,曹操做事情的节奏;我们还不能忽视的是, 无论作为政治家、军事家、社会活动家、文学艺术家,曹操的杰出成就的总和,可以说在中国历史上是数一数二的。 就像数学家标榜的“人类心智的荣耀”,和所有那些取得成功的人所真正留下的宝贵财富别无二致的,他的一生展示了一个人可以达到的极限有多远。 有些人可能认为,像文学艺术这样的东西,和曹操的成功失败没有必然联系,但事实上,正是曹操的内涵决定了他是一个什么样的人。

那些只注意权谋、机巧的人,是不可能走上和刘邦、曹操这样的人一样的道路的。 简单地说,像他们这样的人,好比上了发条的机器,没有停止的时候;而且他们通过训练,可以让动力衰竭的速度,控制在一定的范围内。当一个人在一条道路上,相对时间相展开到绝对时间上比其它人多好几倍,他注定要比所有人强。 这才是历史给我们上的第一课,没有这一课,纯粹的认为(类似的)老毛之所以是大家的头儿,是通读了二十四史或有什么其他杰出才干,是毫无意义的。

孙武告诉我们说,以正合、以奇胜,这已充分说明了孰在前、孰在后。 把周遭的人和事情想的特别复杂,并且和历史对照,在我们有足够的“正”之前,未必是什么好事。作为我们文化历史中的重要组成部分,对刘关张和诸葛亮的褒扬,对曹操“奇”的一部分的过多关注,过去几百年来对我们的民族是贻害甚巨的;这种传统掩盖了最重要的东西:如果一个人没有掌握真正的内在因素,就沉迷和训练自己什么做人、领导的艺术,哪怕就是极端的小人也不能成为合格且成功的大坏蛋。

我们首先要注意的是那些不平凡的人身上积极向上和光辉的一面,他们告诉我们一个人通过自身的努力可以换来什么样的奇迹,这才是属于全人类的骄傲。虽然作为一个普通人,拿我们和BT相比似乎没有什么意义 -- 但我认为,这些才是每一个想改善自己,取得更大成就的人所要关心和学习的; 至少借由这种鼓励,我们可以去尝试突破自己, 这才是真正的榜样的力量。

posted @ 2008-06-29 08:35 怪怪 阅读(3094) | 评论 (49)编辑

2008年6月28日

闲逛, 看见这么一句话

很随机的不小心进入网上一个不知名的博客,其随笔里提到的,他似乎是个经济学的研究生什么的。

此人说道我站在马克思的“生产力决定生产关系,生产关系制约生产力的发展”的观点上去解释组织的起源,而非交易费用节约的角度,交易费用节约只是组织的功能,拿功能来解释起源就犯了“功能主义”的错误。

嗯嗯,有意思。很显然我没必要去和他比他们领域内的知识和能力啦,不过还是有些额外的思考。

过去我也是信马克思的,而且,“生产力决定生产关系,生产关系制约生产力的发展",这一简单基本的观点,我现在也在用。但是随着我自己的世界观的形成,我似乎开始有了变化。
使用新的世界观,就不会简单的给不同的角度扣上各种大帽子。从交易费用节约的角度上看,真的是所谓的功能主义吗?即使是,功能主义背后所隐藏的东西,会不会比马克思的观点更朴素更基本呢?

有一个防雷的经验,就是说,如果在雷电击中你的那一刻,你抬起的是左脚,你比较不容易被电死。说实话,我是一个驽钝的人,想了好一会儿才明白为什么:电流想要流入地面,必须从右脚过去,这就有一定概率让电流避开心脏了。但我们不要忘记另一个事实,雷电是击穿空气打到你身上的,那为什么它不击穿你左脚和地面之间的空气呢?

这个道理非常简单,上过初中就学过,电流倾向于从电阻更小的地方通过;由于空气的电阻大大大与我们身体的电阻,它不会去选择击穿空气。我这些描述,细究的话,错误百出,而且很不严谨的拿电流当作了主语;但它在大体上是那么回事。这体现了一个非常基本的规律,就是能量最小耗费的原则;同样,作为更适合当主语的人,如果在获取的信息足够的情况下,我们也会执行最省事的一个方案。

我们可以考虑,如果人类和电流没有这种共同性,恐怕在物竞天择的自然界中,我们早就被淘汰了。所以我们可以认为这是宇宙本身的意思,它告诉电流那么做,也告诉我们该怎么做。我们并不需要高深的哲学和复杂的科学,只要愿意去多了解一些,就可以很不严谨的建立起一套正确概率还算不错的指导方针。

马克思的观点在这里,其实恰恰不是原则,而是结果。
我们把“组织”等同于某一种生产关系, 这种生产关系之所以产生,必须符合来自宇宙的指导,这些指导之一显然就包括能量最小耗费原则:我们可以想象,一些领域内活动(不止交易),在某一生产力和其它可能存在的条件下,一种生产关系会比另外一种生产关系更加节约,那么节约的那种生产关系就会屏雀中选。

我这样的说法,和单纯的交易费用节约又有很大不同,但是仍然可能是功能主义的:因为实际上是“节约”这一功能在前,生产关系的起源在后;是为了节约才有组织,而不是有了组织才节约;如果浪费是组织必然行使的功能,组织这种生产关系还能有起源吗?这也就是亚里士多德所说的目的因。另外,我对它的使用本身,就符合了能量最小耗费原则:针对我所需要掌握的程度,这种解释方式可以让我使用更少的能量去琢磨它。

马克思的总结中,还有一些其它因素,比如生产力,为什么生产力会发展呢? 马克思怎么回答的我已经忘了,但我也有自己的答案,不过,那就是另外一个故事了。总而言之,“生产力决定生产关系”这样的结论背后,其实可以挖掘的东西很多,如果纯粹把它本身当作一个锤子,看什么都是钉子,就非常有问题了。

最后多说一句,我不是唯心主义者,仅仅是选择了这样描述。

posted @ 2008-06-28 06:49 怪怪 阅读(2116) | 评论 (10)编辑

2008年6月27日

从DDD说开去,流行方法论和我们的未来

     摘要: 也许这就是人类做事的解决之道: 既然我们的社会还不具有一大堆能够将现实世界的问题和真正艰深的科学理论联系起来的顶尖工程师,也没有出现一群真正的大师拿出对大多数问题解决方案的总结,而事情总是要做的, 那么不如一步一步的来, 让菜菜鸟们跟随菜鸟的优雅,采取次一等的做法总是要比什么都不做来的好得多。所谓山中无老虎, 猴子称大王, 就说明大王存在的必要性了。  阅读全文

posted @ 2008-06-27 05:17 怪怪 阅读(3641) | 评论 (53)编辑

2008年6月26日

路过的说说, 我那篇文章, 应该发么?

说实话我有点疑惑, 不知道这样做对不对, 虽然那是我的真实想法。

这东西有趣。 设计产品的都去看看。

http://blog.seattlepi.nwsource.com/microsoft/archives/141821.asp

是一封披露的电子邮件, Gates讲述了在Microsoft.com下载Movie Maker的可怕经历, 以至于写了这个邮件敦促改进。 如果Gates都是这个感受, 那么我们设计产品时应该什么样呢?

posted @ 2008-06-26 23:57 怪怪 阅读(1064) | 评论 (0)编辑

2008年6月24日

也谈优秀: 我们真的必须知道什么吗?

     摘要: 工程人员绝对不要期望自己像研究人员一样生活和工作, 一旦达不到就抱怨。 要知道我们的工程时间, 和我们的生命都是有限的, 而一个工程人员有做不完的事情。如果不停的学习, 大多数时候不过是从一个表面到另一个表面的浪费时间, 所谓的“深入”,不过是个自我欺骗的屁话。   阅读全文

posted @ 2008-06-24 18:24 怪怪 阅读(3871) | 评论 (55)编辑

2008年6月20日

临时笔记, 有意思的东西

一些编译器理论的简单介绍,和现代Parser研究的新进展。

http://www.antlr.org/article/needlook.html

http://citeseer.comp.nus.edu.sg/440034.html

Tomita(GLR) Parser

Packrat parser (use TDPL)

http://java.sun.com/docs/books/jls/first_edition/html/19.doc.html

http://www.cs.berkeley.edu/~smcpeak/elkhound/

http://www.mollypages.org/page/grammar/index.mp

http://lambda.uta.edu/cse5317/notes/node20.html

http://pages.cpsc.ucalgary.ca/~robin/class/411/LR.1.html

http://en.wikipedia.org/wiki/Memoization

http://en.wikipedia.org/wiki/Comparison_of_parser_generators

http://en.wikipedia.org/wiki/Parsing_expression_grammar



> The author states that he wrote the GLR parser generator solely to
> handle C++ language spec [and someone lapped it up to handle Java].
>
> What exactly is it about OO languages that an LALR(1) parser cannot
> handle?

As the moderator noted, there is nothing about "OO" languages that
LALR(1) parsers cannot handle, but C++ itself is problematic. There
are LALR(1) and LL grammars for Java.

One of the problems with C++, is that expressions and declarations can
look exactly the same (technically, any language containing those the
or of the two productions is ambiguous) and C++ gets around that by
saying, if it looks like a declaration, it is a declaration (forcing
the "or" to be resolved in a particular declaration (and resolving the
ambiguity). However, that resolution is not expressed gramatically,
and one can not take two random context free rules and difference them
and expect the result to be a context free language, which is what the
C++ ambiguity resolution requires one to do.

In contrast, GLR grammars are not required to be unambiguous. Any
ambiguity is resolved by producing a resulting parse-forest that
represents all the potential mabiguous choices and requiring a later
"semantic" pass to choose which parse tree in the forst is the desired
one. Thus, with a GLR parser, one can disambiguate the C++ problem by
selecting the parse tree that treats all the ambiguous expression/
declaration sub-trees as declarations.

The only problem with GLR as a technology is that are no "warnings"
from the grammar processing tool that the language is ambiguous.
Well, there are warnings that the language is not LR (or LALR) or
whatever technology the GLR parser uses as a base. However, some of
those grammars will actually not be ambiguous and some of the will be
ambiguous. However, in any case, once your GLR generator has given a
warning, one either must prove that the language actually isn't
ambiguous or write your semantic phase assuming that the language is
ambiguous and disambiguate the resulting forest.

It is worth mentioning that there are other ways of handling ambiguous
grammars. In particular, one can use predicates to resolve
ambiguities. Predicates allow one to take the difference of two
productions in a controlled manner. In particular, it is possible to
write a syntactic rules that says, try to parse this as a declaration
and if it isn't parse it as an expression. The difference between the
predicated and the GLR solution is that predicated grammars are still
deterministic. There are no hidden ambiguities in a predicated
grammar. If your predicated parser generator gives you an error, you
still have an unresolved ambiguity and if it doesn't the resulting
parser will always construct a parse tree (and not a forest).

I would be remiss if I also did not point out backtracking parsers,
which are another solution to the problem. In fact, all the
implementations of predicated parsers that I know of, use some form of
backtracking in their implementation. General backtrakcing parsers
share the characteristic with GLR parsers that they can parse
ambiguous grammars. Backtracking parsers generally also produce a
parse tree (although in theory they could also produce a forest).
Backtracking parsers have their own deficits though. Many
backtracking parsers will loop forever on some ambiguous grammars.
(Predicated backtraking parsers do not generally have this problem,
although they do not make the same linear time guarantees that pure LL
and LR parsers do(see note)--of course, any parser generator that can
handle a significant class of ambiguous must be inherently non-linear
for some grammars, and GLR parsers have a cubic worst case, same as
Earley parsers.) In addition, most backtracking parsers resolve
ambiguities by selecting one parse tree out of the forest to return.
This is generally done by the order of the rules in the grammar (which
determines the order the rules are tried in in ambiguous cases). If
one looks closely, this is very similar to using predicates
"implicitly" in the grammar. The key difference being that the tool
inserts the predicates rather than the user and does so without
warning and usually without the run-time termination guarantees.

I would like to mention that it is possible to build a predicated
parser using GLR technology, although I don't know of anyone
attempting to do so right now. From thought-experiments I have done
considering whether to implement such a tool, it seems like there
would be some advantages to building such a tool.

Again, I do not want to imply that these are the only techniques for
dealing with ambiguity. For example, Ralph Boland is pursing some
generalization of LR technology that I gather will handle a wider
class of languages and I don't think his technique is any of the
above.

Note: Bryan Ford recently published a paper on a "predicated" parsing
technique that made extensive use of memoization and lazy evaluation
to achieve (if I recall correctly) a linear time guarantee. His
technique shares a characterisitic with general backtracking parsers
in that the order of rules determines what is matched and the the
entire tree is disambiguated that way. He uses an "ordered" or clause
to implement this.

Hope this helps,
-Chris


Chris Clark said (in part):

> It is worth mentioning that there are other ways of handling ambiguous
> grammars. In particular, one can use predicates to resolve
> ambiguities. Predicates allow one to take the difference of two
> productions in a controlled manner. In particular, it is possible to
> write a syntactic rules that says, try to parse this as a declaration
> and if it isn't parse it as an expression. The difference between the
> predicated and the GLR solution is that predicated grammars are still
> deterministic. There are no hidden ambiguities in a predicated
> grammar. If your predicated parser generator gives you an error, you
> still have an unresolved ambiguity and if it doesn't the resulting
> parser will always construct a parse tree (and not a forest)

I agree with Chris about the use of predicates.

Interestingly, the use of predicates alone can some Type 1 power to a
grammar.

For instance:

L1 = {a^n b^n c+} // clearly a type 2 language
L2 = {a+ b^n c^n} // clearly a type 2 language

L1 intersect L2 = {a^n b^n c^n} // a type 1 language

Current research in the area of this class of grammars can be found here:

http://www.cs.queensu.ca/home/okhotin/

See the section on "Boolean grammars." Intersection can get quite a bit of
power out of a formalism.

My most recent paper deals with several difficult to parse languages of the
classical sort, including the particularly nasty to parse:

L = {a^m b^n c^mn}

The only grammar I've seen expressed for that one in classical form is in
Type 0 due to a length increasing production:

  (1) <S> ::= <H><S> | <H><B>
  (2) <B> ::= <B><B> | <C>
  (3) <H><B> ::= <A><X><N><B>
  (4) <N><B> ::= <B><N>
  (5) <B><M> ::= <M><B>
  (6) <N><C> ::= <M>c
  (7) <N>c ::= <M>cc
  (8) <X><M><B><B> ::= <B><X><N><B>
  (9) <X><B><M>c ::= <B>c
(10) <H><A> ::= <A><H>
(11) <A> ::= a
(12) <B> ::= b

Because production (9) is length increasing, the grammar is in Type 0 form,
even though the language itself is Type 1. I'd like to see that grammar
normalized to a Type 1 -- but haven't been able to find one.

The longest derivation I've been able to do with that by hand is aabcc,
which is:

(11) aabcc --> <A>abcc
(11) <A>abcc --> <A><A>bcc
(12) <A><A>bcc --> <A><A><B>cc
  (9) <A><A><B>cc --> <A><A><X><B><M>cc
  (7) <A><A><X><B><M>cc --> <A><A><X><B><N>c
  (4) <A><A><X><B><N>c --> <A><A><X><N><B>c
  (3) <A><A><X><N><B>c --> <A><H><B>c
  (9) <A><H><B>c --> <A><H><X><B><M>c
  (6) <A><H><X><B><M>c --> <A><H><X><B><N><C>
  (4) <A><H><X><B><N><C> --> <A><H><X><N><B><B>
  (2) <A><H><X><N><B><B> --> <A><H><X><N><B>
(10) <A><H><X><N><B> --> <H><A><X><N><B>
  (3) <H><A><X><N><B> --> <H><H><B>
  (1) <H><H><B> --> <H><S>
  (1) <H><S> --> <S>

I started on aaabbcccccc -- but got lost in the shuffle. :-(

If anyone wants to try a purely "predicate" approach to the above
language -- I'd love to see it. (Or if anyone would care to post the
derivation of aaabbcccccc, I'd really love to see that, too.)

The $-grammar I wrote for that one accepts strings in O(n^2.3), and has 6
productions and 2 of those are predicates, but also makes use of 2
phi-expressions, which implies a total of 4 predicates (since there is an
implied predicate with every phi-expression) and at least 2 name-indexed
tries.

Also of note is that I allow for a-expressions in predicates, which allows
for substrings that have been parsed to be concatenated to form entirely new
input that is then passed to the predicates. (The $-grammar for a^m b^n c^mn
uses this.) This is similar to what is known as "length-increasing".

Anyway, a few nights ago, I was asking myself about this formation in C++:

class Foo
{
int inline_function(int x)
{
return __y * x; // __y is used before being seen
}

int __y;
}; // this class is legal

class Bar
{
int inline_function(int x)
{
return __y * x; // __y is an undeclared variable
}
}; // this class is not legal because __y never gets declared

$-calculus was able to handle this ... without any code, accepting Foo and
rejecting Bar -- using all of the above mentioned techniques.

Although the resulting $-grammar uses more than 1 explicit predicate, it
does make use of phi-expressions, and these have implied predicates -- so I
was not able to do it without extensive overall use of predication.

Anyway -- I wrote it up and am looking for somewhere that is looking for a
3.5 page paper on such things. Any thoughts?

[BTW -- Chris -- direct email to you bounces from my account. Is that a spam
guard?]

posted @ 2008-06-20 20:30 怪怪 阅读(1770) | 评论 (0)编辑

2008年6月12日

方法级AOP: 又一个补丁

     摘要: 方法级的AOP的一种办法, 利用了新的Expression, 比起生成动态代理类那是清凉多了, 使用起来也灵活, 就是表达方式有点丑 :P

这是跟老赵还有脑袋讨论的成果, 感兴趣的可以进来讨论一下。 感谢老赵和他的文章的帮助, 同时也更深刻的感到如果语言的表达方式能提供足够的支撑多好, 大家一起催脑袋干活 :P  阅读全文

posted @ 2008-06-12 23:54 怪怪 阅读(4462) | 评论 (18)编辑

2008年6月2日

     摘要: 绝对有另你不适的内容, 不想反胃勿进; 基本上是一篇可以定性为“反人类罪”的发泄。  阅读全文

posted @ 2008-06-02 04:11 怪怪 阅读(4938) | 评论 (10)编辑