红叶攀墙秋萧萧

学校操场的围栏上,长满了爬墙虎。自开学起,每次和它们见面,一回比一回红。是夏季烈日残留的一角把它们引燃了吧? 能见到它们,只有在体育课和做操的时间。上次运动会时还是绿绿的一簇,挂在操场大门上方,几支茎垂下来,稚嫩的绿叶在一阵微风吹过后,它娇妍地摆头。有几片叶子从格子缝隙里探出头,生锈的围栏高墙点缀着生机。 一次大课间,我们坐在操场上休息。围墙外远方的高楼在暮霭的包裹下,轮廓被细致地描摹,目之所及皆被染上了一抹颓黄,鸟群在几栋楼之间来回穿梭。 怎样才能将自己的思绪,融入这缥缈的夕阳、这喧闹、这最后的两百余天中呢?大门上的红叶在风中摇摆。 今日再见,那一抹令人惋惜的成熟的艳红,已经不由分说地映在它们昔日稚嫩的脸上。夏季的烈日将它们引燃了。纯粹的美,无暇的美,昂扬的美,低垂的美。它们为自己的美付出了代价。 我沿着围墙捡拾红叶。一些最艳的红叶,早早就掉落了,老成的携着腐朽的红叶,把它们可贵的纯粹、干净的艳红衬托得曼妙无比。成熟的深红,破裂与暗淡,在早逝的艳丽衬托下,快要被人唾弃了。已经干瘪发脆的叶子,轻轻一搓就能碎成齑粉,散落在地上,那是红叶,还是小虫的尸骸呢?美丽如此脆弱。 与枝干刚刚两断的红叶,周身有着让人悲悯的柔软和湿漉。叶脉纹路清晰可见,光滑的叶肉反射着阴天清冷的光,简直像一件精雕细琢的工艺品。 我坐在围栏下,望着大门上方缀着的那簇叶子。它们已经没有了先前的活力。暗红的枝叶,低垂着身姿,散发着淡淡的死和枯萎的幽香。来年的红叶还会等我吗?

2025/10/16
articleCard.readMore

韩愈《师说》

在视频【“你这是学生思维”】 中,有一个评论引用了《师说》中的一句话:「是故无贵无贱,无长无少,道之所存,师之所存也。」记一篇原文及翻译。用白话翻译出来就很浅显,甚至是老生常谈的大道理,可能这就是文言文的距离之美和留白之美吧。 古之学者必有师。师者,所以传道受业解惑也。人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。生乎吾前,其闻道也固先乎吾,吾从而师之;生乎吾后,其闻道也亦先乎吾,吾从而师之。吾师道也,夫庸知其年之先后生于吾乎?是故无贵无贱,无长无少,道之所存,师之所存也。 古代求学的人必定有老师。老师,是靠他来传授道理、教授学业、解答问题的。人不是一生下来就懂得知识的,谁能没有疑惑?有了疑惑而不跟从老师学习,那些成为疑难的问题,就始终不能解开。出生在我之前的人,他知道道理本来比我早,我跟从他学习,把他当作老师;出生在我之后的人,如果他得知道理也比我早,我也跟从他学习,把他当作老师。我是学习道理的,哪关心他的年龄比我大还比我小呢?因此无论地位高低,年龄大小,道理存在的地方,就是老师存在的地方。 嗟乎!师道之不传也久矣!欲人之无惑也难矣!古之圣人,其出人也远矣,犹且从师而问焉;今之众人,其下圣人也亦远矣,而耻学于师。是故圣益圣,愚益愚。圣人之所以为圣,愚人之所以为愚,其皆出于此乎?爱其子,择师而教之;于其身也,则耻师焉,惑矣。彼童子之师,授之书而习其句读者,非吾所谓传其道解其惑者也。句读之不知,惑之不解,或师焉,或不焉,小学而大遗,吾未见其明也。巫医乐师百工之人,不耻相师。士大夫之族,曰师曰弟子云者,则群聚而笑之。问之,则曰:“彼与彼年相若也,道相似也,位卑则足羞,官盛则近谀。”呜呼!师道之不复,可知矣。巫医乐师百工之人,君子不齿,今其智乃反不能及,其可怪也欤! 唉!古代从师学习的风尚不流传已经很久了!想要人没有疑惑也难了!古代的圣人,他们超出一般人很远,尚且要跟从老师请教了;现在的一般人。他们的才智低于圣人很远,却以向老师学习为耻。因此,圣人就更加声明,愚人就更加愚昧。圣人之所以能成为圣人,愚人之所以成为愚人,大概都是由于这个原因吧?(有些人)疼爱自己的孩子,就选择老师来教他;(但是)对于他自己,却以跟从老师学习为耻,这真是太糊涂了!那些儿童的老师,是教他们读书、学习断句的,不是我所说的那种传授道理、解答疑难的老师。(一方面)不通晓句读,(另一方面)不能解决疑惑,有的(指句读)向老师学习,有的(指疑惑)却不向老师学习,小的方面学习了。大的方面却丢弃了,我看不出这种人是明白事理的!巫师、医生、乐师和各种工匠这些人,不以互相学习为耻。而士大夫这类人,一听到有人称“老师”、称“弟子”等等,就许多人聚集在一起讥笑人家。问他们为什么讥笑,就说:“他和他年龄差不多,懂得的道理也差不多。(以)地位低(的人为师),就足以感到羞耻;(以)官职高(的人为师),就近乎谄媚了。”唉!古代从师的风尚不能恢复,从这里就可以知道了。巫师、医生、乐师和各种工匠这些人,是士大夫们所看不起的,现在他们的见识竟反而比不上这些人,这真是很奇怪啊! 圣人无常师。孔子师郯子、苌弘、师襄、老聃。郯子之徒,其贤不及孔子。孔子曰:三人行,则必有我师。是故弟子不必不如师,师不必贤于弟子,闻道有先后,术业有专攻,如是而已。 圣人没有固定的老师。孔子曾以郯子、苌弘、师襄、老聃为师。郯子这些人,他们的贤能都比不上孔子。孔子说:“几个人一起走,其中就一定有可以做我老师的人。“因此学生不一定不如老师,老师也不一定比学生贤明,接受道理的时间有早有晚,学问技艺各有专长,不过是这样罢了。 李氏子蟠,年十七,好古文,六艺经传皆通习之,不拘于时,学于余。余嘉其能行古道,作《师说》以贻之。 李家孩子名叫蟠的,今年十七岁,喜爱古文,六经的经文和传文都已广泛学习,不受当时(耻于从师)风气的拘束,向我求学。我赞许他能够遵行古人(从师)的正道,写了这篇《师说》来赠给他。

2025/10/8
articleCard.readMore

《奔马》书评:刀刃突入腹部的瞬间,红日在眼睑内冉冉升起

今日凌晨读完了丰饶之海的第二卷:《奔马》,这是四部曲中最暴烈的一部。全书围绕着上一部的主人公松枝清显的转世 —— 饭沼勋的行动展开。讲述了一个阳刚强健的少年,因不忍政治腐败,天皇的实权丧失,忧国之心驱使他组织刺杀政府企业巨头,失败后,他雄心未泯,最终刺杀了藏原再切腹自尽的故事。重点展现了作者对武士道中「忠」与「勇」的极致追求。 本部书与上一部《春雪》比起来,又是另一个极端。上一部的主人公松枝清显沉溺在幻想中,优柔寡断;而转生后的饭沼勋则成了一个行动者。如果说松枝清显是作者孱弱一面的投射,那么饭沼勋则是作者暴烈极端的一面和其政治诉求的投射。清显沉溺幻想的虚无,饭沼勋用行动对抗虚无。作者塑造了一个让人印象深刻的少年形象:冲动的、理想的、认知是非黑即白的、尖锐的少年形象。 这股少年气是饭沼勋最闪耀的优点,也是他走向悲剧的重要原因之一。他受《神风连史话》的影响,组织成立了昭和神风连。而这是一个几乎注定失败的行为,其中贯穿全书的对自杀的理性规划与向往,让人不禁怀疑,他究竟是想要救国,还是想悲壮地自杀? 对于这一部分的不理解,主要源于文化差异,在日本文化,以及武士道文化中,自杀不被认为是消极的、逃避性质的寻死,而是一种以肉体的毁灭与极度痛苦,验证其精神纯洁性(如忠心、承担失败、洗刷侮辱)的最高仪式。死是一个手段,而不是目的。 三岛一直有美化死亡、自杀的倾向,但在全书围绕展开的「日本精神」中,又是正常的。 而勋对天皇的病态的执着敬仰,也要结合文化背景来理解。日本的天皇在第二次世界大战结束前,不单单是一个政治上的领袖,而是日本神话体系中最高权威神的人间体,他是一种纯粹的权威和信仰 ,这源于其宗教信仰上对民众思想的控制和洗脑。 因此也就可以理解为什么勋对天皇有如此病态的情感。书中,勋自述了对天皇的忠义的认识: “是。所谓忠义,对于我来说,就是手握滚烫的米饭做饭团,只顾一心一意做好饭团,献给陛下。其结果,要是陛下不饿,立即退了回来,或者说:‘这种难吃的东西,也敢呈献上来?’说着就把饭团砸到我的脸上。要是这样,我就会满脸粘着饭粒退下,怀着感动立即切腹。假如陛下饿了,高兴地吃了我的饭团,我也立即退下,怀着感动立即切腹。为什么呢?因为陛下吃了草莽小民做的饭团,这本来就罪该万死。要是做了饭团不献上来,一直捧在手上,又会怎样呢?饭团肯定会腐烂,这也不合忠义,我将此称作无勇之忠义。所谓有勇之忠义,就是冒死将一心一意做的饭团敬献上去。​” 那么,回到最初的问题,他究竟是想要救国,还是想要自杀?可以给出一个明确的回答:切腹是目的,也是手段。这是一个矛盾点。 他口口声声为了天皇与国家,但其行动逻辑却一步步指向了自我毁灭的必然结局。这不是勋的逻辑故障,而是三岛由纪夫「行动哲学」与「死亡美学」的内在缺陷。三岛追求的并非现实世界的改变,而是一种美学的、象征性的姿态。意义不在于救赎,而在于献祭。改变国家和震撼人心,重在后者。所以这种自杀是带有表演性质的,呼应其美学思想的行为,同时是目的也是手段。这是一种互相催生,又互相遏制生长的矛盾状态。但死亡是唯一确定的、必须发生的终点,行动只是为这个终点提供理由和仪式感。全书结尾,也是高潮的一句话,最能佐证此观点: 刀刃突入腹部的瞬间,红日在眼睑内冉冉升起。 切腹时极度的肉体痛苦被转化为精神上的快感体验,举事是否成功,对饭沼勋来说已经不重要了,红日的最核心的象征就是天皇、日本国体、纯粹的日本民族精神。这是勋毕生追求的终极信仰对象。 但同样需要思考的是,勋的自杀,除了在他个人的精神意义上的高潮,对外在的世界,对国家的影响又如何呢?如此极端的行动,执着和病态,又有什么意义呢?杀死了藏原(或其他暗杀名单中的人),国家就真的复兴了吗?军国主义和天皇掌权的失败已经证明了其荒谬和不可行性。因此勋的自杀,以及藏原之死,都如同从奔腾的洪流中取走一滴水,在宏观历史进程中的影响微乎其微。 饭沼勋的少年气,是对世界理想化、对动机单纯化、对结果美学化的自我陶醉的品质。他一生所追求的,正是这种「纯粹」。在勋眼中,现实世界已被污染,任何妥协或苟活都意味着对理想的背叛,是对「纯粹性」的玷污。只有通过壮烈的、仪式性的死亡(尤其是切腹),才能保持精神的绝对纯洁,避免被污浊的现实世界所腐蚀。死亡成为守卫纯粹精神的最后堡垒和唯一途径。所以从这个角度看作者本身,三岛的自杀并不能单纯定性为政治表演,也是一次知行合一的为美学殉教的实践。 本书虽尽显武士道精神的极端、对个体生命的漠视,以及日本军国主义和天皇绝对权威下的偏执与疯狂,但其文学和美学上的暴烈和阳刚的价值不可忽视,作者将日本文化中最纤美的一面在上一部发展到极致再毁灭,又在本部书中将日本文化中最刚烈的一面推向巅峰再毁灭,由衷钦佩作者笔下波谲云诡的文字氛围,期待下一卷《晓寺》带来的震撼。

2025/10/5
articleCard.readMore

逛逛西西弗,买两本书

昨天去了海信广场 B1 层的西西弗。 进门左手边有一些钥匙扣之类的小礼品,也有儿童玩具之类,感觉带小孩子来要很麻烦。 店里居然有卖漫画。说实话,我是第一次见到现在的实体漫画书,没怎么了解过,比想象中的小。大概跟一页文库出的一些文库本大小差不多,很便携。 这本《药屋少女的呢喃》,应该出过动画了,去年有一个朋友强力推荐我看。 本来是奔着三岛由纪夫的《太阳与铁》去的,但没货了,拿了一本《假面的告白》。结帐的时候柜台小姐姐建议我办会员,但由于不经常去,就拒绝了。她问我要不要买三岛的其他书,就拿了《爱的饥渴》。 唉,本来只想买《太阳与铁》的,正当我庆幸没有被忽悠着办会员的时候,才发现又多花了五十多冤枉钱! 在商场逛了一圈,想着刚才去书店只是匆匆地看了一眼三岛的书,又转回 B1 层,仔细看了看,在一个角落发现了《瓦尔登湖》,在刚刚拿《假面的告白》的地方又找到了卡夫卡的《变形记》。 共消费127元。唉,最期待的还是《瓦尔登湖》,希望自己能看完吧。

2025/10/4
articleCard.readMore

个人博客凭什么为你提供价值?

今天我在网上冲浪的时候,看见了一个收录博客的网站。收录的所有网站都是手动整理而来,并且对所谓博客的「价值」颇有一番见解,断章取义地引用了一段知乎用户的回答。原问题是回应关于个人博客的前途的,其中对博客的价值作出了一些判断。以下是原回答: 点击查看详细内容 我想来分析一下为什么很多个人博客 无疾而终,没“前途”。 对博客价值的根本性认识错误 以为个人博客是用来抒发“个人情感和认识”的,这是最常见的认识错误。这是我的博客,我写什么都可以,而且还假设自己写了东西别人就会来看。 没人在乎你情绪化的感情抒发,这对他们没多少用处。 个人博客更好的定义,是你以个人的名义发表对别人有价值的内容。所以个人博客内容创作的出发点不是让别人来关注自己,而是让自己为别人服务。 用博客内容为别人服务并不复杂,比如你写偏文章,介绍最近哪个店东西打折,只要你能把时间,地点,主体对象,促销力度等信息介绍清楚,就是一篇很有价值的博文。因为它对不少人有实际价值。 相反,你洋洋洒洒写一通美文,说得尽是些神神叨叨自怨自艾的个人情绪,除了你妈爱看以外,对别人没多少价值。你想开个博客靠抒发个人情感而不为别人的生活增值,却盘算着博客能有前途,这是无知,自以为是的痴人说梦。 没有质量的更新 很多个人博主的注意力,只有更新,不断更新,最好每天更新。只要能“保持更新”,就无所不用其极,完全失去内容建设。 需要的耐心。写文章就是随便胡诌两句,不用心,还让读者“随便看看,不喜勿爱”,甚至复制黏贴,采集抄袭,玩的都是些下三滥的手段。却还指望博客能有前途,真是消化1。 更新是重要的,但有比更新更重要的事。是“价值”。 你写一篇优质的文章,哪怕是夏天室内防暑省电技巧大全,也会永远地存在于搜索引擎,会不断地有人访问,这篇文章会成为你的网站一个优质的lead。为你创造潜在的知名度,关注度,甚至带来物质利益。 中国的博主相对国外的博主,最大的缺点就是没有耐心,没有耐心,什么都做不成。除非你相信一个个人博客可以短时间内成功,不用积累。 不懂营销 酒香也怕巷子深,况且你真有好酒,为什么不多做一点,让更多人知道你有好酒? 太多博主以为自己写了东西,花了力气,回报自然回来。有的时候确实是这样,比如你写的东西正好是别人不怎么写的一个特别的领域,也就是说,竞争小,或者运气好,干脆就是一片蓝海。 但这种机缘哪是人人都有?大部分人写的话题,都是很多人反复了不知道多少遍的,你写同一个主题的优势,无非是那是你自己独特的角度和构思,或者你的文字比别人用得好,讲故事有自己的风格,文章的结构超过他们,内容超过他们。 但仅有这些是不够的。 你得发现可能对你写的东西感兴趣的人群,把他们吸引过来,给他们一个机会理解你,也给你自己一个机会更好更快地走向成功。你得把营销看成一件正经事来做,不是让你去骗人,而是把好东西告诉需要知道的人。 我举一个例子, 这是我自己的一个教别人学Javascript编程核心概念的小网站:http://itlr.cc。我确实花了一点时间去准备内容,主要是视频的,到目前卖了大概人民币4000块,几个月时间,其他收入加起来大概8000。这是不是很多钱,当然不是! 我是不是在每天更新?没有,其实很久不更新了,但是微信上几乎每天都有人加。这网站有前途吗,有的,虽然谈不上大前途,但是发挥点工作外余热,自己也能学到东西。 你也可以,但要用点心,真把它当件事情来做,要学习不骗人的营销。 你会发现让一个网站有前途,是一件并不是很难的事。如果你没有耐心,是不会成功的。 我今天挖一七年的坟,评判一下关于价值的观点。 对博客价值的根本性认识错误 我们来看看百度百科怎么描述「博客」: 许多博客专注在特定的课题上提供评论或新闻,其他则被作为个人性的日记。一个典型的博客结合了文字、图像、其他博客或网站的链接及其它与主题相关的媒体,能够让读者以互动的方式留下意见,是许多博客的重要要素。大部分的博客内容以文字为主,但仍有一些博客专注在艺术、摄影、视频、音乐、播客等各种主题 …… 简言之,Blog就是以网络作为载体,简易迅速便捷地发布自己的心得,及时有效轻松地与他人进行交流,再集丰富多彩的个性化展示于一体的综合性平台。 …… 它可以是个人纯粹的想法和心得,包括对时事新闻、国家大事的个人看法,或者对一日三餐、服饰打扮的精心料理等 它绝不仅仅是纯粹个人思想的表达和日常琐事的记录,它所提供的内容可以用来进行交流和为他人提供帮助,是可以包容整个互联网的,具有极高的共享精神和价值。 …… 日记、照片、诗歌、散文,甚至科幻小说的发表或张贴都有。 以此可以证明,博客的创作题材非常自由。 再来看回答的观点: 个人博客更好的定义,是你以个人的名义发表对别人有价值的内容。所以个人博客内容创作的出发点不是让别人来关注自己,而是让自己为别人服务。 …… 相反,你洋洋洒洒写一通美文,说得尽是些神神叨叨自怨自艾的个人情绪,除了你妈爱看以外,对别人没多少价值。你想开个博客靠抒发个人情感而不为别人的生活增值,却盘算着博客能有前途,这是无知,自以为是的痴人说梦。 认为个人博客只能为别人服务,无法帮助他人的内容就是无价值。这是一个非常幽默的逻辑。个人博客为什么要着力于为他人提供价值? 那么谁有权定义价值?流量数据?工具性?创作者的主体性?你定义的价值,是情感价值还是存在价值?既然其存在,为什么会无价值? 按照博客导航站点的逻辑:「只收藏有价值的优秀博客」,其收录了以下这些情感类、个人生活类的博客,其观点就不攻自破了。 头痛一个月 - 小陈故事 别了,那些人,再见,那些记忆 - 生活的左上角 如果用知乎回答的观点:「谁想知道你头怎么样?谁想知道你跟虾米音乐有什么故事?除了你妈爱看以外,对别人没多少价值。」 这显然功利无情,完全背离了博客的初衷,将博客完全定义成为他人服务的工具,拒绝了自身需要的情感表达,否认了生活类以及情感类博客的意义,偏激不可取。 情感类博客没有价值? 只有实用价值才配被称作价值吗?显然不可能。 所有人的声音都值得被听见,在博客这样一个如此纯粹的表达空间里,依然被所谓的价值捆绑,如果所谓的价值、前途就是「钱途」,那你大可去写那一种微信公众号——图文版抖音、吸引眼球博流量、话说一半的标题党、图文无关的封面党,并且在文章头部、正文里、结尾,甚至评论区都挂上广告,当「流量主」,稳定获取收益。 写一篇实用性的文章帮助读者,是作者和读者的双向链接,而写情感类文章找到共鸣者,同样是双向链接,且比前者更牢固。这就好比你家厕所水管漏水,在外面找了一个修水管的工人,他干完活拿钱走人,过两天你会记得他吗?你只会记得你家厕所冲水真顺畅。这是实用价值。 但如果当时你给他接了杯水,递了根烟,扯闲天的时候发现大家都是大老远从家跑过来,在外打拼的苦人,甚至有可能是老乡或同好,你们留了联系方式,卖命之余能一起抱怨身边的烂人烂事。共鸣共鸣,频率相同才有共鸣 —— 这就是情感共鸣带来的链接的牢固性,能让你觉得:「哦,原来不止我一个人这样。」这是情感价值。这也是除了「夏天室内防暑省电技巧大全」以外,有质量的更新。 我从早期结构一盘散沙的各种文章,到如今结构极其松散的各种文章;从痛恨Linux,到向往Linux,到沉迷Linux,对各种事物理解的转变……改变不大,但那是自己坚实的脚印,看到自我成长,这是博客的自我价值。 所以,不要被所谓的价值禁锢了,想写就写,不要不敢写。更不需要强行营销,重要的是保持博客的纯粹性。打这种功利主义者的脸,最好的方法就是坚持写下去,顽强地写下去,写他们认为没有价值的东西,笔耕不辍,生生不息。 未修改原文用词。可能是「笑话」。 ↩︎

2025/9/30
articleCard.readMore

《春雪》书评:任何美梦都会有结束的时候,没有什么永恒的东西

于今日正式结束了三岛由纪夫的绝笔之作《丰饶之海》四部曲的第一卷 —— 《春雪》的阅读。刚开始读,它给我一种「很不三岛」的感觉,语言风格细腻柔美,甚至有几分古典韵味,对景物的描写细致入微,但处处洋溢着一丝哀愁,我还以为自己在阅读川端康成的作品。可以理解为三岛对恩师的致敬吧? 故事围绕着松枝清显与绫仓聪子的爱情悲剧展开,互为对方青梅竹马的两人试探猜忌,始终没有发展。聪子始终深爱着清显,但清显一直维护着他的孤傲,给人一种非常「拧巴」的感觉。直到聪子与治典亲王订婚,清显才意识到自己的确深爱着聪子,于是一场短暂禁忌之恋开始,最终聪子怀孕,被迫堕胎后,面对皇室和家族的巨大压力,她削发为尼,遁入空门。清显相思成疾,因肺病夭折,令人哀惋。 令我感受最深的,还是聪子这个角色的遭遇。被迫堕胎,清显和她爱情的结晶被彻底的物理意义上的抹除,也没有任何回头路留给聪子,她才走投无路做了尼姑,世俗已经没有任何可以让她留恋的东西了,而在事情刚刚发生的时候,松枝和绫仓两家还在商量如何瞒天过海,提出了一个佩戴假发参加纳彩的主意。 纳彩时要戴垂形假发,而平时要戴束形假发。人眼无处不在,聪子即使入浴也不可随意摘掉。 人人心里都在描绘着聪子应该佩戴的假发,它比真发还要光洁、流丽,如射干果一般乌黑闪亮。它就是强加授予的王权。 聪子已经不是一个有着自我的「人」,而是一个与家族兴衰荣誉直接绑定的「物」,家族一手操办着婚事,丝毫不考虑聪子的感受。而那讽刺的假发,便成了一具假面,聪子要时时刻刻戴着假面生活,完全压抑隐藏自己。但聪子真的得到解脱了吗?还是进入了另一层禁锢? 而小说中纯粹的美的化身 —— 清显,又是纯粹的情绪的化身,感性的化身,他近乎自虐式回味着感情,反复咀嚼品尝痛苦,而且有着强烈的自我美化倾向,又极度渴望悲剧,而这种思想最终将他导向了毁灭,他是一个唯美主义的殉道者,他爱着的也许不是聪子,而是他心目中聪子的幻影,现实中的聪子只是幻想的承载和投射。 另一个让我非常震撼,也钦佩的点是本书的名字:「春雪」、「春の雪」。春天落下的雪。不合时宜,短暂易逝,是对主角二人爱情的完美隐喻,同时也体现日本文学的风格:对短暂之美的细腻感受,哀而不伤,以及对不完美的接纳甚至美化,而本书确实是一本将唯美推向巅峰之作,也是将三岛心目中对柔弱纤美风格追求的毁灭之作。也对日本文学中力图传达的美学意识 —— 物哀 、幽玄 、侘寂三者融合达到巅峰,读完却怅然若失,如同自己亲身经历了一场凄美的爱情。 而「春雪」与「丰饶之海」这两个词,都有一种虚无的意境美,想起「丰饶之海」这个词取自月球上的「丰富海」,并且作者解释有讽刺意味,是「干枯的谎言之海」,震撼之情难以言表,深入想想一种恐惧感袭上心头,又一股颤栗般的感动将它冲散,却余韵悠长。 任何美梦都会有结束的时候,没有什么永恒的东西。

2025/9/28
articleCard.readMore

一文不值的疑云

周三,老师提醒我们,明天有一个测评,需要记住自己的身份证号。放学后又在班级群发了一条通知提醒,看来是很重要的事。 转天上午的一个大课间,班主任要带我们去参加那个测评了,正当我准备起身去楼道里站队,老师跟我说: 「你妈说你不参加,你在屋里待着就行了。」 我有点懵了,旁边几个人围着我问为什么我不参加,我有什么心理问题吗?到这时候我才知道,原来是上面安排的心理测试。那些问题我只能回答不知道,我真的什么都不知道。那些问题凝成了厚厚的疑云悬挂在我胸口。庆幸和不安缠绕在那团云里。 一方面,我庆幸于不用参加这种活动,可以自己一个人在教室里安安静静地,沉浸在自己的思绪里;另一方面,我不安于全班,甚至全校只有我一个人没有参加这个活动,以及,母亲为什么没有让我参加?难道我真有什么问题吗?种种猜想和预测占据了我的脑海,那些可恶的不安已经把所有原本打算考虑的问题,全部挤压出去了。 我低着头,烦躁地翻动一本课外书,那书本劣质的墨水和纸张,导致翻开之后就有一股工业的恶臭弥漫开,又和我周身流露出来的不安的恶臭混合在一起。门外其他班级也站好队走了,吵闹终于结束了,楼道里如冬日般寂静,使我更能沉浸在不安里。 是父母想到了什么,深思熟虑的结果,让我不参加吗?是他们的问题,还是我的问题呢?如果是他们的问题,他们为什么认为我不应该参加这次心理测试呢?如果是母亲的问题,难道她又诉诸玄学了?如果是我的问题,我到底需不需要参加这次测试?是因为他们觉得我心理有问题才不让我参加,还是因为他们断定我就是一个健康向上,热爱学习的好学生,才不让我参加那种活动? 不安和沮丧之间需要一架精妙的桥梁,我的永不停歇思考和猜测,正是最贴合河水两岸缺口的桥,那条河流奔腾着绝望,在思考的独木桥上一不小心就会跌入河流,在绝望的冲刷下被河床的石头磕得头破血流。但这样的结果,说到底还是自己走独木桥的技艺不精。 无尽的猜忌的折磨,像鬼打墙一样,必须有一个外人进来才能打破。第一个回来教室的人成了这个角色。我从初一开始就很讨厌他,他总是看着我的脸在偷笑,说我严肃的表情很滑稽,但那就是我最日常的表情,我不是故作严肃。只是每当我开始思考一些问题,最终感受都会导向痛苦,那表情只是大脑内痛苦的外在显现。他又看到了自己最喜欢的那个表情,摇着尾巴朝我跑过来,我坐在座位上,他用手搂住我的脖颈,用他的额头紧紧贴着我的额头,在我面前憋笑。他离我太近了,我能感受到他轻浮的吐息,和身上浅薄的气味。这就是肢体接触带来的几乎让我呕吐的感觉。我不理解为什么这个人每天都能那么开心,每天的精力和活力像用不完一样,以及为什么和很多女同学都有勾搭。他又问出我最想得到答案的那个问题: 「你为什么没去?你有心理问题吗?」 我只能尴尬地回应:我也不知道为什么。 得不到答案,胸口这云就永远也不会消散,越是思考,想得出答案,那团云就越是厚重,越压得我喘不过气。我也无心听课和默写,化学默得一塌糊涂,重新默写的几道题也几乎全错,直到今天还没解决,我也无力去解决了。那个问题始终在我心头,到底为什么我不去? 所有人都陆续回来了,开始上课后,我的思绪更没有寄存之地了,它就像一根点燃的火柴,马上就要烧到我的手,点燃全身了,火势已经不可控制,只有得到问题的答案才能扑灭这团火,但不放学找到母亲,永远也得不到这个问题的答案。我就这样被烈火反复舔舐着,一场凄美的自焚在教室里开始了,他只会慢慢烧焦我的皮肤,永远无法灼伤我的内脏,给我一个彻底的解脱。 熬过了一节课,我就趴在桌子上继续想,我向来下课都喜欢趴在桌子上装睡,这样是最安全的方式,但我得不到答案。 下午开始了运动会列队彩排。这种出狱即赴死般的囚犯的活动,在整齐的队列里喊着力量迸发的口号的活动,在我眼里一直有着悲戚色彩,但我又不能不参加。上次体育课训练,我发现我被围在队伍中间,队伍被围在学校篮球场中间,篮球场被围在学校高高的围墙中间。 我们站在阴凉地。前面同学浓烈的体臭让我的眉头紧皱,但他的心地善良,看到我那样的表情,说: 「怎么老愁眉苦脸的,多想想让自己开心的事吧。」 让我难过的事,就在我眼前。无论是他的体臭,还是问题的答案,都近在咫尺,又远在天边。只要屏住呼吸就闻不到了,只要停止思考就不难过了。 在初一的时候,好像没有节目,今年有三个同学组织了一个舞蹈节目,我们剩下的同学要手里拿着一把小扇子作为背景板配合她们的演出。我看着手里的折扇,再徐徐将它展开,大红背景色的扇面,一支白色的梅花占了三分之一,再展开就什么都没有了,只有一片红。这把扇子给人一种不调和的丑陋感。我这三年就像这把扇子,已经展开了三分之二,但在一支凄美的梅花之后,什么也没有。从侧面看这把扇子,褶皱跌宕起伏,其中一根扇骨还裂开了,扇子可以折起来再甩开,但这处裂痕永远也回不到先前的样子了。开扇的那一过程,如果不达到尽头,就绝对不可能停下来吧? 我又沉浸在自己悲情的幻想里,感官被屏蔽了,等到队伍走起来,穿过操场围栏大门,从一片阴翳之中到阳光普照的操场,我瞬间以为自己在梦中,但热辣的阳光照得我皮肤刺痛,为什么这样都不会醒来呢? 主席台上站着一个女生,手里拿着话筒,用尖细的声音读着学生提交上去的介绍词,最常出现的词汇就是青春、汗水、胜利……我向来厌恶这种充满力量感的词,但我对这场运动会没有任何贡献,有什么资格评价呢?我跟着队伍行走完全交给下意识的本能,大脑完全沉浸在幻想中了。 本能,真伟大啊,帮我暂时运行身体,应付那些琐事,好让我能沉浸在自己的思绪里,彩排结束回到教室的过程中,我看见了跑道上的地漏,我觉得那简直就是为了让扇子掉下去拿不上来而生的,如果我手里的扇子不存在,那么这里所有的地漏都没有了存在的意义。 在猜忌的痛苦里熬过了剩下的几个小时,终于放学,给母亲发了条消息。 「为什么不让我参加那个测评啊?」 「你不参加的是心理测试的那个。」 「为什么不参加?」 「老师早晨说不参加的尽快私信,我以为可以不参加。我也以为没什么用,就想着赶紧告诉她。」 我能说我的母亲愚蠢吗?我舍不得,我也不敢埋怨她。她早上确实非常忙碌,没有时间细看消息。但我如此复杂剧烈的情感,原因竟是母亲的「我以为」导致的,一切痛苦和挣扎都是徒劳吗?她也许察觉到了我的难过,就跟我说,之前参加的比赛,获奖证书到了,明天给我拿去。 于是,本应该是荣誉的事,在此刻被彻底玷污了。

2025/9/27
articleCard.readMore

研读《春雪》笔记三则

淫乱与优雅 聪子仿佛在教导清显,让他明白真正的优雅是不会害怕任何的淫乱的。 —— 《春雪(上)》(一页文库) P175 这段话运用了两个抽象的概念:「优雅」和「淫乱」。 清显和聪子的爱情发生在聪子被天皇许给亲王后,这使他们之间的爱情变成了一种对至高无上的光圈的冒犯,使他们认为自己的感情超凡脱俗。 三岛的思想认为,美是至高无上且无可亵渎的,但只有犯禁才能体会到这种美,对清显而言,聪子的「美」本身是可获得的,所以并不能称之为真正的「美」,当他冒着风险,去触犯禁忌的时候,才感受到了真正的优雅和美,清显为皇后捧裾时失误趔趄,但皇后却回头对他嫣然一笑,也让他从此产生了「禁忌可触」的思想。 「淫乱」并非字面含义,在情节中,两人的行为本质上是「通奸」。他们冒犯的是当时日本最神圣的禁忌 —— 天皇的权威。因此,这里的深层含义是「僭越」和「犯禁」。是一种对既定秩序、社会规范等禁锢的主动打破。 三岛认为,唯美之物必然伴随着对禁忌的触碰和冒犯,真正的优雅带有一种逆反性和危险性。此淫乱价值中立,是一种强大的、原始的情感生命力和情感力量。通过冒犯最高禁忌,使得爱情达到了前所未有的高度、强度与纯度,从而体验到一种毁灭性的极致的美与优雅,这里是三岛美学思想的有力体现。 关于松枝清显的性格塑造 清显堪称三岛由纪夫所追求的「美」的完美体现,他追求一种不涉入现实,由观念、感性甚至是梦幻构成的真正的「绝对之美」、「纯粹之美」。 在三岛的美学谱系中,美本身常常与女性、柔美、易碎等特质关联。清显男性的肉体与女性化的气质构成了一种超越性别的微妙的中性美,更接近理想中的「纯粹」。而清显又是接受和感知美的天线,他能捕捉到最细致的情感涟漪,光影变化和氛围波动,由于这些东西都是易逝的、暂时的,这就使他比常人更接近「美」的本质。 清显优柔寡断,他总是被推着走,不主动参与世界,是一个美的体验者与观察者,而非世俗的参与者,保持着精神世界的「纯粹性」。 清显的阴柔极大强化了他的「易碎感」,三岛信奉的「夭折美学」,即最美的事物必须在极致的瞬间毁灭,才得永恒。阳光、富有生命力的英雄的毁灭是悲壮的,但一个精致、柔美、如梦似幻的少年的毁灭,带来的是凄美、心痛和无限的悲惋。他仿佛一开始就注定要破碎,他的死亡成为了美学上的必然。 而从三岛由纪夫的身世来理解,他幼年在祖母的贵族式的教育下长大,身体有着类似清显的孱弱,但他又极度崇拜强健的体魄、阳刚的男子气概和行动力,以及探讨死亡与使命的,带有悲壮色彩的武士道精神,所以清显可以看作三岛将自身中敏感、文艺、阴柔的一面极致化并投射于外的过程,他通过清显这个角色,彻底地毫无保留地探讨了这种美的可能性,并最终让其毁灭,同样象征着私道在美学上完成了对自身柔美一面的告别与超越,把这种美推向极致最后摧毁的行为,呼应三岛的核心美学(哲学)思想,也能在后续的作品中偏向更阳刚、暴烈、行动性的美学。 巅峰即衰败起点 —— 三岛由纪夫毁灭美学的核心宿命论 任何具象之美,如青春、容颜、激情,在达到顶点的瞬间,必然开始不可逆的衰减。人对重复的体验也会麻木,如若清显于是聪子的爱情在禁忌中持续,终将沦为庸常,其「神圣性」会被日常消解。 美本身是一种易被玷污的脆弱状态,时间、世俗、欲望都会侵蚀其纯粹性,如聪子若剩下清显的孩子,爱情的形而上的意义将被生物学事实瓦解。人为中止美衰败的进程,将其冻结在最饱满的状态,如将鲜花制成标本,是对「美」的最高保护和尊重。 三岛认为,毁灭是获得美神性的唯一途径,肉体的消亡使美脱离物质的桎梏,从「有限」跃向「无限」。清显死后,他在聪子与本多的记忆中被抽象为「永恒的幻影」,不再受肉身衰老与情感变质的威胁。毁灭完成了美的形而上学转化,使其成为一个纯粹的符号。 我在之前的文章《三岛由纪夫 —— 文化和时代背景塑造的矛盾体》中,简单地把三岛的切腹归为「荒谬的政治闹剧」,实在有失偏颇,仅仅结合一本由第三者撰写的传记来分析这个非常复杂的问题是不辩证的,理解三岛所追求的美学思想与哲学理念,才能为分析提供更客观、多元的视角。

2025/9/22
articleCard.readMore

家和万事兴

有一种感觉,父母要不是因为生了两个孩子,早就离了。 总是因为各种各样的小事,小到不能再小的事吵来吵去,吵架也不能痛痛快快地吵一场,打架也下不去手,情感永远压抑在一个中间点,上不去下不来。 客观地来讲,弟弟的出生正值疫情,经济不景气,父亲公司裁员减薪,我的父亲被贬谪到了一个小维护站,从站长变成站员了。 从一万月薪骤降到三千,经济压力暴增,又有两个孩子要养活,父亲开起了出租车。 我们家当然买不起出租车,他是跟一个“哥们”借车开的,父亲是现代版的骆驼祥子,奔波在大街小巷,但祥子一人吃饱全家不饿,父亲还要赚够租金后养活家里三口人。出租车的生态位又被网约车挤压。 车主是典型的小资产阶级嘴脸,凭着出租车剥削我的父亲,时常以各种借口揩父亲的油,家里有点小钱就趾高气昂。前两天车被追尾,对方全责,父亲是个实诚人,跟他汇报了情况。车主以此为理由,拨弄弦外之音,向父亲索要对方依法给予的大部分赔偿,父亲知道他是什么意思,但还是反复斟词酌句,按着语音键的手向上滑了好几次,最后挤出了句: “鑫哥,咱们兄弟间有什么事就直说吧,你这什么意思看不懂呢。” “看不懂?是我打字有问题吗?需要我找个看得懂的人来给你解释解释吗?” 他以挖苦剥削人为乐趣,估计那可怜的虚荣心又一次得到了满足,正筹划着拿到钱后带着家人去哪旅游,再发条朋友圈。 父亲把手机往桌子上一摔,又点上一根烟,望着窗外的一片昏暗。 弟弟上幼儿园后,母亲也去上班了,每天由年迈的爷爷接送弟弟上下学,我们家成了典型的双职工家庭。 母亲在一家酒店当经理,虽说是经理,每月工资比父亲还少,索性待遇福利还不错,职场环境相对轻松,只是每天公务繁重,母亲每天回来都瘫在床上呼呼大睡。用父亲的话说,他自己成了“老妈子”,休息日洗衣做饭,工作日下班后照顾孩子。 这样的压力下,人自然容易斤斤计较,唯利是图,即使是小利,即使对方是自己的丈夫,即使对方是自己的妻子。 弟弟今年五岁了,还是不懂人事,哭闹耍嚷,总是把家里所有人的耐心和精力都消磨殆尽,我连坐在自己的屋子里,而不是去帮父母应付弟弟都感到罪恶。我用两百多天后的中考作为幌子整天在屋子里逃避。我想把身心寄托在阅读和写作,以及幻想。但在一个极度喧闹的环境,思考一加一等于二都是奢侈。 我和弟弟成了维系父母关系的纽带,几乎属于典型的“看在孩子的份上凑合过吧”。我有时也在想,如果父母真的离婚了,我该怎么办?其实父母离婚了,对于我来说,世界并没有毁灭,地球还在转,秋风还在吹,毒辣的阳光还是恶狠狠地扎入大地。离婚,父母不会双双离世,对于我来说只是家里少了一个人。跟谁过,在五六年后都会自己一个人生活了。父母离婚只是代表着他们间的纽带断裂,但我和父母仍然有连接。只是我和弟弟,跟父母的关系围成一个优雅的四边形,两个对立的端点永不相连罢了。 百年以后,弟弟望着三个紧挨着的小土包上堆着的簇簇鲜花,那时候他已经长成独当一面的大人了吧。

2025/9/21
articleCard.readMore

立场与观点

最近我们班的英语老师崴脚了,有另一位老师来代课,一些同学对这位老师的评价极负面,我对这个现象很感兴趣,借此次机会来聊聊观点和立场的话题。 首先,任何一门学科,学生都会因为各种原因,对它持有不同的看法。对于一位老师的评价,主观上除了自认为的「老师的水平」,还有一个很大的元素是老师教的学科。而学科有强势与弱势之分,人面对学科时的激励或挫折感受不同,自然会生出喜爱与厌恶的情绪。对于老师的评价也难免受到自己对科目情绪的影响。 每次下课都能听到一些同学对老师授课水平的评价:「狗屎」、「又臭又长」,以及人身攻击,直接辱骂老师的。基本都是「我觉得」、「俺寻思」,然后继续追问支支吾吾,仔细观察就能发现,那些恶言相向者都是不擅长英语的,如Q同学每天上课都心不在焉,百无聊赖,成绩不理想归结于「老师教的太烂」。他们的立场,已经开始作用于「评价」了。 这些评价可以分为两类,情绪与人身攻击。都是立场的作用。立场,在哲学和社会学中,常指由一个人的社会身份(如阶级、性别、种族)、生活经验所形成的特定视角和认知框架。但我更愿意用这种说法 —— 所站立的地方。站在不同的角度,也就是不同的立场看待问题就会有不同的结果。所以,在一个不擅长英语的人眼中,与英语有关的东西会让他回忆起痛苦,这种偏见的形成,直接导致了评价的方向,也生出了情绪。除学科偏见外,立场的构成也有其他原因,如对原老师的喜爱和留恋,甚至是从众心理等。 以上所描述,既不能称之为评价,又不能称之为观点,而是一种因先天能力、后天影响、个人经历等复杂因素共同作用导致的,带有情绪的看法。观点则是基于事实、理性分析形成的判断。何为评价?评定其价值。价值一定是一个值,或者一个区间,不能是负无穷或正无穷,所以价值不能是「好」与「不好」的二元对立。历史学科强调的评价原则是:辩证、全面、客观、实事求是。所以把一些相通的概念借鉴来并补充,如何评价一位老师?辩证、全面、客观、实事求是、区分观点与立场。 实事求是,即根据实证,求索真知;1所以从我们班级的客观情况来分析,由于皇亲国戚2居多和一些职场人情世故,我们班级的师资力量可以说是全年级数一数二,甚至还有高中部的老师曾来代课过,这也基本能说明来我们班代课的老师都不会差,再差也不会到「狗屎」的地步。也有一位在本校工作的老师背后推动优化我班的师资水平,所以这位代课老师的真正水平,已经有两个明显的因素发挥作用。 从授课节奏上看,与原老师几乎无异。课文翻译、短语、语法内容以及习题的讲评,也都是深入浅出、鞭辟入里的。只是由于代课老师工作繁忙,还有其它年级的学生要带,默写等基础工作不抓,有同学无自主学习的习惯,所以抱怨「看不懂题了」。即使课堂氛围营造不足,互动方式与原老师不同,也不应下降到人身攻击。 另外一个原因,也是由于宽松的管理风格,导致同学们的不适应,只好把情绪宣泄在最明显的一个点 —— 老师身上。说来说去,最后的问题还是落在了自己。 明辨是非而非混淆观点立场,调整适应而非辱骂拉踩的能力,在追求统一进度、弱化个性思考的标准化教育环境里异常可贵。这种能力,都是以思考为前提的。班级里用情绪主导判断的行为,是微小的时代缩影,在信息爆炸的时代,操控流量的人们刻意煽动情绪、制造爆点,宣扬极端化的观点,给出片面的,断章取义的结果,抹杀了思考的过程,从而导致很多人懒得思考,放弃思考,「没想过」、「不关心」、「不知道」成为常态,娱乐致死的邪风越刮越猛,麻木愚钝的浪潮愈发澎湃,想和同学交流看法,最后的一份坚守也能被尖锐质问: 「你想这个干嘛?」 知音少,弦断有谁听。 —— 岳飞《小重山 · 昨夜寒蛩不住鸣》 实事求是 - 百度百科 ↩︎ 指教师子女。 ↩︎

2025/9/19
articleCard.readMore

给00后和10后的书信来往指南

0.前言 现代社会,网络发达,书信这种原始的联系方式近乎销声匿迹,但仍有爱好者使用书信与朋友交流。为延续这份笔尖上的情谊,特撰此篇,供对书信有兴趣的年轻朋友们参考。本文将从格式、用语、用纸、信封、邮寄六个维度拆解,供示例均为书面用语,书信的魅力不仅在于死板的格式和用语,更在于「专属感」,可根据实际情况略作调整。 1.书信体格式 标准的格式可以体现出书信的正式性。 1.1 称谓 顶格写在纸张左侧边缘(即「左顶格」),不空格,独占一行。称谓后加冒号,冒号须写在称谓的右侧。 对平辈朋友: XX 吾友:/ XX 兄: / 姐: 对年长朋友: XX 先生: / 女士: 1.2 问候语 接称谓下一行,从左侧空 2 个字符位置开始写,独占一行。语气可正式可亲切,避免口语化,不拆分换行。 展信佳。 / 别来无恙? / 久未联络,甚念。 1.3 正文 接问候语下一行,从左侧空 2 个字符位置开始写,与问候语对齐。每段开头均需左空两格,段与段之间空 1 行,避免拥挤;后续每段开头空 2 格。 正文传递近况、想分享的事、对收信人的问候等,是书信内容占比最大的部分,也是核心。结尾盼回复 / 表牵挂,给对方回应的空间,例:「以上便是我的近况,也很想听听你那边的生活 —— 新换的工作是否适应?周末是否还像以前一样喜欢去公园散步?期待你的回信。」 1.4 祝颂语 用凝练的语言表达祝福,是正式书信的「礼仪收尾」。正文最后一段下方空 2 行,整体偏右书写(不用完全右对齐,比正文左边界靠右 2-3 个字符即可,美观不呆板)。 1.4.1 格式与正式用语 通用正式款(推荐,适合多数朋友): 第一行顶格写「顺颂」(或「敬颂」),第二行写「时祺」(时祺意为时时顺利,中性不挑场景); 完整示例: 顺颂 时祺 最正式敬重: 第一行顶格写「此致敬礼」 完整示例: 此致 敬礼! 注意:不要把祝颂语写在一行(如 “顺颂时祺”),分两行写更显正式。 1.5 署名日期 先写署名,再写日期,日期在署名正下方。 署名:正式且让朋友一眼认出,例:「你的朋友:XX」(“XX” 写你的全名 / 朋友平时叫你的名字);若关系近,可简化为「XX」(直接写名字)。 日期:通常与信头日期保持一致或接近。若为不同日期,以文末署名下的日期为准,它代表了此信完成或寄出的时间。 2. 纸笔选择 2.1 用纸 横排左至右的格式对纸张要求不高,优先选易书写、县正式的。首选横线信纸,米白色/ 浅米色,横线细且淡,不干扰字迹、素色无图案信纸,浅色,无花纹或仅角落有小图案,避免花哨。尺寸选择 16 开,比 A4 小一点。 2.2 用笔 用笔首选钢笔,墨水黑色 / 深蓝色,字迹饱满有轻微笔峰。推荐英雄 616、百乐 78G(入门款,好写不贵)。 横排不建议使用毛笔 / 秀丽笔,容易蹭墨,笔画太粗显拥挤。 3. 邮寄相关 信封可在文具店、邮局或网络购买,推荐「标准信封」(白色 / 牛皮纸色,右上角有邮票框) 3.1 信封写法 收信人信息写在信封中间偏上,顶格写收信人地址(省 + 市 + 区 + 街道 + 门牌号),下一行顶格写联系电话(可选) 寄信人信息写在信封右下角,格式同上。地址、姓名、电话(确保投递失败时能退回)。 邮票贴在信封右上角的邮票框里,国内平信(20g 以内)贴 1.2 元邮票即可(邮局)。 邮寄方式 找「中国邮政营业厅」(地图搜中国邮政即可),工作人员会帮你检查格式、称重,直接投递。 找路边的「绿色邮筒」(标注外埠、本埠,朋友在省内写本埠,外地写外埠),投进对应入口即可(建议白天投,邮筒每天会定时开箱)。 邮编查询 微信关注「中国邮政微邮局」服务号,私信发送 4,会收到一个链接,可在链接中选择详细地址查询邮编。 书信教会我们一种珍贵的“迟钝”。它要求我们慢下来,铺开信纸,让思绪在笔尖沉淀,将匆促的想念酝酿成庄重的文字。每一个字迹的深浅,每一处墨点的晕染,都是当下情绪最真实的烙印,是无法被表情包和撤回键替代的真诚。它不仅仅是与人联系的方式,更是更是一次向慢生活与深度情感的诚挚邀约,祝读到这里的读者朋友们都能够亲身感受书信的独特魅力。

2025/9/13
articleCard.readMore

摩擦起电

物理课讲电荷,一个实验用丝绸摩擦玻璃棒、毛皮摩擦橡胶棒,将其一放在底托上,另一个去靠近,根据吸附或排斥的现象,引出同种电荷互相排斥,异种电荷互相吸引的定律。 老师在台上演示着,玻璃棒在丝绸上快速摩擦。 在有些人眼中,这个用丝绸摩擦玻璃棒这一类动作,甚至所有的棍状物体本身,都是极其富有官能意义上的美感的。于是见到这类动作便露出意味深远的笑容。如果做这个动作的人,在他们心目中被痛恨、或具威严,那么这种笑容就会变成狂笑、浪荡地笑,但在课堂上要忍住,于是就可以看见这样一道风景 —— 或消瘦或臃肿的身躯捂着嘴低着头,眼睛眯成一条缝,身体一阵一阵地抽搐。 而在他们眼中,能由自己做这个摩擦动作,体验至高无上的甘美的快乐 —— 引起他人注意的快乐,就成为了最伟大的目标。 今天阴天,空气粘腻,这个实验很难做成,我想老师也不愿再忍受有些人猥琐的笑,就让感兴趣的同学上来给大家演示。那些人炸开了锅,离那快乐仅一步之遥。 第一位同学抱着对知识强烈的好奇心与敬畏上去了,但他没有成功,于是第二次的机会变得更珍贵。 在眼神传递与恶趣味的互相举荐中,小王自告奋勇,主动起身,大步走上前。他热衷于追求那快乐。激昂与邪魅交织在一起从他眼中闪过。 他接过来玻璃棒,把丝绸裹在玻璃棒前端,把玻璃棒顶在身上,面向全班同学。那些人终于控制不住自己的笑声了。 小王此刻握住的仅仅是玻璃棒和丝绸吗?听着耳边的笑声,握住了自豪,握住了与他人的联结,握住了自己的人生!自己是站在教室里吗?站在聚光灯下! 实验在喧闹中开始,他上下运动着丝绸,快速摩擦着。他们终于看见自己津津乐道的那个动作。 在实验中,小王的生命升华了,他的实质已经和班级里的同学异常遥远,不能再回到这个脱位的现实,只好暂时沉溺在自我中,感受「自然科学」的魅力。 扭曲的笑声还在耳边回响,兴奋的余波还在心里荡漾。老师的一声呵斥把他拉回了这个已经不属于他的现实,那美好的幻想离他而去,但余味已经在他的脑海反复品尝起来。老师的那声呵斥应带来的羞耻感在他心中从来没存在过。 欢声笑语里,小王看着周遭同学们的表情,看着他的朋友们的表情,看向他后座的女生,感受着课堂微妙的气氛。一种他所追求的前所未有的甘美流淌在心里。对小王来说,没有比这感觉更能使他陶醉于其中的了……他细细地品尝着这股甘美,仿佛闭上眼睛就能看见五月灿烂盛开的鲜花……小王靠着自己的行动吸引了人们的目光,但这目光里藏着什么,对他来说都不重要了。

2025/9/12
articleCard.readMore

罪恶感

每年的春秋,我都会被极其严重的过敏性鼻炎折磨。 长期的睡眠不足,以及永无止境的其他方面的折磨,让我的记忆力和逻辑能力衰退;红肿流泪的眼睛,看周围的一切,唯一的区别只有颜色不同。现实与我从感官上隔绝开了。 周日傍晚我给母亲发消息,说明天要请假,我快要死了,不能去上学了。晚上父亲拉着我去了趟医院。回来后得知已经请完假了。 早晨五点多惊醒,意识到自己今天不用上学了,但已经醒了,再睡去就很难了,面朝哪个方向,只能听鼻子的,我躺在床上看着外边蒙蒙亮的天,一种难以名状的感觉 —— 我愿称之为罪恶感涌上心头。 我确确实实地请假了,我确确实实地在早上七点多不能再入睡,起床了,我确确实实地头脑发昏,我确确实实地低烧了。一切都是那么正当,一切都是那么合理。但那股罪恶感始终在我心头萦绕。 昨天去医院的时候我在手机上写下了这几段文字: 我于前往医院的路上,写下这些文字。如果再不倾诉,我将会在路上随机杀掉几个人,或者杀掉最令我痛恨的人,然后自杀。 自入秋以来,过敏的痛苦如影随形地折磨着我,无论我身处何处。 旁人看来,只是得了一个长期的感冒,我首先要杀死的就是这种人。视他人苦难如秋风,任它从耳边划过。在他看来这秋风习习,霜叶飘零,一派凄寂唯美;在我看来,这秋风是该被杀害、分解、扒皮饮血、敲骨吸髓的恶畜,是该被杀死的、是苦痛之源! 自九月份以来这短短十七天,我所言次数最多的话语,除泄愤诅咒他人的污秽之语外,就是『我脸上的每一个洞都在漏水』。 我脸上的每一个洞都在漏水! 一天二十四小时,从何时开始算才是明天?十二点?日出?这个分解是极度模糊的。我看不到时间,我常常在深夜被最原始的,对死亡的恐惧、对窒息的恐惧惊醒。我床边没有任何能让我感知时间的设施,只能从脸上眼眵的覆盖程度,以及喉咙、眼球的疼痛程度,粗略判断现在是前半夜还是后半夜,然后在床上挣扎等待那恶畜放过我,让我入睡。 六点在昏胀的头痛中,准时起床进行洗漱,脸上永远是黏黏糊糊的,有封住眼睛的眼眵、过敏淌出的眼泪、控制不住的鼻涕,伴有鼻孔撕裂般的疼痛、张嘴睡觉流出的口水。脸上永远是黏黏糊糊的,怎么清洗都如此。及时这样,也要在十分钟内洗漱完,冒着被呛死的风险洗脸,冒着被憋死的风险刷牙。 那时还没定下来要请假,我被这种不确定性,或者说是不安感折磨着。终于如愿以偿请假,还不能在家里安心休息,反而继续被罪恶感折磨。 随着年龄的增长,随着年级的增长,每一次请假的罪恶感都会增强。 这种罪恶感来自我的同龄人们都在学校上课,我在家里睡大觉、看闲书。但这是理所应当的,我生病了。这不是理所应当的,我会落下很多进度。 这种紧张的氛围从开学第一天就开始渲染了,那天召开了年级会,会议精神可以粗略概括为初三是决定人生的一年、这是人生的一个转折点。 去你妈的吧。 又谈起人生,说大话。比起什么腰缠万贯、名利双收、坐办公室吹空调、走上人生巅峰等狗屁,回首十四年,我突然觉得我今天得以存活在这个世界上都是巨大的奇迹。我的母亲没有早产,我出生的时候没有染上大病,我幼年没有被温泉淹死,我没有在那次摔死,我没有磕得头破血流、粉身碎骨,没有在某一时刻从那个完全是为人自杀而准备的教室的窗户跳下去,真是奇迹。 每一次请假,我都感觉现实远远离我而去了。有时候它也会停下脚步等着我,但已经不是真正新鲜的现实了。我与今天上学的同学们是割裂的,我与在外上班的父母是割裂的,我与外边的世界是割裂的。我今天没去学校,但秋天恶心的阳光还是沐浴着校门口刻着校训的石头,从早晨睡到放学的那个人从来没醒过,教室空调后面的虫子依然在蠕动。时间依然在流动,现实依然在奔腾着离我而去。 初秋的天空湛蓝的可怕,从夏天延续到现在的虫鸣清晰可闻。 这太不真实了。

2025/9/8
articleCard.readMore

三岛由纪夫 —— 文化和时代背景塑造的矛盾体

三岛由纪夫,一个伟大的小说家、一个迷恋死亡的疯子、一个狂热的右翼分子。 这个月四日,在《丰饶之海》四部曲后,我收到了这本由约翰·内森编撰的《三岛由纪夫传》。当时我的心情是无比激动的,因为我马上就要触摸到这位伟大作家的人生一角,一个鲜活而丰满的三岛即将展现在我眼前。 今日九点至十六点,在之前阅读《金阁寺》、《潮骚》、《仲夏之死》等作品所催生出的崇拜感、以及对他人生的极度好奇心和窥探欲的驱使下,一口气读完了这本书。读完后,刚拿到书的那种激动荡然无存,取而代之的是一股怅然若失,一股意犹未尽…… 三岛由纪夫,本名平冈公威。其童年经历奠定了他情感丰富的内心,强势的祖母对他的控制欲使他受尽压抑,催生出一幅「假面性格」。为了减少母亲的焦虑,在母亲面前极力隐藏真情实感;为逃避现实的苦痛,投身于幻想和文学中;环境造就的早熟,让他在文学界崭露头角 —— 这是我个人对三岛童年时期的概括。他对鲜血、暴力等元素的追求和逃避现实的幻想,让我想起《金阁寺》中,沟口的心里活动: 倘使我是个结巴而寡言的暴君,那么家属们窥见我的脸色,就会终日战战兢兢地生活。我没有必要用明确而流畅的语言来使我的残暴正当化,因为只要我寡言就可以使一切残暴正当化。这样,我总乐于幻想把平日藐视我的教师和同学一个个地处以刑罚。我还乐于幻想我成为内心世界的国王,成为冷静观察的大艺术家。尽管我表面很贫穷,可精神世界却比谁都富有。 此处的心里活动定是三岛童年时期的写照,也符合三岛自己所言:「我不会描写自己没见过的事物。」 公威的祖母夏子对他的管控是极其病态的,从小只允许他与稍年长于他的女性玩耍,禁止一切带有危险性的或可能发出噪音的玩具出现,以及禁止公威出门,这一切都在潜移默化地塑造着他的「女性气质」。而童年时期异性过度的陪伴、对希腊古典美学的痴迷,也是影响三岛对男性健硕肉体的向往的重要因素。 三岛的人生可以分为前中后期三个阶段。在出生及《假面的告白》发表前,可以作为前期,这个阶段他表现出文学方面的天赋。而同《告白》可认为是其半自传体作品的《镜子之家》,作为中期和后期的分界,《镜子之家》已经表现出令人不安的对死亡的美化和向往,为《忧国》等风格近似的作品奠定了基础。中期的《金阁寺》也是日本文学中浓厚艳丽的一笔。 他是时代和文化背景造就的政治疯子,但无论哪个时期的三岛,在文学上所表现出的能力及建树,是绝对成功且伟大的。三岛是战后日本青年信仰崩塌影响的极端化,其童年家庭环境,以及当时三岛学习成绩优异,考试排名榜首,天皇亲自为他颁发银手表,都在为其后来的闹剧扇风点火。 三岛自杀的真正原因众说纷纭,我认为这是多方因素共同影响造成的。文学界,三岛多次翘首盼望诺贝尔文学奖颁给自己,他太想要这个奖了,而导师川端康成先获诺奖,这或许让他感到绝望,在汽车里沮丧地说「他们未来十年也不可能颁奖给日本了」也可以作为此观点的有力证明。 政治方面,三岛所崇尚的「武士精神」,和「为天皇赴死的光荣」高度重合。曾多次试图加入军队的经历可以看出他野心的流露,但日本战败、丧失军事主权的现实让他一度陷入绝望和挣扎中。所以他召集和他同样有野心的右翼军国主义残余,组织了私人武装,整日演练与假想敌,也就是可能危及天皇安全的左翼发动的暴乱的战斗。最终还是做起了日本右翼至今矢志不渝的修宪大梦1,发动兵变,最终上演切腹自尽的闹剧,实现了一直所幻想的「英雄式的死亡」,完成了一场荒诞的政治表演。除「盾会」活动外,三岛还发表了著名论著《文化防卫论》,其中观点可粗略概括为「天皇是日本文化的源头以及守护者」,体现其拥护天皇的思想。 在文学方面,他无疑是非常成功的。华美的词藻几乎穷尽人类语言能够表达的全部,而政治方面,其在文学上流露出的对死亡的美化、迷恋、向往成为了三岛通向兵变之路的最后一块砖。我为如此杰出的文学家死得竟这样荒谬而感到惋惜! 读完此书,曾经的一个完美、伟岸的三岛在我内心崩塌了,而一个更加丰满立体,具有多面性的三岛形象又在我内心被建立起来。优雅的、自律的、伟大的才子;极端的、荒谬的、病态的疯子……三岛啊!你的生命被自己迸发的才华之火燃尽了吗! 第九条【放弃战争,否认军备及交战权】 1.日本国民衷心谋求基于正义与秩序的国际和平,永远放弃以国权发动的战争、武力威胁或武力行使作为解决国际争端的手段。 ——《日本国宪法(暂译)》 ↩︎

2025/9/6
articleCard.readMore

写在九月的开头

又到了喜闻乐见的结算环节,其实这篇文章是想写给这个暑假的,但标题起作「暑假总结」,总感觉非常掉价。 今天是九月一日,全国大部分省份都开学了,天津因上海合作组织峰会,延后开学,所以我今天才能在大下午,悠哉悠哉地坐在电脑前写总结。 旅游 这个暑假过得真的是非常的宅,爸妈硬拉着我出去玩,我还写出了一篇负能量满满的游感,可见对于这种耗费精力的事情有多抗拒。 如果是去一些自然景观、有人文历史可探究的地方,我还是很提倡的,但花了小一千块去游乐场玩,不觉得多有收获。 除了按时出去上素描课以外,我几乎很少再外出活动了。体育中考应该能靠在学校的锻炼拿点分吧。 其实我也比较向往出去玩。尤其是看了《二零二五 - 六七月读书随笔》这篇文章。但是我想自己一个人出去,或者和同学出去。总之,绝对不会想和家人一起,最后的结果一般都是谁也不开心,简直是负担。 阅读 这个暑假我一直在读日本文学。从我的 Obsidian 备份仓库的 git 提交里可以看到一开始计划的书单,大概是七月初: 📚书名 👨🏻‍🎓作者 🖊️字数(千字) 🔵状态 白夜行 【日】东野圭吾 474 已读完 金色夜叉 【日】尾崎红叶 277 已读完 解忧杂货店 【日】东野圭吾 218 未读完 我是猫 【日】夏目漱石 307 未读完 呼啸山庄 【英】艾米莉·勃朗特 325 未读完 堂吉诃德 【西】塞万提斯 826 未读完 窄门 【法】安德烈·纪德 66 未读完 百年孤独 【哥】加夫列尔·加西亚·马尔克斯 262 未读完 知道分子 【中】王朔 270 未读完 但现在的状态是这样的: ## 七月 - [x] 《白夜行》东野圭吾 - [x] 《解忧杂货店》东野圭吾 - [x] 《金色夜叉》尾崎红叶 ## 八月 - [x] 《仲夏之死》三岛由纪夫 - [x] 《潮骚》三岛由纪夫 - [x] 《金阁寺》三岛由纪夫 - [x] 《伊豆的舞女》川端康成 ## 九月 - [ ] 《雪国》川端康成 - [ ] 《罗生门》芥川龙之介 - [ ] 《知道分子》王朔 - [ ] 《活着》余华 - [ ] 《生死疲劳》莫言 我承认,《百年孤独》现在对我来说实在是太难了。《雪国》,八月三十一日已经看了一半了,就先把它放到九月的书单里吧。 《伊豆的舞女》有一篇读后感,当时正好在电脑边读完了。有感而发,立刻写了一篇。实际上我不太擅长写这种类型的文字,算是文学评论吧。 八月份读了整整三本三岛由纪夫的书,那本《仲夏之死》其实也是短篇小说集。我对三岛文字的印象就是相当地妖艳。刻画人物心里的挣扎和思辩非常细致入微,简直到了变态的程度。他对行文节奏和结尾留白、以及意象的运用简直炉火纯青,用词也非常华丽但有分量,甚至让我读着读着浑身起鸡皮疙瘩,非常喜欢三岛由纪夫的文字。 我在初读《金阁寺》时,有不解的地方,在读完后查阅了大量评论和解读,再回头去看里面的一些情节和描写才有了自己的一点粗浅的理解。为什么说三岛的文字妖艳呢,就是因为你越读,越会陷入角色的思考和情绪里;越不懂,越撩拨着你的心,去研究,体悟那种独特的风格。找时间一定要再看一遍。 川端康成与之相比就是一种细腻柔和的美,这种切换让我有点不适应。三岛的叙述手法是一种标准的小说家的手法,讲故事的手法,但川端康成是在展示日常的细节碎片,用这种手法把读者一下子拉入到情节中,节奏比较缓慢,像流水一样,虽然潺潺流过,但把手指伸进去,能感受到水流湿滑的触感和阵阵沁人心脾的清凉。 东野圭吾的两本书,《解忧杂货店》可以称得上是无聊的。关于《白夜行》,我对推理题材没有想象中的那么感兴趣,或者是没有读到合口味的书,只能说悬念环环相扣,但节奏比较拖沓,看得很心急。 《金色夜叉》和《潮骚》又让我对爱情有了新的感受,前者权衡爱情和钱财,揭露批判拜金,后者则是纯洁美好的初恋,很「不三岛」的一本书。 另外,在图书馆读了四十页的《喧哗与骚动》,为什么记得这么清楚是四十页?因为是真煎熬啊!太难读了!现在还不适合我,但早晚有一天我要带着更高的阅读能力和文学素养,征服这座高山。 除了书,我也经常用博客圈子提供的随机访问网站,找几个博客读一读,有喜欢的就加入到RSS订阅。 博客 暑假里我写了几万字,平均四五天更新一次。由于开学时的博客大部分都是在写学校遇见的烂人烂事,放假前还会担心,在家里闷着是不是没有什么东西可写?事实证明并不会。 这两个月我换了不少主题,也自己写过一两个主题,最后还是没能用下去。挑来挑去,最后还是选择了以前用 Hexo 最喜欢的主题的 Hugo 移植版(不太清楚哪个博客程序的才是本家) —— Maupassant. 大刀阔斧地砍掉了很多功能,模仿 Typecho 的默认主题,添加了暗色模式,看起来舒服多了。我对目前的主题非常满意。 对永久链接格式也进行了几轮改革: 1. /post/技术/* => /post/tech/* /post/随笔/* => /post/jottings/* /post/读书/* => /post/readings/* 2. /post/tech/* => /posts/tech/* /post/jottings/* => /posts/jottings/* /post/readings/* => /posts/readings/* 3. /posts/tech/* => /posts/* /posts/jottings/* => /posts/* /posts/readings/* => /posts/* 第一次为了去除又长又蠢的链接,把汉字改成了英文,第二次突然发现post是不是要用复数更恰当?又改了一次。第三次发现目录嵌套有点深,就把第一次改的分类名删掉了。 真是想到什么就做什么啊。 为了SEO权重考虑,废了很大力气调试vercel.json的重定向,好在大部分页面都能正常跳转了,以前的水文我也不打算处理。 画画 这是我临摹的在知乎上找到的一张图,来源已不可考。佩服那位大佬的能力,这种画面风格再给我十年我也达不到…… 这张来自我很喜欢的一个博客「極客死亡計劃」网站顶部的一张图。 凭印象画出的《夏日残影》结尾提到的那只鸟。 最后 总结一下,不就是两个月都窝在家里看书画画吗!化学也没学,物理数学也没学…… 到现在为止连暑假作业都没完全写完。 希望开学以后,依然能保持现在这种心态吧。 封面图作者为Dan Black, 来自Unsplash

2025/9/1
articleCard.readMore

「我害怕死」

我十三岁那年和父母说,以后就不过生日了。 那时候我惊奇地发现,每过一次生日,就代表那可怜的生命正式少了一年。又向终点迈出了蹒跚的一步。 最近有一个朋友一直在和我聊他对死亡的恐惧,特别是对死亡后意识消散的恐惧。我能理解这种作为动物,对死亡最原始最本能的恐惧,被时间推着走向死亡的无力感。随着阅历的增加,出现对存在和死亡的思考是正常的。 但我不是很能理解,小小年纪,九月份就上高中了,想这个干嘛? 他的问题是:「既然人最后意识都要消散,为什么要去做那么多事情?」 感觉他会提出这个问题,离某些危险的思想已经不远了。一定要在这个阶段性的迷茫中,阻止他向深渊滑落。 我分析并提出了三点: 太闲了,闲下来就容易想东想西,但不否认这种思想活动的积极意义,总比稀里糊涂过一辈子强。 比较空虚,找不到意义或「价值感」。建议找一点喜欢的事多做做。 是不是看了什么不该看的东西?看了什么理解不了的作品走火入魔了? 然后,他提出了一个有点噎住我的问题: 「什么是有意义?」 「意义是怎么定义的?」 这个问题在之后的讨论中都没有得到让双方都信服的解答。我自己的观点是:让自己有「价值感」,就是有意义。 应第二点,就是找点喜欢的事。喜欢旅游就旅游,喜欢画画就画画等。但是这件事对他来说有难度,因为他根本不知道自己喜欢什么。 据回答,他的活动除上学外,就是玩两个固定的游戏,看一个视频软件,用社交软件聊天。 我给他的建议是,读一读史铁生的文字,应该能从那里面找到一点答案。但是他对看书没什么兴趣,上学了也觉得没有时间看书。所以最后还是建议写作。把思考、观点、疑问全部写出来,让这些情绪有一个出口。 但当时凌晨十二点,没有那个精力了,困得说话都有可能不通顺,只好作罢。当时延伸探讨了一些细节可以作为他文章的题材,但直到现在也不提起写东西的事,我也不便再追问,可能对写作兴趣也不大。 但从讨论中也可以梳理出一些东西。 他:我害怕死 我:你往深了想想,为什么害怕死? 他:我害怕意识的消散 我:为什么害怕意识的消散? 他:不知道。为什么呢? 他:因为人生太短了、太有限。 我:你为什么会担忧人生的长度?你还有什么想做的事情吗? 他:因为,我所有的一切消失得太快了,我想让他们一直在我身边,我想一直思考。我想一直拥有意识。 我:他们里面,谁最重要,为什么那个人你觉得最重要? 他:我的家人最重要。 我:你拥有意识,想一直保持思考,思考什么? 他:可能是基本的生命活动,说白了就是我想活着。 我认为,他可能有濒死的经历,或者有对他打击很大的亲人去世事件。前者被否定了,但后者确实有,我们刚认识的时候,他家中有一位老人驾鹤西去,他非常伤心。那件事可能是思考死亡的启蒙,但他无法完全消化这种悲痛的情绪,或者缺乏引导,所以就成了一个创伤。所以这件事在我们讨论的时候就不太方便提。 这种「怕死」和纠结,也有好的一面。起码不会做出某些过激行为,总体上人是比较稳定的。但这已经属于内耗而不属于思辩了,已经有强烈的恐惧甚至是焦虑情绪在里面,这样下去精力迟早要消耗殆尽。 他可能缺失对生命的除必然走向死亡的额外感受,生命对他来说可能是一个泛泛抽象的概念。如此恐惧死亡,恐惧意识的消散,用人话讲就是「没活够」,这种情绪多数源于时间和生命如此真实,但自己却没有掌握住的空虚感。所以我主张找点事做,把时间和生命从游戏和视频手中夺回来。进行长时间有深度的活动后,获得的成就感,就是意义所在。有意义感,就是存在的意义,就是「做那么多事的意义」。 所以开头的问题,显然有一个错误,那就是:站在终点回头看。 我觉得,一个七八十岁的老人这么想是没有问题的,因为他们已经有了足够的阅历,支撑的起这种回望。但一个十五六岁的小伙子,这么想就会走火入魔。当你试图站在终点回望,你就会发现大段大段的空白,无法找到真正可供观赏的,有价值东西,从而就会生出这种疑问,引发思辩。甚至由于当前的思想境界无法完成这样的思辩,引发无意义的内耗。

2025/8/30
articleCard.readMore

文字所承载的东西能跨越时空

模糊 文字永远只是形式,而文字所承载的东西,才是可以跨越时空的存在。 —— 爱的成文诗 | 莫比乌斯 跨越时空这个词,我第一次读来愣了一下。有一种「念天地之悠悠」,发觉自己渺小的感觉,但「独怆然而涕下」到不至于,因为我还没有那么有才华,到不了怀才不遇的悲怆。反而是一种模糊的,缓缓流动的感伤和无奈。 不用说十四年,两个月前的记忆都是模糊的。我写的一篇类似日记的文章《人生中第一次大考》记录了我在会考那一天发生的事。整篇都流露着一股淡淡的死感1,和现在的情感差异比较大,主要还是上学导致的。 现在想想,那天发生的,只有几个画面和模糊的感觉,比如我在车里看到站在外面被太阳暴晒的同学、还有那天真的很热、考点教室很干净。都是不连贯的一幅一幅画面。不过还是要感谢当时的我,写下了那些文字,不然今天连可供回忆的素材都没有。我现我还记得《爱情公寓》里,有角色说过这样一句话,好像是曾小贤吧: 「能证明我活过的就只有沙发上的屁股印了!」 可惜,我房间里还没有沙发。但是我在网上无病呻吟了很多文字2,应该能保存一段时间,证明我活过。我以前也比较喜欢在朋友圈发点东西,但那些表述相对浅显。而且一旦有确切可预测的「观众」,就难以避免地带有夸张和表演情绪,但喜欢在朋友圈表演,也是自我的一个阶段。 现在 说真的,可能是我的社交圈子问题吧,我当初就不太应该加那么多人的微信。我感觉我的朋友圈里有不少不太正常的人。 虽然扫一扫在右上角的加号也能打开,但是我还是留下来了,因为我怕我手贱去点设置,打开朋友圈。虽然打开了也无妨,我已经完全把朋友圈这个功能封闭起来了,不看任何人的朋友圈,任何人不能看我的朋友圈。能减少很多看别人营造出来的完美生活的焦虑。 我最后一次发朋友圈是在七月三日。近一年左右,我很喜欢发画。手绘,板绘,甚至是一些画得很垃圾的速写。还有一些博客的文章,我会把阴阳怪气,又或是直抒胸臆骂老师引起公愤行为的文章贴在朋友圈。也许没什么人看,但是看的人,应该会觉得出了一口气吧。 现实中也有几个同学知道我的博客,有一位还在我当时证书到期的时候提醒过我,甚至跟我探讨过文章里的内容,也许他最近还在看我的博客。从之前网站出问题的时候他发现并提醒,可以推断出他大概是有看这个博客的习惯的。 记录 一切记录都是有意义的。无论是朋友圈、说说,还是一篇日记,一篇长篇大论的文章,一切记录都是有意义的。 我最近在构思博客一周年的总结文章,但还有两个月才算狭义上的一周年。但我前两天跟一位朋友复盘过我们的聊天记录,他所保存的最早的,有关「博客」这个关键词的聊天记录来自2023年9月10日,我当时搭建好了一个网站,邀请他来看看。但当时我还没有什么写作能力,搭建完了就搁置了。虽然现在也没有写作能力,但是起码能人模狗样的把话说出来。 他把聊天记录转发过来的时候,我很震惊,因为23年9月,我刚刚升入初中。 一切主观的记忆都是会随着时间的流逝,和自己的反复咀嚼、品味而被篡改的。关于23年9月搭建博客的记忆甚至没有模糊的过程,直接就被忘却了,需要提供一个锚点来回忆。我使用了那个域名作为「锚点」,那是一个国外托管网站的免费域名,于是我借着这个,回想起了一个模糊的,甚至是第三人称的画面,也有当时的感觉:对这件事一知半解,觉得有点难。 那是唯一在我大脑中保存下来的回忆了。 另一个让我震惊的事情是,我印象中我是在2024年11月,才开始了我认为能被称为博客的写作,但23年就有记录。当时我用的是Gmeek3,把语文作业里写的自认为不错的小短文贴上去了,那篇文章还被老师表扬了,说是很有感染力。具体写的是什么已经无从考证,但是我印象中有一句话:「夕阳是太阳的尸体。」这种悲观甚至有点中二的看法,竟然会被老师表扬。于是这个事成为了我对「写博客」相关回忆的锚点。但很可惜的是,那篇文章已经因为几次博客搬家丢失。 回看自己写的文字,是一个重视自我的过程。可能会从中看到这中二、偏激、幼稚、尴尬、羞耻,一旦有了这些情绪,那就证明自己是有进步的。我认为这也是文字的优越性。无论是什么样的自己,都有亲手记录下的价值。 这也是证明「我是我」的一个手段。 怎么才能证明我是我?是我的长相,还是我的穿衣风格,还是我的人际关系? 我觉得是我写下的这些文字。 无论是偏激的,还是幼稚的,都是当时自己意识的速写。脸可以被毁容,也可以整容;夏天穿短袖,冬天穿长袖;毕业了同学就几乎没任何联系。只有文字才能证明「我」的存在,它是一个人流动的意识和思想的直接抽象。比其它形式更入木三分。虽然根据开头所引用,文字只是形式,但它承载的飘渺却又厚重的东西,对每个人来说都是独一无二的,是一场与自己跨越时空的对话;而在别人看来,每一个字符都是作者精神的直接投射,能从一篇篇文章中拼凑出完整的形象。 非医学意义。 ↩︎ 目前已经在此博客唧唧歪歪了85173字。 ↩︎ Gmeek,一个完全基于 Github Pages、Github Issues 和 Github Actions 的个人博客模板。详见 https://github.com/Meekdai/Gmeek. ↩︎

2025/8/29
articleCard.readMore

《伊豆的舞女》读后感

我读的这本《伊豆的舞女》是一页文库出品的川端康成短篇小说集,共选入十篇。依照顺序分别为:《伊豆的舞女》、《油》、《篝火》、《春景色》、《温泉旅馆》、《抒情歌》、《禽兽》、《母亲的初恋》、《朝云》、《「燕」号列车上的女孩》。还有作者自序和三岛由纪夫作的序。 《伊豆的舞女》这一篇的内容是一位高中生为排遣心中难以言喻的苦闷,来到伊豆旅行,遇到江湖艺人,并对其中的舞女产生了恋慕之情。采用川端康成擅长,也是风格的日常碎片拼接的手法,用一件件小事体现出「我」对舞女的爱恋,一直到最后离别的过程。 这篇故事从头到尾都流露着一股淡淡的阴郁和忧愁,而文章末尾写道的眼泪流尽后品尝到的「甘美的快乐」,我认为是文章的中心和精华,通过日常小事到离别,体现出日本文学中「物哀」的精髓,也就是对世间生命、感情无常的深度共情与审美升华。 由对舞女的感情和离别,引申出一系列复杂的情感体验。途中,薰子一句“您真是好人啊”的纯真评价,让他首次感受到被接纳的温暖,脱离出孤儿身份的长期忧郁,结尾的泪水冲刷了长期积累的沉重的阴霾,代之以甘美的轻盈。与熏子因阶级、年龄差异注定无果的恋慕之情,本应导向沉重的痛苦,却被升华为短暂而珍贵的体验,是物哀美学的核心体现。 话虽然是这么说,但我们尊重不同的观点,豆瓣上有些读者认为这个故事充满「男凝」,我表示不理解,拳师特有的观点吧。草木皆兵,一切都是父权社会男性对女性的压迫!她们看《温泉旅馆》,不会又觉得物化女性吧? 其中《温泉旅馆》写当时社会底层女性奔波辗转的劳苦命运,《油》深入剖析「我」对丧失父母之爱情在油上的转移和投射,但这几个故事里我印象最深刻的是《朝云》,故事讲述了一个女子学校的学生对一位女性老师产生崇拜的唯美故事,说它是百合也不为过了。我在一个日语网站看到对这个故事有这样的评价,应该是出版商的标语之类的: 恋はあまりにも、幻影だった。 日本文学史上、最も純潔なる青春少女小説!! 大意是:爱恋太过于幻影了。日本文学史上,最纯洁的青春少女小说!! 恋这个字在日语中特指 恋爱之情、爱慕之心,尤其强调 情感萌动阶段的心动、憧憬或单相思,比中文“爱”更轻盈,带有青春期的纯粹性与虚幻感。这正是我喜欢这个故事的原因。作者把一颗懵懂的、纯粹的,对美好向往的心写活了,一个含蓄多思的少女形象跃然纸上。 而纯洁,就在于没有到肉体层面,对美好的向往和肉欲是完全不同的两个方向,节选两段可以感受一下: 当时她似乎也是打宿舍出来,我低头和她擦肩而过,因为她并不了解我的心事。其实我根本不用低着头,想看就看好了,尽管这么想着,但我到底没敢抬起头来。然而,她那穿着毛衣的可爱身姿使人感到她仿佛是个同我们年龄相差不大的姑娘,我因这一浙大的发现震惊不已,看来,自己内心的某些东西觉醒了,那就是所谓的青春吗?我也逐渐成为和她一样的“姑娘”了,我心中充满喜悦,一双眼睛贪婪地偷偷瞅着她,同时又看看自己,在她的诱惑下,我迅速成熟了。 尤其是最后一小段:贪婪、偷偷,这种色彩的词语在当前的语境下,能传达出一种热烈又真切的爱慕与向往,向往到什么程度呢?想「成为」爱慕的对象,这是对理想自我的精神投射,承载着自我认同的焦虑。 能从节选片段中感受到川端康成的语言特点:细腻、情感丰富,善于用各种细节和心里描写塑造人物的真实的性格。细腻到像主人公,一个少女站在读者面前,摊开自己的日记,把各种大事小事无一例外地仔细展示给读者,就差亲口朗读了。 而在毕业典礼上,菊井老师在逃避后又写下的「祝你幸福」,以及对幸福究竟是什么这个问题的解答更是耐人寻味,解读空间很大。 「我不认为幸福是各种各样的。」 真正的幸福究竟是什么样的?

2025/8/21
articleCard.readMore

阴云

八月变化无常的天气又使大地被一层阴霾笼罩,昨夜刚下了一场暴雨,空气弥漫着潮湿的腥臭。公交车站边有一个老妇领着一个四五岁的小女孩,她背着一个小书包。那老妇是她的奶奶。 小女孩生性活泼好动,总是说个不停,跑个不停。她的书包上挂着一个金色吊坠,随着她的脚步一颠一颠的,即使在阴云下也能映出金光。她满怀好奇心地对这个世界角落的细节发问,燃起求知的欲火,被奶奶敷衍的回应无情浇灭,我看到一缕黑烟从那小女孩头上飘走了。 我和她们在等的是同一路车。那两人坐在靠前的座位上,我正前方是一对母子,那人背着一个大包,不能直直坐在狭窄的座位里,只好斜靠在母亲的肩头。可能是出于疲惫,不久就睡去了。站在车门口的一群中年大妈七嘴八舌地谈论着好像是邻居的人物。 过了一站,又一个老妇领着一个小男孩上车了,二人坐在我旁边的一列座位上。那小男孩约莫七八岁,上身穿着印有队名的足球队服,下身穿着短裤和长筒球袜,没有穿球鞋,是一双运动鞋。他身上流露着这一带的足球小子特有的野气。 他一坐下来就吵嚷不停,不停地在座位上扭动。结结巴巴地,用跌宕起伏得如驼峰一样的语调,和家长无礼地争论以前到底有没有来过这里,卖弄着自己的个性。声音大到全车人都听得清清楚楚。 「你自己看…不不就…知..知道了吗!」 「你看吧,我就…就说…来…来过呢!」 他们两个人坐的座位,上一任主人是一对情侣,腻腻歪歪了几站就下车了。前面那人把脸深深埋进他母亲的怀中。我望着窗外,看着阴云下飞奔而过的楼房。车走走停停,人进进出出。下一站,就到目的地了吧,我想。 我独自一人下了车,回头一望,那书包上吊坠反射的金光已模糊在迷乱的车流中了。

2025/8/20
articleCard.readMore

别吵了,大家一样烂

突然想起来之前刷到过的一张图,是一个看起来就和蔼可亲的黄豆摊手,配文:「别吵了,大家一样烂」,手里是一圈国内主流的娱乐软件图标。大概有百度贴吧、B站、知乎、豆瓣、小红书等。 不得不承认,大家确实烂,但各有各的程度和地方。就在前几个小时我还说,等我B站六级了就卸载。很快了。 B站 至于为什么我有这个想法,现在还在用B站的人应该都知道,B站和妓院的唯一区别就是,你不能花钱买到肉体寻欢。但是你可以花钱买到擦边UP主的视频,并用以意淫。晚上她们就出没了。 有些B站用户会有一种莫名的优越感,尤其是在一些刚刚从抖音、快手这种平台转到B站的,你可以见到他们一些二级号,说出「抵制B站快手化」此类的展现人类智商情商判断力下限的皈依者狂热现象。这是一种寻求群体认同感所作出的举动。他们认为看B站,就比看短视频优越。大家都是在娱乐,况且真正的优质长视频UP主有几个有热度?大家还不都是点开那个短视频的按钮一直在刷?还是尽早找点事做,不要妄想用个软件就能走上人生巅峰了。 但回归到标题:大家都一样烂。 我认为B站之所以烂,是因为有上文描述的幽默行为。这是评论区中的,弹幕更是看得想让人用头撞墙,比如书名号、并非、「相信咱妈」等,还有「有人吗」、「某年某月某日某时某分有人吗」、「跟我一起看的人举个手」。那个显示几个人在同时看的功能简直是这种弱智的温床。童厕名不虚传。 话说回来,B站确实有不少优质的UP主,但比起用碎片时间学碎片知识,不如静下心来读一本书、一篇文章,或看一部电影。我没有在否定B站知识区优质长视频的价值,但要清楚,频繁的信息切换会阻断思维流,长时间积累就会导致无法深度思考。很多视频只是告诉了观众:「是什么」,而不探究「为什么」,中间很大一部分内容都被省略、简化、剔除了。这也是很多情况下,人们看问题只浮于现象、无脑开喷的原因之一。如果目标是深度研习,在B站找大课看会比所谓的科普短视频有益的多,当然,如果的目标是快速扫盲,看科普短视频无可厚非,问题的重点在于结合实际。 知乎 最近我的新宠是知乎,谈起为什么我喜欢知乎,是因为它能满足我的好奇心,看文字比看视频省力一些。在一些离谱的问题下,会有短小精悍的回怼,比较有意思,在一个问题下,大家讨论的集中度和强度也很高,信息密度大。 但知乎确实烂,盐选的垃圾小故事总是披着回答的外衣恶心人。不过除此之外,没感觉到环境多恶劣,都在友善的阴阳怪气。 豆瓣 我身边的一位朋友听说我刷豆瓣,非常震惊,他一向认为豆瓣和小红书是一个性质,是女拳大本营。在我这里就大错特错了,我可以放一张我豆瓣首页的截图证明。 展开 除了读书就是广告,没有见到过什么女拳或者吵架,环境非常好。可能是因为我一直拿它来看书评。虽然我有点讨厌我的班主任,但还是要举一个她曾经说过的例子。 我们学校对行为规范的管控特别严格,谈恋爱这种事情更是不要想,她带过一个学生,之前跟他交谈中,他一直认为学校里谈恋爱的人非常多,满操场都是情侣。 后来他受到那些所谓情侣的影响,也和班里一个女同学好上了,被班主任抓住,及时熄灭了火苗,但最后他还是坚称:「们学校谈恋爱的真的特别多!」 其实本质上就是他个人想谈恋爱,才会去注意那些情侣。就像一个悲观的人,看夕阳都能觉得那是太阳的尸体,所以自己心里想得东西占比大。这在软件的个性化推荐里体现的就更淋漓尽致了。我的一位同学,对历史和时治有兴趣浓厚,尤其是中国现代史,尤其是「文化大革命时期」的历史。不过具体细节,应该是一问三不知的,他只是痴迷于国家对此言论管控严格,自己却用各种意象指代,那种微妙的刺激的叛逆快感,我愿意称之为政治露阴癖。他经常给我转发一些时政历史之类的短视频,我呢,佩服他的分享欲、求知欲,但对这种狗屁话题根本不感兴趣,也不方便骂他,只好承受狂轰乱炸。 从他给我转发的视频和他的言论看,应该是认为马上第三次世界大战就要开始了……他非常热衷于发表各类偏激评论,却又自以为有主见、学识渊博,很喜欢一些宏大的议题,如民族、政府、国家等。在他经常聊天的那个群里,几个人都凑不出一份入团申请书,他在里面义愤填膺,慷慨激昂地批判国内外各大事,有趣。有网友调侃这类人:「暑假结束后,国际共运就要陷入低谷。」岂是精辟二字了得。 正如刚刚举的例子,他就喜欢看时政历史,软件一直给他推送,又碰巧国外不太平,总以为要打仗,这两个例就很好的说明了,想成为什么,就会看到什么;越希望什么,就越会看到什么。 大家一样烂,但这不全是平台的问题,一直抱怨平台环境差,多少是因为自己没有进入环境好的圈子,理解了这个概念,所有的平台只是交流的载体和形式的区别了。

2025/8/17
articleCard.readMore

夏日残影

一 “请各位勇士们扣好胸前的安全带。” 一个甜美的机械女声响起。那是跳楼机开始运行前例行朗读的温馨提示。 我从来都对这种游乐园没兴趣,但还是被硬拉来了。我当然不会花钱,冒着危险体验所谓的刺激感。 我们在一个静僻的拐角,弟弟被挖掘机铲土的项目吸引住了。八月醉人的阳光和聒噪的蝉鸣把周围一切事物都裹挟起来了,有时其他游乐项目的方向传来的尖叫刺痛着颅骨。我趴在租赁来的观光车上,望着眼前摆动的树影。 透过树影,看到了一条河,那条弯弯的波光粼粼的水道两边只有两排木栏杆,上面贴着“禁止攀爬”的告示。我向来都一个怕水、怕河、怕海,所以和河湖海有关的旅游提议都被我坚决反对了。 对于一个不会游泳的人来说,生与死之间隔着的,就是这一栏崎岖的木头吧?如果那个人站在了那栏杆旁,生与死就在一念之间吧?那一排木栅栏就是这一念幻化的实体吧? 我感觉花钱体验濒死快感和溺在刺眼的阳光普照的,温暖的河水里区别并不大。但我再怎么争辩,在勇士眼中,也都是胆小者的狡辩了。我看到那澄澈的水面下有一条红鲤鱼。 想得出神,被一阵化学试剂的刺鼻味道拉了回来,转头一看是母亲在往自己脸部喷不知道是什么东西。 母亲的心情一直很高涨,她一直元气满满地对待每一件事,可能是因为有期待吧,她期待晚上九点钟开始的烟花表演。可以说,我们这次来,就是为了看烟花。 母亲的情绪越高涨,我心头那一根根稻草就越发沉重。为了防晒,她捂得严严实实。墨镜帽子黑口罩,活脱脱一个女明星上街的阵仗。 防晒措施越完备,我体内灌的铅就越多。我无法通过她的表情,揣测当前的局势究竟怎样。恐惧来源于未知,但我已经不怎么怕了。 很长时间没见到弟弟,父母在暑假刚开始把他送到农村的姥姥家了,我渡过了安静、平和、美好的一个半月。今天就把他接回家了,图书馆是个逃避的好去处,如果弟弟一定要在家的话。 他终于玩腻了那堆土,我终于不用被囚禁在影子里享受游客的尖叫声了。 二 升空、翻腾,闪耀着。炽热的烟花冲破黑夜的阴冷和浮躁,飞上高空。 但那都不是烟花最美的时候。烟花最美,最为人赞叹的那一瞬,一定是爆裂开来的那一瞬,随即就像欧律狄刻一样,湮灭在寂冷的夜空中了。 舞台中央喷射出的八九道火舌贪婪地舔舐着上方烟花残余的硝烟,一股令人窒息的热浪扑面袭来。 母亲很尽兴,带着满相册的照片上了回家的车,我也很尽兴。 快到家时,后脖上突然传来一阵瘙痒。一抓,竟是一股树叶般的触感——软绵绵无力,又毛茸茸的触感,似乎要被团成一个球了。拿到眼前一看,是一只半死的蛾子,它右边的翅膀折断了,是乱飞,撞到我脖子上的吧。随手一丢,掉在挡把下了,被父亲来回挂挡折磨得奄奄一息。 下了车,拿好东西准备上楼。我落脚太快,被咯了一下,正顾及脚趾传来的阵阵剧痛时,发现脚边有一个黑色的小身影。那是一只鸟。 它立在楼梯的栏杆下边,还睁着眼。见人不跑,我断定它是死了,母亲呵斥我不许动“人家”,我当然没有那么缺德,只是看看。等父亲走上来了,我跟他说了这件事,他用脚碰了一下那只鸟,翅膀挣扎着扇动了一下,但没有飞走。 楼道里昏暗的灯光一个劲儿地倾洒在这只鸟的身体,一片潦草的羽毛插在背上清晰可见。在那惨白灯光映衬下的无神的双眼更显呆滞和诡异,我又想起车上的那只蛾子。

2025/8/14
articleCard.readMore

秋天的第一声狗叫

老家很多人都养狗,几乎每家每户都有一两条狗。 二零年的八月,不知道村口那条老黑狗发了什么癫,流着腥臭的口水就大叫起来,惹得人不安生。村里的老人们都说这叫狂犬病犯了。我还以为狗也染上新冠了。 它这一叫,不仅惹得人不安生,惹得村里那群狗也不安生。家家的狗,无论大狗还是刚出生的小狗,听见这几嗓子嚎,自己也按捺不住了,扯着嗓子嚎叫。它们关在笼子里,锁在屋子里,哪知道外头这声叫有什么意思。毕竟是狗,有人的脑子,狗就该建立文明了,它们只会跟着叫。 可能是出于动物骨子里对环境变化的敏感,村口的那条狗叫了。那其他的狗子是出于什么呢? 之后的四年,每年它们都在八九月份发一次癫。这场群体性的癫狂,是什么引起的;狗叫声意味着什么,没有人知道。那群狗也不在意自己为什么叫,只要听到别的狗叫,自己也叫,就满足了。 今年七号,狗子们又沸腾起来举行它们的“仪式”了。

2025/8/11
articleCard.readMore

未命名

在家太闲,穿着一双比自己脚大的拖鞋,在两个屋子间踱步,想走到窗台边欣赏外面的云时,瞥见父母的结婚照。 那张巨大的照片垂挂在床头正中间,仔细一看,歪了。这很危险,尤其平常睡在床中间的一般是一个不到五岁的儿童——我的弟弟,发消息通知家人照片歪了后,我踩上床仔细端详这张照片。 小时候我一直非常害怕这张照片,尤其是之中的母亲,那邪魅的紫色眼影与眯成一条缝的眼,和夸张的惨白脸色互相映衬,展现出那代人低劣却朴实的修图水平之外,又添了不少令人毛骨悚然的气氛。有一段时间,这张大照片被拿下来,倒摆着靠在墙上,至于为什么又挂起来,已经不记得了,挂起来很长时间了。 如今我又仔细观察起这张令我半夜做噩梦的照片,妆容诡异依旧。父母那时非常年轻,即使窗外透进的阴雨天独有的凄蓝色调的光影打在他们脸上,也丝毫不挡青春的男女散射出闪耀着金黄色的生气与活力。 这真的是我的父母吗?我不由得想。 父亲如今耳朵逐渐不好使,经常独自坐在客厅的桌子前吸烟,用了十几年的玻璃烟灰缸一次又一次盛满烟头。与之相呼应的,是他紧皱的眉头和深沉的目光。他到底在想什么?但每每和他交谈,就会收敛起那副令人一起沮丧的表情。 照片中母亲的笑容,是我至今见过最真切、发自心底的、灿烂的笑容。父亲伸出布满青筋的手在身后环搂着母亲。母亲一头干练的短发下,是一对纯洁、闪着光的眸子。呲着与她灵魂同样洁白的两排牙,真切地笑着。很久不见母亲笑得如此幸福。 虽然修图技术低劣,但照片中飘逸的、喷薄、溢出的幸福是最可贵且高洁的。 如今我仍然害怕着这张照片。它太真了,伸手好像能触摸到父亲脸颊的温度,能触摸到母亲洁白如雪的肌肤,能感受到洋溢在空气中的幸福与爱。 它又太假了,如今我只能看到熟悉又陌生的,养育我十余年的父母的沧桑。 照片中的两个人真的是我的父母吗?

2025/8/8
articleCard.readMore

如何订阅新闻组

新闻组简介 新闻组(Usenet) 是互联网早期最重要、最具影响力的分布式讨论系统之一,可以把它理解为现代网络论坛(BBS)、社交媒体群组或Reddit版块的前身。它的核心特点是去中心化,提供一个平台,让用户可以在不同的主题分类(新闻组) 中发表文章(类似于帖子)。 订阅 如果有Emacs使用经验,可以用Gnus,本文使用Thunderbird。 运行Thunderbird,点击左下角的齿轮。 点击账户设置。 点击上方的账户操作,选择新建新闻组账户。 填入昵称、邮箱等基本信息。 在下一个服务器地址页面填入news.yingyu5658.me,点击确定。回到最左边的标签页。 找到刚刚输入的服务器,选择顶部第二个“管理新闻组订阅”选项。 选好要订阅的组,点击右边一栏的订阅,确定。 在最左边的列表中,右键刚刚填入的服务器,点击收取邮件,每次想要阅读消息时就收取一次邮件。 如果有想参与讨论的话题,点进那个邮件,选择回复组即可。

2025/8/7
articleCard.readMore

最膈应不爱惜书的人

我最受不了的事之一就是我的书是别人看剩下的。 京东上买了一本书,十几块钱。真是贪图便宜了。一拿到手,看到顶部的塑封是开口的,我就有种不详的预感。 我有一个习惯是读书的时候把封皮拿掉,方便携带,手感也好,更不用提文库本这种装帧,主要就是方便携带。但是我发现了: 上一个蠢货竟然企图用胶棒把封皮粘在书脊上。 看吧,反正我是来看书,又不是藏书。我看到了: 塑封被拆,我忍了;书脊被粘,我忍了;书是二手的,我忍了;可是正文里有笔迹,我忍不了。马上拿起手机,打开京东给店铺扣了百字差评,发新书很难吗?检查一下书的状态很难吗?为什么我要花新书的钱买别人看剩下的?真当这里是日本了,文库本看完就卖?对于上一个买家,爱惜书很难吗,最起码正常人不会用胶棒去粘封皮,还失败了吧? 十几块钱的东西,难道我还要花时间和钱退换吗?把这本书退回去,这个店家指不定又发回去给谁了。 为什么我这么气愤,因为我还买了两本书,是在另一个店铺。 什么东西我都能接受买到人退掉的,买二手的,唯独书不行,非常恶心! 最膈应二手书! 最膈应买到这种不爱惜书的人退掉的书! 最膈应不爱惜书的人!

2025/8/6
articleCard.readMore

别闲着没事自搜,黑历史啊

在Bing自搜 今天实在是太闲了,在bing搜了一下我自己的id,结果看到了早期刚建站时的各种黑历史。搜索引擎的缓存还没有消失,已经快一年了。甚至连最早用的第一个域名都挂在上面,但是那个域名现在已经易主了,现在是一个卖赌博机器的网站。估计站长看到有一个很蠢的中文页面还被搜索引擎收录也是很困惑。 这么说来,我这一年的成长倒是挺多,证据就是看到这些东西就像看到自己四五年前发的朋友圈和QQ空间一样羞耻。可是前者能删,但搜索引擎也不是我家开的,只能保证不要经常更换域名和永久链接格式,等着搜索引擎自己移除了,以前分享自己Vim的配置,甚至传网盘,现在都想穿越回去给自己一巴掌。 在BiliBili自搜 我能说什么,我只能呵呵呵。一群娼妓已经把这个网站占领了。在我关闭个性化推荐之前,满屏幕都是赛博妓女。乐器视频底下出奇多。但它们不如妓女,只要坐在镜头前,甚至不开摄像头,就会有人给这种人送钱,妓女起码付出了身体换取钱财,这种人就是典型的不劳而获。用赛博妓女这个词称呼都算侮辱了妓女。 在Google自搜 比Bing收录的内容及时多了,起码不会到黑历史的程度。不过确确实实有一个真正意义上的黑历史,我承认当时的言论过于激进和轻浮了。但我会保持对跨性别群体的看法。 在百度自搜 很遗憾,只有指定site:www.yingyu5658.me才能看到我的站点。 在360自搜 搜yingyu5658没有什么结果,但映屿的权重甚至比那几个卖房的网页还高,在Bing上不是这样的。 在Yandex自搜 Github页面比较靠前,前一阵子在Bing上几乎搜不到yingyu5658.me这个域名,结果都是Github Pages。 看似自搜,实际上是检测各大搜索引擎对自己网站的收录情况,现在国人用的最多的搜索引擎应该是Bing吧,对个人站算是比较友好了,甚至一年前的链接都不下,可能和我之前弃用服务器、更换域名的处理手法有关,但那时候真是什么都不懂,虽然现在也是。 还有一些不知名的小网站收录了我以前写的技术文章,不过也都是老链接,hexo的链接。

2025/8/6
articleCard.readMore

早睡早起的优点

浪费时间。 是的,早睡早起的优点就是可以让我更舒坦、安心地浪费时间。昨天晚上十点十分就睡了,定了一个七点钟的闹钟,准时响,准时起,分毫不差。 醒来后十分钟以内比三点睡十二点起的的不同点就是非常清醒,没有那种昏昏沉沉的感觉。当然,这十分钟,我都在看手机,看着和我没多大关系的群,看着没有人@我的群。 知乎上的回答有了回复,这个和我关系比较大。是昨天宣传新闻组的回复。从床上下来,打开电脑,在电脑开机时,日常显示出问题的时候,打开收手机,刷刷知乎,并提问考虑要不要换到Debian,起码稳定。 在日常打开tty手动重启gdm后,终于可以正常登陆图形界面,打开Thunderbird看了一眼新闻组的消息,多了好几个人的帖子,其中还有一直活跃的老面孔的回复,一片蒸蒸日上的景象。截图发到那个和我没多大关系的群,感叹氛围不错,疑似是互联网现存的为数不多的,沟通建立在互相尊重的基础上的讨论平台,只是因为人少。三个小时后,这个群依然和我没关系,大家各聊各的。又打开粉色视频软件,看大家争吵print和cout到底哪个快、为什么Linux内核开发宁愿加入Rust也不让C++进入。 在手机玩腻了后,我又抱起平板,在厕所里浪费了四十分钟。这就是早起床的好处。占着不拉,低头看电子产品也比舒舒服服在床上看书有吸引力。直到我出来,写这行字的时候,才九点出头七分钟。放在平常做完这一套活后,已经快吃中午饭了,虽然我不会吃中午饭。早睡早起后,时间很漫长。 我还是会坚持健康作息的,我不想再让珍贵的八月像蝉一样短命了,毕竟我还要浪费,有大把的青春年华等待我去浪费。 前天熬到六点多,撑不住睡了三个小时,为了昨天晚上可以在十点钟就上床,把时差掰回来。终于回国了,我现在是中国人,不再过黑白颠倒的生活了。 黑白颠倒也不错,我更极端,因为觉得白天睡觉浪费时间,索性就不睡。从直立猿跨物种变成了熊猫,记忆力还不如熊猫,精神还不如猫。 上次熬夜的记录是四点,那时七月,四点天就蒙蒙亮了,这次在五点才有差不多的亮度,可见夏日的生命力正在衰退,逐渐滑向死亡。 最近正在考虑写一个Android上的新闻组客户端,NNTP协议看起来并不难,做到基础的通信,不会耗费太大功夫。但我不熟悉Android开发。只能尝试用Web套壳写了,比起HTML, CSS, JavaScript,我宁愿去写C。为什么C语言不能直接在Android上运行?哦,可以用Termux,好主意。我会让我内存泄漏得遍地都是的程序污染每一个人的设备的。

2025/8/4
articleCard.readMore

从编译原理到物理原理剖析程序的编译与执行

编译过程 以C语言为例,编译成可执行文件一共要经历:预处理=>狭义编译=>汇编=>链接,最终成为可执行文件。 预处理 输入源代码文件以及其包含的头文件,由预处理器执行展开宏定义、处理,条件编译指令、将包含的头文件直接插入到指令位置,删除注释。 输出纯净的、宏已展开、注释已删除、头文件已包含的中间代码文件,通常为.i。 编写一个简单的程序: #include <stdio.h> #define STRING "Program" int main() { // 打印一些内容 printf("Hello world!\n"); printf("%s\n", STRING); return 0; } 使用gcc的-E选项生成中间代码: gcc exam.c -E -o ./exam.i 他生成了非常长的代码 可以验证预处理器是直接把头文件替换进来的。而代码中类似# 5 "exam.c"的标记用于记录源代码的位置信息,便于调试器和错误诊断程序追踪代码位置。 编译(狭义编译) 词法分析 输入预处理后的源代码文件,有编译器执行词法分析,将字符流分解成有意义的词素(Token),例如: int sum = a + b; 分解成int, sum, =, a, +, b等Token。 语法分析 根据语言的语法规则,将Token序列组合成抽象语法树(Abstract Syntax Tree),简称AST,表达了代码的结构和层次关系。 语义分析 检查程序的语义是否正确,例如变量是否声明、类型是否匹配等。 中间代码生成 将AST转换成一种独立于CPU架构的中间表示形式(intermediate Representation),即IR。常见的IR有三地址码、LLVM IR、Java字节码等,为了优化和转移成多种目标机器码。 优化 对IR进行处理,目的是在不改变程序行为的前提下,提高代码效率。包括: 常量折叠:如计算3 + 5为8。 死代码消除:移除永远不会执行到的代码。 循环优化:如循环展开。 函数内联。 寄存器分配:决定哪些变量存储在高速的CPU寄存器中。 输出优化后的中间代码。 汇编 输入IR,或直接由编译器生成的汇编代码。由汇编器as执行。将汇编指令一对一地转换成特定CPU架构的机器操作指令。处理伪汇编指令,如定义数据段.data,定义代码段.text,分配存储空间space等。最后解析符号、如函数名、变量名等,生成符号表。 输出目标文件,如.o,.obj,包含机器指令、全局变量、静态变量的初始值等、符号表、重定位信息。 链接 输入一个或多个.o文件夹+库文件(静态.a/.lib,动态.so/.dll)。由链接器进行符号解析、重定位、库处理,最输出可执行文件或库文件。 CPU如何识别指令 CPU执行程序的循环称为Fetch-Decode-Execute Cycle(取指-译码-执行周期)。 取指 CPU内部有一个寄存器叫程序计数器(Program Counter, PC),它保存着下一条要执行的指令的内存地址,CPU将PC中的地址发送到地址总线,内存控制器根据地址总线上的地址,找到对应的内存单元,将其存储的指令通过数据总线送回CPU。取回来的指令被放入指令寄存器IR。PC的值自动增加,指向下一条指令的地址。 译码指令 CPU的控制单元读取IR中的指令,控制单元包含一指令译码器,译码器分析指令 操作码部分,操作码唯一表示CPU应该执行什么操作,如ADD MOV JMP等。 根据操作码,译码器决定: 操作的性质(算术、逻辑、数据传输、跳转等)。 操作需要多少个操作数。 操作数存放位置(寄存器、内部地址指令本身中的立即数) 译码器激活执行该操作所需要的CPU内部电路通路和控制信号,结果决定了下一个阶段(执行)需要做什么。 执行指令 CPU的算术逻辑单元(Arithmetic Logic Unit, ALU)或去他功能单元(FPU MMU)根据译码器产生的控制信号执行实际操作。 操作数可能从寄存器文件中读取,或者从内存中加载,ALU执行加减与或移位等操作,如果指令是JMP/CALL/RET/分支指令等跳转指令,可能会修改PC的值,从而改变下一条指令的位置。计算结果可能写回寄存器,或者通过数据总线写会内存。 上述的操作循环以极高的速度(GHz级别)不断重复,构成了CPU运行程序基础。 编译后的指令在物理层面上是什么 答:内存中的电荷状态。 程序被操作系统加载到计算机的RAM中,RAM由无数的存储单元(通常是电容)组成,每一个单元可以存储一个bit的信息。 高电平电荷(通常代表1)或低电平电荷(通常代表0)的状态,就表示一个二进制位。 每条指令由多个bit组成。指令序列在RAM中是一系列连续存储单元的电荷状态。当CPU取指令时,PC寄存器的值,也就是一组触发器的电平状态被送到地址总线,也就是一组物理导线。 地址总线上的电平信号激活内存控制器和特定的存储单元。 被选中的内存单元的电荷状态被读出,转换为相应的电平信号,通过数据总线传回CPU。 这些电平信号进入CPU的指令寄存器IR,也是一组触发器的电平状态。 一组一组电平状态激活着CPU中的组件,从而执行指令。

2025/7/29
articleCard.readMore

在2025年,搭建新闻组

介绍 新闻组(英文名Usenet或NewsGroup),简单地说就是一个基于网络的计算机组合,这些计算机被称为新闻服务器,不同的用户通过一些软件可连接到新闻服务器上,阅读其他人的消息并可以参与讨论。新闻组是一个完全交互式的超级电子论坛,是任何一个网络用户都能进行相互交流的工具。现在已经没落,1990年前后是新闻组的鼎盛时期。很可惜,我晚了20年。 新闻组基于古老的NNTP协议,又名Usenet,类似一个巨大的论坛,用户可以在不同的组中发表内容,其他用户也可以回复内容,一切基于Email。 搭建 这可能是当今互联网上,你能找到的为数不多的最新的有关新闻组的文章。 我使用newsd这个服务端来搭建,至于为什么没有使用inn,有两个原因:教程过时、软件库中没有。 编译与初始化 git clone https://github.com/erco77/newsd.git make 如果没有错误的话,输出是这样的: yingyu5658@bongo ~/e/newsd (master)> make g++ -Wall -DSPOOL_DIR=\"/var/spool/newsd\" -DCONFIG_FILE=\"/etc/newsd.conf\" -DSENDMAIL=\"/usr/sbin/sendmail\" -g -c newsd.C g++ -Wall -DSPOOL_DIR=\"/var/spool/newsd\" -DCONFIG_FILE=\"/etc/newsd.conf\" -DSENDMAIL=\"/usr/sbin/sendmail\" -g -c Subs.C g++ -Wall -DSPOOL_DIR=\"/var/spool/newsd\" -DCONFIG_FILE=\"/etc/newsd.conf\" -DSENDMAIL=\"/usr/sbin/sendmail\" -g -c Article.C g++ -Wall -DSPOOL_DIR=\"/var/spool/newsd\" -DCONFIG_FILE=\"/etc/newsd.conf\" -DSENDMAIL=\"/usr/sbin/sendmail\" -g -c Configuration.C g++ -Wall -DSPOOL_DIR=\"/var/spool/newsd\" -DCONFIG_FILE=\"/etc/newsd.conf\" -DSENDMAIL=\"/usr/sbin/sendmail\" -g -c Group.C g++ -Wall -DSPOOL_DIR=\"/var/spool/newsd\" -DCONFIG_FILE=\"/etc/newsd.conf\" -DSENDMAIL=\"/usr/sbin/sendmail\" -g -c Server.C g++ -Wall newsd.o Subs.o Article.o Configuration.o Group.o Server.o -o newsd pod2man --center "newsd Documentation" --section=8 newsd.pod > newsd.8 pod2man --center "newsd Documentation" --section=8 newsd.conf.pod > newsd.conf.8 pod2html newsd.pod > newsd.html pod2html newsd.conf.pod > newsd.conf.html 前台调试模式:sudo ./newsd -d -f 后台守护进程:sudo ./newsd(日志输出至 ${LOG_DIR}/newsd.log) 创建sendmail文件 sudo touch /usr/sbin/sendemail chmod a+x /usr/sbin/sendmail 创建新闻组 sudo ./newsd -newgroup 运行这条命令后,程序会依次要求输入: 组名 是否允许用户发件 字数限制(?) 描述 管理员的邮箱 将所有帖子的副本密送到的邮箱 创建好后,运行sudo ./newsd -d -f。 Sat Jul 26 12:28:48 2025 newsd[38895]: -- newsd started - V1.54-- Sat Jul 26 12:28:48 2025 newsd[38895]: -- start config summary -- Sat Jul 26 12:28:48 2025 newsd[38895]: ErrorLog stderr Sat Jul 26 12:28:48 2025 newsd[38895]: HostnameLookups off Sat Jul 26 12:28:48 2025 newsd[38895]: Listen 0.0.0.0:119 Sat Jul 26 12:28:48 2025 newsd[38895]: LogLevel debug Sat Jul 26 12:28:48 2025 newsd[38895]: MaxClients 0 Sat Jul 26 12:28:48 2025 newsd[38895]: MaxLogSize 1048576 Sat Jul 26 12:28:48 2025 newsd[38895]: SendMail /usr/sbin/sendmail -t Sat Jul 26 12:28:48 2025 newsd[38895]: ServerName bongo Sat Jul 26 12:28:48 2025 newsd[38895]: SpamFilter Sat Jul 26 12:28:48 2025 newsd[38895]: SpoolDir /var/spool/newsd Sat Jul 26 12:28:48 2025 newsd[38895]: Timeout 43200 Sat Jul 26 12:28:48 2025 newsd[38895]: User news Sat Jul 26 12:28:48 2025 newsd[38895]: -- end config summary -- 其中,我们需要注意的信息是监听地址,由于我这里是本地环境,是0.0.0.0。这时用客户端连接这个地址,订阅刚刚创建的组就可以使用了。 这个服务端自己搭着玩玩还是足够的,大规模还是要用其他的,不过现在大规模的新闻组肯定不多了。 我的新闻组 news.yingyu5658.me 希望每月服务器钱不要白搭。

2025/7/26
articleCard.readMore

无蝉鸣夏

学校里的海棠花谢了两次了,老师每次都会带着我们出去拍照。花确实很美,但我每次都恐于留下不堪的回忆,拍照时都远远躲去了。一天又一天地盼着的暑假到来了。十几天像流水奔去。 总能见到一种人,每天因逝者如斯夫而悲鸣,在网上。慨叹时间太快,自己太空虚。每天抱着手机刷几个小时视频,看到比自己强的人,继续焦虑地刷视频。到了晚上,按照惯例把自己思维反刍的结果公布在群聊里。神奇的是,这种负能量满满的人,反而更有广阔的社交圈子。我的意思是,有很多喜欢安慰这种人的人。能量实在是高,保持自己的情绪不被影响(待研究)的同时,能去安慰别人。 我个人当然是对这种负能量者敬而远之的,但实在是好奇那些安慰者是如何保持冷静和感性和那种人沟通。 而有的人又不领这份人情,把别人投来的好心曲解成说教,真为那些安慰者愤怒。当然,他们不会愤怒,因为他们永远能保持冷静和感性。 去年的七月二十二日我在想些什么呢? 这个暑假格外寂静。蝉都跑去别的树上了,不愿意在我家门口浪费所生不多的生命。虽聒噪,但好歹也是盛夏元素,以前从来都没有对这个季节抱有那么大的关注。以后一定要移居南方,不为别的,起码在读书、画画时经常可以听到真真切切的雨声。耳机戴时间长了对耳朵也不好。 父亲之前买来的虫叫了几周就死了,期末考试的作文我还拿他来凑过字数,现在被扔到了哪个垃圾桶、尸体碎成了几段都不知道了。好像是因为断掉一条腿,就不吃不喝,活生生饿死的,至于那条腿是怎么断的,也和尸体的去向形态一样无从得知。 一次上课回来,在植被繁茂的小区,树上的蝉好像约定好了在某一时刻突然一起鸣叫,震耳欲聋。我好奇它们在哪,朝树上张望,什么也看不见,只闻蝉鸣震耳欲聋。 暑假确实寂静,不闻蝉鸣,也没有狗叫纷扰,关闭朋友圈和QQ空间确实是一个正确的选择,少了焦虑,多了清净,薄如蝉翼的交情在屏蔽对方的那一刻彻底被撕碎了。 开学又要回到聒噪的、持续高压的环境,多希望能一直保持这样的状态,不用接触各种类人生物,安静自在地呼吸,初三的放学时间延后到八点半,但愿能活下来。我会怀念一个人坐在房间里,借着阴雨天窗边映下来的蓝冷色调的光读书,听雨打在玻璃上的哒哒声的日子,和带着耳机,听着自己喜欢的歌,坐在公交车最后排,在去图书馆的路上欣赏风景的日子。 这种生活和早上六七点背着沉重的书包,拖着疲惫的身体匆匆出门,在拥挤嘈杂的人群中感受冲天的死气和体臭一对比,顿觉窒息。

2025/7/22
articleCard.readMore

万能必胜沟通法

我有问题,你指出 = 你在犟嘴。 我要输出情绪:你在犟嘴。 我不想解决问题 = 你在犟嘴,并且我不理你。 精神胜利大法万岁! 不容置疑的皇权万岁!! 至高无上的皇权万岁!!!

2025/7/21
articleCard.readMore

形而上学与自然辨证

形而上学是哲学的核心分支之一。在哲学体系中,形而上学探讨的是超越经验世界的根本性问题,例如存在的本质、宇宙的本源、实体与属性的关系、自由意志、因果关系等。在自然辩证法(尤其是恩格斯的相关论述)中,形而上学常被批判为一种与辩证法对立的世界观和方法论。 形而上学最初以本体论为核心,研究“存在者之为存在者”的根本属性。 形而上学的方法论常被概括为: 孤立与静止:将事物从整体联系中剥离,忽视其动态变化,如一粒沙子堆积成沙堆的过程被简化为沙子和沙堆两个静态概念。 超验思辨:依赖理性推理而非经验验证。 非此即彼的二元对立:否定矛盾统一性,如存在/不存在等绝对划分。 自然辩证法为何批判形而上学 自然辩证法是恩格斯在《自然辩证法》《反杜林论》中系统发展的理论,核心是揭示自然界与人类思维的辩证规律。 其对形而上学的批判主要集中在: 对“自然界绝对不变”的机械自然观的否定。 对思维方式的革新:从非此即彼到矛盾统一。 形而上学的脱离实践。 形而上学与自然辩证在世界观上的对立实质是静态本质论与动态过程论的理论冲突。

2025/7/19
articleCard.readMore

基于身边扩列者行为观察的结论

本文描绘的群体画像仅代表个人在社交媒体上所见,尤其是音游圈的行为,不代表所有人。观点包含个人主观推测,谨慎甄别。 我把朋友圈和QQ空间关闭的原因之一就是有很多扩列的。一直很不解,扩列的意义到底是什么? 微信和QQ的扩列(在我的圈子里)堪称两个极端。微信的扩列:无自我介绍,无任何信息,甚至连小朋友们最喜欢玩的MBTI也不贴,直接就是一个二维码,旁边放一个前凸后翘大长腿的网图,文案是“➕”。 而QQ的扩列是另一个极端。滑好几页的自我介绍。年龄、MBTI人格、玩什么游戏,玩到了什么成绩、看什么动漫、坐标(也就是所在省份)等等面面俱到。 一些扩列条我甚至第一条都读不懂:“cn是他妈的什么?” 查了一下才知道,原来这是类似“圈名”的概念,类似的术语还有很多,但这又是另一个圈子的分支。 点进精心装修得金碧辉煌的QQ空间,读着会员专属字体配色的尊贵文字,可以发现扩列行为大概可以分类两种:以兴趣为导向,寻找游戏玩伴等;缓解孤独感:纯粹交友。前者在筛选把控和精准匹配上很是下功夫。 这个扩列这个圈子有一个很有意思的词:“雷”。据业内人士透露,雷就是指讨厌的事情,在扩列条上写明自己讨厌的事,防止踩雷,这在我看来是一种挺高明的做法,有概率避免被冒犯,但也无形中增加了交流负担,且易暴露关系的脆弱性。如果“雷”被踩直接炸,确实危险。 什么雷、单删等条条框框,有些人极端夸张,甚至因为对方“单删”自己,直接把ta挂在空间,意图网暴。高强度活跃于空间/朋友圈也能说明ta们有着很强的分享欲。无论好事坏事,美事糗事,都要往朋友圈/空间发。此时,开头的问题有了答案。 扩列的意义究竟是什么? 我得出的结论之一是:建立自我价值感。 自我价值感包含自信、自爱和自尊三个递进层,最终发展为自尊。在认知层面,是个体对自身才能,社会地位,声誉的评估。 我所观察到的部分群体在扩列活动中,自我价值感的建立主要体现在自信层面,由空间互赞的行为,在主观上提升自己的声誉;在高强度活跃于圈子中渐渐积累地位。 说说/朋友圈的赞数和评论量化了声誉和社会地位,这在自我价值感的建立中是起正向作用的。但极端者,表达欲会被扭曲,从“我想分享什么”,变成总在想“别人会喜欢我分享什么”的转变,标志着自我价值以内在感受和体验评估,变成了由外部反馈提供。彻底迷失在众人目光注视之下。 结论之二是:获得新鲜感。 一块刚出锅的红薯和放了一下午的红薯口感肯定不同。持续交友,保持新鲜感。我也见过有人很喜欢社交媒体的红点,能营造出一种自己很受欢迎的氛围,而扩列就能做到这点:“新的好友申请”、“新消息”等。 人与人之间的交际关系可以用图的结构来表示,扩列条的转发让一个节点的属性放射性地广播出去,跨更远的节点,建立链接。这张图几乎是不会断的,因为人的社交网络是不会断的,如果这个扩列条一直被转发,那么理论上就有可能走到互联网的每一个角落,从而产生持续性。如果人们停止转发,那自己就再发一条,请求好友们继续转发。 然而这仅仅是理论上的设想,社交网络并非一张无限连接到全世界所有人的图,而是分裂成一小块一小块不同的图,各为一个圈,仅少数活跃在多个圈子的人可能链接着两个小图。所以信息的传递效率没有理论上那么恐怖,这也就为兴趣为导向的扩列提供了积极作用,至少可以在小圈子内传播,找到同好。 扩列行为中普遍存在的一个现象是加了好友,几乎没有任何互动,我称之为“僵尸好友”。这是邓巴数字的一个很好的验证。 小圈子中个体的小圈子浓缩再浓缩,最后形成所谓的小团体,高强度互动,筛选把控和精准匹配此时已经达到最终目的。 这也就是我得出的第三个结论:获得归属感。 包括MBTI、属性图等主观上容易被判断为贴标签的行为,也是在寻找归属感。

2025/7/12
articleCard.readMore

C语言下的二进制文件IO踩坑

C语言下的二进制文件读写有个坑,就是一定要按存储的顺序读取。例: typedef struct player { int id; double XP; double MP; }player; 这里有一个玩家的数据结构,我们创建变量并初始化。 int b_i[32] = {1, 233, 2453, 5432, 21 ,43 ,297, 752, 643}; player yingyu5658; yingyu5658.MP = 100; yingyu5658.XP = 100; yingyu5658.id = 114514; 对文件进行存储时,按照MP=>XP=>ID的顺序存储 pd = fopen("./data", "wb"); fwrite(&yingyu5658.MP, sizeof(double), 1, pd); fwrite(&yingyu5658.XP, sizeof(double), 1, pd); fwrite(&yingyu5658.id, sizeof(int), 1, pd); 读取的时候一定要按照这个顺序,否则读取出来的内容是无效的。 int id; double XP, MP; pd = fopen("./data", "rb"); fread(&MP, sizeof(double), 1, pd); fread(&XP, sizeof(double), 1, pd); fread(&id, sizeof(int), 1, pd); player new_player; new_player.id = id; new_player.XP = XP; new_player.MP = MP; printf("id: %d\n", new_player.id); printf("XP: %f\n", new_player.XP); printf("MP: %f\n", new_player.MP); 运行结果: 写入了id: 114514 写入了XP: 100.000000 写入了MP: 100.000000 id: 114514 XP: 100.000000 MP: 100.000000 使用完也要关闭流,否则资源泄漏 fclose(pd); // 必须显式关闭

2025/7/12
articleCard.readMore

对博客主题的一点想法

简单回顾以下建站历程,博客的内容从“我是谁”转移到了"我想说什么"。从最早开始正式写博客的Gmeek,到后来使用Typecho,再到Hexo,Hugo,这几个不同的时期是我对主题看法的不同阶段。 Gmeek时期,没有概念,没看过几个人的博客,后来接触得多了,看了很多主题才意识到自己博客的主题有多简陋,换到Typecho,开始折腾主题,经历了一段不堪回首的时期。经典的一些元素:左下角挡字小人、底部音乐播放器、背景樱花飘落特效、点击特效,总之就是各种花里胡哨。文章,没有几篇,但是你可以在网页上找到任何你想找到的东西,除了文章。当时很喜欢Butterfly主题 后来换到了Hexo,也有Butterfly,继续用。发现点二十个网站,三十个都是Butterfly,很尴尬,后来经过几经波折,换到了Maupassant,输出了几篇自认为有点内容的文章,主要还是有感而发,我写东西不在乎谁看了,谁怎么看。我只是享受编辑和发送的过程。有人说心情不好,就把让你不开心的事写在纸上然后团成球扔进垃圾桶。这样还是太浪费了,毕竟是自己亲笔写下的文字,另说浪费纸张也不好。 在Hexo时期,我一直在寻找让读者弱化“我是谁”,专心聚焦与内容的主题。Maupassant就很好。后来转来Hugo,是看中了云风博客的那种千禧年的风格,不花哨,也不简陋。基于JiaoYuan的移植后简单修改了以下配色之类,就正式投入使用。 我认为,博客重在内容,想表达什么观点、想记录什么事件。毕竟Blog,Web Log,Log,日志,记录。除了记录,也可以是扩大自己声音的一个渠道,独立于平台,起码不会有跳墙的删掉你辛辛苦苦打出来的一大段字。 而把重心放到了“我是谁”的站点,应该算作“个人主页”,并非博客,用作于一些项目展示、网络名片也是很好的。 而ta说“我是谁”,和自己观察“ta是谁“,是两种截然不同的感受。前者能迅速建立起一个停留于表层但具体的印象,而后者多出一种视奸的快感。从字里行间里感受ta是什么人,虽然建立印象的周期长,但深入。值得。 所以很多人博客的关于页面,我就当看个乐呵就过去了,仔细看每一篇文章,从ta的文字、观点、立场、价值观和认知来建立起ta的形象。有些人宏伟庄严,有些人冷漠麻木,有些人用平实朴素的语言记录,有些人用各种恶心到家的语气词和括号里补充的动作描写,绞尽脑汁想怎么把自己表现得多可爱。想可爱,先从扮演人类开始吧。这么在意别人怎么看自己,我替你感到疲惫。 好吧,我承认我有点冒犯了,一些朋友看到标题是关于主题的点进来还躺枪,那对不起,我冒犯的就是你。

2025/7/10
articleCard.readMore

C语言实现简易Shell

实现一个Shell,需要的功能有: 循环读取用户输入 输出提示符 创建子进程执行命令 等待回收子进程 shell中的大多数命令都是通过创建子进程来执行的,可以使用fork()创建子进程,然后替换主进程执行命令。 创建 常用函数原型 pid_t fork(void); // pid_t是int类型 pid_t get_pid(); // 获取当前进程pid pid_ getppid(); // 获取当前进程的父进程值 fork()用于创建创建一个进程,所阐明的进程复制父进程的代码段/数据段/BSS段/等所有用户空间信息,在内和中操作系统重新为其申请了一个PCB,并使用父进程的PCB初始化。 实现fork()子进程替换为命令子进程, 最佳的进程替换的接口是exevp() 在创建子进程前,我们需要解析传递给shell的参数 使用strtok()对command以空格进行分割,所以显而易见地,得到的结果数组中,第0位是命令名称,后面全部都是选项。 使用waitpid()等待子进程,fork()获取的子进程id可以用于制定回收子进程。 #include <pwd.h> #include <sys/wait.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #define MAX_COMMAND_SIZE 256 int main() { char *command_argv[MAX_COMMAND_SIZE]; char command[MAX_COMMAND_SIZE]; memset(command, '\n', MAX_COMMAND_SIZE); const char* user_name = getlogin(); while(1) { printf("[%s@EazyShell]$ ", user_name); fgets(command, MAX_COMMAND_SIZE, stdin); command[strcspn(command, "\n")] = '\0'; // 去掉末尾的换行符 // 分割命令行,一个空格为一项子命令或参数 command_argv[0] = strtok(command," "); int index = 1; while(command_argv[index++] = strtok(NULL, " ")); // 创建子进程,并进程替换 pid_t id = fork(); if(id == 0) { // 进程替换 execvp(command_argv[0], command_argv); return -1; // 失败则退出-1 } // 父进程回收子进程 int status = 0; pid_t ret = waitpid(id, &status, 0); if (ret = 0) { printf("父进程成功回收子进程, exit_code: %d, exit_sig: %d\n", WEXITSTATUS(status), WTERMSIG(status)); } } return 0; } 这个程序的健壮性和内存布局还有待优化,但只是一个简易的shell,用于理解它的工作原理,这就够了。

2025/7/10
articleCard.readMore

C语言的可变参数

介绍 C语言中,printf()和scanf()函数就是典型的变参函数,其优点是灵活处理参数。 想要创建变参函数需引入头文件stdarg.h,它有一些宏: va_list 指向整个可变参数列表的指针 原型:typedef char* va_list; va_start 指向可变参数列表前的参数(...前的参数) 原型:void va_start(va_list ap, paramN); va_arg 可变参数列表 原型:typedef va_arg(va_list ap, type) va_end 结束对可变参数列表的访问,并释放资源 原型:void va_end(va_list ap); 使用例 #include <stdio.h> #include <stdarg.h> // 定义一个使用省略号的函数原型 void function(int argument, ...) { // 声明一个va_list类型的变量ap,这是可变参数列表 va_list ap; // 使用va_start把变量ap初始化为参数列表 va_start(ap, argument); // 第二个参数表明本函数期望传入一个int类型 // 但是编译器不会检查到底输入了什么。 int output = va_arg(ap, int); printf("可变参数:%d\n", output); va_end(ap); } int main() { function(1, 109); } 输出: 可变参数:109 函数起了作用,但是如果我们需要接受多个参数,应该如何获取呢? #include <stdio.h> #include <stdarg.h> // 定义一个使用省略号的函数原型 void function(int argument, ...) { // 声明一个va_list类型的变量ap,这是可变参数列表 va_list ap; // 使用va_start把变量ap初始化为参数列表,此处的第二个参数是最后一个固定参数 va_start(ap, argument); // 第二个参数表明本函数期望传入一个int类型 // 但是编译器不会检查到底输入了什么。 int arguments_list[4]; for(int i = 0; i < 4; i++) { arguments_list[i] = va_arg(ap, int); // 按int类型提取参数 } va_end(ap); // 遍历参数列表并打印 for (int i = 0; i < 4; i++) { printf("可变参数%d:%d\n", i + 1, arguments_list[i]); } } int main() { function(1, 10, 12, 2, 111); } 扩展:va_start的第二个参数的工作原理 va_start的第二个参数用于定位可变参数列表的起始位置,具体而言,它指向函数参数列表中最后一个固定参数(即省略号前的参数),通过该参数的地址计算出第一个可变参数在内存中的位置。 C函数的参数按从右至左顺序入栈(栈底高地址,栈顶低地址) va_start的第二个参数作为基准点,其地址加上自身大小后,即指向第一个可变参数的起始地址。 所以...前至少要有一个固定参数用于寻址。

2025/7/6
articleCard.readMore

为什么我选择Github issues,而不是朋友圈

本页面内容来自Moments 概述 把GitHub issues当朋友圈发。 我厌倦朋友圈浓重的装逼气味和虚假社交属性,打造一个纸糊的人设并不好玩,专门发出来某些东西给某人看也非常恶心,所以我选择逃避。 为什么要用issues,而不是朋友圈? 访问受限,门槛较高 && 过滤傻逼 有更方便管理的标签和查找 易于二次开发 Markdown格式写作 清净,不用一点开就吃别人拉出来的屎 能相对敞亮地说话 综上,使用issues是更好的。 为什么叫Moments? 这是微信英文界面对朋友圈的翻译,我觉得这个翻译像是十几年前微信朋友圈这个功能刚出来时做的。刹那、瞬间,重在记录,而现在朋友圈的发展越来越妖魔化,已经变成一些虚伪的人从各个角度试图营销自己的垃圾场,也变成了意义不明、只放一个二维码要求扩列的赛博妓院。朋友圈的内容总给人虚假感,因为微信是一个社交平台,和你的人设高度绑定,大部分人到死前都会经历毫无尊严的一段时光,想到这里,那些虚假的人设、别人的看法也就没那么重要了。 个人原因 我从发布了第一条私密朋友圈开始,就一直在探索利用间隙碎片时间释放表达欲与分享欲的途径,,为了远离那些恶心的卖弄人设行为且能专心用私密朋友圈记录,我屏蔽了所有好友的朋友圈,但微信朋友圈不易于管理和查找,没一阵就被pass掉。 除了朋友圈,我大部分释放前两种欲望的途径是和群里的网友聊天,但是随着网络死亡计划对群聊的筛选,我活动的群聊变得很少,有些还留着的群是因为加的时间很长,但基本没人理我。后来信息节食的实行,我也不会再浪费太多时间在群里吹水,总憋着容易溢出,于是Moments诞生了。

2025/7/5
articleCard.readMore

使用Javascript TSS和Highlights构建一个文本阅读器

原文:https://jsdev.space/tts-sentence-reader/ 翻译:yingyu5658 yingyu5658@outlook.com 在这篇文章中,我们将构建一个简单的Web工具来探究Text-toSpeech(TTS)在JavaScript中是如何工作的。我们也将深入研究句子级高亮的工作逻辑。这两项功能经常结合在一起使用,以走到浏览器中打造无障碍的动态阅读体验。 步骤: 学习在浏览器中,TTS是如何工作的 探究动态高亮句子的实现方法 用HTML, CSS, JavaScript构建一个小工具(Demo & Code) 📢 浏览器中的TTS概述 JavaScript提供一个内置的API:SpeechSynthesis,它允许我们使用系统中的可用嗓音去大声朗读问文字。 核心对象: speechSynthesis — 控制播放、暂停、恢复、停止 SpeechSynthesisUtterance — 作为TTS引擎的待播报文本 ✨示例: const msg = new SpeechSynthesisUtterance("Hello, world!"); window.speechSynthesis.speak(msg); ⚙️ 添加嗓音和配置 const utter = new SpeechSynthesisUtterance("This is a test"); const voices = window.speechSynthesis.getVoices(); utter.voice = voices.find(v => v.lang === 'en-US'); utter.rate = 1.2; utter.pitch = 1; window.speechSynthesis.speak(utter); 你也可以追踪朗读的开始和结束: utter.onstart = () => console.log('Started speaking'); utter.onend = () => console.log('Finished speaking'); ✍️ 句子高亮 展示给用户哪一个句子正在阅读,我们需要用CSS和JavaScript来高亮文本。 示例 HTML: <p> <span class="sentence">First sentence.</span> <span class="sentence">Second sentence.</span> </p> 处理高亮的CSS: .sentence.active { background-color: yellow; font-weight: bold; } JavaScript高亮逻辑: function highlight(index) { document.querySelectorAll('.sentence').forEach((el, i) => { el.classList.toggle('active', i === index); }); } 🚀项目: 使用TSS和高亮的阅读器 我们的程序将要: 逐句朗读文本 高亮朗读中的文本 提供播放、暂停、恢复、停止 让用户能选择嗓音 📄 HTML结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="description" content="Build an interactive sentence-level text-to-speech reader with highlight, playback controls, and local progress tracking using HTML and JavaScript." /> <title>Interactive TTS Article Reader</title> </head> <body> <h1>Read Along TTS Demo</h1> <div class="toolbar"> <button id="start">Play</button> <button id="pause" disabled>Pause</button> <button id="resume" disabled>Resume</button> <button id="stop" disabled>Stop</button> <button id="reset">Reset</button> <select id="voices"></select> </div> <div class="text-block" id="reader"> <span class="line">Learning to code is a never-ending journey.</span> <span class="line">Technologies evolve rapidly, requiring constant adaptation.</span> <span class="line">JavaScript, HTML, and CSS are essential tools for web development.</span> <span class="line">Frameworks like React and Vue enhance front-end capabilities.</span> <span class="line">Back-end skills with Node.js extend JavaScript to the server.</span> </div> <div class="progress"> <span id="progressText">0/0</span> <div class="bar"><div class="bar-fill" id="bar"></div></div> </div> </body> </html> 🎨 CSS 样式 body { font-family: sans-serif; margin: 0; padding: 2rem; background: #f0f4f8; color: #333; } h1 { text-align: center; margin-bottom: 2rem; } .toolbar { display: flex; justify-content: center; flex-wrap: wrap; gap: 1rem; margin-bottom: 2rem; } .toolbar button, .toolbar select { padding: 0.6rem 1.2rem; border-radius: 4px; border: none; font-size: 1rem; } .toolbar button { background: #0077cc; color: white; cursor: pointer; } .toolbar button:disabled { background: #ccc; cursor: not-allowed; } .text-block { background: white; padding: 1.5rem; border-radius: 6px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); } .line { display: block; margin-bottom: 1rem; cursor: pointer; transition: background 0.3s; } .line:hover { background: #f9f9f9; } .line.active { background: #fff3cd; font-weight: bold; } .progress { text-align: center; margin-top: 1rem; } .bar { height: 8px; width: 100%; background: #eee; border-radius: 4px; overflow: hidden; } .bar-fill { height: 100%; width: 0; background: linear-gradient(to right, #0077cc, #005fa3); transition: width 0.3s; } 💡 JavaScript逻辑 const lines = document.querySelectorAll('.line'); const playBtn = document.getElementById('start'); const pauseBtn = document.getElementById('pause'); const resumeBtn = document.getElementById('resume'); const stopBtn = document.getElementById('stop'); const resetBtn = document.getElementById('reset'); const voiceSelect = document.getElementById('voices'); const progressText = document.getElementById('progressText'); const progressBar = document.getElementById('bar'); const synth = window.speechSynthesis; let voices = []; let currentIndex = 0; let currentUtterance = null; let isPaused = false; function populateVoices() { voices = synth.getVoices(); voiceSelect.innerHTML = ''; voices.forEach((voice, index) => { const opt = document.createElement('option'); opt.value = index; opt.textContent = `${voice.name} (${voice.lang})`; voiceSelect.appendChild(opt); }); } synth.onvoiceschanged = populateVoices; populateVoices(); function updateUI() { progressText.textContent = `${currentIndex + 1}/${lines.length}`; progressBar.style.width = `${((currentIndex + 1) / lines.length) * 100}%`; } function highlightLine(index) { lines.forEach((line, i) => { line.classList.toggle('active', i === index); }); lines[index]?.scrollIntoView({ behavior: 'smooth', block: 'center' }); } function speakLine(index) { if (index >= lines.length) return; const text = lines[index].textContent; const utter = new SpeechSynthesisUtterance(text); const selected = voiceSelect.value; if (voices[selected]) utter.voice = voices[selected]; utter.rate = 1; utter.onstart = () => { highlightLine(index); playBtn.disabled = true; pauseBtn.disabled = false; resumeBtn.disabled = true; stopBtn.disabled = false; }; utter.onend = () => { if (!isPaused) { currentIndex++; if (currentIndex < lines.length) { speakLine(currentIndex); } else { resetControls(); } } }; currentUtterance = utter; synth.speak(utter); updateUI(); } function resetControls() { playBtn.disabled = false; pauseBtn.disabled = true; resumeBtn.disabled = true; stopBtn.disabled = true; } playBtn.onclick = () => { currentIndex = 0; speakLine(currentIndex); }; pauseBtn.onclick = () => { synth.pause(); isPaused = true; pauseBtn.disabled = true; resumeBtn.disabled = false; }; resumeBtn.onclick = () => { synth.resume(); isPaused = false; pauseBtn.disabled = false; resumeBtn.disabled = true; }; stopBtn.onclick = () => { synth.cancel(); resetControls(); }; resetBtn.onclick = () => { synth.cancel(); currentIndex = 0; highlightLine(currentIndex); updateUI(); }; lines.forEach((line, index) => { line.addEventListener('click', () => { synth.cancel(); currentIndex = index; speakLine(currentIndex); }); }); updateUI(); ✅ 它们如何工作 每一个句子都是<span class="sentence"> 我们迭代句子并使用SpeechSynthesisUtterance大声朗读 在朗读过程中,高亮正确的文本并滚动 一个句子结束后,自动朗读下一个句子 🔚 尾声 阅读了本文,你理解了: 浏览器TTS的运行原理 如何实现动态高亮文本 如何从零构建一个功能齐全的阅读界面 你可以扩展项目功能: 在localStorage保存阅读进度 添加进度条 加载外部文章或用户输入

2025/7/4
articleCard.readMore

信息节食

起因 信息节食这个概念,大概是我初一的时候在政治课本听说的。当时还不以为然,现在越来越觉得信息节食很重要。 行动 我是个注意力比较涣散的人,可能是因为我常年熬夜等不健康的生活习惯,在家的时候注意力只能维持四十分钟左右,想持续一个小时的高效学习非常困难。其原因就在于我非常喜欢看QQ群,经过层层筛选后的QQ群是真正有共同话题的地方。问题就在于此,太有共同话题了,群友说的每一句话都能参与,这也就让我做一半事情就拿起手机看QQ,又是因为经过筛选,所以群很少,哪怕没有消息也要等上一会消息。长此以往,浪费时间还伤眼睛伤颈椎,而且极大部分消息都是娱乐,对提升自身完全没有帮助。所以我把QQ号退出了登录并在空间留下了邮箱,有重要且正经的事时,能高效交流。 关于微信朋友圈,经过上一篇文章的思考后,我还是决定把它保留下来,对每个好友都设置了不看ta们,少看一些人虚假的合群、努力营造人设也清净,可以很好地自娱自乐了。这也是信息节食的一部分了。有什么想记录的,就发一条私密朋友圈,或者打开备忘录、Obsidian等能写字的地方记录下来,定期整理成文。 我注销了N年前看的抖音、小红书、贴吧等账号,我知道那些平台上面也有优质内容,可查找、筛选、分辨太耗费精力了。幸好去年开始学习编程,就完全没有玩游戏的心思了,除了开一些游戏私服、制作插件以外没什么能让我重新打开游戏的理由。但今年暑假前有一个同学早就兴致勃勃地想和我联机Minecraft,盛情难却,不好推脱,但我实在对那游戏再提不起兴趣了。 今天在学校时,我想过,如果我把这些信息全部切断,我该做点什么?其实信息节食的目的之一就包括少一些打扰我读书的声音,要做的事情之一就包括读书。说得笼统点,要做的事情就是阅读。我关注了一些公众号和博客,闲暇时间可以阅读公众号、博客、新闻,也可以听听播客。只是苦于每次想阅读公众号上的文章就要打开微信,看那些犯人的红点,听那些让人抓狂的消息提示音,所以我会寻找一种把信息聚合起来,像RSS那样。看腻了就继续磨练速写和琴技,总之有营养的事多了去。 该去整理一下博客订阅列表了,不得不说,RSS真是伟大的发明。

2025/7/4
articleCard.readMore

朋友上周几次约我出去打羽毛球,都被我婉拒了。那个周末刚刚考完期末,又是我最爱的阴雨天,很难不趁着大好时光不在家修养身心,而是冒着雨出去打羽毛球几个小时,大汗淋漓,虚弱疲惫地走回家,做什么事都提不起精神,睡觉也觉得浪费时间。在家里并没有什么很想干的事,我没有打游戏的习惯,很早之前就已经戒掉电子游戏。在家里的娱乐活动无非就是看书、听歌、画画、练琴,写代码折磨一下自己应该也能凑个数。我非常依赖在家里独处时的充电,只要远离人群的嘈杂即可。 他们吐槽了一下我有点宅,只喜欢呆在家里,我无法反驳,确实是这样。没什么别的原因,单纯觉得家里安全,我是一个很怕死的人。今天去奶奶家拿饭,突然发现那里简直集齐了让我感到恐惧的所有元素。 小区旁有一条铁轨,时常有火车呼啸而过,我对噪音极度敏感。走到楼栋前,左右两旁各两个楼道入口,正常人当然选择坐电梯,第二个让我感到恐惧的,幽闭的电梯。小时候奶奶为了保障我坐电梯的安全,会讲一些关于电梯的安全事故来吓唬我,虽然今天我已经知道了那些大部分都不是真的,而且电梯层层保护非常安全,但每次走到电梯里我都会死死盯着显示楼层的那块屏幕(虽然这并没有任何作用),生怕冲顶或坠落,命丧于电子棺材里。终于煎熬地乘完电梯,可以往家门走了。楼道前一个没有封窗的常年大开的窗户,狭窄的楼道里光是远远往下眺望就已经让人胆寒,但神奇的是有那么一两个瞬间,我竟然生出了跳下去的念头,我应该很怕死的。难以想象我童年的日子是怎么近乎每天都在这里度过的。 同样地,我也抗拒旅游。也许是因为回忆起近些年旅游的滋味都不是很好。拖着个不懂事的弟弟,他总是会让所有人都不开心,大家不开心,我也没什么能开心的。冬天冷夏天热,景点人挤人,只有能量相当大的人才能感受到快乐吧。 在朋友圈里看到一个亲戚发带着自家孩子出门去苏州旅游,我很佩服她。带着家人跨越小半个中国。其中有一张照片是她的孩子站在船上,身后就是一片水。这就是我恐惧的又一个元素,水。 小时候泡温泉,失足滑落到大概高我两头的池子里,在水里扑腾了半分钟才出来,索性憋住一口气,当时我的身高是完全不足以控制自己的身体朝向的,最后抓住岸边的栏杆才保住小命。自那次以后,我对水的恐惧就开始伴随我到现在了,我也许一辈子都不会去苏州那种水乡或海边。 每次出去旅游,甚至是上立交桥都会胡思乱想。比如车子突然失控从桥上坠落,家人走散,落水……我无法继续写下去我的内心所想,这又会把我拉入恐惧。语文老师曾经读过我的某一篇文章后,评价道我是很典型的悲观主义者,无法反驳,确实典型。 综上,我为了保命,保证精神不崩溃,会减少旅游等危险活动。

2025/7/1
articleCard.readMore

私密朋友圈

四天前,我发了自我的微信号注册以来,第一个私密朋友圈。九年了,从我五岁开始我就在用这个微信号,一个私密朋友圈都没有发过。 那条朋友圈的内容是关于期末考试成绩的愿望,其实就是给自己定一个大概的目标分数。如果失败,设置成公开会很丢脸,虽然也不一定有人记得我。第一次发完后,我就猛然意识到,我发朋友圈,不是为了给谁看,立什么人设,装什么X,我只是享受那种表达和发送的感受。表达欲望谁都有,但发送的享受是从何而来的? 我认为还是可以把它划分到表达的欲望中,发送这个动作,其实也是表达的一部分,而且也是相当重要的一部分,表达是一个需要多个参与者的活动,有内容输出者也有输入者,而发送才是真正的表达,把自己的想法输出给输入者。至于私密朋友圈中,输入者这个概念究竟是谁,我想是自己。发送这个动作实际上是一个思绪的出口,在发送之前的编辑过程只能被称为思考。出于自尊心,人际关系,把向外的表达欲内化,可以享受表达的乐趣,释放表达的欲望,同时也不必担心别人的看法如何。 我想这种碎片化的输出是有益的,很多情绪之所以会扩大、升级,就是因为长期在内心积攒,而“流式处理”情绪,就可以有效避免溢出风险。我不愿意把自己的负面情绪过多带给别人,所以一般也不会跟别人聊天,若是说有效的排遣情绪的手段,只有睡觉和写作。但两者的时空要求都有些高,所以发一些尽自己可见的朋友圈表达真正想法或许是一个好方法。 央视新闻公众号有一个“夜读”栏目,发表一些关于心理、情绪等方面疏导读者或起到治愈作用的文章。我观察到这类文章私密赞占比极高。 这也许能说明一些人致力于隐藏自己真正的情绪感受,就怕无法找到情绪的出口,最后StackOverflow。

2025/6/30
articleCard.readMore

这可能是最好的Hexo图片管理方案

前言 通常在Hexo博客中,我们管理图片资源都有以下两种方案: 在_post目录下新建文章同名文件夹 在source目录下新建images文件夹,存放所有图片 两种方法各有优劣,前者方便查找但污染目录,后者集中管理但维护成本高。所以就诞生出本文要介绍的方法——images目录下新建文章同名目录 这是一个折中的办法,既保留方法1的查找方便,又保留方法2的集中性。 实现方法 创建脚本文件 在Hexo根目录的scripts文件夹(若不存在则新建)下创建一个javascript脚本,我这里就命名为auto-image-folder.js const fs = require("fs") const path = require("path") hexo.on("new", function(data) { const postName = path.basename(data.path, ".md") const imageDir = path.join(hexo.source_dir, "images", postName) if(!fs.existsSync(imageDir)){ fs.mkdirSync(imageDir, {recusive: true}) } }) 效果测试 hexo new "新文章" 这时候就在images目录下新建了一个与文章同名的文件夹。 编辑器设置优化 Typora 打开Typora → 偏好设置 → 图像 设置: 插入图片时:复制到指定路径 自定义路径:../source/images/${filename}/ 勾选:优先使用相对路径 PS E:\blog> ls .\source\images\测试\ 目录: E:\blog\source\images\测试 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/6/29 11:14 229 image-20250629111411456.png 完成!

2025/6/29
articleCard.readMore

八下历史复习笔记

临时宪法作用:《中国人民政治协商会议共同纲领》 中国人民政治协商会议第一届全体会议确立的制度:中国共产党领导的多党合作和政治协商制度 中国人民站立起来的标志:新中国成立 中国半半社会结束的标志:新中国成立 中国现代史开端:新中国成立 祖国大陆统一,各族人民实现了大团结的标志:西藏和平解放 抗美援朝目的:抗美援朝,保家卫国 捍卫新中国安全,大大提高我国国际地位的事件:抗美援朝战争 土地改革的依据:《中华人民共和国土地改革法》 彻底摧毁我国存在2000多年的封建土地制度,消灭了地主阶级的标志:土地改革的完成 新中国土改特点:采取保存富农经济,政治上中立富农的政策 新中国成立后巩固政权的事件:西藏和平解放、抗美援朝、土地改革 一五计划主要集中力量发展重工业 使我国土地所有制从私有制变为公有制的事件是:三大改造的完成 我国开始改变工业落后面貌,向社会主义工业化迈进的标志是:第一个五年计划的完成 我国根本政治制度:人民代表大会制度 人民代表大会制度确立的标志:第一届全国人民代表大会的召开 我国第一部社会主义类型的、有史以来第一部真正反应人民利益的宪法:1954年《中华人民共和国宪法》 我国社会主义改造的三个方面:农业、手工业、资本主义工商业 我国社会主义改造的创举:赎买政策 进入社会主义初级阶段的标志:三大改造的基本完成 社会主义基本制度在我国建立起的标志:三大改造的完成 三大改造实质:生产资料转变为社会主义公有制 三年经济困难是指1956-1961年为克服经济困难提出的调整、巩固、充实、提高的八字方针 1958年,社会主义建设中出现的曲折和失误是:“大跃进”和人民公社化运动 新中国成立后经历的最严重的挫折是:文化大革命 文化大革命中最大冤案的受害者:刘少奇 1967年6月,我国成功爆炸了第一颗氢弹 1970年4月,我国成功发射了第一颗人造地球卫星 1973年,我国在世界上首次培育成功强优势的籼型杂交水稻 我国在社会主义建设火热年代涌现的英雄人物:王进喜、焦裕禄、雷锋 中国共产党开辟的符合中国国情的道路是:中国特色社会主义道路 新中国成立后一场深刻的思想解放运动是:真理标准问题大讨论 新中国成立以来党的历史上具有深远意义的伟大转折是:中共十一届三中全会 开启了改革开放和社会主义新时期的事件是:中共十一届三中全会的召开 作出把党和国家工作中心转移到经济建设上来、实行改革开放的历史性决策的会议:中共十一届三中全会 党和政府对农村实行的改革是:实行家庭联产承包责任制 家庭联产承包责任制最早在安徽凤阳小岗村实行 为农民致富和实现现代化开辟出的一条新道路是:发展农村乡镇企业 城市经济体质改革的中心环节:增强企业活力 提出要建立社会主义市场经济体质的会议:中共十四大 我国经济特区的代表和对外开放的窗口:深圳 1980开放的四个经济特区是:深圳、珠海、汕头、厦门 对外开放的意义:引进外资技术、扩大对外影响、为改革开放探路 我国对外开放的格局:经济特区–沿海开放城市–沿海经济开放区–内地 对外开放的特点:全方位、多层次、宽领域 为我国参与经济全球化开辟了新途径的事件:中国加入世界贸易组织 提出“建设有中国特色的社会主义”的会议是:中共十二大 阐述了社会主义初级阶段的理论,明确概括了党在社会主义初级阶段的基本路线的会议是:中共十三大 1992年进一步解放了人们的思想,推动改革开放和社会主义现代化建设进入新阶段的是:邓小平南方谈话 我国改革开放和社会主义现代化的总设计师:邓小平 马克思主义在中国发展的新阶段是:邓小平理论 把邓小平理论确立为党的指导思想的会议是:中共十五大 把江泽民三个代表重要思想确立为中国共产党指导思想的会议是:中共十六大 把科学发展观确立为中国共产党的指导思想的会议是中共十八大 习近平新时代中国特色社会主义思想被确立为中国共产党必须长期坚持的指导思想的会议是:中共十九大 马克思主义中国化、时代化的新的飞跃是:习近平新时代中国特色社会主义思想 为了实现中国梦,中国共产党实现的奋斗目标是:“两个一百年”奋斗目标 中共十八届五中全会提出的新发展理念是:创新、协调、绿色、开放、共享 宣布我国实现了第一个百年奋斗目标,全面建成小康社会的会议是:庆祝中国共产党成立100周年大会 重点总结新时代党和国家取得的历史性成就,发生的历史性变革和积累的新鲜经验的会议是:中共十九届六中全会 做出了统筹推进“五位一体”总体布局、协调推进“四个全面”战略布局全面部署的会议是:中共二十大 为解决我国民族问题确立的基本政策和基本政治制度是:民族区域自治制度 我国建立的第一个自治区:内蒙古自治区 20世纪末,我国实行的为民族地区加快发展,创造了巨大的历史机遇的政策是:西部大开发 邓小平从维护祖国和中华民族根本利益出发,提出的伟大构想是:“一国两制”伟大构想 香港回归:1997.7.1 澳门回归:1999.12.20 中国人民洗雪了百年国耻,在完成祖国统一大业的道路上迈出的重要一步的标志是:香港、澳门的回归 改革开放后对台基本方针:和平统一、一国两制 海峡两岸近四十年的隔绝状态终于被打破,两岸关系发生了历史性变化的事件:台湾当局开始被迫调整“三不”政策 标志海峡两岸关系的发展迈出历史性的重要一步的事件是:海基会与海协会达成九二共识 九二共识的内涵:海峡两岸均坚持一个中国原则 全面阐述了新时代解决台湾问题的总体方略的文件是:《台湾问题与新时代中国统一事业》白皮书 中共二十大进一步强调实现两岸统一的最佳方式是:“和平统一、一国两制”方针 中国人民解放军的第一支海军部队是:华东军区海军 2012.9我国的第一艘航空母舰:辽宁舰 中国战略威慑的核心力量:导弹部队 2015年,第二炮兵部队更名为火箭军 我国的五大军种:陆军、海军、空军、火箭军、战略支援部队 五大战区:东部、南部、西部、中部战区 形成的新格局:形成中央军委指导下的陆军、海军、空军、火箭军等军种,军事航天不对、网络空间部队、信息支援部队、通勤保障部队等兵种的新型兵种结构布局 新中国成立后奉行的外交政策:独立自主的和平外交政策 周恩来提出的处理国与国之间关系的基本准测:和平共处五项原则 和平共处五项原则的内容:互相尊重主权和领土完整、互不侵犯、互不干涉内政、平等互利、和平共处 1955年万隆会议召开的地点:印度尼西亚 万隆会议地位:第一次没有西方殖民主义国家参加的亚非会议 万隆会议上周恩来提出的外交方针:“求同存异”方针 20世纪70年代,中国外交取得重大胜利的事件:中华人民共和国回复在联合国的合法席位 中美关系开始走向正常化的标志是:中美双方签署并发表了《联合公报》 中国特色大国外交全面推进,形成的外交布局是:全方位、多层次、立体化 1989年成立的亚洲太平洋地区的经济合作机制,中国与1991年加入亚太经合组织 我国成功发射的第一课人造地球卫星:东方红一号 为两弹的研究做出突出贡献的科学家代表有:钱学森、邓稼先 我国首位乘坐神舟五号载人飞船升入太空的宇航员是:杨利伟 成功培育籼型杂交水稻,被称为杂交水稻之父的科学家是:袁隆平 领导科研团队发现青蒿素,获得2015年诺贝尔生理学或医学奖的中国药学家是:屠呦呦 2012年获得诺贝尔文学奖的中国作家:莫言 1956年,毛泽东提出在科学文化工作中实行“百花齐放、百家争鸣”的方针 新中国成立后,使我国人民衣食住行方面发生巨大变化的政策是:改革开放

2025/6/27
articleCard.readMore

人生中第一次大考

会考是我人生中经历的第一次大考,不难,考试前一两周也写了不下三四十套卷子。具体考试日期就在中考最后一天的下午。打这段字的时候,我正在开向考点的车上。 考前两天我几乎没复习任何东西,对了一张地理卷子的答案,94/100,看着网上初一地理的课,做了些复习笔记。遗憾的是,那篇笔记我忘记了push到博客上,所以我才有时间在这里写字。那两天完全无心复习 。唯一留作业的历史和数学两科中,只有数学勉勉强强写了一张卷子,今天考完回来开始写作业吧。 每次各种略微重要的考试前,总有一群大脑发育不完全的懒猪在朋友圈、QQ空间转各种迷信性质的图片。我也发了一个说说。 我认为我说的非常有道理。 有些生理意义上的头疼,前一晚做了些梦,很乱,没睡好。早上六点家里的幼畜例行吵闹,两个小时的睡眠空缺又让我的精神雪上加霜,起床后眼睛肿了,可能又碰到什么过敏物质。 出发前去买矿泉水,为了节省时间,抬起脚跑了几步,突然发现自己已经很长时间没跑过了。平常在学校只有上学、放学、打饭、领卷子会起身,其余时间都是坐着,下课就睡觉。 现在这段文字是从考点出来后写下的。 考点学校比我念书的学校环境好多了,教室宽敞明亮,楼道也很干净,桌椅看起来都是新的。生物有一道种植大棚里二氧化碳发生器的作用的题,和一道肾单位尿液再吸收的题,前者超纲,后者没复习到。无论怎样,考完了。

2025/6/24
articleCard.readMore

会考地理复习笔记

地球公转自转与季节气候 东西半球分界线:20W 160E 地球自转方向:自西向东 南北半球季节相反 夏至日太阳直射北回归线,北半球昼最长也最短,南半球昼最短夜最长,北极圈及其以北极昼,南极圈以其南极夜 冬至日太阳直射南回归线,北半球昼最短夜最长,南半球昼最长夜最短,北极圈及其以北极夜,南极圈及其以南极昼 春分秋分,太阳直射赤道,昼夜等长 根据各地获得太阳光照的多少,把地球表面分为五个带:热带、北温带、南温带、北寒带、南寒带 地图 比例尺=图上距离/实地距离,指示表大多指向正北方向 同一条等高线上的海拔相同;等高线越密集,坡度越陡;等高线越稀疏,坡度越缓。 等高线上不同的山体部位 山峰:等高线闭合,数值从中间向四周递减 山脊:等高线的弯曲部分向低处突出 山谷:等高线的弯曲部分向高处突出,常形成河流 陡崖:等高线重叠,适合开展攀岩运动 陆地表面的地形类型 1.高原:海拔在500米以上,面积较大,外围较陡,内部起伏较为缓和 大洲分界线 亚欧分界线:乌拉尔山脉、乌拉尔和、厉害、大高加索山脉、黑海、土耳其海峡 亚非分界线:苏伊士运河 北美南美分界线:巴拿马运河 欧非分界线:直布罗陀海峡 板块构造学说 板块内部地壳比较稳定;板块与板块交界的地带,地壳比较活跃,多火山地震 在板块交界处,两个板块发生张烈,。常常形成裂谷或海洋;两个板块发生碰撞,在陆地常常形成山脉 世界上许多高大绵长的山脉主要分布在板块挤压碰撞的地带,如阿尔卑斯——喜马拉雅山系,科迪勒拉山系等 世界上的火山和地震也集中分布在地壳比较活跃的板块交界地带,例如环太平洋地带和地中海——喜马拉雅地带

2025/6/22
articleCard.readMore

Tmux配置记录

TMux 是终端复用神器,让你在一个终端窗口管理多个会话、窗口和窗格。 基础操作:启动Tmux tmux 所以我选择在~/.bashrc里加上这句,每次打开终端都会自动进入tmux。 需要掌握的概念: 会话(Session):长期运行的终端环境。 窗口(Window):会话中的标签页。 窗格(Pane):窗口中的分屏。 默认快捷键: 操作 快捷键 说明 会话管理 脱离会话 Ctrl+b d 后台运行会话 查看会话列表 Ctrl+b s 方向键选择并进入 重命名当前会话 Ctrl+b $ 窗口管理 新建窗口 Ctrl+b c 关闭当前窗口 Ctrl+b & 切换窗口 Ctrl+b 0~9 切换到指定编号窗口 窗口列表 Ctrl+b w 可视化选择窗口 窗格管理 水平分割窗格 Ctrl+b " 垂直分割窗格 Ctrl+b % 切换窗格 Ctrl+b 方向键 关闭当前窗格 Ctrl+b x 最大化/恢复窗格 Ctrl+b z 临时全屏当前窗格 配置自定义(~/.tmux.conf): set-option -g default-shell /bin/bash # 强制使用 Bash set-option -g default-command /bin/bash # 确保新会话/Pane 也使用 Bash unbind H # 移除 H 的绑定 unbind L # 移除 L 的绑定 # 启用鼠标支持 set -g mouse on # 键 set -g prefix C-w unbind C-b bind -r Left previous-window # 前缀键+←:左移窗口 bind -r Right next-window # 前缀键+→:右移窗口 # 屏幕分割 bind v split-window -h # 前缀键+v垂直分割 bind -n C-Left resize-pane -L 5 # Ctrl+←:向左扩大窗格 5 单位 bind -n C-Right resize-pane -R 5 # Ctrl+→:向右扩大窗格 5 单位 ________________ < fuck you tmux! > ---------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||

2025/6/21
articleCard.readMore

超市见闻

今天中考布置考场,只上半天课。下周一就是地生会考了,看完考场回来,已经接近一点,早点没吃,去便利店买点面包垫肚子,看到了两个其他学校的学生一人拿着一瓶酒,在台前结账。 一开始我并不确定那是不是酒,但当机器冰冷的女声提示工作人员确认顾客是否成年,禁止向未成年人出售烟酒,再加之她们两个鬼鬼祟祟的表情,可以断定就是酒了。那两个人面容有些憔悴,脸上圈着黑眼圈,快三十度的天,依然穿着校服外套,敞开怀,驼着背。看起来跟我同龄。其中一个人尽力用只能让对方听到的声音说出:“吓死我了。”很显然,她失败了。但买酒成功了,别的失败对她讲都不重要了。事发时,我就在她们身后排队结账,这一切都被我完整地看在眼里。 结账的小哥麻木地接过瓶子扫码,提醒付款,他好像已经习以为常了。《未成年人保护法》、《酒类流通管理办法》都明确规定禁止向未成年人出售烟酒,所谓上有政策,下有对策。这对策妙,无视法律和政策。 我个人对烟酒一直没什么好印象,抽烟的学生都是不良;喝酒的大人耍酒疯很麻烦,不耍也很烦人;旁边有人抽烟难免被二手烟呛到,完全无法呼吸。消遣排解的方式有很多,偏偏选择伤害自己身心又对别人无益的那一个。

2025/6/21
articleCard.readMore

第三次世界大战

我始终坚信,也能深刻体会到一句话——林子大了什么鸟都有。 最近两天伊以冲突闹得很大,工厂停运、百姓流亡,民不聊生,当地居民都处于恐慌和焦虑中。 我不对局势做点评,也不站队有立场。我发现了身边有一些人,对战争非常感兴趣,甚至期盼战争。 难以想象、不可理喻、不是人类,无法共情。我开始怀疑我自己的立场和价值观是不是有问题。 印象很深的一句话:“第三次世界大战要开始了,太好了。” 我说的明白点,打仗谁能好过?用你跟泌尿系统一次握手都没进行过的低能连接的大脑好好想想,打仗谁能好过?你是想被送到前线,给上头那帮老家伙们当棋子,当挡子弹的肉盾,还是想当送死的炮灰? 还是你觉得打仗就能变革,改变你社会蛀虫父母累赘的现状,还是觉得你FPS游戏经验丰富,上战场能大杀四方为国争光?别跪着求对方不要用钝刀割下自己的猪头都很强了。上了战场就祈求你看军事视频和意淫战争的经验有用吧。 好日子过久了,忘却战争的残酷,战争被娱乐化,这种人就出现了。

2025/6/20
articleCard.readMore

高超的表达能力

“帮我拿个东西。” “拿什么东西?” “就是那个。” “在哪里?” “就在那里。” “到底在哪里?” “就是在那里!”

2025/6/20
articleCard.readMore

好文章

心灵小语 我们的语文作业从初一开始就偶尔留一项叫“心灵小语“的作业,文风可以和博客比较相似。但毕竟是要给老师看的,措辞还是要严谨一点。前两天的语文课老师读了两篇文章,巧了,我最受不了这种文章————用力堆砌耀眼夺目的辞藻,如青春、奋斗、阳光、生活。这就是老师眼中的好文章,扮演一个老师喜欢的性格,讲写点能敲出回声的文字,点意林风格的俗套故事。 对不起,这种耀眼的词汇会让我被燃烧成灰。 我不是标榜我的文章写的多好,只是单纯厌恶这种堆辞藻、假大空。以我的水平五十步笑百步又如何,名为心灵小语,心灵敲出的回声比文字还大,老师美其名曰:”以文观人”,好好观吧,多观观吹口气就破的纸壳吧;多观观用图钉钉在脸上的真诚的笑吧;多观观炽热的可燃的木头削成的心灵吧。烧了都嫌恶臭。 活了十四年,我感受到的所谓的青春就是四五十个人挤在一个小屋子里研究一个这辈子也不会用到的式子的结果是什么。明明任何一个理科都非常有趣,但总是被迫去研究最没有意义的一个环节,痛苦又无奈。所以我痛恨代数,几何多在探究“为什么“而不是”是什么”。这才是数学让人有成就感的一环。 现在明白了,大家很爱说上岸这个词,原来是从苦海游上来了。 真他妈恶心,我的青春啊。

2025/6/19
articleCard.readMore

给比我岁数还大的电脑装Fedora

前言 印象中,这台电脑在我很小的时候就存在了,我爸的网盘里至今还有我当时用这台电脑播放江南Style,我在床上跳舞的视频。 这台机子开Powershell都卡,更不用说日常使用。 听说Linux用户有个刻板印象就是,用着十几年前的笔记本,从来不用最新设备,那这不刚好吻合上了吗。 诶……等等,我之前好像说过不折腾了?算了,反正Fedora没有Arch那么折腾(吧)。 正文 镜像下好后,用Rufus拷到U盘。 插到电脑上,额,先让我研究一下BIOS怎么进…… 整个安装过程还是很傻瓜式的,只要有小学英文基础点点点就好了。 一顿等待后,进入系统让选择一下语言,连接个WIFI就算大功告成了。 本来以为能有什么好玩的,还真这么傻瓜啊。。。 最后再来个经典的neofetch 系统也装完了,文章也写完了,电影也下完了,爽!

2025/6/14
articleCard.readMore

怪癖

我这人怪癖挺多的,屋子里不能拉开窗帘,我讨厌被别人看到;屋子里只留一盏台灯和电子设备的光,很有安全感;电脑桌面上不能有任何图标,我爱干净。 屋子里静静的,只有空调运转和电脑硬盘读写的机械声。暖黄色的台灯灯光不会分散太多注意力,在学校喧闹一天后,这是最快的“回血”方法。很难想象那些住宿学校的学生是什么支撑着他们活下去,如果是我,我大概率会跳楼。我喜欢雨天,也跟这个有点关系,非常有安全感,非常舒适,望着天上的云,总有种熟悉的感觉,说不上来是什么,是在梦里,又或许是小时候见到过类似的场景,冷白色调的阴天光线总是有种熟悉感。 我对噪音非常敏感,完全受不了人群的嘈杂声,那会让我筋疲力尽,除了睡的晚,这也是我在学校课间几乎睡满的原因。每天中午打饭时,百家争鸣百花齐放,没有一个人类,没有一个人类的行为,我正好坐在第一排,所有表演我都是最近距离的观众。光是看着折腾吵闹就已经让人筋疲力尽。 手机常年静音勿扰,我极度厌恶手机的提示音,别人能动几下手指就简单地侵入我的生活,极度厌恶。把手机打开静音模式,是我自己在主动接受信息,只有在我想看的时候才能输入信息,而不是做一半事情就被突兀的响铃和震动打断。 所有软件都是暗色模式,所有。如上文,我经常在灯光昏暗的环境下,刺眼的白光很不舒服,最极端的时间,手机、电脑、平板壁纸都是一张纯黑的图片,大道至简。但博客不同,内容风格不太适合暗色,我感觉纯技术博客更适合暗色,极客风吧。 由于长期使用Vim,我也讨厌操作鼠标,甚至浏览器都装上了Vim插件,所有能用Vim模式的软件都在用Vim模式。 高考最后一天,我们学校是考点,我在家休假。实在无聊,就去镜子前看自己,盯着看,镜子里的世界太真实了,哪一个才是真正的我?看得出神,感觉下一秒就能冲破镜框,搂到对方的后背。看着镜子里的自己,一种陌生感和恐惧感油然而生。我真的活着,我真的是我,镜子里这个人是谁?会不会他才是真正的我? 又是一段东拼西扯的意识流文字。

2025/6/13
articleCard.readMore

网络死亡计划

最近要把生活重心和精力再往学业上分配更多,打算逐步减少社交软件的使用。因此产生了些许对自己在社交软件的某些群组上是否需要存在的焦虑。所以有了这个想法:在网络上死亡。 具体应该说是在社交软件上的死亡。为期两周,直到期末考试结束。 反正也不会有几个人关注我的博客,那就随便说说吧。如果你疑惑为什么我长时间装死,那看到这篇文章也就解答了。 一直感觉很多社交都是热脸贴冷屁股,浪费时间浪费精力。如果长达两周我没有在某个我曾经经常发言的群发言,而且也没有人主动找我,那也就意味着我在那个群不重要,对那群人不重要,不是一个圈子,无共同话题,也就没有留下去的意义。 主要包括: 停止发布朋友圈和QQ空间 停止在所有非必要微信QQ群发言 多学习,多写博客,多读书 如果这样过得很舒服,那可能会一直延续下去。我一直在寻找真正有意义的社交圈和社交方式,但至今为止,觉得最有效的能让自己没那么累的方式就是减少社交。 今后会把大部分生活琐事记录和观点表达转移到博客而非朋友圈和QQ空间。后者总是被动接受信息,不一定能找到共鸣,而前者是主动选择文章阅读,而且博客的性质能让人组织起完整的语言,客观地记录和表达;在QQ空间和微信发表出来总是有一种为了给某人看或为了给某些人看的味道,有些不舒服,也影响言语措辞。我这人变得越来越怪。

2025/6/12
articleCard.readMore

我说过吗?

我见到了一个口齿不清又爱自言自语的人。 “我说过这个吗?” “没说过啊?” “哦哦对的对的哦不对不对哦对的对的。” “我说过那个吗?” “没说过啊?” “这个不说了。” “那个也不说了!” “不对,哦哦对的对的,不对不对。” 我真说了,我真没说,我真说了!!! 对,对吗?

2025/6/12
articleCard.readMore

4Key音游段位单曲成绩计算的程序实现

前言 其实这个坑我很早以前就想开了,在我刚开始学编程那会就一直想写一个这个东西。但苦于数学进度没达到,要用到加权平均数,这东西我前两天才学到,之前对数学也一直是懒得学的状态,要不然几乎是看不懂那个算法的。 我手头有一个Special-Week写的网页版的单曲成绩计算器,就以这个为研究样本吧。以下简称原作者为sw(如有冒犯请联系修改) 数据结构设计     // 基础的4k类     class Dan4k {         constructor(key1, key2, key3, key4, danName) {             this.m_key1 = key1;             this.m_key2 = key2;             this.m_key3 = key3;             this.m_key4 = key4;             this.m_danName = danName;         }     } 每一个段(LN、Om),sw都单独写了一个内部类,继承Dan4k。 // lnDan类 class LnDan extends Dan4k { constructor(key1, lnKey1, key2, lnKey2, key3, lnKey3, key4, lnKey4, danName) { super(key1, key2, key3, key4, danName); this.m_lnKey1 = lnKey1; this.m_lnKey2 = lnKey2; this.m_lnKey3 = lnKey3; this.m_lnKey4 = lnKey4; } } // ma段 class MaDan extends Dan4k { constructor(key1, key2, key3, key4, name1, name2, name3, name4, danName) { super(key1, key2, key3, key4, danName); this.m_name1 = name1; this.m_name2 = name2; this.m_name3 = name3; this.m_name4 = name4; } } // reform段 class ReformDan extends Dan4k { constructor(key1, key2, key3, key4, name1, name2, name3, name4, danName) { super(key1, key2, key3, key4, danName); this.m_name1 = name1; this.m_name2 = name2; this.m_name3 = name3; this.m_name4 = name4; } } // om段 class OmDan extends Dan4k { constructor(key1, key2, key3, key4, danName) { super(key1, key2, key3, key4, danName); } } 我打算重写的程序不带LN玩了,我自己也没玩过LN,不清楚是什么机制。那就来看看剩下的几个类。 Dan4k类定义了一个段位的基础属性,但是这个参数key1-4是用来做什么在当前上下文暂且不清楚,是第n首歌的物量吧。 那么由此可以推断,这些类都描述了一个谱面的基本属性: 物量 歌曲名称 段位名称 然后分支匹配数据并计算。我也用C语言实现一个。 // 整个段位信息 typedef struct Dan { // 段位名字 char* dan_name; // 四首歌的名字,用于匹配数据 char* song1_name; char* song2_name; char* song3_name; char* song4_name; // 四首歌的物量 int song1_key; int song2_key; int song3_key; int song4_key; }Dan; 来看看网页版中数据是如何存储的 // MaDan数据 let MaArr = [ new MaDan(813, 955, 907, 654, "Glitch Nerds", "Borealis", "Niflheim", "Moon", "1dan"), new MaDan(1152, 850, 950, 969, "Follow Tomorrow", "Bronze Coffin", "Keigan no Zettaireido", "SakuraMirage", "2dan"), new MaDan(1169, 1143, 974, 1347, "Quon", "Genkyoku o Kirikizamu", "Gin no Kaze", "Adjudicatorz-Danzai-", "3dan"), new MaDan(1400, 1402, 1685, 1599, "Tenkuu no Yoake", "VALLISTA", "Crystal World ~Fracture~", "Zenithalize", "4dan"), new MaDan(1953, 2250, 2166, 1667, "Ten Thousand Tons of Anonymous Letters", "Chips of Notes", "Despair of Elferia", "Kamigami no Asobi", "5dan"), new MaDan(1487, 1424, 1381, 1587, "Sweet Cherry X", "Akasagarbha", "HELLO EveryOne", "DataErr0r", "6dan"), new MaDan(1909, 1814, 1777, 2681, "Fairy Stage", "Xross Infection", "Wave", "Blue Zenith", "7dan"), new MaDan(1962, 1067, 2388, 1772, "The Lost Dedicated", "The Party We Have Never Seen", "Finixe", "Ultimate Dream", "8dan"), new MaDan(1799, 2023, 2283, 1787, "Dusk", "Panic Popn Picnic", "Kick-ass Kung-Fu Carnival", "Yakusoku no kimi", "9dan"), new MaDan(2606, 2188, 2194, 2187, "Chaser", "Loli Fantasy", "Daydream", "Moon Gate", "10dan"), new MaDan(2160, 1952, 1821, 3249, "Border of Life", "Scorpion Dance", "The Island of Albatross", "beautiful loli thing", "ex1"), new MaDan(2871, 2024, 1871, 2452, "Hitsune no youmeiri", "紫阳花-AZISAI-", "love&justice", "message", "ex2"), new MaDan(2327, 1593, 2166, 2200, "Jumble Rumble", "End Time", "++", "Crow Solace", "ex3"), new MaDan(2731, 2653, 2033, 2761, "EDM Jumpers", "line-epsilon", "Contrapasso -paradiso-", "YELL!", "ex4"), new MaDan(3229, 2731, 2561, 2109, "Satori de Pon!", "Legend of Seeker", "Crystal World -Fracture-", "Wizdomiot", "ex5"), new MaDan(1766, 1861, 3171, 1680, "Sepia", "Nopea", "Satori Trisis", "Death", "ex6"), new MaDan(2339, 2461, 2511, 2177, "Paranoia", "Boulafacet", "Paraclete -Miracle-", "Yumemi no Shonen", "ex7"), new MaDan(1929, 2380, 2710, 4675, "Martail Arts", "Gene Disruption", "Paradigm Shift", "Death Melody", "ex8"), new MaDan(3468, 3335, 3698, 5061, "Only my railgun", "-Purgatorium-", "Blue Zenith", "Inner Universe", "exfin"), new MaDan(492, 529, 595, 681, "Ikitoshi Ikerumono", "Rambling Pleat", "Yi Meng Qian Xiao", "White Eternity", "0danv3"), new MaDan(695, 621, 718, 1279, "Rex Incoqnito", "Koiseyo Otome!", "Break", "KING", "1danv3"), new MaDan(1397, 1090, 805, 1212, "Stargazer", "Seyana", "Love Emotion", "Mermaid Girl", "2danv3"), new MaDan(1055, 1489, 1288, 1789, "Koi Kou Enishi", "Onegai!Kon Kon Oinari-sama", "The Last page", "Hoshi ga Furanai Machi", "3danv3"), new MaDan(1865, 1434, 1284, 1839, "Umiyuri Kaiteitan", "Fire in the sky", "Icyxis", "The Crimson Empire", "4danv3"), new MaDan(1282, 1706, 1473, 1939, "Platinum Disco", "Cute na Kanojo", "Reimei Sketchbook", "Joker", "5danv3"), new MaDan(1694, 1636, 1803, 2115, "Chocolate Disco", "Call Me, Beep Me (If You Wanna Reap Me)", "DIE IN THE SEA", "unhappy century", "6danv3"), new MaDan(1701, 1799, 2132, 1899, "Don't Stop The Music", "Six Acid Strings", "Arkadia [Illusion]", "Valkyrie Revolutia", "7danv3"), new MaDan(2237, 2081, 2280, 2000, "Don't let you down", "Yoru ni Kakeru", "Snow Veil -Shoujo to Kemono no Mori-", "Positive Dance Time", "8danv3"), new MaDan(2374, 1899, 2142, 1810, "Kikai Shoujo Gensou", "Cold Planet", "Stray Star", "Unleashed World", "9danv3"), new MaDan(2034, 1740, 2270, 2166, "Hiensou", "Rocky Buinne", "Yue Ai Yue Ye", "Spin Eternally", "10danv3"), new MaDan(1952, 2013, 1953, 2111, "Scorpion Dance", "Tailin no Soul", "Eiya no Parade", "Onsoku Uchuu Ryokou", "ex1v3"), new MaDan(2107, 1953, 2386, 2674, "Moments", "Towards the Horizon", "Torikago", "Frontier Explorer", "ex2v3"), new MaDan(2518, 2636, 2326, 2511, "Edison", "INTERNET OVERDOSE", "Euthanasia", "Fin.ArcDeaR", "ex3v3"), new MaDan(2634, 2212, 2336, 2602, "ZENITHALIZE", "Asymmetrical Grooves", "Pure Ruby", "EVERLASTING HAPPiNESS", "ex4v3"), new MaDan(2734, 2417, 3089, 2974, "Bring Our Ignition Back", "Unsan-musho", "Electric Angel", "Kegare Naki Bara Juuji", "ex5v3"), new MaDan(2483, 2276, 2921, 3194, "Defeat awaken battle ship", "Extraction", "Pastel Subliminal", "Synthesized Fortress", "ex6v3"), new MaDan(2846, 2260, 2333, 3347, "LiFE Garden", "Alpha", "Stay Alive", "Heaven's Fall", "ex7v3"), new MaDan(3789, 3663, 2424, 3255, "Hayabusa", "Shuu no hazama", "Amatsukami", "CRIMSON FIGHTER", "ex8v3"), new MaDan(3888, 3030, 3581, 3700, "crazy_tek (DJ Noriken Remix)", "Nhelv", "Shuuten", "Deadly force - Put an end", "ex9v3"), new MaDan(2828, 3362, 3393, 5100, "Infinity Heaven", "NEURO-CLOUD-9", "Kizuato", "Runengon", "exfinv3"), ] 可以看到,简单地调用构造函数新建对象。继续实现: 我们可以写一个init函数,根据需要创建结构体变量。 Dan* dan_data_init(Dan*, int* songs_key); 第二个参数是存放物量的数组,这样就实现了代码复用,减少重复代码的编写,定义一次所有物量即可。 // 常规段 int mld_1dan_total_keys[] = {813, 955, 907, 654}; int mld_2dan_total_keys[] = {1152, 850, 950, 969}; int mld_3dan_total_keys[] = {1169, 1143, 974, 1347}; int mld_4dan_total_keys[] = {1400, 1402, 1685, 1599}; int mld_5dan_total_keys[] = {1953, 2250, 2166, 1667}; int mld_6dan_total_keys[] = {1487, 1424, 1381, 1587}; int mld_7dan_total_keys[] = {1909, 1814, 1777, 2681}; int mld_8dan_total_keys[] = {1962, 1067, 2388, 1772}; int mld_9dan_total_keys[] = {1799, 2023, 2283, 1787}; int mld_10dan_total_keys[] = {2606, 2188, 2194, 2187}; 这里目前把常规段都录入了,那要怎么按需匹配创建结构体变量呢?可以通过一个指针数组保存这些数据数组的地址,然后根据用户输入的数字直接作为索引,创建结构体变量并进行初始化赋值。 优点:避免if/switch分支判断逐个比较,时间复杂度为常数阶。 int* dan_total_keys_index[] = {mld_1dan_total_keys, mld_2dan_total_keys, mld_3dan_total_keys, mld_4dan_total_keys, mld_5dan_total_keys, mld_6dan_total_keys, mld_7dan_total_keys, mld_8dan_total_keys, mld_9dan_total_keys, mld_10dan_total_keys}; 后续接着往这个数组里面装指针即可。 基本的数据结构实现了,就可以开始研究一下算法,后续再录入数据吧。 算法实现 曾经听群友讲过这个东西核心理念是加权平均数,最近才学到,那就来看看怎么做这个平均数吧。 直接看原作者是怎么实现的  function normal_calculation(accArr, noteArr) {             let score1 = accArr[0]             let temp1 = (noteArr[0] + noteArr[1]) * accArr[1] - noteArr[0] * accArr[0]             let score2 = temp1 / (noteArr[1])             let temp2 = (noteArr[0] + noteArr[1] + noteArr[2]) * accArr[2] - (noteArr[0] + noteArr[1]) * accArr[1]             let score3 = temp2 / (noteArr[2])             let temp3 = (noteArr[0] + noteArr[1] + noteArr[2] + noteArr[3]) * accArr[3] - (noteArr[0] + noteArr[1] + noteArr[2]) * accArr[2]             let score4 = temp3 / (noteArr[3])             return [score1, score2, score3, score4]         } 第一首的ACC不变,这个不说了。 这个temp算的是什么??? 刚刚去看了一下引用,accArr存放着四首的玩家成绩Acc,noteArr存着这四首歌的Note总数量。 还是没搞明白这个temp在干什么,看这段代码是真想骂街啊。 用1dan举例子,Note和ACC: 813, 955, 907, 654 99 98 96 94 叠批来了 Malody的每一个判定都有不同的权重,都有对应不同的Acc衰减,所以每一首歌曲结束后都是一个加权平均数。程序要做的事情就是逆推出原本的Acc。 所以accArr是一个累计加权平均值数组。 noteArr是每批数据的权重。 目标:计算每批数据的独立加权平均值。 数学逻辑 第一批数据: let score1 = accArr[0] 直接使用第一个累计平均值a1,此时只有第一批数据。 第二批数据: let temp1 = (noteArr[0] + noteArr[1]) * accArr[1] - noteArr[0] * accArr[0] let score2 = temp1 / noteArr[1] 累计平均值a2 = (n1s1 +n2s2) / (n1 + n2) 解得s2:(n1 +n2)a2 - n1s1 / n2 …… 额…这一顿推导,给我也整不会了。我数学奇烂,那就用一个简明易懂的例子来理解吧。 人话 假设参加了4次考试 第一次考了80分(score1) 第二次的平均分是93.3(accArr[1]) 第三次的平均分是95(accArr[2]) 第四次的平均分是97.5(accArr[3]) 但是你忘了每次考试的重要程度(权重): 第一次考试占10(noteArr[0] = 10) 第二次 20(noteArr[1] = 20) 第三次 30(noteArr[2] = 30) 第四次 40(noteArr[3] = 40) 你想知道每次考试单独的平均分是多少 第一次考试: 直接用平均分(因为只有一次考试) 第二次考试: 先算总分:前两次总分 = (10+20)*93.3 = 2800 减去第一次的分数:第二次分数 = 2800 - 10 * 80 = 2000 第二次平均分: score2 = 2000 / 20 = 100 第三次考试: 总分:(10 + 20 + 30 )*95 = 5700 减去前两次:第三次分数 = 5700 - 2800 平均分:score3 = 2900 / 30 ≈ 96.7 第四次考试 总分:(10+20+30+40)*97.5 = 9750 减去前3次:第四次分数 = 9750 - 5700 = 4050 平均分:score4 = 4050 / 40 = 101.25 写着写着突然发现 typedef struct Dan {     // 四首歌的物量     int* songs_total_keys; } Dan; 这个数据结构只需要一个数组。 人话说完了,该说说计算机的话了。 实现 double *common_calc(int *total_keys, double *player_acc) { // 权重:total_keys // 分数:player_acc // 返回的数组,保存计算完成的Acc double *result = (double *)malloc(sizeof(double) * 4); if (result == NULL) { printf("[ERROR] 内存分配失败!"); return NULL; } double song1_acc, song2_acc, song3_acc, song4_acc; // 第一首歌:直接取第一个累积平均值 result[0] = player_acc[0]; // 第二首歌:((n0 + n1)*a1 - n0*a0) / n1 double sum2 = total_keys[0] + total_keys[1]; result[1] = (sum2 * player_acc[1] - total_keys[0] * player_acc[0]) / total_keys[1]; // 第三首歌:((n0 + n1 + n2)*a2 - (n0 + n1)*a1) / n2 double sum3 = sum2 + total_keys[2]; result[2] = (sum3 * player_acc[2] - sum2 * player_acc[1]) / total_keys[2]; // 第四首歌:((n0 + n1 + n2 + n3)*a3 - (n0 + n1 + n2)*a2) / n3 double sum4 = sum3 + total_keys[3]; result[3] = (sum4 * player_acc[3] - sum3 * player_acc[2]) / total_keys[3]; return result; } 然后就是主函数处理用户输入了,没什么含金量,不水了。

2025/6/7
articleCard.readMore

Links

Link Description MRZHU的小站 向着计算物理出发吧! RhoPaperの小站 纸 至 执 177 行胜于言 PRIN BLOG 半吊子全栈开发者的日常 Web Teleporter - 搬砖日记 - 彬红茶日记 我的个人笔记📒 轻风blog 茫茫人海,多么幸运才能遇见你! 成烁BLOG 致一锦程 探索不停 Jame 随笔 白熊阿丸的小屋 在这里可以看到一个真实的我,我会在这里书写我的一切 Mayx的博客 Mayx’s Home Page 龙场茶室 - 太隐 一个人的思想发育史就是他的阅读史 交换友链、链接变更等请发邮件:i@glowisle.me 交换友链要求 独立博客(非影视、聚合、搬运类); 文章不少于30篇; 原创内容占比至少80%; 本站信息 名称:映屿 简介:关于互联网、书籍、生活琐事以及那些一闪而过的念头。 链接:https://www.yingyu5658.me/ 订阅:https://www.yingyu5658.me/atom.xml

2025/6/7
articleCard.readMore

读书

2025 《白夜行》 东野圭吾(日本) 《解忧杂货店》 东野圭吾(日本) 《金色夜叉》 尾崎红叶(日本) 《仲夏之死》 三岛由纪夫(日本) 《潮骚》 三岛由纪夫(日本) 《金阁寺》 三岛由纪夫(日本) 《伊豆的舞女》 川端康成(日本) 《雪国》 川端康成(日本) 《三岛由纪夫传》 约翰·内森(美国) 《活着》 余华(中国) 《变形记》 弗兰兹·卡夫卡(奥地利) 《春雪》 三岛由纪夫(日本) 《奔马》 三岛由纪夫(日本) 2024(3 本) 《朝花夕拾》 鲁迅(中国) 《西游记》 吴承恩(中国) 《骆驼祥子》 老舍(中国)

2025/6/7
articleCard.readMore

杂记#2025-06-06

纠结了很长时间,这篇文章命名的事。我是典型的选择困难,出于文章内容组织的形式,就把他命名为杂记了。不过应该也没什么人看,我就~~(梦)~~想到什么写什么了 时间感慨 今天就上半天学,下午高考布置考场了。一进门就看到教学楼处处拉着横幅,写着给高考考生加油助威的标语。睡眼惺忪的我一下子就惊醒了,高考?又来?下课,和同学聊天,我又想起来这茬,自言自语:“高考,又高考了……”让人听见了,“高考就考呗和你有啥关系?”是啊,和我有什么关系,该和我有关系吗?高考过一阵子后就该中考了。再过一年,我也上中考考场了。 今天是我初中三年,第二次,也是最后一次放高考假,初一的时候还什么也不懂,傻了吧唧地,快乐地就活了一年。一升入初二,第一个学期精神状态出奇的差。老师天天讲各种心灵鸡汤、各种教育学生,都放他妈狗屁。只有三年过得太快了这句话是真的。一直感觉自己刚升入初中啊,地生会考迫在眉睫了。 端午假期回来的那天,升旗仪式改成了给初高三学生加油的什么仪式,实际上也就是校领导在上面讲讲万年一套的老话,学生在台下鼓鼓掌。可能是吧,初一是什么场面,已经忘了,但依稀记得,我当时很受鼓舞,觉得老师和上台讲话的同学吐出来的每一个字、每一个标点符号都是那么振奋人心。今年只有麻木感和危机感,回班后,班主任说,明年就该你们走那个状元门啦!围着我心的最后那块砖头也被一脚踢飞了。 我对毕业不害怕,我甚至有点向往毕业。好像有人初中毕业哭得死去活来的,记得小学就有人这样了。可能我向来都是一个薄情的人,对于同学情这种事,没那么大牵挂,活的也舒心。网络也发达,能联系的自然会联系,没话说的也就不必强找话题,已经不是一路人了。顺其自然?顺其自然。真正让我害怕的是考试,我也没有特别想去的学校,也没有特别想学的专业。计算机?程序员?别操蛋来了,已经不是2020年了,普通人没高学历怎么卷。美术?那更是要饿死的了。没什么学习的动力,唯一的动力就是成绩不差暂且能在同学面前抬起头吧。我感兴趣的方向都有被AI替代的风险了。现在想这个确实为时过早,高中三年活下来才有资格想去哪里要饭。 一写学校的事就难免重力展开啊…… 夏 小时候非常喜欢夏天,现在平等地讨厌春秋,因为会犯鼻炎;一贯地憎恨冬天,太冷了。那只有夏天好了。 夏天一直有一层回忆滤镜,今年要仔细感受一下。好好想想,童年夏天回忆有三: 空调、冰棍、帆布毯。两样陆陆续续都回来了,唯独空调费劲,空调到底是因为热才开,还是因为“时候到了”才开?空调服务的对象是“时候”,还是人? 工具迷恋 我承认,我真的没把时间花在刀刃上。经常浪费时间,在一个几百年前的软件上花大力气大时间,甚至废寝忘食,就为了实现一个已经由专业团队开发好的、开箱即用的、体验还更好的功能。美其名曰“极客精神”。我对极客精神没偏见,只是突然发觉,不应该把时间花费在这种事上。对,我就是在说Emacs和Vim。 工具说到底还是为了做事的,先选简单的工具,把事情做得精湛,再谈优化工具。代码还写不明白,反到是一直迷恋在配置各种编辑器,白白浪费时间,作业也写不成,代码也写不成,最后配置出来了一块会爆炸的排泄物,一团矛盾。 去年12月底,我开始知道了Vim这个东西,在折腾了一会被劝退后,发了条朋友圈吐槽。 但是不得不承认,Vim比Emacs好配多了。现在我的Vim起码到了能畅快写代码的程度。在这之前,一直都在断断续续地折腾Vim、终端、系统。真正写代码的时间没有三分之一。幸好在玩腻Arch后及时悔悟,装回了Windows,虽然种种不适应,但用起来很方便,起码不会再像以前那样浪费时间了。 感谢Windows,感谢微软……否则我就要成为开机 => 桌面炸了 => 花两天修复桌面 => 开机 => 打开自己半透明+亚克力+二次元小人背景的终端 => 输入neofetch欣赏半个小时桌面并截图发群里:“顺便说一下,我用的是Arch。”的那种人了。偶然间听到过一句话: “如果一块表时间是错的,那他走的每一秒都是错的;如果这块表停了,那它一天中至少有两次是对的。”挺有道理的。 翻看了一下自己写的代码和以前的文章,发现自己的快速上手的能力较强,各项技术都有涉猎,知识面较广,但这样的结果就是哪样都不深。尤其是数据结构与算法接触非常少,写不出来什么干巴的代码,之后要改一改了,在数学和算法上深耕一下,也在C语言深耕。C语言一直是很让我向往的语言,运行几乎无开销、对硬件极致的控制能力,灵活、高效、结构紧凑。但他复杂易混淆的指针也多次劝退我这个初学者。这个精髓没领悟到,玩C语言就玩不到灵魂了。

2025/6/7
articleCard.readMore

C语言的头文件与OOP范式的抽象类、接口的异同点

引言 说真的,从去年十一月份开始接触编程,到现在也好几个月了,自认为进步速度较快,但速度快也就导致了深度浅,走马观花式的学习,现在还是有很多理解不深刻的点,今天来仔细研究一下这个问题。我也是先入为主,第一门编程语言学的是Java,所以再接触C,一些概念就混淆了。 C语言模块化设计的核心 头文件本质是对外提供的接口契约,包含函数声明、宏定义、结构体类型声明。例如: // math_utils.h #ifndef MATH_UTILS_H #define MATH_UTILS_H int add(int a, int b); // 函数声明 #endif 编译隔离:通过头文件守卫(#ifndef)实现模块之间的编译隔离。 虽然头文件可以实现函数,但这会破坏模块化。 模块化实现规范 源文件承载具体实现,通过包含对应头文件实现联系 模块间通过extern关键字声明共享全局变量(谨慎使用) 面向对象中的抽象机制 抽象类可以包含部分实现,它的目的是:描述一个公共基类,有共同的特征,有部分方法实现,但另一部分依赖子类自行实现。 接口是一系列方法的声明,一个接口就是在描述一种能力。 设计目标上,抽象类为了代码复用+多台,而接口是行为契约。 设计范式对比 C模块化 vs OOP抽象 抽象粒度:C模块关注功能单元(做什么),而OOP抽象关注对象行为契约(是谁做什么) 扩展方式:C通过函数指针传递上下文,OOP通过继承、实现扩展。

2025/6/7
articleCard.readMore

Emacs配置记录 2——C/C++环境配置

前言 经过上一篇的简单调教,Emacs已经勉强变成了一个温顺的文本编辑器,但是离写代码这个宏大的目标还是有一段距离的,今天来解决主要问题:代码补全。由于我要写一点简单的C代码,那么重点就先放到C/CPP环境搭建中。 站在巨人的肩膀上,在Emacs中的代码补全使用巨硬的LSP协议。 Spacemacs 经过考虑,我还是决定使用Spacemacs,比起原版Emacs,它更适合新手,也更能快速投入开发。避免配置陷阱,过多把时间花在刀把上。唉,也就是说,昨天大部分都白干了。算了,生命的意义就在于折腾,怕折腾我也不会玩Emacs了。来吧! 先来安装一下Spacemacs。 git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d 重启Emacs,让他下载一下自带的包。 上次没清理干净Spacemacs,不知道存在哪的备份还在,算是免去了一些折腾吧。来看看现在的Emacs都配置了什么。 dotspacemacs-configuration-layers '(yaml markdown javascript (auto-completion :variables auto-completion-idle-delay 0.01 ; 降低补全延迟 auto-completion-minimum-prefix-length 1) (prettier :variables prettier-always-enable t) ; 保存时自动格式化 (javascript :variables javascript-backend 'lsp ; 启用LSP后端 javascript-fmt-tool 'prettier) ; 格式化工具选Prettier (c-c++ :variables c-c++-backend 'lsp-clangd) ; C/C++使用Clangd后端 (vue :variables vue-backend 'lsp) ; Vue使用LSP后端 (html) ; HTML/CSS支持 (lsp) ; 必须的LSP核心支持层 (auto-completion) ; 自动补全 (syntax-checking) ; 语法检查 ;; ---------------------------------------------------------------- ;; Example of useful layers you may want to use right away. ;; Uncomment some layer names and press `SPC f e R' (Vim style) or ;; `M-m f e R' (Emacs style) to install them. ;; ---------------------------------------------------------------- ;; auto-completion ;; better-defaults emacs-lisp treemacs ;; git helm lsp ;; markdown multiple-cursors ;; org ;; (shell :variables ;; shell-default-height 30 ;; shell-default-position 'bottom) ;; spell-checking ;; syntax-checking ;; version-control treemacs) emmm,还是有点有用的。比如C/C++这里,就启用了LSP。还有一些之前搞的前端配置。就是不知道为啥,JavaScript的补全不太好使。 语法检查 语法检查,选择当前比较成熟的flycheck,在Spacemacs中对应syntax-checking,在.spacemacs中的dotspacemacs-configuration-layers写入(configuration-layer/declare-layer 'syntax-checking) 该层会自动集成Flycheck及其常见语言的后端支持。 C/C++要安装clang-tidy或cppcheck。 进阶配置 (with-eval-after-load 'flycheck (setq flycheck-check-syntax-automatically '(save mode-enabled) ;; 保存时检查 flycheck-display-errors-delay 0.5 ;; 错误显示延迟 flycheck-indication-mode 'right-fringe)) ;; 错误标记位置 .spacemacs 文件基本介绍 .spacemacs 文件一般会自动生成在主目录下,这个文件是配置 Spacemacs 的入口,有关于 Spacemacs 本身的配置基本都能在里面进行修改,用户设置同样在这个文件中修改。 .spacemacs 中,内容一般被分为以下几个部分,每个部分都封装在一个函数中: dotspacemacs/layers 在这里可以声明一些 layer,以及删除、增添一些包,在这里还可以调整 Spacemacs 加载时的一些行为 dotspacemacs/init Spacemacs 绝大部分的配置都位于此,你可以在此修改配置中可选的选项,但绝对不能将自己的用户配置代码添加在这里 dotspacemacs/user-init 这里的内容会在 Emacs 启动前开始加载,一般在这里设置你需要使用的 elpa 源,你应该尽量把用户配置放在 dotspacemacs/user-config 中 dotspacemacs/user-config 在这里可以添加你的用户配置代码,你自己的定义的大部分配置一般都在这里完成 dotspacemacs/emacs-custom-settings Spacemacs 自己生成的配置,同样不建议自己去修改 摘自Spacemaccs 14 Days

2025/6/5
articleCard.readMore

【投稿】关于我对命运既定的想法

本文作者:星が落ちる 本文观点仅代表作者个人观点,不代表任何除作者外的个人或组织的立场。 我的观点或许和强决定论很相似,我认为人类存在本质上是一种“预置框架”下的时间性展开,所谓自由意志与命运抗争,都是框架内既定的程序脚本 存在的结构性预设 宇宙并非混沌的随机,而是一个蕴含精密内在逻辑与因果的拓扑结构。人类个体,是其中的特定节点,生命轨迹并非无中生有,而是被预编于这个宏观框架之中,此框架并非物理牢笼,而是一套时间-事件-可能性的完备集合。它规定了每个个体生命中所有的经历、选择、结果。我们个体看似无穷的可能性,实则严格限定于框架所划定的可能性空间之内 时间的预分配性与行为的伪自由 我们做任何事并非源于主体的绝对自由,而是对框架内预设时间槽的填充。我们在特定时刻产生做某事的冲动、做出某个决定、采取某项行动——这些看似自主的瞬间,实则是框架内预设的触发点被激活。早与晚的差异,体现为个体在框架内遍历其预设事件序列的不同速率或路径选择。事件的必然性及其在人生中的结构性位置已被既定。 既定的事必定会发生。 框架内的元叙事 许多人说只要自强不息努力奋斗就可以战胜命运、主宰命运,而事实真的如此吗? 我认为人类引以为傲的战胜命运的壮举,其本身即为框架剧本中不可或缺的高潮篇章,在面对预设的逆境、挑战或命运枷锁时,所迸发的反抗意志、运用的智慧策略、付出的艰辛努力,以及最终取得的胜利——这一切情感、思考与行动的总和,都是框架预先设定的核心情节要素。 所谓打破枷锁的快感与成就感,本质上是框架赋予个体体验其预设角色的情感反馈机制。人类在抗争中所依赖的勇气、毅力、才智等品质,同样是框架赋予该角色的属性配置。因此,战胜命运非但不是对框架的逃脱,反而是对其叙事张力与复杂性的完美演绎,是框架维持其动态平衡与戏剧性的自洽设计。 存在的意义 我的这种观点可能超越了机械的因果,指向一种蕴含复杂可能性、个体体验丰富性甚至伪自由模拟的结构性宿命论。我的观点不同于宗教宿命论,不诉诸人格化神明,而诉诸一个抽象的、自洽的、包罗万象的存在逻辑系统。 在框架下,存在的意义不在于创造命运,而在于深度体验与理解自身角色。 框架内预设的体验序列对每个个体而言是独一无二且不可替代的。即使意识到框架的存在,这种感觉本身也是框架赋予的一种深刻体验,是角色复杂性的体现。 如同盆景展现自然之美,个体在命运框架的既定中,依然可以追求情感、智慧、创造力的内在充盈与表达,这种绽放同样是框架预设的珍贵可能性。 宇宙如同一个编写了所有可能世界线的超级程序,而人类意识则是运行于此程序中的、具有自我叙事功能的独特进程。 我们的自由选择,是对程序分支的遍历命运的枷锁,在此视角下,人生并非一场开放的冒险,而是一场在既定剧本中力求深刻演绎、并从中获得独特存在性领悟的庄严旅程。框架是牢笼,亦是舞台;是限制,亦是成全。 在必然性的重压下,我们或许可以寻找到一种深刻的宁静与对生命本身更谦卑的敬畏。 我们能做的就是尽可能在框架下演绎精彩的人生。

2025/6/4
articleCard.readMore

我还是放不下Emacs!

前言 难受,真难受呀。作为一个痴迷Vim的人,总是被Emacs的强大勾引,看见别人配的酷炫全能的Emacs就走不动路,脑子里想着“没事没事,我Vim轻量启动极快,Emacs这种重量级是比不上的”,自我安慰。实际上多想玩Emacs只有我自己知道…… 我之前也试过配Emacs,但是Windows搞出来的不伦不类还很卡的东西太难受,用WSL尝试了一下Spacemacs,搞不明白那个层机制,也对ELisp这个语言不熟悉(说实话到现在Lua的一些东西我都不明白),而且之前的配置也一直想一口吃个大胖子,一天内就配到IDE的强大程度,经过几次失败和Vim配置经验后,我深知这是不可能的,除非在我使用Emacs后N周年的第N周目重新删干净再配,也许能做到。 定个小目标吧,每天配一点点,成果起码要达到以下程度: 能胜任前端、Nodejs的开发 能胜任CPP/C的开发 能使用EAF浏览网页 有一点花里胡哨的小功能 其实我也挺想把博客迁移到Emacs,完全用org-mode来写,Hexo越来越慢。其实Hugo也不是不行,就是不太熟悉也不喜欢Go。看了刘家财大佬的博客后感觉这个也太酷了,主题我也很喜欢,但是评论功能可能有点折腾,我对评论系统也有点不太在意。最难割舍的是现在用的这个主题…… 刘家财老师是这样说的 只不过遗憾的是,即使写了近 10 年的博客,有价值的评论少之又少,可能中文互联网内没多少人认真写技术评论吧。 这点我确实认同,观察了一些博客的评论,真正讨论技术内容的没几个,大多都是在围观、附和。但是我的博客类型也不能算是纯技术博客,保持与读者的互动还是很有意思的。 言归正传,我现在的Emacs在WSL里,装的是Spacemacs,能正常用eaf,但是写代码很难受,也没有补全,可以说现在它只能当一个浏览器用,我准备推翻重新配。 那么,从现在开始,来配Emacs!!! ../../images/emacs-book/intro/learningCurve.jpg 与过去挥手 在rm -rf ~/.emacs.d后,那个不伦不类、上不去下不来的Emacs彻底成为了历史。重新输入Emacs,又看到熟悉又陌生的丑陋开屏页。 小插曲 WSLg间歇性抽风,打不开GUI Display 10.255.255.254:0 unavailable, simulating -nw 打开管理员Powershell,运行wsl --update ![[public/images/我还是放不下Emacs!/Pasted image 20250603210050.png]] 我草,怎么这么慢?? MELPA配置 (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (package-initialize) 切换中国镜像源 (require 'package) (setq package-archives '(("gnu" . "http://mirrors.cloud.tencent.com/elpa/gnu/") ("melpa" . "http://mirrors.cloud.tencent.com/elpa/melpa/"))) (package-initialize) 重启Emacs,输入package-list-packages就可以查看所有插件。package-install,回车输入插件名就可以安装对应插件。 默认情况下,插件会被安装到 ~/.emacs.d/elpa/ 目录下。 use-package 输入package-install,输入use-package,回车安装,然后在init.el中写 (eval-when-compile (require 'use-package)) ivy (use-package ivy :ensure t :init (ivy-mode 1) (counsel-mode 1) :config (setq ivy-use-virtual-buffers t) (setq search-default-mode #'char-fold-to-regexp) (setq ivy-count-format "(%d/%d) ") :bind (("C-s" . 'swiper) ("C-x b" . 'ivy-switch-buffer) ("C-c v" . 'ivy-push-view) ("C-c s" . 'ivy-switch-view) ("C-c V" . 'ivy-pop-view) ("C-x C-@" . 'counsel-mark-ring); 在某些终端上 C-x C-SPC 会被映射为 C-x C-@,比如在 macOS 上,所以要手动设置 ("C-x C-SPC" . 'counsel-mark-ring) :map minibuffer-local-map ("C-r" . counsel-minibuffer-history))) amx (use-package amx :ensure t :init (amx-mode)) ace-window (use-package ace-window :ensure t :bind (("C-x o" . 'ace-window))) mwim (use-package mwim :ensure t :bind ("C-a" . mwim-beginning-of-code-or-line) ("C-e" . mwim-end-of-code-or-line)) undo-tree (use-package undo-tree :ensure t :init (global-undo-tree-mode) :custom (undo-tree-auto-save-history nil)) smart-mode-line (use-package smart-mode-line :ensure t :init (sml/setup)) good-scroll (use-package good-scroll :ensure t :if window-system ; 在图形化界面时才使用这个插件 :init (good-scroll-mode)) 今天就先到这里吧。

2025/6/4
articleCard.readMore

六年前,曾短暂地拥有过一周的狗。只有一周。 那个时候爸妈都出去上班,只留我和我奶奶在家。奶奶不喜欢小动物,不喜欢任何活物,包括我爸爸。据说她年轻时,经常把我爸爸送到邻居家照看,单纯因为不喜欢。同样地,她也不喜欢花草。爷爷养的茉莉花,颜色洁白,屋内也花香飘逸,死了。被奶奶用热水浇死的。 奶奶不喜欢任何活物,同样地,她也不喜欢这只狗。不知道为什么,不去跟爸妈说,反而在我面前卖力。装心脏病、哭闹。我当时还小,哪懂什么真假,而且奶奶也是很重要的亲人,我很害怕再也见不到她。小孩子就是这么天真。印象最深刻的就是让我拍她胳膊,我又急又怕,手酸到没力气、颤抖也不敢停下来。 多年后,奶奶再次提起这件事,轻描淡写的嬉笑着:“我当时是装的呀。”直到今天,奶奶的心脏依旧强有力而平稳地跳动着。我那些日子倒是被吓得快犯了心脏病。 那七天,我度日如年。但仔细回想计算,只过了一周。小时候的时间怎么过都过不完。 狗送走了。 那天,爸爸开车送我们去到一个很远的地方,我坐在车上没有什么情绪。看着旁边笼子里的狗,没有什么情绪。想起这七天发生的所有事,没有什么情绪。不知道该有什么情绪,是该因伙伴被迫离自己而去感到悲痛欲绝,还是该因自己马上解脱而感到畅快轻松。我没有什么情绪。 路程很远,时间很长,我和妈妈坐在车上,一句话没有说。 到地方了,我还是麻木的。下车后,把笼子打开,牵出来那条狗,它的下一任主人接过栓绳后,它就再也与我没有任何关系。笼子没让对方拿走,说是留个念想。 七天的感情没有多深,没有多深。交接完成后,妈妈和那个人有几句大人之间的寒暄,我没注意听,也听不懂。我没有什么情绪,没有什么记忆。 回到车上,我坐在车上不知道该有什么情绪。看着旁边空空的笼子,没有什么情绪。解脱了,成功了。我和妈妈坐在车上,一句话没有说。 下车后,妈妈的眼泪率先落下来,我最见不得别人哭,也跟着哭了。 那一天,一个懵懂的儿童学会了珍惜,也学会了憎恨。 妈妈给我看它的新主人发朋友圈,它生活在一个更大的房子里,有很多玩具,也有人跟它一起玩了。它很开心。我的眼泪又落了下来。时至今日,我的眼泪还是控制不住地流出来。七天的感情,没多深,没多深。 送走狗后没多长时间,妈妈就不上班了。可能是发现了我每天的日子过得多精彩,也可能是她累了。总之,我不用再面对奶奶了。 19年,印象中只有三件事。中华人民共和国成立七十周年、狗走了、猫来了。 三个月后,亲戚开的猫舍送给我们一只小猫。蓝猫,通体灰色,没多好看。我一直很喜欢猫,丑也喜欢。 当时酷爱发朋友圈,有点大事小事都要发个朋友圈记录一下,也留下来很多这只猫的照片和视频。我们给他起名叫四喜。已经忘了为什么叫四喜了。 我学会了珍惜,非常珍惜这只猫,谁也不让摸,谁也不让碰。有一次厨房窗户没关好,四喜跑到窗户外的封窗框上,正扒着头往外试探。我二话不说,什么也没想就冲出去,踩着封窗框,把它抱了回来。那天我主动要求自己睡,在爬在枕头上哭了一整晚,我太害怕失去她了。 时间过得越来越快,越来越快。 六年了,六岁了,老了。我太害怕失去她了。今天收集了很多猫毛。我害怕失去她,更害怕她被遗忘,被遗忘就真的什么都没了。 仔细回想,太对不起四喜了,最近两年都没怎么好好陪她。她倒是一直很想我,我不在时,爬在我的衣服上,被褥上。回来时,我走到哪跟到哪。睡觉了,爬在枕边,踹起手,睡倒了,就干脆肚皮也露出来。伏案时,趴在纸上,坐在电脑前,爬在鼠标垫上。四喜一直都沉默寡言,但当我一个月没回家,她见到我后也忍不住啼哭起来,一边用头猛蹭我的腿。一对眼眶里镶嵌着两颗晶莹剔透的琥珀,总是温柔地冲我慢慢眨眼。

2025/6/2
articleCard.readMore

Electron CommonJS require踩坑

最近在开发一个Electron项目,在导入类的时候有以下报错: node:internal/modules/cjs/loader:1411 Uncaught Error: Cannot find module './File' Require stack: - E:\Develop\markdown-editor\src\html\index.html at Module._resolveFilename (node:internal/modules/cjs/loader:1408:15) at a._resolveFilename (node:electron/js2c/renderer_init:2:2643) at defaultResolveImpl (node:internal/modules/cjs/loader:1064:19) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1069:22) at Module._load (node:internal/modules/cjs/loader:1218:37) at c._load (node:electron/js2c/node_init:2:17950) at s._load (node:electron/js2c/renderer_init:2:31718) at TracingChannel.traceSync (node:diagnostics_channel:322:14) at wrapModuleLoad (node:internal/modules/cjs/loader:242:24) at Module.require (node:internal/modules/cjs/loader:1494:12) 提示找不到模块。 Electron中,使用require语句导入,都是默认从项目跟目录开始查找,所以要拼接完整路径。使用绝对路径也是不行的,在IDE里可以跳转,但是一运行就是找不到模块 const File = require("src/js/File") Uncaught Error: Cannot find module 'src/js/File' Require stack: - E:\Develop\markdown-editor\src\html\index.html at Module._resolveFilename (node:internal/modules/cjs/loader:1408:15) at a._resolveFilename (node:electron/js2c/renderer_init:2:2643) at defaultResolveImpl (node:internal/modules/cjs/loader:1064:19) at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1069:22) at Module._load (node:internal/modules/cjs/loader:1218:37) at c._load (node:electron/js2c/node_init:2:17950) at s._load (node:electron/js2c/renderer_init:2:31718) at TracingChannel.traceSync (node:diagnostics_channel:322:14) at wrapModuleLoad (node:internal/modules/cjs/loader:242:24) at Module.require (node:internal/modules/cjs/loader:1494:12) 解决方法 使用path.join拼接完整路径 const File = require(path.join(__dirname, "../js/File.js")); 经过测试,只能用这种方法导入,太怪了

2025/5/31
articleCard.readMore

面向对象与面向过程的本质区别

面向对象与面向过程这两种编程思想主要体现在一件事上:面向对象关心谁来做,而面向过程关心做什么。 举个例子,如果我现在要开发一个五子棋小游戏,在面向对象的思想中,实现步骤应该是这样的。 有一个窗口对象,可以让我的游戏内容展示在里面 创建棋盘对象 初始化棋盘 创建计分板对象 初始化计分板 玩家开始下棋,棋盘对象创建棋子对象,绘制出来 不难看出,面向对象就是在关心谁来做,先关心哪个对象去做,再去研究这个对象要去怎么做。抽象层级更高,但是符合人类的思维。从代码结构上来看,写面向对象更偏向在画一个树状图,一级一级划分谁要做什么事情,而面向过程更像一个线性的流程图,全程都在关心需要做什么事情。 更官方地说,面向对象以算法和流程为核心,强调步骤拆解。而面向对象以与对象交互为核心,强调责任分配 当然,写法在语言上就有所限定。C更适合面向过程,头文件的引用使用函数做事就意味着C很难实现面向对象的设计模式,当然有一些比较邪门的技巧,容易开枪把自己脚指头崩掉,比如void*模拟泛型这种不在本文讨论范围。 C缺乏类、继承等基础语法支持,但可以用结构体加函数指针简单模拟对象,但设计难度有所增加,调试难度更有所增加。面向过程更适合处理逻辑简单的任务或算法密集型任务,而面向对象更适合构建GUI应用等复杂系统。 面向对象并非在所有情况下都是最优选择。还是需要依据开发项目的实际需求考量。

2025/5/30
articleCard.readMore

【数据结构与算法】哈希表

哈希表(Hash Table)是一种基于键(Key)直接访问数据的高效数据结构,其核心思想是通过哈希函数将键映射到数组的特定位置,从而实现平均时间复杂度为 O(1)O(1) 的插入、查找和删除操作。 结构定义 // 哈希表节点 typedef struct HashNode {     int key;     int value;     struct Hashcode* next; } HashNode; // 哈希表 typedef struct {     int size;     HashNode** buckets; } HashTable; 初始化 创建HashTable结构体变量,进行初始化赋值,分配桶的内存。 // 初始化哈希表 HashTable *creat_hash_table(int size) {     HashTable* table = (HashTable*)malloc(sizeof(HashTable));     table->size = size;     table->buckets = (HashNode**)malloc(size * sizeof(HashNode*));     for(int i = 0; i < size; i++)     {         table->buckets[i] = NULL;     }     return table; } 哈希函数 // 哈希函数 int hash(int key, int size) {     return key % size; } 通过简单取模运算获得哈希值 插入 // 插入 void insert(HashTable *table, int key, int value) {     int index = hash(key, table->size);     HashNode *newNode = (HashNode *)malloc(sizeof(HashNode));     newNode->key = key;     newNode->value = value;     newNode->next = NULL;     // 插入链表头部,避免遍历链表     if (table->buckets[index] == NULL)     {         table->buckets[index] = newNode;     }     else     {         newNode->next = table->buckets[index];         table->buckets[index] = newNode;     } } 头插法无需遍历到尾部。 查找 // 查找 int search(HashTable *table, int key) {     int index = hash(key, table->size);     HashNode *current = table->buckets[index];     while (current != NULL)     {         if (current->key == key)         {             return current->value;         }         current = current->next;     }     return -1; } 删除 void deleate(HashTable* table, int key) { int index = hash(key, table->size); HashNode* current = table->buckets[index]; HashNode* prev = NULL; while(current != NULL) { if(current->key == key) { if(prev == NULL) { table->buckets[index] = current->next; } else { prev->next = current->next; } free(current); return; } prev = current; current = current->next; } }

2025/5/29
articleCard.readMore

感谢恩师夸奖

课上没能回答出某个问题,遂借势挖苦批评,其中几个句子记忆犹新:“你主意太正”、“成绩不上不下”、“回家不知道是研究问题了还是学习了”。 感谢恩师夸奖。我就是主意正。 我主意正,因为我是一个有血有肉,更有灵魂的活生生的人,我有思想,我主意正,人和猩猩在行为上的显著区别就是,人知道自己在做什么,因为人的脑子很好用。我不会被戴上项圈,又或是打磨成木偶任人操控。这是我作为活人,基本该有的。 我不碌碌无为,不生活不平淡平庸。我既不会被你驯化,也没有成为推荐算法定时批量投喂的赛博牲畜,无休止地享受奶头乐,因为我主意正。 我活着有我自己的目的和意义,我主意非常正。 感谢恩师夸奖,我成绩确实不上不下。 我成绩不上不下,但我至少有一颗健全健康的心。我还是不会戴上项圈,被驯化成跪坐在主人身旁吐舌头的狗。我成绩不上不下,但是我能保证有学上。上学,成绩固然重要,但最基本要保证是活着的,肉体活着,灵魂活着。我活着快乐,我活着有意义,我活着为我。 感谢恩师夸奖,我回家就是在学习,研究问题。 我不沉迷电子游戏,也不刷短视频。我有值得我付出的事情等着我去做,并且都小有了一番成就。我从来没有停止过学习,极度的求知欲和好奇心是我保证灵魂活下去的因素之一。课余生活从逻辑冷硬的计算机到感情喷薄的文学美术作品,再到观察披着人皮的地外物种。做什么都比死读书,读死书,读书死好。我能保证有学上,而且保证灵魂活着。 因为主意正,成绩不上不下,回家学习,研究问题,我才真正的活着。永远不要试图驯化我,我永远也不会被驯化,永远不会成为谁。 感谢恩师夸奖。

2025/5/29
articleCard.readMore

【数据结构与算法】众数、中位数

今天学这个东西的时候,看到这种线性的数据结构加上排序步骤,很难不想写个程序来跑跑。 先来说说中位数,这个比较有思路。 中位数 具体的操作步骤应该是:排序 => 获得数据元素个数n => 是奇数 ? (n+1) / 2 : n / 2 那么排序就用之前学的冒泡排序,这种题目大概不会完全倒序给数据,编写sort函数: void sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } 接下来是判断奇偶,奇偶的判断非常简单,对取模运算的值比对就可以,编写is_even函数,判断奇偶性。 int is_even(int data) { if (data % 2 == 0) { return true; } else { return false; } } 完成了奇偶判断,下一步就可以正式进行中位数的运算,编写get_median函数。 double get_median(int arr[], int length) { // 获取索引 double result = 0; sort(arr, length); if (is_even(length)) { int median_index_1 = arr[(length / 2) - 1]; int median_index_2 = arr[length / 2]; // 计算数据 result = (median_index_1 + median_index_2) / 2.0; } else { result = arr[length / 2]; } return result; } 这个函数首先计算了中位数在数组的哪个索引,然后进行了计算。 众数 众数(Mode)是指在统计分布上具有明显集中趋势点的数值,代表数据的一般水平。 也是一组数据中出现次数最多的数值,有时众数在一组数中有好几个。用M表示。 那么,在程序中,想要计算一个值出现的次数并比对,可拆分为两步。 计算出每一个数据出现的次数 结果排序比对 找出最大值 我没学过什么高级的数据结构,就用这个复制数组的笨办法吧。 int get_mode(int arr[], int length) { int *copy_arr = malloc(length * sizeof(int)); memcpy(copy_arr, arr, length * sizeof(int)); sort(copy_arr, length); int max_count = 0; int current_count = 1; int mode = copy_arr[0]; for (int i = 1; i < length; i++) { if (copy_arr[i] == copy_arr[i - 1]) { current_count++; } else { if (current_count > max_count) { max_count = current_count; mode = copy_arr[i - 1]; } current_count = 1; } } if (current_count > max_count) { mode = copy_arr[length - 1]; } free(copy_arr); return mode; } 这个函数干了以下几件事: 复制数组 排序复制好的数组 对比数组元素,如果array[i] == array[i - 1],出现次数+1 如果遇到新元素,检查是否需要更新最大值 动态更新众数值 测试跑一把,输出如下 int main() { int arr[] = {1, 1, 1, 1, 2, 2, 4, 5, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2}; int length = sizeof(arr) / sizeof(arr[0]); int result = get_mode(arr, length); printf("result = %d\n", result); } result = 4 这个办法实在是有点蠢,找时间仔细学学哈希表,应该能更快。

2025/5/28
articleCard.readMore

高效率的沟通绝不会从在吗开始

“在吗?” 据考证,“在吗”发起聊天的起源,是QQ刚盛行的年代,大家都没有手机,升级普遍需要在电脑上挂QQ。为了确认在线的是不是本人而使用的。 那么,现在还真的需要这句话吗? 在吗只对聊天的发起者有好处,从接受者的主观来讲,对接受者无益的请求,在回复了以后,也就难以推脱了,毕竟总不可能装死。一旦在吗这两个字被发送,一个关于对方意图的猜疑链就无穷无尽地延伸下去了。 我向来都认为,网络上的沟通效率非常高,至少对于我个人来讲,是这样的。尤其是在邮箱等正式场合,迫于信息传播的时效性,只好组织起完整、官方、正式的语言,而不是东一句西一句,在信息的密度和聚合性上,是远远高于即时通讯软件的。 网络的优势也在于,你需要面对的是一块会发光的砖头,而不是长相体态性格各异的复杂的人。这可比现实中自在太多了。在网上沟通,只需要有大脑可以组织语言,有手可以打字,这就足够了。在现实生活中的沟通,既要注意语气、神态,又要关心对方的心情。这点对于不同的人来说,沟通效率也是不同的。网络把人的某个方面几乎带到了同一个高度。人们可以完全出于理性,而不被对方的现实表现影响地思考,在这一点来看,网络可以做到非常高效的交流。 “在吗”这两个字,无异于完全拉回到了现实面对面交流,当它被发送,信息的传递状态是阻塞的。如果是因有什么请求而发起聊天,发起者无法直接获得对方态度,接受者也不能直接明确对方意图,乃中华五千年文明之奇大败笔,让信息传播效率直接被打回原始社会。 如果是为了解决问题而开始交流,那应当直击要害,保证效率。糙话讲:有话快说,有屁快放。理不糙,只有这样才能让你的问题快速解决,也能不浪费双方的时间。 我的QQ好友里就有一位,堪称低效沟通的典范。有一次,他想问一下我曾经使用过的某个网站还有没有链接。他没有直接提出这个问题,而是在一分钟内给我发送了十五个相同的没有任何信息含量的GIF动图。那好吧,我不知道他的意图,我也只好回复一个不能传达任何情绪的动图。长达五分钟的沉默后,他终于开口问出了这个问题。在我从凌乱不堪的收藏夹里找出这个网址时,一分钟又过去了。 讲这个例子,我想表达的是,如果在第一句话就抛出问题:“某某某网站你还有吗?”那会得到相当迅速且准确的答复,如果发送了十五个毫无意义的图,那只能白白浪费五分钟。 最后,总结一下我这篇东拉西扯的短文,如果目的是解决问题,而不是聊聊天,这种无意义的模糊的文字是在耽误大家的时间。这种沟通方式并非冷漠,而是能解决问题的最直接办法。

2025/5/27
articleCard.readMore

【数据结构与算法】二叉树

定义 二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。 实现 结构定义 尝试了一下C语言,各种指针乱指,各种bug,暂时放自己一马,跟自己和解一下用js写写吧。 class TreeNode { constructor(data) { this.data = data; this.left = null; // 左节点 this.right = null; // 右边节点 } } 创建对象并绑定节点 // 手动绑定节点 let root = new TreeNode(1) root.left = new TreeNode(2) root.right = new TreeNode(3) root.left.left = new TreeNode(4) root.right.right = new TreeNode(5) 此时树的结构: 1 / \ 2 3 / \ \ 4 5 6 遍历二叉树 前序遍历(DFS) function preOrder(node) { if(node) { console.log(node.data) preOrder(node.left) preOrder(node.right) } } 这里用递归调用,遍历到左右元素 层序遍历(BFS) function levelOrder(root) { const queue = []; queue.push(root); while (queue.length) { const node = queue.shift(); console.log(node.data); if (node.left) queue.push(node.left); if (node.right) queue.push(node.right); } }

2025/5/26
articleCard.readMore

“我有厌蠢症”

“厌蠢症”大概是迄今为止我听到的唯一一个能与近些年很火的一个心理测试——MBTI抗衡的。 前两年MBTI这东西刚出来时,很多人争着抢着去做测试,把自己标签上的四个字母如数家珍,甚至为了维持人设,去扮演人格,倒反天罡。但不能否认,这个测试确实能在与陌生人的聊天中快速找到话题切入点,以两大种类属性人格为根,横向延伸出许多话题,建立起临时的友谊。过两天,结果就是空间互赞,再不联系。 同时,这个测试也有一个点,当局者迷。即筛选。 筛选出分辨能力弱,花钱去做假测试的和不清楚真实的自己,喜欢给自己贴标签,经常把MBTI挂在嘴边的人。这两种人,说难听点,蠢。 用MBTI的例子来引出本文的核心观点:厌蠢症才是真的蠢。 不可否认地,高傲自大的人确实蠢。 上次让我这么情绪复杂的还是一群没病硬装、拿疾病当挡箭牌的“抑郁症患者”。 厌蠢症这三个字,完全是送命题,也筛选出智商和情商都达到“蠢”的标准的人。首先,当你说出这句话,就意味着你把自己当做了聪明人。带着狂妄、自大、轻浮、傲慢的“聪明人”。 傲慢才是原罪。 带着这份傲慢,厌蠢症发作,完全暴露自己最低智的一面,自诩聪明人。实际上蠢到极点还不自知。用人类的大脑仔细思考一下,这三个字是否写出来咬手、读出来扎嘴?用人类的大脑仔细思考一下,你是否有资格讨厌你所谓的“蠢”?用人类的大脑思考一下,你对聪明的定义,以及对自己的理解是什么样的?仔细思考一下,你能否在生活中完美无缺?你是否在每一场考试都拿到满分?你是否能照顾他人情绪,读懂空气氛围? 他们思考出结果了吗?没有。厌蠢症患者无法思考。不具备人类的大脑,没有思考的能力。也不愿意去思考,只是一直傲慢自大下去,这才是真的蠢。 再把这句愚蠢的话大声地说出来:“我有厌蠢症。” 自己作何感想?他人作何感想? 如果你愿意继续做你所谓的聪明人并继续厌蠢下去,那你只有高傲自大、狂妄轻浮,你是真的蠢。

2025/5/21
articleCard.readMore

这样的博客的意义是?

博客文章的密码 博客文章加密码,意义何在? 写博客的意义是? 写博客的意义之一,不是放大自己的声音,表达自己的观点吗? 这就要牵扯到你写博客的目的。如果你说,你写博客是为了取悦自己,那为什么要把文章发出来?取悦自己是真的吗?还是对自己网站没有流量的自我安慰?不允许他人看见,那我只能认为您财力精力都很强盛,有财力购买服务器、主题;有精力维护服务器、网站。为什么不写在备忘录里呢? 发出来,不是为了被人看见? 还是说,是在扮演什么角色、人设给什么人看? 我个人一直十分痛恨各大平台的强制注册手段,复制代码要注册、展开文章要注册,打开评论区还要注册。所以在我一开始使用动态博客程序的时候,从来没想过有强迫读者注册才能评论。 这个问题依然要归结到写博客的意义。如果你写博客,是为了变现,利用在各个博客的评论区乱尿增加的一点SEO权重带来的可怜流量,和不知道从哪里抄搬来的技术文章,连格式都不调一下就挂在网站上又或是分享一大堆所谓免费资源,引流关注微信公众号的,强迫注册,为了赚钱,不寒碜。吗? 很他妈寒碜! 读者吃着你搬来的别人拉的屎,又要被你骗去你自建的茅房,这钱就算拿到,也是脏的,好好掂量一下这钱里都有什么。 如果是正常的博客,要强迫读者注册才可评论,查看文章,那更令人费解。技术文章下,读者遇到了问题,或想更近一步讨论;表达观点、分享日常的文章下,读者看到一个有趣的灵魂,一个,强迫注册,都无异于直接抹杀读者讨论的念头。输入邮箱或手机号,接收验证码、输入验证码,再登录。加之服务器地理位置、配置等原因导致的访问不畅,每一秒所做的每一个行为,都是在一丝丝抽离由文字与读者建立起的联系。 最后,只能说上一句: 我写博客只为取悦自己。

2025/5/20
articleCard.readMore

【数据结构与算法】栈

基本概念 栈(Stack)是一种后进先出(LIFO)原则的线性数据结构。核心操作包括: 压栈(Push):将元素添加到栈顶 出栈(Pop):移除并返回栈顶元素 查看栈顶(Check)获取但移除栈顶元素 判空(is_empty)检查栈是否为空 结构定义 使用动态数组实现栈,包含三个核心属性: typedef struct Stack { int* data; // 存储元素的数组 int top; // 栈顶指针(当前元素位置) int capacity; // 栈的最大容量 } data:动态分配的数组指针 top:初始值为-1,表示空栈,压栈时递增,出栈时递减 capacity:栈的容量上限 功能实现 初始化 // 初始化栈 void init_stack(Stack *s, int capacity) { // 计算最大容量 s -> data = (int*)malloc(sizeof(int) * capacity) if(!s -> data) { printf("内存分配失败!\n"); exit(1); } // 初始化栈顶为-1,表空 s -> top = -1; // 把当前计算的最大容量赋值给传进来的栈 s -> capacity = capacity; } 这个函数中进行了动态分配内存计算最大容量,初始化赋值和异常处理。 压栈(Push) // 压栈(Push) void push(Stack *s, int value) { if (s -> top = s -> capacity -1) { printf("栈已满!\n"); return; } s -> data[++s->top] = value; } 检查栈是否已满,先递增指针再存入数据 出栈(Pop) // 出栈(Pop) int pop(Stack *s) { if(is_empty(s)) { printf("栈为空!\n"); return -1; } return s->data[s->top--]; } 检查栈是否为空,返回当前栈顶元素后移动指针 辅助功能 // 判空 int is_empty(Stack *s) { return s-> top == -1 } // 查看栈顶元素 int peek(Stack *s) { return is_empty(s) ? -1 : s->data[s->top]; } // 销毁 void destory_stack(Stack *S) { free(s->data); s -> top = -1; s -> capacity = 0; }

2025/5/11
articleCard.readMore

【数据结构与算法】冒泡排序

核心思想 通过相邻元素的两两比较,将较大的元素逐步“冒泡”到数组末尾,每轮排序确定一个最大元素的最终位置。 代码实现 void bubble_sort(int arr[], int n) { // 最外层控制循环轮数 n-1轮 for (int i = 0; i < n - 1; i++) { // 内层循环处理相邻元素比较和交换 for(int j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } // 调用 void print_array(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d,", arr[i]); } printf("\n"); } int main() { int arr[] = {23, 232, 55, 2, 7, 0, 576, 342}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前:"); print_array(arr, n); bubble_sort(arr, n); printf("排序后"); print_array(arr, n); } 原理分析 外层循环的 i < n - 1 n个元素的数组最多需要n-1轮冒泡,如5元素数组需要4轮排序 数学依据:每轮将一个最大值“沉底”,当完成n-1轮时,最后一个元素必然有序 示例验证: 原始数组:[3, 1, 4, 2] 第一轮:[1, 3, 2, 4] (确定最大值4) 第二轮:[1, 2, 3, 4] 用文字解释上面的函数,原理就是在循环中对比数组第i个元素和i+1(即后一位)元素的大小,若i > i +1 则把两者交换位置,随着循环的进行,数组就会被排序。 内层循环的 j < n - i - 1 动态缩小范围:每轮结束后末尾i个元素已有序 比较次数:第i轮需要比较(n-1)-i次相邻元素 想象一下数组的线性结构,实际上就是在计算排序后的一位的前一位,这样就不会处理已经排序好的元素,进入下一轮循环时可正常排序。 数组长度n的计算机制 在main函数中,对于n的计算,采用了sizeof(arr) / sizeof(arr[0])的方式。可以这么理解。 int arr[] = {6,4,8,2}; 假设int占用4字节,计算整个数组的内存占用 sizeof(arr) = 5 * 4 = 20 sizeof(arr[0]) = 4 n = 20 / 4 = 5 计算出数组的总占用,再除以单个占用,就可以得到元素个数了。 参数n的作用 循环控制:确定外层循环次数n-1次 边界保护,防止越界 效率优化:避免无效比较,如j<n-i-1 最坏情况 冒泡排序的最坏情况发生在输入数组完全逆序情况下,此时算法需要进行最大次数的比较和交换操作,时间复杂度达到最高。 当待排序数组的初始状态为完全逆序,如[5,4,3,2,1],每一轮外层循环都要将当前为排序部分的最大元素冒泡到正确位置,而且每次比较都会发生交换,此时: 比较次数: 共需要进行*(n - 1) + (n - 2) + …*(等差数列求和)。 交换次数: 每次比较均需要交换,总交换次数也为上式结果。

2025/5/11
articleCard.readMore

x86-64汇编学习笔记

机器指令和机器语言 机器指令,二进制数字,机器语言全局机器指令的集合,CPU通过执行一系列的机器指令完成计算工作。 汇编语言就是为了代替机器指令,使人类能够更加简单地编写程序而诞生的。汇编语言就是机器码的助记符。 编译器将汇编代码再编译为真正的机器码。 内存与硬盘 内存指内存条,即RAM,临时存储,读写快容量小。 硬盘长期存储,读写慢但容量大。 ROM并非硬盘,ROM只读存储器(Read Only Memory),其内容在写入后就不能更改。 存储单元 物理内存被划分为很多个存储单元,一个存储单元能存储8bit内容,也就是1字节。 内存的最小单元是字节,不是位。 1B = 8bit 1KB = 1024B 1MB = 1024KB …… 每一个存储单元都有相应的编号,也就是内存地址。运行程序时,操作系统会把程序载入内存中,随后CPU读取和写入程序中的某些数据并执行代码。 无论是读取还是写入、执行,这些都是需要通过CPU总线进行的。 总线分为数据线、地址总线、控制总线 简而言之,地址总线负责寻址,控制总线负责发出控制指令,如读写,数据总线负责各个组件之间的数据传输。 CPU的寻址能力 CPU的寻址能力是由地址总线的位数决定的。 通常认为32位系统有32位的寻址能力,64位同理,但不绝对。 虚拟内存 物理内存即真实存在的内存,虚拟内存是建立在页表的基础上,由操作系统实现的。 寄存器 基本的程序执行寄存器分为以下四类 通用目的寄存器 段寄存器 标志寄存器 指令指针寄存器 16位通用寄存器中的高位和低位 16位通用寄存器中,ax,bx,cx,dx可以只使用其高8位或低8位。 高8位用字符h表示,低8位用字母l表示。 32位通用目的寄存器 将16位通用寄存器扩展到32位,就得到了以下寄存器。 EAX EBX EDX ESI EDI ESP EBP 64位通用目的寄存器 将32扩展到64位,就得到了以下寄存器 RAX RBX RCX RDX RSI RDI RSP RDP R是通用前缀,取自单词Register。 此外还有R8-R15。 同名寄存器之间的关系 同名寄存器之间并不是许多个相互独立的寄存器,而是共同属于一个寄存器。 以RAX为例: RAX是整个64位寄存器,EAX指的是RAX的低32位,AX指的是RAX的0-15位。AH指的是RAX的8-15位,AL指的是RAX的0-7位。 1 word = 2 byte 1 double word = 4 byte 段寄存器 段寄存器CS、DS、SS、ES、FS、GS都保存着16位段选择子。用于标识内存中特定的段。 CS指向代码段,SS指向栈段,DS、ES、FS、GS指向数据段。 内存可以被分为不同的段,访问内存时通过段基址+偏移的方式来访问。 注意:物理内存本身是连续的,并没有被分隔开,分段是CPU的寻址方式。 到了64位,段的概念被进一步弱化。 内存变成平坦模型,即无分段式内存。所有对内存的访问都在同一个地址空间内进行。 此外,对于段的保护也被弱化,64位更强调对页的保护。 看来段寄存器没什么用了啊 段寄存器最初的存在目的是辅助寻址,在32位下基本不再用于寻址,而是用于保护,而64位中其保护作用进一步被削弱。 标志寄存器 标准寄存器存储了机组标志,分别是状态标志、控制标志、系统标志。 简单地来说,系统中的某些状态与指令的执行结果会存在这个寄存器当中。 标志寄存器在32位和64位中分别叫EFLAGS和RFLAGS RFLAGS的高32位是保留为,低32位与EFLAGS相同。 指令指针寄存器 简而言之,他存储的是CPU即将执行的下一条指令的地址,通常用ip/eip/rip替代 (16,32,64位) 进制 简单来说,n进制就是逢n进一。计算机当中,除了10进制,还有2进制和6进制。 小端序和大端序 小端序是指低字节在低地址,高字节在高地址。 优点:字节高低位与地址高低位序列相同。 缺点:不符合人类阅读顺序。 如:64 00 00 00 大端序与之相反。 如 00 00 00 64 MOV指令 MOV取自英文单词move,移动。 例: MOV RAX, RCX 意思是,把RCX寄存器的值赋值给RAX

2025/4/29
articleCard.readMore

WSL Arch Linux ZSH输入中文输入法乱码解决方法

没有进行配置的情况下输入中文,一般会显示<0xffffffff>,这是由于没有安装字体造成的。 sudo pacman -S noto-fonts-cjk # 安装中文字体 sudo vi /etc/locale.gen # 取消注释 zh_CN.UTF-8 sudo locale-gen # 生成语言环境 echo "export LANG=zh_CN.UTF-8" >> ~/.zshrc # 设置默认中文环境 source ~/.zshrc source后,再次尝试输入中文,无异常。

2025/4/29
articleCard.readMore

Emacs EAF插件打开浏览器只显示opening http://xxx.xxx的解决方法

检查是否安装全部依赖,如yay、pip等。我这里是由于没有安装pip导致的。 sudo pacman -S python-pip 安装好后,进入eaf安装目录 cd ~/.emacs.d/site-lisp/emacs-application-framework && ./install-eaf.py 重新安装eaf。等待脚本运行完成,打开emacs,输入M-x eaf-install-and-update,等待执行完成。 重新输入M-x eaf-open-browser,输入网址,即可正常访问网页。

2025/4/29
articleCard.readMore

隐居

此隐居非彼隐居。残酷的是,人是社会性动物,脱离了社会根本没法生存。既然无法与现实的是是非非一刀两断,那就至少让自己在网络世界耳根清净点。 自从前几个月退坑音游后,基本就与游戏没了什么交际。周末空闲时间就听听歌,写写代码,画点画。五一假期也要开始认真练琴了。这么说来还颇有几分文气,琴棋书画几样都有沾点。远离音游圈子后,我的群也退得差不多,为数不多留下来的几个群都是最早进的,或者花了很大劲才进去的,虽然人还在群里,但是已经几乎和群友没什么共同话题了。那几个群里只有痴迷于段位的人们在争论某张图是g+还是d-,毫无意义。在视频平台曾经投稿的音游视频也都设置成了私密,之所以没有删掉有两点原因,一个是全删硬币大出血,另一个则是留个念想,好歹也陪伴了这么长时间,通过这类游戏交到了很多好朋友。 与几乎所有人都保持着浅度的社交,非必要不再主动参与哪些圈子的活动。最极端的时候我的QQ只剩五个群,好友只有十几个,账号设置为不可搜索。现在回想起来那段时候是真清净自在。越来越趋近于隐居的状态,极力削弱自己在网络上的存在感。如果有人想接近或了解我,应该没什么途径,为数不多发表言论的地方只有博客和朋友之间的小群。化被动接受为主动寻找应该能免去不少怪人,毕竟主动寻找的在少数,林子大了什么鸟都有。 自在,自在。 多年之后的我再读起这些文字会有什么感想?是会感叹自己的超前还是悲哀自己的孤僻呢。 文字这种古老的载体对于新现的图片、视频来说,最大的优势就是能很好地把心情亦或是观点表达出来。这也是我认为以记录为目的,Blog优于Plog和Vlog的原因。

2025/4/27
articleCard.readMore

Valine评论系统踩坑记录

我个人很早以前就惦记着换上这个评论系统,曾经使用Butterfly主题的时候就有折腾过Valine,当时是浏览器缓存策略和CORS跨域拦截的问题。网上能找到的教程都比较老,几年以前的情况不再适用于现在了,所以现在去折腾的话,大概率要踩非常多的坑。本文主要讲述我个人踩到的坑和解决方法。 本文内容是我自己试错出来的,不要问为什么要这么做,我也不清楚,但是这么做可以正常使用! 首先你要有一个自己的域名,不要用.github.io。LeanCloud中设置-域名绑定-API访问域名要绑定你自己的二级域。 这里一定一定要做DNS解析,非常重要。 然后就是安全中心里面的Web安全域名,LeanCloud默认放行localhost,但是127.0.0.1我这边测试是不行的,如果有需求要自己填写。Web安全域名要填写https、http两种协议保险。 主题配置文件中,以我这个主题为例,serverURLs要填写自己的二级域名 serverURLs: https://comment.yingyu5658.me 一定要加协议头,否则将会在你的博客域名下构建请求,比如我的www.yingyu5658.me/comment.yingyu5658.me/,这将导致报错。即使你使用国际版也要填写这一项!Leancloud请求不到。 现在Valine的教程都有过时,遇到问题还需结合具体情况分析。我看LeanCloud的各种API结构变更还挺多的,太久远的教程就不建议看了。

2025/4/24
articleCard.readMore

攒钱目标达成?!

是的,攒钱目标达成。 我在之前的日志中写道: 每月收入280,可得出七月份大概可以完成目标。 当然,这是最悲观的情况。也许有哪一天能发一笔横财呢。 这下真发横财了。把一直没上的课外班退掉了。这个过程几经周折,机构老板老奸巨猾。一谈钱的事就转移话题,提出各种方案,就是为了不退全款。不过好在最后钱是拿回来了。加上我自己原本的积蓄,可以再安排个稍微能用的箱子 琴到手的第一反应就是:“好沉。。。” 真的很沉。每天为了攒钱,不吃早饭,经常饿得心慌。好在愿望终于实现了,好好练吧。有人和我说,学乐器很难,我不信。我坚信的是,学不会只是因为不够认真。我必须和他碰一碰。暂时先不要告诉任何人我正在学贝斯这件事吧,除非他们看到了这个网站、这篇文章。保持一段时间的神秘感。 说起来,我喜欢贝斯这个乐器,没什么理由,也许这就是真正的一见钟情,低调沉稳的音色总是能抓住我的耳朵。我在某社交平台上的头像用了三年孤独摇滚里结束乐队的贝斯手山田凉。可能跟这个番剧也有关。不过最早贝斯给我留下深刻印象的还是《缝纫机乐队》,他们有一段演出最抓耳的就是贝斯。不知道我是有一副好耳机还是有两只好耳朵,贝斯和鼓在我听来总是特别的明显,有时我还会去特意听他们两者的节奏、律动,我评价一首歌好不好听,贝斯和鼓是否合我口味成了决定性因素。当然,自己的爱好在别人眼中是一文不值的,故曰知音难觅,又有多少人仔细去欣赏低音的律动呢?

2025/4/20
articleCard.readMore

【黑历史】读自己以前写的代码

仓库地址就不放出来了,太耻辱了…… 先来看看Main.java package cn.yingyu5658.lbl; /** * @author yingyu5658 */ public class Main { public static void main(String[] args) { LuBuLu cmd = new LuBuLu(); while(true) { cmd.command(); } } } 嗯还写了Author,生怕别人不知道这坨屎是谁拉的。 Main方法里面新建了一个LuBuLu对象,在主循环里调用了他的command()方法。 进入这个神秘的LuBuLu.java一探究竟。 Scanner sc; String one; String two; public int times; public LuBuLu() { this.sc = new Scanner(System.in); this.times = 0; } 在类的开头进行了一些初始化,有点不理解one和two是什么,为什么他们没有权限修饰符。。。 好的,接下来就到了主方法调用的command() public void command() { while (true) { if (this.times == 0) { System.out.println(" __ __ __ .______ __ __ __ __ __ \n| | | | | | | _ \\ | | | | | | | | | | \n| | | | | | | |_) | | | | | | | | | | | \n| | | | | | | _ < | | | | | | | | | | \n| `----.| `--' | | |_) | | `--' | | `----.| `--' | \n|_______| \\______/ |______/ \\______/ |_______| \\______/ \n \n.___ ___. ___ _______ _______ .______ ____ ____ ____ ____ __ .__ __. ___________ ____ __ __ _____ __ _____ ___ \n| \\/ | / \\ | \\ | ____| | _ \\ \\ \\ / / \\ \\ / / | | | \\ | | / _____\\ \\ / / | | | | | ____| / / | ____| / _ \\ \n| \\ / | / ^ \\ | .--. || |__ | |_) | \\ \\/ / \\ \\/ / | | | \\| | | | __ \\ \\/ / | | | | | |__ / /_ | |__ | (_) | \n| |\\/| | / /_\\ \\ | | | || __| | _ < \\_ _/ \\_ _/ | | | . ` | | | |_ | \\_ _/ | | | | |___ \\ | '_ \\ |___ \\ > _ < \n| | | | / _____ \\ | '--' || |____ | |_) | | | | | | | | |\\ | | |__| | | | | `--' | ___) | | (_) | ___) | | (_) | \n|__| |__| /__/ \\__\\ |_______/ |_______| |______/ |__| |__| |__| |__| \\__| \\______| |__| \\______/ |____/ \\___/ |____/ \\___/ \n "); } System.out.println("卢布卢 v1.4"); LocalDate date = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); PrintStream var10000 = System.out; String var10001 = date.format(formatter); var10000.println("你在" + var10001 + "奇了星雨并打开本软件,来看看老天让不让你卢吧!"); System.out.println("========================================"); System.out.println("输入'/help'获取帮助"); switch (this.sc.nextLine()) { case "/help": this.help(); break; case "/lbl": this.luMa(); break; case "/exit": System.exit(0); break; case "/coott": if ("/coott".equals(sc.nextLine())) { Scanner sc1 = new Scanner(System.in); System.out.println("请输入您的第一个选项。"); String one = sc1.nextLine(); System.out.println("请输入您的第二个选项。"); String two = sc1.nextLine(); this.chooseOneOfTheTwo(one, two); } break; case "/cofm": chooseOneFromMany(); break; default: this.clear(); System.out.println("不存在该指令!将在1000ms后回到主页面。"); this.sleep(); return; } ++times; System.out.println("*调试信息* 运行轮数: " + this.times); } } 可以看到、个方法内部代码都是在无限循环内执行的,那么为什么要在main方法里又套一层循环呢??? 这里的代码是反编译出来的,当时我还不会用git,idea也用不明白,误删了代码。找到以前的版本反编译再重新写。 命令解析部分则是用了switch,这种方法在命令不多的情况下还可以。但是要输入斜杠是什么鬼啊,玩mc呢? 那么再来看看伟大的case: "/coott",前面还在调用函数,这里直接实现???这是人能写出来的代码?? 函数尾部的++times也没看懂,我甚至现在都不理解这个运行轮数存在的意义是什么。 /** * 程序休眠,目前仅用于输入命令错误时 */ public void sleep() { long start = System.currentTimeMillis(); try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); } 这个功能更令人费解,为什么敲错命令不直接return,还要sleep一下。。。 OK,下面就是人类有史以来最伟大的发明。 打印大量空字符串清屏。 /** * 清屏方法,一般会在其他功能方法中的第一行首先调用,打印大量空白字符来达到清屏的效果 */ public void clear() { for (int i = 0; i < 500; ++i) { System.out.println(""); } } 我真的好奇我到底是不是人类了,这么蠢的方法还好意思写在注释里,这么大的IO性能损失还好意思直接写在注释里。 多选一这个功能更是逆天了,选项和随机数范围严重错位。 public void chooseOneFromMany() { ArrayList choicesList = new ArrayList(); Random r = new Random(); clear(); System.out.println("===多选一界面==="); System.out.println("请输入选项总数"); int choicesCount = sc.nextInt(); // 定义变量用于记录选项总数 sc.nextLine(); for (int i = 1; i < choicesCount; ++i) { System.out.println("请输入您的第" + i + "个选项"); String chices = sc.nextLine(); choicesList.add(chices); } int randomIndex = r.nextInt((choicesCount)); System.out.println("老天帮你选了第" + (randomIndex + 1) + "个:" + choicesList.get(randomIndex)); } 逆天,,,,除了代码不规范以外,逻辑硬伤更是多的离谱。 总结,像一头蠢猪用带着粪的猪蹄乱敲键盘敲出来的代码。

2025/4/19
articleCard.readMore

从0开始搭建自己的终端开发环境

系统:WSL Arch 主折腾点 代码编辑器:Vim(Neovim) 终端体验优化:tmux 文件管理器:yazi 代码编辑器——Neovim 前言 Neovim和Vim相比,在性能和易用性上有很大的提升,在异步任务表现突出;使用更加现代的lua脚本配置,可读性更高。 为什么不用Lazyvim? 答:我个人用了很长一段时间Lazyvim,虽然开箱即用,简单调试就可以使用,但是我并不能清除的理解他到底给我装了什么,我是否需要那些插件。感觉像在用别人的软件,而自己从头开始配置vim的掌控感是使用他人的配置文件无法比拟的,在配置的过程中也可以培养排错和程序调试能力,唯一的缺点就是略微耗费时间。 安装 先滚一把系统保证软件包都是最新的 sudo pacman -Syyu 安装Neovim sudo pacman -S neovim 这时候在终端输入nvim就可以打开neovim了。![image-20250415212435171](E:/Blog/source/im 按:q退出。 这个初始的界面非常简陋,我们先进行核心功能配置,后续在更改主题。 nvim的用户级配置文件在~/.config/nvim中。 安装包管理器 我们选择Lazy作为包管理器,他和其他的包管理器相比起来,在懒加载、UI界面等方面有显著优势,可以减小配置复杂度。 访问lazy.nvim官网,官方文档永远都是最好的教程。这里有一段代码 -- Bootstrap lazy.nvim local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" if not (vim.uv or vim.loop).fs_stat(lazypath) then local lazyrepo = "https://github.com/folke/lazy.nvim.git" local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) if vim.v.shell_error ~= 0 then vim.api.nvim_echo({ { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, { out, "WarningMsg" }, { "\nPress any key to exit..." }, }, true, {}) vim.fn.getchar() os.exit(1) end end vim.opt.rtp:prepend(lazypath) -- Make sure to setup `mapleader` and `maplocalleader` before -- loading lazy.nvim so that mappings are correct. -- This is also a good place to setup other settings (vim.opt) vim.g.mapleader = " " vim.g.maplocalleader = "\\" -- Setup lazy.nvim require("lazy").setup({ spec = { -- import your plugins { import = "plugins" }, }, -- Configure any other settings here. See the documentation for more details. -- colorscheme that will be used when installing plugins. install = { colorscheme = { "habamax" } }, -- automatically check for plugin updates checker = { enabled = true }, }) 这段代码主要在为Lazy包管理器初始化,所以按照官网的目录结构,我们在~/.config/nvim/lua下新建一个config文件夹,把代码粘贴进去。 注意到,代码中有一段是导入plugins这个模块,所以我们需要在~/.config/nvim/lua下创建一个plugins文件夹 然后在~/.config/nvim/init.lua里粘贴这行代码 require("config.lazy") init/lua是Neovim的初始化配置文件,程序会首先读取这个文件里的代码。 这行代码是引入config/lazy这个文件,初始化Lazy,所以要放在第一行。 那么经过这一番操作,Lazy安装好了,我们的目录结构应该如下: `-- nvim `-- lua `-- config `-- lazy.lua 现在在终端输入nvim启动Neovim,会发现有个报错 No specs found for module "plugins" 查阅bug: No specs found for module “plugins” (Structured Setup) · folke/lazy.nvim · Discussion #1875可得,这个问题是由于我们还没有安装任何插件导致的,他不影响什么,但是很烦人。如果想要关掉,可以在plugins下新建一个lua文件,然后输入 return{ } 这样就可以正常启动nvim不报错了。由此可见,Lazy安装插件是返回一张表,所以以后每次新建插件文件的时候都要填写以上内容。 基础配置 在安装插件前,我们要先进行一些基础配置,让这个编辑器用的舒服一点。 设置别名:`` local opt = vim.opt 声明一个本地变量opt=vim.opt,简写提高效率。 为什么要显示声明local?原因是lua脚本的所有变量默认都是全局变量,很怪对吧,我也觉得。 opt.relativenumber = false -- 禁用相对行号 opt.number = true -- 启用绝对行号 vim.api.nvim_set_hl(0, "LineNr", { fg = "#FFD700" }) -- 所有行号设为金色 相对行号可以更容易的数行数来达到hjkl/d/v等 + 行数来快速进行文本编辑操作,但是我个人不太适应,就没开,后期可以通过修改按键配置来做到随时开关。 安装插件 neo-tree neo-tree 编辑器的文件系统资源管理器。使用此插件,用户可以直观地浏览复杂的目录层次结构,快速打开文件进行读取或编辑,并执行基本的文件系统作。 仓库:nvim-neo-tree/neo-tree.nvim: Neovim plugin to manage the file system and other tree like structures. 进入Plugins目录,新建一个文件名为nerdtree的lua脚本。先把上文提到的返回表写进去。 -- neo-tree.lua -- 代码来自仓库README { "nvim-neo-tree/neo-tree.nvim", branch = "v3.x", dependencies = { "nvim-lua/plenary.nvim", "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended "MunifTanjim/nui.nvim", -- {"3rd/image.nvim", opts = {}}, -- Optional image support in preview window: See `# Preview Mode` for more information }, lazy = false, -- neo-tree will lazily load itself ---@module "neo-tree" ---@type neotree.Config? opts = { -- fill any relevant options here }, } 插件装好了发现,不知道怎么打开啊。这时候就需要我们自己动手改一个舒服点的键位。在~/.config/nvim/lua/config中新建一个keymaps.lua,并在init.lua中引用 -- 习惯上,我喜欢把leader键映射到空格,敲起来顺手 -- 基础按键配置 vim.g.mapleader = " " local opt = { noremap = true, slient = true } -- 窗口切换更顺手,少按一个w vim.keymap.set("n", "<C-h>", "<C-w>h") vim.keymap.set("n", "<C-j>", "<C-w>j") vim.keymap.set("n", "<C-k>", "<C-w>k") vim.keymap.set("n", "<C-l>", "<C-w>l") -- Neotree vim.keymap.set("n", "<Leader>e", "<cmd>Neotree toggle<CR>", opts) 代码补全、格式化、检查 要让vim看起来像一个正经的处理代码的文本编辑器,这些是必不可少的。 -- 文件路径:lua/plugins/code-edit.lua return { -- LSP 核心组件 (必须最先声明) { "neovim/nvim-lspconfig", dependencies = { "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", }, config = function() -- 延迟加载 LSP 配置 vim.schedule(function() local lspconfig = require("lspconfig") local mason = require("mason") local mason_lspconfig = require("mason-lspconfig") -- 通用 LSP 配置 local on_attach = function(client, bufnr) -- 快捷键配置... end mason.setup() mason_lspconfig.setup({ ensure_installed = { "tsserver", "cssls", "html", "clangd", "eslint" } }) mason_lspconfig.setup_handlers({ function(server_name) lspconfig[server_name].setup({ on_attach = on_attach, capabilities = require("cmp_nvim_lsp").default_capabilities(), -- 各语言特殊配置... }) end }) end) end }, -- 自动补全引擎(需在 LSP 之后加载) { "hrsh7th/nvim-cmp", dependencies = { "hrsh7th/cmp-nvim-lsp", "L3MON4D3/LuaSnip", }, config = function() -- cmp 配置... end }, -- 格式化工具 { "stevearc/conform.nvim", config = function() -- conform 配置... end }, -- 语法高亮增强 { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate", config = function() -- treesitter 配置... end } } 代码编辑器的配置就告一段落了,真写规范的代码还是建议vscode(虽然有点偏离终端的主题了)。如果你爱折腾vim那当然也可以,工具自己用的趁手就是最好的。 Oh-My-Zsh Oh My Zsh 是基于 zsh 命令行的一个扩展工具集,提供了丰富的扩展功能。 安装ZSH sudo pacman -S zsh 设置默认终端为zsh chsh -s /bin/zsh 安装Oh-My-Zsh 国内镜像 sh -c "$(curl -fsSL https://gitee.com/pocmon/ohmyzsh/raw/master/tools/install.sh)" 我个人觉得这个主题就挺好的了,不多改动。 插件安装 zsh -autosuggestions 预测命令 git clone https://github.moeyy.xyz/https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions zsh-syntax-highlighting 语法检查,命令正确时为绿色,否则红色。 git clone https://github.moeyy.xyz/https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting 启用插件 nvim ~/.zshrc 修改: plugins=( git zsh-autosuggestions zsh-syntax-highlighting ) 重启终端即可启用。 别名设置 别名可以更快地帮助我们启用命令 nvim ~/.zshrc alias s="neofetch" alias vim="nvim" alias c="clear" alias gcl = "git clone" 这里根据我的习惯改了几个别名。

2025/4/16
articleCard.readMore

初折腾Emacs记录

基础配置 Windows下需要在软件顶部Toolbar的Options中随便更改一个选项,然后再点Save Options,这样就会再C:\Users\Username\appdata\Roaming\下生成.emacs和.emacs.d/ 在emacs.d中新建一个文件init.el,填写如下配置 ;;; init.el --- Load the full configuration -*- lexical-binding: t -*- ;;; Commentary: ;; This file bootstraps the configuration, which is divided into ;; a number of other files. ;;; Code: (let ((minver "25.1")) (when (version< emacs-version minver) (error "Your Emacs is too old -- this config requires v%s or higher" minver))) (when (version< emacs-version "26.1") (message "Your Emacs is old, and some functionality in this config will be disabled. Please upgrade if possible.")) (add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory)) ; 设定源码加载路径 ;; (require 'init-benchmarking) ;; Measure startup time (defconst *spell-check-support-enabled* nil) ;; Enable with t if you prefer (defconst *is-a-mac* (eq system-type 'darwin)) ;; Adjust garbage collection thresholds during startup, and thereafter (let ((normal-gc-cons-threshold (* 20 1024 1024)) (init-gc-cons-threshold (* 128 1024 1024))) (setq gc-cons-threshold init-gc-cons-threshold) (add-hook 'emacs-startup-hook (lambda () (setq gc-cons-threshold normal-gc-cons-threshold)))) ;; ========================================================================================================== ;; ===========================================日常使用配置=================================================== ;; ========================================================================================================== (setq confirm-kill-emacs #'yes-or-no-p) ; 在关闭 Emacs 前询问是否确认关闭,防止误触 (electric-pair-mode t) ; 自动补全括号 (add-hook 'prog-mode-hook #'show-paren-mode) ; 编程模式下,光标在括号上时高亮另一个括号 (column-number-mode t) ; 在 Mode line 上显示列号 (global-auto-revert-mode t) ; 当另一程序修改了文件时,让 Emacs 及时刷新 Buffer (delete-selection-mode t) ; 选中文本后输入文本会替换文本(更符合我们习惯了的其它编辑器的逻辑) (setq inhibit-startup-message t) ; 关闭启动 Emacs 时的欢迎界面 (setq make-backup-files nil) ; 关闭文件自动备份 (add-hook 'prog-mode-hook #'hs-minor-mode) ; 编程模式下,可以折叠代码块 (global-display-line-numbers-mode 1) ; 在 Window 显示行号 (tool-bar-mode -1) ; (熟练后可选)关闭 Tool bar (when (display-graphic-p) (toggle-scroll-bar -1)) ; 图形界面时关闭滚动条 (savehist-mode 1) ; (可选)打开 Buffer 历史记录保存 (setq display-line-numbers-type 'relative) ; (可选)显示相对行号 (add-to-list 'default-frame-alist '(width . 90)) ; (可选)设定启动图形界面时的初始 Frame 宽度(字符数) (add-to-list 'default-frame-alist '(height . 55)) ; (可选)设定启动图形界面时的初始 Frame 高度(字符数) ;; ========================================================================================================== ;; ===========================================插件镜像配置=================================================== ;; ========================================================================================================== ; 腾讯镜像 (require 'package) (setq package-archives '(("gnu" . "http://mirrors.cloud.tencent.com/elpa/gnu/") ("melpa" . "http://mirrors.cloud.tencent.com/elpa/melpa/"))) (package-initialize) ;;; init.el ends here 基础的设置和插件镜像源就配置好了,此配置可完全复制照抄。 重启Emacs,按下M-x输入package-list-packages即可查看仓库中的所有插件 在此列表界面下还可按下h显示帮助,按U检查所有已安装插件是否需要更新,如有就标注更新,按i标记想要安装,最后按下x就可更新。 插件默认会被安装到~/.emacs.d/elpa下,Windows同理。 删除插件输入package-delete,然后输入想删除的插件名即可。 use-package 安装 输入命令package-install回车后输入use-package回车,然后在init.el的最上面写 (eval-when-compile (require 'use-package)) 每次启动Emacs优先加载此插件

2025/4/13
articleCard.readMore

盼望下雨

我喜欢下雨。下雨可以没有理由地发呆,看着窗外雨水倾盆洒落,听着打在窗沿上的滴答声,闻着空气里泥土和雨水混合的潮湿味,最享受的时光。下雨天适合做除了外出的任何事。读一本书,画一幅画,听一首歌,或是搬一把椅子,坐在窗前看雨。雨天阴沉的天空色调很舒服,很有安全感。 夜行动物都是浪漫的。夜晚很安静,很短暂,能安静独处的时间不多了。 想画画,正好今天不用上课了,画点好玩的吧。手好酸。一听夏露露这首歌就能想起好多事,好多回忆,但是记不清是什么了。回忆。淡黄氧化色和线描小花,这是回忆的一部分吗?想起一本叫秘密花园的书,是一本涂色书,上面有很多精美的线稿,小时候妈妈买过,没涂完,已经不知道扔到哪去了。 为什么听起以前听过的歌就会难过呢?为什么谈起小时候的事就会流泪呢?现在过得不好吗?想做的事做不到啊,想要的东西得不到啊,想说的话没人听啊。 他本应属于我的,怎么被外来者夺取了呢? 真可怜,只能把情感寄托在冰冷的键盘和几寸屏幕上,被液晶分子在电场作用下改变排列方式触动。 2025.4.12 凌晨2:09 听着歌困到神志不清的我。

2025/4/12
articleCard.readMore

osu!APIv1请求示例

前言 本文章使用Nodejs环境做演示。请求用户数据。代码中的APIKEY要在osu官网‬申请。 const API_URL = "osu.ppy.sh"; const init = { k: "YOUR_API_KEY", type: "string", u: "kyzzz5658", }; const https = require("https"); // 将参数序列化为查询字符串 const query = new URLSearchParams(init); const options = { hostname: API_URL, method: "GET", path: `/api/get_user?${query}` // 附加参数 }; const req = https.request(options, (res) => { let data = ''; res.on('data', (chunk) => data += chunk); res.on('end', () => { try { console.log(JSON.parse(data[0].username)); } catch (e) { console.error('JSON 解析失败:', e); } }); }); // 错误处理 req.on('error', (err) => { console.error('请求失败:', err.code); }); 输出: [ { user_id: '33932276', username: 'Kyzzz5658', join_date: '2023-06-24 08:48:13', count300: '2139', count100: '609', count50: '194', playcount: '44', ranked_score: '1917044', total_score: '3095639', pp_rank: '1968010', level: '8.0115', pp_raw: '43.5449', accuracy: '81.70417785644531', count_rank_ss: '0', count_rank_ssh: '0', count_rank_s: '0', count_rank_sh: '0', count_rank_a: '1', country: 'CN', total_seconds_played: '2259', pp_country_rank: '38721', events: [] } ] ​ 首页 ·ppy/osu-api 维基

2025/4/12
articleCard.readMore

我的攒钱计划

一个小目标,初三前攒够两千块。 实现难度是不大,已经有了八百多存款,微信里有一百多,一共900。每天早上父母会给我20元买早饭,省省,不吃了,每天稳定收入20。加上每月50 + 70的零花钱。 粗略估算一下: 现金:837.00 微信:100.59 支付宝:5.19 共 944.78 元 与目标差 1055.22 。 截止到今天(4月11日),这个月还剩 13 个工作日。 月底可获得 20 * 13 = 260。 共 944.78 + 260.00 = 970.78。 每月 120 零花钱 共 970.78 + 120 = 1090.78 与目标差 909.22 同理可得五月份月收入:560 元,共计 1650.78 与目标相差 349.22 每月收入280,可得出七月份大概可以完成目标。 当然,这是最悲观的情况。也许有哪一天能发一笔横财呢。 2000块,攒攒总会有的。

2025/4/12
articleCard.readMore

把主力机系统换成Arch Linux是我这辈子做过的最蠢的决定

前言 先说结论。 我是傻逼! 我是傻逼!! 我是傻逼!!! 本文将讲述 为什么我放弃了Arch 为什么我放弃了Linux。 什么人适合用Linux做主力系统 本文的所有观点仅仅代表个人观点,我纯菜。你问我为什么要选择Arch,而不是Ubuntu或者其他新手友好的发行版,我不知道,正如上文所说,我是傻逼! 为什么我放弃了Arch 说到这个问题,就要先来谈谈为什么我要把Windows换成Linux。 Linux这个系统对于我来说一直是神秘而美好的,至少在当时。我痴迷于命令行、终端、Vim这种工具。小时候也看过爸爸零几年买的《鸟哥的Linux私房菜》,给我当时幼小的心灵带来的极大的震撼。 我当时也对Linux的目录结构非常新鲜,不分盘的设定感觉很好玩。 我网站的服务器是Linux、身边的各种设备都有Linux的影子,这更加提高了我对Linux的向往程度。 还有一个原因是,我当时正在用C语言写一个小工具,Windows下的gcc无法使用通配符*,要想用只能去打开Git Bash或者MSYS2,这俩东西界面的丑陋程度相比就不用我多说了,我当时就是喜欢把精力浪费在不必要的地方上,Windows的那个终端被我“美化”得花里胡哨的,上面两者的界面当然入不了我的眼。 为了解决这个问题,我开始使用WSL2,但仅仅停留在开始阶段。 我这个系统不知道怎么回事,根本没办法用WSL2。 全网都没有遇到这个问题的,那既然如此,重装系统吧。 和系统相处就像谈恋爱,总有一段热恋期,过了这个时期后就冷淡了、矛盾也就浮出水面。刚装好的前几天,我的热情前所未有的高涨,学习各种命令、各种工具,当然少不了配置我最爱的Vim。那么说到Vim,归根结底是文本编辑器对吧,打字的软件,那么就要说说我用Linux的第一大困难——输入法配置难 输入法配置难 我是双拼用户,从小学六年级就开始用小鹤双拼打字了,这么长时间的习惯很难改,我也不想改。但是Linux上对双拼友好的输入法方案几乎没几个,我尝试过两个,Fcitx5 + 搜狗, Fcitx5 + Rime。 这两个方案都大差不差,只是搜狗的可能略微智能一点,下载源什么的换成国内镜像,分分钟搞定下载问题。难就难在,我使用的终端不兼容Fcitx。 没错,我用的就是Kitty。 那么,肯定有人就想说,KDE自带的Console不能用吗?非得额外下载一个干什么?? 我的答案就是:丑。 没错,就是因为Console丑。当然他也可以美化,但问题就在于,他的窗口圆角不彻底,而且把标签页显示关掉后,只能额外开一个窗口,占用屏幕空间。 而Kitty就不同,窗口边框干净利落,看起来很舒服,而且配色看起来也比Konsole那高饱和度的方案舒服太多了。标签页不是类似于系统组件的那种形式,所以不会额外占窗口空间。 虽然不兼容问题,在程序启动参数添加一条指定ibus接口的命令就解决了。 你问我为什么非得要追求好看,闲的么?我当时可能会扣一大串字来回怼你,但是我现在觉得我错了,我认同你的观点,就是闲的。 如开头所说,我是傻逼! 配置各种东西就免不了使用Github下载,那么就由此引出了第二个问题,代理配置难 代理配置难 我这边访问Github非常不稳定,有时候能丝滑裸连,有时候挂代理都难上。我先用了Steam++的Github加速服务,但是他会把Github的一些地址都重定向到localhost导致使用Git的某些功能如git push异常。我又换到FastGithub,这东西很好用,但也有不稳定的时候,当他作为系统服务启动的时候,发生异常,想杀死他就变得十分困难,然后导致几乎所有Git功能都瘫痪,非常麻烦,git clone都跑不下来。 显卡驱动安装难 Linux显卡驱动问题一直都是社区津津乐道的蛋疼问题,更蛋疼的是我的显卡还是英伟达的,你问我为什么用英伟达显卡还玩Linux,我不知道。正如开头所说,我是傻逼! 显卡驱动的问题,我研究了一周左右,虽然最后还是成功了,但是离正常使用还有一段距离。也是有很多小问题,比如使用系统自带的截图会黑屏,用不了i3等窗口管理器等等。 当初安装显卡驱动导致的问题包括但不限于: 鼠标灵敏度异常 显示比例异常 画面撕裂 系统炸了 桌面炸了 能进图形界面但是不能登录 嗯对就是这么离谱。当然经过我一番折腾还是达到了能用但体验不好的程度。 安装软件难 拿QQ举例,QQ官网的Linux安装包是.deb,如果我想安装,还是要经过一大通折腾,拼凑出来一个半成品QQ,而且最难受的是,每次他都会自动推送更新,我还更不了,还不能忽略版本,让我这个强迫症非常折磨。 为什么我放弃了Linux 其实原本我是不打算放弃Linux的,因为我突然想玩星露谷物语了,就想着要不要装双系统,但是我装Arch根本没有经验,磁盘分区做的很烂,上面的一番折腾已经让我筋疲力尽,我不想再玩Arch,只想找一个开箱即用的Linux发行版。 我的目光理所应当地投到了Ubuntu,这是我小时候体验的第一个Linux发行版,对我来说意义有点特殊,而且也属于开箱即用,所以Arch就光荣的升级为我的前任了。 Windows系统的安装非常简单,只要一直下一步下一步下一步,然后等就行了。Ubuntu也差不多,但需要注意的一点是,有一个步骤让用户选择以怎样的方式安装Ubuntu,给了三个选项,一个是用Windows Boot Manager管理,一个是擦除磁盘,好像还有一个,没注意。 我要装双系统,当然是选第一个选项,系统正常装上了,一切正常。下载软件,Neovim、VSCode、kitty。 kitty…… 上文提到,Kitty不支持fcitx5,理论上这个问题还是可以像Arch时期那么解决,但是我当时没找到怎么给程序添加启动参数。跟着网上的教程折腾了半天系统配置文件后,我成功的又把系统玩炸了,进不去桌面。 当时已经是晚上十点多了,当天上午刚出去踏青,走了一万一千步,对于我来说已经把这一个月的活动量都用完了,筋疲力尽。非常困倦的状态下,我打算重装Ubuntu,正式因为特别困,智商下降得厉害,在安装程序选择了第二个:擦除磁盘。 我原本Windows系统的D盘擦干净装了个Ubuntu。 ………. 那就这样吧,也行,我试着在Windows里把C盘装的那个坏掉的Ubuntu删掉,但是Windows访问不了那块神秘区域。。。 那行吧,重装系统。我格式化了C盘,删除了所有的分区,重装了Windows。在下载软件的时候猛地一惊。 我为什么现在不用WSL了呢? 这是个好问题,对吧,你问我为什么到这时候才想起来用WSL,我不知道,正如开头所说,我是傻逼! 于是,我不再安装Ubuntu,执行wsl的安装命令,没有像上次使用Windows那样报错,报各种偏门错,报全网都找不到解决方法的错。 此时我心中一万头曹尼玛奔腾,只有一句话想说: 我是傻逼!!!!!! 什么人适合用Linux做主力系统 我个人认为,对Linux有刚需,如嵌入式、AI、机器学习这种领域,离开Linux干不了活的,我会推荐你用WSL,而不是主力Linux。我不建议任何人主力系统用Linux。。。。更不建议主力Linux发行版是Arch。 WSL的好处太多了,最大的好处就是方便。 当然,你爱折腾,对Linux有热情,有好奇心,完全可以把我这话当放屁。 结语 我是傻逼! 我是傻逼!! 我是傻逼!!!

2025/4/7
articleCard.readMore

上帝类是什么?该如何避免上帝类?

什么是上帝类 所谓的上帝类,就是指一个类承担了过多的职能,变得过于臃肿和复杂、难以维护。没有遵守单一职责原则。像上帝一样什么都能干,每个功能高度耦合,牵一发而动全身,不利于业务的拓展。 上帝类是如何产生的 上帝类的产生,通常是由于需要快速实现功能而做出的妥协,长期积累就变成繁重的技术债务。或是缺乏规划经验,功能不断地被加到类中。依旧长期积累,上帝类产生了。 上帝类的优缺点 上帝类虽然在上文被冠以臃肿、难维护的帽子,但并不代表他没有优点,要辨证地看待。 优点:上帝类适用于一些较小的、逻辑简单的任务或工具类,逻辑不复杂,也不需要长时间维护,即拿即用。不用过多地考虑职责和颗粒度的划分,也能提高开发效率 缺点:即上文中所提到的。臃肿、复杂、难以维护、测试麻烦、缺乏可读性、耦合度高,不可拓展同时违反SRP和OCP原则 上帝类的判定 代码行数判定法:代码行数很多的有可能是上帝类,注意是有可能。如果是上帝类,应当进行适当重构 依赖关系判定法:通过分析类的依赖关系来判定其是否与其他类高度关联,如果是,他有可能是上帝类。 职责判定法:如果一个类承担了过多的职责,他该干的也干了,不该干的也干了,那么毫无疑问,他是上帝类。 测试覆盖率判定法: 如果一个类难以单元测试,或覆盖率低或总是出现奇奇怪怪的不可预测的问题,那么他有可能是上帝类。 如何避免上帝类 所以,要如何避免上帝类,这个问题的答案已经显而易见了。和上一段相反着做即可。遵守单一职责原则。规划好代码架构。比如,要处理一个压缩包解析和数据展示功能,首先就要拆分职责为不同的类。类中再去写相对应的函数。我们可以把这个功能拆分为解压、读取、展示信息三个类,类中分别编写相应的代码,这样就能做到避免上帝类的产生,从而提高代码的可维护性和可拓展性。

2025/3/30
articleCard.readMore

安装配置Rime输入法

前言 其实我有能用的fcitx5+搜狗输入法的方案,但奈何kitty终端有对这个输入法的兼容性问题,无法启用中文,又奈何kitty的界面多美观舒服,和Konsole比起来简直就不是一个时代的产物。 安装Ibus框架和Rime输入法引擎 安装 IBus 和 Rime 组件: sudo pacman -S ibus ibus-rime 安装 Rime 双拼方案: sudo pacman -S rime-double-pinyin 配置 IBus 和 Rime 设置环境变量 在~/.xprofile添加以下内容 export GTK_IM_MODULE=ibus export QT_IM_MODULE=ibus export XMODIFIERS=@im=ibus 重启系统或执行 source ~/.xprofile 使配置生效 启动 IBus 并添加 Rime 输入源 ibus-daemon -drx 右键点击系统托盘中的 IBus 图标,选择 Preferences → Input Method → Add,选择 Chinese (Rime)。 配置双拼方案 编辑 Rime 的配置文件 ~/.config/ibus/rime/default.custom.yaml: patch: schema_list: - schema: double_pinyin # 自然码双拼 - schema: luna_pinyin # 全拼备用 优化 Rime 的智能联想与词库 启用雾凇拼音方案(推荐) cd ~/.config/ibus/rime git clone https://github.com/iDvel/rime-ice.git cp -r rime-ice/* . 安装小鹤双拼方案 # 安装 plum 工具 curl -fsSL https://git.io/rime-install | bash -s -- double-pinyin flypy

2025/3/25
articleCard.readMore

Nodejs环境下控制台拼接字符串输出有undefind

今天在Nodejs环境下搓小工具,控制台输出拼接字符串时,发现有undefind,代码如下: const date = new Date(); const year = date.getFullYear(); const month = date.getMonth(); const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); const logTime = `[${year}-${month}-${day} ${hour}:${minute}:${second}] `; class GenerateLog { static log() { process.stdout.write(logTime); } } console.log(GenerateLog.log() + "log output on the console"); 输出确是这样: [2025-3-22 18:56:33] undefindlog output on the console 原因 :GenerateLog.log()方法没有返回值,所以输出undefind,解决方法如下: // 让log方法返回logTime class GenerateLog { static log() { return logTime; // 返回字符串 } } console.log(GenerateLog.log() + "log output on the console"); 关键总结: Javascript中,如果方法没有返回值,那么输出的就是undefind 扩展 为什么 console.log() 本身会返回 undefined? 在 REPL 环境(如 Node.js 命令行或浏览器控制台)中,每条语句的执行结果会被隐式打印。由于 console.log() 函数本身没有返回值(即返回 undefined),因此会显示 undefined。但在脚本执行时,这一行为不会发生,因为脚本模式不自动打印返回值

2025/3/23
articleCard.readMore

Kitty终端美化记录

Kitty这个终端可谓是兼顾了性能与美观,虽然默认设置很简陋,但是经过一番折腾后也能变得很漂亮。 选择配色 运行kitty + kitten themes后会弹出一个选择配色的界面 令我感到非常高兴的是,这个界面支持vim的hjkl键位,也可以用/来搜索。 选好后,回车按m,command + ^ + ,重载配置文件。 配置字体 打开kitty的配置文件nvim ~/.config/kitty/kitty.conf,把字号改到12 font_size 12 输入kitty list-fonts --psnames来列出系统安装好的所有等宽字体。 设置窗口风格 进入配置文件 #window # 不显示窗口标题栏 保留窗口圆角 hide_window_decorations titlebar-only # 边距 window_padding_width 5 # 不透明度 background_opacity 0.8 # 毛玻璃效果 background_blur 30 设置标签栏风格 #tab bar tab_bar_edge top tab_bar_style powerline tab_powerline_style slanted 安装终端文件管理器 yay -S yazi 推荐yazi的原因,就是能用vim快捷键啊!hjkl好文明! 而且它还能直接在终端预览图片 最终效果预览

2025/3/9
articleCard.readMore

KDE桌面环境无法在Konsole切换中文输入法的解决方案

原因 KDE默认使用Wayland会话,而fcitx4不支持Wayland,需升级到fcitx5。若无法升级到fcitx5或升级后仍然无法切换中文输入法,安装fcitx-qt6 sudo pacman -S fcitx-qt6 安装后执行sudo reboot now进行重启,问题解决。

2025/3/9
articleCard.readMore

【无废话】全网最简单的Hexo+Obsidian图片解决方案

把Hexo博客根目录用黑曜石打开,如果已经打开了仓库 在弹出的窗口中选第二个。 在source目录下新建images文件夹用于存放图片 设置 => 文件与链接 => 附件默认存放路径:选择指定的附件文件夹。路径填写刚刚创建的image文件夹的相对路径 取消使用Wiki链接 注意。由于我的文件结构是这样的所以这么填写,要根据自己的文件结构填写相对路径。 搞定,同时可以在本地编辑环境和博客网站中显示。

2025/3/6
articleCard.readMore

【未解决】Windows WSL报错:Error: 0x80080005 ???????

设备环境: 操作系统:Windows 10 安装系统:Arch Linux 错误日志: Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x80080005 Error: 0x80080005 ??????? Press any key to continue... 网上有一篇文章提到这个错误,下面的评论回复以管理员权限运行命令提示符并执行sc stop LxssManager和sc start LxssManager 出现如下报错: C:\Windows\system32>sc stop LxssManager [SC] OpenService 失败 1060: 指定的服务未安装。 顺藤摸瓜,在网上寻找LxssManager这个服务要如何安装。 网上暂时还没有找到相关文章能够解决这个问题,但是CSDN的一篇文章引起了我的注意 [SC] OpenService 失败:1060指定的服务未安装_[sc] openservice 失败 1060: 指定的服务未安装。-CSDN博客 文章中提到了“服务”,在开始菜单中搜索服务,进入应用找到了一个名为WSL Service的服务。点左上角启动。 提取关键信息:1058、被禁用、关联的设备没有启动。 检查功能是否开启:按下 Win+S 搜索 启用或关闭Windows功能 勾选适用于Linux的Windows子系统和虚拟机平台这两项,点击确定 重启电脑。 回来以后,用管理员身份运行powershell,强制重置WSL服务,依次执行: wsl --shutdown wsl --unregister Arch # 替换为你的发行版名称 wsl --install -d Arch # 重新注册发行版 如果提示内核缺失,在这里下https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi 如果有以下输出: zcz  system32  ♥ 21:32  wsl --shutdown 此应用程序需要适用于 Linux 的 Windows 子系统可选组件。 通过运行安装它: wsl.exe --install --no-distribution 可能需要重新启动系统才能使更改生效。 错误代码: Wsl/WSL_E_WSL_OPTIONAL_COMPONENT_REQUIRED 两种可能: 没有安装WSL服务 服务被禁用 后者比较棘手,我们先做第一种尝试 强制安装WSL组件 以管理员身份运行 PowerShell,执行以下命令: # 安装WSL核心组件(会自动启用虚拟化功能) wsl --install 输出: zcz  system32  ♥ 21:34  wsl --install 正在安装 Windows 可选组件: Microsoft-Windows-Subsystem-Linux Deployment Image Servicing and Management tool Version: 10.0.19041.3636 Image Version: 10.0.19045.5487 启用一个或多个功能 [==========================100.0%==========================] The operation completed successfully. 正在安装 Windows 可选组件: VirtualMachinePlatform Deployment Image Servicing and Management tool Version: 10.0.19041.3636 Image Version: 10.0.19045.5487 启用一个或多个功能 [==========================100.0%==========================] The operation completed successfully. 请求的操作成功。直到重新启动系统前更改将不会生效。 再次进行重启。 Restart-Computer 开机加载界面显示:我们无法完成更新,正在撤销更改。。 尝试过的方法:进入安全模式,尝试重启更新,失败。 安全模式仍然失败,选择临时禁用WSL服务 管理员cmd执行 sc config LxssManager start= disabled shutdown /r /t 0 输出: C:\Windows\system32>sc config LxssManager start= disabled&& shutdown /r /t 0 [SC] OpenService 失败 1060: 指定的服务未安装。 唉,老朋友,又见面了。只能祭出来我的终极大杀器。 彻底重装WSL # 卸载所有发行版 wsl --unregister * # 删除残留配置 Remove-Item -Path "$env:USERPROFILE\AppData\Local\Packages\*Linux*" -Recurse -Force 输出: zcz  system32  ♥ 22:04  # 卸载所有发行版 > wsl --unregister * > # 删除残留配置 > Remove-Item -Path "$env:USERPROFILE\AppData\Local\Packages\*Linux*" -Recurse -Force 正在注销。 此应用程序需要适用于 Linux 的 Windows 子系统可选组件。 通过运行安装它: wsl.exe --install --no-distribution 可能需要重新启动系统才能使更改生效。 错误代码: Wsl/WSL_E_WSL_OPTIONAL_COMPONENT_REQUIRED 输入wsl.exe --install --no-distribution 输出: zcz  system32  ♥ 22:09  wsl.exe --install --no-distribution 正在安装 Windows 可选组件: Microsoft-Windows-Subsystem-Linux Deployment Image Servicing and Management tool Version: 10.0.19041.3636 Image Version: 10.0.19045.5487 启用一个或多个功能 [==========================100.0%==========================] The operation completed successfully. 正在安装 Windows 可选组件: VirtualMachinePlatform Deployment Image Servicing and Management tool Version: 10.0.19041.3636 Image Version: 10.0.19045.5487 启用一个或多个功能 [==========================100.0%==========================] The operation completed successfully. 请求的操作成功。直到重新启动系统前更改将不会生效。 继续重启,显示“我们无法完成更新,正在撤销更改。” 以管理员身份打开CMD: 按下 Win+S → 输入 cmd → 右键选择 “以管理员身份运行”  执行以下命令(注意语法): sc config LxssManager start= auto sc config vmcompute start= auto net start LxssManager net start vmcompute 仍然1085,管理员cmd执行 dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 尝试重装WSL,出现 ![[_posts\Windows-WSL报错:Error-0x80080005\Pasted image 20250304222548.png]] 研究了一阵子,vmcompute(虚拟机核心服务)和 LxssManager(WSL管理服务)均未注册,导致WSL安装向导崩溃。 # 以管理员身份运行 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart dism.exe /online /enable-feature /featurename:HypervisorPlatform /all /norestart 重启,“我们无法完成更新,正在撤销更改。” 。。。。。、、、、 尽力了。现在看来,是系统层面的硬伤了。可能行得通的有重装系统和保留文件重置系统两个选择。不过我还是会和这个问题死磕一下,我就不信我干不成这个事。明天还要苦逼上学,先睡了。 2025.3.4 22:57 ———————————————————————————— 2025.3.5 尝试强制修复系统核心组件 # 以管理员身份运行 PowerShell sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth 重置 Windows Update 组件 # 管理员cmd执行 net stop wuauserv net stop cryptSvc net stop bits net stop msiserver rmdir C:\Windows\SoftwareDistribution /S /Q net start wuauserv net start cryptSvc net start bits net start msiserver # 强制重建WSL核心服务 sc create vmcompute binPath= "C:\Windows\System32\vmcompute.exe" start= auto type= kernel sc create LxssManager binPath= "C:\Windows\System32\lxss\LxssManager.dll" start= auto type= own net start vmcompute net start LxssManager 仍然无法启动。使用wsl偶遇神秘怪异bug拼尽全力无法战胜。我都已经浪费这么长时间来研究这个问题,为什么我不直接装个Linux系统呢。周末就把这傻卵系统换成Arch!

2025/3/5
articleCard.readMore

CSS鼠标指针操作

今天在上网冲浪的时候,看到Github上有一个明日方舟风格的主题,这个主题让我感到新鲜的一点是网页中的鼠标指针特效 这么舒服的动画效果我必须也要做一个,说干就干,新建个HTML文档。 * { cursor: pointer; } 这样,我们整个网页的鼠标指针样式就都变成了小手指的样式,不过这样还是太丑,我们仿照arknights主题的样式,打开PS,画一个指针图标出来看看 使用url()属性可以替换自己的素材图片 * { cursor: url("./source/cu.ico"), auto; } 这样鼠标指针的效果就做好了(因为我的截图软件要用鼠标指针选区,所以截不到图)

2025/3/4
articleCard.readMore

关于

我是谁? 11 年出生,天津人。 有一定智商情商。 在集体毫无存在感,可有可无。 最大的爱好是自己待着做各种事: 喜欢看书。最爱文学,正在犹豫要不要尝试哲学。 喜欢听歌。最爱J-Pop。東京事変、椎名林檎…… 被迫写作。不写会憋死,假装会写几个字。 在哪找到我? Email(最推荐) 新闻组 公众号 豆瓣 关于这里 共唧唧歪歪了 104567 字, 约等于 《1984》 的0.9倍 这里是记录日常观察、技术实践、阅读思考与个人成长的网络日志。还有关于互联网、书籍、生活琐事以及那些一闪而过的念头。记录生活、吐槽见闻、分享阅读。真实,或许还有点拧巴。

2025/2/26
articleCard.readMore

开箱即用的neovim配置文件

2025.8.24二编: 这个蠢货为什么不挂github…… 下载链接 https://yingyu5658.lanzoup.com/iWfXQ2ln6jre 为了兄弟们下得爽点就不用百度网盘或者夸克了 代码都有比较详细的注释 语言支持策略 核心开发场景 HTML/CSS/JavaScript 扩展语言 C/CPP 基础语法支持 Java建议 JetBrains IDE 深度开发 插件生态 插件名称 功能定位 配置文件位置 LazyVim 现代化配置框架 lua/lazyvim/config/lazy.lua coc.nvim 智能语言服务引擎 coc-settings.json + 内联配置 TokyoNight 专业暗色主题 主题配置文件 nvim-tree 可视化文件系统 keymaps.lua 集成快捷键 还有一些辅助性质的插件,在此不一一列举 文件结构 nvim │ ├── coc-settings.json # LSP/语法检查/代码补全规则库 ├── init.lua # 配置入口(模块化加载器) ├── lazy-lock.json # 插件版本锁定文件(自动生成) │ └─lua/ ├─core/ │ └─keymaps.lua # 全模式快捷键中枢 │ ├─lazyvim/ # LazyVim 框架核心 │ └─config/ │ └─lazy.lua # 插件加载策略 │ └─plugins/ # 插件扩展区 └─plugins.lua # 第三方插件注册中心 快捷键配置 全局设置 窗口管理 (正常模式) <空格> + s + v 垂直分割窗口 <空格> + s + h 水平分割窗口 <空格> + n + h 取消搜索结果高亮 文件树操作 (正常模式) <空格> + Tab键 切换NvimTree显示 文本操作 (可视模式) J 向下移动选中块(保持选中状态) K 向上移动选中块(保持选中状态) 代码补全 (插入模式) Ctrl + Space 触发补全建议 Enter 确认补全选择(补全可见时)/普通回车 Tab 选择下一个补全项(补全可见时)/普通Tab Shift + Tab 选择上一个补全项(补全可见时)/反向Tab

2025/1/23
articleCard.readMore

Java面向对象编程——多态、抽象类、接口

什么是多态 在继承/实现情况下的一种现象,表现为:对象多态、行为多态。 多态的前提 有继承/实现关系;存在父类引用子类对象;存在方法重写 多态的注意事项 多态是对象、行为的多态,成员变量不体现多态。 使用多态的好处 在多态形式下,右边的对象是解耦合的,更便于拓展和维护。 定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强、更便利。 多态下产生的一个问题 多态下不能使用子类的独有功能。 多态下的类型转换 自动类型转换:父类 变量名 = new 子类(); 强制类型转换: 子类 变量名 = (子类)父类变量 强制类型转换的注意事项 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException) 强转前,Java建议: 使用instanceof关键字,判断当前对象的真是类型,再进行强制类型转换。 final final关键字的中文是最终的意思,可以修饰类、方法、变量 修饰类:该类被称为最终类,特点是不能被继承了。 修饰方法:该方法被称为最终方法,特点是不能被重写了。 修饰变量:该变量只能被赋值一次。 常量 使用了static final 修饰的成员变量就被称为常量; 作用:通常用于记录系统的配置信息。 注意:常量的命名规范:使用大写英文单词,多个单词使用下划线连接起来。 视同常量记录系统配置信息的优势、执行原理 代码可读性更好、可维护性也更好。 程序编译后,常量会被宏替换:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是一样的。 抽象类 什么是抽象类 Java中有个关键字叫abstract,他就是抽象的意思,可以用来修饰类、成员方法 abstract修饰类,这个就是抽象类,修饰成员方法同理。 抽象类的注意事项、特点 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。 类该有的成员(成员变量、方法、构造器)抽象类都可以有。 抽象类最主要的特点: 抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。 抽象类的使用场景和好处 父类知道每个子类都要做某个行为,但每个子类做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。爸爸画饼儿子烙饼 接口 接口概述 Java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。 注意:接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类被称为实现类。 一个类可以实现多个接口,实现类实现多个接口必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。

2025/1/10
articleCard.readMore

Java面向对象编程——继承

什么是继承 Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。 继承的特点 子类能继承父类的非私有成员变量和成员方法。 继承后对象的创建 子类的对象是由子类、父类共同完成的。 继承相关的注意事项 权限修饰符 什么是权限修饰符? 用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围 权限修饰符有几种与各自的作用 修饰符 在本类中 同一个包下的其他类 任意包下的子类 任意包下的任意类 private √ 缺省 √ √ protected √ √ √ public √ √ √ √ provate < 缺省 < protected < public 单继承 Java是继承的,Java中的类不支持多继承,但是支持多层继承。 Object类 Ojbect类是所有Java类的父类,任何类都是Object的子类。 方法重写 什么是方法重写 当子类发现父类中的方法无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法去覆盖父类的这个方法,这就是方法重写。 注意:方法重写后,方法的访问遵循就近原则。 方法重写的注意事项 重写时使用Override注解,他可以指定Java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。 子类重写父类方法时,访问权限必须大于或等于父类该方法的权限(public > protected > 缺省)。 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。 私有方法、静态方法不能被重写,如果重写会报错。 方法重写在开发中的常见应用场景 子类重写Object类的toString()方法,以便返回对象的内容。 子类中访问其他成员的特点 在子类方法中访问其他成员是按照就近原则的。 先子类局部范围找。 然后子类成员范围找。 然后父类成员找 然后父类成员范围找,如果父类范围还没有找到则报错。 如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的方法怎么办? 可以通过super关键字,指定访问父类的成员:super.父类成员变量/父类成员方法 子类构造器的特点 子类的全部构造器,都会先调用父类的构造器,再执行自己。 子类构造器是如何实现调用父类构造器的: 默认情况下,子类全部构造器的第一行代码是super();(写不写都有),他会调用父类的无参数构造器。 如果父类没有无参数构造器,我们必须在子类构造器的第一行手写super();,指定去调用父类的构造器。

2025/1/10
articleCard.readMore

修复Geyser下基岩版玩家无法在地狱基岩层放置方块

在plugins\Geyser-Spigot\config.yml中把第160行的above-bedrock-nether-building: false改为true,重启服务器,问题解决~ 原理:geyser把下界翻译成了末地,会导致下界天空变成末地的样式,不过可以解决基岩版玩家在地狱基岩层的问题。

2025/1/9
articleCard.readMore

Spigot服务端控制台中文乱码解决方案

把-Dfile.encoding=UTF-8加在开服脚本文件的-jar前即可。 在启动脚本第一行加上chcp 65001 我的启动脚本如下: chcp 65001 java -Dfile.encoding=UTF-8 -jar spigot-1.21.jar

2025/1/4
articleCard.readMore

String的注意事项

String的注意事项 String对象的内容不可改变, 被称为不可变字符串对象。 只要是以“…”的方式写出的字符串,都会存储到字符串常量池,且相同的字符串只存储一份; 但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。 不可变字符串对象 不可变?它肯定可变啊,比如 package string; public class StringDemo3 { public static void main(String[] args) { String name = "yingyu5658"; name += ".me"; name += "域名"; System.out.println(name); } } 这时候把name打印出来不就是yingyu5658.me域名了吗? 每次试图改变字符串对象实际上是新产生可字符串对象,变量每次都与指向了新的字符串对象,之前字符串对象的内容确实是没有改变的,因此说String的对象都是不可变的。 第二点注意事项 示例代码: package string; public class StringDemo3 { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); //true } } 这里使用双等来判断两个变量的地址是否相同,返回结果为true,也就是说,地址是相同的。 原理:上文提到,双引号包裹住的字符串,会被保存到字符串常量池中,且相同的字符串只存储一份。这里我们声明了两个内容为abc的String类型变量。Java是很聪明的,当我们把s2声明,它要存到字符串常量池时,看到内容一样,就不再存了,而是把s2也指向abc,因此s1地址和s2地址是一样的。 new 示例代码: package string; public class StringDemo3 { public static void main(String[] args) { char[] chars = {'a','b','c'}; String a1 = new String(chars); String a2 = new String(chars); System.out.println(a1 == a2); //false } } 上文提到,每new一次就会创建一个新的对象,所以此时再比较两者地址,返回false,是不同的。

2024/12/20
articleCard.readMore

面向对象编程总结

面向对象(oop) 面向对象编程的思想:面向。拿或者找。 对象:东西 面向对象编程:拿东西过来编程 面向对象:把现实世界中的食物看成一个一个对象来解决问题的。(万物皆 对象) 面向对象的好处:代码更符合人类的思维习惯。编程更简单。看程序更容易理解(?) 类、对象: 类(设计图):相同事物,共同特征的描述。 对象:对象是类的具体的实例。 对象 = 实例 在Java中必须先定义类,才能得到对象 定义类来创建对象使用 定义类的格式 成员变量(代表属性,一般是名词):数据类型 名称; 成员方法(代表行为,一般是动词) 构造器(前面的区域以后再来探索吧) 代码块(前面的区域以后再来探索吧) 内部类(前面的区域以后再来探索吧) 类中具体怎么写: 一般名词定义成成员变量(属性) 修饰符 数据类型 变量名称 = 初始值 成员变量不建议给初始值,它存在默认值。 一般动词定义成方法(行为) 创建对象 类名 对象名 = new 构造器(); 对象使用: 对象名.成员变量 对象名.成员方法 构造器 作用: 初始化一个累的对象并且返回这个类的地址。 详细格式:修饰符 类名(形参){...} 构造器的分类: 无参数构造器:初始化一个类的对象,里面的数据都是默认值,并返回地址。 有参数构造器:初始化一个类的对象,并返回地址,并且可以同时为对象赋值。 构造器如何调用: 类名 对象 = new 构造器; 注意:任何类写出来,自带无参数构造器 但是在这个类中定义了一个有参数构造器了,那么无参数构造器就消失了,此时如果还要使用无参数构造器,必须自己写一个。 this关键字 作用:代表了当前对象的地址。可以访问当前对象的成员变量信息和成员方法 具体应用场景 可以用在有参数构造器中 可以用在方法中 封装 面向对象三大特征:封装、继承、多态。 封装的基本思想:决定属性和行为归属谁的问题。 如何更好的封装: 成员变量私有化,只能在本类访问。 合理暴露 提供成套的getter和setter方法暴露取值赋值。 标准JavaBean JavaBean是什么:是实体类。 作用:创建对象,封装数据。

2024/12/19
articleCard.readMore

记录配置SSL证书

首先你要有一个SSL证书,建议在阿里云购买或者免费申请,具体过程阿里云这个页面讲的很详细,在此不过多赘述。 配置证书 由于我的nginx安装了ssl模块,直接进入配置证书。 解压下载好的证书,然后上传到服务器。位置自己方便找到即可 我放到了root/card 配置nginx.conf 进入nginx.conf,我的文件位置在/etc/nginx/nginx.conf,有些可能在/usr/local/nginx/conf 编辑模式,启动! http {     include       mime.types;  # 包含 MIME 类型定义     default_type  application/octet-stream;     sendfile        on;     keepalive_timeout  65;     # HTTPS server block     server {         # 监听443端口(HTTPS)         listen 443 ssl;         # 【请修改】您的域名         server_name xxx;         # 启用 SSL (注意: "ssl on;" 已被弃用,直接使用 "listen ... ssl;")         ssl on;         # 【请修改】SSL 证书的 PEM 文件路径         ssl_certificate  /root/card/www.xxxx.pem;         # 【请修改】SSL 证书的 KEY 文件路径         ssl_certificate_key /root/card/www.xxxx.key;         location / {             # 【请修改】代理转发的目标地址和端口(例如公网IP和项目端口号)             proxy_pass  http://公网地址:项目端口号;         }     }     # HTTP server block for redirecting to HTTPS     server {         # 监听80端口(HTTP)         listen 80;         # 【请修改】您的域名         server_name huiblog.top;         # 将所有 HTTP 请求永久重定向到 HTTPS         rewrite ^(.*)$ https://$host$1 permanent;     } } 重新加载Nginx sudo systemctl reload nginx

2024/12/17
articleCard.readMore

Typecho不要用阿里云系统镜像

不要用阿里云的系统镜像,那个是1.1版本的。。。很多插件都没办法正常用。。。比如这两个插件就会这样 还有很多主题和插件都犯这样的毛病,在此不多提,我会想办法升级版本的(又挖了个坑) 难受

2024/12/16
articleCard.readMore

Vim基础操作快速入门

前言 各种鼠标操作让我有点抓狂,vim或许是一个很适合我的东西,全键盘操作听起来就很方便快捷,除了上手难度有点高以外,vim看起来似乎没有任何的缺点。在下载安装好了vim后,我开始学习了快捷键。然后我们就可以直接把鼠标扔了。 记住要先把输入法切换成英文模式 普通模式 退出 很多人第一次用vim,最难受的事情绝对是不知道怎么退出。 退出::q! 移动光标 h j k l 这四个按键分别对应左 下 上 右 这个比较难适应,不过也比把手移动到右下方用箭头键舒服了 大范围移动 行数 + h/ j/ k/ l 比如,想要向下移动三行,就是3j,向左移动四格,就是3h gg 跳转到文档的最上方 G 跳转到文档的最下方 按照单词跳转 w,也就是“word”的首字母。就可以跳转到下一个单词的开头。 b beginning就跳转到前一个单词的开头 f find 查找单词。比如要把光标移动到离你最近的b,就可以输入fb 翻页 Ctrl + u向上翻页。u理解为up首字母。 Ctrl + d向下翻页。d理解为down首字母。 复制粘贴 在普通模式下,输入y (yank),复制整个单词:yaw “aw’“为阿伟 all word p 即paste,粘贴。 删除 普通模式下,d 也就是delete,直接删除当前行和下一行的内容 还可以跟上文的hjkl结合起来,比如d8j就是向下删除八行 撤销 u 也就是undo。 这些快捷键很灵活,都可以互相结合使用 输入模式 进入输入模式 在普通模式下,输入i 也就是insert,就可以进入输入模式了。 i是在当前光标的前一个字母开始输入。 使用a也就是append,就可以在当前光标之后输入。 使用I就会从这一行的开头进入输入模式。 使用A就会从这一行的末尾进入输入模式。 完成编辑后,使用ESC 就可以退出编辑模式,回到普通模式了。 命令模式 在普通模式下输入:就可以进入命令模式,按下ESC就会退出命令模式。 在下方的命令行中,可以输入命令 q也就是quit就可以退出 保存w 保存并退出wq 可视模式 普通模式下按下v就可以进入可视模式。 配置文件 vim中修改键位,安装主题全都是用一个配置文件来完成的。 原版vim的配置文件叫做.vimrc 关于修改键位,我的看法是不要改,因为你适应之后上服务器就会很难受,什么都不适应。

2024/12/14
articleCard.readMore

游戏资源下载及连接服务器相关教程

前言 为了避免不必要的麻烦和纠纷,也是为了打造一个纯粹干净高质量的社区,我们需要对想要参与的人员提出一些条件,请确保你自身可以满足这些条件后再来愉快的玩耍。 所有的条件都是最基本的,一点也不苛刻,大部分要求仅仅是一些应该具备的能力。 正文 具备一定的耐心 具备文档阅读能力 不是伸手党,具备在互联网上搜索的能力 拥有思考和自己解决问题的能力,而不是有点什么问题直接在群里发问,我编写的各种文档已经涵盖了可能出现的大部分问题,请仔细阅读文档。 拥有支配自己钱财的权利 不在游戏内使用外挂、修改器。(当然你开了我也没法知道,全凭良心) 在你确保满足上篇文章的各项要求后,可以开始阅读这篇文章。本文章将详细地讲解泰拉瑞亚PC/Android端下载以及连接服务器的方法。 泰拉瑞亚Android版本下载 你可以直接打开群聊>群文件>泰拉瑞亚>Terraria_1.4.4.9.apk.1 安装apk.1的方法 几年前的新版本QQ中,所有的apk都会被强行篡改为apk.1导致很多用户无法正常下载。 首先,你需要下载MT管理器(直接在应用商城搜或者浏览器搜) 下载好后,打开MT管理器,进入/storage/emulated/0/Android/data/com.tencent.mobileqq/tencent/QQfile_recv 找到你刚刚下载好的apk.1文件,点击它,在弹出的窗口中点击左下角的“类型”,点击全部。 不同型号的手机这个界面的选项会有所不同,以oppo手机为例,在这个页面向下滑动就会找到一个“软件包安装程序”的按钮。点击它就会进入软件安装页面,所有的选项全部点同意后,等待一段时间就可以打开游戏了。 其他品牌型号的手机也差不多,多尝试寻找。寻找差不多的字样。 我无法打开/Android/data 自安卓11起,访问Android/data等目录需要授权;自安卓14起,授权途径被阻止。在2024年2月的安全更新中,谷歌将该项限制合入,覆盖到了安卓11、12、12L、13、14。在系统设置-关于手机中安全更新日期大于等于2024年2月的系统可能会遇到无法授权的问题。 遇到这种问题的同学,可以点击这个链接从网盘下载。要点击后缀名为.apk的文件下载 https://pan.quark.cn/s/a5d434ab6145 泰拉瑞亚PC版本下载 PC端也可以通过群文件或网盘下载 https://pan.quark.cn/s/856451f8f210 把压缩包下载好后,解压出来,在解压出来的文件夹内双击setup_terraria_v1.4.4.9_v4_(60319).exe运行,弹出的窗口左下角可以配置路径,按照你的需求配置好后同意协议,等待一段时间后安装就完成了(有些电脑时间可能比较长,请耐心等待)。 连接服务器教程 以PC端为例,当你下载安装好了游戏之后,创建一个人物。创建好后,左下角返回。点击多人游戏,选择最上面的加入。把群公告里的ip输入进去,然后输入端口。(手机端要直接添加一个英文冒号并跟上端口) 注册登录 为了保证游戏的公平性,本服务器开启了强制开荒,也就是进入服务器后强行把物品栏清除到服务器配置文档的默认值(同志短剑、铜稿、铜斧)。即使毕业人物存档进服也只能被废尽武功从头修炼。 连接到服务器后,你会发现你无法进行移动、破坏方块、拾取物品等操作,这是因为你还没有注册。 打开聊天栏,按照以下格式输入命令 /register <password> 比如我的密码是114514,我就可以输入 /register 114514 注册好后,再打开聊天栏按照以下格式输入 /login username password即可登录。同一设备登陆过一次后,无需再次登录。 例如 /login yingyu5658 114514 恭喜你,你可以开始游玩了!

2024/12/13
articleCard.readMore

Java面向对象编程快速入门

什么是面向对象编程 通俗易懂的说,就是把一坨一坨的数据放到一起存储 比如要存储一个学生的语文成绩和数学成绩 新建一个类 public class Student { String name;//名字 double chinese;//语文成绩 double math;//数学成绩 public void printTotalScore() { System.out.println(name + "的总成绩是" + (chinese + math)); } public void printAverageScore() { System.out.println(name + "的平均成绩是" + (chinese + math) / 2.0); } } 这样学生的模板就创建好了,但是这个模板还没有指向学生的每一个个体。我们可以再同一个包下再新建一个类。 public class Test { public static void main(String[] args) { //1.创建宇哥学生对象来封装学生a的数据 Student s1 = new Student(); s1.name = "学生a"; s1.chinese = 100; s1.math = 100; s1.printTotalScore(); s1.printAverageScore(); //2.再创建一个学生对象,封装学生b的数据 Student s2 = new Student(); s2.name = "学生b"; s2.chinese = 100; s2.math = 59; s2.printTotalScore(); s2.printAverageScore(); } } 用以上代码新建一个学生类并且调用我们之前写好的功能 开发一个一个的对象,把数据交给对象,再用调用对象的方法来完成对数据的处理,这种方法叫面向对象编程。

2024/12/1
articleCard.readMore

深刻认识面向对象

面向对象编程的好处 按照詹姆斯·高斯林的看法,世间万物都是对象。好比要出去旅游,你要找到车这个对象调用他的行驶功能使用来带你出去旅游。 所以面向对象编程的好处就是:符合人类思维习惯,编程更简单,更直观。 程序中的对象到底是什么 对象本质上是一种特殊的数据结构,很像数据库,但是数据库是持久存储的数据。体现出计算机各个学科的交叉。 一开始设计的类就是一张表,后续在其他类中填入这张表的内容。 对象是怎么出来的 class也就是类,也称为对象的设计图(或者对象的模板) 类里可以设计很多变量,用来说明对象可以处理什么数据。 类里还可以设计很多的方法,描述对象有什么功能,也就是要对数据进行什么样的处理。 接下来我们就可以在程序中new对象了 也就是先用class设计对象,然后再用class new出对象。 具体使用语法见上一篇文章[post cid=“98” /]

2024/12/1
articleCard.readMore

Java方法的传参原理

Java方法的参数传递机制-基本类型 值传递 值传递是什么 在传输实参给方法的形参的时候,传输的是实参变量中存储的副本 说人话,把实参里面的东西赋值了一部分扔了给形参 值传递具体理解案例 public class prameter { public static void main(String[] args) { int a = 10; //定义一个int变量a赋值为10 change(a); //调用change方法 System.out.println("main" + a); //打印mian a中的值 } //这里开始写方法 public static void change(int a){ System.out.println("change1" + a); //打印方法中a的值 a = 20; System.out.println("change2"a); //打印赋值后a的值 } } 我们运行以后,控制台输出的结果为 change1 10 change2 20 main 10 为什么main中打印的不是赋值后的20? 这就要提到刚才的概念:值传递 我们定义了一个变量a = 10;,在方法中public static void change(int a) 由于值传递,也就是把值复制了一分传给方法,所以我们方法里用的值永远都是刚刚定义的int a = 10;,所以change(a); = change(10); 我们后面再赋值,打印出来的结果还是10,除非你把变量定义的代码改了,否则方法里的值不会变。 引用类型的参数传递 引用类型的参数传递也满足值传递,但代码中会有不同的地方。 示例代码 public static void main(String[] args) { int[] arrs = new int[]{10,20,30}; change(arrs); System.out.println("main" + arrs[1]); } public static void change(int[] arrs) { System.out.println("方法内1" + arrs[1]); arrs[1] = 222; System.out.println("方法内2" + arrs[1]); } 结果: 方法内1:20 方法内2:222 main:222 上一篇文章提到了栈内存的执行顺序,根据上一篇所讲,代码执行顺序如下: 1.先执行 public static void change(int[] arrs) { System.out.println("方法内1" + arrs[1]); arrs[1] = 222; System.out.println("方法内2" + arrs[1]); } 2.再回到main方法 System.out.println("main" + arrs[1]); 在1时进行打印,结果得到数组内第二个位置存储的20. 代码继续向下执行,第二个位置被赋值为222,此时再打印它,结果得到222. 这时候change方法执行完,它在栈内存中会被清除,然后回到main方法,由于刚才change方法中对arr[1]进行了赋值,所以我们再打印,结果得到的还是它赋值出来的222.

2024/12/1
articleCard.readMore

Java小程序之两数计算器

这个案例是我练习方法的使用时做的,应该能有更好的方式实现这个功能。 代码如下 import org.w3c.dom.ls.LSOutput; import java.util.Scanner; public class Basic { public static void main(String[] args) { for (; ; ) { System.out.println("欢迎使用!"); System.out.println("按键1 2 3 4分别为加 减 乘 除,输入后请回车"); Scanner startSc = new Scanner(System.in); int selectNumber = startSc.nextInt(); if(selectNumber >4) { System.out.println("请输入正确的数字以选择!"); } //以下为加法 if (selectNumber == 1) { System.out.println("请输入您要计算的第一个数字"); Scanner jiafaSc = new Scanner(System.in); int jiafa1 = jiafaSc.nextInt(); System.out.println("请输入您要计算的第二个数字"); int jiafa2 = jiafaSc.nextInt(); jiafa(jiafa1, jiafa2); } //以下为减法 if (selectNumber == 2) { System.out.println("请输入您要计算的第一个数字"); Scanner jianfaSc = new Scanner(System.in); int jianfa1 = jianfaSc.nextInt(); System.out.println("请输入您要计算的第二个数字"); int jianfa2 = jianfaSc.nextInt(); jianfa(jianfa1, jianfa2); } //以下为乘法 if (selectNumber == 3) { System.out.println("请输入您要计算的第一个数字"); Scanner chengfaSc = new Scanner(System.in); int chengfa1 = chengfaSc.nextInt(); System.out.println("请输入您要计算的第二个数字"); int chengfa2 = chengfaSc.nextInt(); chengfa(chengfa1, chengfa2); } if (selectNumber == 4) { System.out.println("请输入您要计算的第一个数字"); Scanner chufaSc = new Scanner(System.in); int chufa1 = chufaSc.nextInt(); System.out.println("请输入您要计算的第二个数字"); int chufa2 = chufaSc.nextInt(); chufa(chufa1, chufa2); } System.out.println("-----------------------------------------"); } } //加减乘除各项功能的方法,上面直接调用 public static int jiafa(int a, int b) { int jieguo = a + b; System.out.println(jieguo); return a + b; } public static int jianfa(int a, int b) { int jieguo = a - b; System.out.println(jieguo); return a - b; } public static int chengfa(int a, int b) { int jieguo = a * b; System.out.println(jieguo); return a * b; } public static int chufa(int a, int b) { int jieguo = a / b; System.out.println(jieguo); return a / b; } }

2024/12/1
articleCard.readMore

Java方法的基本使用

方法是什么 方法是一种语法结构,它可以把代码封装成一段功能,以便重复调用。 方法的完整格式: 例子:数字求和 public static int sum(int a,int b){ int c = a + b; return c; } 方法的调用: int rs= sum(10,20); 方法使用的注意点: 方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。 形参列表可以有多个,甚至可没有;如果有多个形参,必须用英文逗号隔开,且不能给初始化值 使用方法的好处 提高代码的复用性,提高了开发效率 让程序逻辑性更清晰 方法的其他定义形式 public static void printHelloWorld(int n) { for (int i = 1; i <=n; i++) { System.out.println("Hello World"); } } //打印三行helloworld(使用方法) 如果方法不需要返回数据,返回类型必须申明成void此时方法内部可以不使用return返回数据。 方法如果不需要接收数据,则不需要定义形参,调用方法时也不可以传数据给方法了。 没有参数,且没有返回类型(void)申明的方法,称为无参数、无返回值的方法

2024/11/29
articleCard.readMore

网站迁移

原网站 yingyu5658.github.io 将会迁移到这里。我会把有价值的文章转过来 原因仅仅是gmeek有点太简陋了,虽然typecho也差不多,不过他可以折腾一下主题之类的,并且我每个月还多花出去九十大洋。但是总比gmeek逼格高点吧。 不得不说,Linux绝对是世界上最麻烦的玩意,解压下载文件都费劲。要不是Windows资源占用多我绝对不会去用这玩意。 这次可是孤军奋战,背后没有github服务器的靠山了。要是忘了续费服务器我会丢失所有的文章,又是一个负担和一个纠结的点 2025.8.24二编:Gmeek简直太符合博客的定位了,不花里胡哨,完全够用,有网就能写文章…… Linux太好用了,目前Debian12养老中。 回看以前的自己实在是蠢。

2024/11/22
articleCard.readMore

我的4k进步史

截止到目前玩4k也有一年多了,整理一下我的进步历程,给迷茫中的各位一点参考 常规段 2023.5.20 一个别人在和女人亲亲抱抱的日子,我孤身一人在玩4k并且pass掉0dan,开启了漫长的4k之路…… 2023.6.4 Regular 1 pass 2023.6.22 Regular 2 pass 2023.6.25 Regular 3 pass 2023.7.26 Regular 4 pass 2023.8.22 Regular 5 pass 2023.11.24 Regular 6 pass 2023.11.24 Regular 7 pass 2023.11.27 Regular 8 pass 2023.11.28 Regular 9 pass 2023.11.28 Regular 10pass 常规段毕业!!! Extra与字母段 2023.12.02 Extra-2 Jack pass(神秘4k常数9638) 貌似淡坑了一段时间…….. 2024.9.15 α Jack 96.21 (Ma侧c判与om的od9天差地别,故不写pass,成绩仅供参考。后文中不予注释) 2024.9.22 Extra-4 Jack pass (v2) 2024.9.22 Extra-5 Jack pass (Sample) 2024.9.28 Extra-3 Jack pass 2024.9.30 β Jack 96.29 2024.10.7 Extra-2 pass 2024.10.14 Extra-3 Stream pass(v2) 2024.10.19 Extra-4 Technical pass(v2) 这玩意其实就是叠,要不我也过不掉 2024.10.19 γ Jack 96.33 2024.11.18 Extra-5 Jack pass(v3) 我认为此时叠力才算真正e5 未完待续…….

2024/11/13
articleCard.readMore

记录Typecho博客转移到Hexo

前言 折腾来折腾去,最后发现归宿还是静态博客,安全性高、性能开销小,用Github直接省去服务器费用还差不多永生。每年把域名钱交了就得了,图片的问题再想想办法,总能解决的。 突然有一种为了躲避战乱带着一家人四处奔波的悲凉感 分析 博客网站的内容,都可以拆分为以下几个点: 文章 评论 文章插图 网站贴图资源 先从最主要的文章开始,想想有没有什么可以用的。 gitee上有一个插件,看起来好像有点用,折腾安装一下试试先。 Tp2MD插件迁移文章 远程登录服务器,把本地下号的zip传到服务器上并解压。 cd到插件目录 /usr/share/nginx/html/usr/plugins 解压压缩包 unzip Typecho-Plugin-Tp2MD-master.zip 重命名为插件的自述文件要求的名称 mv Typecho-Plugin-Tp2MD-master Tp2MD 登录网站后台,启用插件。点击插件的设置,保存后按照教程访问。 这里提示不能写入文件,请检查 cache 文件夹权限!,我们在插件目录设置一下权限 sudo chmod -R 777 cachea 注意是这个插件目录下的cache!! 提示导出成功,cd到这个目录,把文件压缩下载下来查看 可能是因为我有的文章点了多篇分类,导出文件夹有点问题,无所谓,后期再调,拿到了就行。至此,文章部分搞定! 评论 评论这里,我折腾了两天,尝试尽了各种方案(Disqus Valine Waline Utterances Twikoo Atalk),最后还是选择了Giscus。我也知道这样读者没有github就没办法发评论,但是其他几种方案都会出现各种奇奇怪怪且无法解决的问题比如Cloudflare拦截、CORS出毛病、服务器被墙以及莫名其妙404、403。我真的尽力了。 文章插图 转移图片文件 进入/usr/uploads/,压缩下载图片 重组Hexo图片目录:复制所有图片到Hexo的source/images/目录。 手动替换图片路径 ,注意,静态资源解析默认以source为根目录,所以直接写以source为根目录的绝对路径就行。 部署到vercel加速访问 注册vercel账号 创建项目,关联仓库 域名解析 2025.3.3,博客全部迁移完毕,粗略累计用时六天,一直没什么时间搞,耗时最长的还是在评论系统上的试错。

2024/3/3
articleCard.readMore

归档

2001/1/1
articleCard.readMore

搜索

2001/1/1
articleCard.readMore