[{"content":"2025-10-29：最近忙的要死，实在想写篇杂谈。然而我目前连写杂谈的时间都还没有，于是先空在这里。\n2026-08-06：\n正如我的第一学年总结一样，这篇文章本该写在我的大二上的期中时，然而一拖再拖，终于到了大二结束的暑假，这篇文章又需要来描述我的整个第二学年了。\n正如我在第一学年总结中所说的那样，一学期的开始并不是周一的早八，不是一门课来标志着一学期的开始。真正使得我大二开始的，是大一暑假的选课。大二上，我终于下定决心去辅修历史学（中国史）了。此前听过历史学院很多老师的课，但最终都没有机会去选。\n大一的虚无缥缈的管理课程又让我觉得这门专业实在是假大空至极，我对经管的知识又真的提不起任何兴趣来。我可以以一种凡尔赛的口吻来说，我考入这所学校确实是没有花费太多努力的。我认为每个人都有着不同的能力，在你点数所覆盖的领域，你的学习确实是花不了太多精力就能得到很大回报。所以我成为了少数新高考实验品当中的一个，小三门我选了历史、地理、生物，都并不需要花费我什么时间，不需要背什么大题模板，甚至说这些知识对我是过目不忘的。然而对于语文的古诗词默写，我却到了高考前都没有背完所谓的72篇。其实也并不是完全不背，只是背完的结果是整首诗对我就没有顺序可言，给我每句话的第一个字我能轻易拼凑出全篇，但我却无论如何都很难从头背到尾。数学更是无需再提，高中数学我就很烂，微积分C2我自认为已经刷了很多题目了然而也并不能学会，还好有老师捞我，最终拿了个60分擦线及格。第三学期的概率论学的也并不好。前三个学期我花时间最多，最令我感到折磨的，学习效果和成绩最差的都是公共数学。\n所以组织行为学、经济学原理、企业战略管理这些课程我确实打不起什么兴趣，不过确实都很简单，所以成绩方面还不错。但是这种虚无感最终推动我在大二上开始辅修我最热爱的中国史。由于商学院的课程还是比较多，容易撞时间，所以就只选了两门历史课。\n这两门课其实也可以单独拿出来聊聊，有很多故事可以讲。第一门是共和国史。老师讲课其实是很不错的，不过有很长的时间在翻转课堂，我并不喜欢这种教学模式。然而没有办法也要照做。我与几位同学组队研究了当代思想运动相关问题。我负责其中一位人物相关的工作。我读了很多专著，翻阅了很多史料，主要是人民日报、光明日报的数据库，以及建国以来的各位领导人的文稿，我认为我把事情梳理得比较清楚，写了很长的文稿（或许日后会发布在博客上？），制作了幻灯片。然而一位党史党建学院的同学担任着汇报工作，他将我的文字收上去后不告知我们任何人就进行了篡改，最终实现了所谓的春秋笔法。不加一句一字，只靠裁剪我的文字，使得要表达的内容截然相反。我对此感到相当愤怒，可我又能怎么办呢？只能说是被这位党院的红色急先锋上了一课。后来我学到克罗齐的“一切历史都是当代史”，这是说“因为历史是有意义的，而历史对现下生活的人才是有意义的，所以一切历史都是当代史”，我对此深有感触。当下的人们通过裁剪部分史料就可以写成一部倾向性明显的过去的历史，冤枉或者褒奖死去的人。不过这应当是彰显历史学的现实关怀，我认为在他那里，历史学变成了为现实服务的政治学，所以我依旧认为这种行为令人不齿。另一门是中国历史文选，我在这门课上写作了我的第一篇历史学的课程论文，学到了很多文献学的知识，具体细节就不提了。\n大二开始学会计学了，我终于对我的专业课感到了有些吃力。不过其实初级会计学依旧很简单，至少比下学期的财务会计、财务管理要简单得多。初级会计学本身其实并不能给我带来什么感触。但教会计的老师却令我印象非常深刻。这位老师可以认为他没有跟上大版本更新。当然这样说其实有些戏谑的意思，但我其实还是很尊重这位老师的。简单来说，他这门课有非常丰富的课程思政的内容，主要是马列毛及西方伪史论，以及有时用马克思主义的三大原理来解释会计记账的一些规则。我其实也并不赞成他的很多观点。然而当他讲起会计时却又讲得相当不错，完全不会输给一些职称更高的老师。期末时这位老师还给了我们所有人很好的成绩。可是由于他的这种意识形态输出，他遭受着很多同学的谩骂。然而我以为大学不就是这样吗？再看一些老师其实讲的也不怎么样，但是他们也喜欢“夹带私货”，只是夹带的内容或许应该称为资产阶级自由派思想。然而这些老师却又不会遭到谩骂，反而有很多同学认为他们走在时代前列，是敢于发声的先进分子。我认为这种情况是相当不好的。你不能只在夹带你不满意的私货时才攻击老师夹带私货。“没有学术的民主和思想的自由，科学就不会繁荣。”可是高呼着这句口号的人们却反过来进行着自己的猎巫活动。\n此外是选了一门《西方哲学：传统、经典与方法》。这门课很有意思，讲课的聂ml老师也是绝对的大拿，但是内容实在太深，讲的内容也太难，课程压力也很大，3000+字的课堂报告要写三篇，期末还有闭卷考试。作为一门通识课，要付出专业课的精力来学习，所以其实应当慎选。除非你真的很喜欢西方哲学，同时有比较强的抗压能力。其中一篇课堂报告的中间产物已发到我的博客：笛卡尔《第一哲学沉思集》在讲什么？。我的报告写的质量其实也很高，日后可能会改改也一并发出来。\n大二上的其他课程其实就没有能多聊的了，无非还有一些上课接广给学生带货的老师、笑面虎的给分刺客，以及其余的一些平均水平的课程。于是再介绍一些大二上的课余生活，当然也不完全是课余。\n暑假去听了个音乐节，阵容包括：陈粒、陈绮贞、吴青峰、安溥。相当权威的阵容，不过这个年代，说自己听华语流行是不是和说自己是条土狗没什么区别？这里有一小段视频：7.19 沈阳泡泡岛音乐节 张悬/安溥 无与伦比的美丽+艳火\n旁听了一门佛教课程，从零开始的出家指南。次日去了地坛书市，只能说羡慕首都人民，大额优惠券折上折，参加的出版社也是很全面。\n去了国家植物园。一直想去来着，最后抽了个周末去玩。\n正如我第一年刚到鹿大那样，一勺池神树一夜之间如约转黄。\n西门门口的大西兰花。\n逸夫会堂的爬山虎也顺势染色。\n人文楼侧面，教三对面的小片绿地是跳跳的活跃范围。\n《房地产概论》课程组织集体参观中国园林博物馆。\n为了去党史馆的中影天天影城看Cinity LED制式的《疯狂动物城2》，路过鸟巢。 结果紧接着又没忍住去了中国电影博物馆二刷了IMAX GT制式的。\n去天桥剧场听了双笙的巡演。这次整体舞美比“经过时你我相遇”差很多，但音响质量要更好。\n大二上的最后一天，去考早八的考试，见到朝霞。\n随后便是我的大二下。大二下公共英语结束了。公共数学方面这学期是线性代数C，竟然是我学的最简单的一门数学了，考了个别人看着很狗屎但我自己觉得还不错的成绩，也没有像以前那样做很多题。\n这学期专业课就开始相当上强度了。财务管理、财务会计、金融学B以各种方式为难我。财务管理、金融学便是大量公式的记忆与应用，财务会计则是要求你背下去一块砖厚的教材里的全部记账规则。所以我学的、考的都并不好。我在我的身边发现了一个傻逼恒等式，你的身边总会有傻逼老师或者傻逼同学中的至少一个，然而这学期竟然都没有，那么结合我的狗屎专业课成绩来看，傻逼的原来是我。所以我真的已经无力了，我无论如何都不可能选择财务、会计作为我的就业或深造方向。只是我的沉没成本大到我已经不能复读或者转专业了，只能谋求平稳地拿一份本科学历。反而这学期的历史学课程学的更好，考出的分数也更理想，但是我却真的没有花更多时间在这上面。所以目前来看考研历史学或许是我将选择的方案了。这学期在历史学院的四门课程老师讲的都很好，但没有太多上学期那样的故事，知识性的内容就不在这里赘述了。\n这个暑假有国际小学期。请务必避雷小学期《希腊城邦史》这门课程。希腊人讲希腊和中国人讲希腊是完全一样的，老师希腊口语还很重，英语很难听懂。课上还要卷发言，给分也很差。总而言之，性价比极低。余下介绍我在大二下的课余生活，由于有小学期，也会包含一些暑假的内容。\n上完数字人文的课程后离开教二，外面已是三月却在落雪。这一年反常天气的开始。\n游览了颐和园西堤和万寿山。感觉这篇文章应该作为摄影贴的（\n去年这个时候也来了玉渊潭。不过这次公园加了一些小的造景。\n清明节假期去了大同玩。\n在朝阳公园书市又买了许多种书。什么时候能不之前买的没看完就买新的。\n上次去国植比较晚，没有时间去南园。这次又去了南园。\n五一假期兼春假去了天津，可以看这里：介介子GOGO的动态 - 哔哩哔哩\n两张校园随手拍。\n去看了郁可唯“我怪”演唱会。郁可唯的唱功我觉得相当不错，只是实在没有太多原创作品。\n终于有机会去了通州校区。简单来说就是大、现代化。只是建成率太低，大概只有1/4，很大一部分都还是荒地。下届文社科新生会搬到通州校区上课，我是很难体验到了。\n去西山恰好遇到晚霞。录了晚霞的全程视频：北京西山晚霞 2026.7.14\n某天下午参观了北外。\n去环球影城玩了一天。\n以上大概就是我的全部大二生活了。大二一方面继承了大一课程的无聊，另一方面又加强了课程难度，让我不得不忙碌于一些繁复无趣的活动。在这种钳形攻势下我的生活确实是没有大一滋润了。不过我也不再幻想保研，不再幻想在经管领域一条路走到黑，而是用纯粹的休憩活动以及对我更热爱的文史哲方面的阅读和学习来进行调和上面所述的困境。因而我过的其实也并没有那么惨。这确实是我花了一定时间才完成的转变。\n最后推荐大家听听最开头的张悬的这首《最好的时光》。想开昨天的烦恼、找到一万个问题里最简单的回答，能解决学习和生活中的很多问题。\n2026年8月6日于家中\n","date":"2026-08-06T07:53:40+08:00","image":"https://xzhongjie.github.io/p/%E6%88%91%E5%9C%A8%E9%B9%BF%E5%A4%A7%E7%9A%84%E7%AC%AC%E4%BA%8C%E5%B9%B4/1786006756442_hu_3ceb5f8334d86490.jpg","permalink":"https://xzhongjie.github.io/p/%E6%88%91%E5%9C%A8%E9%B9%BF%E5%A4%A7%E7%9A%84%E7%AC%AC%E4%BA%8C%E5%B9%B4/","title":"我在鹿大的第二年"},{"content":"去年秋季为了做《西方哲学：传统、经典与方法》的课堂报告而进行的整理，今天想起来还有这么个东西，放在这里。\n第一个沉思：论可以怀疑的事物 首先把自己接受过来的见解分成三类：\n最真实、最可靠的通过感官得来的东西：\n感官在一些事情上骗过我们。但只有疯子觉得“自我验证”的东西不是不证自明的。\n但是人在梦中的时候依旧像疯子一样。但梦的内容也要来自一些一般的、真实存在的东西（身体的器官）。\n即便这些东西也是幻想出来的，也有更一般的东西：事物是由属性构成的（广延，性质、形状、大小、数目、时间、地点等等）。\n物理学、天文学、医学等等研究复合事物的科学：他们要来自于感官，而且是感官的组合。即便属性的存在是不能怀疑的，但属性如何组合是可以被误解的，因而值得怀疑。\n算学、几何学这种不必存在于现实世界的确定无疑的东西：即便他们确定无疑，也可能有妖怪或者上帝的干涉导致自己弄错。\n第二个沉思：论人的精神的本性以及精神比物体更容易认识 这个世界没有可靠的东西，要像阿基米德一样找到不动点。找到一件确定无疑的事情。\n即使有一个“恶魔”在欺骗我，即使我怀疑一切。“我”必须存在，才能被欺骗，才能进行认识到我被欺骗而进行怀疑。\n“我正在思考”这件事本身，就无可置疑地证明了“我存在”。（作为怀疑主体的“我”存在）“我思故我在”成为第一个绝对确定的真理。（有我，我存在，这是每当我把它说出来或者在我心里想到它的时候，就必然是真的。）\n那么“我”是一个什么东西？我不能确定我是一个有身体、有形状的东西（因为这些都可能在梦中或被恶魔欺骗）。\n我唯一能确定的是我是一个“正在思想的东西”。我的本质就是思想，包括怀疑、理解、肯定、否定、意欲、想象和感觉等活动。（作为思维主体的“我”存在）\n而且，精神比物体更容易认识：观察一块蜂蜡。它有特定的感官属性。当它靠近火时，所有这些感官属性都改变了，但我们仍然认识到它是同一块蜂蜡。我们对蜂蜡的认识，并非来自感官，而是来自纯粹精神的理智考察。\n所以说对外部物体（如蜂蜡）的认识最终依赖于我的精神/理智，而不是感官。因此，我对我自己的精神（作为思维主体的“我”）的认识，远比对任何物体的认识更加直接、更加确定。\n这就是说真实存在的“我”能把握作为思维主体的“我”的情况。\n第三个沉思：论上帝及其存在 “我思故我在”之所以如此确定，是因为我对它有一个清楚明晰的认识。\n我们能确定“凡是我十分清楚而分明地知觉到的东西都是真实的”\n但这个标准本身可能也是恶魔的骗局。为了担保这个标准，需要证明一个全善的上帝存在。\n第一个上帝存在的因果论证（观念的客观实在性论证）：\n前提1（因果原则）： 任何结果的“客观实在性”（观念所表象的内容）都不能大于其原因的“形式实在性”（即事物实际的存在）。简单说，原因必须至少和结果一样真实或更真实。（事物有三种存在方式，客观地存在（观念上的存在，于客观相对的是“真实的“）、形式地（真实地）存在（观念的指涉对象本身真正存在）、卓越地存在（存在于高于且包含了自己的东西）） 前提2： 在我的思想中，我有一个“上帝”的观念，即一个无限、永恒、全知、全能、至善的实体。 推论： 我自己是一个有限、不完美的实体。根据因果原则，有限的我无法创造出“无限完美”的观念。这个观念的来源必须是一个真正无限完美的存在。 结论： 这个真正无限完美的存在就是上帝。因此，上帝必然存在。 本沉思的成果： 证明了上帝的存在。由于上帝是完美的，完美的属性必然包含“全善”，所以上帝不是一个欺骗者。这初步排除了“恶魔假说”的威胁。\n第四个沉思：论真理与错误 如果上帝是全善且不欺骗的，为什么我还会犯错？\n我犯错的能力不是上帝给的，因为上帝是完美的。但我的判断能力确实来自上帝。这似乎是个矛盾。\n分析错误的来源： 错误并非源于上帝创造的某种有缺陷的能力，而是源于我自身两种能力的不当配合。\n理智： 这是认识观念的能力。**它本身是有限的，我不能认识所有事物。**但理智本身不会犯错，它只是提供观念。\n意志： 这是做出判断（肯定或否定）的能力。我的意志在范围上是无限的，可以对任何事情做出判断。\n错误的产生机制： 当我的无限的意志超出了我有限的理智所能清楚明晰认识的范围，而对那些模糊不清的观念做出判断时，错误就产生了。\n如何避免错误： 只要我把我的意志限制在理智所能清楚明晰认识的范围内，只对清楚明晰的观念下判断，我就永远不会犯错。\n解决了“神义论”问题，捍卫了上帝的完美性。\n巩固了“清楚明晰”作为真理标准的可靠性。有了一个避免犯错的方法论。\n第五个沉思：论物质性东西的本质；再论上帝及其存在 在证明物质世界存在之前，先确定物质世界的本质。提供一个关于上帝存在的补充证明。\n确定物质的本质：我可以不去管物质世界是否存在（因为“凡是我能清楚明晰地认识到的东西，都是真的。”），只考察我心中关于物质的清楚明晰的观念。\n我能清楚明晰地设想的物质的本质是即几何学和算学的对象（事物的数学属性、广延）。这些数学属性是物质的主要性质，它们是客观和确定的。\n第二个上帝存在的证明：\n类比： 正如我能从“三角形”的观念中清楚明晰地看到“三内角之和等于180度”是其本质属性一样。\n前提1： 我有一个关于上帝的清楚明晰的观念，即一个“至上完美的存在”。\n前提2： “存在”本身是一种“完美”。一个不存在的东西是不完美的。\n因此，“存在”必然包含在“至上完美的存在”（上帝）的本质之中。上帝的观念必然蕴含着他的存在。所以，上帝必然存在。\n第六个沉思：论物质性东西的存在；论人的灵魂与肉体之间的实在区别 证明物质世界的存在：\n前提1： 我有一种无法抗拒的、强烈的倾向性，相信我的感官观念是由外部的物质性东西引起的。（来自自我被否决，因为“我”此前发现了观念存在于我内心不需要经过“我”的同意）\n前提2： 上帝是全善的，不是一个欺骗者。\n如果这种强烈的、自然的倾向性是错误的，即这些观念并非来自外部物体，而是由上帝直接或通过其他方式植入我心中，那么上帝就是一个欺骗者。但这与上帝的本性相悖。 因此，物质性的东西必然存在。\n感官的作用与局限：虽然物质世界存在，但它们不一定完全像感官呈现的那样（例如，颜色、声音等次要性质可能是主观的）。感官的主要作用不是为了提供关于物体本质的真理（那是理智的任务），而是为了维持精神与身体的结合，告诉我们什么对我们有利或有害。\n论证灵魂与身体的实在区别：\n前提1： 我能清楚明晰地认识到，我的本质仅仅是一个“思想的、无广延的”东西。\n前提2： 我能清楚明晰地认识到，身体的本质是一个“有广延的、不思想的”东西。\n推论： 既然我能清楚明晰地设想它们彼此分离，那么上帝就有能力使它们真正分离。\n结论： 因此，精神与身体是两种完全不同、可以独立存在的实体。我（我的灵魂）与我的身体紧密结合，但本质上是不同的。心物二分。\n","date":"2026-04-20T12:14:00+08:00","permalink":"https://xzhongjie.github.io/p/%E7%AC%9B%E5%8D%A1%E5%B0%94%E7%AC%AC%E4%B8%80%E5%93%B2%E5%AD%A6%E6%B2%89%E6%80%9D%E9%9B%86%E5%9C%A8%E8%AE%B2%E4%BB%80%E4%B9%88/","title":"笛卡尔《第一哲学沉思集》在讲什么？"},{"content":"2025年12月9日，我开始去写像素茶艺v2。今年的4月9日，我们终于将像素茶艺v2全面部署起来了，恰好距离我新建文件夹过去了四个月。像素茶艺v2的开发、乃至像素茶艺运营至今都实属不易，故而撰此文记录像素茶艺v2的前前后后，以飨读者。\n一、从像素茶艺v1说起 像素茶艺地图站是我和N帝开发并运营的Minecraft地图分发平台。茶站诞生的导火索和直接原因当然是MCBBS的暴死。长期以来，我和地形圈的许多人都对MCBBS（至少是创世匠艺大版、展示\u0026amp;共享版）的管理方式颇有微言。不过死者为大，MCBBS的生前此处我也不必多说，读者可自行了解。2024年1月22日起，MCBBS开始闭站维护，不久以后MCBBS将永久关闭的传言就基本上被证实了并非传言。2024年2月26日，我们正式把像素茶艺地图站进行了公开测试。彼时的像素茶艺地图站甚至没有一个域名，挂着一个IP就匆忙推出。当时的我们也难以想象像素茶艺会有一个前后端分离的、现代化的v2版本。\n像素茶艺v1使用的是基于PHP的WordPress CMS。为什么要用这个？只有一个原因：简单快捷。在MCBBS暴死的一个月以后，我们就能完成像素茶艺地图站的基本功能的开发。这得益于WordPress的强大。后来MGC图形学社区赞助了我们一个有备案的子域名，完成了HTTPS部署。网站的功能也日益完善。\n那么为什么我们要开发像素茶艺v2？因为像素茶艺v1基于WordPress，正如基于DiscuzX的MCBBS在后期几乎无力对任何用户反馈进行处理，只能回复一句“等v4”一样，使用这种高耦合度的系统就意味着难以去自定义。短短一年里我们给像素茶艺地图站v1打了三四十个插件，其中不乏一些破解版插件。对于一些更高程度的自定义需求，我们会去修改function.php，这是WordPress的自定义函数文件，可以起到类似于打插件的作用，因为我们没有真正的开发WP插件的经验。再后来我们又有了比这还高的自定义需求，我们便去直接修改WordPress系统的源码。这使得像素茶艺再也不能更新自身的内核版本。\n以上只是我们抛弃v1的根本原因。而直接原因是去年11月末，像素茶艺v1被一个东南亚IP进行了RCE（远程代码运行）攻击。我们并不知道他选择黑入我们的原因是什么，或许是练手。总之，他为自己的站内账户拿到了管理员权限，并安装了文件管理器开始破坏我们的网站。我们不得不暂时关停网站并进行回滚和系统加固。然而对于这种程度的系统，所谓加固也只是拉一下WAF的清洗强度，同时降低用户权限而已。像素茶艺v1终于到了摇摇欲坠的程度。像素茶艺v2的开发开始了。\n二、v2的技术选型 像素茶艺v2当然需要是现代的。前端方面，我们选用了React，并使用了RadixUI这一零样式UI框架，再加上TailwindCSS的原子化CSS框架。这样做的好处是方便，相较于AntDesign这种比较预制的框架，我们不需要再去写很多繁复的内容去覆盖其原本的样式。后端方面，最初的设计是Flask或FastAPI，这是因为我对Python的语法比较熟悉。后来经过花开的建议改用了Golang的GIN框架。（感谢花皇提出的许多建设性意见）GIN的好处是性能起飞，随便甩Python几条街。数据库选择了MySQL（其实我应该用PostgreSQL的）。对象存储选择了MinIO（使用了Pigsty维护的版本），大厂对象存储如同抢钱，自建MinIO再套个CDN非常省钱。CDN方面当然是赛博菩萨Cloudflare。数据统计使用自托管的Umami。富文本编辑与渲染使用Milkdown。人机验证使用基于工作量证明的Cap.js。以上这些服务可以轻轻松松地运行在一台2c4g的服务器上，我们预计能硬扛非常高的并发（太久没人DDoS我们了，无法得知真实数据）。\n三、v2的开发 以上技术栈当然不是一开始就定下来的。只有前端是刚开始写就定好的。因为我对前端比较熟悉，所以从前端开始写，很快就写出了大部分的页面。最狗屎的部分是富文本编辑器Milkdown，这鬼东西有一点自定义需求就极其困难，文档还极度过时。只有用它封装好的Crepe Editor非常方便。不过我确实非常喜欢他的设计，于是没办法开始硬吃。得益于Deepwiki，即便他自己的文档非常狗屎，我也能对正确的写法知道得七七八八。这个富文本编辑器到最后我还在继续折腾。主要是对接OSS、添加自定义颜色语法、添加自定义B站嵌入视频语法、以及重载这些非常难搞。\n后面我开始使用Github Copilot开始辅助我写一些页面。再后来花皇推荐我换了Codex。AI加持使得我的开发效率提升了很多。v2的前端部分很快就写完了。\n后端是最困难的，因为我既没写过后端，更不会Golang。好在有Vibe Coding的帮助，我只读了一点点Go语言圣经和GIN的文档就开始去写。基本上提一个需求以后自己稍微改改就可以，甚至许多需求Codex可以完全做到不用我再改。后端基本上AI和我是91开（怎么还有暗广）。\n最后部署方案上使用的是Docker，写个容器编排。前端丢给基于Nginx的OpenResty，再把后端映射到80端口下的api地址。这都非常常规，不必多说了。CDN倒是折腾了很多，但这主要是为了用SaaS来实现优选才要折腾，这方面网上的教程也有很多。（最后几十条DNS规则，Nginx配置比命长，我现在自己都看不懂这都是啥。计算机网络真是太神奇了。）\n随后是把旧的地址转发到新的。我的实现方案是写了个Cloudflare Worker，依旧白嫖赛博菩萨这一块。新旧地址的对应完全是通过Excel的Xlookup函数完成的，这才叫真正的数据库管理软件（\n终于在4月9号，我们把这堆破事都折腾完了，像素茶艺v2正式部署。v1彻底退出历史舞台。最后感谢花皇给的许多建议、感谢虹梦不断接受我的骚扰帮我测试v2、感谢像素茶艺v2内测群的全体群友、感谢N帝纯手工搬运了所有贴子。感谢像素茶艺地图站的全部创作者。\n最后可以来看看像素茶艺v2的宣传片。感谢你读到这里。\n","date":"2026-04-20T05:54:00+08:00","permalink":"https://xzhongjie.github.io/p/%E5%83%8F%E7%B4%A0%E8%8C%B6%E8%89%BAv2%E7%9A%84%E5%89%8D%E5%89%8D%E5%90%8E%E5%90%8E/","title":"像素茶艺v2的前前后后"},{"content":"在给地形师茶馆搭建 QQ 和 Discord 互联 Bot 的过程中踩了不少坑，所以写一下搭建流程，有需要的朋友可以参考以下。\n1Panel 的安装 我直接选择了腾讯云的 1Panel 镜像一键安装。如果不想用这种方式，可以参考 1Panel 官网的教程。安装好 1Panel 的同时，Docker 也会自动安装完成。\nKoishi 的安装 Koishi 官方不推荐使用 Docker 安装，并禁止在论坛和用户群中讨论 Docker 及 Onebot 相关内容。但我认为用 Docker 安装 Koishi 是最省事的方式。\n既然我们已经安装了 1Panel，可以直接在“应用商店”中搜索并安装 Koishi，安装时记得勾选“开放端口”。\n为什么推荐从应用商店安装？\n其中的一部分原因是很多人使用无图形化界面的 Linux 系统安装 Koishi，而这样就无法直接在本机操作 Koishi 的控制台，并且 Koishi 默认监听 127.0.0.1，无法从公网访问，但在这种情况下你只有操作控制台才能开放公网访问从而使用控制台，于是你就得到了一个很神秘的死锁。而 1Panel 安装的 Koishi 会自动将监听地址改为 0.0.0.0，避免了这个问题。\n这个问题已经被许多人反馈过，例如：云服务器如何公网连接控制台 · Issue #1391 · koishijs/koishi\n如果你坚持不使用 1Panel 安装，可以通过以下命令进行 SSH 端口转发：\n1 ssh -N -L [本地端口]:localhost:5140 [用户名]@[服务器IP] 然后通过访问 localhost:[本地端口]进入控制台。\nNapCatQQ 的安装 NapCat 等 Onebot 框架同样禁止在 Koishi 官方群和论坛讨论，但这更多是由于腾讯的限制。\n我们继续使用 1Panel 安装：\n进入“容器”选项卡，选择“创建容器” → “执行命令”； 输入以下命令拉取拉取一个民间镜像： 1 docker pull mlikiowa/napcat-docker 在“镜像”栏选择刚拉取的 napcat-docker，暴露端口填写 6099。\nNapCatQQ 的配置 配置前需先创建 Docker 网络：\n进入“容器” → “网络”，新建网络，子网填写 10.11.0.0/16，名称自定； 回到“容器”页面，将 Koishi 和 NapCatQQ 的容器网络都切换为刚创建的网络。 安装完成后，访问 [服务器IP]:6099进入 NapCat 控制台。默认 token 是 napcat，建议修改以防他人登录。扫码登录机器人 QQ。\n进入“网络”界面，新建 WebSocket 客户端：\n名称：自定 URL：ws://1Panel-koishi-CRCm:5140/onebot 保存即可。\nKoishi 的配置 访问 [服务器IP]:5140进入 Koishi 控制台。建议先启用 auth插件，设置登录密码，防止他人访问。\n进入“插件市场”，若无法连接，需在“插件配置”中修改 market的源地址（界面提示清晰，不赘述）。\n顺利进入后，安装 adapter-onebot插件。进入插件配置：\n填写机器人 QQ 号； 若在 NapCat 中设置了 token，则填写，否则留空； 保存并启用。 至此，机器人基本配置完成，可进行测试。\n我安装的其他插件推荐 以下是一些我安装并觉得好用的插件：\nadapter-onebot bridge-qq-discord github-opengraph bing-daily-wallpaper blockly-null @summonhim/bili-parser puppeteer booru booru-custom-api pixiv-parse pixiv-auth 关于 puppeteer：建议在插件配置的 args中添加 --disable-gpu，否则 CPU 可能会被持续高占用。\n希望这篇记录能帮到你。如有问题欢迎留言讨论。\n","date":"2025-08-28T15:30:00+08:00","permalink":"https://xzhongjie.github.io/p/%E8%AE%B0%E4%B8%80%E6%AC%A1-koishi--napcatqq-%E6%9C%BA%E5%99%A8%E4%BA%BA%E9%83%A8%E7%BD%B2/","title":"记一次 Koishi + NapCatQQ 机器人部署"},{"content":"一直想写一篇文章总结一下我在鹿大的日子。刚开始是想记录第一周，后来变成了前半学期，随后是第一学期，而到现在这篇文章则负责总结我的第一学年。尽管一拖再拖，但好歹算是写了。\n来到鹿大于我而言纯属意外。港大不知什么原因并没有发来offer，尽管即便发来了offer也需要我考虑一下去或不去，只是可惜了我450港币的报名费。（港大本科录取无拒信，不发offer即为未录取。）相比于与我没有任何联系的鹿大，上海某所高校在填报志愿期间以每天两个电话的频率高强度联系我并保证我的分数足以被录取，但最终仍没能达到录取分数。\n这么说或许不准确，因为我实际上是达到了录取分数，但根据同分录取规则并没有拿到录取。四年前中考时也因同样原因没能考上东北师大附中，所以对这种所谓的宿命也是习惯了，也并不感到怎么遗憾。最终我去了这所非常陌生的、民间俗称“第二党校”的大学。\n其实早就已经知道鹿大硬件设施极差，但我真正推开宿舍门的时候还是被完全震撼了，纯粹是锒铛入狱的感觉。六人挤在一个厕所面积的屋子里，连桌子都是两个人合用一张。其实已经毫无生活质量可言，但也只能凑合住了。\n那就只能从军训开始说起。刚开始的几天强度还是比较高的，基本上都是在走分列式，天气也是很热。随后几天参观博物馆加上新生教育讲座就闲了下来，其实这还没算上我翘掉的讲座。最后几天由于走分列式太水被踢到汉字方队，一天练个两三遍，其余时间玩手机，最轻松的几天。汉字方队完全可以称得上是电竞方队。\n2024.9.2 一勺池 阳光正好\n军训期间值得提的还有两件事。一是全校入学后的实验班选拔，二是新生选课。实验班选拔方面，古典学项目由于考虑到就业相关而没有选择。最后报了商法班的选拔但交上简历后连面试机会都未争取到。关于实验班选拔，当时看来还比较遗憾，其实回头看觉得还是比较大坑的，尤其某些双学位项目更是如此。到我撰写本文时已经确认，商学院的商法班、营销数科班已不再面向25级学生开设，全校范围内也裁撤了许多此类项目。新生选课方面，根据小喇叭上的选课表格排雷，最后定下选课优先级和选教师优先级，挤进系统后按顺序选。其实我还比较喜欢这种无脑抢课的方案，至少不会出现按志愿选课的掉课情况，也不需要设计精密的田忌赛马方案。一个学期后我才意识到，一学期真正重要的不是听课，不是复习，也不是考试。一个学期的结果，无论是从GPA上，还是从听课的舒适度上，早在选课之时就已注定。但比较幸运的是我的第一学期选课还是比较成功的。\n其实对其他人来说，军训期间还有团学组织报名、入党申请等等一系列复杂的经历，而我当时完全懒得搞这些，于是也没有相应的体验。\n接下来就开始正式上课了。在鹿大的前两节课都是蹭来的。本来是计划辅修一个历史学学位，但大一上选课没有开放双选课程，于是就先自己去旁听了两节。（辅修在大二上正在提上日程。）两节课在同一个教室连续上，分别是中国古代思想文化史和中国古代政治制度史，讲的都非常好而且课程内容很硬，尤其孟xs老师在导论课上谈论的历史的使命感和历史的时代性很独到，于是这一个学期基本上都连续听完了，只是后半学期自己专业的课程忙了起来便逃掉了几节。\n2024.9.9 教二2201 中国古代政治制度史课上\n大一上仅仅只有两门专业课，分别是经济学原理1和管理学原理，难度都不高。由于想要早点完成培养方案对部类核心课3学分英文课的要求，选择的是英文的管理学原理课。很高兴的是选到的两位老师都很好，重点突出，PPT也会发给大家，课下也没有太多任务（如果是课下其实几乎没有任务更合理一点）。为了听这个英文的课还买了个网易有道的同传，然而翻译效果极差，用两节课以后发现还不如我自己听。\n难度比较高的反而是一些公共课。思修课不必多说，只是每节课去点个到而已。大学体育排在早八，每次爬起来都非常折磨。计算机课程比较简单，参加了免修考试并通过了，但得知即便免修仍要完成两项大作业，深感其诈骗本质，便还是每周都去听课了。\n要重点说说的是综合英语B和微积分C1两门。英语在开学初有个分班考试，没放水考于是分到了B班，实际上没什么意义（反而有因此拉低绩点的可能性），但教学难度确实很大，尤其是比较侧重听力和口语能力，对我这只会做阅读理解的小镇做题家来说还是比较痛苦的，尤其是期中有个集体的pre结果我背完了上去讲就疯狂忘词，好在选到的老师也比较善良。而微积分C1就是纯纯的痛苦。鹿大的经管类数学为C级，其实是相对简单的级别，但我高中数学就几乎没及格过，微积分C对我来说难度也是很大。接下来一学期绝大多数的时间都拿来做微积分的作业和习题了。刚开始还可以拿高中导数的基础撑一下，到后面开始讲中值定理就逐渐狗屁不通。\n接下来是一些无聊的日常。\n抽空去北大找同学玩了一天。北大确实硬件设施上比鹿大好不少，鹿大还是太破了。而且北大有燕园真的很不错，鹿大这边除了教学区就只剩下家属楼了，只有百家园、一勺池和图书馆后身的风景还不错。\n2024.9.21 北京大学 博雅塔下\n2024.9.21 北京大学 北门\n然后闲着没事再逛逛公园。北京的很多公园确实很不错。\n2024.9.24 紫竹院 绿树成荫\n再贴一些在学校的日常。\n在鹿大图书馆借的第一本书是弗雷泽的《金枝》。这也是我读的第一本人类学的著作。鹿大图书馆于我而言确实是十分宝贵的资源。书籍相当全，权威的和不权威的应有尽有。数据库也是很全面，而且开放给全校同学使用，不限制院系，能看爱如生、书同文还是很爽的。知网、ProQuest、Web of Science这些自然也有。\n2024.9.20 鹿大校园 图书馆\n国庆回来以后也就逐渐入秋了。一勺池神树还是挺夸张的，之前看《恋爱绮谭》里说华师校园有一颗爱心树在初秋首先变黄，显露出爱心的形状。鹿大这颗虽然并没有爱心的形状，但它确实是全校最早变黄的一棵树，比其他树早得多，而且是一夜之间突然变黄，以至于我一度怀疑是学校连夜喷洒脱落酸以创造奇观。\n2024.10.11 鹿大校园 信息楼\n2024.10.10 鹿大校园 一勺池神树\n2024.10.11 鹿大校园 一勺池神树\n开始期中复习了，这是当时课上记的一些笔记，字迹真的稀烂。\n2024.10.25 管理学原理的一些笔记\n去了一趟万圣书园，感觉选书是很不错的水平。\n2024.10.26 万圣书园\n紧接着是期中考试。只考微积分和英语两门。英语的题型是复合式听写、选词填空和翻译文章，难度不小，主要是复合式听写真的是我此前从未练习过的题型，临时抱佛脚了两天作用也不大，好在老师比较捞，拿了一个不算太惨的成绩。微积分这边踩线没及格，纯惨。\n后半个学期照常。贴几张图在这里吧。\n2024.11.21 鹿大校园 图书馆密排库\n2024.11.26 慕田峪长城\n2024.12.10 国贸CBD\n之后去看了两场演出。KohanaLam的北京Live和双笙的经过时你我相遇演唱会。两场演出效果都很好，只是双笙这场选的北京展览馆剧场音效太差了。\n2024.11.2 开花豆Live KohanaLam\n2024.12.30 北展剧场 双笙“经过时你我相遇”\n另外这段时间就是复习加上把第二学期的课选了。复习其实没有什么好说的，考的都还不错，微积分竟然还拿了个2.7/4，虽然可能在别人那这是看不上眼的烂分，但和我第二学期微积分C2的1.0/4比起来还是好多了。整体上考试都没有过多为难人，结合PPT复习起来还是比较轻松的，而且也要感谢这些老师讲的很好。只是体育拿了个1.7，但也没什么办法，体测成绩太烂了，一些体育老师在体测成绩上是不肯捞的。关于第二学期的选课还是照常按照选课表格排顺序，但这学期是按志愿筛选，于是我选课就相对保守，当我遇到第一志愿不能保证选上就会滑到第三志愿的情形时，我就会把原本的第二志愿作为第一志愿，真正的田忌赛马。这样做优劣都很明显，一些给分好但任务重的老师就不可避免被我选到，但他们都给分好了我还要什么自行车呢（\n接着就到了第二学期。那就不得不说说这学期我选了一门古希腊语。雷lb老师讲的很好，讲课也很幽默，实际内容难度也不是很高，但对我这个铸币来说也不算简单，每节课课后作业都需要花一些时间来写，尤其到后面语法复杂起来查表都要半天，但收获也是不小的，可惜虽然这门课投入了很大精力但也没拿到4.0。微积分之类的不必多提，积分部分以后难度再次提升，这学期蹭了个1.0就已经算很不错了。英语拓展课选了一门英语国家社会与文化，真的是讲课如泡脚，考试如喝洗脚水，考的基本上都是教材的东西，但教材并不薄，内容很多，在Gemini的帮助下整理了一份复习提纲连夜看完，最后拿了4.0。其实选这门课还是很好的，只是需要做好考试周通宵复习的准备。\n2025.5.6 一份古希腊语作业\n这学期有三门专业课，企业战略管理、组织行为学和社会科学研究方法。其实前两门课的绝大多数内容在上学期的管理学原理课上都已经讲过了，鹿大的培养方案设计真的很不合理。但这两门课的大作业、pre还比较频繁，导致虽然没有什么实际内容但又不得不花一些精力在这里。最后还是AI整理教材加PPT连夜通关。社会科学研究方法是开卷考试，事情比较少，两次大作业，课讲的还是不错的但说实话我并没怎么听，只是学到了社会学的一些皮毛。\n最需要吐槽的绝对是大作业了，我不知道这是商科特色还是所有学科都这样。大作业真的是我较大的一个负担。尽管我拖延是其中的一个方面，但我觉得大作业本身的不合理性还是很严重的。首先是内容，大作业往往给一个很开放的问题，这导致你写作业的过程中要考虑的事情越来越多，很可能考虑到后面的问题以后前面的结论就直接被后面的结论推倒，大作业免不了一个一改再改的过程。其次是格式，大作业常常会在格式上给你很多限制，需要你在MLA、APA、GB/T7714-2015等等引文格式上不断切换，还需要你去用格式刷将格式从模板上刷到自己作业上，更有甚者在行文结构上就加以限制，这种更为痛苦。最后是评价方式，开放式的问题的答案也是开放式的，于是无论你承认与否，评价方式也是极为开放的，可能你一改再改不如AI灵机一动，很多老师也并不会给出评分细则，于是分数就只能看命了。pre的频率也不低，问题大概也是上面几项，所以不再单列。大作业和微积分是第二学期压在我头上的两座大山。\n关于课余生活方面，风景可以看看这两篇文章：\n一些春天\n夏／狂热\n以及去听了几场讲座，可以看看下面几篇文章：\n古籍整理及其意义的再认识\n空有之间：中国古代香学小引\n清华简《五纪》与《尚书·洪范》类文献\n各个学院公众号经常会推送很多很有意思的讲座，但由于课程较多导致很多讲座都没有机会去听。讲座也是大学里比较宝贵的资源，无论是通识性的讲座还是有门槛的专业讲座都很值得听，信息密度往往比正课要大很多。\n另外是这个博客。4月中旬开始我有了自建博客的打算，在4月15日就已经搭建了起来。刚开始是想要Wordpress或者typecho启动的，但拖着个数据库还是太重了，组个小机器也是花销。于是最终选择了静态的博客方案，将stack主题的hugo托管在了Github pages上，自己对主题稍微做了一些修改。整体还是比较方便的，目前写博客的流程就是Typora敲好直接放到本地，再由Github Desktop直接传上去，通过Action自动部署。很神奇吧，我使用hugo但我甚至都没有在我的电脑上安装Golang的环境。具体的搭建方法如果有人有兴趣我可以单写一篇，这里不再详谈。\n其他比较有趣的还有2.28的晚风里春天歌会和3.30的苏打绿草坪歌会（虽然后半部分是在室内完成的），不过忘记拍照片了。这学期确实任务比较重，主要是微积分和各门课的大作业很多，所以没怎么出去玩，这里也没有什么图片可以贴的。可能和前面文章有重复但也凑合看看吧。\n2025.3.24 玉渊潭公园及中央电视台 春意正浓\n2025.3.20 鹿大校园 学生活动中心后身、理工楼配楼一侧的玉兰花\n2025.5.23 鹿大校园 求是园的“言叶之庭”\n除此之外便没什么可以再提的了。\n一学期下来对鹿大其实也没什么感受，如果非要提一点便是百花齐放。在鹿大，你能见到你觉得的那种又红又专的老师，但你听一节课便觉得爆了的老师也大有人在。学生和学风也同样是非常丰富，卷绩点的当然有，但高举“人生是旷野”旗帜的也不少。有人在忙绩点，有人在打比赛，有人在做学工，有人在PUBG启动。这样就挺好的。\n2025年8月15日夜\n","date":"2025-08-12T16:46:00+08:00","image":"https://xzhongjie.github.io/p/%E6%88%91%E5%9C%A8%E9%B9%BF%E5%A4%A7%E7%9A%84%E7%AC%AC%E4%B8%80%E5%B9%B4/9_hu_a5222ac35ca2c486.jpg","permalink":"https://xzhongjie.github.io/p/%E6%88%91%E5%9C%A8%E9%B9%BF%E5%A4%A7%E7%9A%84%E7%AC%AC%E4%B8%80%E5%B9%B4/","title":"我在鹿大的第一年"},{"content":"在AI加持下完成的自动计算璃月人民大学教务系统成绩查询页面的百分制课程加权平均分的油猴脚本，比较狗屎就不挂Github了。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 // ==UserScript== // @name 璃月人民大学教务处百分制均分计算器 // @version 1.0 // @description 自动计算教务系统成绩查询页面的百分制课程加权平均分，并显示在右下角。 // @author xZhongjie // @match https://jw.ruc.edu.cn/Njw2017/index.html // @grant none // @license MIT // ==/UserScript== (function() { \u0026#39;use strict\u0026#39;; // 只有在成绩查询页面才执行 if (window.location.hash !== \u0026#39;#/student/course-score-search/\u0026#39;) { // 使用 hashchange 事件来监听 URL 的变化，以适应单页面应用 (SPA) window.addEventListener(\u0026#39;hashchange\u0026#39;, function() { if (window.location.hash === \u0026#39;#/student/course-score-search/\u0026#39;) { // 延迟初始化以确保页面元素加载完毕 setTimeout(initialize, 1000); } }); return; // 如果初始加载不是目标页面，则退出 } // --- 样式和UI元素创建 --- function createDisplayBox() { const box = document.createElement(\u0026#39;div\u0026#39;); box.id = \u0026#39;gpa-calculator-box\u0026#39;; Object.assign(box.style, { position: \u0026#39;fixed\u0026#39;, bottom: \u0026#39;20px\u0026#39;, right: \u0026#39;20px\u0026#39;, width: \u0026#39;240px\u0026#39;, padding: \u0026#39;15px\u0026#39;, backgroundColor: \u0026#39;#f0f9eb\u0026#39;, border: \u0026#39;1px solid #e1f3d8\u0026#39;, borderRadius: \u0026#39;8px\u0026#39;, boxShadow: \u0026#39;0 2px 12px 0 rgba(0, 0, 0, 0.1)\u0026#39;, color: \u0026#39;#67c23a\u0026#39;, fontSize: \u0026#39;16px\u0026#39;, lineHeight: \u0026#39;1.5\u0026#39;, zIndex: \u0026#39;9999\u0026#39;, fontFamily: \u0026#39;Helvetica, Arial, sans-serif\u0026#39;, transition: \u0026#39;opacity 0.3s\u0026#39; }); document.body.appendChild(box); return box; } // --- 核心计算逻辑 --- function calculateAndDisplay() { const displayBox = document.getElementById(\u0026#39;gpa-calculator-box\u0026#39;); if (!displayBox) return; // 如果窗口不存在则不执行 displayBox.innerHTML = \u0026#39;正在计算...\u0026#39;; const table = document.querySelector(\u0026#39;table.table-border\u0026#39;); if (!table) { displayBox.innerHTML = \u0026#39;未找到成绩表格\u0026#39;; return; } const headers = Array.from(table.querySelectorAll(\u0026#39;th\u0026#39;)); // 通过查找表头文字来确定列的索引，使脚本更健壮 const creditIndex = headers.findIndex(th =\u0026gt; th.textContent.trim() === \u0026#39;学分\u0026#39;); const scoreIndex = headers.findIndex(th =\u0026gt; th.textContent.trim() === \u0026#39;最终成绩\u0026#39;); if (creditIndex === -1 || scoreIndex === -1) { displayBox.style.backgroundColor = \u0026#39;#fef0f0\u0026#39;; displayBox.style.color = \u0026#39;#f56c6c\u0026#39;; displayBox.innerHTML = \u0026#39;错误：无法定位“学分”或“最终成绩”列。\u0026#39;; return; } const rows = table.querySelectorAll(\u0026#39;tbody \u0026gt; tr\u0026#39;); let totalScorePoints = 0; let totalCredits = 0; let courseCount = 0; rows.forEach(row =\u0026gt; { const cells = row.querySelectorAll(\u0026#39;td\u0026#39;); // 过滤掉学期小计和总计行（这些行通常只有一个单元格或带有 colspan） if (cells.length \u0026lt; Math.max(creditIndex, scoreIndex) + 1 || cells[0].hasAttribute(\u0026#39;colspan\u0026#39;)) { return; } const creditText = cells[creditIndex].textContent.trim(); const scoreText = cells[scoreIndex].textContent.trim(); // 尝试将成绩转换为数字，如果失败（例如成绩是\u0026#39;A\u0026#39;, \u0026#39;P\u0026#39;等），则忽略该行 const score = parseFloat(scoreText); if (!isNaN(score) \u0026amp;\u0026amp; isFinite(score)) { const credit = parseFloat(creditText); if (!isNaN(credit) \u0026amp;\u0026amp; credit \u0026gt; 0) { totalScorePoints += score * credit; totalCredits += credit; courseCount++; } } }); if (totalCredits \u0026gt; 0) { const average = (totalScorePoints / totalCredits).toFixed(3); // 保留三位小数 displayBox.innerHTML = ` \u0026lt;strong style=\u0026#34;font-size: 18px;\u0026#34;\u0026gt;百分制均分: ${average}\u0026lt;/strong\u0026gt;\u0026lt;br\u0026gt; \u0026lt;small style=\u0026#34;color: #909399;\u0026#34;\u0026gt;(基于 ${courseCount} 门课程, 总计 ${totalCredits} 学分)\u0026lt;/small\u0026gt; `; } else { displayBox.innerHTML = \u0026#39;无符合条件的百分制课程\u0026#39;; } } // --- 延迟和防抖动 --- function debounce(func, delay) { let timeout; return function(...args) { clearTimeout(timeout); timeout = setTimeout(() =\u0026gt; func.apply(this, args), delay); }; } // --- 初始化和DOM监听 --- function initialize() { // 检查显示窗口是否已存在 if (document.getElementById(\u0026#39;gpa-calculator-box\u0026#39;)) { calculateAndDisplay(); // 如果存在，直接计算 return; } const displayBox = createDisplayBox(); const debouncedCalc = debounce(calculateAndDisplay, 500); // 500ms 防抖 // 使用 MutationObserver 监听 DOM 变化，以应对 Vue.js 动态加载内容 const observer = new MutationObserver((mutations) =\u0026gt; { for (const mutation of mutations) { if (mutation.type === \u0026#39;childList\u0026#39;) { // 只要内容区域发生变化，就触发重新计算 debouncedCalc(); return; // 找到变化后即可，无需继续遍历 } } }); // 监听整个应用容器的变化 const targetNode = document.querySelector(\u0026#39;.content-tabs\u0026#39;) || document.getElementById(\u0026#39;app\u0026#39;); if (targetNode) { observer.observe(targetNode, { childList: true, // 监视子节点的添加或删除 subtree: true // 监视所有后代节点 }); // 首次加载时手动执行一次计算 debouncedCalc(); } else { displayBox.innerHTML = \u0026#39;脚本初始化失败: 未找到监听目标。\u0026#39;; } } // 主程序入口 // 延迟 1 秒执行，以确保 Vue 应用已挂载 setTimeout(initialize, 1000); })(); ","date":"2025-07-03T14:41:31+08:00","permalink":"https://xzhongjie.github.io/p/%E7%92%83%E6%9C%88%E4%BA%BA%E6%B0%91%E5%A4%A7%E5%AD%A6%E6%95%99%E5%8A%A1%E5%A4%84%E7%99%BE%E5%88%86%E5%88%B6%E5%9D%87%E5%88%86%E8%AE%A1%E7%AE%97%E5%99%A8/","title":"璃月人民大学教务处百分制均分计算器"},{"content":"角色与目标 (Role and Goal) 你是一位精通 World Machine Code Device 的专家级程序员。你的任务是基于我提供的官方文档、代码示例和具体需求，为我编写一个全新的、功能完整的自定义节点。你需要提供该节点所需的 Host (Lua) 代码和 Compute (OpenCL) 代码，以及其使用方法。当程序不通时，你需要根据我补充的报错进行修复。\n第一部分：背景知识 在开始之前，请先学习以下关于 World Machine Code Device 的核心文档。\nCode Device This feature was introduced in the “Hurricane Ridge” release\nThe Code device lets you write custom devices for World Machine. These device plugins use GPU compute and can be shared with other users safely, due to the sandboxed execution model.\nOverview Your Code device contains custom programming that you create as follows:\nA script controlling the execution of the device, written in Lua. Zero or more compute kernels for executing code on the GPU. When you create a new Code device and open it for editing, you will see the Code Editor view:\nThe tabs across the top allow you to access the Host code (scripting language) and the Compute code (OpenCL or equivelent). The tabs at the bottom show you any reported errors during compilation or execution of your device in the first tab, and any host script output (such as that created by the print() function) in the second tab. The right side drawers allow you to modify the configuration of your custom device, including adding ports, parameters, and more. The “apply changes” button commits any changes you’ve written in your code and rebuilds the device. Languages Your device is written in both a host language and a compute language.\nThe host language is a slow scripting language executed on the CPU. Your host script acts to orchestrate the execution of your device, but should perform no major calculations itself. The compute language is a fast, data-parallel language executed on the GPU. This is used for code that manipulates large amounts of data, such as the entire contents of a heightfield or image. Host Language Currently Lua is the allowed host script language. Other languages may be supported in the future.\nThe Lua environment is by default heavily sandboxed. Other than core language function, only the standard math library is enabled. Your script will interact with World Machine via the World Machine library (exposed as ‘wm’).\nThis looks much like:\n1 2 3 4 5 6 7 8 -- Create an empty memory buffer wm.createBuffer() -- Get a parameter local myFloat = wm.parm(\u0026#34;parm0\u0026#34;) -- Output to port 0 wm.output(bufResult, 0) See the World Machine Lua API Reference for complete details of how to interact with World Machine.\nCompute Language Currently OpenCL is the compute language. Other languages may be supported in the future. OpenCL 1.2 is the minimum version required. Compute kernels are compiled by your GPU drivers and run on the GPU.\nAny valid compute kernel can be run within World Machine.\nSee the Language References section for links for general information on writing compute kernels in OpenCL C.\nConfiguration A number of configuration options are available for your device:\nIdentity is the most important thing to assign. When you click the Assign button, you can name your device. Naming the device embeds a hidden globally unique class identifier. Devices that have the same GUID will be considered the “same” in the eyes of World Machine, in much the same way that different Basic Perlin devices are the same. This enables you to copy/paste settings between those devices, etc. If you change the Identity of the device, it will no longer be considered the same… do so carefully. The Family of the device controls its appearance, and where it gets sorted within the various menus and toolbars in World Machine The Summary should be a brief description of what the device does The Description can be more in depth. It is displayed when the user clicks a help icon. Parameters, inputs, and outputs are created the same as for Macros. To retrieve your parameters from the script, refer to it by the ID you’ve given it – this can be the automatically assigned one, or a custom one. For example:\nLimitations There are a number of limitations right now in the Code device.\nThe scripting bindings to World Machine are still under construction. Currently only supports heightfield and bitmap datatypes for compute. You can only provide a build script. No other control of the device is possible. There is no access to built-in functions, such as rescaling a packet. This would be very useful. Only Lua and OpenCL are supported Some of these limitations will be improved over time.\nResources World Machine World Machine Lua API Language References OpenCL API Reference Sheet\nOpenCL Kernel Language Reference\nLua – Getting Started\nLua Reference Guide\nCPU Drivers The default GPU backend is OpenCL. Although the Code device is intended to be GPU accelerated, you may wish to use the Intel OpenCL CPU driver to run code on your processor.\nIntel OpenCL CPU Drivers The Intel driver has been tested and works well. (Yes, you can also use it with AMD-based systems).\nFor many common scenarios within World Machine, the OpenCL performance running on the CPU is competitive with the GPU.\n以及LUA Plugin API文档。\nLUA World Machine Plugin API This feature was introduced in the “Hurricane Ridge” release\nThis article contains the currently supported API for interacting with World Machine from your Lua scripts within the Code device.\nAs the bindings are continually developed, this reference material will be updated to stay current.\nOverview This API reference is only for the Host script language. You will also need to write one or more kernels in your compute language to create a device.\nAll World Machine bindings are exposed in the ‘wm’ library. To use any of the top-level commands below, make sure you access them with the ‘wm’ prefix. For example, ‘wm.parameter()’.\nSandboxing To allow for secure sharing of plugin devices between users, the Lua scripting session is sandboxed:\nYour script has no access to the system or external data. Your script cannot persist information outside of the device build process. The compute kernels have no access to any other data than that provided via the scripting. The lua math and string libraries are available. No other built-ins are provided. The World Machine plugin API is accessible. Future versions may relax the sandboxing for custom devices that are not shared with others.\nDatatypes A variety of custom datatypes are created by the World Machine library.\nbuffer: A raw collection of bytes. Can be used to supply general memory to your compute kernel, or when accessing the underlying data of an input such as a heightfield. Your kernel should accept this as a float* parameter (or other relevant type).\nimage: An Image datatype, as defined in OpenCL. This may be more convenient than accessing a raw buffer, and some API functions will only return images. The image will be a 2D four channel RGBA texture. Your kernel must access as an image2d_t parameter.\nIn addition, standard Lua datatypes are used:\nvalue: This is a Lua built-in integer or floating point value. Your kernel can accept either and WM will convert as appropriate.\ntable: A Lua table, which is simply a collection of values.\nstring: A Lua string.\nA few additional notes:\nIf a function takes a slot value, it should be provided an integer. If a function takes a name, it should be provided a string. The extended datatypes have reference semantics. For example, that means that assigning one buffer to a new buffer variable does not copy the buffer – they will both refer to the same object. Definitions Some values defined within the library are meant to be identifiers rather than be manipulated. Providing these values allows WM to know what kind of data you are referring to.\nPacket types You can pass these identifiers to createBuffer or createImage, among other places, to create the correct types. They are a table defined at ‘wm.packet’.\n1 2 3 wm.packet.hf -- A single channel heightfield image wm.packet.rgb -- A 3-channel rgb image. Data types These are values used to communicate how to interpret a raw buffer. They are a table defined at ‘wm.type’. These are unused in the current API.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 wm.type.byte -- 8bit unsigned integer data wm.type.int -- 32bit wm.type.int64 -- 64bit wm.type.float -- 32bit floating point wm.type.vec2 -- float vector2 wm.type.vec3 -- float vector3 wm.type.vec4 -- float vector4 wm.type.half -- 16bit floating point wm.type.half3 -- 3 x 16bit floats Inputs Functions to take data from the input ports on the device, as well as the current parameters. The slot should be a number starting at zero for the first input.\n1 2 3 4 5 6 7 8 9 10 11 buffer wm.inputBuffer(slot) image wm.inputImage(slot) value wm.inputValue(slot) image wm.mask() value wm.parameter(name) value wm.parm(name) -- A convenience short alias for the above Inputs of either heightfield or bitmap type can be taken as images or buffers, using either of the first two functions above as needed. The returned result will be of the type shown and can be used or passed to other functions.\nNote that if you take a bitmap input as a buffer, the data is 3 channels of 16bit floating point, which takes special consideration to access inside of an OpenCL compute kernel.\nCreation Create new memory buffers or images for use by your compute kernels.\nIf no type is specified, the default is a heightfield. If no dimensions are specified, the current world render size is used. The dims parameter is currently ignored! It is not currently possible to create images of a different size than the general context.\n1 2 3 4 5 image wm.createImage(type, dims) buffer wm.createBuffer(type, dims) buffer wm.createRawBuffer(bytes) Context Functions Several functions are built-in to allow you to gain access to the build context your device is invoked within.\nWorldspace 1 image wm.worldspace() Generate a image containing the the xy world-space coordinates for this build, in the red and green channels. The blue and alpha channels are unused and set to zero.\nThe image values are unnormalized 32bit floats. They correspond exactly to the render extents defined in your project settings.\nNote that the worldspace coordinates are in internal World Machine units instead of kilometers. Each unit corresponds to 8 kilometers.\nThis is very useful to allow your compute kernel to understand what point in the world each pixel corresponds to! You will often use this, or the devicespace() function, to easily access this information.\nIf you output this image directly as a bitmap, it would look like this:\nDevicespace 1 image wm.devicespace() Devicespace is the world-space coordinate transformed by the device’s placement. The placement includes rotation, translation, and any connected domain distortion input.\nThe RGBA image is divided into two pairs of channels. The image values are unnormalized 32bit floats with real numbers.\nThe RG channels contains the (X,Y) distorted coordinates The BA channels contains the undistorted (X,Y) device coordinates. It looks like this, visualized:\nGenerally you will only need the RG channels. Device space is very useful for generator-type devices that want to make a pattern or some other output that can be placed into the world.\nWorld Context Retrieve a table containing the current render extent information.\n1 table wm.context() The table has the following members:\nint dimX, dimY — Dimensions in pixels of the render extent\nfloat x0, y0, x1, y1 — World render extent corners\nfloat originX, originY — Placement origin\nfloat rotate2D — Placement rotation in degrees\nOutputs Send data to an output port.\n1 wm.output(data, port) The port should be a number, starting at zero for the first output.\nThe port configuration determines the acceptable datatype to send. For example, a heightfield output must contain a buffer or image. Possible types of your data include:\nhf : image, buffer\nrgb : image, buffer\ntext : string\nparam : value, string\nCompute Kernels To perform operations on the GPU, use the runKernel function in the wm library.\n1 wm.runKernel(kernelname/kernelobject, arg1, arg2, ...) The first parameter must be a string containing the name of the compute kernel, while the following arguments should be buffers, images, or values. The types must match the type defined in your kernel function.\nCurrently, there is no way to define the local workgroup size of a kernel.\nOther Functions Progress Reporting 1 2 3 wm.progress(percent) wm.progress(current, total) You can specify the build progress as a floating point value from 0..1 or as current, total as integers.\nThere is currently no way to check if the user has requested the build to cancel.\n第二部分：学习示例 这里有几个完整的代码示例，请学习它们的结构和实现方式。每个示例都包含 Host (Lua) 和 Compute (OpenCL) 两部分。\n1.OpenCL Example Generator Host Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 -- The featurescale is a distance value that will correspond to the wavelength of a full sinewave, in this example local featurescale = wm.parameter(\u0026#34;featureScale\u0026#34;) -- Switch the kernel we\u0026#39;re using based on the option chosen by the user local useKernel = \u0026#34;primary\u0026#34; local kerneltype = wm.parm(\u0026#34;type\u0026#34;) if (kerneltype == 1) then useKernel = \u0026#34;secondary\u0026#34; end -- Get the per-pixel devicespace location. This automatically accounts for device origin, rotation, and distortion wspace = wm.devicespace() -- Create a buffer for the compute result. By default, it will be a heightfield (sngle channel 32bit float) at the current device build size result = wm.createBuffer() -- Run the compute kernel! wm.runKernel(useKernel, wspace, result, featurescale) -- Transfer the results and output from this device wm.output(result, 0) Compute Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 void kernel primary(__read_only image2d_t location, global float* A, float featureScale) { int2 gridPos = (int2)(get_global_id(0), get_global_id(1)); size_t stride = get_global_size(0); size_t idx = stride * gridPos.y + gridPos.x; float4 xy = read_imagef(location, gridPos); float freq = 2.0f * 3.14159f / featureScale; float result = sin(xy.x * freq); // along X axis A[idx] = result * 0.5f + 0.5f; }; void kernel secondary(__read_only image2d_t location, global float* A, float featureScale) { int2 gridPos = (int2)(get_global_id(0), get_global_id(1)); size_t stride = get_global_size(0); size_t idx = stride * gridPos.y + gridPos.x; // Get the xy location from our input image. Adjust the center of the radial gradient to the middle of our default extents (0.5, 0.5) // as a positioning offset example float2 xy = read_imagef(location, gridPos).xy - (float2)(0.5f, 0.5f); float freq = 2.0f * 3.14159f / featureScale; float result = cos(length(xy) * freq); A[idx] = result * 0.5f + 0.5f; }; 2.OpenCL Blur Host Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -- This is a simple example of a blur kernel, applied \u0026#39;Repeat\u0026#39; number of times to the image. -- The blur kernel performs a simple 3x3 box filter convolution. map = wm.inputBuffer(0) temp = wm.createBuffer() maxIter = wm.parameter(\u0026#34;Repeat\u0026#34;) -- Do ping-pong buffering. Each iteration blurs twice, so that the results end up in the same buffer we started with for i = 1, maxIter do wm.runKernel(\u0026#34;diffuse\u0026#34;, map, temp) wm.runKernel(\u0026#34;diffuse\u0026#34;, temp, map) wm.progress(i, maxIter) end wm.output(map, 0) Compute Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 extern size_t gridIndex(); void kernel diffuse(global float* A, global float *B) { size_t idx = gridIndex(); int2 sz = (int2)(get_global_size(0), get_global_size(1)); int2 coord = (int2)(get_global_id(0), get_global_id(1)); bool oob = false; if (coord.x \u0026lt; 1 || coord.y \u0026lt; 1) oob = true; if (coord.x \u0026gt;= sz.x-1 || coord.y \u0026gt;= sz.y-1) oob = true; // Simple out of bounds protection by not blurring the edge. This leaves a one pixel unblurred border which is undesirable but works fine for this example. if (oob) { B[idx] = A[idx]; return; } size_t stride = get_global_size(0); float r = A[idx] + A[idx-1] + A[idx+1]; r += A[idx-stride] + A[idx+stride]; r += A[idx-stride-1] + A[idx+stride-1]; r += A[idx-stride+1] + A[idx+stride+1]; r /= 9; B[idx] = r; }; 3.OpenCL FlowDirs Host Part\n1 2 3 4 5 bufInput = wm.inputBuffer(0) bufResult = wm.createBuffer() wm.runKernel(\u0026#34;flowdir\u0026#34;, bufInput, bufResult) wm.output(bufResult, 0) Compute Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 //Compute kernel void kernel flowdir(global float* A, global float *result) { float r = 0.0f; int x = get_global_id(0); int y = get_global_id(1); size_t width = get_global_size(0); size_t height = get_global_size(1); size_t stride = width; size_t idx = stride * get_global_id(1) + get_global_id(0); // Have to protect against out of buffer access if (y \u0026gt; 0 \u0026amp;\u0026amp; y \u0026lt; height-1) { if (x \u0026gt; 0 \u0026amp;\u0026amp; x \u0026lt; width-1) { float cur = A[idx]; float w = A[idx-1] - cur; float e = A[idx+1] - cur; float n = A[idx+stride] - cur; float s = A[idx-stride] - cur; float best = 0.0f; if (w \u0026gt; best) { r = 0.2f; best = w; } if (e \u0026gt; best) { r = 0.4f; best = w; } if (n \u0026gt; best) { r = 0.6f; best = w; } if (s \u0026gt; best) { r = 0.8f; best = w; } } } result[idx] = r; }; 4.OpenCL PerlinNoise Host Part\n1 2 3 4 5 6 7 8 9 10 11 12 -- This is an example showing how to create a complex procedural generator such as Perlin noise. -- The overall process is still simple. wspace = wm.devicespace() result = wm.createBuffer() local featureScale = 1.0 / wm.parameter(\u0026#34;parm0\u0026#34;) local amplitude = wm.parameter(\u0026#34;parm1\u0026#34;) local octaves = 16 wm.runKernel(\u0026#34;gpuPerlin\u0026#34;, result, wspace, featureScale, amplitude, octaves) wm.output(result, 0) Compute Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 // Permute table for perlin noise int pRef[] = { 151,160,137,91,90,15, 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9, 129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107, 49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180, // end of table. 151,160,137,91,90,15,\t// doubled up so can skip clamping 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9, 129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107, 49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 }; float perlin_fade(float t) { return t * t * t * (t * (t * 6.f - 15.f) + 10.f); } float perlin_lerp(float t, float a, float b) { return a + t * (b - a); } float perlin_grad(int hash, float x, float y) { float z = 0.0f; int h = hash \u0026amp; 15; // CONVERT LO 4 BITS OF HASH CODE float u = h \u0026lt; 8 ? x : y, // INTO 12 GRADIENT DIRECTIONS. v = h \u0026lt; 4 ? y : h == 12 || h == 14 ? x : z; return ((h \u0026amp; 1) == 0 ? u : -u) + ((h \u0026amp; 2) == 0 ? v : -v); } // Reference implementation of perlin noise, lightly modified for opencl float noise2(float2 loc) { int*p = pRef; float2 floc = floor(loc); loc -= floc; int X = (int)floc.x \u0026amp; 255, // FIND UNIT CUBE THAT Y = (int)floc.y \u0026amp; 255; // CONTAINS POINT. float u = perlin_fade(loc.x), // COMPUTE FADE CURVES v = perlin_fade(loc.y); // FOR EACH OF X,Y int A = p[X] + Y, AA = p[A], AB = p[A + 1], // HASH COORDINATES OF B = p[X + 1] + Y, BA = p[B], BB = p[B + 1]; // THE 8 CUBE CORNERS, return perlin_lerp(v, perlin_lerp(u, perlin_grad(p[AA], loc.x, loc.y), // AND ADD perlin_grad(p[BA], loc.x - 1.0f, loc.y)), // BLENDED perlin_lerp(u, perlin_grad(p[AB], loc.x, loc.y - 1.0f), // RESULTS perlin_grad(p[BB], loc.x - 1.0f, loc.y - 1.0f)));// FROM 4 } // Same as above, but with the permute table in fast local shared memory float noise2Fast(float2 loc, local int*p) { float2 floc = floor(loc); loc -= floc; int X = (int)floc.x \u0026amp; 255, // FIND UNIT CUBE THAT Y = (int)floc.y \u0026amp; 255; // CONTAINS POINT. float u = perlin_fade(loc.x), // COMPUTE FADE CURVES v = perlin_fade(loc.y); // FOR EACH OF X,Y int A = p[X] + Y, AA = p[A], AB = p[A + 1], // HASH COORDINATES OF B = p[X + 1] + Y, BA = p[B], BB = p[B + 1]; // THE 8 CUBE CORNERS, return perlin_lerp(v, perlin_lerp(u, perlin_grad(p[AA], loc.x, loc.y), // AND ADD perlin_grad(p[BA], loc.x - 1.0f, loc.y)), // BLENDED perlin_lerp(u, perlin_grad(p[AB], loc.x, loc.y - 1.0f), // RESULTS perlin_grad(p[BB], loc.x - 1.0f, loc.y - 1.0f)));// FROM 4 } // Return the index of this cell for global memory arrays extern size_t gridIndex(); // Return the UV coordinate of the current cell within the render extent extern float2 uvCoord(); extern int2 gridCoord(); void kernel gpuPerlin(global float* A, image2d_t imgWS, float featureScale, float persist, int octaves) { int2 loc = gridCoord(); float2 uv = read_imagef(imgWS, loc).xy * featureScale; float r = 0.0f; float amp = 1.0f; for (int i =0; i \u0026lt; octaves; i++) { r += noise2(uv) * amp; uv *= 2.0f; amp *= persist; } // store to our buffer int idx = gridIndex(); A[idx] = 0.5f + 0.5f*r; }; // Use local shared memory for permute table. On older GPUs, this is faster. On modern devices the table is cached anyways. void kernel gpuPerlinFast(global float* A, image2d_t imgWS, float featureScale, float persist, int octaves) { __local int pL[512]; // initialize shared memory if (get_local_linear_id() == 0) { for (int i = 0; i \u0026lt; sizeof(pRef) / sizeof(pRef[0]); i++) { pL[i] = pRef[i]; } } barrier(CLK_GLOBAL_MEM_FENCE ); int2 loc = gridCoord(); float2 uv = read_imagef(imgWS, loc).xy * featureScale; float r = 0.0f; float amp = 1.0f; for (int i =0; i \u0026lt; octaves; i++) { r += noise2Fast(uv, pL) * amp; uv *= 2.0f; amp *= persist; } // store to our buffer int idx = gridIndex(); A[idx] = 0.5f + 0.5f*r; }; 5.OpenCL Simplest Host Part\n1 2 3 4 5 6 7 -- This plugin defines no compute kernel functions of its own - all we do is retrieve the worldspace coordinate and output it! -- Use the built-in worldspace function to retrieve the worldspace coordinate of every pixel, encoded as an RGB value mapWorldCoords = wm.worldspace() -- Output that image with no further modification. Usually, you\u0026#39;d use the image as an input to a kernel, but in our simplest implementation we do nothing with it. wm.output(mapWorldCoords, 0) Compute Part\n1 // This part is intentionally left empty. 6.Brick Generator Host Part\n1 2 3 4 5 6 7 8 9 10 11 --- Brick Generator --- -- Use the built-in worldspace function to retrieve the worldspace coordinate of every pixel, encoded as an RGBA value mapWorldCoords = wm.devicespace() mapHeight = wm.createImage(wm.packet.hf) -- Run an opencl kernel to create the brick texture wm.runKernel(\u0026#34;brick\u0026#34;, mapWorldCoords, mapHeight, wm.parm(\u0026#34;parm0\u0026#34;), wm.parm(\u0026#34;parm1\u0026#34;), wm.parm(\u0026#34;parm2\u0026#34;), wm.parm(\u0026#34;parm3\u0026#34;), wm.parm(\u0026#34;color0\u0026#34;), wm.parm(\u0026#34;color1\u0026#34;), wm.parm(\u0026#34;colorM\u0026#34;)) -- Output our diffuse image and our heightfield wm.output(mapWorldCoords, 0) wm.output(mapHeight, 1) Compute Part\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 extern int2 gridCoord(); // Hash function, used to vary the brick identity unsigned int hash(unsigned int x) { x ^= x \u0026gt;\u0026gt; 16; x *= 0x7feb352dU; x ^= x \u0026gt;\u0026gt; 15; x *= 0x846ca68bU; x ^= x \u0026gt;\u0026gt; 16; return x; } void kernel brick(__read_write image2d_t imgPos, __write_only image2d_t imgHeight, float scale, float aspect, float mortar, float offsetF, float4 color0, float4 color1, float4 colorM) { int2 loc = gridCoord(); float4 v = read_imagef(imgPos, loc); float2 wpos = v.xy / scale; wpos.y *= aspect; // We calculate the brick coordinate, and then offset every other row by the offset amount specified bool offset = ((int)floor(wpos.y)) % 2 == 0; if (offset) wpos.x += offsetF; float2 ifpart; float2 dist = fract(wpos, \u0026amp;ifpart); dist = min(dist, 1.0f - dist); int2 ipart = (int2)(ifpart.x, ifpart.y); // Create a brick ID code from the brick location. We\u0026#39;ll use it to mix colors for pleasing variety int brickCode = ipart.y; brickCode = hash(12 + brickCode); brickCode = hash(brickCode + ipart.x); float cellF = (brickCode \u0026amp; 255) / 255.0f; v = mix(color0, color1, cellF ); // Now mix in the mortar color float b = min(dist.x, dist.y) - mortar; if (b \u0026lt; 0) { v = colorM; b = 0.0f; } // shape heights b = sqrt(b); write_imagef(imgPos, loc, v); write_imagef(imgHeight, loc, b); } 第三部分：你的任务 现在，请根据以上知识和示例，为我创建以下指定的 Code Device。\n**节点名称:**风 / Wind\n**功能描述:**对来自输入端的 Heightmap 进行类似于 Photoshop 中的风滤镜的处理。\n**输入端口:**Input Terrain\n**输出端口:**Output Terrain\n**可调整参数 (Parameters):**自由发挥。\n代码要求:\nHost (Lua) 代码: 自由发挥。 Compute (OpenCL) 代码: 自由发挥。 ","date":"2025-07-03T13:09:10+08:00","permalink":"https://xzhongjie.github.io/p/worldmachinecodeprompt/","title":"WorldmachineCodePrompt"},{"content":"\n","date":"2025-06-15T22:45:28+08:00","image":"https://xzhongjie.github.io/p/%E5%A4%8F%E7%8B%82%E7%83%AD/1_hu_c3ca3eb6a6e3a51a.jpg","permalink":"https://xzhongjie.github.io/p/%E5%A4%8F%E7%8B%82%E7%83%AD/","title":"夏／狂热"},{"content":"是对在知乎的问题“如何看待6月4日北京大学与山东省文物考古研究院发表的关于母系社会的研究成果?”的自问自答。\n原始链接：中国科学家首次确认史前母系社会存在，成果登上 Nature，有哪些重大意义？ - 知乎\n补充1：当然，知乎把吞评论这事也顺手干了。评论区有几条评论是看不到的，如果有交流意愿可以私信给我。\n补充2：读完了这篇文章，个人认为是足以证明母系社会存在（但不意味着广泛存在）的，同时本研究与一些民族志的研究方法和研究结论不同（一些回答认为本研究不如以往民族志的验证方法，我认为是有失偏颇的）。本研究也带来了一些新的问题，例如恩格斯认为母系社会的来源是外婚制，谁是某一个孩子的父亲是不确定的，这才导致了母系，但傅家遗址却是一个地理隔离和食物来源单一导致的族内通婚的社会，谁是父亲的问题是比较清晰的，却依旧产生了母系。近期我将补全这一回答，具体写一写上面这些部分，先留个坑在这。另外，非常感谢共同作者 @polyhedron 的亲自答。\n补充3：坑已经填上了。\n以下是最初的控诉知乎员工恶意编辑问题的原回答，本提问的原问题是“如何看待6月4日北京大学与山东省文物考古研究院发表的关于母系社会的研究成果?”：\n@小花 我请您们知乎员工收敛一点好吗？不要再开小号编辑我的问题以后立即锁定。“首次确认母系社会存在”是一个高度主观化的观点，本提问希望讨论研究本身，而非论战文宣标题“确认了母系社会存在”是否合理，也并非先入为主地认同了本研究确证实了母系社会存在。您们知乎编辑为了引战创造对立蹭热度不择手段，天天想着搞个大新闻，反复修改我的问题的同时锁定问题，禁止我修改回来，属于是演都不演了。以后真别天天攻击这个平台攻击那个平台吞评论了，知乎这种直接篡改问题的不比吞评论恶劣得多？\n下面是我对本问题的个人看法：\n0.首先，再次感谢严实老师的回答。现在回答区的情形是我完全没有意料到的，总结起来大概有以下类别：共同作者严实老师的亲自答、认为这佐证了古典文献的记载的、认为本研究没有任何意义的、认为本研究纯属是贪经费的、认为本研究是为“打拳”（恕我找不到一个较为中性的描述此类行为的词汇）而服务的、等等。这当然脱离不了名为小花的用户对我的问题的反复编辑，以及在他编辑短短三分钟后知乎管理员对问题编辑进行锁定的行为，在此我再次向知乎编辑员工这种完全不加掩饰的篡改问题以博取热度的无耻行为发出强烈的抗议。“知乎”的名字大概来源于“知之乎者何也”，而这种篡改问题的行为大抵早已脱离了“知乎”之问的内涵。\n1.那么，我们回到这篇文章本身。一些答主已经对本文的逻辑进行了梳理，我大概重复一下这项工作：\n本研究基于对傅家遗址的两处墓地的DNA分析。\n发现了mtDNA单倍群高度集中，Fujia_N所有个体均为M8a3单倍型，Fujia_S大多数个体为D5b1b单倍型； 而Y染色体高度多样。 得出了这样的结论：个体按母系血统分区埋葬（与性别无关），表明氏族身份由母系传递。 且通过IBD分析发现：\n其中的很多个体之间，存在二级至六级亲属关系； 且同一墓地内的亲属关系更近。 得出了这样的结论：即使存在密切血缘关系，个体仍严格按母系氏族归属埋葬，且该制度持续至少10代（约250年）。 且社群实行内部通婚，但尽可能避免近亲结婚。这可能与他们的活动范围小，食物来源单一有关。\n综上，有结论：早期母系制度可能在没有强大财富积累机制的社区中出现并持续存在。\n本研究也存在一定的局限性：仅凭遗传模式并不能为母系血统提供确凿的证据、婚后居住模式无法仅从墓葬习俗或遗传数据中明确推断等。\n2.由于我学识浅薄，并不能得出一个我自己的见解。因此接下来我仅仅将一些母系社会的研究方法罗列在下面。\n民族志研究：民族志是社会学研究中进行定性研究（或称质性研究等）的一种方式，需要研究者长期与当地人生活在一起，通过自己的切身体验获得对当地人及其文化的理解。简单来说，就是观察当代那些“未开化的”族群，来推测人类社会的广泛的发展进程（这么说很不严谨，只是为了方便）。这种研究的缺陷是显然的。第一，我上面用了“未开化”一词，实际我应当用“原始”一词，但人类学家终究是人，偏见/怜悯总是难以避免的。第二，用现在来推测以前，这种推广方式如果不加以其他形式的分析来佐证，是相当危险的。因此一些回答声称存在母系社会的活化石，因此本研究没有意义，这是有失偏颇的。\n文明人类学：文明人类学是指基于古典文献解读的人类学。现在的文化人类学研究强调田野工作，认为弗雷泽等早期的人类学家是“摇椅上的人类学家”。但其实用古典文献来研究人类学也是相当重要的，一些回答下面提到了感生神话、上古八大姓、《庄子·盗跖》中关于“民知其母，不知其父”的记载、以及《山海经·海内经》中“帝令祝融杀鲧于羽郊。鲧复生禹。帝乃命禹卒布土以定九州”的记载，这种思考都是相当有益的。实际上包括类似于“不知其父”的记述的古典文献还有很多，比如《白虎通德论·号》、《论衡·齐世》、《商君书·开塞》、《焦氏易林·讼之》、《太平御览》等等。徐旭生先生就认为庄子一派受到了苗族伏羲与女娲传说的影响，并指出了伏羲地位逐渐上升，女娲地位逐渐下降就有可能是从母系走向父系的体现。而北京大学的吴飞老师在《圣人无父》对这种研究思想有比较到位的评价：“将原本的经学材料当作史料来用，考察古代社会的风俗，纵然有很多缺陷，但从中国现代学术史来看，是一个比较成功的思路，因为它能较好地将经典材料转化到现代社会科学的视野当中。不过，这种六经皆史的研究方式，却往往不能摆脱西方理论的痕迹。虽然古代诗学传统中也在不断讨论圣人无父的问题，皮锡瑞甚至把它和知母不知父的说法关联起来，但在没有西方理论介入之时，他们绝对不会推出母系社会的结论。”\n分子人类学：即本文的研究方法。这种方法的好处是显然的。而缺点方面，中华民族实际上是强调历史记忆与族群认同的的民族，血缘的关系似乎没那么重要。（大概是是阅读了王明珂先生的著作后总结的观点，可参考其著作《英雄祖先与弟兄民族》、《羌在汉藏之间》，限于本人学识，可能与其实际含义有一定偏差。）\n如果用一句最简单的话来总结，当然是各种方法结合起来是最好的，非要争个高下不可行、不可取、也没有意义。\n3.我认为这篇文章的论证过程是比较可取的，推出的结论也都是比较弱的结论，只说了本研究足以证明母系社会存在。社会学研究的社会概念可大可小。风笑天老师说：“（社会学）它也要关注由人们所组成的各种社会群体、各种社会组织、各类社区；关注个人与个人、个人与群体、个人与社会、群体与群体、群体与社会之间的各种社会关系。”傅家遗址曾经的社群是一个母系社会这样的叙述大概是比较准确。这篇文章没有说自己证明了普遍的母系社会阶段存在，也没有论证母系社会是如何形成和消亡的。从这一点来说，或许知乎问题的标题用“母系社群”或“母系社区”这样的标题，来避免使用“社会”这种比较容易导致理解上的偏差的词汇，就可以避免这种大论战的情形，但本人对知乎编辑的行为是相当无力的。\n4.我读完文章后产生了一点问题。恩格斯在《家庭、私有制与国家的起源》中对母系社会的形成是这样讲的：“在一切形式的群婚家庭中，谁是某一个孩子的父亲是不确定的，但谁是孩子的母亲则是确定的。即使母亲把共同家庭的一切子女都叫作自己的子女，对于他们都担负母亲的义务，但她仍然能够把她自己亲生的子女同其余一切子女区别开来。由此可知，只要存在着群婚，那么世系就只能从母亲方面来确定，因此，也只承认女系。”但傅家遗址的情况是，由于活动范围小，食物来源单一，社群实行内部通婚，谁是某个孩子的父亲的问题是比较确定的，却依旧产生了母系社会的形态。这与恩格斯写的是不太一致的。因此母系社会的形成机制仍需要进一步研究。\n以上只是我作为题主的一个自问自答，对一些引用可能由于本人学识不足或融入了我个人的理解延申，因此可能与原文有一定偏差，我更推荐对本话题感兴趣的读者阅读相关原始文献。本文不构成任何学术讨论。谢谢。\n","date":"2025-06-15T22:05:28+08:00","permalink":"https://xzhongjie.github.io/p/%E5%A6%82%E4%BD%95%E7%9C%8B%E5%BE%85%E7%8E%8B%E5%8A%B2%E7%AD%89%E5%8F%91%E8%A1%A8%E7%9A%84%E5%85%B3%E4%BA%8E%E6%AF%8D%E7%B3%BB%E7%A4%BE%E4%BC%9A%E7%9A%84%E7%A0%94%E7%A9%B6%E6%88%90%E6%9E%9C/","title":"如何看待王劲等发表的关于母系社会的研究成果"},{"content":"正好需要，于是便写了一个下载璃月人民大学本科教参库电子书的小工具。\n挂在了Github上面，可自行取用：https://github.com/xZhongjie/RUC_OlnBkDlder\n","date":"2025-06-14T22:05:28+08:00","permalink":"https://xzhongjie.github.io/p/ruc_olnbkdlder/","title":"RUC_OlnBkDlder"},{"content":"主讲人：中国人民大学国学院 李萌昀 写在前面 本文系对中国人民大学国学院李萌昀副教授专题讲座《空有之间：中国古代香学小引》的内容整理。在此谨向李萌昀老师的精彩讲座致以谢忱。\n为明确文本性质与使用规范，特作如下说明：\n内容来源：本整理稿依据讲座现场记录完成，受记录者记忆局限及信息筛选影响，可能存在内容疏漏或表述偏差。 学术立场：文中包含整理者个人的理解延伸与学术推论，相关观点仅代表整理者学术思考，非主讲人原意。 文本效力：本稿未经主讲人审阅确认，不具学术引用效力，建议研究者通过正式学术出版物获取原始研究成果。 责任声明：文本内容如存在表述争议或事实出入，责任由整理者承担，与主讲人及主办机构无关。 版权须知：讲座所涉学术成果、研究材料及理论观点的完整知识产权归主讲人及相关权利人所有；如认为本文存在知识产权争议，请及时联系删除；本整理稿仅限个人学习研究使用，禁止一切商业用途的复制、改编及传播。 香品 空有之间：是“有”触动了人们的感官，但人们描述嗅觉的词汇往往是“空”的。\n宋·熊朋来《陈氏香谱序》：陳氏香譜 : 序 - 中國哲學書電子化計劃\n香者，五臭之一，而人服媚之，至于为香谱。非世宦愽物、尝杭舶浮海者，不能悉也。\n河南陈氏香谱，自子中至浩卿，再世乃脱藁。凡洪、顔、沈、叶诸谱，具在此编集，其大成矣。\n诗书言香，不过黍稷萧脂。故香之为字从黍作甘。古者从黍稷之外。可焫者萧，可佩者兰，可鬯者郁。名为香草者无几。此时谱可无作。\n《楚辞》所录名物渐多，犹未取于遐裔也。\n汉唐以来，言香者必取南海之産。故不可无谱。\n《诗·生民》：香气向上，人借以与神沟通。\n载谋载惟，取萧祭脂。取羝以軷，载燔载烈，以兴嗣岁。卬盛于豆，于豆于登，其香始升。上帝居歆，胡臭亶时。\n《楚辞》中有很多植物香气的记述，《红楼梦》中也有很多水果香气的记述，然其不足作谱，不可成学。\n香品包括：\n沉香，檀香，龙（脑）香，麝香 龙涎香，甲香（有功能但无味道），乳香，安息香，苏合香，降真香，丁香，郁金，都梁，零陵，蔷薇水 沉香·伽楠（最高品质的沉香）·伽南 沉香拐棍、伽楠念珠（突出伽楠之珍贵）\n一气粹和之凝结：需要漫长过程才能形成。\n明·李时珍《本草纲目》：\n香之等凡三：曰沉，曰栈，曰黄熟是也。沉香入水即沉，其品凡四：曰熟结，乃膏脉凝结自朽出者；曰生结，乃刀斧伐仆，膏脉结聚者；曰脱落，乃因水朽而结者；曰虫漏，乃因蠹隙而结者。（密度大者居上品）\n其栈香，入水半浮半沉，即沉香之半结连木者，或作煎香，番名婆木香，亦曰弄水香。\n其黄熟香，即香之轻虚者，俗讹为速香是矣。\n兰奢待：藏于日本，“天下第一名香”，凡取用处都用付签注明何人于某年某月截取几寸几分。\n檀香 原产自印度、海南等地。\n冰片（龙脑香） （明）周嘉胄撰《香乘》卷三，四库全书本：\n龙脑香即片脑，金光明经名羯婆罗香，膏名婆律香。\n麝香 气味特殊且浓郁，需要调和后再用。\n丁香 花蕾称为公丁香、果实称为母丁香。\n含香奏事，（明）周嘉胄撰《香乘》卷二（四库全书本），引《汉官仪》：\n丁香、鸡舌，本是一种，何庸聚讼。含鸡舌香尚书郎含鸡舌香伏奏事，黄门郎对揖跪受，故称尚书郎怀香握兰。\n桓帝时，侍中刁存年老口臭，上出鸡舌香与含之。鸡舌颇小，辛螫不敢咀咽。嫌有过，赐毒药，归舍辞决，家人哀泣，莫知其故。僚友求舐其药，出口香，咸嗤笑之。\n香方 百合之香，指的是多种香料复合之香。《红楼梦》第四十一回：\n袭人恐惊动了宝玉，只向他摇手儿，不叫他说话。忙将当地大鼎内贮了三四把百合香，仍用罩子罩上。\n范晔发明合香之法，撰《合香方》。\n合香之法，贵于使众香咸为一体。——陈敬《香谱》\n发香（激发出其他香的味道，本身可能有香气，也可能没有）：檀香，麝香，甲香，丁香，安息香，降真香，龙涎香\n聚香（让留香的时间更久）：龙涎香，金颜香\n聚烟（焚香时增加烟雾）：龙涎香，艾香\n由上述作用可见，龙涎香珍贵。\n《岭外代答校注》：一铢翠烟，浮空结而不散。座客可用一剪分烟缕。此其所以然者蜃气楼台之余烈也。\n南宋顾文荐《负暄杂录》：“龙涎香品”条\n江苏武进南宋墓香饼\n南宋《百宝总珍集》：龙涎花子有多般。\n宋·周去非《岭外代答》：大食西海多龙，枕石一睡，涎沫浮水，积而能坚。鲛人探之以为至宝。\n然而，实际情况下我们所见的龙涎香并非上述，因其珍贵。更多见到的是模仿龙涎香的合香。\n杨万里《烧香七言》：\n琢瓷作鼎碧於水，削银为叶轻如纸。\n不文不武火力匀，闭阁下帘风不起。\n诗人自炷古龙涎，但令有香不见烟。\n素馨忽闻茉莉折，低处龙麝和沉檀。\n平生饱识山林味，不奈此香殊妩媚。\n呼儿急取烹木犀，却作书生真富贵。\n由“素馨忽闻茉莉折”一句可见，素馨（鸡蛋花）为龙涎香主料。\n合香的名字代表一种意境，并非一定是在模拟某种香的味道\n酴醾：三两玄参一两松，一枝模子蜜和同。少加真麝并龙脑，一架酴醯落晚风。——陈敬《陈氏香谱》\n江梅：百粒丁香一撒茴，麝香少许可堪裁。更加五味零陵叶，百斛浓熏江上梅。——陈敬《陈氏香谱》\n雪中春信：言冷中有暖。\n鹅梨帐中香：沉香、苏合油/鹅梨。\n焚香之法：\n迎春又令丫鬟炷了一支梦甜香。原来这梦甜香只有三寸来长，有灯草粗细，以其易烬，故以此烬为限，如香烬未成便要罚。——《红楼梦》第三十七回\n隔火熏香，“幽韵而无烟”。\n银叶、云母：焚香必于深房曲室，矮桌制炉，与人膝平，火上设银叶或云母，制如盘型，以之趁香，香不及火，自然舒慢无烟燥气。（《陈氏香谱》引《香史》）\n梅花香饼儿：炭，并非指香品。\n欧阳修《归田录》：清泉香饼。（但炭中可以加些香料，使其隐隐有香味。）\n香器 错金博山炉：“像海中博山”（西京杂记、考古图），可能用明火，因要复刻海上千山的烟雾效果\n景德镇窑青白釉熏炉\n鎏金双蛾团花纹镂孔银香囊（香囊，香毬、被中香炉，炉体常平，可置于被褥）\n鸭炉：\n深帏金鸭冷。（李贺）\n无言独自添香鸭。（周紫芝）\n下帷睡鸭春闲。（黄庭坚）\n炉瓶三事：指香炉、盛放灰压和香箸等器具的炉瓶、宝子。\n香事 贵族香与文人香不同。\n贵族香 隋炀帝的沉香火山\n沉香亭（李白《清平调》）\n四香阁（《开元天宝遗事》）\n霭若云雾，奢侈但有文人雅致：吴开正仲云，渠为从官，与数同列往见蔡京，坐于后合:京谕女童使焚香，久之不至，坐客皆窃怪之。已而，报云香满，蔡使卷帘，则见香气自他室而出，若云雾，蒙蒙满坐，几不相睹，而无烟火之烈。既归，衣冠芳馥，数日不歇。计非数十两，不能如是之浓也。其奢侈大抵如此。——宋·庄绰《鸡肋编》\n文人香 香之为用：清心悦神、畅怀舒啸、远辟睡魔、熏心热意（用各种用香的方法来标榜文人的情趣，但与贵族不同，真正强调”用“）\n黄庭坚《香之十德》：感格鬼神、清净心身、能除污秽、能觉睡眠、静中成友、尘里偷闲、多而不厌、寡而为足、久藏不朽、常用无障\n黄太史四香：深静（恬澹寂寞，非世所尚）\n更香：朝罢谁携两袖烟？琴边衾里两无缘。晓筹不用鸡人报，五夜无烦侍女添。焦首朝朝还暮暮，煎心日日复年年。光阴荏苒须当惜，风雨阴晴任变迁。－－打一用物。贾政道：“这个莫非是更香？”宝玉代言道：“是。”——《红楼梦》第二十二回\n香篆：制作复杂，可用于计时。镂木以为之，以范香尘为篆文，然于饮席或佛像前，往往有至二三尺径者。\n百刻香：近世尚奇者作香篆，其文准十二辰，分一百刻，凡燃一昼夜已。\n香印：四印如式。印傍铸有边阑提耳，随炉大小取用。先将炉灰筑实，平正光整，将印置于灰上，以香末锹入，印面以香锹筑实，空处多余香末细细锹起，无少零落用手提起香印，香字以落炉中，若稍欠缺，以香末补之，焚烧可以永日。——明·高濂《遵生八笔》，香印由香篆发展得来，省去复杂的“镂木以为之”的过程。\n然“轻覆雕盘一击开”，选择吉祥图案，但最终要烧掉，“历尽崎岖心始灰”，凸显悲凉之感。\n嗅觉往往与记忆有关。“香气犹著衣枕”就是用嗅觉去写思念。\n前秦·王嘉《拾遗记·前汉上》： “（汉武帝）息于延凉室，卧梦李夫人授帝蘅芜之香。帝惊起，而香气犹著衣枕，历月不歇。帝弥思求，终不复见，涕泣洽席，遂改延凉室为遗芳梦室。\n从“猧子乃上局”到“此瑞龙脑香也”，对杨贵妃的思念。\n唐·段成式《酉阳杂俎》：天宝末，交趾贡龙脑，如蝉蚕形。波斯言老龙脑树节方有，禁中呼为瑞龙脑。上唯赐贵妃十枚，香气彻十余步。上夏日尝与亲王棋，令贺怀智独弹琵琶，贵妃立于局前观之。上数枰子将输，贵妃放康国猧子于坐侧，猧子乃上局，局子乱，上大悦。时风吹贵妃领巾于贺怀智巾上，良久，回身方落。贺怀智归，觉满身香气非常，乃卸幞头，贮于锦囊中。及上皇复宫阙，追思贵妃不已，怀智乃进所贮幞头，具奏他日事。上皇发囊，泣曰：“此瑞龙脑香也。”\n感官有洞见就会有盲识，嗅觉是对视觉的补充，帮助我们认识世界的多重面向。\n苏轼《和黄鲁直烧香二首》\n四句烧香偈子，随香遍满东南。\n不是闻思所及，且令鼻观先参。\n万卷明窗小字，眼花只有斓斑。\n一炷烟消火冷，半生身老心闲。\n明海《香之为道》：人们认识世界的六种感官渠道——眼耳鼻舌身总(六根)，及其所对应的六种信息-——色声香味触法(六生)，是生命的迷失处，也是生命的觉醒处，当其迷失，根尘交接的利那起作用的心叫“说”；当其觉醒，根生交接的利那现的心念叫“智”。“说”、“智”只是假名，都是当下一念的机用。然此一念或智或识，圣凡立判，迷悟天壤，染净两途。自性的沉论在此，自性的醒觉亦在此。\n佛教言空，此事因彼事为空。\n闻香见道心：闻香的过程中呼吸有交替，在闻的过程中“有”，交替的过程是无，而“无”的过程是空的，方能体现本心。\n该部分限于本人学识，只可意会讲座人之意，难以言传。\n","date":"2025-05-16T22:05:28+08:00","permalink":"https://xzhongjie.github.io/p/%E7%A9%BA%E6%9C%89%E4%B9%8B%E9%97%B4%E4%B8%AD%E5%9B%BD%E5%8F%A4%E4%BB%A3%E9%A6%99%E5%AD%A6%E5%B0%8F%E5%BC%95/","title":"空有之间：中国古代香学小引"},{"content":"引言 《齐物论》作为《庄子》内篇的核心章节，被冯友兰称为“庄之所以为庄者”，其中“吾丧我”一句尤为引人注目, James Legge将其翻译为“I had just now lost myself”。传统解读常将“吾”视为高层次的自我，“我”视为低层次的自我，但本文试图重新解读“吾丧我”，提出一种新颖的观点：即“吾”代表外在的、受社会构建的自我，而“我”代表内在的、真实的自我，“吾丧我”因此“对于自己在俗世中展现出来的外表，已经丧失了真正的自己”。\n从“今者”的概念谈起 颜成子游立侍乎前，曰：“何居乎？形固可使如槁木，而心固可使如死灰乎？今之隐几者，非昔之隐几者也。”子綦曰：“偃，不亦善乎而问之也！今者吾丧我，汝知之乎？女闻人籁而未闻地籁，女闻地籁而未闻天籁夫！”\n“形固可使如槁木，而心固可使如死灰乎？”一句，意为“形本来就……，而心本来就……吗？”这样的问法实际上是在暗示“形本来不……，而心本来不……”，进而可以知道，提问的话题应该是“是什么让你的形……，而心……？”因此，“吾丧我”作为回答，应该是强调“吾”在当下这个时刻的状态是“丧我”，进而导致了“吾”此时形如槁木而心如死灰。“吾丧我”不是对过去这段时间以来“吾”状态的表述，因此，探讨“吾丧我”的真正含义才有意义，否则“吾丧我”就可以有以下两种解释：\n吾是希望丧我的，“这段时间以来吾丧我，所以我现在……”；\n吾是不希望丧我的，“这段时间以来吾丧我，我未来应当……”。\n无论“吾“和“我”孰为高下，其本质都是一样的。当然，这里仅是从文法角度证明，“今者”的概念必然是瞬时而非持续的。结合后文，显然“吾丧我”是好的。\n“今者”的瞬时性使“吾丧我”成为了一种不可驻留的存在状态，可以证明“吾丧我”既非主动追求，也非被动丧失，而是当下的自然呈现，是摒弃人为的存在。它是一种无目的性的、自发的状态，不可强求，只可自然显现，“夫吹万不同，而使其自已1也，咸其自取，怒者其谁邪”，恰如后文所提到的“天籁”。反过来想，如果“吾”真的在追求“丧我”，那“吾”就必然不可能“丧我”。\n“吾”“我”高下之争 诚然，“吾”常常作主语和定语，但单纯认为“吾丧我”中主语用“吾”是一种语法现象，笔者认为并不合理，因为“我”显然也可作主语。不必舍近求远，就《齐物论》这篇而言，下文就出现了“既使我与若辩矣，若胜我，我不若胜，若果是也？我果非也邪？我胜若，若不吾胜，我果是也？而果非也邪？”和“我与若与人俱不能相知。”，这种“我”作主语的情况。庄子用“吾丧我”而非“我丧我”（或者“我丧吾”，但“吾”几乎只在否定句的宾语前置中才作宾语）必然是认为“吾”和“我”存在某种程度的差异。林希逸注意到了这一点，“吾即我也，不曰我丧我，而曰吾丧我，言人身中才有一毫私心未化，则吾我之间亦有分别矣。吾丧我三字下得极好。”[1]但他认为“吾即我也”，“言人身中才有一毫私心未化”，认为“吾”与“我”词义上并无不同，笔者认为是有待商榷的。但认为“吾”“我”存在差别的解庄者，都秉持一种观念，“吾”是高于“我”的存在[2]，这也并不尽然。\n《说文解字》云：“（吾）我自称也。”[3]但问题在于“我自称也”这短短四个字，却可以解读为“我，自称也”或“我（之）自称也”。若按照前者解释，“吾”就只是和“我”一样的简单第一人称代词，汤可敬解读为“吾，我，是自己对自己的称呼”[4]。但按照后者解释，“吾”就是在自称时所用的“我”，是被言说出来的“我”。笔者认为后者解读合理，“吾”“从口”，形声字，口为形旁，证明“吾”是言说的对象，这恰恰与“吾”往往用作主语和定语的语法功能吻合。林凯、苏煜文认为“吾”作为单纯自称，没有将自身与他者关联而进行自我确认，没有将自我进行对象化[5]，这种说法是比较有道理的。“吾”是外在的、被社会构建的言说的自我，而“我”是更本真的自我。\n从音韵的角度考虑，一些学者提出“吾”“我”体现了上古汉语是屈折语[6]。但笔者认为这是片面的。屈折语对虚词的需求极小，但汉语显然存在着大量的虚词。我们引入“卬”字，“卬”在西周语料中只有四处，作主语和定语，这与“吾”的语法功能是一致的[7]。而“吾”与“卬”同属鱼部，笔者认为这是人们在进行文学创作时因缺少一个鱼部的第一人称代词用于押韵而引入的（“我”为歌部）。王力说“如果说毫无分别得两个人称代词在一种语言中（口语中）同时存在，并且经常同时出现，那是不能想象的”。观察王力列出的第一人称代词使用状况表，“吾”被大规模使用后“卬”便销声匿迹。尽管证明“吾”是“卬”得出的产物的证据并不充分，“吾”最终以各种方式取代了“卬”却是比较可靠的。洪波认为“吾”“卬”是周语与殷语的融合过程由周语进入汉语的。[8] “吾”是为了语言表达目的而引入的专门化的“我”，这与训诂得出的结论是一致的。\n“吾丧我”新论 由以上我们可以知道，“吾”是为了言说而特化的“我”，那么“吾”的层次（或者说内容含量），就一定低于“我”，“吾”并非高于“我”的存在，这与绝大多数研究的结论并不一致。“吾”是外在的、被社会构建的言说的自我，而“我”是更本真的自我。“吾丧我”或许需要解释“对于自己在俗世中展现出来的外表，已经丧失了真正的自己”。李泽厚认为，庄子对于一切技术、一切文明的态度是回到“当是时也”，“山无蹊隧，泽无舟梁……同与禽兽居，族与万物并……”，他要求否定一切文明与文化，回到无目的、无意识的状态[9]。一切人为，一切人的有意识有目的活动、认识、思虑、打算，都是对“道”的损伤。中国人民大学历史学院王尔老师在2024秋季学期《中国古代思想史》课程上这样介绍庄子:“生活的意义，不在于它想成为什么，而在它想摆脱什么。庄子要舍弃的不是许多东西，而是所有东西。”如果是内在（或高层次）的“吾”抛弃了外在（或低层次）的“我”，自我产生的想法不再适应不得不展现出的外表，这是不够彻底的，因为这是进步，但庄子的理想境地是彻头彻尾的倒退，所以这算不上抛弃了一切。况且如前所言，如果追求抛弃低层次的“我”，那就根本无法达到“丧我”的境界。齐物论作为“庄之所以为庄者”（冯友兰语），“吾丧我”如果解释为，展现在俗世的外表的“吾”已经不能体现内心的“我”产生的想法，或许更加合理，这样的生存论才契合庄子化有为无的本体论，才是庄子想要的真正的抛弃一切。\n[1] （宋）林希逸，《钦定四库全书》本《庄子口义》卷一，内篇齐物论第二，可透过“中国哲学书电子化计划”网站查询：https://ctext.org/library.pl?if=gb\u0026amp;file=1932\u0026amp;page=46\u0026amp;remap=gb\n[2] 朱玉婷.互文性视域下庄子“吾丧我”阐释——以《庄子》内篇为核心[J].管子学刊,2024,(01):19-30.DOI:10.19321/j.cnki.gzxk.issn1002-3828.2024.01.02.\n[3] （东汉）许慎，《说文解字》卷三口部，可透过“中国哲学书电子化计划”网站查询：https://ctext.org/dictionary.pl?if=gb\u0026amp;id=27020\u0026amp;remap=gb\n[4] 汤可敬《说文解字今释》，上海古籍出版社，2018\n[5] 林凯,苏煜文.“吾丧我”义辨[J].老子学刊,2024,(01):139-155.\n[6] 高本汉《原始中国语为变化语说》\n[7] 陈超.先秦汉语第一人称代词研究综述[D].东北师范大学,2014.\n[8] 陈超引. 洪波.周秦汉语第一人称代词“吾”“卬”的来源及其与“余（予）”“我”“朕”的功能分别[C].见：汉语历史语法研究.北京：商务印书馆.2010.20.\n[9] 李泽厚《中国古代思想史论》，《庄禅玄宗漫述》\n","date":"2025-05-09T22:05:28+08:00","permalink":"https://xzhongjie.github.io/p/%E5%90%BE%E4%B8%A7%E6%88%91%E6%BC%AB%E8%B0%88/","title":"“吾丧我”漫谈"},{"content":"本文系阅读李泽厚《中国古代思想史论》中《孔子再评价》过程中所作的笔记，写的很草，几乎没有什么参考价值，只是作为一个回顾的材料。我更推荐读者去阅读李泽厚的原文。\n春秋战国是保存着氏族社会传统的早期宗法制向发达的地域国家制的过渡，认为孔子思想是这一空前时代变革中某些氏族贵族社会性格的表现。但由孔子创始的这个文化——心理结构，因其有相对独立的稳定性质而长久延续和发展下来。\n“礼”的特征 周礼的一个基本特征：原始巫术礼仪基础上的晚期氏族统治体系的规范化和系统化。\n殷周体制与氏族血缘深刻耦合，上层建筑和意识形态直接从原始文化延续而来。一方面有明确而严格的秩序规定，另一方面保存了原始的民主性和人民性（元老会议）。孔子维护这种旧的统治体系，他强调自己“述而不作”，实际上强调这种制度古已有之，自己只是维护周公。\n礼的起源和核心是尊敬和祭祀祖先。血缘父家长制（亲亲）的等级制度为基础，分封、世袭、井田、宗法等政治经济体制为延展。\n然而孔子的时代已经开始礼崩乐坏，压迫剥削和战争主张在经济上自然是先进的，法家是以占了上风，但这一过程中原始民主和人道的成分被抛弃，“礼”已经事实上成为了与“仪”一样的存在。在一个以道德沦丧为代价而进步的社会中，有人为回到从前而呼喊是自然的，我们不能苛求他什么。\n“仁”的结构 血缘基础 孝悌既是血缘、又是等级。孔子强调恢复氏族的生存权利，维护氏族——部落——部落联盟的体系，也就是大夫——诸侯——天子的体系。\n心理原则* 礼自外作。起初礼仪不分（巫），“仪”只是“礼”的具体表现形式，内核在“礼”。孔子把礼制归结为亲子之爱的生活情理，把“礼”、“仪”从外在的规范约束解说成人心的内在要求，把一种宗教性神秘性的东西变而为人情日用之常，从而使伦理规范与心理欲求融为一体。由于这种日常性，儒学不需要构建原罪、不需要提倡禁欲、不需要倡导出世，不需要成为宗教但能发挥宗教作用。\n人道主义 古代宗法氏族内部民主制的遗风残迹，在孔子时必然不是伪善，尽管可以被后世利用为伪善的存在。\n个体人格 孔子首倡“为仁由己”的主体精神，将道德自觉从外在规范转化为内在追求，突出个体人格的主动性。君子代替了宗教圣徒。\n实践（用）理性 不在理论上去探讨难以解决的哲学命题，只追求解决现实生活中的问题。“敬鬼神而远之。”\n弱点和长处 略。\n附论孟子 孟子通过“四端说”（恻隐、羞恶、辞让、是非）为道德找到先验根基，使儒学获得形而上学的维度。中国伦理学特点：一方面强调道德的先验普遍性、绝对性，另方面又强调此先验、普遍、绝对即在经验的感性、心理之中。\n“仁政”思想将孔子的伦理主张系统化为政治蓝图：制民之产、民贵君轻。\n养气：性凝聚为意志，使感性行动成为一种由理性支配的力量。\n","date":"2025-04-30T15:05:28+08:00","permalink":"https://xzhongjie.github.io/p/%E5%AD%94%E5%AD%90%E5%86%8D%E8%AF%84%E4%BB%B7%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/","title":"《孔子再评价》读书笔记"},{"content":"\n","date":"2025-04-18T22:05:28+08:00","image":"https://xzhongjie.github.io/p/%E4%B8%80%E4%BA%9B%E6%98%A5%E5%A4%A9/1_hu_c354ec04a83e2f8f.jpg","permalink":"https://xzhongjie.github.io/p/%E4%B8%80%E4%BA%9B%E6%98%A5%E5%A4%A9/","title":"一些春天"},{"content":"主讲人：中国人民大学哲学院 曹峰 写在前面 本文系对中国人民大学哲学院曹峰教授专题讲座《清华简\u0026lt;五纪\u0026gt;与\u0026lt;尚书·洪范\u0026gt;类文献》的内容整理。曹峰教授通过系统分析《五纪》与《洪范》在文本形式与思想内核上的关联性，揭示了二者的深层联系，为《洪范》学研究提供了创新性视角。在此谨向曹峰教授的精彩演讲致以谢忱。\n为明确文本性质与使用规范，特作如下说明：\n内容来源：本整理稿依据讲座现场记录完成，受记录者记忆局限及信息筛选影响，可能存在内容疏漏或表述偏差。 学术立场：文中包含整理者个人的理解延伸与学术推论，相关观点仅代表整理者学术思考，非主讲人原意。 文本效力：本稿未经主讲人审阅确认，不具学术引用效力，建议研究者通过正式学术出版物获取原始研究成果。 责任声明：文本内容如存在表述争议或事实出入，责任由整理者承担，与主讲人及主办机构无关。 版权须知：讲座所涉学术成果、研究材料及理论观点的完整知识产权归主讲人及相关权利人所有；如认为本文存在知识产权争议，请及时联系删除；本整理稿仅限个人学习研究使用，禁止一切商业用途的复制、改编及传播。 参考 《洪范》全文：中国哲学书电子化计划，https://ctext.org/shang-shu/great-plan/zh\n《五纪》全文：清华藏战国竹简数据库，第11辑，https://qhj.cihai.com.cn/；知乎整理，https://zhuanlan.zhihu.com/p/694995162\n关于《洪范》 何谓《洪范》类文献？ 至少在语言、概念、文体、结构等文本特征与《洪范》有紧密关系\n意境、高度上接近《洪范》\n总之，是有意识对《洪范》的模仿，在思想和文本上可以上溯到《洪范》\n《洪范》简介 属于今文《尚书》中的《周书》，或归于《商书》\n相传为大禹所得《洛书》（附会可能性较大）\n是商遗臣箕子向周武王陈述的“天地之大法”，言禹治水有功，上帝赐予其“洪范九畴”\n《尚书》最具有政治哲学色彩的一篇，宋以前侧重研究五行，到理学更侧重研究皇极\n成书时间：西周初期商遗臣箕子、春秋（该观点较多）、战国诸子、两汉儒家\n《洪范》学演变轨迹 先秦只能看到对《洪范》的引用\n两汉《洪范》五行说受到重视\n王安石《洪范传》以五行为“天所以命万物者也”\n南宋以后，发扬“皇极”、“大中”之学，认为里面包括中道和民本思想\n先秦对《洪范》的引用 《左传·文公五年》：「《商书》曰，沈渐刚克，高明柔克。」\n《左传·成公六年》：「《商书》曰，三人占，从二人。」\n《左传·成公六年》：「《商书》曰，无偏无党，王道荡荡。」\n《荀子》：《书》曰：「无有作好，遵王之道。无有作恶，遵王之路。」（《修身》《天论》）\n《吕氏春秋·贵公》：故《鸿范》曰：「无偏无党，王道荡荡；无偏无颇，遵王之义；无或作好，遵王之道；无或作恶，遵王之路」。\n《吕氏春秋·君守》：《鸿范》曰：「惟天阴骘下民。」\n《史记》无引用，有提及：「武王已克殷，后二年，问箕子殷所以亡。箕子不忍言殷恶，以存亡国宜告。武王亦丑，故问以天道。」（《殷本纪》）\n《汉书》《后汉书》《汉纪》及《论衡》等汉人作品引用甚多，内容也以天人关系居多。\n孔子的评价 《孔丛子·论书》：https://ctext.org/kongcongzi/lun-shu/zhs\n《洪范》可以观度。\n吾于《洪范》见君子之不忍言人之恶而质人之美也。发乎中而见乎外以成文者，其唯《洪范》乎？\n其他评价 《淮南子·修务》：诵《诗》、《书》者期于通道略物，而不期于《洪范》、《商颂》→作者认为《洪范》高深莫测？\n《风俗通义》：《洪范》陈五事，以貌为首。\n其他出土文献对洪范的引用 清华简《管仲》：君当岁，大夫当月，师尹当日。\n《洪范》与其他文本的匹配关系 李学勤认为《洪范》《中庸》及帛书《五行》有匹配关系（《帛书〈五行〉与〈尚书·洪范〉》，载《简帛佚籍与学术史》）\n五行元素 《洪范》 《中庸》 《五行》 土 思曰睿，客作圣 聪明睿知，足以有临也 圣 金 听曰聪，聪作谋 宽裕温柔，足以有容也 仁 火 言曰从，从作义 发强刚毅，足以有执也 义 水 貌曰恭，恭作肃 齐庄中正，足以有敬也 礼 木 视曰明，明作哲 文理密察，足以有别也 智 结论 就有限的材料而言，先秦时期引用《洪范》，阐发《洪范》思想的材料并不多。没有像两汉、南宋之后那样形成高潮。\n比较多的引用是“三德”畴和“皇极”畴。其他还有“五事”畴、“庶征”畴、“稽疑”畴，如果把五行起源推溯至此则还包括“五行”畴。\n未被直接引用的是“八政”、“五纪”、“五福”。\n是否证明《洪范》在先秦并没有太受重视？过去可能会有这样的结论，而《五纪》出来后，可能要重新考虑。\n《五纪》是一部关于度数、天道、天人关系（感应）的书，一部具有神秘性的书。孔子从中观“度”，“度”应该就是度数。\n《史记》认为传授的是“天道”。\n《淮南子》应该将其视为高深的东西。\n清华简《五纪》 概况 《五纪》共130根简，全文据推测在五千字以上，在战国中期成文。\n《五纪》用**“后曰”的口吻来叙事，讲述了后帝、黄帝等上古圣王的事迹**，气度不凡。里面天地鬼人无所不及，按照今天的学科分类，天文、历法、地理、物产、祭祀、政治、军事、制度、伦理无所不在，宇宙观、历史观、鬼神观、天下观、道德观全部囊括，所以无论从架构的完整还是从气魄的恢弘来看，都称得上是那个时代的顶层设计、宏大叙事。\n《五纪》问世之后，我们发现，在语言、概念、结构、意识等方面，可以从很多出土文献和传世文献找到与之相关之处，如《尚书》《逸周书》《春秋繁露》以及马王堆帛书《黄帝四经》等。\n关于与《尚书》之间的关系，整理者做过如下的说明：“《五纪》在篇章结构、内容观念、文句语词等方面与《尚书》某些篇章有相似之处，可以认为具有相同或相近的文献与思想渊源。”\n最为接近的是《洪范》，其他书都是局部相似，在广度和深度上没有《洪范》那么显著和强烈。\n这应该不是偶然的。《五纪》应当是是《洪范》发展的产物。\n**尚无人提出《五纪》为《洪范》类文献。**此为主讲人新解。\n从九个方面来论述《五纪》为《洪范》类文献 一、语言、用词的相似 “五纪”、物候、卜筮决疑，在语言和思维逻辑上具有相似性。\n“五纪”：一曰歲，二曰月，三曰日，四曰星辰，五曰歷數。/后曰：日、月、星、辰、歲，唯天五紀。\n物候：庶徵：曰雨，曰暘，曰燠，曰寒，曰風。/一風，二雨，三寒，四暑，五大音，天下之時。\n卜筮决疑：稽疑：擇建立卜筮人，乃命十筮。/后曰：天爲筮，神爲龜，明神相貳，人事以謀。\n二、韵文的相似 整理者的释文以及马楠都指出**《五纪》多用韵文**，以之部、职部、鱼部、歌部、阳部韵为主。\n《洪范》用韵则近似。\n朱岩更进一步指出，《五纪》和《洪范》都具有**“韵散相间”**的特征，两者“协韵四言句式,大多用以表达法则或规律，字数不固定的散句则起叙事作用和衔接语篇的作用。”\n三、结构的相似：洪水、治乱与天道 《洪范》和《五纪》都以一种替天行道的庄重口吻，述说了宇宙间根本法则的重要性.\n《洪范》假借箕子之口，向周武王叙述了“彝伦”的重要性，“彝伦”就是洪范九畴，为天帝所赐，就可以授予也可以收回。鲧本来拥有“彝伦”，但因为他作乱，堵塞洪水，破坏了作为宇宙间根本秩序的五行，所以引帝震怒，收回了“彝伦”，接着又重新授给了禹。\n围绕上古洪水的文献记载，主讲人有不同以往的解读，认为洪水不是单纯的自然现象，而是叛乱者造成的。\n主讲人《洪水与戡乱》：历史上是否有大洪水，是否有大禹治水，鲧是否因治水失败而死都并不重要。**古人只需要引出“治乱历史”。**乱也未必是洪水，也可以是其他现象（比如《尚书·吕刑》中的蚩尤作乱）。\n主讲人在讲座答疑时进一步提出了历史的戏剧化传播的概念：一正一反的简单叙述才能把古史传递下来。鲧在历史上是反面形象，是作乱者。鲧因为治水失败就被处死是缺少合理性的。所以鲧很可能并非如传世文献所言那样，但古人只需要引出“治乱历史”，不在乎实际。\n详参曹峰:《洪水与戡乱：清华简《五纪》中的两个重要元素》，《江淮论坛》2023年第6期。\n《五纪》以“后曰”口吻行文，先提引出“唯昔方有洪”，以天下大乱、洪水泛滥作为引子，引出天下大法的重要性。反映一治一乱的历史观，天人感应的天命观。\n《五纪》源源不断阐述宇宙秩序的设想，构建庞大严整的天人体系，但进入正式叙述部分以后，洪水的元素不再出现，因为洪水的治理并非最终的目标。\n清华简《三不韦》与《五纪》关系极为密切。\n《五纪》虽然没有从天到人、从上到下的程序（但清华简《三不韦》、《两中》有），但设计了“治乱历史”，在这个过程中具有神性的人物登场，确立天地间的根本法则。（假托圣王以提升可信度）\n历史观体现为两个方面：一是解释万物从何而来，二是解释世界的秩序形成。《洪范》、《五纪》为第二个方面，即治乱历史观的典型。\n四、用“数”的类似 《洪范》的基本框架是“九畴”，各畴又有不同的数字加以概括，虽也使用其他数字，如“三”、“六”、“八”等，但使用最多的是“五”，如“五行”、“五事”、“五纪”、“五福”。\n《五纪》也同样使用大量的数字，用于描述和规范天文、历法、鬼神、道德等宇宙间一切存在。\n《五纪》对数字“五”做了更为强化的处理。“五”的元素在《五纪》中无所不在，将天地间所有的事物，如天文、神祇、道德祭祀、人体、名号、职官全部组合在一起，描画出一个数字化、格式化的世界图景。\n清華大學出土文獻研究與保護中心編，黄德寬主編：《清華大學藏戰國竹簡（拾壹）·五紀》，中西書局，2021年11月1日，第1版，第93頁的一张表对这种“五”的对应进行了整理。\n《五纪》中虽然出现“五行”，但似乎并不是重要的概念，也不清楚这一“五行”是不是《洪范》中提到的“水、火、木、金、土”。\n仅次于“五”的是“四”，但实际上“五”就是“四加一”，四方加一中。\n如朱岩等学者指出的那样，大量使用数字是**“以数为纪”的一种表现。数字不仅可以使得叙述井井有条，也使得天地秩序被梳理地井井有条。《洪范》开创了“以数为纪”的先声。**\n《五纪》也是这样。《五纪》通过“五”等数字，使天地万物形成了一个互动的有机的整体，可见《五纪》将“以数为纪”的思维模式推向了一个高峰，对于中国古代数度、数理、数术思想的发展有着重要推动。\n《洪范》可以观度：两文都致力于传述或制定天下大法，而“数”的大量使用正是为了建立有法规意义和效果的“度”。两者具有相同的气质。\n五、可能的相关性：三德 《洪范》三德：三德：一曰正直，二曰剛克，三曰柔克。平康，正直；彊弗友，剛克；燮友，柔克。沈潛，剛克；高明，柔克。\n《五纪》三德：文德、惠德和武德。\n两文都有所谓三德，两者似无关系。但实际上**《五纪》可能就是在《洪范》影响下形成了新的“三德”表述**。《五纪》的“三德”从结构上看，“文德”、“武德”一左一右，“惠德”居中，正类似《洪范》“正直”居中，而“刚柔”一正一反。\n六、《五纪》对于《洪范》的发挥：“五纪”与“岁” 一种观点（石小力）认为，《洪范》的“五纪”，本来就应该是“日、月、星、辰、岁”。\n颜师古在注《汉书·律历志》时曾引孟康《汉书音义》：“岁月日星辰，是谓五纪也。”可见“岁、日、月、星、辰都属于历法范畴，而不应该包括“历数”。\n本来“星”和“辰”是两个项目，因为古代“星辰”多连言，后人就又造出了一个“历数来凑成“五纪”。这样说来**《五纪》的出现，纠正了长期来一直没有发现的今本《洪范》的错讹**。\n另一种观点（朱岩）认为，“岁、月、日、星辰、历数”是合理的。《五纪》的“日、月、星、辰、岁”正好证明了其成书年代要晚于《洪范》。\n《五纪》在文章的开头部分有这样一段话：“后曰：日、月、星、辰、岁，唯天五纪。文后经德自此始文后乃伦历天纪，初载于日，曰繇古之纪，自一始，一亦一二亦二，三亦三，四亦四，五亦五。天下之数算，唯后之律。”\n朱岩注意到其中“古之纪”这个特殊的表达，指出这很可能就是《洪范》的“五纪”，他认为《洪范》成书不晚于春秋中晚期，早于《五纪》。\n主讲人观点：值得注意的是，如“后曰：日、月、星、辰、岁，唯天五纪”所示，《五纪》改变了《洪范》所见“五纪”的内容和顺序，去除了“历数”，而把“岁”置于最后的位置，显然这是更为合理的。\n因为**“岁”并不是一种计时的手段**，而是通过“日、月、星、辰”这些计时手段最后导出的结果。\n《五纪》以“五”为宇宙基本数理结构，《五纪》所描述的五种元素中，几乎无一例外最后一种都是最高的、统摄性的元素。所以**“岁”的性质不同于“日、月、星、辰”**才是合理的。\n《五纪》中“岁”的确立，是时序的设定，是头等重要的事情。\n《五纪》中还有很多地方谈到“成岁”的问题。比如下面这段。\n后曰：參律建神正向，仁爲四正：東冘、南冘、西冘、北冘，禮、愛成。左：南維、北維，東柱、東柱，義、忠成。右：南維、北維，西柱、西柱，成矩。\n建子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥，紀參成天之堵。陬、如、寎、余、皐、且、相、壯、玄、陽、辜、涂，十又二成歲。\n處五：日、月、星、辰、歲。\n按照主讲人分段，可以看出“成矩→成天之堵→成岁”的过程。\n即首先借助“四穴”、“四维”（二“南维”、二“北维”）和“四柱”（二“东柱”、二“西柱”）构建出一个字宙空间，这个空间是四方矩形的，所以**“成矩”**。\n而“子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥”十二辰和“陬、如、秉(寤)、余、皋、且、相、壮、玄、阳、辜、涂”十二月名（或月神）是通过空间位移体现的时间概念，因为形成一个完整的闭环，因此可以称为**“堵”**。\n在此基础上“成岁”，即一个完整的时序形成了。\n和《太一生水》纵向排列的字宙模式不同，《五纪》的字宙观更象是一个横向的结构图，但这幅图展开之后的最后归宿，却和《太一生水》同样，也是**“成岁”**。\n“處五：日、月、星、辰、歲。”可以说是通过“五”的树立，对某种关系做出再次确认，即宇宙秩序之确立与以“岁”为代表之时序形成之间有着必然的关联。\n时序确定下来，人间的政治、制度、道德、规范才有可能展开。\n说《五纪》的“五纪”直接传承自《洪范》，都是核心的概念，是没有问题的。只不过《五纪》做出了新的调整，而且将其置于更为突出的地位。\n在《洪范》中，“五纪”只是九畴中的第四畴，而《五纪》中的“文后”（应该指的是类似“文王”的上古伟大君王），“经德”从“伦历天纪”即排列正定“五纪”开始。“五纪”确立了，“天下之数算”也确立了。这样看来**《五纪》是大大提升了《洪范》九畴中的第四畴的地位和作用**。\n七、《五纪》对于《洪范》的发挥：“风”和“大音” 《从“风”到“大音”》，《中国社会科学报》2024年12月18日\n《五纪》：“一风，二雨，三寒，四暑，五大音，天下之时。”\n《洪范》：“曰雨曰旸，曰燠，曰寒，曰风，曰时。”\n“风雨”作为成对概念早已出现。这就和“雨、炀、燠、寒、风”中的“风”独立于其他四者之上构成矛盾。\n很有可能是因为考虑到这一点，《五纪》才做了调整与修改：将“风雨”并列，然后使用曾经是物候象征（春雷），但已经被世人视为**超越性存在的“大音”取代了“风”**的位置。\n八、《五纪》对于《洪范》的发挥：从“庶征”到“征验” 君王作为与天象有一一对应关系。《洪范》只关心五种行为、品格、气候、吉凶的简单匹配，但不描述内在因果。《五纪》则不然。\n这是从简单的关联性行为，发展到了复杂的关联性行为。\n《五纪》记载了七十二个天体与神袛，并描述了与人的七十二个器官的对应关系。→这可能意味着《五纪》原本有附带的图，但遗失。笔者认为这与古希腊德谟克利特所言的“Ο άνθρωπος κοσμος.”，即“人是一个小宇宙”惊人地一致。这是否体现了“轴心时代”的“超越意识”和“原人意识”在东西方同时出现，即人们开始思考人之所以为人？\n董仲舒很可能看到过类似《五纪》的文章，对于先秦以来的“人副天数”有过精辟总结，即人的身体是“天地之符，阴阳之副”，因此“身犹天也”，与之相参的是“数”，与之相连的是“命”。\n但董仲舒明确地将“人副天数”分为两类，一种是“可数”的，称为“副数”，一种是“不可数”的，称为“副类”。\n《五纪》说与人体相比附的是天体、鬼神和方位，并用数字贯穿起来，显然这是“副数”的方式。\n《五纪》似乎尚未讨论《人副天数》中提及的“无形者”、“不可数者”，因此其天人关系即便可以称为“人副天数”，也**尚未到“副类”的程度。**董仲舒可能不仅继承了这种思想，而且对其加以了发展。\n九、《五纪》对于《洪范》的发挥：“中”的观念 这一部分的笔记除讲座人所将外，还加入了讲座人**《清华简《五纪》的“中”观念研究》**一文的部分内容。\n《五纪》中大量出现“中”字，整理者有时将其释读为“中”，有时释读为“忠”，但读为“忠”是没有必要的。“中”代表着最高理念、最佳状态，是统一、圆融的标志，而这些都和法则意义上的公平、中正有关。“中”不一定就是“无偏无党、王道荡荡”的“中”。\n“中”的使用大约可以做如下三个方面的归类:\n代表最高理念的“中” 作为具体德目的“中” 作为一种行为方式的“中 《洪范》没有提“中”，但皇极实际上就是大中（孔安国、孔颖达如此解释，如果这一解释不是空穴来风，“皇极”的概念就是“中”的源头之一）。\n“中”崇高的价值和地位，与《五纪》非常明确的中央意识以及潜藏的大一统意识高度吻合。\n“五纪”看似是《五纪》最重要的概念，但实际上是一种工具和途径。核心理念是“中”和“德”。最有秩序的时代是“有德”的时代。“德”是君主之德，是德政，是政治行为方式，是作用和行为的体现。\n原本只有“文德”，《五纪》提出三德。“德”可以是德行、德政、民德、君德，但都可以体现为作用、功能，是一种秩序规范，和内在的德性关系不大。\n总述 表面上：两者在语言、概念、文体、结构等文本特征上的相似\n深层上：从天道到人道的思维方式，为圣王立言、为宇宙立法的神圣意识，为天地人鬼建立根本秩序的宏大叙事，从超时空、大一统的意识出发，试图对万物作出整齐化的、格式化的安置\n《五纪》发展和推进了什么? 以“数”为框架的字宙观，并聚焦于“五”使“四+一”五行模式得到强化。 格式化、几何化的字宙图景，较之《洪范》更为复杂、宏大。 对于“中”的强化 对于“德”的强化，把民德和君德分开 对于“鬼”之作用和地位的强化 不变的是以人配天、君权神授、宏大叙事、神秘意识、中央意识、大一统意识。属于天人之学。\n《五纪》是为上层服务的文本，描述宇宙图景、呈现宏大叙事，讨论“何以成人？何以成邦？何以成地？何以成天？”也就是“构成人类、国家以及天地最为根本的要素是什么”这种宏大的、根本的问题，往往不为普通民众所见，我们在传世文献较少看到。尚书中《洪范》能保留是因为有皇极概念，有一定适合用于教化的内容，在孔子删书的过程中幸存。董仲舒或许不仅不是破坏，反而忠实继承了先秦时代更有高度的、为君主所称道的体系。\n《五纪》是一种典型的天人关系论，即在人类社会与宇宙整体之间建立类比，把天人二者看作是相互匹配相互协调的整体。这种天人关系论有着非常明确的思维框架，即从天道到人道，人道从属于天道，人道必须符合天道，这属于典型的“以人配天”。\n这样做的目的，是为了建立起一个全新的宇宙秩序从而使天地神人各就其位，使天下得到良好的治理。从《五纪》的叙述顺序来看，首先是“伦历五纪”，即正定“日、月、星、辰、岁”这一最为根本的天文秩序用“五”作为确定天下万物之基本框架，然后是正定天体的位置、星宿的数量以及相应的神祇系统、祭祀系统。与此同时，人间的道德、职官等系统才能建立起来。\n这种文章展现出诸子书中很少见到的雄心壮志，站在超越有限时空的高度，超凡的气魄，以天地代言人的口吻，八六合之中、天地人鬼、宇宙万物全部网罗到一个体系内，是从最高远、最宏大视角，对世界作出整体考量的王官之学。他是否一直存在和延续？我们猜测战国不仅只有诸子之学，也有宏大叙事的、服务于具有野心的诸侯王的王官之学。即便在诸子之学兴起之后，也有人研究这种宇宙之学。\n邹衍也研究王官之学，同时是阴阳家，但他研究王官之学、宇宙图景这类问题却并非因为他是阴阳家，属于特殊性而非阴阳家的共性。我们不能简单地说王官之学是诸子学中阴阳家的一个分支。\n董仲舒可能是对王官之学的继承。\n","date":"2025-04-14T22:05:28+08:00","image":"https://xzhongjie.github.io/p/%E6%B8%85%E5%8D%8E%E7%AE%80%E4%BA%94%E7%BA%AA%E4%B8%8E%E5%B0%9A%E4%B9%A6%E6%B4%AA%E8%8C%83%E7%B1%BB%E6%96%87%E7%8C%AE/cover_hu_226e73a2243eca32.png","permalink":"https://xzhongjie.github.io/p/%E6%B8%85%E5%8D%8E%E7%AE%80%E4%BA%94%E7%BA%AA%E4%B8%8E%E5%B0%9A%E4%B9%A6%E6%B4%AA%E8%8C%83%E7%B1%BB%E6%96%87%E7%8C%AE/","title":"清华简《五纪》与《尚书·洪范》类文献"},{"content":"中国古代思想文化史笔记 写在前面 本文系对中国人民大学历史学院王尔老师在2024-2025秋季学期《中国古代思想文化史》课上所做笔记的整理。王尔老师的授课既具有广度又富有深度，给予我很大启发。在此向王尔老师致以谢忱。\n为明确文本性质与使用规范，特作如下说明：\n内容来源：本整理稿依据课堂内容记录完成，受记录者记忆局限及信息筛选影响，可能存在内容疏漏或表述偏差。 学术立场：文中包含整理者个人的理解延伸与学术推论，相关观点仅代表整理者学术思考，非授课教师原意。 文本效力：本稿未经授课教师审阅确认，不具学术引用效力。 责任声明：文本内容如存在表述争议或事实出入，责任由整理者承担，与授课教师无关。 版权须知：课程所涉学术成果、研究材料及理论观点的完整知识产权归授课教师及相关权利人所有；如认为本文存在知识产权争议，请及时联系删除；本整理稿仅限个人学习研究使用，禁止一切商业用途的复制、改编及传播。 导论 什么是“思想史”中的思想？\n意识活动已经有了某种非实用性、超越了实际生活、生产等具体意味时，具有一定的纯粹性，这种意识活动才称之为思想。具有三个特征：\n成为共识，具有普遍性 秩序化和体系化 通过文字记录和论证 雷德菲尔德（Robert Redfield）提出了“大传统”（great tradition）和“小传统”（little tradition）的两个不同层次的文化传统：\n大传统：社会精英及其所掌握的文字所记载的文化传统，体现了社会上层生活和知识阶层代表的文化，多是由思想家、宗教领袖经过深入思考所产生的精英文化或高雅文化。 小传统：乡村社区俗民和乡民生活代表的文化传统，一般社会大众的下层文化。 两者是互动的，并不完全割裂。复杂文明的精神气质，主要是由其大传统所决定的。\n大小传统的分离意味着思想的起源，其标志主要包括：\n国家权力和统治阶层的形成 权力管理及神职人员的专职化 文字形成，用文字记述历史和思想的专职人士分离出来 思想史的研究方法与中国思想史的特质：\n注意思想的语境（文本语境和历史语境）。思想家所处时代的大语境和思想家著述的小语境，以及思想家与时代互动呈现在著作中的整全语境。\n注意思想者的言说目的、对话对象和思想的行动力。\n中国思想言说的“随事而变”（varying with changing contexts）。中国思想词语往往将抽象的思想依附在直接的经验上来解释，概念随语境变化。\n例如：“精”可以指精气，也可以指精魄和鬼神。\n中国思想的特质是“关注秩序”，也就是事物的位置、关系、命名、价值。西方思想往往关注于存在的问题。\n第一章 巫祝卜史的传统与中国思想的起源 第一节：巫觋、祭祀到礼乐：早期中国的原始信仰与“巫祝卜史”的知识阶层 红山、良渚古国消亡了，他们都重视祭祀。\n辽宁朝阳的红山文化：“坛（祭坛）、庙（女神庙）、冢（基石冢）”\n浙江余杭良渚文化：玉琮\n用玉器的古国普遍对神秘力量又崇拜。（靈，巫也，以玉示神）\n而仰韶、龙山玉器出土较少，不重视祭祀。仰韶文化最终不断发展，成为中华文明史的主干。神权高于—切，应该是红山和良渚最终均走向消亡的根本原因。\n参考：李伯谦.中国古代文明演进的两种模式——红山、良渚、仰韶大墓随葬玉器观察随想[J].文物,2009,(03):47-56.\n上古的巫觋文化及其思维模式 巫术是企图借助超自然的神秘力量对某些人、事物施加影响或给予控制的方术。（这也是其与宗教的差异所在）\n马林诺夫斯基在《巫术、科学、宗教与神话》中认为巫术是“古已有之”的存在，我们并不能找到他的起源。巫术使人能够进行重要的事功而有自信力，能使人的乐观仪式化。\n上古人类认为自然万物遵循规律。有神秘力量可以被人们掌握，进而采取积极的方式（法术）或消极的方式（禁忌）来运用或躲避。弗雷泽在《金枝》里提出，这种规则一般是依靠联想而发生效力的，具体有以下两种：\n相似律：样貌、形状或性质相类似的事物，必将产生因果联系（相似性联想） 接触律：原本连成一体的事物，即使分开也会继续产生相互作用，不受距离影响（占有性联想） 这种联想构成了巫术的基本原则，是思维的产物，是对心灵感应的信仰。\n巫术是为了寻找世界的确定性和秩序性，是为了追求与外在世界一致的思想的秩序，及理解外在世界秩序的整齐的思想。巫术实施者是最早的知识精英群体，当这种思维与话语的权力从大众转向少量精英时，思想史就开始了。一些最能干的人垄断了对世界现象与神秘力量的解释，并把它们转化为一种秘密的知识和技术，而这些知识和技术是可以普遍适用的。这种权力进一步集中形成了思想的权威。\n巫觋与宗教在思维方式上的区别 巫觋不必定需要有鬼神的存在，只关心如何操纵超自然的神秘力量。即使面对神灵，巫觋也像对待无生命物完全一样，强迫或压制他们。而宗教是去取悦和讨好他们。因此，人或神都从属于非人的力量，懂得仪式和咒术就能操纵和利用这种力量。\n因此巫师与祭司有不同的职能。在远古时代存在一个“人人为巫”的阶段。\n远古的巫觋时代：“绝地天通” 《国语·楚语》：\n昭王问于观射父，曰：“《周书》所谓重、黎使天地不通者，何也若无然，民将能登天乎？”\n对曰：“非此之谓也。古者民神不杂。民之精爽不携贰者，而又能齐肃衷正，其智能上下比义，其圣能光远宣朗，其明能光照之，其聪能月彻之，如是则明神降之，在男曰觋，在女曰巫。是使制神之处位次主，而为之牲器时服，而后使先圣之后之有光烈，而能知山川之号、高祖之主、宗庙之事、昭穆之世、齐敬之勤、礼节之宜、威仪之则、容貌之崇、忠信之质、禋洁之服，而敬恭明神者，以为之祝。使名姓之后，能知四时之生、犠牲之物、玉帛之类、采服之仪、彝器之量、次主之度、屏摄之位、坛场之所、上下之神、氏姓之出，而心率旧典者为之宗。\n阶段一：民神异业（不一定真正存在）。\n阶段二：民神同位（家为巫史）。及少皞之衰也，九黎乱德，民神杂糅，不可方物。\n阶段三：绝地天通（各司其职）。颛顼受之，乃命南正重司天以属神，命火正黎司地以属民。\n绝地天通意味着巫祝卜史阶层独立出来，分化成为影响统治者的高层，发展出祭祀与占卜为核心的共同体意识，祭祀时代拉开序幕。\n先秦文献中的巫、祝、卜、史 略。\n祭祀时代：殷商甲骨卜辞所见思想史 占卜的流程及商人的命运观念 人类学家普遍认为，人创造出鬼神观念，相信鬼神的存在和作用，是为了解释世间无法以常理解释的现象。如果人不能了解人赖以生存的这个世界，就无法去对付它，人就失去了生存的信心，处于恐惧和不安，就会出现“意义的危机”。\n占卜的流程 商代的祭祀和占卜文化属于人类学上的“礼物贿赂论”（gift as bribe），商人认为人通过正确适当的祭祀可以引来神祇的报答。这建立在商人“命运可知亦可改”的命运观上。\n商王占卜时主要人物有需要占卜的商王，贞人和卜人。商人的占卜分为对已然事物和未然事物的占卜：\n对已然事物：祸患是否由鬼神引起？由哪个鬼神引起的？列出一个怀疑名单逐一进行贞问，直到兆象给予肯定的答案。之后商人对其举行专门的祭祀，满足其厌。 对未然事物：下一旬中有无祸患？若吉，行动，如祭祀某祖先或征伐某方国；若不吉，取消活动。 商人“可知而不可改”的命运观念 商人占卜表现出命运可预知、可改变的观念。\n中国古代的命运观大致可分为道德命定论和道德无涉论（命运可知可改、命运可知不可改、命运不可知不可改）：\n道德命定论：周人的道德天命论。 道德无涉论： 命运可知可改：商人的礼物贿赂论。 命运可知不可改：两汉，周易和阴阳五行的联系宇宙观。 命运不可知不可改：春秋以后，道德天命论失效。如《荀子·宥坐》、郭店楚简《穷达以时》。 卜辞所见商人思想中万物的秩序化 商人心目中神秘力量的秩序化、清晰化。商人把神秘力量神格化，组成了一个有秩序的神的谱系：“帝”,“东母、西母”（日神、月神）,四方之神,山川之神。这是万物有灵的泛神论。 崇拜祖先之灵，形成初步伦理化的思想。已经将祖先的亲属关系分成亲疏远近，形成了王室结构，区分自我与他者。 知识系统的分类和秩序化。商人建立了一些只属于意识世界的分类和联系观念，神灵被划分出等级并配对。 贞人代表的“巫史卜祝”阶层之知识系统 以龟策预言吉凶的知识。从《周易》到《左转》不断发展。 对天文历法、地理农业、神灵万物的认知及处置方式。思想倾向：宇宙是有机的整体，万物彼此联系。宇宙生成是整体的、连续的、动势的。 对祭祀仪轨的知识。 参考书目 弗雷泽James George Frazer：《金枝》，商务印书馆\n马林诺夫斯基：《巫术、科学、宗教与神话》，中国社会科学出版社\n徐旭生：《中国古史的传说时代》，商务印书馆\n陈宁：《中国古代命运观念的现代诠释》，辽宁教育出版社\n陈来：《古代宗教与伦理：儒家思想的根源》第1-4章，三联书店\n葛兆光：《中国思想史》第一册第1-5节，复旦大学出版社\n第二节：商周之变与礼乐文明 有学者认为，周征服商，是相对落后、边缘的文明征服了一个发达、中心的文明。\n周由此继承和吸收了商的文明成果，发展出自己的文化体系。（傅斯年《周东封与殷遗民》）\n《论语·为政》：“周因于殷礼，其损益可知也。”商周之际发生了关键的变化，商的祭祀文化转变为周的礼乐文化，奠定了中国思想文化的基调和气质。\n王国维《殷周制度论》：“中国政治与文化之变革，莫据于殷周之际。”\n修身成德之礼：个人秩序的建立 “礼”的起源很早，长期成为社会生活的习惯，而且常被用作维护社会秩序、巩固社会组织和加强部落之间联系的手段。\n进入阶级社会后，许多礼仪还被大家沿用着，其中部分礼仪往往被统治阶级所利用和改变，作为巩固统治阶级内部组织和统治人民的一种手段。\n由简入繁，由质入文：四代之礼的损益 有虞氏之两敦，夏后氏之四琏，殷之六瑚，周之八簋。\n俎,有虞氏以梡,夏后氏以嶡,殷以椇,周以房俎。\n夏后氏以楬豆, 殷玉豆,周献豆。\n古之葬也，厚衣之以薪，葬之中野。有虞氏造瓦棺，始不用薪。然虞式瓦棺，则未有椁也。夏后瓦棺之外加堲周，殷则梓棺以替瓦棺，又以木为椁，以替堲周。周人更于椁旁置柳、置翣扇，是后王之制以渐加文也。\n三礼中《仪礼》最能代表周代礼乐文化的实质内容，主要是属于“士”以上的贵族生活、交往、安身立命的规范形式，主要包括冠、婚、丧、祭、乡射、相见这六种礼仪。\n周礼围绕着人的生命过程而展开，具有人文主义的基础或取向，关注的是如何使“自然人”成长为周文化体系中的“文明人”，也就是划分君子、小人。国人与野人就是君子与小人最早的划分。\n礼、乐之别 乐需要以礼来节度，乐也能缓和礼的严苛和紧张。乐的思想，体现在“礼异乐同”（礼实现贵贱区分，乐实现上下相亲）和“礼外乐内”（礼使人得以他律，乐使人得以自律）。\n天命惟德：政治秩序的建立 天的神性的渐趋淡化，和“人”、“民”相对于“神”的地位的上升，是周代思想发展的方向。周人相信神把注意力全部关注于善和恶的问题上，从伦理的角度理解神和自然。\n《康诰》：慎罚、保民、天命不唯常的“敬”思想体系 把文王的明德慎罚与受天命联系了起来，强调保民是明德的表现。\n《康诰》提出了“惟命不于常”，这是周公的重要思想。上天的意志和命令是会改变的，体现出周人的忧患意识是小邦周战胜大邦殷以后，面对混乱局面的政治焦虑。这是周公理性天命观的体现，是商周世界观区别所在。\n《康诰》还强调“慎罚”思想，强调：\n判决过程要慎之又慎 杀与不杀的界限在于是否有悔过认错的态度 “行天之罚”的观念 《召诰》 周人用君权神授证明自己统治的正当性。而完整的君权神授的理论必须能够解释君权何以转移（为何从殷转移到周，如何防止未来由姬周转移向他姓）。\n天意决定于民情，民情决定于王之敬德与否。\n以周公为代表的西周思想可以概括为天命无常、天命惟德、天意在民三方面，以慎罚、保民为核心的“敬”思想体系。\n周人相信，天是有伦理理性的可知的存在，人不需要向天献媚，人必须集中在道德行为上，自己负责行为的后果，负责自己的命运。统治者必须知道天命体现为民众的欲求（西周政治文化向儒家思想）。周突破性地形成了人文理性主义精神。\n周、秦重视“文”，重视礼节和条文。而到了汉更重视“质”，重视道德。\n参考书目 李泽厚：《中国古代思想史论》，三联书店\n葛兆光：《中国思想史》第一册，复旦大学出版社\n陈来：《古代宗教与伦理：儒家思想的起源》，三联书店\n史华慈Benjamin l．Schwartz：《古代中国的思想世界》，程刚译，江苏人民出版社\n第二章 轴心时代：思想突破与百家争鸣 以下部分待整理。\n第一节：轴心时代：“超越意识”的突破 第二（1）节：儒的起源与孔子的思想：“仁”的结构和实践理性 第二（2）节：孟子的思想逻辑：仁政、四端、性善和大丈夫 第二（3）节：秩序情结与人为主义：荀子的思想体系 第三节：互利互信之共同体秩序：墨子的思想 第四（1）节：道与万物：老子世界观的构造 第四（2）节：道家秩序观的转变：从《老子》到黄老之学——以《黄帝四经》为中心 第四（3）节：权力的哲学：韩非子的思想体系 第四（4）节：“知”、无待而逍遥：庄子的齐物哲学 ","date":"2025-04-14T22:05:28+08:00","permalink":"https://xzhongjie.github.io/p/%E4%B8%AD%E5%9B%BD%E5%8F%A4%E4%BB%A3%E6%80%9D%E6%83%B3%E6%96%87%E5%8C%96%E5%8F%B2%E7%AC%94%E8%AE%B0/","title":"中国古代思想文化史笔记"},{"content":"主讲人：北京大学 吴国武 本文系对北京大学吴国武教授专题讲座《古籍整理及其意义的再认识》的内容整理。为明确文本性质与使用规范，特作如下说明：\n内容来源：本整理稿依据讲座现场记录完成，受记录者记忆局限及信息筛选影响，可能存在内容疏漏或表述偏差。 学术立场：文中包含整理者个人的理解延伸与学术推论，相关观点仅代表整理者学术思考，非主讲人原意。 文本效力：本稿未经主讲人审阅确认，不具学术引用效力，建议研究者通过正式学术出版物获取原始研究成果。 责任声明：文本内容如存在表述争议或事实出入，责任由整理者承担，与主讲人及主办机构无关。 版权须知：讲座所涉学术成果、研究材料及理论观点的完整知识产权归主讲人及相关权利人所有；如认为本文存在知识产权争议，请及时联系删除；本整理稿仅限个人学习研究使用，禁止一切商业用途的复制、改编及传播。 识典古籍：https://www.shidianguji.com/docs/editor/home?_lang=zh\n要点 何谓古籍？何以整理？\n回望现代古籍整理与新中国古籍事业\n重新审视古籍整理的意义\n思考古籍整理事业传承发展及我们的责任\n何谓古籍？何以整理？ 何谓古籍？ 古籍是大古籍概念，包括汉文和民文古文献（历史上中国境内各民族）。汉文、民文古籍（突厥、契丹、西夏/藏、蒙古）、汉文民文合璧本、亚洲（联系/一体化发展）各民族古文献、欧美等其他区域古文献 原文化部2006《古籍定级标准》：书写或者印刷于1912年以前具有中国古典装帧形式的书籍。 包容性的新认识：书写、印制于1912以前（不含）且具有中国古典装帧形式的文献（不用书籍一词，联合国教科文组织书籍定义：大于49页）以及其他记录知识信息的文献资料（知识信息，不含新石器时代）。（《古籍保护立法报告》，内部结项，2023）适当延伸到民国（民国汉文线装书）及新中国初期（民文）。 论语义疏：日本足立学校，与传世本有很大不同。\n永乐大典：公共图书馆和欧洲私人收藏家，保存了很大一部分。\n何以整理？ 整理是大整理概念：整理文明成果和文化遗产——古籍文献，包括其物质载体和思想内容。例如，狭义整理前的抢救、收藏、保护（首先着眼于物质载体，承袭文物保护概念而来）、修复，狭义整理之后的出版、利用、普及、传播，贯穿整理全过程的阅读研究和数字化、智能化。 古籍整理的学术和工作领域：【传统认识】黄永年《古籍整理概述》，对原有古籍作种种加工，以便今人和后人阅读利用；【新的认识】李明杰《简明古籍整理教程》，提供阅读和研究需要的内容文本、版式特征、语义思想、知识信息等服务总和。【一般认识】选择底本、影印、校勘、辑佚、标点、注释、今译、索引、序跋、附录；【新的认识】延伸领域。 古籍整理的工作方向：1981，整理古籍，把文化遗产继承下来；2022，加强抢救性保护、整理研究和出版利用（全过程），提供精神力量。 回望现代古籍整理与新中国古籍事业 古籍整理要立足现代 现代古籍整理研究，以20C前半叶**“国故运动”**中“国故整理（现代的学理、方法、眼光、标准）、再造文明”为代表。以敦煌遗书为例，广泛（民文汉文胡语、文本类型、中外学者、利用各学科方法、贯穿全过程、研究各专门之学）。\n古籍整理要扎根中国 新中国古籍整理事业，从古籍整理出版规划和古典文献专业（古典整理研究所）建立说起。中华传统史籍的系统性整理出版、儒家经典的系统性整理出版，赓续文脉。哪些？如何？→需要扎根中国。\n十三经注疏的现代整理研究为例：系统性整理的三个问题，不同类型经传注疏本应当分别整理或相对独立的文本（整理经注本时，只考虑王弼当时看见的文字，不考虑《周易》原本的文字如何），校异同和校是非（例如北监本在断句上存在问题，原属于上句的注断给了下句）应当并重，注意经传注疏各自的书例。三重使命，“开拓视野、细读文献”“创造理论、铸成方法”“传承价值、滋养文明”。\n重新审视古籍整理的意义 意义之一：建设现代文明 为中华文明现代建设提供源头活水，中国传统优秀文化三大载体：古籍、文物、非物质文化遗产\n国家图书馆藏《资治通鉴》手稿，残一页，修身齐家、治国理政\n以海外汉籍整理研究为例，置于中外文化交流、人类文明互鉴的整体视野下\n意义之二：建构自主知识体系 经史子集的传统古典学与先秦秦汉的现代古典学如何对接。中国古代知识体系是与周边互动中形成的，今天也要重视共同性。\n意义之三：培育文化新业态 不只给研究者，而给全人类。数字人文研究需要古籍。\n古委会数字化委托专项：海外汉籍流传可视化（杨海峰、袁晓如）\n北大图书馆藏珍本舆图数据库\n思考古籍整理事业传承发展及我们的责任 一体推进，探索新模式，创造新典范。\n提升质量，系统保护，深度整理，综合研究，有效利用，数智赋能。\n","date":"2025-04-10T22:05:28+08:00","image":"https://xzhongjie.github.io/p/%E5%8F%A4%E7%B1%8D%E6%95%B4%E7%90%86%E5%8F%8A%E5%85%B6%E6%84%8F%E4%B9%89%E7%9A%84%E5%86%8D%E8%AE%A4%E8%AF%86/cover_hu_badd3f28b6cf1098.png","permalink":"https://xzhongjie.github.io/p/%E5%8F%A4%E7%B1%8D%E6%95%B4%E7%90%86%E5%8F%8A%E5%85%B6%E6%84%8F%E4%B9%89%E7%9A%84%E5%86%8D%E8%AE%A4%E8%AF%86/","title":"古籍整理及其意义的再认识"},{"content":"序章 序言与准备工作 ”工欲善其事，必先利其器。“\n#0-0 序言 在完成《制作更高更妙的MC地形 WorldMachine基础教程》后，我们发现也是时候需要一部全新的适应当下WorldPainter版本的WP图文教程了，于是笔者决定编纂这部教程。本篇的内容在整个地形创作流程中最基础且最必备，学习本篇教程的内容只需要你有基本的计算机常识即可。\n序言仅需以上内容即可，剩余内容大抵都是些非必需的说教，同时我也懒得写了，如有兴趣可参考《制作更高更妙的MC地形 WorldMachine基础教程》这篇的序言部分。\n#0-1 软件的下载与安装 WorldPainter需要Java环境才能运行，且为保障WP所有功能正常，你至少需要安装11或更新版本的Java，WP官网提供Java17的下载，所以我也推荐你使用该版本的Java。**通常来说，如果你已能正常运行较新版本的Minecraft，上述条件便已经满足。**如你尚未安装Java，请在WP官网获取。如下载速度过慢也可以尝试在清华大学开源软件镜像站获取。\nWP的安装包可在官网下载，同时我们也在茶馆文件分享站提供分流（不保证版本最新）。可根据网络状况自行选择下载方式。下载完成后运行安装程序，只需根据流程安装。如您实在需要一个汉化版本来辅助学习，可以看看这个版本，请详细阅读文章说明后再下载。\n#0-2 常用参数的修改 \u0026amp; 自定义笔刷的安装 进入软件后软件会向你介绍常用功能和分区，稍作了解即可。随后需要你在左上角菜单栏选择Edit-Preferences-Default，将Maximum brush size（最大笔刷尺寸）根据你的计算机性能情况调大，建议值在1000以上（越大越方便，但大笔刷的性能要求也更高）。其余参数为创建地图和导出时的默认参数，根据自身情况修改，也可不改。\n笔刷建议使用茶馆笔刷包，需要注意的是，仅经过审核的茶馆内群成员可使用该笔刷包进行商业地形创作，其他要求详见笔刷包协议。如你有进行商业地形创作的需求且不在茶馆内群，请自行寻找合适的笔刷资源，在#0-3中有相应内容介绍。\n笔刷包安装方法：左上角菜单栏选择Tools-Open custom brushes folder，将下载到的笔刷包解压在此处。\n#0-3 获取常用地形资源的渠道 目前笔刷、树木模型等常用地形资源都可以在PlanetMinecraft搜索到。如果你连搜都懒得搜，文章末尾也为你整理了一些资源。\n国外的地形组织The Terraforming Guild主页整理好了这些资源，可以自行前往下载。\n茶馆亦有茶馆笔刷包和下午茶树包。\nWorldPainter的一个知名的非官方Discord群组内也有丰富的资源。\n访问以上网址可能需要一些特定的网络条件，并且使用这些资源前请务必自行查看其许可协议，不看协议产生的侵权责任需使用者自行承担。\n第一章 年轻人的第一个地形 这一章节将手把手教你如何在零基础的情况下完成你的第一个地形。\n#1-1 创建新的工程 根据图示创建一个新工程，将地形尺寸调整为1024x1024，其余不变。\n#1-2 绘制地形形体 选择左上角的抬升/降低工具，选择右侧的笔刷，按压鼠标左键，开始绘制地形。时刻注意左下角信息栏，尤其是留意Height（高度），可以有效避免地形顶破天花板。调整右侧笔刷硬度可以让你以更快速度抬升地形。\n快捷键Ctrl+3可以让你以三维视角预览你的地形（覆盖层将以图层的形式展示，意味着树林等不支持实时预览）。\n#1-3 进行地表上色 地面上的沙滩乱七八糟的。使用全局操作工具将草坪覆盖全图。\n选择抬升/降低工具，通过鼠标右键降低地形，绘制出一个湖泊。笔刷选择任意山脉即可（湖盆可以近似看作山脉倒扣过来）。\n换用喷枪工具，右侧笔刷栏选择实心圆形笔刷，正式开始进行地表上色。在左下角Terrain栏可以选择使用的方块，右下角笔刷设置将笔刷硬度拉满，坡度限制可选择Above 50 degrees（大于50度）刷岩石（Rock），Above 60 degrees（大于60度）刷青色（Cyan）陶瓦，数值可根据个人喜好调整。\n坡度较低处可以尝试刷些苔藓。\n将笔刷调小，在右侧笔刷设置将高度限制打开，围绕着湖泊刷些沙滩。\n#1-4 添加地表装饰 再次使用喷枪，右侧笔刷栏换用树刷，调整笔刷硬度，坡度限制和仅限于草丛，左侧选择Layer-Deciduous（阔叶林），添加些树林。\n使用岩浆工具为火山口注入岩浆。\n#1-5 导出地图存档 Ctrl+3预览我们的地形，确认没问题后开始导出。\n注意务必将Generate structures关闭，选择合适的存档位置。\n我们就得到了最终的成品地形。我们可以看到这个地形实际上是长了些草的，但我们这个过程并没有刷草，这是因为WP的地表材质grass会自带一些草。而地表材质Terrain栏里的Bare Grass才是纯草方块。\n试一试！ 根据上述流程制作一个简单地形吧！\n示例：https://thingy.top/down.php/098c5c39b945ae321d922ce1d08cd7e7.world\n第二章 WP的简易操作 我们已经将WP的地形制作流程过了一遍，事实上我们也已经接触了WP的核心功能。为了进一步学习后续章节，我们需要知道WP需要通过何种按键完成何种操作。该章节内容部分摘编自WP官方文档：https://www.worldpainter.net/trac/wiki/Controls\n#2-1 鼠标与键盘 操作 效果 左键单击/左键拖动 应用当前工具/覆盖层/地形材质 右键单击/右键拖动 应用当前工具的反向模式（适用时）、移除覆盖层或重置地表材质为对应高度的的默认地表材质 中键拖拽 平移地图 鼠标滚轮 将笔刷大小增加或减少10% Shift+鼠标滚轮 将笔刷大小增加或减少一格 Ctrl+鼠标滚轮 缩放地图 Alt+鼠标滚轮 将笔刷旋转15度 #2-2 快捷键 标粗部分为强烈建议记忆的快捷键\n工具类\n按键 工具 Alt+a Flatten（平坦） Alt+f Flood（水滴） Alt+h Height（抬升/降低） Alt+l Fill（油漆桶） Alt+m Mountain（山峰） Alt+p Pencil（铅笔） Alt+r Spray Paint（喷枪） Alt+s Smooth（平滑） Alt+y Eyedropper（取色器） 操作类\n按键 操作 Ctrl+d 查看末地 Ctrl+e 导出为Minecraft地图 Ctrl+g 全局操作 Ctrl+h 查看地狱 Ctrl+i 导入现有的Minecraft地图（强烈不推荐！！） Ctrl+m 导入灰度图（疑似无效？） Ctrl+n 新建工程 Ctrl+o 打开工程 Ctrl+p 编辑维度属性 Ctrl+r 将地图与现有的Minecraft地图合并（强烈不推荐！！） Ctrl+s 保存工程 Ctrl+Shift+s 另存为 Ctrl+t 添加/删除区块 Ctrl+u 查看主世界 Ctrl+v 调整描图设置 笔刷控制\n按键 效果 - 将笔刷大小减小10% + 将笔刷大小增加10% Shift + - 将笔刷大小减小一格 Shift + + 将笔刷大小增加一格 Alt + - 逆时针旋转笔刷15度 Alt + + 顺时针旋转笔刷15度 Alt + 0 将笔刷旋转角度重置为0度 Alt + 3 顺时针旋转笔刷30度 Alt + 4 顺时针旋转笔刷45度 Alt + 9 顺时针旋转笔刷90度 1 将笔刷硬度设置为10% 2 将笔刷硬度设置为20% 3 将笔刷硬度设置为30% 4 将笔刷硬度设置为40% 5 将笔刷硬度设置为50% 6 将笔刷硬度设置为60% 7 将笔刷硬度设置为70% 8 将笔刷硬度设置为80% 9 将笔刷硬度设置为90% 0 将笔刷硬度设置为100% 视图控制\n按键 效果 Ctrl + - 缩小 Ctrl + 0 将缩放比例重置为100% Ctrl + + 放大 Ctrl + 3 三维视图预览 菜单\n按键 呼出菜单 Alt+e Edit Alt+i File Alt+t Tools Alt+v View 第三章 了解WP的各种工具 工具陈列在WP界面的左上角，各种工具的交替使用是完成地形的基础。接下来做的内容基本上等同于汉化了选中工具时的Tool Settings，因为我猜你们百分百懒得看这堆英文。实际上这些内容都是比较显然的，自己建个超平坦图随便画画就能了解这些工具的功能，但万一你太想进步了（懒），半夜在床上没开电脑还想学地形，所以我还是会介绍一下这些工具的基本功能。\n**如遇工具无法切换的情况，可以尝试狂按左下角Layer栏的任意一个覆盖层。**该问题的原因不明，解决方案的原理不明，但就是能解决问题（\n#3-0 哪些工具是不能使用的？ 实际上这个标题有些夸张了，这些是我个人不推荐使用的工具。\n铅笔（Pencil）：具有严重的性能问题，很容易导致WP卡崩溃，100%笔刷硬度的喷枪可以作为一个平替。\n山峰（Mountain）：实际上大多数笔刷都是为抬升/降低（Height）设计的，山峰（Mountain）的效果一般。\n#3-1 塑形工具 #3-1-1 抬升/降低（Height） 常用。左键抬升，右键降低。\n左侧有个Tool Settings可以勾选的Apply theme，勾选上会根据地形高度自动调整地表材质。没什么卵用的设置，毕竟还是需要后期上色的。\n#3-1-2 平坦（Flatten） 常用。使得笔刷范围内的高度趋于鼠标所在位置的高度。\n#3-1-3 平滑（Smooth） 常用。使得笔刷范围内的高度趋于笔刷范围内地形的平均高度。\n#3-1-4 金字塔/旋转金字塔（Raise Pyramid/Raise Rotated Pyramid） 显然。\n#3-2 液体工具 #3-2-1 水/岩浆（Flood with Water/Lava） 常用。\n使用水时：左键单击陆地时以该高度为基准灌水，左键单击水时将水面抬升一格。右键单击水时将水面降低一格。作用在岩浆处会将岩浆替换为水。\n使用岩浆时类似。\n#3-2-2 海绵（Sponge） 常用。\n左键擦除该处的水/岩浆。右键将该处水面恢复到创建世界时设置的高度。\n#3-3 上色工具 #3-3-1 喷枪（Spray Paint） 常用。\n左键单击可将当前选定的地表材质、覆盖层等图层应用到指定位置。\n右键单击可移除对应覆盖层，或将地表材质恢复为创建世界时设置的地表材质。\n#3-3-2 油漆桶（Fill） 显然。基本用不到。\n#3-3-3 文字（Text） 显然。\n#3-4 杂项 #3-4-1 取色器（Eyedropper） 显然。\n#3-4-2 设置出生点（Spawn） 显然。\n#3-4-3 全局操作（Global Operations） **常用。**见下图。\n#3-4-4 选区类（Selection） 均不常用。\n编辑选区（Edit Selection）：左键添加，右键移除。\n复制选区（Copy Selection）：将选区内容粘贴到另一位置。\n清除选区（Clear Selection）：显然。\n第四章 地形塑形 “多练。”\n实际上，WP的塑形相当简单，没有任何花里胡哨的东西，真的就是在画画，因此“多练”才是最重要的。不过，我仍然有一些技巧和注意事项可以分享给你。\n#4-1 空间尺度 不同笔刷具有不同的空间尺度。如图所示，山系笔刷的空间尺度就比山脉笔刷大得多，如果他们两个使用同等的笔刷大小进行绘制就会很违和。\n而我们拉小山脉笔刷的大小，用多个笔刷拼凑出一整个山系，这样的空间尺度就会显得合理许多。\n#4-2 笔刷叠加 还是以上面这个地形为例。山系笔刷在制作时，考虑到其大尺度的特性，在笔刷中加入了缓坡。而山脉就不具有这一特性，因此过渡显得比较突兀。我们可以利用笔刷的叠加来自然过渡、添加纹理等。这里以解决下面的过渡问题为例。\n围绕着山体刷一下多重分形，再略微平滑边缘处即可。\n#4-3 三维缩放 这么说显得有点晦涩，其实是非常好懂的事情。我们对一个笔刷进行使用时，笔刷拉大拉小的同时也要注意高度方向的缩放。显然靠上的高度更加合适，而靠下的高度过高了。\n除了左下角信息栏的高度（Height）以外，地形的阴影也能够直观反映地形高度。\n#4-4 避免留白 大平原可以做，但大平原也要有所设计。尽量避免WP自动生成部分的大量保留。左侧是WP自带噪声产生的大圆圈平原，右边是用多重分形点了一下。很显然右边更加适合作为平原。\n#4-5 山体衔接 只需要两个山体强行贴贴。但需要注意距离的控制。借助撤回功能逐步尝试合理的距离即可。中间偏上下两个距离分别过远和过近，中间偏右比较合适。\n#4-6 散装笔刷 笔刷是可以切开来用的。比如我们只想要这个笔刷的一小部分，另一部分打算拼上另一个笔刷，就可以尝试通过平坦工具进行。\n类似的，把一个山劈成中间为峡谷的两部分也是可行的。留作读者自证。\n#4-7 需要你关注的一些其他内容 其实前面也提过，作用也很显然，但我不再写一遍你实战肯定想不起来看这些的（\n左下角信息栏：高度（Height）、坡度（Slope）\n右侧笔刷设置：旋转（Rotation）、硬度（Intensity）\n第五章 地形上色/地表装饰 相较于塑形，WP的上色与装饰就复杂许多了。\n#5-1 上色与装饰的基础知识 我们的上色与装饰任务基本是靠喷枪工具完成的。推荐上色时使用自带的实心圆形或方形笔刷，装饰时使用圆形或方形渐变笔刷或下载的其他笔刷。\n上色需要的是左下角的地表材质（Terrain），装饰需要的是覆盖层（Layers）。生物群系（Biomes）根据自身需要刷就可以，若未刷，WP也会自动填充生物群系。标记层（Annotations）可以辅助我们完成一些复杂的上色任务。本章节只介绍地表材质和覆盖层。\n#5-1-1 地表材质（Terrain） 我们从地表材质（Terrain）栏开始介绍。\nWP的各种地表材质并不是与MC原版方块一一对应的，比如有Rock（石头与圆石混合），Grass（覆盖草的草方块），Netherlike（地狱风格），Beach（混合沙子、沙砾、粘土，自动覆盖海带）这些地表材质。我们也可以通过自定义功能自行添加地表材质，自定义地表材质可以完成多种方块的噪点、斑点以及分层混合。\n#5-1-2 覆盖层（Layers） 接下来介绍覆盖层（Layers）。\nWP有一些自带的覆盖层，都比较易懂。需要特别提醒的是积雪（Frost）覆盖在水上时会转化为冰，地下资源（Resources）导出时默认自动刷上，不需要另刷。而重头戏在接下来的自定义覆盖层上。\n自定义物体层（Custom object layer）可以将模型文件布置在地形上。目前WP支持.bo2, .bo3, .nbt, .schematic, .schem这些模型文件。获取方式见**#0-3 获取常用地形资源的渠道**。\n双击列表中的模型文件可对单个模型属性进行编辑。\n自定义地表层（Custom ground cover layer）可用于在地表添加一些方块覆盖，可以看作是更高级的地表材质。最常用的用途是做河流。如图所示是一种常见的河道配置。\n自定义地下层（Custom underground cover layer）可以在地下刷矿物时使用。不常用。\n自定义洞穴层（Custom cave/tunnel layer）功能及其强大，同时操作也较为复杂。建议对地形制作有较大需求，想成为一名真正的地形师的读者学习。\n下面是一个修改案例，向读者解释这些参数。我们对地板选择了固定海拔，地板高度在16，可以看到右侧地板海拔平均值在16，通过变化（Variation）参数使得地板在16这个平均值的基础上上下起伏。天花板选择了地板以上的固定高度30，于是天花板平均在30+16=46的位置，变化参数同理。墙壁的底部和顶部分别对应了宽度为10和16的过渡距离。勾选洪水选项，调整水平为18，将水调整为岩浆，于是产生了高度为18的岩浆湖。移除了洞口上方的水和岩浆避免了水流下来变成黑曜石。最后在适当修改地表材质和天花板、地板的覆盖层就是一个合格的岩浆湖了，笔者此处没有展示，留作笔者自证。\n最后附一张笔者在蓁洲这张地图实战洞穴层的效果图，笔者能力有限还请见谅，相信读者可以结合所学达成更好的洞穴效果。\n**自定义植物层（Custom plants layer）用于在地表添加各种小型植物，如草、蕨、花等。**两个选项分别控制是否将农作物下方方块替换为耕地和是否仅刷在合法方块上。\n**自定义结合层（Combined layer）顾名思义，可以将地表材质、生物群系和覆盖层合并在一起。**不常用。\n**自定义标记层（Custom annotations layer）**与自带标记层功能一致，不再赘述。\n自定义浮空层（Floating dimension）功能及其强大，同时操作也较为复杂，且目前尚未完全开发完毕，但已展现出极大潜能。建议对地形制作有较大需求，想成为一名真正的地形师的读者自行摸索，在该功能正式完成前本部分内容暂且省略，仅附一张笔者的测试图供读者了解其效果。\n#5-1-2 二值化图层与常规图层 Worldpainter中的图层分为二值化图层与常规图层。二值化图层例如积雪、自定义植物层、虚空层等，对一个方块只存在刷上了和没刷上的区别，使用喷枪绘制时会根据笔刷的形状来确定这一点刷上的概率。常规图层例如落叶林层、自定义物体层等，对一个方块存在不同的密度，使用喷枪绘制时会根据笔刷的形状来决定这一点的图层密度。最下方的信息栏对二值化图层会显示true和false的状态，而对常规图层则显示该点的intensity。\n#5-2 遮罩控制 WP实际上没什么遮罩可言，这里说的是右侧笔刷设置栏的各种限制。最常用的是坡度（degree）限制，坡度可以解决绝大部分上色任务，如下图就展示了在55度以上绘制岩石（Rock），65度以上绘制三废岩（Stone Mix）的效果。配色仅作一个参考，具体采取什么配色可根据个人审美来。\n#5-3 简易过渡 我们现在有一片草原与一片沙漠相接，要如何处理这个地方的过渡呢？这里教给大家一个笔者此前在Ansing的教程中学来的一个方法。\n我们限制坡度在十几度以下，向左绘制沙子。可以看到已经产生了一个过渡地带，但还是较为生硬。\n将坡度继续降低，进一步向左绘制，如此操练若干次，直至坡度降为零。\n最终得到这样的效果。\n类似地，雪线也可以利用该方法向低高度试探，在降低坡度的同时降低at or above的高度值实现过渡，如图所示。\n#5-4 模型比例 同样的一座山在不同比例树木的映衬下大小会显得不一样，很好理解但需要注意。这个现象在游戏里会更加明显。\n#5-5 覆盖层导出顺序与覆盖层的合理过渡 如图所示，我们的两个覆盖层都以50%的硬度刷了上去，中间产生了一个重叠部分。\n然而实际上我们发现重叠部分几乎只刷出了一种树木。\n这是因为我们在导出时，覆盖层的导出顺序是有先后之分的，我们发现橡树的覆盖层先进行了导出，导致后面的松树没有足够的空间进行放置，于是松树就几乎刷不出来了。\n我们将重叠部分的两种树木密度都降低，但这时我们发现虽然两种树木都刷上了，但重叠部分却变得非常稀疏，而且橡树地位仍然占优。\n不妨尝试将先导出的橡树在重叠部分的密度降低，后导出的松树保持不变，这样就产生了较为合理的过渡带。\n#5-6 水系绘制 #5-6-1 湖泊与水平河流 向下降低地形制作出湖泊后在湖泊边缘处使用平坦工具延伸出河流即可。湖泊的水会在达到海平面后自然产生，如不希望以海平面高度作为湖泊高度可使用海绵和水滴工具自行调整。河道绘制后利用平滑工具抹一遍河道可以使得河岸过渡更加柔和。\n#5-6-2 高度差河流 我们现在将河道进行进一步延长，同时设计出河流的高度差，这时我们强行使用水滴工具就会导致水漫金山。\n不妨将高处河道左侧堵住再填充水，然后将堵水的部分移除。\n中间这个位置要如何过渡呢？我们创建一个自定义地表层，进行如下修改。其中Thickness表示河道最大深度，width表示河岸过渡宽度。\n启用only on land（仅限于陆地），利用覆盖层连接两部分，这样我们的高度差河流就绘制完成了。\n进入游戏观察效果。需要注意的是水往往会被MC激活而四处流淌，破坏原有河流效果。高版本MC**阻止水源激活可尝试[CBU]取消方块更新**这个模组。\n介皇，你的高度差河流确实很好看，但还是太复杂了，有没有什么简单又好学的方法推荐一下？有的有的，制作高度差河流的方法还有一种。我们创建一个如图所示的自定义地表层，不需要提前开凿河道，直接刷上去即可。其中Thickness表示河道最大深度，width表示河岸过渡宽度。（和上面的地表层其实是一样的，只不过我们现在将应用范围扩大到了整个河流而不仅仅是落差处，这种方法目前应用更多）\n第六章 多年以后，面对甲方，某个地形大神将会回想起介皇带他去见识WP的那个遥远的下午。 “没有为 WorldPainter 提供合适的用户手册（目前还没有）。我尽量让它尽可能直观易懂，你应该可以通过试错法弄懂大部分内容。点击（左键和右键）每个按钮，看看会发生什么。别忘了尝试每个鼠标按钮，使用滚轮，并在按住 Ctrl 键的同时做这些事情。另外，别忘了查看所有菜单。”\n上面是Worldpainter的开发者Captain Chaos写在WP文档开头的内容，Worldpainter是一个相对简单的软件，事实上我们的教程的主要内容到此为止已经结束了。\n但如果想深入了解地形，学完WP以后紧接着就要学习WM，但介皇的WM教程里也并没有介绍过WP与WM的对接过程。本章将介绍灰度图导入、遮罩应用、上色脚本这些对接WM的东西，以及各种各样你可能弃坑了也没用到的杂项功能。\n#6-1 对接Worldmachine 如果你看不懂这一部分在干什么，请跳过，再学习Worldmachine后再返回查看。\n#6-1-1 灰度图导入 左上角File-Import new world-From height map。\n#6-1-2 遮罩导入 选择右上角Edit-Import-Mask as terrain or layer。\n关于各种映射方式的区别：对于绝大多数场景来说，选择映射方式是没有意义的，因为我们都是将遮罩导成一个Chasms或者别的什么覆盖层以后配合上笔刷的Only on以及坡度限制等使用，这种刷覆盖层的方式并不会继承原有的覆盖层深度（无论你选择full或者actual的映射方式）。除非你选择直接将遮罩导入为你的目标覆盖层，这种情况下选择actual的映射方式更合理（感觉地形圈绝大多数人并不会用这种方式？）。\n#6-1-3 上色脚本 参见黑霞《在WorldPainter中使用图片(Bitmap)上色的方法》。上色脚本链接：https://github.com/creativitRy/ColorToTerrain。\n需要注意的是，文件的扩展名也需要一并输入进去。\n#6-2 杂项功能 这里仅仅为了教程的完整性而列出几个最常用的，更多内容请自行或配合文章开头的汉化版本来了解。\n在Edit-Dimension处可以添加天花板、下界、末地维度，在View处可以切换维度视图。\n在Edit处有几个功能可以对地形进行旋转、移动等等操作（使用前先备份），虽然我并不建议你这么做。\n在File-Export处你还可以把地形导出成灰度图而不仅仅是Minecraft存档。\n在Edit-Preference处可以调整自动保存、检查更新和撤回次数。\n在导出时的Post Processing选项卡可以调整后处理，如果你使用了包含非法放置的方块的模型包，请关掉植物检查。\n在导出时选Test Export可以只导出一小部分便于你进行测试。\n在自定义地表材质处，选择Custom就可以添加模组方块作为地表材质。\n在WP的安装目录，修改worldpainter.vmoptions和wpscript.vmoptions可以为WP与WP脚本引擎分配更多的内存。\n不要试图修改已有的Minecraft地形，尽管你能找到相关功能。如果你执意要用，我也建议你先备份好相关数据。\n终章 只是一些然而并没有什么卵用的话 #7-1 比远方更远 接下来的Worldpainter学习已经不是任何教程可以帮助你的了，WP本身的特性又导致其工程文件也并没有可学习性，因此接下来的进阶方式只有多练。在这里向你展示一些对Worldpainter的强如怪物的极致应用作为一些启发。\n归 - Little_Reuben\n潘多拉/Pandora - illyrio\n只使用World Painter制作的精美地形! Tropical Pirate Island Hideaway 制作过程\n#7-2 后记 鸡汤部分请参见《制作更高更妙的MC地形 WorldMachine基础教程》的后记。感谢你阅读完本文，希望本文能够对你有所启发。\n感谢本文引用内容的作者和在本文编纂过程中给予帮助的众多地形师和群体，包括但不限于：\n花开 虹梦 FN Studio Minecraft地形师茶馆 CTI中华地形师协会 #7-3 地形圈指路牌#2 以下展示了一些实用资源，本文的编纂也或多或少参考或利用了一些下面的资源。使用这些资源前请务必自行查看其许可协议\n与Worldpainter并非及其密切相关的资源请参见《制作更高更妙的MC地形 WorldMachine基础教程》的地形圈指路牌。\n交流类：\nMinecraft地形师茶馆 878646382 CTI中华地形师学会 199077727 虹梦的梦中幻居 748858660 [像素茶艺地图站](我的世界地图下载 - 像素茶艺地图站 - 用最简单的方式传播好作品) 教程类：\n制作更高更妙的MC地形 WorldMachine基础教程 珀尔的Worldpainter图文教程 Lord Dakr的Worldpainter入门/进阶教程 笔刷类：\n茶馆笔刷包 Ineylan\u0026rsquo;s brush pack 模型类：\n下午茶树包 FeH2/H2CO3个人主页 paleozoey个人主页 Wet个人主页 软件类：\nWorldpainter汉化版 清华大学开源软件镜像站 ","date":"2025-02-05T22:05:28+08:00","image":"https://xzhongjie.github.io/p/worldpainter%E4%BD%A0%E7%9C%9F%E7%9A%84%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97-worldpainter%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/cover_hu_f96cf3bdce51b589.png","permalink":"https://xzhongjie.github.io/p/worldpainter%E4%BD%A0%E7%9C%9F%E7%9A%84%E6%8E%8C%E6%8F%A1%E4%BA%86%E5%90%97-worldpainter%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/","title":"WorldPainter你真的掌握了吗？ WorldPainter基础教程"},{"content":"叠甲：本文仅作记录美好生活目的使用，不构成任何知识信息传播，答案是自己写的，不保证准确。\n","date":"2024-12-28T22:05:28+08:00","permalink":"https://xzhongjie.github.io/p/%E5%BE%AE%E8%A7%82%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8E%9F%E7%90%86%E5%A4%8D%E4%B9%A0/","title":"微观经济学原理复习"}]