2013年10月17日星期四

Error executing aapt: Return code -1073741819

参考:http://stackoverflow.com/questions/10699439/aapt-filing-with-error-code-1073741819

解决方法:去掉styles.xml中的@+id.

2013年9月2日星期一

判断statusbar是否存在

private boolean checkStatusbar(){
   Rect rect=new Rect();
   getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
   //屏幕高度还有别的办法得到,不赘述
   return (rect.bottom-rect.top)
           ==getResources().getDisplayMetrics().heightPixels;
}

另一种计算一般statusbar高度的方法(固定值,不是实时的高度):
(参考http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/)
private int getStatusBarHeight() {
   int result = 0;
   int resourceId = getResources()
           .getIdentifier("status_bar_height", "dimen", "android");
   if (resourceId > 0) {
         result = getResources().getDimensionPixelSize(resourceId);
   }
 return result;
}

2013年8月31日星期六

onTouchEvent, onClick及onLongClick中各事件的顺序

(首先要知道:Returns true if the listener consumed event, false otherwise.)

onTouchEvent的一般过程:
   down-- move --up

全返回false:
down--move--longClick--move--up--onClick

onLongClick返回true:
down--move--longClick--move--up

up返回true:
短按:
down--move--up------longClick(??why?)
长按:
down--move--longClick--move--up

move返回true:
无影响

down返回true:  (不是点击事件)
短按:
没有click
长按:
没有click和longClick

blogspot插入代码

用google-code-prettify.
1.修改布局,在header里面加上:
<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"></link>
<script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">

2.<body onload="prettyPrint()">

3.将代码放在标签中<pre class="prettyprint">...</pre>
或者<code class="prettyprint">...</code>
html代码还需要转化.
xml标签可能需要用:
&lt;  替换  <
&gt;  替换  >

2013年8月23日星期五

Show screen of details about a particular application

public static void showDetailsOfApp(Context context,
 String packageName) {
 Intent intent = new Intent();
 final int apiLevel = Build.VERSION.SDK_INT;
 if (apiLevel >= 9) {
 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
//  .setData(Uri.fromParts("package", packageName, null));
  .setData(Uri.parse("package:"+packageName));
 } else {
  final String appPkgName = (apiLevel == 8 ? "pkg"
    : "com.android.settings.ApplicationPkgName");
    intent.setAction(Intent.ACTION_VIEW)
    .setClassName("com.android.settings",
      "com.android.settings.InstalledAppDetails")
    .putExtra(appPkgName, packageName);
    }
  context.startActivity(intent);
  }

2013年8月12日星期一

读史记-夏本纪第二

(注解里面有很多注音解释,叫作反切。)

1.“天下皆以舜之诛为是”
  之前有,“尧求能治水者,群臣四岳皆曰鲧可。尧曰:‘鲧为人负命毁族,不可。’四岳曰:‘等之未有贤于鲧者,愿帝试之。’”

2.“国号曰夏后,姓姒氏”

3.“禹子启贤,天下属意焉。”
  接着就是“有扈氏不服,启伐之”


2013年7月21日星期日

《门前》-顾城

我多么希望,有一个门口 
早晨,阳光照在草上 

我们站着 
扶着自己的门扇 
门很低,但太阳是明亮的 

草在结它的种子 
风在摇它的叶子 
我们站着,不说话 
就十分美好 

有门,不用开开 
是我们的,就十分美好 

早晨,黑夜还要流浪 
我们把六弦琴交给他 
我们不走了 

我们需要土地 
需要永不毁灭的土地 
我们要乘着它 
度过一生 

土地是粗糙的,有时狭隘 
然而,它有历史 
有一份天空,一份月亮 
一份露水和早晨 

我们爱土地 
我们站着 
用木鞋挖着泥土 
门也晒热了 
我们轻轻靠着,十分美好 

墙后的草 
不会再长大了,它只用指 
尖,触了触阳光 

2013年7月20日星期六

2013年7月7日星期日

《浪潮》(Die Welle)


原型:
1967年,加利福尼亚州帕罗奥图市(Palo Alto)的Cubberley高中,历史老师罗恩·琼斯(Ron Jones)在快讲到纳粹、二战的时候,被学生问到的问题难住了:为什么德国民众会声称他们对屠杀犹太人毫不知情?为什么镇上的人们,铁路工人,教师,医生,等等,都声称他们对集中营、大屠杀一无所知?为什么身为那些被屠杀的犹太人的邻居甚至好朋友的德国市民说犹太人被捕的时候他们不在那里?这位老师决定花一个星期的时间研究一下这个问题。于是他开始了实验,结果则表明,只用一个星期的时间,法西斯主义即可复活。


周一:纪律铸就力量

   Strength through discipline。Jones老师引入了“制造”纳粹德国的一个因素:纪律。但没提到跟纳粹德国的关系,而是讲解了纪律之美:遵守纪律,一个努力而坚持训练的运动员会在运动场上多么成功;芭蕾舞员或画师通过努力而使自己动作或作品臻于完美;献身科学的学者在追求真理时会拥有无与伦比的耐心……这就是纪律,自我训练,自我控制,意志的力量;它能将现实中的困难转换成精神和肉体上的容易事情,最终取得最大的胜利。
   为让学生体验纪律,老师要求学生练习并采用一种新的坐姿:双脚平放在地上,双手放在背后,腰背挺直。“有没有觉得呼吸更为通畅?这样可以让你更清醒。这样的坐姿再好不过。”老师还训练学生从教室外迅速回到教室内的整个过程不弄出一点声响,且花费时间不超过15秒。
Jones老师
坚持他的原则,并渐渐对结果感到惊讶。捣蛋鬼变成了榜样,他们的勇于发言,见解独特,答案明确。回答问题的也不再仅仅是那几张老面孔,无论是问题还是答案的水准有了惊人的提高。学生们注意力更集中,听讲也更专心。
琼斯
原先以为,学生们会认为专制型的教学方式可笑,会抵触,不配合,但结果恰恰相反。要求学生们遵守纪律,服从命令很简单,意外得简单。学生也变得更加有效率。

周二:团结就是力量

    Strength through community。周二,老师走进教室,发现学生们鸦雀无声地、以“正确”的坐姿坐在自己的位子上。有的人的脸上挂着取悦老师的微笑,而更多的人眼睛只是直勾勾地向前看,充满求知欲的样子。为了缓解这种紧张气氛,老师在黑板上写下两行字,第一行是Strength through discipline,下面一行是Strength through community。然后,就在学生们严肃的寂静中,老师开始讲述团结的意义。老师根据自己作为一个运动员、教练、历史学者的亲身经历,编造了一些故事。“Community is that bond between individuals who work and struggle together....It's feeling that you are a part of something beyond yourself, a movement, a team, La Raza, a cause.”通过给出黑板上的两句口号,从学生们相互之间的眼神里看,他们似乎已经感受到了那种集体归属感:每个人都是平等的,大家在一起做一件事。
   上午的课结束时,老师创造了一个敬礼手势,右手做波浪状(与《浪潮》里的相似),并称之为“第三浪潮”(The Third Wave)。既然有了行礼手势,老师就规定,所有成员在教室外见面时必须如此行礼。于是,当学生走在大厅里可能会突然看到三个学生相互做浪潮手势;在图书馆或者体育馆,本课堂外的学生也会看到这个奇怪的动作……总而言之,这个敬礼的手势在全校甚至小镇都引起了注意。许多其他班的学生询问是否可以加入这个班。

周三:行动实践力量

这一天,老师决定给每一个愿意继续留下来进行“试验”的学生发一张“会员卡”。结果大家都愿意留下来。不过,今天教室里的学生数量从30变成了43——有13个人翘了自己班的课来加入琼斯老师的课堂。在发下去的卡片中,老师对其中三个卡片标记了红色的X形,然后对全班说拿到这样卡片的同学的一个任务是向老师汇报任何违反纪律的行为——老师没有说是谁拿到了X卡片,也没有说有多少人拿到X卡片。
   然后,老师开始讲述“行动”的意义:没有行动,任何纪律、团结都是毫无价值的。老师强调了勤奋、努力的重要性。孩子们似乎真的有所触动,在上了几节课后,学生们纷纷表示,“琼斯先生,我从来没有像这次一样学到这么多东西”,“琼斯先生,您何不一直这样教下去”……老师对此很震惊,因为他知道自己采用的是极端的“填鸭式”教学,而学生们居然感觉很舒适很自然很受用!难道学生们愿意做老师所安排的任何事情?琼斯决定试探试探。
   于是,他开始指派任务:某某来设计一个“第三浪潮”的标志;某某来负责阻止任何非“第三浪潮”成员进入这个教室;某某必须在明天就能够记住所有成员的名字和家庭住址;某某必须成功地让附近小学的20名学生使用利于学习的正确坐姿;某某负责阅读这个小册子并且在这节课结束的时候向全班人复述里面的所有内容;全班所有人都必须告诉老师一个你认为足够可靠从而可以加入“第三浪潮”的朋友的姓名和住址……在分配任务的最后,老师给出了吸纳新会员的规则:任何新会员必须由老会员推荐,然后由老师发给其卡片,最后,这位申请者必须能够复述“第三浪潮”的所有规定并且宣誓服从这些规定才能批准其成为会员。
   整个学校变得活跃起来。人人充满好奇:学校的厨子询问“第三浪潮”饼干是什么样子的,琼斯告诉他是巧克力片;在某天下午的教职工会议上,校长跑进来朝着琼斯做了一个浪潮手势,琼斯当然只好回敬过去……这一天结束的时候,已经有超过200名学生加入了“第三浪潮”。老师对此感到有点害怕。然而,更让老师吃惊的是,他明明只指派了三名同学进行“监视”和汇报工作,一天下来,却有将近20人跑过来对老师说“某某不遵守规矩”之类——在独裁环境中,似乎人人都可以成为告密者!
   班上本来有三个女生,之前她们是最聪明成绩最好的。但是,在这个平均主义的浪潮下,对于个体的褒奖在这个集体中已经不存在了,于是在充满“军国主义”气氛的试验中,她们似乎有些迷糊有些忧心忡忡。她们对于班上的活动大都不主动参与。她们与自己的家长谈论了班上发生的事情。然后其中一位家长邀请琼斯老师到家里做客。老师告诉这位家长,自己只是在学习二战时期德国的人性。结果这位家长听到老师的解释后非常高兴,表示他会跟其他的家长说明白,让老师不用担心家长方面的问题。——到这里,似乎已经能够解释刚开始提出的问题“为什么镇上的人们,铁路工人,教师,医生,等等,都声称他们对集中营、大屠杀一无所知?”这似乎是人性本能的漠视。
   班上有个叫罗伯特(Robert)的学生,平时他总是独自一人,午饭也经常独自在教室里吃。然而,“第三浪潮”让罗伯特获得了新生:他跟大家一样平等,他终于可以做些自己觉得有意义的事情。周三的下午,琼斯发现这个小子一路尾随他,于是问道他究竟在干嘛。罗伯特说:“琼斯先生,我要做您的保镖,我担心有什么事情发生。可以吗?”于是,琼斯有了一位保镖。这位保镖总是在琼斯的右边,他会一路微笑着与其他成员行浪潮礼,会在教职工会议上安静地站在琼斯旁边并微笑着向其他老师解释说自己不是学生,而是保镖。
   虽然有了个保镖,今天的琼斯老师还是筋疲力尽,“第三浪潮”似乎已经失控了,孩子们根本不知道自己在干什么。他必须想办法阻止。
“ 我当时虽然参加了,但应该算是以一个旁观者的身份”,他当年的学生Phillip Neel如今说道。有的学生全身心地投入到这场运动中,但也有学生从根本上反对这场运动。“一次课间,我对我最好的朋友说了一个关于‘第三浪’的笑话,结果第二天,Jones先生在所有学生面前提到了这事,从那时起我开始感到害怕。” Neel清楚,肯定是他最好的朋友告发了他。“而那时他只是面无表情地望着前方。从那一刻起我意识到,事态的发展已经失去了控制。”

周四:力量源于荣耀

     Strength through pride.老师想到了终结浪潮活动的方法。他向学生们宣布,“第三浪潮”不是一次教学试验,实际上是一次全美范围的有预谋的大型运动,旨在选拔那些优秀的年轻人来完成国家的政治改革运动,全国像老师这样在进行组织活动的有数千个;“第三浪潮”的最终目的是要像其他人证明,通过纪律、团结、荣耀以及行动,这个社会可以更加美好;如果大家能够改变学校的运作方式,那就可以改变工厂、商店、大学和其他任何机构的运行方式;现在所有的成员都是被选中的优秀青年,如果今后能够利用这四天里学到的,那么“第三浪潮”终将改变这个国家的面貌。
     为了让学生们更加坚信这个消息,老师宣布周五中午所有“第三浪潮”成员在学校小礼堂进行一次集会,到时候会有一位总统候选人会在新闻发布会上正式宣布“第三浪潮”运动的存在,老师希望所有成员能够亲眼目睹这一“历史性事件”——当然,是通过电视,而非现场。

周五:理解的力量

    Strength through understanding。
    学校大礼堂。超过200名学生笔直地端坐在那里,天花板上挂满了 “第三浪” 宽大的横幅。Jones作了简短的致辞,200只手臂对着他举起,做了“浪潮”问候礼。这场实验只进行了五天,却是漫长的五天。
 “当然”,Neel说,“我也在场,作为外人很难想象,短短几天内形成了何种团体的压力。”
 礼堂内,Ron Jones打开一台电视。出现的只有雪花。学生们等待着。屏幕上除了雪花别无他物。学生们仍然等待着。他们已经习惯了纪律和服从。几分钟后,终于有人问道:“不存在什么领袖,对不对?”礼堂里炸开了锅。Jones开始讲话,不再大声、严厉,而是柔和、带着自责:“没错,但我们差一点就成为了优秀的纳粹。 ”  
 没有人愿意提及这场实验
 Jones给学生们播放了一部关于第三帝国的影片:帝国党代会、集体、纪律、服从,以及这个集体的所作所为:恐怖、暴力、毒气室。Ron Jones看着一张张不知所措的脸。最初的那个问题得到了回答。他说:“和德国人一样,你们也很难承认,竟然做得如此过分,你们不会愿意承认被人操纵,你们不会愿意承认,参与了这场闹剧。”  
 他说得没错。第二天,学校里笼罩的压抑的气氛。没有人愿提及这场实验。“我自己当时陷得不深。所以对我来说,这只是一次难得的经历。”但其他人从此对此只字不提,直到Philip Neel因为纪录片和他们联系。  
 Neel 在收集材料时得知,许多人感到尴尬,居然如此轻易地被“浪潮”席卷。特别是高年级的学生,他们原本不是Jones班上的,但为了“第三浪”,他们逃了原本该上的课。“那是1967年,他们中许多人当时热衷政治”,Neel解释道。“他们参加了学运,甚至黑豹(60年代美国黑人运动)。他们当时都感到无比震惊,如此轻易就放弃了自由。”
   试验终告结束。


 “这个实验之所以会产生这样的结果,是因为我们中的很多人孤独、缺乏家庭的温暖、集体的关心,缺乏对一个群体的归属感。即使把这个实验放在今天,也会得出同样的结果……去你们当地的学校看看,那里找得到民主吗?”——Ron Jones某次采访时的回答.




  参考:
1.http://genrefilm.baike.com/article-88286.html    (不太可信,过于中式教科)
2.http://blog.tianya.cn/blogger/post_show.asp?idWriter=0&Key=0&BlogID=327181&PostID=23081471
3.(英文原链接实在看不下去)

2013年6月23日星期日

你为什么读书?

越来越讨厌的知乎上终于又看到一个有共鸣的回复,更难得有人也这么喜欢史铁生:
http://www.zhihu.com/question/20821346/answer/16299563

------------------------------------

读过楼上几位的答案,感觉理由很漂亮,但是也很空洞。其实读书根本不需要理由,因为抱着一个功利的目的读书,你最终一定会感到失望。屡次失望就会带来兴趣的消磨,什么事情一旦失去兴趣,再美好的事物都会变成一种折磨。

记得国外曾经做过一个实验,说读书是各种学习方式中,效率最低下的。读一本书带来的收获,并不比你看一部电影、做一次旅行、听一节公开课、进行一场有效沟通得到的更多,而且以上方式都比读书来的更加轻松自在。

所以我的读书态度就是:想读就读。就这么简单。不要纠结于一个读书的理由或者目的。

我的书龄不长不短,今年刚好十个年头。从我十岁起第一次独立阅读长篇小说开始,我始终保持着每天不少于四个小时的读书时间。我家住在新疆,2009年7月,离我家车程需要两小时的乌鲁木齐市爆发了群体性事件(我不说,大家都懂),全疆断网十月零十天。那是我读书速度达到神级的一段日子,平均每天阅读量十万字,最高一次是早上九点到晚上九点,十二小时读了二十一万字。此后再难超越。这件事情证明,读书最好的方式就是:远离手机和网络。

我热爱阅读,不像大家的理由那样光辉璀璨,其中多少有些无奈。因为身体原因,我从小就不能走路,所以也没有上学。因为没有上学,所以朋友极少,大多是家里的亲人以及儿时的玩伴。朋友们总说我有点自负,其实他们哪里明白,我的自负,正是源于自卑。过去,每当看着身边的同龄人一起出去逛街、滑雪、跳舞、打保龄球,我都很想说一句:我也想去。可是我仅有的自尊心却不允许自己向人示弱。我只是淡淡地告诉他们:我不喜欢出去玩,我喜欢躺在床上读莎士比亚。

久而久之,读书就成了我的一个习惯。而随着时间流逝,曾经的朋友大多有了各自的学业、事业、爱情和他们自己的生活,但我的世界里,只有那些隽永的文字和古老的书籍陪伴我。如今我可以坦白地说,最初读书很大程度上是为了装酷,现在读书更多是为了了解自己不知道的世界。我一向唾弃“天赋论”,如果上天真的赐予每个人一种天赋的话,那我想自己最大的天赋就是“对未知事物抱有一种生吞活剥的好奇心”,看见一本没读过的书,我就想一口气翻到底,读到一句喜欢文字,我就会反复阅读恨不能出口成诵。这一切没有任何理由和目的,仅仅是因为热爱。而且我也明白,认真读书,认真生活,这是我唯一能做到的事情。

十岁时阅读的第一部长篇小说,是从姐姐家借来的郭敬明的《梦里花落知多少》,当时觉得很有趣,过了两年觉得很无聊。喜欢过一段时间的日系推理小说,诸如江户川乱步、东野圭吾、岛田庄司、松本清张、横沟正史、宫部美幸等人,都是我偏爱的作家。十二岁以后,基本上都在阅读金庸、古龙、黄易、梁羽生、倪匡等人的作品,尤其是金庸先生的大作“飞雪连天射白鹿,笑书神侠倚碧鸳”,我都看得十分着魔。十四岁左右,有幸拜读过几位俄国硬汉的作品,诸如契科夫、托尔斯泰、高尔基、奥斯特洛夫斯基等等。十五岁是我人生的一个转折点,是我经历过最痛苦和最黑暗的日子。陪我度过那一时期的是各种人物传记,我不是看他们如何攀上辉煌的顶峰,而是看他们如何度过人生的低谷。我如今的价值观、人生观和世界观,我想都是在那时形成的。

对我比较重要的作家有两个,一是史铁生,二是周德东。史铁生老师的那本《我与地坛》,不知道陪我度过了多少个夜晚,它在我心中的地位,不亚于《圣经》在基督徒心中的神圣。而周德东这个恐怖小说家,是第一个在写作技巧上给我带来启示的人。他的恐怖小说传递给我的不仅是故事,还有人与生活的戏剧性。

其它书籍不知一时该从何提起,或者根本没有必要提起,那些走马观花读过的书,不提也罢。

如今,我更喜欢阅读古典文学,没什么理由,只是兴趣变了。我从来不看网络小说,即使看,也是等到几年以后,人家都看完大结局了,我才从头开始看,什么《鬼吹灯》、《盗墓笔记》、《明朝那些事儿》都是如此。我曾经按自己的喜好,把所有书分为“优、良、中、劣”四个等级,结果发现光是“优”的书,我这辈子都读不完。所以,我不愿意将自己本就有限的时间,浪费在那些尚未经过时间检验的书上

旁人说我读书很多,对于这一点,我是不认可的。我反倒一直认为,自己读过的书,真的少之又少,知识面也狭窄的可怜。这绝不是读书人惯有的谦虚,而是我心里的实话。我对读书的理解,早已经在自己的日记中写过:读书不光不能增长我们的见识,反倒更加暴露我们本身的无知。世界是庞大的,你所掌握的那点儿自以为是的知识,仅仅只是沧海一粟而已,甚至对整个世界而言,它根本不配称为“知识”,那不过就是一点儿必不可少的生活常识。说到底,每个人都是一只坐井观天的蛙,仅此而已。

我说了这么多,不知道题主满不满意。其实我想表达的东西,只有一句话:人生本就短暂,与其把时间花费在“我为什么读书”的问题上,不如立刻拿本书来读一下,我相信你会找到答案的。

2013年6月8日星期六

onPageStarted,shouldOverrideUrlLoading

页面第一次加载:
onPageStarted()

点击页面上的超链接:
onPageStarted()   此时,参数中的url仍是之前的地址
shouldOverrideUrlLoading()   这个url参数才是新的
onPageStarted()   也是新的

2013年6月4日星期二

problem:The type android.support.v4.app.ListFragment cannot be resolved

导入一个项目后错误提示(不完整,引用了ActionbarSherlock):
android The project was not built since its build path is incomplete.
The type android.support.v4.app.ListFragment cannot be resolved.

IDE是eclipse,查了半天也没什么头绪。最后看项目的目录结构有点不对劲,library排在了src前面,不知道是不是这个有影响,修改了下Order and Export的顺序,果然好了:

2013年5月4日星期六

eclipse crashed when exporting apk

#
# An unexpected error has been detected by Java Runtime Environment:
#
#  SIGBUS (0x7) at pc=0x00007f99ab324031, pid=14598, tid=140296281274112
#
# Java VM: Java HotSpot(TM) 64-Bit Server VM (10.0-b22 mixed mode linux-amd64)
# Problematic frame:
# C  [libzip.so+0xb031]
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

暂时解决方法:
取消自动编译

ubuntu 11.10安装xen


(感谢web.archive.org/,让找到我以前的这个帖子,之前的域名和空间都没放弃了.)

参考文章:
http://www.beyondlinux.com/2011/11/02/install-xen-4-1-and-setup-your-cloud-os-on-ubuntu-11-10/
http://blog.csdn.net/leeagle/article/details/6877410
http://bderzhavets.wordpress.com/2011/07/23/build-xen-4-1-1-on-ubuntu-11-10 这个得翻墙
ubuntu从11.10开始内核版本号到3了,也从这个版本内核开始重新支持xen了,不必重新编译内核了.
首先ubuntu不能是用wubi安装的,切忌.
其次,32位和64位系统的区别也很重要。64位按下面步骤很简单,32位就不同,因为xen需要开启pae,默认是没有开启的,所以32位ubuntu首先得执行下面这个命令:

sudo apt-get install linux-image-server
1.安装xen hypervisor.
sudo apt-get install xen-hypervisor-4.1 xen-utils-4.1 xenwatch xen-tools xen-utils-common xenstore-utils
这里xen-hypervisor-4.1要分32位、64位,64位系统用xen-hypervisor-4.1-amd64,32位用xen-hypervisor-4.1-i386.
当然用新力得(synaptic)找xen-hypervisor安装 会直接处理相关软件
这个时候查看/boot/grub/grub.cfg会看到启动列表里面就会有xen的启动项了
2.重启选择xen内核
命令xm info 可以查看虚拟机信息
3.重启后可能进去的是tty1(如果你进入的是正常的图形界面,这一步可以跳过,谢谢yan提醒)
这是因为独立显卡驱动的问题,先下载好在tty1下安装然后切换到tty7就ok了.
附:linux有7个工作组:tty1-7,其中tty1-6是命令模式,tty7是图形界面,我们destop版默认进入的就是tty7,用ctl+alt+F1/../F7可以切换工作组.
4.安装xen相关工具
sudo apt-get install virtinst virt-viewer virt-manager
5.配置xend
编辑/etc/xen/xend-config.sxp文件:
(xend-unix-server yes)
编辑~/.bashrc :
添加 export VIRSH_DEFAULT_CONNECT_URI=”xen:///”
6.创建虚拟机
运行软件virt-manager,这里图形界面就比较简单了,但是创建时因为相关资源路径问题可能会报以下错误
6.1 ******/usr/lib/xen/bin/qemu-dm:****
路径中xen应该是xen-4.1,解决办法如下
mkdir /usr/lib/xen -p
cp /usr/lib/xen-4.1/* -r /usr/lib/xen/
6.2 ****** libvirtError: POST操作失败: xend_post:来自 xen 守护进程的错误:****
查看日志 /var/log/xen/xend.log 和 /var/log/xen/qemu-dm-demo.log
日志显示/usr/share/qemu/keymaps/en-us could not be found, the keymaps ***
路径中qemu应该是qemu-linaro,解决办法如下

cp -r /usr/share/qemu-linaro/ /usr/share/qemu
这样创建过程基本没有问题了.

2013年4月8日星期一

不该被遗忘的人-陈梦家

1.
《殷虚卜辞综述》
《美帝国主义劫掠的我国殷周铜器集录》

2.
1957年,他发表《慎重一点“改革”汉字》和《关于汉字的前途》,不赞成废除繁体字实行简化字,以及实行汉字拉丁化

2013年3月29日星期五

java puzzers 94: shuffle


主要代码就是这一段:
        Random rnd=new Random();
        for (int i = 0; i < size; i++)
            swap(array, i, rnd.nextInt(size));

这个算法是不公平的,Collections.shuffle用的是:

        for (int i = size; i > 1; i--)
             swap(arr, i - 1, rnd.nextInt(i));

其实就是(有点难看):

        for (int i = 0; i < size; i++)
            swap(array, i, i+rnd.nextInt(size-i));



java puzzers:"+","=="

匆匆看完,大部分都很有意思,不过看完都没什么印象,只有一个我现在还偶尔碰到.

puzzer 43:(排版稍微有点不一样)
public class AnimalFarm{
  public static void main(String[] args){
     final String pig = "length: 10";
     final String dog = "length: " + pig.length();
     System.out. println("Animals are equal: "+ pig == dog);
     }
}

很明显能看出pig!=dog,但是这个迷题的重点却在输出语句上,原文将“+pig==dog”显示在第二行,错误就更不容易看出来。
运算符“+”和“==”的优先级,前者高.(不管是加法还是字符串连接)

2013年3月28日星期四

ArrayList笔记


Jdk6:

1.初始化(源码):
public ArrayList(Collection<? extends E> c) {
   elementData = c.toArray();
   size = elementData.length;
   
// c.toArray might (incorrectly) not return Object[] (see 6260652)    if (elementData.getClass() != Object[].class)
       elementData = Arrays.copyOf(elementData, size, Object[].
class);
   }

下面是这个代号6260652中说到的bug代码示范:
   List l = Arrays.asList(args);
       System.out.println(l.toArray());
       System.out.println(l.toArray(new Object[0]));

EXPECTED -
[Ljava.lang.Object;@10b62c9
[Ljava.lang.Object;@82ba41

ACTUAL -
[Ljava.lang.String;@10b62c9
[Ljava.lang.Object;@82ba41

2.arrayList.toArray()内部调用的也是Arrays.copyOf

3.数组复制:
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

4.
默认初始容量10, 扩容方法ensureCapacity(int minCapacity)是取

min{ minCapacity, (oldCapacity *3)/2+1 }

2013年3月27日星期三

queryBroadcastReceivers ACTION_MEDIA_MOUNTED

ACTION_MEDIA_MOUNTED等一系列与external media状态有关的broadcast actions都需要在intent-filter中设置scheme为file。

要查询这些事件的receiver,queryBroadcastReceivers的参数intent也必须匹配data的scheme属性.

implicit intents需要匹配:(参见intent 以及 intents-filters)

1.action
2.data (both URI and data type)
3.category

其中data的uri格式是:
scheme://host:port/path

在ACTION_MEDIA_*事件中,scheme为"file",host和port省略,path是external media的路径。

2013年3月25日星期一

RelativeLayout中的overlaping

今天用RelativeLayout,左边是上下两层textview,右边是一个checkbox,出现了overlapping,以前没怎么用过相对布局,才知道和FrameLayout一样也会overlapping.

具体:

前者不设置,或者与parent左对齐,这里没什么必要。
后者如下设置:
android:layout_alignParentRight="true"
android:layout_toRightOf="@+id/left"
结果以前者为参照,后者会被覆盖。

改为:
前者如下设置:
android:layout_toLeftOf="@+id/right"

后者只设置与parent右对齐:
android:layout_alignParentRight="true"
这样结果就会以后者为参照,左边的textview如果过长会自动换行。

2013年3月24日星期日

AsyncTask problem in HTC

    出现下面的出错信息,只是因为我在doInBackground()里面对listview做了初始化,当然这好像也算ui操作,但是其它品牌的手机都没问题,只有htc有问题,这我就弄不明白了,记录一下吧。

-----------------------------------------------------------
E/AndroidRuntime( 6172): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime( 6172): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime( 6172): at android.os.AsyncTask$3.done(AsyncTask.java)
E/AndroidRuntime( 6172): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java)
E/AndroidRuntime( 6172): at java.util.concurrent.FutureTask.setException(FutureTask.java)
E/AndroidRuntime( 6172): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java)
E/AndroidRuntime( 6172): at java.util.concurrent.FutureTask.run(FutureTask.java)
E/AndroidRuntime( 6172): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
E/AndroidRuntime( 6172): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)
E/AndroidRuntime( 6172): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java)
E/AndroidRuntime( 6172): at java.lang.Thread.run(Thread.java)
E/AndroidRuntime( 6172): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
E/AndroidRuntime( 6172): at android.os.Handler.<init>(Handler.java)
E/AndroidRuntime( 6172): at android.view.GestureDetector$GestureHandler.<init>(GestureDetector.java)
E/AndroidRuntime( 6172): at android.view.GestureDetector.<init>(GestureDetector.java)
E/AndroidRuntime( 6172): at android.view.GestureDetector.<init>(GestureDetector.java)
E/AndroidRuntime( 6172): at android.view.GestureDetector.<init>(GestureDetector.java)
E/AndroidRuntime( 6172): at android.widget.ListView.<init>(ListView.java)
E/AndroidRuntime( 6172): at android.widget.ListView.<init>(ListView.java)
E/AndroidRuntime( 6172): at android.widget.ListView.<init>(ListView.java)
E/AndroidRuntime( 6172): at cn.wq.disableservice.MainActivity.b(Unknown Source)
E/AndroidRuntime( 6172): at cn.wq.disableservice.d.a(Unknown Source)
E/AndroidRuntime( 6172): at cn.wq.disableservice.d.doInBackground(Unknown Source)
E/AndroidRuntime( 6172): at android.os.AsyncTask$2.call(AsyncTask.java)
E/AndroidRuntime( 6172): ... 6 more

name前面的空格

不少流氓应用为了在默认排序下能排在前面,在应用名称前面加了空格。
它们加的空格不是我们常用的空格,而是non-breaking space.
常用空格在ascii中是32(十进制),十六进制是20。
non-breaking space在ascii中是160(十六进制是a0),这个用string的trim()方法无法去掉,只能replace掉。

2013年3月5日星期二

PendingIntent:defferent extra but same pendingIntent


A PendingIntent itself is simply a reference to a token maintained by the system describing the original data used to retrieve it. This means that, even if its owning application's process is killed, the PendingIntent itself will remain usable from other processes that have been given it. If the creating application later re-retrieves the same kind of PendingIntent (same operation, same Intent action, data, categories, and components, and same flags), it will receive a PendingIntent representing the same token if that is still valid, and can thus call cancel() to remove it.
Because of this behavior, it is important to know when two Intents are considered to be the same for purposes of retrieving a PendingIntent. A common mistake people make is to create multiple PendingIntent objects with Intents that only vary in their "extra" contents, expecting to get a different PendingIntent each time. This does not happen. The parts of the Intent that are used for matching are the same ones defined by Intent.filterEquals. If you use two Intent objects that are equivalent as per Intent.filterEquals, then you will get the same PendingIntent for both of them.
There are two typical ways to deal with this.
If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent.filterEquals, or different request code integers supplied to getActivity(Context, int, Intent, int)getActivities(Context, int, Intent[], int)getBroadcast(Context, int, Intent, int), or getService(Context, int, Intent, int).
If you only need one PendingIntent active at a time for any of the Intents you will use, then you can alternatively use the flags FLAG_CANCEL_CURRENT orFLAG_UPDATE_CURRENT to either cancel or modify whatever current PendingIntent is associated with the Intent you are supplying.

SharedPreferences.getStringSet


public abstract Set<StringgetStringSet (String key, Set<String> defValues)

Added in API level 11
Retrieve a set of String values from the preferences.
Note that you must not modify the set instance returned by this call. The consistency of the stored data is not guaranteed if you do, nor is your ability to modify the instance at all.
--------------------------------------------

Very strange,unbelievable.
We should make a copy of the set to store it like this:
      Set<Str set=new HashSet<String>(setting.getStringSet("key", new HashSet<String>()));

2013年2月26日星期二

Java的Integer

注册某个网站的时候要回答一道题目:


         Integer i1 = 124;
    Integer i2 = 124;
    Integer i3 = 129;
    Integer i4 = 129;
    System.out.println(i1 == i2);
    System.out.println(i3.equals(i4));
    System.out.println(i3 == i4);

真正写代码的时候谁会去用==,这答案只有遇到了才知道。
不过通过这个题目也可以稍微了解下Integer类。

Integer源码里面有个IntegerCache,缓存了从-128到127,所以这个范围的地址判断都得到都是相同的。

2013年1月21日星期一

android源码编译

条件:
64位ubuntu11.10,硬盘40G(在虚拟机里面1G内存肯定不够用)


一般步骤:
基本流程按照Google官方的说明就ok:http://source.android.com/source/initializing.htmlhttp://source.android.com/source/downloading.html
第一个是初始化编译环境,下载相关的软件包,第二个才开始下载和编译。

下面是我编译4.1.2_r1成功的截图:(4.1.2_r1源码本身12G,最后一共用了30多G


特别说明:
1.JDK直接去orcle官网下载快多了,没必要用apt,用apt只是省去了设置环境变量的过程。
2.官方Installing required packages这一步中lib32readline5-dev改成6。
3.A new repo command ( 1.18) is available:

这个提示下面给了一行cp命令,执行了就ok了,不管这个升级提示好像也没事。
4.repo:command not found 执行下面两行就行了:
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc

export PATH=$PATH:$HOME/bin
5.下载repo脚本的时候可能下不动,添加这个到/etc/hosts应该可以了
          74.125.237.1   dl-ssl.google.com

6.过程中还会遇到下面的连接错误提示:(不需要管,只是连接不稳定而已)

①The requested URL returned error: 406 Not Acceptable while accessing    https://android.googlesource.com/platform/external/jmonkeyengine/info/refs
②Failed to connect to 2404:6800:4005:c00::52: Network is unreachable while accessing https://android.googlesource.com/platform/external/jmonkeyengine/info/refs

7.停在Fetching projects: 100% (293/293), done.  
原因不知道,反正已经下载完了,接下来就是check out的过程。手动就行了。
命令:repo sync -l
l是local,用repo sync -h可以查看repo sync可以用哪些参数.

8.在Syncing work tree过程中,我遇到这个Error:
error: external/apache-http/: platform/external/apache-http checkout
类似 error: external/*/: platform/external/* checkout
其实应该只是同步的过程中代码被修改了,把/external/apache-http/删除了,重新repo sync一次就可以了。


2013年1月20日星期日

马丁·尼莫拉牧师-I didn't speak up



THEY CAME FIRST for the Communists,
and I didn’t speak up because I wasn’ t a Communist.
THEN THEY CAME for the Jews,
and I didn’t speak up because I wasn’ t a Jew.
THEN THEY CAME for the trade unionists,
and I didn’t speak up because I wasn’ t a trade unionist.
THEN THEY CAME for the Catholics,
and I didn’t speak up because I was a Protestant.
THEN THEY CAME for me,
and by that time no one was left to speak up.
――Pastor Martin Niemoeller
译:
他们追杀共产主义者,
  我没有说话———因为我不是共产主义者;
  接着他们追杀犹太人,
  我没有说话———因为我不是犹太人;
  后来他们追杀工会成员,
  我没有说话———因为我不是工会成员;
  此后他们追杀天主教徒,
  我没有说话———因为我是新教教徒;
  最后他们奔我而来,
  却再也没有人站出来为我说话了。
                   ——马丁·尼莫拉牧师

东厨司命-天地国亲师位-祖宗昭穆


  写于2010-03-01:
  今年过年才注意到老家那里每家都神龛上都有“东厨司命-天地国亲师位-祖宗昭穆”,(没照片挺遗憾的)查了一下,蛮有意思的。
 (下面两段是百科里面的)
  徐梓(PS:我不认识)经过系统的历史资料梳理,在《北京师范大学学报》2006年第2期发表学术文章《“天地君亲师”源流考》。
  文章说:“天地君亲师”的思想发端于《国语》,形成于《荀子》,在西汉思想界和学术界颇为流行。明朝后期以来,崇奉“天地君亲师”在民间广为流行,把它作为祭祀对象也已经普遍。清雍正初年,第一次以帝王和国家的名义,确定“天地君亲师”的次序,并对其意义进行诠释,特别突出了“师” 的地位和作用。民国时期,“天地君亲师”又衍变出“天地国亲师” 和“天地圣亲师”两种形式。
  
 (以下是这个网页的内容http://www.wxzqw.cn/_d270022111.htm,这网页居然不让人复制,shit,什么年代了还搞这个,就是动个脑筋的问题而已......)
“天地国亲师位”的解释 
    据史料记载:明朝永乐年间(约公元1404年),三朝元老贾宰相七十大寿。曾以“神童”著称,14岁入朝的翰林学士解缙,对明成祖说:“卑职要送一件宝物给贾宰相,让他们家世世代代顶礼膜拜”。 
    明成祖觉得解缙说话太狂妄,便半真半假地说:“那么,我们不访打个赌。”解缙问:“不知圣上有何赌法”,明成祖说:“我要让你那件宝物根本摆不上正堂”。解缙也毫不示弱地说:“我不仅要摆在正中间,而且要人人向他打躬作揖!” 
    光阴似箭,日月如梭,贾宰相的寿诞之日转眼就到了。明成祖考虑再三,亲笔写了个米筷那么大的“寿”字,令人用金片连夜赶制出来。第二天天刚亮,就派人送到了贾府。 
    贾宰相见万岁送来如此贵重的礼物,真是受宠若惊,立即摆香案跪接,并披红挂彩,将金寿字摆在堂屋中间,还特地在两旁各点燃一支红烛以示尊重。明成祖心想:做寿的时候送“金”字,又是朕御笔亲书,这是任何礼品也不能替代的,看来这次与解缙打赌是万无一失了。 
    早饭后,明成祖为了能亲眼看看解缙花招,竟不顾“君不拜臣”的礼节,早早便起驾来到贾府。谁知来贺寿的文武官都到了,却一直不见解缙露面,眼看拜寿仪式即将开始,解缙才姗姗来迟。更奇怪的是他竟什么礼物也没有带,进门之后,首先拜见万岁说:“不知圣驾来临,有失君臣之礼,万望恕叩”。明成祖说:“不知者不为过,只是一年前爱卿与朕打赌之事,……”。万岁话音刚落,解缙马上就说:“与圣打赌之事卑职拳拳在心,岂敢有忘”。“既然不敢忘,却为何孤身独影而来,两袖清风而至,莫非爱卿会变戏法不成?”一席话说得文武酉官哈哈大笑。贾宰相更是不失时机地戏落道:“解学士不是说要送一件让老朽全家子孙万代顶礼膜拜的贵重礼物吗,想必是怕把万岁爷的金寿字比下去了,才不敢拿出来吧?”贾宰相的话还没有说完,就被群臣们的戏笑声给打断了。 
     明成祖见解缙沉默不语,又不无怜惜地说:“解学士既然认输,众爱卿就别再难为他了,还是快饮酒贺寿吧。”贾宰相本想趁此机会将解缙戏落一番,见万岁开了金口,也只得很不情愿地坐到那把早已准备好的太师椅上,准备接受儿孙和下属、家人们的礼拜。 
    哪料到主持司仪,刚刚说了一句“开始拜寿”,解缙却一步上前,制止道:“且慢!”说着从袖筒里抽出小半卷红纸,随即往堂屋后墙的正中央一贴说:“还是先拜拜祖宗牌位再说吧!” 
    贾宰相抬头一看,只见解缙说的所谓“祖宗牌位”不过是在红纸上写着三行字。中间写的是:“天地君亲师位”六个大字,左右写的是:“贾氏堂上宗祖”和“九天东厨司命”两行小字,便冷笑一声说:“什么祖宗牌位?顾名思义,祖宗牌位就应以‘贾氏堂上宗祖’六个字为主”。 
    解缙不以为然地说:“有道是:天生我,地载我,君管我,亲养我,师教我。请问贾大人,难道你‘贾氏堂上宗祖’,能大于天地,高于君主么?更何况贾氏堂上宗祖同样是父母养的,老师教的,未必他们可以不尊重父母双亲?不敬重教诲自己的师长么?” 
    一席话,问得贾宰相瞠目结舌,无言以对。不得不点头称是,但他也不愧为三朝元老,话锋一转;又问:“这‘天地君亲师’的位置摆在正中间就算是理所当然吧!不过,我贾氏堂上宗祖,按照“右为尊上之位的惯例,摆在右边总该是名正言顺的吧!为什么非要摆在左边呢? ” 
 解缙没有正面回答贾宰相的问话,而是反问道:“请问贾大人,还记不记得腊月二十四送九天东厨司命,也就是送灶王菩萨上天时的那副对联么?”贾宰相想都没有想,便回答说:“当然记得,上联是:上天言好事,下联是:下界道吉祥。横批是:一家之主。”解缙紧接着又追问了一句:“请问这一家之主,应不应该享受‘尊上之位’呢?”没等别人回答,又接着说:“灶神是上自天子,下至庶民,家家户户,无不供奉,难道还不如你一姓之宗祖么?!” 
    那时候,人们都说灶王爷能上通天界,下统五行,主人寿命,赐人福禄,因此,谁也不敢怠慢。贾宰相虽然是身居一人之下,万人之上,却也不敢不敬重灶王爷啊! 
    解缙的这一手绝招,实在使明成祖始料不及。皇帝再大也只能是“天子”而已,而对“天地乾坤”,和“九天东厨司命”,他仍然是小巫见大巫,不得不将那金字寿搬到一边,带头拜起天父、地母和司命爹爹来,贾宰相和文武百官见万岁都对着解缙送来的“寿礼”打躬作揖,那还敢说半个不字,一个个磕头如象鸡啄米。 
    贾宰相见自己的一场隆重的“古稀”之寿,就这样被解缙轻而易举地搅乱了,真是哑巴吃黄莲,有苦说不出。 
    解缙虽然取胜了,却因此得罪了皇帝。永乐五年(1407年),明成祖果然以“泄禁中语”和“廷试读卷不公”为借口,将解缙贬至广西。三年后,又以“无人臣之礼”的罪名将解缙捕入狱中,并派人将其杀害。 
    解缙虽然被杀,而他所独自设计的祖宗牌位却没有入敢更改,所以,从此以后,祖宗牌位仍然写着:“天地君亲师位”、“九天东厨司命”和“某氏堂上宗祖”三行字,这就是祖宗牌位的来历。 
    只因时代的演变,为适应新的历史潮流,到民国年间,多数人家把中间行的第三个字,即“君”字改为“围”字。把右边的“九天东厨司命”改为“司命灶君、福德土地”和左边的“某氏堂上宗祖”条,在堂上的后边加了“历代”二字,在宗祖的后边加了“考妣”二字。之所以“君”改“国”,“君”指清和清以前的历代皇帝。民国问,国家的最高领导人不称皇帝了,管理人民的是国家,故改为“国”人们认为。有国才有家,在其祖宗牌位上供“国”字的意义在于表示对国家的热爱。在姓氏堂上的后边加“历代”二字的意思,是说不单怀念已故父母双亲,对父母亲以前的历代宗祖都应该怀念。在宗祖后边加“考妣”二字的含义是:“考”指男性,“妣”指女性。意思是说,男女宗祖不能有别,都要尊敬。 
    新中国建立至今许多人家继续沿用,说明两个问题:(一),受封建统治时间长,在现代科学还很不发达的情况下;传统观念特别是有“神”论的观念,在短期内不可能完全改变;(二),热爱国家,怀念宗祖,尊敬老师,又是中华民族的传统美德。在这方面应继续发扬。

大三上选修《音乐剧艺术欣赏》


(这是我2008-11-23写的,留到这儿来做纪念吧
一共上了9(4-12周)次课,后面基本上每次课都能看完一部音乐剧

3.《俄克拉荷马Oklahoma》
4.《音乐之声》
5.《西区故事West Side Story》
6.《亚瑟的神奇彩衣》
7.《毛发》
8.《歌剧魅影》 (《巴黎圣母院》未放完)
9.《猫》

一开始完全是抱着提高自己的艺术知识面的目的选的这门课,可是刚接触那个老师时实在是受不了那个老师的一些行为习惯,所以很排斥这门课,如果不是他每次课都要签名及随即点名的话我是觉得不会去第二次的,直到后面的《歌剧魅影》我才真正的开始有点喜欢音乐剧了,和电影不同,音乐剧很多地方的表现手法都是歌舞。《歌剧魅影》基本上是以情节吸引人,《巴黎圣母院》完全是用音乐来震撼你,《猫》,被成为历史上最成功的音乐剧,里面大部分都是绚丽的舞蹈,当然对我来说最吸引我的还是那首《Memory》了......
 这门课让我认识了安德鲁.韦伯,也就是Sarah Brightman的前夫并把她一手捧红的作曲家,上面列的有3部就是他的,特别是《歌》和《猫》让我很欣赏他。

2013年1月12日星期六

android:layout_weight

在layout_width設置為fill_parent的時候,layout_weight所代表的是你的控件要優先盡可能的大,但這個大是有限度的,即fill_parent.
在layout_width設置為wrap_content的時候,layout_weight所代表的是你的控件要優先盡可能的小,但這個小是有限度的,即wrap_content.



下面来贴几张图,加以说明:
1. layout_width="fill_parent", button1的weight=1,button2的weight=2;


2.layout_width="fill_parent", button1的weight=1,button2的weight=2000;

------------------------------------------------------------------------------------------------------------------------------------------------
3.layout_width="wrap_content", button1的weight=1,button2的weight=2;

4.layout_width="wrap_content", button1的weight=1,button2的weight=2000;

2013年1月5日星期六

邓广铭宋史职官志考证序-陈寅恪


    (ps.真心很遗憾,很多正体字不认识,需要一个一个查,而且不少词现在不常用,蛋疼,这tm才过了几十年而已...)

                            陳寅恪《鄧廣銘宋史職官志考證序》
    吾國近年之學術,如考古歷史文藝及思想史等,以世局激蕩及外緣薰習之故,咸有顯著之變遷。將來所止之境,今固未敢斷論。惟可一言蔽之曰,宋代學術之復興,或新宋學之建立是已。華夏民族之文化,歷數千載之演進,造極于趙宋之世。後漸衰微,終必復振。譬諸冬季之樹木,雖已凋落,而本根未死,陽春氣暖,萌芽日長,及至盛夏,枝葉扶疏,亭亭如車蓋,又可庇蔭百十人矣。
    由是言之,宋代之史事,乃今日所亟應致力者。此為世人所共知,然亦談何容易耶?蓋天水一朝之史料,曾彙集于元修之《宋史》。自來所謂正史者,皆不能無所闕誤,而《宋史》尤甚。若欲補其闕遺,正其訛誤,必先精研本書,然後始有增訂工事之可言。《宋史》一書,于諸正史中,卷帙最為繁多。數百年來,真能熟讀之者,實無幾人。更何論探索其根據,比較其同異,藉為改創之資乎?
    鄧恭三先生廣銘,夙治宋史,欲著《宋史校正》一書,先以《宋史職官志考證》一篇,刊佈於世。其用力之勤,持論之甚,並世治宋史者,未能或之先也。寅恪前居舊京時,獲讀先生考辨辛稼軒事蹟之文,深服其精博,願得一見為幸。及南來後,同寓昆明青園學舍,而寅恪病榻呻吟,救死不暇,固難與之論學論史,但當時亦見先生甚為塵俗瑣雜所困,疑其必尠餘力,可以從事著述。殊不意其撥冗偷閒,竟成此篇。是其神思之縝密,志願之果毅,逾越等倫。他日新宋學之建立,先生當為最有功之一人,可以無疑也。
    噫!先生與稼軒生同鄉土,遭際國難,間關南渡,尤復似之。然稼軒本功名之士,仕宦頗顯達矣,仍鬱鬱不得志,遂有斜陽煙柳之句。先生則始終殫力竭智,以建立新宋學為務,不屑同於假手功名之士,而能自致於不朽之域。其鄉土蹤跡,雖不異前賢,獨傭書養親,自甘寂寞,乃迥不相同。故身曆目睹,有所不樂者,輒以達觀遣之。然則今日即有稼軒所感之事,豈必遽興稼軒當日之歎哉?
    寅恪承先生之命,為是篇弁言,懼其羈泊西南,胸次或如稼軒之鬱鬱,因並論古今世變及功名學術之同異,以慰釋之。庶幾益得專一于校史之工事,而全書遂可早日寫定歟?一九四三年歲次壬午一月二十七日陳寅恪書于桂林雁山別墅。
    (原載一九四三年三月讀書通訊陸貳期)