kzeng's blog

忠臣的两难境地:Formal Analysis

呵呵,不是读史之余的感慨,而是读paper之余的杂谈。期末要做一个关于国家间贸易的模型,稍加改变倒是说明了一个有趣的历史问题:忠臣的困境。

这里的忠奸只是一个大致的分类和简化,简单的说,忠臣的总是以国家的利益为重的(换言之,他的利益和国家的利益是一致);而奸臣却是以一己或是一个小集团的私利为重(换言之,和国家的利益不同)。从一个简单的例子开始。

假设某个朝代正在与宿敌开战(譬如南宋与金),皇帝对军事并不熟悉,需要征求精通战事的大臣的意见。通常大家都认为主和的往往是奸臣(譬如秦桧)。有一个忠臣,在详细的了解情况后,认为按照当时情况确实主和确实最符合国家的利益。于是他建议主和。皇帝的利益自然也是和国家一致的(当然,你可以把这只当作一个假设)。因为他非常信任这个大臣(换言之,他认为这个大臣是忠臣的几率很大),所以他仍然会接受大臣的建议。但是接受这个建议后,他对这个大臣的信任度会降低(换言之,他认为这个大臣是忠臣的几率降低)最后这一点可能不是很直观,不过可以用例子来说明一下。先举一个极端的例子,尽管这个大臣精通战事,但是仍然有可能犯错误(尽管这个几率很小),如果他主和的建议被接受后,事实证明主和是错误的,皇帝对他的信任自然会下降。但是更重要的是 ,即便他的建议被事实证明是正确的,皇帝对他的信任仍然会降低。(相关证明可以参看Stephen Morris JPE 2001 vol no2,另一个相关的证明Ely & Valimaki QJE 2003 Aug)。

于是忠臣便有一个两难境地:主和,但是以后被当作奸臣的几率增大;主战,但是会损害到国家(和自己)的利益。这里被当作奸臣的忧虑并不是出自对单纯名声重视,虚名对于古人固然重要,但是更重要的是一旦被皇帝当作奸臣(准确地说是被当作奸臣的几率增大)就意味着自己以后正确的建议将不再被相信或是被打大折扣,从长远看会影响到整个国家的利益。如何选择?

还可以描述一个更极端的例子。一个精通战事的忠臣认为应该主和。但是他如果提出主和就会被皇帝砍头,以至于以后再没有建议的权力。他该怎么做?是“死谏”还是...?注意,这里的死谏并不能博得令名,即便是死了,也可能只是一个冥顽不灵的奸臣(基于上文提到的人们信条:奸臣主和)。

似乎就只能委曲求全了,与个人,与国家都有好处,为国家的长远利益牺牲国家的某些短期利益,可是...

在人们普遍狂热的时代里,忠臣的困境的到了充分的体现:或者作为叛徒凄然死去;或者为了国家的长远利益不得不在若干问题上违背初衷委屈求全,而若干年后还会有人出一本《晚年xxx》的书站在“道德”的高度上对xxx批判,sigh。

Blog分类: 

『詝』与汉字简化

[img_assist|fid=120|thumb=1|alt=甲骨文“宁”字|caption=甲骨文“宁”字]

看到有人问咸丰帝奕詝的名字里“詝”字怎么读,胡说两句汉字的简化。这个字的读音在使用繁体字的人看来,应该不是一个大问题,按照习惯读 zhu 就没有错了,类似的字譬如 “貯”(简体做“贮”),“佇”(简体做“伫”)等等,这几个都是常用字,不常用的还有 “眝”,“竚”,“坾” 等等,因为平时不常用,所以也没有简化字(“竚”通“佇”,所以也可以简化为“伫”)。这些字都读做“zhu”,其实他们都是形声字,声旁都是“宁” (zhu)。但是由于简化字的缘故,“宁”字被简化后的“寧“字占据,鸠占鹊巢,所以以“宁”(zhu)构成的字,常用的就只好改成 上宀下一(譬如“贮”),主要是为了保证不失去原来构字的本义。但是这样的“平移”多少还是会引起些误解的。

宁(zhu)在甲骨文里的大致如左图所示,像门屏之形,引申为门屏之间,所以《尔雅·释宫》上说“门屏之间谓之宁”。《说文》上的以“辨积物”立训 未合造字本义,只是“宁”的引伸义,又门屏引申为积物。也是由于这个原因,“宁”其实“貯”(贮)的初字,因为古时字少,往往一字多义,后来使用不便,才加上形旁以示区别。所以,堆积货物就是“贮藏”,人站立久了就是“佇/竚(伫)立”,看远处看久了就是“眝”,堆积的尘土就是“坾”等等,有不少例子。

简化字往往都是有古字可循的,把“寧”简化为“宁”不知出处在哪里,但是这样一来倒是很容易让人误会这个“詝”字,因为他左边是一个繁体的“言”字旁,右边又是一个类似简体的构造,所以看到有些书上擅自将其简化为 [讠宁],其实即便是简化也应该简化为为 “左讠右上宀右下一”才符合造字的规律。当然也看到过台湾出版大陆的文献,把“詝”字写为“[言寧]”的,这些都是有问题的。

其实“詝”还不算一个典型的例子,汉字的发展同时有两个过程在进行,一方面不停的在利用古字造新字,一方面又不断淘汰不常用的旧字,但是总体的趋势是字越来越多,建国后简化汉字,大大减少了字的数量,所以做不到繁体字与简体字一一映射,经常多个繁体字简化为一个简体字,所以不少汉字都丢掉了最初的造字本义,同时不常用的汉字没有给出简化方案,譬如这个“詝”字,所以有时也会有混乱。

Free Tags: 
Blog分类: 

Drupal的wiki模块

wiki模块升级到了4.6.0,其实wiki的前一个版本在4.6.0下也可以使用,不过还是更新了一下。新的wiki利用re-direct解决了创建新文章的问题,所以算得上是一个真正的wiki了,Chris曾经写过一个wiki的node type,用来辅助wiki模块,但是事实上大可不比,因为用flexinode可以很容易的创建一个这样的node type,然后把编辑权限设置给匿名用户就可以了。呵呵,等测试比较成熟了,还是想创建一个Drupal使用说明的wiki。

其实4.6.0里好几个模块的功能都和wiki的功能类似, 譬如freelinking模块和interwiki模块。感觉freelinking是由title模块升级来的,因为所用语法和title一样,都是用方括号[]创建内部链接,很方便,不过freelinking模块的功能改进了不少。interwiki模块的功能稍有不同,可以很方便链接许多其他网站,譬如想插入wikipedia对Drupal的解释,只需要使用语法:[w: drupa]就行了,而要连接到一个字典网站,则可使用[dict: drupal], 连接到google的搜索结果 [google: drupal],这样的语法是可以自己设置的。

Drupal的模块越来越丰富了,记过所有的CMS和Blog的功能都可以实现了,遗憾的是中文资源有限。自从hiweed专心开发Linux后(发现hiweed drupal的链接已经转接到hiweed的Linux去了),Drupal的中文化彻底停止了,呵呵,有时候好奇其他几个语种的Drupal的翻译是怎么组织的。

BTW,使用了shunz改写trackback block,感觉挺不错的,方便大家互通有无:)

Blog分类: 

升级Trackback模块到v 1.30(Drupal 4.6)以及相关问题

对Trackback模块最新版本的追求充分体现了“时髦”的代价。Drupal4.5.0推出的时候,Trackback 推出了与之匹配的v1.14,这个版本的问题多多,譬如把trackback和评论混同起来,在每篇blog文章里凭空添加一个多余的"trackback" tab等等,在被多人诟病之后,作者作出了升级,但是这次升级并未作为Drupal 4.5.0的正式版本,正式版本仍然是v 1.14,升级版只是可以从CVS那里下载到,这次升级的最大变动就是数据库结构的更改,因为作者没有把这次升级作为最终升级版,所以并没有提供升级数据库的脚本。当时我为了紧追潮流,立刻升级为CVS,但是由于前后两个数据库的差别非常之大,我就放弃了手动升级数据库(表),而是删除了旧的,直接使用新的,好在当时没有几条Trackback,所以也不是一个问题。

从那以后我紧跟Trackback的CVS,好处是修正了一个又一个小错误,譬如不能直接删除trackback,在没有trackback的时候在blog的摘要下面显示"0 trackback",发送成功后无法显现成功发送的站点等等,终于我跟到了v 1.28,这个v1.28已经支持Drupal 4.6.0,所以就拿来用了 。值得注意的是,从v1.15到v1.28,trackback的数据库结构都没有发生改变。

终于,Trackback推出Drupal 4.6.0的正式版了,第一个版本是v1.29,本来要升级,但是一看,God,数据库结构又变了,正在吃惊之余,v1.30推出了,支持了Spam模块,提供了数据库升级脚本,但是只提供了从v1.14直接升级到v1.30的脚本,并没有其他版本升级的脚本,把俺这个铁杆的粉丝搁在了v1.28,进退两难了, 55~~。

懒了一段时间没去管它,但是想到最终这个问题还是要解决的,还是趁早吧,恰好又看到intertia贴的一条评论,所以花了点功夫把Trackback从v1.28升级到v1.30,主要是数据库的升级,步骤如下:

首先,建立一个Spam_trackbacks表:

CREATE TABLE spam_trackbacks (
trid int(10) unsigned NOT NULL default '0',
rating int(2) unsigned default '0',
spam tinyint(1) unsigned default '0',
last int(11) unsigned default '0',
PRIMARY KEY trid (trid),
KEY rating (rating),
KEY spam (spam),
KEY last (last)
);

然后,在原来trackback_received表格中添加一个新的叫做Status的column(主要是用于设置trackback是否publish):


ALTER TABLE `trackback_received` ADD `status` TINYINT( 1 ) UNSIGNED DEFAULT '0' AFTER `excerpt`

数据库的更改搞定(希望以上就是1.28与1.30数据库不同的地方,如果还有其他的不同,那可要哭死了~~),然后上传新的trackback模块,更改设定,设置spam,blah blah blah。。。按照惯例就行了。 到此搞定一切。

下面是其他几个问题:

首先关于显示最新trackback的block的问题,初步更改如下,主要解决了显示Unpublished的问题,和如何直接显示到Trackback的问题:
$result = db_query_range('SELECT * FROM {trackback_received} where status=1 ORDER BY created DESC', 0, 10);
//添加 status=1
while ($trackback = db_fetch_object($result)) {
echo "

  • $trackback->subject
  • ";
    //添加锚点,但是似乎只在firefox下有效,在IE下没有太大作用
    }
    ?>

    更进一步,这个区块可以用user_access函数来写,更优化一些,另外可以加入发布时间,利用theme函数来进行格式化等等,但是今天没有时间了,只改了最关紧的地方,其他的改天再改进吧。

    Blog分类: 

    今天出的一个问题和一些经验

    早上起得比较晚,打开自己的blog,本来想点看一下最新的评论,结果却发现了一个错误:

    user error: Got error 28 from storage engine query: ....

    Drupal把它归为PHP错误,但事实上这是一个MySQL错误,错误的原因是因为没有足够的存储空间。具体的说是没有足够的用来存储临时文件的空间。用下述指令查看了临时数据表的大小和存放位置:

    show variables like "tmp_table_size";
    show variables like "tmpdir";

    然后写信给空间提供商,报告了问题,2分钟后问题就解决了,但是由于这个数据库的存储错误,导致了我的数据库本身也发生了一些错误,修复以后出现了一个问题:匿名的用户无法正常访问Blog首页,其他网站也无法正常抓取RSS了。通常出现这种问题的检查方式如下:

    1. 检查 access control中,匿名用户的权限;(我的没有问题)

    2. 检查数据库中user_roles数据表,特别是 uid=0,rid=1这一个entry,它是设定用户访问权限的; (我也也没问题)

    3. 检查数据库中 user 数据表,看看uid=1有没有定义,以及它的rid有没有问题;(我也没有问题)

    4. 检查数据库中node_access 和 permission两个数据表;(我的也没有问题)

    有些让人ft了,所有可能出错的地方都查到了,结果一点问题都没有,可是匿名用户就是不能访问首页。最后想到了最土的一招:重启。呵呵,以前无论是电脑、手机、pocket pc还是ipod,只要出了解决不了的问题便拿来reset一下,问题都可根治,这次又拿Drupal试了一下: 在access control里把匿名用户"访问内容"的权限取消,然后保存;然后再启动匿名用户访问内容的权限,再保存; 完成了一个reset的过程,结果问题果然又解决了! --无语

    Free Tags: 
    Blog分类: 

    取代Outlook的Gmail

    Gmail越做越好了,虽然提供了POP3的功能,但是却没了下载邮件的必要,大致算来,已经有两个多月没有再打开过outlook了。电子邮件里最重要的是学校信箱每天成堆的信件,一大早起来收到了outlook里,白天在学校的时候想查看,却又没有办法,试过几种不同繁琐的办法,先是设定outlook收信的时候在学校信箱里留一个备份,这样可以方便查阅,但是很不方便,回信的时候,发出的信件没有备份,譬如和别人约定了时间见面,到了跟前突然忘记信里约到了几点,急得抓狂却也无法。并且学校信箱的界面很土,功能也不是很完善。

    然后又试过一阵子天天背着电脑去上学,虽然我的IBM X31非常轻,但是天天背来背去也觉得麻烦。既然拿电脑不方便,又试过只拿“邮箱”,找来了可以装在闪盘里的邮件软件,先是Dream Mail,后来又是Thunder Bird的便携版,但是闪盘的容量毕竟有限而这些邮件工具又各自有自己的短处,譬如Dream Mail,不提供英语的拼写检查,这可苦了俺这个错字布袋,只好又舍弃...终于有了Gmail,把所有信箱的信件都自动转发到Gmail,然后把Gmail的回信地址设置成学校信箱就行了,一切都变得简单了,还是google做得不错。呵呵,现在英文yahoo的信箱倒是也升级为1G了,可惜晚了一步。

    Free Tags: 
    Blog分类: 

    清华与“寸寸河山寸寸金”:这首诗该怎么读?

    宋楚瑜访问清华,清华赠字,是一首黄遵宪的《赠梁任父同年》,用小篆书就,清华校长想读,但是有些磕绊,所以当时的场面有些尴尬。其实尴尬的原因倒不是因为校长不认小篆或是没有读过这首诗,而是清华负责安排宋楚瑜访问行程的工作人员考虑不周,没有把细节问题想好。但是这两天却读到不少对清华校长的讥讽,觉得有些过了。

    今天又添了一条新的消息,是关于一个清华大学的教授在CCTV接受采访时,朗读这首诗的情形,消息的原作者是这样写的:

    后来他(指这位清华的教授)还继续朗诵了《寸寸河山》全诗,不时低头看稿子,吞吞吐吐地读到“侉离分裂”的时候,他仍然理直气壮地读道:“瓜离分裂。。。”不用怀疑了,这样的教授学识果然贯通古今,明白只读半边音是很危险的,于是自由发挥,拍拍装满知识的大脑袋,读出一个“瓜”来。可惜这个字偏偏读半边音是对的,或者刘教授深谙通假之理,要彻底消灭他所认定的生僻字?

    呵呵,不是很喜欢这个作者酸酸的文风以及他对这位教授尖刻的讥讽。不过倒是想就事论事的讨论一下这首诗里这一句话到底该怎么念。其实这个作者在援引这首诗的时候,已经把最关键的一个字给写错了,就是这个[亻瓜]字,原诗是做“[亻瓜]离分裂”的,而不是“侉离分裂”,这个侉字放在这里解释不通,查了黄遵宪的原诗,用的也是[亻瓜]。

    其次便是这个字到底读什么音。因为现代汉语并没有收录这个冷僻字,所以唯一的参考就是古音了。[亻瓜]有两义,一是“不正”(《集韵》),一是“分离”(《集韵》、《广韵》),其实两义相通,不过在诗中应该解释为“分离”,做“分离”讲时,这个字有两种读音,一为“苦瓜切”(广韵)或是“枯瓜切”(集韵),也就是读作“kua”;但是也可以读作“姑华切”也就是“gua”(集韵),所以诗里把这个字念做“瓜”也无不可,也是有本所出的,没有什么大惊小怪的。当然读“kua”可能更符合习惯一些,因为查了台湾出版的异体字字典,这个字读作“ㄎㄨㄚ”(kua),不过读“gua”也不该被嘲笑吧,倒是大惊小怪有些好笑了,呵呵。

    Free Tags: 
    Blog分类: 

    冰淇凌圣代的由来: 西北与康奈尔之争:)

    [img_assist|fid=119|thumb=1|alt=草莓圣代|caption=草莓圣代]呵呵,今天在图书馆里看书,读到一段我们学校和康奈尔大学的公案,准确说是埃文斯顿与伊萨卡的公案:争得不是什么伟大的学术发明,而是谁先发明了冰淇凌圣代(Ice Cream Sundae) ,笑得肚子疼。引一段N年前我们本地报纸(Evanston Review)上的话:

    “尽管伊萨卡(Ithaca)可能早在1897年就有了圣代,就像他们商会宣称的那样,但是他们得到圣代肯定是通过两个途径。要么是一个西北的学生把圣代带回了家,要么是一个康奈尔的学生从埃文斯顿(Evanston)把圣代带了回去。”

    当然不只伊萨卡和埃文斯顿宣称他们发明了圣代。威斯康辛一个叫做Two Rivers的地方也宣称他们最先(1881年)发明了圣代。当时比较流行“冰淇凌苏打”(Ice Cream Soda),但是出于宗教的原因,在星期天也就是安息日(the Sabbath)的时候,店铺是不能卖苏代饮料的,可是有一个顾客偏偏又点了Ice Cream Soda,无奈之下,店主只好做了折中,把巧克力糖浆浇在冰淇凌上卖给顾客,于是就成为历史上第一支圣代。现在在威斯康辛 Two Rivers,还树立了一块标志历史遗迹的牌子纪念圣代的发明。

    而伊萨卡则宣称他们在1882年发明了圣代,也是一个店主标新立异,把樱桃糖浆浇在冰淇凌上,并放上一颗糖腌樱桃卖给顾客,因为顾客的反应良好,店主还在当地的报纸上打了广告:CHERRY SUNDAY - A new 10 cent Ice Cream Specialty. Served only at Platt & Colt's. Famous day and night Soda fountain. 因为这个东西是星期天发明的,所以就叫做Cherry Sunday了,据说是Sundae的字源。

    最后是我们这儿的故事,也是在19世纪末,作为一个保守的小城,Evanston很早就通过了著名的 “蓝法” (Blue Laws)(呵呵,顺便提一句,现在Evanston还是基督教妇女禁酒联合会(UWTU)总部所在地,二三十年代的禁酒令也与此地又莫大的联系),并且对安息日的监督非常严格,所以周日这天大家都没有Ice Cream Soda 吃,聪明的商家就发明了Sundae,避开安息日的禁忌,当时的宗教团体还大大的称赞了这种做法:即表示了对主的尊重,又表示了满足了顾客的需求。

    呵呵,或者圣代本来就是各地独立发明的,因为并没有多少的技术含量,但是Evanston坚持认为Sundae这个词是他们发明的,因为Two Rivers或是伊萨卡都没有用过这个词。

    不管怎样,麦当劳一块钱一个的草莓圣代仍然是消暑佳品,就是吃多了容易发福:)

    Blog分类: 

    不捕之猫

    [img_assist|fid=109|thumb=1|alt=伸个懒腰,准备歪着|caption=伸个懒腰,准备歪着]
    [img_assist|fid=113|thumb=1|alt=舒服不如躺着|caption=舒服不如躺着]
    [img_assist|fid=117|thumb=1|alt=躺着不如玩着|caption=躺着不如玩着]苏子说: 养猫以待鼠,不可以无鼠而蓄不捕之猫;蓄犬以防奸,不可以无奸而蓄不吠之狗。可惜妮妮偏偏就是个吃白饭的,从未见过她捕老鼠,倒是她自己经常扮演一个硕鼠的角色,要么在沙发上练爪子,抓坏沙发;要么把MM的发卡当玩具玩,却又玩得不知所踪。高兴的时候疯跑一阵子,跑得自己都控制不了方向,重重的撞在门上;累了就找个地方歪着。反正歪着也是歪着,不如跑到主人面前卖乖。

    乖乖的歪着也就罢了,却总要找点东西玩,于是我杂乱的桌面就成了她最好的娱乐场所,要么一根电线,要么一个曲别针,都成了消遣之物。

    Free Tags: 
    Blog分类: 

    对awLatestSearches的进一步修改

    呵呵,其实对awLatestSearches稍加修改可以增加不少的其他有趣的功能,譬如添加其他搜索引擎的搜索结果,举个例子,如果想添加百度的搜索结果,只需要在原来的代码上添加
    ...
    #Baidu
    else if (strpos($refer->url, 'ttp://www.baidu.', 1) == 1) {
    $count++;
    $link = $refer->url;
    $text = preg_replace('/^.*?p=/', '', $refer->url);
    $text = preg_replace('/&.*$/', '', $text);
    $text = _awLatestSearches_cleanupText($text);
    if (strpos($link, '&start=') === FALSE &&
    strpos($link, '&b=') == FALSE)
    $firstPage = TRUE;
    else
    $firstPage = FALSE;
    $output .= 'Baidu: ' . (($firstPage) ? '* ' : '') .
    l($text, $link) . '
    ';
    }
    ?>
    就行了。其他的搜索引擎也可以类推,只要稍微改动搜索引擎的地址即可,但是这样更改后,结果的排序就不准确了,因为作者判断排序的变量 $firstpage 是根据google的搜索结果url来判断的,对百度的判断可能不准确。

    其实进一步,对这个模块稍微修改一下就可以得到你的网站在搜索引擎(特别是google)的排名到底在第几页,原理也很简单,根据 $firstpage的定义方式,定义 $secondpage, $thirdpage等等,或者直接定义一个 $nth_page 变量,判断结果的排在第几页。

    可惜的是我无法一试了,上次设置cron任务的出错的时候,我的Drupal的数据库中的accesslog表发生了错误,虽然后来用 MySQL的repair指令进行了修复,但是似乎不能写入最新的“访问记录”了,所以我的右上角的“Latest Incoming Search”其实是几天前最新的搜索结果,最近一两天的结果由于accesslog表的问题,其实是无法显示出来的,呵呵,还是重新检查一下数据库最关紧:)

    Blog分类: