{
    "version": "https://jsonfeed.org/version/1",
    "title": "NBlog",
    "home_page_url": "https://blog.nocp.space",
    "feed_url": "https://nocp.space/rss/feed.json",
    "description": "由一条咸鱼搭建的博客",
    "author": {
        "name": "Norcleeh",
        "url": "https://nocp.space"
    },
    "items": [
        {
            "id": "https://nocp.space/blog/my_2025",
            "content_html": "\n\n又到了一年的年末，回看这一年，我过得忙碌、变化而充实。\n\n## 高考\n\n2025是我人生中的一个重要节点，因为就在今年的6月，我参加了高考。从1月份开始，就是各种大大小小的考试，模拟考、联考、市质检、省质检...早上6:30醒来，7:00出门，到晚上10:20到家，11:00睡觉，每天循环往复，在不断的复习、刷题、再复习的间隙中，用睡觉和发呆填满一整天。在学习之余，我也在观察班里的其他同学。有许多人在1月份时还贪玩，但到了3月、4月，基本都收心认真读书了；到了5月，即使是坐后排天天打球的男生，也开始静下心翻课本了。\n\n在这样重复、机械式的学习和生活中，一种空虚感就从心里生出。那段时间里，我常常因为这种空虚感思考生活和人生的意义，又在偶然间听到了Neutral Milk Hotel的专辑《In the Aeroplane Over the Sea》，在那些嘶哑的歌词和不羁的配曲中，任凭各种情感在内心中撞击。那段时间是我高考复习时最痛苦的时间了，在一次次麻木的刷题和复习中，尽管我还有对未来的想象和对理想的追求，但是仍然感到迷失了存在的意义。\n\n高三最后的那段时间，我开始意识到我即将跟身边熟悉的同学告别：不知道哪一次会是最后一次和同学在体育课打羽毛球；不知道哪一次会是最后一次见到曾经同寝室的双胞胎；不知道哪一次会是最后一次坐在自己的课桌上复习......许多的“最后一次”就要随着高考一起到来了，我并没有感到非常难过和不舍，但我会在未来感到怀念，正是这些“最后一次”的事情共同拼凑出了我的高中生活。\n\n**2025，我的上半年，是忙碌的。**\n\n## 高考之后\n\n高考后的第二天，我和其他几个有意向上毕业典礼表演的同学立刻开始了紧锣密鼓的排练，毕业演出很成功，但因为我需要去参加自主招生的考试，而没能在参加完整场典礼，许多我希望留下合影的同学也因此错失了机会。不过，在对高中生活的告别之余，更多的是对暑假到来的激动与对未来的憧憬。在这个暑假，我终于开始了我早已规划好的项目，也就是OPanel管理面板[^1]。\n\n同时，我也和家人一同开启了一趟毕业旅行，来南京参观了玄武湖、鸡鸣寺、总统府、六朝博物馆、江苏美术馆，还去了1701 Music Bar和热河路，总体来说，南京是一个充满了文化底蕴的城市，有很浓厚的文艺气息。在离开南京的时候，我以为这是我第一次，也将会是最后一次来南京，但那时的我还不知道，未来我将会在南京度过我的大学四年。\n\n这个暑假，一头是高中，一头是大学；**2025，我的生活从此发生了变化...**\n\n## 大学\n\n在上大学之前，我以为上课的内容将会变成我感兴趣的东西，但去了之后才知道，大学的课程里充斥的各种没用的课程和水课。我加入了一个科创类社团，在里面认识了许多学长学姐，通过他们，我了解到了计算机就业市场的情况，对职业规划也有了自己的想法。同时，在和学长学姐的接触下，我也逐渐转变了对大学的看法，学会了翘课，然后利用这些时间，学习自己真正喜欢和有用的知识，做自己想做的项目和事情。偶尔，我会背上我的琴，去排练室和自己唱几首歌，玩几首新学的曲子，研究几个不一样的和弦，扒几首简单的谱子。闲暇的时候，和朋友在自己搭建的Minecraft服务器里面打打闹闹。这样的日子一直到现在。我想，这或许就是我要的大学生活了吧！\n\n我的大学生活才刚刚开始；**2025，我的下半年，是充实的。**\n\n---\n\n上半年，我的高中生活忙碌，而迷茫；下半年，我的大学生活悠闲，但充实。2025年，我做了很多事情，我的生活也在这一年发生了很大的变化，两种完全不一样的生活就这样在一年内接上了轨。\n\n仔细想来，一直以为没过多久的2015也早已是10年以前，“逝者如斯夫”！期待2026年是更加不一样的一年，希望我能在往后的日子里珍惜当下，过好每一天。\n\n[^1]: [OPanel: 较大型开源个人项目初尝试](/blog/first_try_on_large_opensource_project)\n",
            "url": "https://nocp.space/blog/my_2025",
            "title": "我的2025",
            "summary": "2025 年终个人回顾 - 我忙碌、变化、充实的一年",
            "date_modified": "2025-12-25T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/a_student_proved_riemann_hypothesis",
            "content_html": "\n\n那天，我像往常一样，点开B站打算消磨一下时间。首页刷新后，我看到了一个视频：[关于黎曼猜想的严格证明](https://bilibili.com/video/BV1t6HMzCEU1)。由于最近我经常刷到诸如“粒子力学杨建磊[^1]”或“张祥前[^2]”之类的民科视频，我于是以为这条黎曼猜想证明的视频也是那种年过半百的民科老登做出来的。但我还是想看看他到底在证明什么东西，在好奇心的驱使下，我还是点开了视频。\n\n视频里展示了一份用 $\\LaTeX$ 制作的论文，论文是用英文写的，上面记满了各种晦涩的公式，我感觉这样的东西似乎不太符合我之前的猜测，难道这次不是民科，是真的？但黎曼猜想这种数学领域的顶尖难题的成果，怎么可能会像这样被随意发表在B站上，而不是出现在顶级论文期刊呢？\n\n点开这位网友的B站主页，我才开始大致地了解了这个人。他的网名取自他的真名，叫做[臻_果](https://space.bilibili.com/584494809)。他是24年的应届高考生，但高考失利让他选择了居家复读。在复习期间，他持之以恒地在B站发布了一百多条记录学习的视频，一直到今年的3月份，2025年高考前他没有再发布过任何视频和动态。7月6号，他把他2025年复读高考的成绩发在了动态[^3]，看动态的内容，他在高考前就决定走“科研”的路线，并开始了证明黎曼猜想的尝试，然而他387的高考总分却与“科研”的字眼形成了鲜明的反差。就这样一直到10月份他发布了一个证明黎曼猜想的视频。按他的话来说，这“不是高考数学73的人证明了黎曼猜想，而是高考前研究黎曼猜想的人的高考73分”[^4]。\n\n## 压力、迷茫与不解\n\n想到他居家复读时可能的精神状态，想到他居家复读半路选择研究黎曼猜想，我开始联想到我自己高考复习时的经历。高三阶段的复习无疑是充满压力的。早上7:00出门，晚上10:20回家，如此循环往复，从24年的8月一直到25年的6月，如此的压力下，即使对未来充满想象和想法，也不可避免地陷入迷茫之中：我不知道我接下来应该复习什么，我不知道继续复习还有什么意义，我不知道我最后会去哪所大学...在这样的压力与迷茫下，我也曾有过对现行高考制度的不解与不满，但我很清楚，作为学生，我当下能做的只能是先跨过高考这道关。\n\n而这位网友已经经历过一次高考失利，而居家复习也困难重重，这样的处境的压力无疑是更加巨大的。面对高考的失败与居家复习的否定，他急需一种途径来寻求价值与肯定。也许在他的心中藏着这样的一种叙事：我是一个理科方面的人才，但囿于高考，我的才华无处施展；所以我不是做题家，我要不同于他人，我不高考，毕竟高考不是唯一的出路。然而回到现实，他做出的这样的选择显然不能让他真正成为他心中的科研学者。\n\n## 思考哲学？\n\n在他的B站动态和他动态的评论区中，我还发现他是一个对思考哲学抱有极大热情的人，这也让我想起了我在高三最后几个月的精神状态。在这之前，我的人生路线一直都是线性的：幼儿园、小学、初中、高中，而到了高中的最后阶段，我开始发现，眼前的路不再像以前那样，而是充满不确定性：我不知道我未来会做什么，我可能会去外地学习和工作，我会选择读研还是就业...于是，我陷入了对存在的意义与价值的不解与无限思考中，进而开始思考哲学和人生。回到他的动态，看着他画的思维导图[^5]，上面写满了“存在主义”“人生意义”“自我价值”之类的词，**显然，他正在陷入与那时的我相似的思考。**\n\n## 结语\n\n他说“如果我认为种田有意义，我就回去种田。如果我认为科研比应试教育有意义，我就可以不复习高考内容，直接去自学大学知识做科研”；他说，选择“科研”这条路“只是我早就不想走高考了，并非是高考失利的所谓‘创伤’”；他说，“有人一个字也写不出却还要在网上找优越感和诡辩，以证明自己经历苦难换来的学历仍有价值”...从高考失利到居家复读，从思考价值与意义到选择“科研”，他已经在自己构建的叙事中迷失了自我，而我从他心理的倒影中也仿佛看到了那时我的内心。\n\n诚然，他的故事充满了荒诞色彩，但他只是一个偏执的、在高考体制下由于重压而产生认知偏差的可怜人，对他的嘲讽、谩骂不管是对他还是对自己都是毫无意义的。\n\n[^1]: [咕咚物理 Bilibili主页 - 粒子力学杨建磊](https://space.bilibili.com/3494351753710407)\n[^2]: [张祥前 Bilibili主页](https://space.bilibili.com/526128616)\n[^3]: [Bilibili 臻_果的动态 - 后续走科研路线](https://bilibili.com/opus/1086511711011209218)\n[^4]: [Bilibili 臻_果的动态 - 矛盾又自洽的人](https://bilibili.com/opus/1127883086561804327)\n[^5]: [Bilibili 臻_果的动态 - 国家兴亡，匹夫有责。](https://bilibili.com/opus/1108113687106813958)\n",
            "url": "https://nocp.space/blog/a_student_proved_riemann_hypothesis",
            "title": "一位高考数学73的学生证明了黎曼猜想",
            "summary": "那天我在B站上偶然刷到一位网友对黎曼猜想的证明，点开他的主页却引发了我的思考，他为什么会变成这样呢？",
            "date_modified": "2025-10-30T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/summer_17",
            "content_html": "\n\n<div align=\"center\">\n\n<audio src=\"/static/media/summer-68.mp3\" controls></audio>\n\n<br>\n\n<span class=\"text-muted-foreground\">Pink Floyd - Summer '68</span>\n\n</div>\n\n昨天晚上，朋友发给我一张图，看到这张图的一瞬间，我的思绪就被它带回了2017年的那个遥远的夏天。\n\n![昨天晚上，朋友发给我一张图](/static/blog/summer17-1.png)\n\n泉州的夏天总是闷热的，走在路上，你能感受到地上升腾起来的热气，热气中混着植物、石头和尾气的味道。一连几天没有台风的晴天就是我最喜爱的夏天的天气。\n\n那个夏天很普通，也很特别。那是我四年级升五年级的暑假，放假在家，待在自己的房间里，房间内有空调的荫蔽，窗外是热腾腾的晴天。站在窗边，手摸上窗玻璃，就可以感受到窗外的温度。热气无处可涌入，只能一点点渗进玻璃，再从我的指尖渗入我的身体。看着窗外稀少的几辆被热得喘着粗气的车路过，我能感受到：这就是最正宗的暑假，这就是最正宗的夏天！\n\n午后的阳光进入我的房间，热量却被空调的凉爽抵消。我趴在床上，迫不及待地掏出手机，打开多玩盒子[^1]，在地图商城中看着预览图挑一个看起来最好玩的地图，然后下载、启动游戏...就这样，一个下午可以很漫长但很快乐地度过，一直到我妈下班回家。爱蛋卷[^2]是另一个只能留存在记忆中的APP。这是一个中小学生发帖、交友、聊天的平台，这样一个完全免费而自由的平台成了我社交的主要媒介，但它的免费和自由也为后来的停服埋下了伏笔。那个夏天很普通，也很特别：那是一个同虚拟世界中的朋友一起度过的，探索Minecraft的，享受空调和幻想的夏日。\n\n那时候，我和我的青梅竹马还是同班同学，住在同一个小区，经常能见面。坐在她家的沙发上，轻风从一旁的阳台吹入，即使不开空调也凉爽怡人。在她的房间里和她一起写完作业之后，她会和我分享她在学校的见闻和新鲜事。我坐在一旁听她滔滔不绝，虽然我对她口中的故事没那么感兴趣，但她的声音、微笑，仍是这个夏日不可或缺的一抹色彩。那个夏天很普通，也很特别：那时的我一定想象不到，在未来的时光中，我会与她渐行渐远，互相成为各自生命中的一位普通的过客。\n\n那时的B站，10492[^3]和10388[^4]还没下架，比利·海灵顿[^5]还没遭遇车祸，评论区的网友们一向友好，弹幕时常飘过一长串的2333...那个夏天很普通，也很特别：第一次进入B站的我一定不知道，在这几年的时间内，B站会成为一个充斥着各色人群的疯狂的地方。\n\n为什么是2017？也许2017并不是一个具体的年份。如今的我，无论在时间还是空间，都与2017年夏天的那个午后离得无比遥远，我无法回到过去，只能看着史蒂夫在麦田里背靠着钻石矿，想象那个坐在床上启动Minecraft的自己。\n\n[^1]: [多玩我的世界盒子](https://baike.baidu.com/item/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C%E7%9B%92%E5%AD%90/18280876)\n[^2]: [爱蛋卷 - 小学生专属的聊天交友软件](https://shouyou.3dmgame.com/android/24123.html)\n[^3]: [AV10492 - 巨猎奇..创价学会猎奇合辑](https://airmoto.fandom.com/zh/wiki/AV10492)\n[^4]: [AV10388 - 武器A](https://airmoto.fandom.com/zh/wiki/AV10388)\n[^5]: [William Glen Harold \"Billy\" Herrington (1969-2018)](https://zh.wikipedia.org/wiki/%E6%AF%94%E5%88%A9%C2%B7%E6%B5%B7%E7%81%B5%E9%A1%BF)\n",
            "url": "https://nocp.space/blog/summer_17",
            "title": "2017 夏",
            "summary": "与朋友聊到一些过去的事，突然开始怀念起那个遥远的夏天...",
            "date_modified": "2025-10-17T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/first_try_on_large_opensource_project",
            "content_html": "\n\n高考之前，我就开始计划暑假要做的项目了。当时是计划做一个小游戏服务器，但奈何项目的饼画得太大，看着满满的计划表，我无力实施，因此，在暑假刚开始时就放弃了这个想法。然而人总是闲不住的，因此我还是把废案中的其中一项单独拉出来做一个项目，这就是OPanel的来历。\n\n经过了两个月的开发，我基本把计划的功能做好了，而且适配了Bukkit、Fabric、Forge的1.21.x。看着日渐庞大的项目仓库，我萌生了一个做开源社区项目的想法，于是我叫来我的老友Deed，让他帮忙设计了一个Logo，然后在暑假的最后几天，我录制了一个宣传片，发到了B站。从发布视频的那一天开始，OPanel的流量就一直保持增长，仓库的star数也在不断增加————我第一次得到了自己的项目被关注的感觉。\n\n## 项目结构的设计\n\n### 多模块结构\n\nOPanel作为一个服务器管理面板，势必要同时支持多个平台多个版本，不能只专做一个服务端平台，而且还需要考虑前端网页的部分，因此项目的结构设计至关重要。我并不认为目前的设计就是最优解，但我觉得目前的设计确实是当下较为合适的选择了。\n\n然而我以前并没有做过类似的多平台多版本Minecraft插件项目，因此我一开始就去借鉴了网页地图插件[dynmap](https://github.com/webbukkit/dynmap)的项目结构设计。\n\nOPanel使用Gradle来管理项目，并且利用了项目子模块的特性来管理不同平台不同版本的实现代码。这样的设计下，项目被分为一堆模块，其中，core模块存放了网页面板的后端API和供其他模块实现的接口；而其他模块存放的是不同版本的具体实现代码，它们全部依赖于core模块，实现了core模块的接口，以供core模块对不同服务端进行统一的调用和操作。每一个模块都有自己的`build.gradle`，因此每一个模块都可以单独构建出插件 / 模组jar包。\n\n### 面板前端\n\n由于我希望把OPanel做成一体式开箱即用的插件，所以我必须将前端网页打进jar包，那么前端网页就不能使用SSR，而只能使用SSG。OPanel的前端使用next.js作为开发框架，但并没有用到任何SSR功能，而且每次修改完前端都必须执行一次`npm run build`，将前端打包成静态网页文件，并放入java resources文件夹。\n\n## 个人感受\n\n毕竟是第一次做这样的开源项目、第一次组建和带领开发组（虽然没几个人）、第一次受到这么多关注，激动和开心之余，当然也有紧张与压力。步入大学，平衡生活、学习与项目，并且让项目保持正向发展，这也是对我各方面能力的一种磨砺与考验。当然，OPanel也让我认识了很多服主，服主们反馈了很多bug，提了很多建议，也只有他们才能帮我测出那些实际环境才可能产生的bug。\n\n总之，这个项目对我意义重大，是我的第一次较大型开源项目的实践。\n",
            "url": "https://nocp.space/blog/first_try_on_large_opensource_project",
            "title": "OPanel: 较大型开源个人项目初尝试",
            "summary": "OPanel这个项目对我来说意义重大，它是我的第一个较大型开源个人项目",
            "date_modified": "2025-09-30T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/blog_update_6",
            "content_html": "\n\n为了使博客内容符合相关规范[^1]，我在博客中加入了AI生成内容的标识，用于标记博客中包含AI生成内容的文章。本文无AI生成内容，仅用于测试该标识。\n\n[^1]: [9月1日起，AI生成合成内容必须添加标识](https://wap.miit.gov.cn/xwfb/mtbd/wzbd/art/2025/art_5e46c60f9a7141cdb584eb139f476ce9.html)\n",
            "url": "https://nocp.space/blog/blog_update_6",
            "title": "[博客更新] 博客添加AI生成内容标识",
            "summary": "博客现已加入AI生成内容标识，用于对博客中包含AI生成内容的文章进行标记。",
            "date_modified": "2025-09-03T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/why_mc_is_becoming_dull",
            "content_html": "\n\n自从2017年入坑Minecraft后，我就一直是一个忠实的Minecraft粉丝。在我刚入坑这款游戏时，我可以不吃不喝一直玩下去。然而在这几年间，我对这款游戏的热情似乎一直在消退，似乎再也无法提起刚入坑时的那种兴趣来游玩。倒不是说我不喜欢Minecraft了，而是一种想玩却不知道玩什么，又觉得什么都没意思的感觉。\n\n## Minecraft与我的历史\n\n想到现在这种索然无味的感觉，就不禁让我回想起以前与这款游戏度过的时光。\n\n### 刚入坑时的我\n\n![Minecraft PE 1.1启动界面](/static/blog/mc-me-history-1.jpg)\n\n那时的基岩版还叫PE版（多么熟悉而陌生的称呼啊）。我记得刚入坑的时候，PE的最新版本是1.1，那是我游玩的第一个版本：没有彩色玻璃，没有旗帜，没有多彩的水下世界，没有蜜蜂，下界还是很单一，地形限高还是256。就是这么一个版本，我玩得不亦乐乎。我好奇地挖泥土、挖石头、找村庄、找林地府邸，探索世界，之后就是在多玩盒子app里面找联机房间玩多人模式————一切都是那么新鲜，一切都是那么好玩。\n\n我还记得我入坑后的第一个更新让我有多激动。先是在盒子的论坛里看到1.2更新的消息，看到了很多我没有玩过的内容：彩色玻璃、旗帜、烟花、鹦鹉、盔甲架...几个月后终于拿到最新版，我就上手试了所有的新方块，虽然存档已经无处寻找，但记忆永存。\n\n![Underwater City - Lumina Nocturnale](/static/blog/mc-me-history-2.png)\n\n我入坑的时候玩的是多玩启动的盗版Minecraft，但是里面的各种地图和联机房间我都有体验过，最令我印象深刻的是其中一张叫做[Lumina Nocturnale](https://planetminecraft.com/project/underwater-city-lumina-nocturnale-/)的水下城市地图（应该是有人从国外的论坛把这张图搬到了多玩）还有一张水上别墅地图（这张地图已经找不到了）。多玩给我留下了许多最初的回忆，不过在这之后不久，网易中国版就发布了。\n\n### 网易中国版时代\n\n之前的那些盗版Minecraft都会被注入一些广告，在这里面就有网易代理中国版的广告。出于好奇，也因为网易版我的世界不算盗版，我就去应用商店下载下来试了一下。\n\n![网易中国版公测的主页](/static/blog/mc-me-history-3.jpg)\n\n也就是在我玩中国版的这段时间，Mojang推出了海洋更新和村庄更新。海洋更新后新的海底生态色彩更丰富，三叉戟也很好玩，再加上我当时经常看白一Whiteyee[^1]的原味生存视频（这个UP主退站后把以前的Minecraft视频全部删除了），当时只能玩手机版的我对java版1.13海洋里的画面很是向往，因此我对这个版本印象很深刻。\n\n网易中国版也让我第一次玩到了服务器和服务器里面的各种小游戏。我最开始玩的是花雨庭，虽然这个服务器后来被诟病外挂太多、毫无游玩体验，但它最开始的时候还是很不错的，即使是小游戏玩到没得玩，我也会逛逛主城的地图。后来，在同学的推荐下，我加入了EaseCation服务器，我对这个服务器的印象挺好的，这也是我游玩时间相对比较长的一个小游戏服务器，里面的各种玩法我都玩过：起床战争、空岛战争、战桥、趣味小游戏...甚至在后来我还加入了服务器志愿者，当了个临时Helper来抓外挂。在我退坑网易版后就再也没碰过这个服务器了，不知道现在它现在是什么样子。\n\n![七宗罪RPG服务器 主城](/static/blog/mc-me-history-4.png)\n\n当然，网易中国版还有一个不得不提到的功能：租赁服务器。租赁服是需要花钱的，所以我并没有创建服务器，而是在大厅里随便逛，发现有意思的就进去看两眼。我偶然发现了一个叫“七宗罪”的RPG服务器，进去之后直接沉迷其中，无法自拔。游玩了一段时间后，我甚至自发为这个服务器拍了个“宣传片”[^2]。这个服务器的服主id叫adddddf，他拉了个QQ群，群里都是我们这些常来玩的玩家。他很擅长玩命令方块，在他的影响下，我也开始研究命令方块的玩法。学有所成之后，我甚至在B站发了一系列指令计分板的教程。\n\n与此同时，我也开始看阿神[^3]的视频。每日一更让我每天都期待着新视频的内容，也从阿神的视频里认识了很多台湾的Youtuber：羽毛[^4]、小光[^5]、路[^6]、筱瑀[^7]、鬼鬼[^8]、巧克力[^9]、阿谦[^10]、舞秋风[^11]...当然，从现在来看，~~我甚至觉得他们的视频有点幼稚~~。\n\n### 转战国际版\n\n随着网易中国版的发展，这个游戏的体积越来越大、越来越臃肿，更糟糕的是，央视新闻将网易联机房间里的种种乱象报道出来，网易开始一刀切，进行各种敏感词屏蔽。由于不堪网易的各种操作以及防沉迷的种种限制，我便果断卸载了网易中国版，开启了我的国际版时代。\n\n我的某个QQ群里有人拿到了Minecraft基岩版的正版兑换码，愿意以15块的低价出售，我就立刻购买了兑换码，拿到了基岩正版。正版和盗版最大的不同就是它可以加入服务器，和别人一起游玩。不过，有什么服务器呢？于是我在B站搜索了一下“国际基岩版服务器”，这就搜到了HYCDGX服务器。\n\n![HYCDGX服务器 主城](/static/blog/mc-me-history-5.png)\n\n这是一个历史悠久的服务器，在当时每天同时在线的人数能有6、7个。我在这里认识了很多人，和一位玩家合作经营了一座基地，通过刷物品bug造了一座“钻石塔”。也就是在这段时间，我入手了Java正版，后来服主也把服务器弄成了基岩Java通用服。我和另一个玩家一起为服务器写了一个“第三方官网”，不过后来没有再继续维护，这个项目就废弃了[^12]。之后，我在服务器里建造了环服快速通道，连接了很多玩家的基地，让别人可以坐矿车环游主世界。\n\n再后来，服务器开了新坑，我在新存档里找到了一片风水宝地（一块有繁花草地的盆地），在那里和我的同学建了一个基地，取名为“Peace Land”。同时，我重新为服务器写了一个官网，并且还让服主为网站解析了一个二级域名，这下成为了真正意义上的“官方网站”。网站目前还在，但可能需要挂梯子才能访问[^13]。\n\n![HYCDGX服务器 Peace Land](/static/blog/mc-me-history-6.png)\n\n由于拿到了Java正版，所以我也想去体验一下Hypixel，于是我又买了几个月的Hypixel加速节点。我当时沉迷于Hypixel Skyblock，这样的开放世界的玩法对当时的我有巨大的吸引力。我投入了巨大的时间肝物品、肝等级、肝各种东西。不过，在我发展到了游戏内百万富翁的级别后，这个游戏也开始黯然失色，没什么意思了。\n\n### 在此之后\n\n在这之后就是开头所提到的样子了。Minecraft似乎已经玩到没什么可玩的了，什么都失去了以前的那种感觉，看什么都觉得没什么意思。尽管1.19、1.20、1.21加入了很多新内容，但是我似乎已经完全无法提起兴趣去探索这些内容了。\n\n## 为什么会变成这样呢？\n\n![How did we get here?](/static/blog/mc-me-history-7.png)\n\nMinecraft有越来越多东西可以玩了：远古城市、试炼密室、樱花树、红树林、骆驼...如果说，我觉得Minecraft变无聊是因为那些内容玩腻了，那为什么这些新内容也无法提起我的兴趣？**究其原因，我认为这和Mojang推出的更新，以及我自身都有关系。**\n\n### Mojang推出的更新\n\n我记得，在1.16发布的时候，看到下界完全不一样的一番景象，我的心情和以前PE版1.2更新是一样的，而社区对这个版本的风评也是非常良好。因此，在1.17和1.18更新的时候，我对它的期待也和1.16一样，但看到成品后，这样的期待很快就被打破了：无非就是矿洞变得更大了，山变得更高了，矿石的贴图变了，新加了个水晶洞和没什么用的铜矿。1.17最令我印象深刻的可能就只有繁茂洞穴了，但这样的洞穴除了好看，也没什么实际用处。\n\n在最近的1.20和1.21中，我有一种感觉，就是Minecraft变得越来越不像Minecraft了。当我看到那些不一样的刷怪蛋贴图以及各种各样像装了模组一样的花草，就有种Minecraft不再原汁原味的感觉，即使这些都是原版内容。这让我产生了强烈的陌生感。\n\n![不一样的刷怪蛋贴图、各种各样像装了模组一样的花草](/static/blog/mc-me-history-8.png)\n\n而且Mojang似乎希望让Minecraft变得更加贴近现实，他们加入了落叶、灌木丛等等细节，新物品的贴图也更加细腻，虽然更美观了，但是失去的却是那种纯粹感和那种粗糙的像素感。我认为，Minecraft风格的形成正是靠着这种粗糙的像素感达到的，而新版的细腻贴图却违背了这种风格。当然，现在的社区对Mojang推出的更新也有很多意见，听劝的Mojang也做出了许多改变。我只能寄希望于以后的Minecraft能有更多以前那种“纯粹”的东西了。\n\n### 自身原因\n\n我入坑Minecraft的时候还是小学生，当时是在同学的介绍下开始玩这款游戏。那时候对很多东西都不了解，是一个懵懵懂懂的状态，所以对什么东西都很好奇。比如，我会在单人存档中期待有别人加入游戏，或者是觉得游戏里的村民是真人在操控。再加上当时还流行Herobrine的传说，就让这个游戏的神秘意味大大增强。自然也就让我有更大的热情来探索Minecraft。\n\n![和同学一起完结的空岛生存](/static/blog/mc-me-history-9.png)\n\n而到了现在，我已经学习和了解了很多东西，对这些游戏里的事物也没有了以前的那种“神秘”滤镜：单人存档就是一个人的世界而已，游戏里的生物只不过都是一些没有感情的NPC，Herobrine只是个传说而已...如果不再好奇，那自然也就没什么动力去探索。而且，和朋友体验过了几次生存玩法后，也逐渐感觉这样的玩法没什么意思，玩到最后就是下界合金套、信标、鞘翅而已。虽说还有其他玩法（比如建筑、红石之类的），但也早已毫无动力或者觉得索然无味。\n\n## 尾声\n\nMinecraft对我来说是一款很特别的游戏，它陪伴了我的童年、我的成长，启发了我对编程的热爱，也让我交到了很多朋友。但随着时间的流逝，这样一款特别的游戏却在我眼中变得越来越无味。即使我仍然保持着热爱，但是却是想玩却不知道玩什么、有什么好玩。今天写这篇短文，就稍微记录一下我与这款游戏的故事，以及我对这种感受的想法。\n\n[^1]: [白一啾咪 Bilibili主页](https://space.bilibili.com/107712863)\n[^2]: [MC七宗罪 宣传片之主城](https://bilibili.com/video/BV1Rs41157kG)\n[^3]: [阿神 Youtube主页](https://youtube.com/@AshanKouki)\n[^4]: [羽毛 Youtube主页](https://youtube.com/@shygolone)\n[^5]: [【雙聲類】小光 Youtube主页](https://youtube.com/@qmeimei)\n[^6]: [路RuSiRu Youtube主页](https://youtube.com/@rusiru87)\n[^7]: [筱瑀Yui Youtube主页](https://youtube.com/@Hsiao_Yui)\n[^8]: [鬼鬼 Youtube主页](https://youtube.com/@Onityan)\n[^9]: [巧克力 Youtube主页](https://youtube.com/@oeurxhichocolate)\n[^10]: [阿謙 Youtube主页](https://youtube.com/@achienkouku)\n[^11]: [舞秋風 Youtube主页](https://youtube.com/@MrChesterccj)\n[^12]: [HYCDGX 第三方网站 Github仓库](https://github.com/Misaka-L/HYCDGX)\n[^13]: [HYCDGX 服务器](https://site.hycdgx.com)\n",
            "url": "https://nocp.space/blog/why_mc_is_becoming_dull",
            "title": "为什么我感觉Minecraft越来越无聊了？",
            "summary": "记录一下我与这款游戏的故事，以及我对这款游戏的一些思考",
            "date_modified": "2025-07-23T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/exploration_of_abc_notation",
            "content_html": "\n\n## 缘起\n\n我最近这段时间在自学吉他，自学之余也开始尝试扒谱，而扒出来的这些曲谱如果不用某种方式存下来似乎有些可惜。所以我决定在我的网站中新增一个“曲谱”页面，在这里记录和分享我所扒过的谱。\n\n不过，问题来了：**我应该用什么形式记下这些谱？又应该用什么方式将这些曲谱显示在网页中？**\n\n## abc.js 和 Abc Notation\n\n在网页中显示曲谱，这样的功能在开源社区肯定已经有人实现过了，我要做的不是大费周章重造轮子，而是找出这样的库。一番查找后，我找到了[abc.js](https://abcjs.net)。这是一个用于在网页中渲染Abc Notation的js库，这正好符合我的需求，但是所谓“Abc Notation”又是什么？\n\n于是我继续搜索，终于发现：[Abc Notation](https://abcnotation.com)其实是一种用来标记曲谱的语言。这正好可以用来记录我的曲谱，然后通过abc.js渲染在网页中。\n\n## 语法\n\n第一件事就是把谱用这门语言记下来，然而这样一门语言在互联网上似乎有点冷门，找不到太多教程。幸好我找到了这门语言的[标准文件](https://michaeleskin.com/abctools/abc_standard_v2.1.pdf)，在这份pdf中详细介绍了这门语言的各方面信息。当然，记谱还是需要一些基础的乐理知识的，在记谱之前，你可以先去了解一些乐理知识再开始。\n\n### 元数据（Metadata Fields）\n\nAbc Notation曲谱的文件后缀是`.abc`，在创建了文件之后，应该在开头写上这份曲谱的一些信息（或者叫元数据）。下面是Abc所支持的所有元数据（`%`用来标记注释，渲染时会忽略）。\n\n```abc\nX: 1 % 序号\nT: 送别 % 标题 1\nT: 旅愁 % 标题 2\nT: 梦见家和母亲 % 标题 3\nC: John Pond Ordway % 作曲家\nO: USA % 起源地\nM: 4/4 % 节拍\nL: 1/4 % 单位音符长度\nQ: 3/8=50 \"Slowly\" % bpm\nP: (AB)2 % 部分（即曲谱中各个部分的演奏顺序）\nZ: NriotHrreion <nriot233@gmail.com> % 记谱人（将原曲转录为Abc曲谱的人）\n% N: % 标注（此处用不到）\n% G: % 组别（此处用不到）\nH: 原曲《梦见家和母亲》是由美国音乐家John Pond Ordway所作，后传入日本，由犬童球渓改编歌词为《旅愁》，后李叔同将其改编为《送别》 % 历史（内容改自维基百科）\nK: G % 调号\n% R: % 韵律（此处用不到）\n% 其余还有B、D、F、S、I详见上面的标准文件\n```\n\n### 指令（Directives）\n\n指令是一种Abc Notation的进阶用法，此处不做介绍。\n\n```abc\n%%vocalfont Times-Roman 14 % 这是一种用于标记字体的指令\n```\n\n### 曲谱主体\n\nAbc Notation使用音名来标记音符，即“CDEFGAB”，下面是这些音名所对应的唱名：\n\n|音名|唱名|\n|---|---|\n|C|do (doh)|\n|D|re|\n|E|mi|\n|F|fa|\n|G|sol (so)|\n|A|la|\n|B|ti (si)|\n\n#### 小节\n\nAbc曲谱使用`|`来标记小节，在`M: 4/4`的情况下，一节有4拍，那么一个普通的C大调音阶就可以这么标记：\n\n```abc\nM: 4/4\nL: 1/4\nCDEF | GABc\n```\n\n#### 音高\n\nAbc曲谱中的大写`C`指的是中央C，如果需要标记音高，可以通过`,`、`'`和小写字母来标记，如：\n\n```abc\nC,, % 低十六度的C\nC, % 低八度的C\nc % 高八度的C\nC' % 高八度的C（等价于c）\nC'' % 高十六度的C（等价于c'）\nC,', % 低八度的C（等价于C,）\n% 以此类推...\n```\n\n#### 升降记号\n\n那么对于升降记号，可以使用`^`、`=`和`_`来标记。其中，`^`是升记号（♯），`=`是还原记号（♮），`_`是降记号（♭）。如：\n\n```abc\n^C % 升C\n_B % 降B\n```\n\n#### 音符长度\n\n在单位音符长度为四分音符（`L: 1/4`）的条件下，单独一个字母就指代一个四分音符，如果需要标记八分音符、十六分音符等等，则可以在字母后面加上`/`；如果需要标记二分音符或全音符，则可以在字母后面加上对应的数字，如：\n\n```abc\nL: 1/4\nC % 四分音符\nC/ % 八分音符（等价于C/2）\nC// % 十六分音符（等价于C/4）\nC2 % 二分音符\nC4 % 全音符\n```\n\n在单位音符长度是其他数值的情况下，也是一样的：\n\n```abc\nL: 1/8\nC % 八分音符\nC/ % 十六分音符（等价于C/2）\nC// % 三十二分音符（等价于C/4）\nC2 % 四分音符\nC4 % 二分音符\nC8 % 全音符\n```\n\n#### 切分音\n\n在Abc曲谱中，可以使用多种方法来标记切分音，下面三种表示方法均等价（示例来自标准文件）：\n\n```abc\nL: 1/16\na3b cd3 a2b2c2d2\n```\n\n```abc\nL: 1/8\na3/2b/2 c/2d3/2 abcd\n```\n\n```abc\nL: 1/8\na>b c<d abcd\n```\n\n#### 休止符\n\nAbc曲谱使用`z`和`Z`来标记休止符，这里可以把字母`z`和`Z`当作普通的音符来看，它们在音符长度的标记方式是一致的。`z`和`Z`的区别在于显示的方式不一样，其他都是一样的。如：\n\n```abc\nM: 4/4\nL: 1/4\nCDzE | FGz2 | AzBz | c2z2\n```\n\n#### 反复记号\n\nAbc曲谱使用`|:`、`:|`来标记某部分曲谱需要反复演奏，如：\n\n```abc\n|: CDEF | GABc :| % 反复演奏2次\n|:: CDEF | GABc ::| % 反复演奏3次\n% 以此类推...\n```\n\n如果需要标记多次反复结束段的曲谱，可以使用`|`和数字进行标记，如：\n\n```abc\n|: CDEF | GABc | cBAG |[1 FEDE :|[2 FEDC |]\n```\n\n其中，`|[1`是第一次反复的结束段，`|[2`是第二次反复的结束段，`|]`标记结束反复。\n\n上面的曲谱还等价于：\n\n```abc\n|: CDEF | GABc | cBAG |1 FEDE :|2 FEDC |]\n```\n\n#### 延音线 / 连音线\n\nAbc曲谱中使用`-`来标记延音线，使用`()`来标记连音线，如：\n\n```abc\nCD-DE | EF-FG | (GAB-B | c4)\n```\n\n连音线还可以嵌套，如：\n\n```abc\n(CDEF | (GA) B2)\n```\n\n#### 装饰音\n\nAbc曲谱中使用`{}`来标记装饰音，如：\n\n```abc\n{^C}C\n```\n\n#### 其他记号\n\nAbc曲谱还支持一些其他乐谱记号，如渐强、渐弱、颤音等等。这些记号使用感叹号`!!`来标记，下面是支持的部分记号：\n\n|记号|Abc记法|\n|---|---|\n|颤音|`!trill!`|\n|颤音（开始）|`!trill(!`|\n|颤音（结束）|`!trill)!`|\n|延长符|`!fermata!`|\n|上拨|`!upbow!`|\n|下拨|`!downbow!`|\n|极弱|`!pppp!`|\n|弱|`!p!`|\n|中弱|`!mp!`|\n|中强|`!mf!`|\n|强|`!f!`|\n|渐强（开始）|`!<(!`|\n|渐强（结束）|`!<)!`|\n|滑音|`!slide!`|\n|D.S.|`!D.S.!`|\n|D.C.|`!D.C.!`|\n\n#### 和弦\n\n如果你需要在曲谱中标记和弦，那么可以在对应的位置使用`\"\"`来标记，如：\n\n```abc\nL: 1/8\n\"C\" ED CD EE E2 | \"G\" DD ED \"C\" C4\n```\n\n#### 歌词\n\n如果你需要在曲谱中添加歌词，可以用`w:`在旋律的第二行标记歌词，如：\n\n```abc\nL: 1/8\n\"C\" ED CD EE E2 | \"G\" DD ED \"C\" C4\nw: 玛丽有只小羊羔 | 粉色羊毛\n```\n\n你也可以在歌词中间使用`_`和`-`等字符来标记每个字或词对应的音符。\n\n## 示例\n\n下面是我扒的谱之一，你可以在[曲谱](/sheets)页面找到这份谱子。为了作示例，我在前面加上了一些元数据信息。\n\n```abc\nX: 1\nT: 送别\nC: John Pond Ordway\nO: USA\nZ: abc-transcription NriotHrreion <nriot233@gmail.com>\nM: 4/4\nL: 1/8\nK: G\n| \"G\" !p! G,[DB]([DB]c)-c4 | G,[DB]([DB]c) -cg-g2 |\n|: \"G\" !mp! G,D BD \"C\" CE cE | \"C\" CE cE \"G\" B,D dG | \"G\" G,D (GA) \"Em\" E,E BG | \"D\" DA d(f e)d \"D7\" cA |\nw: 长 _ 亭 _ 外 | 古 _ 道 _ 边 | 芳 _ 草 _ 碧 _ 连 | 天\n| \"G\" [G,B]D GB \"C\" [Cc]E GE | \"C\" CE GE \"G\" B,D dG | \"D\" DA dA \"D7\" cA fA | \"G\" G,D GA BD (G/A/)B |\nw: 晚 _ 风 _ 拂 __ 柳 | 笛 _ 声 _ 残 | 夕 _ 阳 _ 山 _ 外 | 山\n| \"C\" !mf! CG cG eG cG | \"D\" DA dA \"G\" G,D dG | \"C\" CE cE \"G\" B,D dG | \"Am7\" A,E cG \"D\" DA (e/f/)d |\nw: 天 _ 之 _ 涯 | 地 _ 之 _ 角 | 知 _ 交 _ 半 _ 零 | 落\n| \"G\" G,D BD \"C\" CE cE | \"C\" CE cE \"G\" B,D dG | \"D\" DA dA \"D7\" cA fA |\nw: 一 _ 壶 _ 浊 __ 酒 | 尽 _ 余 _ 欢 | 今 _ 宵 _ 别 __ 梦\n|1 \"C\" CG cG eG cG | \"G\" G,G BG gG BG | \"Am7\" A,G cG \"D\" DA fA | \"G\" G,G BG gG BG |\nw: 寒\n| \"C\" CG cG eG cG | \"Bm7\" B,A dA fA dA | \"Am7\" A,G cG gG cG | \"D\" DA dA fA dA :|\n|2 \"G\" G,D (G/A/)B \"Am\" [A,c]E \"Bm\" [B,d]F | \"C\" CG eG \"Cm\" [C_e]c ge | \"D\" DA dA \"Em\" E,E BG |\nw: 寒 | 天 _ 之 _ 涯 | 地 _ 之 _ 角\n| \"C\" CG cG \"C#dim\" ^CG ^cG | \"D\" DA dA (e/f/)A dA  | \"G\" G,D BG \"C\" [Cc]E GE | \"C\" CE cG \"Cm\" [CGc_eg]4 |\nw: 知 _ 交 _ 半 _ 零 | 落 | 一 _ 壶 _ 浊 __ 酒 | 尽 _ 余 _ 欢\n| \"D\" DA dA \"D7\" cA fA | \"G\" !mp! G,D !>(! GD BD GD | \"Am\" A,E cA \"D\" DA !>)! fd !p! |\nw: 今 _ 宵 _ 别 __ 梦 | 寒 | 今 _ 宵 _ 别 |\n| \"Em9\" E,F !mp! Gd -dF GF | \"Gmaj7\" G,F Gd -dF Gd | \"Cadd9(#11)\" CF Gd -dF Gd | \"Dadd11\" DF G{d}e dG FB | \"G\" [G,B,DGBg]8 |]\nw: 梦寒\n```\n\n## 渲染\n\n前面提到，Abc Notation可以使用[abc.js](https://abcjs.net)在网页中进行渲染显示。详细用法介绍参见：<https://paulrosen.github.io/abcjs/>\n\n下面是这个库的基础用法：\n\n### Node.js环境\n\n1. 安装abc.js\n\n```cmd\nnpm i abcjs\n```\n\n2. 写一个`<div>`并为它加上一个id\n\n```html\n<div id=\"abc-sheet\"></div>\n```\n\n3. 通过`renderAbc()`方法渲染曲谱，第一个参数是你刚刚给`<div>`设置的id\n\n```js\nimport abcjs from \"abcjs\";\nabcjs.renderAbc(\"abc-sheet\", `\"C\" ED CD EE E2 | \"G\" DD ED \"C\" C4`， {\n  /* 这里可以设置一些其他的选项 */\n  /* 具体用法参见 https://paulrosen.github.io/abcjs/visual/render-abc-options.html */\n});\n```\n\n### 浏览器环境\n\n1. 引入abc.js\n\n```html\n<script defer src=\"https://cdn.jsdelivr.net/npm/abcjs@6.5.1/dist/abcjs-basic-min.js\"/>\n```\n\n2. 写一个`<div>`并为它加上一个id\n\n```html\n<div id=\"abc-sheet\"></div>\n```\n\n3. 通过`renderAbc()`方法渲染曲谱，第一个参数是你刚刚给`<div>`设置的id\n\n```js\nwindow.ABCJS.renderAbc(\"abc-sheet\", `\"C\" ED CD EE E2 | \"G\" DD ED \"C\" C4`， {\n  /* 这里可以设置一些其他的选项 */\n});\n```\n",
            "url": "https://nocp.space/blog/exploration_of_abc_notation",
            "title": "对Abc曲谱标记语言的探索",
            "summary": "Abc Notation是一种用于标记曲谱的语言，通过配合[abc.js](https://abcjs.net)可以将其渲染在网页中<br><i>Abc Music Standard 2.1: <https://michaeleskin.com/abctools/abc_standard_v2.1.pdf></i>",
            "date_modified": "2025-07-04T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/domain_migration",
            "content_html": "\n\n**本站旧域名`nin.red`即将完全弃用，此后域名`nin.red`下的所有内容与本站无关！**\n\n若有意向接手该域名，可尽快与我联系；若无人接手，域名将在今年八月份弃用。\n",
            "url": "https://nocp.space/blog/domain_migration",
            "title": "域名弃用公告",
            "summary": "本站旧域名`nin.red`即将完全弃用，此后域名`nin.red`下的所有内容与本站无关！",
            "date_modified": "2025-06-15T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/blog_update_5",
            "content_html": "\n\n上一版的网站是使用[Create React App](https://create-react-app.dev)进行构建的。前不久，在访问Create React App官网时，我发现这个脚手架已经被弃用了。考虑到网站加载速度慢，而且访问网站时，无论访问的是哪篇文章，网站都会加载所有文章，导致一些不必要的占用，因此，这几天我将网站从已弃用的CRA转移至next.js框架，顺便翻新了一下整个网站。\n\n## SSR\n\n服务侧渲染（Server Side Rendering，SSR）是解决网站加载速度慢与占用高的关键。在之前的版本中，网站加载时会将所有文章全部下载，而现在，服务端只会向浏览器发送所需要的文章，大大减少网站加载时间与占用。而且服务端渲染减少了部分客户端渲染的工作，也提高了网站性能。\n\n## 设计\n\n这次翻新沿用了旧版的部分布局与风格，采用了[Shadcn UI](https://ui.shadcn.com)的组件库，在提高开发效率的同时也使得网站更加美观。当然，我也在组件库的基础上进行了个性化的修改，使组件样式更符合网站整体的风格。\n",
            "url": "https://nocp.space/blog/blog_update_5",
            "title": "[博客更新] 转移至next.js，并重新设计整个网站",
            "summary": "网站现已从CRA转移至next.js框架，并进行了重新设计翻新",
            "date_modified": "2025-06-14T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/my_playlist",
            "content_html": "\n\n<table>\n<thead>\n<tr>\n    <th>歌手 / 艺术家</th>\n    <th>专辑</th>\n    <th>歌曲</th>\n</tr>\n</thead>\n<tbody><tr>\n    <td>陈升</td>\n    <td>\n        望乡\n        <br>他乡\n        <br>丽春\n        <br>末日遗绪\n        <br>七天\n        <br>无歌之歌\n        <br>流浪日记四部曲 (vol.4) 华人公寓\n        <br>南机场人\n        <br>归乡\n        <br>流浪日记二部曲 (vol.2) 家在北极村\n        <br>流浪日记首部曲 (vol.1) 丽江的春天\n        <br>这些人 那些人\n        <br>My Destiny\n        <br>思念人之屋\n        <br>鸦片玫瑰\n        <br>六月\n        <br>Summer\n        <br>恨情歌\n        <br>魔鬼的情诗 I\n        <br>别让我哭\n        <br>私奔\n        <br>放肆的情人\n        <br>拥挤的乐园\n    </td>\n    <td>\n        牡丹亭外\n        <br>汀州路的春天\n    </td>\n</tr>\n<tr>\n    <td>新宝岛康乐队</td>\n    <td>\n        大波浪\n        <br>剪剪花\n        <br>第狗张\n        <br>卫生纸 【7】\n        <br>新宝岛康乐队 第3辑\n        <br>新宝岛康乐队 第2辑\n        <br>新宝岛康乐队\n    </td>\n    <td></td>\n</tr>\n<tr>\n    <td>李志</td>\n    <td>\n        2024叁缺壹巡演 东京站现场\n        <br>爵士乐与不插电新编12首\n        <br>李志、电声与管弦乐\n        <br>李志北京不插电现场\n        <br>动静\n        <br>8\n        <br>看见\n        <br>i/O\n        <br>1701\n        <br>勾三搭四\n        <br>108个关键词\n        <br>F\n        <br>我爱南京\n        <br>你好，郑州\n        <br>这个世界会好吗\n        <br>被禁忌的游戏\n        <br>梵高先生\n    </td>\n    <td>\n        谁他妈没织过毛衣\n        <br>Radio 南京\n        <br>南京越来越远\n    </td>\n</tr>\n<tr>\n    <td>崔健</td>\n    <td>\n        新长征路上的摇滚\n        <br>解决\n        <br>红旗下的蛋\n    </td>\n    <td></td>\n</tr>\n<tr>\n    <td>窦唯</td>\n    <td>黑梦</td>\n    <td>雨吁</td>\n</tr>\n<tr>\n    <td>黑豹乐队</td>\n    <td>黑豹 同名专辑</td>\n    <td></td>\n</tr>\n<tr>\n    <td>张楚</td>\n    <td></td>\n    <td>\n        姐姐\n        <br>我想，我想\n        <br>社会主义好\n        <br>蚂蚁，蚂蚁\n        <br>上苍保佑吃完了饭的人民\n    </td>\n</tr>\n<tr>\n    <td>现代人</td>\n    <td></td>\n    <td>小鸟</td>\n</tr>\n<tr>\n    <td>唐朝乐队</td>\n    <td></td>\n    <td>国际歌</td>\n</tr>\n<tr>\n    <td>许巍</td>\n    <td>\n        在别处\n        <br>那一年\n    </td>\n    <td>\n        蓝莲花\n        <br>生活不止眼前的苟且\n        <br>曾经的你\n        <br>像风一样自由\n    </td>\n</tr>\n<tr>\n    <td>布衣乐队</td>\n    <td>\n        那么久\n        <br>喝不完的酒\n        <br>布衣\n        <br>秋天\n        <br>出发\n        <br>小怪兽\n        <br>八宝茶\n    </td>\n    <td>罗马表</td>\n</tr>\n<tr>\n    <td>宋东野</td>\n    <td>\n        安河桥北\n    </td>\n    <td>\n        空港曲\n        <br>郭源潮\n    </td>\n</tr>\n<tr>\n    <td>贰佰</td>\n    <td>\n        贰佰作品集\n        <br>嘿，抬头！\n    </td>\n    <td>绿洲琴行</td>\n</tr>\n<tr>\n    <td>崔跃文</td>\n    <td>崔跃文的Demo</td>\n    <td>绿洲琴行</td>\n</tr>\n<tr>\n    <td>谢春花</td>\n    <td>\n        算云烟\n        <br>知非\n    </td>\n    <td>这一天我什么都不想干</td>\n</tr>\n<tr>\n    <td>万能青年旅店</td>\n    <td>\n        万能青年旅店 同名专辑\n        <br>河北墨麒麟\n    </td>\n    <td></td>\n</tr>\n<tr>\n    <td>张玮玮</td>\n    <td></td>\n    <td>\n        米店\n        <br>李伯伯要当红军\n    </td>\n</tr>\n<tr>\n    <td>王宝 / 正午阳光</td>\n    <td>我又开始摇滚了</td>\n    <td>儿子，我是你爸爸 (Demo)</td>\n</tr>\n<tr>\n    <td>伍佰 / China Blue</td>\n    <td></td>\n    <td>\n        挪威的森林\n        <br>坚强的理由\n        <br>白鹭鸶\n        <br>世界第一等\n    </td>\n</tr>\n<tr>\n    <td>海龟先生</td>\n    <td>海龟先生 同名专辑</td>\n    <td>奇遇</td>\n</tr>\n<tr>\n    <td>丢火车</td>\n    <td></td>\n    <td>火车日记</td>\n</tr>\n<tr>\n    <td>新学校废物合唱团</td>\n    <td></td>\n    <td>再见琳尼尔</td>\n</tr>\n<tr>\n    <td>赵雷</td>\n    <td>\n        吉姆餐厅\n        <br>无法长大\n        <br>没有信号 (Live)\n    </td>\n    <td>\n        成都\n        <br>画\n    </td>\n</tr>\n<tr>\n    <td>罗大佑</td>\n    <td>\n        之乎者也\n        <br>二零二零八月宜花東鹿記\n    </td>\n    <td>\n        海上花\n        <br>皇后大道东\n    </td>\n</tr>\n<tr>\n    <td>郑智化</td>\n    <td></td>\n    <td>\n        水手\n        <br>伙伊去\n        <br>星星点灯\n        <br>游戏人间\n        <br>阿飞和他的那个女人\n        <br>面子问题\n    </td>\n</tr>\n<tr>\n    <td>金门王与李炳辉</td>\n    <td></td>\n    <td>流浪到淡水</td>\n</tr>\n<tr>\n    <td>邓丽君</td>\n    <td></td>\n    <td>\n        我只在乎你\n        <br>漫步人生路\n        <br>甜蜜蜜\n        <br>再见 我的爱人\n        <br>望春风\n    </td>\n</tr>\n<tr>\n    <td>刘若英</td>\n    <td></td>\n    <td>\n        后来\n        <br>为爱痴狂\n    </td>\n</tr>\n<tr>\n    <td>莫文蔚</td>\n    <td>I SAY</td>\n    <td></td>\n</tr>\n<tr>\n    <td>施文彬</td>\n    <td></td>\n    <td>\n        再会啦心爱的无缘的人\n        <br>谁是老大\n    </td>\n</tr>\n<tr>\n    <td>黄乙玲</td>\n    <td></td>\n    <td>一把小雨伞</td>\n</tr>\n<tr>\n    <td>臧天朔 / 1989乐队</td>\n    <td></td>\n    <td>再见 我的爱人</td>\n</tr>\n<tr>\n    <td>张震岳</td>\n    <td></td>\n    <td>再见</td>\n</tr>\n<tr>\n    <td>郑钧</td>\n    <td></td>\n    <td>私奔</td>\n</tr>\n<tr>\n    <td>小安</td>\n    <td>浪费爱情</td>\n    <td></td>\n</tr>\n<tr>\n    <td>赵传</td>\n    <td>黑暗的英雄</td>\n    <td></td>\n</tr>\n<tr>\n    <td>周杰伦</td>\n    <td>\n        最伟大的作品\n        <br>魔杰座\n        <br>11月的萧邦\n        <br>八度空间\n    </td>\n    <td>\n        床边故事\n        <br>告白气球\n        <br>牛仔很忙\n        <br>彩虹\n        <br>青花瓷\n        <br>蒲公英的约定\n        <br>最长的电影\n        <br>路小雨\n        <br>不能说的秘密\n        <br>听妈妈的话\n        <br>千里之外\n        <br>本草纲目\n        <br>菊花台\n        <br>我的地盘\n        <br>七里香\n        <br>搁浅\n        <br>以父之名\n        <br>三年二班\n        <br>东风破\n        <br>爱在西元前\n        <br>爸我回来了\n        <br>简单爱\n        <br>开不了口\n        <br>威廉古堡\n        <br>双截棍\n        <br>星晴\n        <br>黑色幽默\n        <br>印第安老斑鸠\n        <br>龙卷风\n        <br>反方向的钟\n        <br>女儿殿下\n    </td>\n</tr>\n<tr>\n    <td>陶喆</td>\n    <td></td>\n    <td>\n        普通朋友\n        <br>爱我还是他\n        <br>爱，很简单\n        <br>找自己\n    </td>\n</tr>\n<tr>\n    <td>接个吻，开一枪</td>\n    <td></td>\n    <td>Beijing</td>\n</tr>\n<tr>\n    <td>揽佬 SKAIISYOURGOD</td>\n    <td>\n        八方来财\n        <br>八方来财之江船入海\n    </td>\n    <td>金叶大酒店</td>\n</tr>\n<tr>\n    <td>蔡徐坤</td>\n    <td></td>\n    <td>\n        Deadman\n        <br>What a Day\n    </td>\n</tr>\n<tr>\n    <td>Nirvana</td>\n    <td>\n        Bleach\n        <br>Nevermind\n        <br>In Utero\n        <br>MTV Unplugged In New York\n        <br>Live At The Paramount\n    </td>\n    <td>Seasons In The Sun</td>\n</tr>\n<tr>\n    <td>Guns N' Roses</td>\n    <td>\n        Appetite For Destruction\n        <br>Use Your Illusion I\n        <br>Use Your Illusion II\n    </td>\n    <td>\n        Dead Flowers\n        <br>Used To Love Her\n        <br>Knockin' On Heaven's Door\n    </td>\n</tr>\n<tr>\n    <td>Pink Floyd</td>\n    <td>\n        The Division Bell\n        <br>The Dark Side of the Moon\n        <br>Wish You Were Here\n        <br>The Wall\n        <br>A Momentary Lapse of Reason\n        <br>Atom Heart Mother\n        <br>Animals\n    </td>\n    <td>\n        Echoes\n        <br>Echoes - Part 1 (Live at Pompeii - MCMLXXII - 2025 Mix)\n        <br>Echoes - Part 2 (Live at Pompeii - MCMLXXII - 2025 Mix)\n    </td>\n</tr>\n<tr>\n    <td>Bob Dylan</td>\n    <td>\n        MTV Unplugged\n    </td>\n    <td>\n        Blowing in the Wind\n        <br>Knockin' On Heaven's Door\n        <br>Workingman's Blues\n        <br>Like A Rolling Stone\n        <br>My Back Pages\n        <br>Mr. Tambourine Man\n        <br>Tempest\n        <br>The Times They Are A-Changin'\n        <br>The Sound of Silence\n    </td>\n</tr>\n<tr>\n    <td>Eric Clapton</td>\n    <td>\n        Forever Man\n        <br>Riding With The King\n        <br>Unplugged\n        <br>The Road to Escondido\n    </td>\n    <td>\n        Wonderful Tonight\n        <br>Tears in Heaven\n        <br>Sensitive Kind\n        <br>Layla\n    </td>\n</tr>\n<tr>\n    <td>sum 41</td>\n    <td>\n        All Killer, No Filler\n        <br>Does This Look Infected?\n        <br>The Best Of Sum 41\n    </td>\n    <td></td>\n</tr>\n<tr>\n    <td>Green Day</td>\n    <td>\n        American Idiot\n        <br>Dookie\n    </td>\n    <td>\n        Wake Me Up When September Ends\n        <br>21 Guns\n    </td>\n</tr>\n<tr>\n    <td>Neutral Milk Hotel</td>\n    <td>In the Aeroplane Over the Sea</td>\n    <td></td>\n</tr>\n<tr>\n    <td>Metallica</td>\n    <td></td>\n    <td>\n        Enter Sandman\n        <br>Fade To Black\n    </td>\n</tr>\n<tr>\n    <td>AC/DC</td>\n    <td></td>\n    <td>\n        Highway to Hell\n        <br>Back In Black\n        <br>Thunderstruck\n    </td>\n</tr>\n<tr>\n    <td>Eagles</td>\n    <td>Hell Freezes Over</td>\n    <td>\n        Hotel California\n        <br>Take It Easy\n    </td>\n</tr>\n<tr>\n    <td>The Connells</td>\n    <td>Ring</td>\n    <td></td>\n</tr>\n<tr>\n    <td>Mr. Big</td>\n    <td></td>\n    <td>\n        To Be With You\n        <br>Wild World\n        <br>Just Take My Heart\n        <br>Nothing But Love\n    </td>\n</tr>\n<tr>\n    <td>Oasis</td>\n    <td></td>\n    <td>\n        Wonderwall\n        <br>Don't Look Back in Anger\n        <br>Champagne Supernova\n    </td>\n</tr>\n<tr>\n    <td>Led Zeppelin</td>\n    <td></td>\n    <td>Stairway to Heaven</td>\n</tr>\n<tr>\n    <td>The Beatles</td>\n    <td>Abbey Road</td>\n    <td>\n        Hey Jude\n        <br>Let It Be\n        <br>In My Life\n        <br>Yesterday\n        <br>Now And Then\n        <br>Obladi Oblada\n    </td>\n</tr>\n<tr>\n    <td>The Rolling Stones</td>\n    <td></td>\n    <td>\n        Dead Flowers\n        <br>Satisfaction\n    </td>\n</tr>\n<tr>\n    <td>Deep Purple</td>\n    <td></td>\n    <td>Smoke On The Water</td>\n</tr>\n<tr>\n    <td>The Police</td>\n    <td></td>\n    <td>Every Breath You Take</td>\n</tr>\n<tr>\n    <td>Survivor</td>\n    <td></td>\n    <td>\n        Eye of the Tiger\n        <br>Burning Heart\n    </td>\n</tr>\n<tr>\n    <td>Radiohead</td>\n    <td>\n        Pablo Honey\n    </td>\n    <td>\n        Let Down\n        <br>No Surprises\n        <br>Karma Police\n        <br>Fake Plastic Trees\n    </td>\n</tr>\n<tr>\n    <td>Suede</td>\n    <td></td>\n    <td>\n        Beautiful Ones\n        <br>Trash\n    </td>\n</tr>\n<tr>\n    <td>My Chemical Romance</td>\n    <td>The Black Parade</td>\n    <td></td>\n</tr>\n<tr>\n    <td>Billy Joel</td>\n    <td>The Stranger</td>\n    <td>Piano Man</td>\n</tr>\n<tr>\n    <td>Pen Name</td>\n    <td>Pen Name</td>\n    <td></td>\n</tr>\n<tr>\n    <td>Michael Jackson</td>\n    <td></td>\n    <td>\n        Billie Jean\n        <br>Beat It\n        <br>We Are The World\n        <br>Dangerous\n        <br>Smooth Criminal\n    </td>\n</tr>\n<tr>\n    <td>50 cent</td>\n    <td>Get Rich Or Die Tryin'</td>\n    <td>\n        Disco Inferno\n        <br>Candy Shop\n        <br>My Life\n    </td>\n</tr>\n<tr>\n    <td>King Crimson</td>\n    <td></td>\n    <td>21st Century Schizoid Man</td>\n</tr>\n<tr>\n    <td>Chris Stapleton</td>\n    <td>\n        Traveller\n        <br>From A Room: Volume 1\n        <br>From A Room: Volume 2\n    </td>\n    <td></td>\n</tr>\n<tr>\n    <td>Robbie Williams</td>\n    <td></td>\n    <td>Better Man</td>\n</tr>\n<tr>\n    <td>Tracy Chapman</td>\n    <td></td>\n    <td>Give Me One Reason</td>\n</tr>\n<tr>\n    <td>4 Non Blondes</td>\n    <td>Bigger, Better, Faster, More!</td>\n    <td></td>\n</tr>\n<tr>\n    <td>Spin Doctors</td>\n    <td></td>\n    <td>Two Princes</td>\n</tr>\n<tr>\n    <td>Dire Straits</td>\n    <td></td>\n    <td>\n        Sultans Of Swing\n        <br>Walk Of Life\n        <br>Money For Nothing\n        <br>\n    </td>\n</tr>\n<tr>\n    <td>TheFatRat</td>\n    <td>PARALLAX</td>\n    <td>\n        We'll Meet Again\n        <br>The Storm\n        <br>Rise Up\n        <br>Close To The Sun\n        <br>Sunlight\n        <br>Solitude\n        <br>Chosen\n        <br>MAYDAY\n        <br>Oblivion\n        <br>Prelude (VIP Edit)\n        <br>Jackpot\n        <br>Monody\n        <br>Xenogenesis\n        <br>Fly Away\n    </td>\n</tr>\n</tbody>\n</table>\n",
            "url": "https://nocp.space/blog/my_playlist",
            "title": "我的歌单",
            "summary": "我都在听什么歌？（持续更新）",
            "date_modified": "2025-03-30T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/prove_simple_harmonic_motion_periodic_formula",
            "content_html": "\n\n## 简谐运动的周期公式\n\n我们知道，一个做简谐运动的振子，其周期符合公式\n\n$$T=2\\pi\\sqrt{\\frac{m}{k}}$$\n\n- $m$ 为该振子的质量\n- $k$ 为该振子的刚度\n\n## 证明\n\n水平地面上放有一根刚度为 $k$ 的弹簧，其一端固定在竖直墙面上，另一端系有一个质量为 $m$ 的振子，此时振子位于其平衡位置。将振子拉至距离平衡位置 $A$ （振幅）处并松手，则振子开始做简谐运动。\n\n那么，对于这个振子，由简谐运动的性质可得\n\n$$\n\\begin{equation}\nx=A\\cos(\\omega t)\n\\end{equation}\n$$\n\n$$\n\\begin{equation}\n\\omega=\\frac{2\\pi}{T}\n\\end{equation}\n$$\n\n对刚松手的时刻至振子第一次到达平衡位置时的过程分析，有\n\n$$\\frac{1}{2}kA^2=\\frac{1}{2}mv^2$$\n\n$$\n\\begin{equation}\nv=A\\sqrt{\\frac{k}{m}}\n\\end{equation}\n$$\n\n对振子运动时的极短时刻内分析，有\n\n$$k\\bar{x}\\Delta t=m\\Delta v$$\n\n对该方程从 $t=0$ 至 $t=\\frac{T}{4}$ 积分，可得\n\n$$k\\int_0^{\\frac{T}{4}}x\\mathrm{d}t=mv$$\n\n将$(1)$式与$(3)$式带入，得\n\n$$kA\\int_0^{\\frac{T}{4}}\\cos(\\omega t)\\mathrm{d}t=A\\sqrt{mk}$$\n\n$$k\\int_0^{\\frac{T}{4}}\\cos(\\omega t)\\mathrm{d}t=\\sqrt{mk}$$\n\n将$(2)$式代入，得\n\n$$k\\int_0^{\\frac{T}{4}}\\cos(\\frac{2\\pi}{T}t)\\mathrm{d}t=\\sqrt{mk}$$\n\n$$(\\frac{T}{2\\pi}\\sin(\\frac{2\\pi}{T}t))\\bigg\\vert_0^{\\frac{T}{4}}=\\sqrt{\\frac{m}{k}}$$\n\n$$\\frac{T}{2\\pi}-0=\\sqrt{\\frac{m}{k}}$$\n\n$$T=2\\pi\\sqrt{\\frac{m}{k}}$$\n",
            "url": "https://nocp.space/blog/prove_simple_harmonic_motion_periodic_formula",
            "title": "证明简谐运动的周期公式",
            "summary": "简谐运动的周期公式经常在用，但从来没有证明过，今天尝试证明一下",
            "date_modified": "2025-03-13T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/listening_2",
            "content_html": "\n\n最近发现了一个小众乐队，乐队名叫做The Connells（康奈尔乐队）[^1]。这是一个在上个世纪由康奈尔兄弟和几个大学同学一起组的乐队。和其他大多数摇滚乐队一样，现在这个乐队的几个成员都是老头了。不过在2023年，这几个老头又重聚在一块，开了一个演唱会，发了一张现场专辑《Set The Stage》[^2]。\n\n我第一次听到他们的音乐就被吸引住了。他们的音乐有一种生机感，但是又夹着一点生涩，这很符合他们这个乐队的气质。\n\n## '74-'75 - The Connells\n\n这个乐队在当年曾经发布过一张爆火的专辑《Ring》，'74-'75就是这张专辑里的主打歌曲。这首歌里面有一种贯穿全程的回忆感，而事实也是如此：这首歌的官方MV记录了一群刚毕业的高中生到中年以后的变化，歌名之所以叫'74-'75，就是因为这群高中生当年是'74-'75届的[^3]。\n\n这首歌最抓耳的是它开头的一段吉他，令人印象深刻。这段吉他在音乐中间和结尾的solo也有出现，但开头部分和solo部分却又给人不同的感觉。开头的吉他听起来像是有个人独自坐在火炉前弹琴；而中间solo的吉他听起来像是坐在一辆疾驰在高速公路上的汽车，向远方驶去，而这辆车又像是时间，几十年时光就这样疾驰而去；结尾的solo又增强了中间段的这种时光流逝感。\n\n这首歌的人声部分和这张专辑的其他歌曲一样，轻柔且青涩，可以很好地融入音乐中，而且也很符合这首歌的主题。\n\n## New Boy - The Connells\n\n事实上，在发现了'74-'75这首歌后我就找到了《Ring》这张专辑，这张专辑里的歌都很符合我的口味，其中就属这首New Boy我最喜欢。\n\n初听这首歌，让我印象深刻的是开头的那段失真的电吉他。多听几次之后，我就发现这首歌的贝斯很有意思，它听起来有点像Guns n' Roses的《Sweet Child O' Mine》里的贝斯。不过至于具体是怎样，我只能说：只可意会，不可言传。这首歌电吉他与贝斯的配合恰到好处，能从中听出一种青春感。而这首歌的MV讲的也是一对青梅竹马的故事，歌曲的旋律很好地体现了这个主题[^4]。\n\n[^1]: [The Connells - Official Website](https://theconnells.com)\n[^2]: [Set The Stage - The Connells](https://theconnells.com/music/set-the-stage/)\n[^3]: [The Connells - '74-'75 (Official HD Music Video)](https://youtube.com/watch?v=IGj24KHhMFw)\n[^4]: [The Connells - New Boy (Official HD Music Video)](https://youtube.com/watch?v=G1aq_d_Ig_o)\n",
            "url": "https://nocp.space/blog/listening_2",
            "title": "[聽后有感] 二",
            "summary": "一个宝藏小众乐队——The Connells",
            "date_modified": "2025-03-07T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/lyrics_translation",
            "content_html": "\n\n今天尝试翻译The Connells乐队的三首歌，其中《Slackjawed》和《Carry My Picture》的翻译已经上传网易云音乐了。\n\n> ### Slackjawed\n\n> **专辑：Ring**\n\n> **词曲：Mike Connell**\n\n> Someone tells me something\n\n> 有人向我诉说\n\n> Well I'm prepared to listen\n\n> 而我准备倾听\n\n> Nothing's going on, nothin's going on\n\n> 然而却无事发生，一切如常\n\n> Standing next to no one\n\n> 无人在我身旁\n\n> Well that was my intention\n\n> 那是我心中的虚构\n\n> Nothing's going on, nothin's going on\n\n> 无事发生，一切如常\n\n<br>\n\n> But then you're back and I'm guessing it's not so bad at all\n\n> 而你归来了，我想一切也不算那么糟\n\n> But then you're back and I'm guessing it's not so bad at all\n\n> 而你归来了，我想一切也不算那么糟\n\n> And I've been standing slack-jawed since you were here\n\n> 见你在此，我惊讶得目瞪口呆\n\n<br>\n\n> Something says this may be the strangest light I'll mention\n\n> 冥冥中有个声音说，这或是我此生最欲说还休的奇光\n\n> Someone left you on, someone left you on\n\n> 有人离你而去，有人离你而去\n\n> Saying next to nothing--the words were my invention\n\n> 无人在我身旁——这是我心中的虚构\n\n> Someone left you on, someone left you on\n\n> 有人离你而去，有人离你而去\n\n<br>\n\n> And now you're here and I'm thinking it's not so bad at all\n\n> 而你在此，我想一切也不算那么糟\n\n> And now you're here and I'm thinking it's not so bad at all\n\n> 而你在此，我想一切也不算那么糟\n\n> And I've been standing slack-jawed since you were here\n\n> 见你在此，我惊讶得目瞪口呆\n\n<br>\n\n> Yeah, and I'm waiting for you\n\n> 是啊，我在等待你的到来\n\n> I've been standing slack-jawed\n\n> 我惊讶得目瞪口呆\n\n<br>\n\n> Someone tells me something\n\n> 有人向我诉说\n\n> Well I'm prepared to listen\n\n> 而我准备倾听\n\n> Nothings going on, nothings going on\n\n> 然而却无事发生，一切如常\n\n<br>\n\n> But then you're back and I'm guessing it's not so bad at all\n\n> 而你归来了，我想一切也不算那么糟\n\n> But then you're back and I'm guessing it's not so bad at all\n\n> 而你归来了，我想一切也不算那么糟\n\n> And I've been standing slack-jawed since you were here\n\n> 见你在此，我惊讶得目瞪口呆\n\n<br>\n\n> Yeah, and I'm waiting for you\n\n> 是啊，我在等待你\n\n> And I've been standing slack-jawed since you were here\n\n> 见你在此，我惊讶得目瞪口呆\n\n> Yeah, and I'm waiting for you, I'm waiting for you\n\n> 是啊，我在等待你，等待你\n\n> I've been standing slack-jawed\n\n> 我被惊讶得目瞪口呆\n\n---\n\n> ### Carry My Picture\n\n> **专辑：Ring**\n\n> **词曲：Mike Connell**\n\n> You never think to occupy my time\n\n> 你从不想占用我的时间\n\n> And you never require\n\n> 也从不苛求\n\n> And you never lean too much\n\n> 也从不过分依靠我\n\n> And it's always been this way\n\n> 而你一直以来都是如此\n\n<br>\n\n> It's wearing thin\n\n> 我们之间的隔膜越来越薄\n\n> Your words come crowdin' in\n\n> 你的话语便纷至沓来\n\n> And I want you to know\n\n> 我想让你明白\n\n> It's the stuff that stirs me up\n\n> 激起我兴趣的东西\n\n> And follows me away\n\n> 然后随我前行\n\n<br>\n\n> So write my name\n\n> 所以写上我的名字吧\n\n> And carry my picture\n\n> 带上我的相片吧\n\n> There's nothing wrong\n\n> 这没有什么不对的\n\n> I'm willing, I'm willing\n\n> 我愿意，我愿意\n\n> I will lead you on\n\n> 而我将把你欺骗\n\n<br>\n\n> So write my name\n\n> 所以写上我的名字吧\n\n> And carry my picture\n\n> 带上我的相片吧\n\n> There's nothing wrong\n\n> 这没有什么不对的\n\n<br>\n\n> You never think to occupy my time\n\n> 你从不想占用我的时间\n\n> And you never require\n\n> 也从不苛求\n\n> And you never lean too much\n\n> 也从不过分依靠我\n\n> And it's always been this way\n\n> 而你一直以来都是如此\n\n<br>\n\n> So write my name\n\n> 所以写上我的名字吧\n\n> And carry my picture\n\n> 带上我的相片吧\n\n> There's nothing wrong\n\n> 这没有什么不对的\n\n> I'm willing, I'm willing\n\n> 我愿意，我愿意\n\n> I will lead you on\n\n> 而我将把你欺骗\n\n<br>\n\n> So write my name\n\n> 所以写上我的名字吧\n\n> And carry my picture\n\n> 带上我的相片吧\n\n> There's nothing wrong\n\n> 这没有什么不对的\n\n<br>\n\n> So write my name\n\n> 所以写上我的名字吧\n\n> And carry my picture\n\n> 带上我的相片吧\n\n> There's nothing wrong\n\n> 这没有什么不对的\n\n> I'm willing, I'm willing\n\n> 我愿意，我愿意\n\n> I will lead you on\n\n> 而我将把你欺骗\n\n<br>\n\n> So write my name\n\n> 所以写上我的名字吧\n\n> And carry my picture\n\n> 带上我的相片吧\n\n> There's nothing wrong\n\n> 这没有什么不对的\n\n---\n\n> ### Find Out\n\n> **专辑：Ring**\n\n> **词曲：Doug MacMillan**\n\n> You're thinking everybody needs to know\n\n> 你想所有人都该知道\n\n> What sets you so far apart\n\n> 是什么使你们分离\n\n> On a hunch, I think I could show\n\n> 我想我可以凭直觉说出为什么\n\n> But we'll let you keep the part\n\n> 但我们仍要让你们保持分离\n\n<br>\n\n> You gotta pull it off\n\n> 你要克服困难去达到目标\n\n> Just when we least expect it\n\n> 就在我们最意想不到的时候\n\n<br>\n\n> Really need to see your face on the wall\n\n> 真想在一家三星或四星级餐厅的墙上\n\n> Of a three or four star restaurant\n\n> 看到你的面庞\n\n> Shouldn't take more than a call\n\n> 不应接听超过一个电话\n\n> You always seem to get what you want\n\n> 你似乎总是能得到你想要的东西\n\n<br>\n\n> Gotta pull it off\n\n> 克服困难去达到目标吧\n\n> Just when we least expect it\n\n> 就在我们最意想不到的时候\n\n> Gotta pull it off\n\n> 克服困难去完成目标吧\n\n> Then we'll find out\n\n> 然后我们会发现\n\n> What this is really all about\n\n> 这所有的意义\n\n> Then I'll be the one who says \"I don't believe it.\"\n\n> 然后我会成为那个说着“我不相信”的人\n\n> Then we'll find you\n\n> 然后我们会找到你\n\n> Like you'd always want us to\n\n> 就想你一直以来想要我们做的那样\n\n> Face the first in your own favorite way\n\n> 以你最爱的方式去面对你的第一次\n",
            "url": "https://nocp.space/blog/lyrics_translation",
            "title": "The Connells 歌词翻译",
            "summary": "这次翻译了The Connells乐队的三首歌，第一次尝试翻译，可能略显生疏",
            "date_modified": "2025-02-16T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/listening_1",
            "content_html": "\n\n听歌的时候总是能从歌曲里获得一种感受，然而却一直以来没有机会表达出来，这一系列的博客就当作是对我听歌所得的主观感受的整理吧。这些文字都是我的主观想法，如有雷同，实属故意。\n\n## Learning to Fly - Pink Floyd\n\n这首是我在B站UP主“六的月”的“乐人列传”[^1]里第一次听到的。我第一次听到这首歌就觉得这是Pink Floyd的歌曲里少有的比较“阳光、积极”的曲子。在歌曲的一开始就是满满的电子元素，有种80年代迪斯科的味道，有点复古，但又不失气势与宏大之感。与歌名一样，这首歌就给人以一种飞翔在高空的快感。歌曲中间电吉他solo的音色就像风一样扑打在飞行中的人的脸上，又给人以一种居高临下，美景尽收眼底之感。\n\n寂寞真的有才，他的歌词很契合旋律，这句歌词尤其让我印象深刻：\n\n> Tongue-tied and twisted, just an earth-bound misfit, I\n\n歌词“Tongue-tied and twisted”在唱出来的时候带了点节奏感与动感，就像是飞行时的那种激动的、带感的心情。\n\n歌曲中间有一段歌词是用虚化了的、充满回声的声音去唱的，像是飞行者在高空中向身下的山谷、河流发出的呐喊。\n\n整首歌节奏不算快，但是稳重，就像在高空滑翔时的那种稳定感与平静感，但平静中又颇有激动之情难以言说。总之，这首歌也不失为Pink Floyd小众的一大佳作。\n\n## The Great Gig In the Sky - Pink Floyd\n\n作为Pink Floyd的又一名曲，我第一次听就被这首曲子震撼到了，让我真正感受到了歌名中所说的“Great Gig”。有的人评价这首歌给人的感觉就像是磕了迷幻药一样。的确，这首歌给我的感受就是飘飘然的。苏轼估计怎么也想不到，他写的“浩浩乎如冯虚御风，而不知其所止；飘飘乎如遗世独立，羽化而登仙”一句竟然可以形容后世的一首前摇巨作。\n\n歌曲开头的一段钢琴平静而稳定，听起来像是在宇宙中遨游一样，身边是无数的恒星与行星，内心无比平静。其实Pink Floyd的很多作品都是给人以这样的一种感觉，就像是乘坐着宇宙飞船在太空中穿梭一般的虚幻与超然之感。\n\n在钢琴的一段铺垫之后，人声进入。其实能够把这段唱好的人都不是一般人，听起来虽然只有不断的“啊”，但想要把情绪、爆发感和后面的平静感表达出来实属不易。这一段人声不包含任何歌词，却唱出了许多内容，不愧为前摇的一大名曲。第一声“啊”极具爆发感，爬升的旋律把“Gig”的听众送上了“Sky”，之后不断飙升的高音让人感到激情澎湃，尤其是后面的连续三次A5以及再后面的G5的高音把整首曲子推向高峰。紧接着，音乐过渡到舒缓，就给人一种眩晕、迷幻的感觉了，这样一种奇妙的感觉一直持续到整曲结束。\n\n[^1]: [六的月 - 合集·乐人列传](https://space.bilibili.com/12948552/lists/636471?type=season)\n",
            "url": "https://nocp.space/blog/listening_1",
            "title": "[聽后有感] 一",
            "summary": "赏曲：Learning to Fly、The Great Gig In the Sky",
            "date_modified": "2024-12-14T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/blog_update_4",
            "content_html": "\n\n当前，网站的域名已全面由`nin.red`迁移至`nocp.space`：新的域名，新的开始！\n\n## 缘起\n\n一直以来，我的网站域名都是`nin.red`。这个域名起初是为了我制作的一个短网址项目而注册的，后来这个项目被弃用了，为了不浪费这个域名，我就把我的个人网站挂在了这个域名底下。然而，这个域名虽短小精悍，但并没有什么实际含义，因此，我便有了启用新域名的想法。\n\n## 新域名？\n\n那么，新域名要取什么好呢？我第一时间想到的就是`nocp`这四个具有代表性的字母，不过顶级域名的选择还不确定。我是在腾讯云注册域名的。我有想过要取`nocp.land`，然而腾讯云并不支持注册`.land`的域名，所以我只好继续查找。最后，就找到了这个令我满意的`nocp.space`。\n\n经过一番努力，我的各个项目Demo和站点都已迁移到了`nocp.space`下，欢迎访问！\n",
            "url": "https://nocp.space/blog/blog_update_4",
            "title": "[博客更新] 域名已全面迁移至nocp.space",
            "summary": "网站的域名已全面由`nin.red`迁移至`nocp.space`",
            "date_modified": "2024-10-26T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/prove_picks_theorem",
            "content_html": "\n\n## 引入\n\n![](/static/blog/img25.png)\n\n如图所示，图中有一个复杂的多边形，它存在于一个网格中，假设网格每一个的边长都是1，那么，这个多边形的面积$S$是多少呢？\n\n看到这个问题，你可能会优先采用小学老师教过的“大面积减小面积”的方法，但这种方法计算起来比较慢。那么，是否有公式可以直接求解它的面积呢？这看似不可能的公式还真的存在，它就是**皮克定理**。\n\n## 皮克定理\n\n对于如上图所示的这样的多边形，它的面积符合如下公式：\n\n$$S=I+\\frac{O}{2}-1$$\n\n- $I$是多边形内部所包含的格点总数\n- $O$是多边形的边所经过的格点总数\n\n以上图的多边形为例，套用公式即可得出面积\n\n$$S=45+\\frac{24}{2}-1=56$$\n\n那么接下来，我们尝试简单证明一下这个公式。\n\n## 证明\n\n我们不妨先从最简单的情况入手，即求解网格中**长方形**的面积。\n\n![一个简单的长方形](/static/blog/img26.png)\n\n由于网格的固有性质，我们可以知道长方形的**周长**与**多边形的边所经过的格点总数**$O$是相等的。设长方形的长与宽分别为$a$、$b$，可得\n\n$$O=2*(a+b)$$\n\n移项，可得\n\n$$\n\\begin{equation}\na+b=\\frac{O}{2}\n\\end{equation}\n$$\n\n接着，我们可以知道，**多边形内部所包含的格点总数**$I$可以用$a$、$b$来表示，即\n\n$$(a-1)(b-1)=I$$\n\n化简，得\n\n$$ab-(a+b)+1=I$$\n\n由$S=ab$，可得\n\n$$S=I+(a+b)-1$$\n\n将$(1)$式代入，即可得出公式\n\n$$S=I+\\frac{O}{2}-1$$\n\n那么现在我们就证明了长方形情况下的皮克定理，但皮克定理可用于网格中的任意多边形，所以我们还需要推广这个公式。我们知道，将这样的长方形在网格中进行**切割**、**拼接**操作即可获得复杂的多边形，所以我们也可以以此来推广我们刚刚证明出来的公式。\n\n切割时分为多种情况，我们一一分类讨论。\n\n#### 切割线不经过或包括多边形内部的格点\n\n![示例：切割后的多边形](/static/blog/img27.png)\n\n若切割时切割线不经过或包括多边形内部的格点，那么切割出来的这个三角形必有一边的边长为1。\n\n1. **当我们把长度为1的边拼接在切割后的多边形上，则不会改变$I$和$O$的大小**\n\n![示例：拼接后的多边形](/static/blog/img28.png)\n\n设拼接后多边形的边所经过的格点总数为$O'$，则有\n\n$$O'=O+2-2=O$$\n\n故此时的$O$不变。又因为切割线不经过或包括多边形内部的格点，所以$I$也不变。\n\n所以，此时拼接后的图形的面积仍为\n\n$$S=I+\\frac{O}{2}-1$$\n\n2. **当我们把长度不为1的另一条边拼接在切割后的多边形上，则$I$和$O$大小改变，但面积不变**\n\n![示例：拼接后的多边形](/static/blog/img29.png)\n\n设拼接后多边形内部所包含的格点总数及其变化量分别为$I'$、$\\Delta I$，拼接后多边形的边所经过的格点总数为$O'$，拼接后的面积为$S'$，则有\n\n$$\n\\begin{equation}\nI'=I+\\Delta I\n\\end{equation}\n$$\n\n假设皮克定理的公式对此时的多边形仍然成立，则有\n\n$$S'=I'+\\frac{O'}{2}-1$$\n\n将$(2)$式代入，可得\n\n$$\n\\begin{equation}\nS'=I+\\Delta I+\\frac{O'}{2}-1\n\\end{equation}\n$$\n\n由于网格的固有性质，拼接时多边形内部所包含格点总数的变化量$\\Delta I$会与所拼接的三角形的边长有如下关系（设所拼接三角形的边的边长为$x$）：\n\n$$\\Delta I=x-1$$\n\n移项，得\n\n$$\n\\begin{equation}\nx=\\Delta I+1\n\\end{equation}\n$$\n\n由于网格的固有性质，拼接后多边形的边所经过的格点总数符合下式：\n\n$$O'=O+2-2x$$\n\n将$(4)$式代入，可得\n\n$$\n\\begin{equation}\nO'=O+2-2(\\Delta I+1)=O-2\\Delta I\n\\end{equation}\n$$\n\n将$(5)$式代入$(3)$式，可得\n\n$$S'=I+\\Delta I+\\frac{O-2\\Delta I}{2}-1$$\n\n化简，即可得出面积\n\n$$S'=I+\\frac{O}{2}-1$$\n\n故\n\n$$S'=S$$\n\n假设成立，皮克定理的公式对此时的多边形仍然成立。\n\n综上所述，切割线不经过或包括多边形内部的格点时，皮克定理成立。\n\n#### 切割线经过或包括多边形内部的格点\n\n![示例：切割后的多边形](/static/blog/img30.png)\n\n![示例：拼接后的多边形](/static/blog/img31.png)\n\n设切割下来的三角形中，包含了$m$个格点，所拼接三角形的边的边长为$x$，拼接后多边形内部所包含的格点总数及其变化量分别为$I'$、$\\Delta I$，拼接后多边形的边所经过的格点总数为$O'$，拼接后的面积为$S'$，切割线所经过的格点数为$t$，则有\n\n$$I'=I-m+m-t+(x-1)=I+x-t-1$$\n\n$$\n\\begin{equation}\nI'=I+\\Delta I\n\\end{equation}\n$$\n\n可得\n\n$$\\Delta I=I'-I=x-t-1$$\n\n$$\n\\begin{equation}\nx=\\Delta I+t+1\n\\end{equation}\n$$\n\n假设皮克定理的公式对此时的多边形仍然成立，则有\n\n$$S'=I'+\\frac{O'}{2}-1$$\n\n将$(6)$式代入，可得\n\n$$\n\\begin{equation}\nS'=I+\\Delta I+\\frac{O'}{2}-1\n\\end{equation}\n$$\n\n由于网格的固有性质，拼接后多边形的边所经过的格点总数符合下式：\n\n$$O'=O+2(t+1)-2x$$\n\n将$(7)$式代入，可得\n\n$$\n\\begin{equation}\nO'=O+2(t+1)-2(\\Delta I+t+1)=O-2\\Delta I\n\\end{equation}\n$$\n\n将$(9)$式代入$(8)$式，可得\n\n$$S'=I+\\Delta I+\\frac{O-2\\Delta I}{2}-1$$\n\n化简，即可得出面积\n\n$$S'=I+\\frac{O}{2}-1$$\n\n故\n\n$$S'=S$$\n\n假设成立，皮克定理的公式对此时的多边形仍然成立。\n\n综上所述，切割线经过或包括多边形内部的格点时，皮克定理成立。\n\n## 结论\n\n我们证明了由长方形切割而来的所有多边形，其面积都符合皮克定理的公式；又因为这样切割而来的多边形囊括了网格中所有的多边形，因此网格中所有的多边形的面积都符合皮克定理：\n\n$$S=I+\\frac{O}{2}-1$$\n\n## 结语\n\n上面的证明过程可能较为简单，毕竟是我自己研究而得的结果，有的地方或许会不严谨，如果你有发现任何错误，欢迎在[留言区](/#comments)指出。\n",
            "url": "https://nocp.space/blog/prove_picks_theorem",
            "title": "证明皮克定理",
            "summary": "一个神奇的定理，这次尝试证明一下",
            "date_modified": "2024-10-12T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/math_problem_of_an_english_practice",
            "content_html": "\n\n## 引入\n\n英语的题目里常常能见到这么一种叫做“选词填空”的题型，这种题目要求学生将给定的10个单词填入所给短文中的10个空，而且需要进行相应的词性变换。\n\n小明是一个英语不太好的学生，每次遇到这种题，他都会将所给的10个词随便地填入10个空中。那么，这就出现了一个数学问题：\n\n> **在不考虑词性变换的情况下，将10个备选词填入10个空。设答对题数为$X$，求$X$的分布列和数学期望。**\n\n## 解决问题\n\n由于“选词填空”这种题型只提供了10个词和10个空，所以可以知道 $X \\in \\Z, X \\in [0,10], X \\ne 9$\n\n那么答案就总共有 $A_{10}^{10}=3628800$ 种情况。\n\n#### 全部答对\n\n我们可以先讨论最简单的情况：**全部答对**。\n\n由于标准答案只有一种可能，可得\n\n$$P(X=10)=\\frac{1}{A_{10}^{10}}=\\frac{1}{3628800} \\approx 0.0000003$$\n\n#### 错位排列问题\n\n为了研究 $X \\ne 10$ 的情况，我们需要先引入**错位排列问题**。\n\n假设我们有 $n$ 封信件，每个信件都有其对应的一个信封，如果我们在装信封的时候把每一个信件都装错，有几种可能？\n\n这个问题的解法总共分两步：\n\n1. 将第 $n$ 封信装进其他信封，共有 $n-1$ 种装法。假设我们将第 $n$ 封信装进了第 $k$ 个信封。($k \\ne n$)\n\n2. 将第 $k$ 封信装进其他信封，此时有两种情况：\n一、将第 $k$ 封信装进第 $n$ 个信封，那么此时可看作是对剩余的 $n-2$ 封信进行错位排列；\n二、将第 $k$ 封信装入除第 $n$ 个信封之外的其他信封，那么此时可看作第 $k$ 封信对应第 $n$ 个信封，对这 $n-1$ 封信进行错位排列（因为前提已经说明，此时第 $k$ 封信不可能装入第 $n$ 个信封）。\n\n设这 $n$ 封信件共有 $D_n$ 种错位排列的放法，于是，我们可以得出下面的递推式\n\n$$D_n=(n-1)(D_{n-2}+D_{n-1})$$\n\n通过简单列举法，我们可以得出 $D_2=1$，$D_3=2$，那么，我们就可以通过递推式算出其他 $D_n$ 的值了：\n\n|$n$|$D_n$|\n|---|---|\n|$4$|$9$|\n|$5$|$44$|\n|$6$|$265$|\n|$7$|$1854$|\n|$8$|$14833$|\n|$9$|$133496$|\n\n#### 其他情况\n\n接下来，我们就可以研究 $X \\ne 10$ 的其他情况了。不妨先从 $X=0$ 入手。\n\n当 $X=0$ 时，这个问题就可以简化为10个单词的错位排列问题。那么根据上面所推出的递推式，我们可以得出\n\n$$D_{10}=(10-1)(D_{8}+D_{9})=9*(14833+133496)=1334961$$\n\n因此，可得\n\n$$P(X=0)=\\frac{D_{10}}{A_{10}^{10}}=\\frac{1334961}{3628800} \\approx 0.3678795$$\n\n当 $X=1$ 时，可看作是对除了填对的那一空单词以外，其他单词的错位排列问题。那么我们可以得出\n\n$$P(X=1)=\\frac{C_{10}^{1} D_{9}}{A_{10}^{10}}=\\frac{1334960}{3628800} \\approx 0.3678792$$\n\n以此类推\n\n$$P(X=2)=\\frac{C_{10}^{2} D_{8}}{A_{10}^{10}} \\approx 0.1839410$$\n$$P(X=3)=\\frac{C_{10}^{3} D_{7}}{A_{10}^{10}} \\approx 0.0613095$$\n$$P(X=4)=\\frac{C_{10}^{4} D_{6}}{A_{10}^{10}} \\approx 0.0153356$$\n$$P(X=5)=\\frac{C_{10}^{5} D_{5}}{A_{10}^{10}} \\approx 0.0030556$$\n$$P(X=6)=\\frac{C_{10}^{6} D_{4}}{A_{10}^{10}} \\approx 0.0005208$$\n$$P(X=7)=\\frac{C_{10}^{7} D_{3}}{A_{10}^{10}} \\approx 0.0000661$$\n$$P(X=8)=\\frac{C_{10}^{8} D_{2}}{A_{10}^{10}} \\approx 0.0000124$$\n\n#### 计算结果\n\n综上，可得 $X$ 的分布列：\n\n|$X$|$0$|$1$|$2$|$3$|$4$|$5$|$6$|$7$|$8$|$10$|\n|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n|$P$|$0.3678795$|$0.3678792$|$0.1839410$|$0.0613095$|$0.0153356$|$0.0030556$|$0.0005208$|$0.0000661$|$0.0000124$|$0.0000003$|\n\n那么，再根据分布列，可算出 $X$ 的数学期望\n\n$$E(X)=\\sum_{i=0}^{8} (i*P(X=i)) + 10*P(X=10)=1$$\n\n## 结语\n\n看得出来，如果小明做选词填空的时候是完全随机乱填的，那么他大概率会错一大堆。\n",
            "url": "https://nocp.space/blog/math_problem_of_an_english_practice",
            "title": "英语选词填空中的数学问题",
            "summary": "尝试解决一下这个因摆烂而生的数学问题",
            "date_modified": "2024-10-07T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/sodium_chloride_crystals",
            "content_html": "\n\n## 制作氯化钠晶体\n\n氯化钠（$\\ce{NaCl}$），俗称食盐，是一种具有立方晶体结构的物质，但我们日常在厨房里用的盐一般看着更像沙粒。\n\n事实上，小朋友们做的科学实验中常常用到食盐来展示结晶的过程，这样的实验很简单，但其结果却很是令人失望。许多线上教程做出来的食盐晶体看起来比它本该看起来的更加简陋。\n\n这其实是因为氯化钠晶体非常敏感，温度稍有差异就会导致一些瑕疵。而且，它更倾向于结晶成尘埃状微粒，长出一些畸形的晶簇、漏斗状晶体和干壳。\n\n然而，晶体们想不到的是，我也和它们一样固执，过去的3年间我已经好几次尝试去种它们了。终于，我发现了一个能种出大块而高质量氯化钠晶体的方法，就在这篇文章中，我将把它分享给你。\n\n![晶体成品](/static/blog/sodium-chloride-2.jpg)\n\n这是一个你在家就能复现的一个简单过程。这篇教程也许看着挺长，但后半部分都是在讲如何通过调整步骤来种出更加有趣和独特的食盐晶体。\n\n## 材料准备\n\n开始之前，你需要准备：\n\n- 无碘食盐\n- 一锅开水\n- 搅拌用的汤匙\n- 过滤漏斗\n- 滤纸 / 卫生纸\n- 一个大罐子\n- 一个平底盘\n- 一些小而平的容器\n\n有的人有跟我提到说很难得到无碘食盐，如果你也这样，你也可以选择无添加海盐（无碘、无抗结剂添加）。我已经试过了，结果是一样的。\n\n![https://amzn.to/3K6B6tf](/static/blog/sodium-chloride-3.jpg)\n\n接下来，我们就要制备我们的溶液了。\n\n## 制备饱和食盐水\n\n氯化钠室温下在水中的溶解度为36g/100ml，当你把这么多的盐溶入水中，就能得到饱和食盐水了。\n\n一旦水开始蒸发，多余的盐将会析出，形成食盐晶体。而我们的目标就是控制这一过程————让晶体尽可能生长得更好看。\n\n但首先，我们需要制备我们的饱和食盐水。\n\n准备一锅开水，量取每100ml水40g的盐，并将其溶入水中。然后搅拌溶液，直到大部分的盐溶解。如果有一点点盐留在底部的话，问题不是很大。\n\n继续加热溶液，直到你看见一些小的、白色的盐薄片开始在溶液表面形成。然后盖上盖子，给溶液一天的时间冷却。\n\n![继续加热溶液，直到你看见一些小的、白色的盐薄片开始在溶液表面形成](/static/blog/sodium-chloride-4.jpg)\n\n**注意：如果你用的是金属制的锅，最好是在溶液冷却之后将它转移到塑料或玻璃的容器中，因为饱和食盐水在金属锅中滞留太久将会对锅体造成损伤。**\n\n溶液冷却一天后，它照说应该更加稳定了。溶液中将会有一些多余的盐和一点黄色的杂质，而我们不需要它们。\n\n所以，用一个过滤漏斗加上一些滤纸（或咖啡过滤器、卫生纸）将溶液过滤，并装入一个大罐子中。这将是我们干净的、完美饱和的溶液库存，我们将用它来种出好看的晶体。最后，回收或丢弃多余的盐。\n\n![饱和氯化钠溶液（NaCl）](/static/blog/sodium-chloride-5.jpg)\n\n## 制作种子晶体\n\n有了饱和溶液之后，我们还需要制作一个种子晶体。种子晶体是一块小而完美的氯化钠晶体，我们可以在它的基础上种出更大的晶体。\n\n制作种子晶体非常简单，只需要倒50ml你最近准备的溶液到一个平底盘中。你不需要把溶液倒满整个盘子；溶液只需要大概1cm深就好。\n\n![倒50ml你最近准备的溶液到一个小盘中](/static/blog/sodium-chloride-6.jpg)\n\n我用的是培养皿，不过别的非金属容器也是可以的。\n\n好了之后，把这个盘子放到一个不受扰动的地方，让它在那待上1~2天。你可以把它放在阴凉的橱柜中、架子上或储物间。\n\n由于盘子里的溶液是饱和的，照说不用太长时间就会有小氯化钠晶体开始形成。它们看着是小而透明的方块。\n\n2天之后，这是我的盘子：\n\n![](/static/blog/sodium-chloride-7.jpg)\n\n如果你的看起来像是这样：\n\n![](/static/blog/sodium-chloride-8.jpg)\n\n这意味着你的溶液蒸发的速度太快了，要么是因为天气太热，要么就是它被暴露在了空气扰动中（比如风或风扇）。把它放在一个更阴蔽的地方再试试看。\n\n很好，现在我们已经有了许多种子晶体。\n\n尝试从中找出一个大小刚刚好、完全透明的方块状晶体，它将成为你的种子晶体。\n\n## 制作更大的氯化钠晶体\n\n现在，我们可以正式开始制作我们的晶体了。对绝大多数化合物来说，把晶体绑在绳子上，将它悬浮在溶液中会使它更容易结晶，但氯化钠是个例外。\n\n因为氯化钠晶体太敏感了，任何对它生长的干扰（比如绑在绳上）基本上都会造成成品的瑕疵。\n\n为了最小化它生成过程中的干扰，最好将它放在容器底部生长————这样的蒸发率最小。基于我的实践经验，那种极小的平底容器将是个不二之选。\n\n在尝试过小烧杯、果酱罐和塑料制的酱料瓶后......我发现化妆品罐的盖子效果最好。当然，到底好不好还是取决于你自己。\n\n现在，转移一点溶液到你选定的容器中，**确保容器是在这之前是干燥的**。选择一个种子晶体，用镊子**小心翼翼地**将它从盘子中转移到你的新容器里。\n\n![中间的是化妆品罐的盖子。我先转移了一点溶液到那里，再取出一个小种子晶体，把它放在化妆品罐盖子的正中央](/static/blog/sodium-chloride-9.gif)\n\n把这个容器放到阴蔽处。同样，储物间、地下室或阴凉的橱柜都很合适。\n\n这是目前为止我找到的最佳方法了，不过它仍然无法保证能够得到一个完美的晶体。\n\n![从左至右————蒸发率的提高是怎样降低晶体透明度的](/static/blog/sodium-chloride-10.jpg)\n\n所以，为了能营造一个更加稳定的环境，请确保溶液的表面不暴露在空气扰动中。要做到也挺简单的，只需要用别的容器把这整个装置盖起来。\n\n![你可以用你喜欢的方式把整个装置盖起来](/static/blog/sodium-chloride-11.jpg)\n\n这很大程度上有助于提升成品的透明度。在这之后，只需要把它放在那。在一天或两天之内，里面的晶体将会看起来如下图所示：\n\n![氯化钠晶体的生长](/static/blog/sodium-chloride-12.jpg)\n\n1. 完美。晶体长得很好，干得漂亮！\n2. 盐粒开始在你的晶体周围形成，你大概率是在转移晶体的时候不小心把它划伤了。\n3. 晶体长得太快了，因此它的透明度开始下降。要么是天气太热了，要么就是湿度太低了。\n4. 食盐晶体开始溶解了，你的溶液还不够饱和。要么是湿度过高，要么就是你在加入溶液的时候，容器有一点湿。\n\n出错了没关系。如果你的晶体是图2那样的，这意味着你得选择另一个种子晶体再重来一遍。\n\n如果你的晶体是图3或图4那样的，就让它继续生长吧。最终的成品也许不会太完美，但正如你将看见的一样，它仍然会以一种别有新意的方式继续生长。\n\n现在，你只需要等待晶体自己生长。在适当的环境条件下，它的大小应该会在一周之内翻倍，然后在一个月内达到1×1cm。这看起来要花很多时间，但对晶体爱好者们和化学家们来说，这已经是个了不起的成就了。\n\n![](/static/blog/sodium-chloride-13.jpg)\n\n如上文所述，晶体如果长得过快，透明度就会下降。然而，随着晶体越来越大，你也得越来越能容忍这样的变化发生。这意味着你可以将你变得更大的晶体转移到一个更大的盘子中，来为它提供更多的生长空间：\n\n![](/static/blog/sodium-chloride-14.jpg)\n\n当然，也不一定要转移晶体，因为在转移的过程中晶体有一定风险被划伤、透明度下降或开始溶解。一个更大的容器也会给其他小晶体更多机会粘在你的大晶体上。\n\n![小晶体开始在大容器中野蛮生长](/static/blog/sodium-chloride-15.jpg)\n\n你可以在你觉得它长得足够大的时候停下来，把它用镊子取出，然后用滤纸或卫生纸把它擦干。不要把它放在纸巾上太久————它会黏在上面的。\n\n然后就...大功告成了！\n\n把它拿到户外，欣赏一下它酥脆的边缘，拍点照片，给自己一些鼓励，或是拿着这个盐块在朋友面前装个X。\n\n![成品展示](/static/blog/sodium-chloride-16.jpg)\n\n然后，把它保存在一个密闭的容器中。氯化钠晶体很稳定，所以你不需要特别的容器来保存它。\n\n## 有趣的氯化钠晶体\n\n氯化钠晶体的生长受许多因素的影响，你种出来的晶体也许会和我的看起来完全不同。这有一些有意思的晶体，以及制作它们的方法。\n\n**导览：**\n\n- [慢速生长 vs 快速生长](#slowvfast)\n- [星形晶体](#crystalstars)\n- [白色晶块](#whitecubes)\n- [幽灵晶体](#ghostcrystals)\n- [金字塔状晶体](#saltpyramids)\n- [碘盐版晶体](#iodizedsalt)\n- [其他杂质](#impurities)\n- [晶簇](#crystalclusters)\n\n### 慢速生长 vs 快速生长 <a id=\"slowvfast\"></a>\n\n晶体的质量很大程度上取决于它生长的速度。下面几张图分别展示了晶体在慢速、中速、快速蒸发率的条件下生长的状态。\n\n![慢速](/static/blog/sodium-chloride-17.jpg)\n![中速](/static/blog/sodium-chloride-18.jpg)\n![快速](/static/blog/sodium-chloride-19.jpg)\n\n制作一个良好的晶体样本需要耗费时间与耐心，但也不要因此而泄气；最重要的是享受制作晶体的整个过程。事实上，第三张图中左上角那个歪七扭八的晶体是我的第一个氯化钠晶体！\n\n### 星形晶体 <a id=\"crystalstars\"></a>\n\n有些时候，晶体在一开始透明度会下降，但随着它逐渐长大，它的外层会变得透明，同时在内层形成一层白色的方形轮廓。结果看起来如下图所示：\n\n![](/static/blog/sodium-chloride-20.jpg)\n![](/static/blog/sodium-chloride-21.jpg)\n\n如果想达到这种效果，你可以在一开始就直接使用更大的容器来制作晶体————不需要加盖子来限制蒸发率。\n\n不过得小心，这个过程将变得更加难以预测。其他的小晶体可能会在周围形成，而且由于有充分的时间生长，它们可能会粘在你的大晶体上。不过只要有适合的环境条件，再加上点运气，你也可以拥有这样的星形晶体。\n\n### 白色晶块 <a id=\"whitecubes\"></a>\n\n白色晶块其实基本上是以更快的速度形成的星形晶体。它与星形晶体之间其实是一种平衡————在星形晶体的基础上，如果蒸发率有点太快了，或是一些晶体想要以粉末状态形成，那么它就会变成一团白色的晶块。（存疑）\n\n![](/static/blog/sodium-chloride-22.jpg)\n![](/static/blog/sodium-chloride-23.jpg)\n\n如果你想重现这种效果，只需要在一个热天重复星形晶体的制作过程就行了。\n\n上图的晶体看起来更像个方块，因为我在把它转移到新容器的时候给它翻了一侧。正常情况下，由于生长速度的改变，新的那一侧会立刻开始变白，但因为晶体一开始本来已经比较白了，结果看起来还挺棒的。\n\n### 幽灵晶体 <a id=\"ghostcrystals\"></a>\n\n在晶体生长的过程中，天气可能会突然变的特别热————或是下很多雨。这些条件分别会使晶体变白或溶解。而且，如果在几天之后，这些条件恢复正常，那么晶体就会恢复生长。\n\n但是这种干扰会造成晶体在中心处出现一些瑕疵。有时，这种瑕疵看起来会很独特，就仿佛被困在琉璃中的全息影像一样。\n\n![注意右边晶体中的“星形”](/static/blog/sodium-chloride-24.png)\n\n### 金字塔状晶体 <a id=\"saltpyramids\"></a>\n\n在种子晶体生长的时候，不是所有的晶体都会长成方块状。有时，种子晶体会落在它的顶点上，形成一种像金字塔一样的结构。\n\n如果你让它继续生长，你就会得到如图所示的晶体：\n\n![一个普通食盐晶体（左）与金字塔状晶体（右）对比](/static/blog/sodium-chloride-25.jpg)\n\n由于它们奇怪的形成方式，金字塔状晶体会粘在盘底。它们无法被移动————如果尝试移动它们会让粉末状的盐开始形成，造成晶体制作失败。所以，它只能在同一容器中形成、生长，最后被收割。\n\n注意，金字塔状晶体和那种在快速蒸发的溶液表面形成的漏斗状晶体是不一样的。那些空心的、看起来像是有阶梯的倒立金字塔的晶体，是以另一种完全不同的方式成型和生长的。虽然它们在自然界中偶尔会生成，但网上很少有资料教你如何制作它们。\n\n修改_（2021年12月）_：我发现了一种制作这些空心金字塔晶体的方法，我会继续研究这种制法，大概很快会出一个像这篇文章一样的教程。\n\n修改_（2022年8月）_：这比预期时间来得久，我会在大约一个月内发布那篇文章，分享我的发现。这一定很不错🙂\n\n修改_（2022年9月）_：文章出了！[如何在家制作金字塔盐晶体 (How to Easily Make Your Own Pyramid Salt Crystals) (英语原文)](https://crystalverse.com/pyramid-salt-crystals)\n\n![这是我尝试制作的空心金字塔盐晶体。它们和这篇教程介绍的那种晶体大相径庭](/static/blog/sodium-chloride-26.jpg)\n\n### 碘盐版晶体 <a id=\"iodizedsalt\"></a>\n\n制作氯化钠晶体并不推荐使用碘盐，因为它会把结晶的过程弄的一团糟，使得其难以形成单个的晶体。\n\n下面的这个晶体就是用碘盐制作的，使用了相同的制法。\n\n![](/static/blog/sodium-chloride-27.jpg)\n\n如果觉得这很好看，你无论如何都可以尝试一下。\n\n### 其他杂质 <a id=\"impurities\"></a>\n\n除了碘盐，其他溶液中的杂质都会影响晶体的生长。\n\n矿盐和海盐的结果可能会稍微不同，因为它们包含了其它矿物质的痕迹。但大体来说，都是可行的。确保你用的海盐不包含任何抗结剂。\n\n往盐溶液中添加尿素会使晶体长成八面体状，但出乎意料的是，网上竟然没有一张这样的照片。酸性溶液会得到细长、针状的晶体。\n\n晶体老玩家Dmishin发现，向盐溶液中添加氯化铁（$\\ce{FeCl3}$）会使晶体变得更好、更透明，但这是以更黄的晶体为代价的。看看[他的文章](http://dmishin.blogspot.com/2014/08/crystal-growing-table-salt-sodium.html)，以了解更多细节。\n\n![](/static/blog/sodium-chloride-28.jpg)\n\n### 晶簇 <a id=\"crystalclusters\"></a>\n\n如果你不想制作单一的透明晶体，而是要那种看起来更加自然的食盐晶簇，好消息是，这比普通晶体更简单。[这篇文章](https://crystalverse.com/cluster-of-table-salt-crystals)解释了关于这种晶簇的一切。\n\n![](/static/blog/sodium-chloride-29.jpg)\n\n## 其他事项\n\n虽然氯化钠理论上会结晶成方块状，但用我的制法做出来的晶体却在朝上的那一面看起来更扁平。这是从容器底部让晶体生长的一种弊端，原因是晶体的每一面都以不同的速率在生长。\n\n要想阻止这种情况发生，我们就得把晶体悬挂在溶液中央，而这也会带来其他困难。目前我使用的悬挂方式都不能得到较好的晶体，但我有希望在这方面有所进展。如果你有好消息，记得跟我分享。\n\n修改_（2022年8月）_：我正在研究能得到对称方块状晶体的悬挂方法。我有半数的尝试失败了，而剩下的一半长得还行。请持续关注更新。\n\n## 结语\n\n![](/static/blog/sodium-chloride-30.jpg)\n\n总而言之，氯化钠晶体的制作非常刁钻棘手，但如果有正确的方法，任何人都可以在家制作出食盐晶体。某些影响晶体生长的因素，比如天气，可能会在我们掌控之外，我们也可能得不到一个十分完美的晶体，但我们最后的成果可能就已经够好看了。\n\n![](/static/blog/sodium-chloride-31.jpg)\n\n这就是这篇教程的所有内容了。如果有问题，请你在[原文](https://crystalverse.com/sodium-chloride-crystals)下方评论区向我提问。\n\n如果你想要看到和这篇文章一样的更多晶体制作教程，请考虑订阅[我的Newsletter](https://crystalverse.com/#newsletter)，我将向你展示我的最新发现。\n\n与此同时，何不去看看我的另一篇文章[用肥料制作晶体](https://crystalverse.com/growing-crystals)呢？\n\n![这种化合物常见、无毒且可以轻松形成令人惊叹的晶簇](/static/blog/sodium-chloride-32.jpg)\n\n你也可以制作巨大的[泻盐晶体](https://crystalverse.com/epsom-salt-crystals)（$\\ce{MgSO4*7H2O}$），这是目前生长速度最快的晶体之一。\n\n感谢阅读文本，还有一如既往的：祝你晶体制作愉快！\n\n---\n\n_2021-11-10 Written By Chase（已授权翻译此文章）_\n\n_Translated By NoahHrreion_\n\n_英语原文：[How to Grow Big Table Salt or Sodium Chloride Crystals at Home (crystalverse.com)](https://crystalverse.com/sodium-chloride-crystals)_\n",
            "url": "https://nocp.space/blog/sodium_chloride_crystals",
            "title": "如何在家制作食盐（NaCl）晶体？",
            "summary": "这是一篇介绍如何制作氯化钠晶体的说明书，也是我尝试翻译英语文章的第一次尝试......<br>_英语原文：[How to Grow Big Table Salt or Sodium Chloride Crystals at Home](https://crystalverse.com/sodium-chloride-crystals)_",
            "image": "/static/blog/sodium-chloride-1.jpg",
            "date_modified": "2024-04-30T00:00:00.000Z",
            "author": {
                "name": "Chase"
            }
        },
        {
            "id": "https://nocp.space/blog/no_socalled_learning_methodology",
            "content_html": "\n\n闲来无事，打开B站常常就能刷到“高考仅剩100天，怎么上600？”“这个视频只能帮你上600+”之类的“学习方法论”视频。视频中的up主以一个学长或学姐的身份向观众传授他们的“经验教训”和那些“方法论”，而视频的弹幕和评论区都是一片支持的声音。但是，这样的视频真的有用吗？\n\n我身边有很多这样的人，他们每天都非常认真刻苦地读书、刷题、整理错题，遇到不会的题也会请教老师和同学，从早到晚，一刻不停。然而，每当考试成绩出来的时候，他们永远是垂头丧气的那一个。这是为什么呢？难道他们还不够努力吗？我想，不是的。这个问题背后肯定有更深层的原因，而不能只是简单归结为“不够刻苦努力”。但他们却没有意识到这一点。他们在看到成绩不如意的时候，仍然会把原因归结为是自己不够努力，于是，他们就这样陷入了一次又一次的循环。\n\n反观上面说到的“方法论”视频，里面讲的话题不外乎有这么几个：**选题、刷题、整理错题**、**拿分不靠天赋纯靠努力**、**心灵鸡汤、卖书**。视频从开头到结尾，都充斥着非常强烈的功利性与浓烈的鸡汤味；视频里，up主充满激情的演说就像希特勒的演讲一样，让每一位听众都感到热血沸腾；视频最后和评论区置顶附上卖书的链接......他们大肆宣扬奋力刷题的好处，而不断贬低正确学习方法和个人天赋所在的重要性，在无数观众面前营造了一种“只要我足够努力，我也能上清华北大985”的假象。于是，就有了前面提到的那样累死累活却陷入死循环的人。\n\n**这些视频看似“实用主义”，实则“心灵鸡汤”。**\n\n视频里常常强调“选题”“刷题”“整理错题”的重要性，尽管刷题确实有用，但“选题”“整理错题”却是名副其实的形式主义。那些“方法论”视频宣称“刷一题顶别人刷十题”，但实际效果却远不如此，这其实是因为他们所用的方法看似是对刷题过程的思考，但实际上都是些流于形式的自我感动。这些东西对刷题实践中经验的总结是起不到一点作用的。如果你真的想刷题，是用不着专门购买那些精挑细选的题集的，也许你只需要从已有的教材或教辅中按照你的需求来选一些题做。如果你真的想对刷过的题进行深入思考，是用不着专门做一本整理错题集的错题本的，也许你只需要停下来，好好思考斟酌一下刷题的过程，然后从中充分汲取经验。许多人盲目相信这样的“方法论”能让他们在短时间内进步几百分，却不愿意把做白日梦的时间多花一点在真正有用的事情上，殊不知，事物的发展都是有一个过程的，追求快速提分只会落得“竹篮打水一场空”，况且这些“方法论”其实都是形式主义。\n\n过分强调努力的作用只会累死自己，有时候也应辩证地看待天赋的作用，尽力而为又量力而行。老高做过一期视频[《千萬別努力，努力毀一生》](https://bilibili.com/video/BV1mc41147rz)，虽然视频里提到的观点较为极端，但仍然不失参考意义。有许多人没日没夜、拼死拼活却考不上好一点的大学，而那些天赋型选手们稍微努力就能进入顶级学府————这就是天赋的作用。事实上，每个人的天赋都不尽相同。往大了说，有学习、绘画、音乐、运动等不同领域的天赋；往小了看，还可以有烹饪、种植、经营、驾驶等生活中不同方面的天赋。你并非什么天赋都没有，只是你还没发现、或者你把它当作理所当然了。所以就应该像那些视频中说的那样，去拼了命和那些天赋型选手“一争高下”吗？显然是不可能的。学习确实能够改变人生，但好的人生却不一定是进入顶级学府，它也可以是你在自己擅长的领域小有所成。虽然说应当考虑到天赋的作用，但这并不意味着就要忽视努力的重要性，因为也只有努力才能最大化天赋的作用。我们真正要做的就是过好当下，尽力而为，努力达到自己的上限，但同时也要适当放松休息，要规律作息，不要一味去和他人比较，免得最后卷死自己。\n\n虽说有许多这样的“方法论”视频，但仍然不失有一些良心干货视频是值得学习的。这些视频传授的是真正有益的方法，而不是只有励志和鸡汤。就比如有的视频是在教别人怎么自主学习，以防止那种“劣质”老师对自己的学习造成影响的；又比如有的视频是在教别人一些具有普遍意义的做题方法，可以有效提升做题效率。毫无疑问，这些视频都是有益的，但无论如何，再好的干货也比不过你自己的行动。学习是一个不断积累的过程，从做题的实践中积累经验、形成自己的一套方法论，就胜过无数“学霸”的“学习方法论”了。\n\n事实上，对于这类视频，我们都应该采取辩证看待的态度，不能被视频里一番热血沸腾的演说冲昏了头脑。每个人都有自己学习的节奏，因此每个人都应该遵循自己的节奏，而不能生搬硬套别人的模式，即使那个人是学霸。“方法论”视频也许能为你提供一定的参考，但最终还是要靠你自己对你自己的了解与评估，来规划和制定自己的学习路线，而这也才是真正的**“实用主义”**。\n",
            "url": "https://nocp.space/blog/no_socalled_learning_methodology",
            "title": "拒绝“学习方法论”视频",
            "summary": "现在B站上有许多关于所谓“学习方法论”的视频，打着“轻松上600分”的旗号赚取源源不断的流量，然而这些视频的最大的实际作用可能只是让你热血沸腾",
            "image": "/static/blog/no_socalled_learning_methodology.jpg",
            "date_modified": "2024-04-21T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/blog_update_3",
            "content_html": "\n\n作为一个博客，RSS Feed是必不可少的，但自从全面重写了博客之后，NBlog就不支持RSS Feed了。所以，今天我再次更新博客，让博客重新支持RSS Feed。\n\n但是，要从何下手呢？既然要在构建整个网站的时候生成feed文件，那就得对Webpack配置进行一些修改了。我写了一个Webpack插件，用这个插件在构建网站的时候读取博客里所有的文章，然后生成feed文件。如果你也想使用Webpack配置RSS Feed，那么你就可以直接使用我写好的插件，稍微进行一些配置即可。\n\n[`webpack-feed-plugin`](https://npmjs.com/webpack-feed-plugin)\n",
            "url": "https://nocp.space/blog/blog_update_3",
            "title": "[博客更新] 现已支持RSS Feed",
            "summary": "NBlog现已支持**RSS Feed**订阅",
            "date_modified": "2024-02-23T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_7",
            "content_html": "\n\n我以前曾经尝试去编译运行Chromium内核的源码，但屡次失败，于是想挑个软一点的柿子捏，打算编译运行VSCode。不过VSCode我之前也尝试过几次，但都失败了。而这几天我再次挑战VSCode源码编译，终于成功了。这篇文章记录了我从开始到成功编译的过程和遇到的问题，**其中所记录的操作过程包含我的误操作和漏操作，在文章后面有问题的解释和解决，请不要重蹈我的覆辙**。\n\n## 准备工作\n\n首先，我找到了微软官方给出的[VSCode编译运行指南](https://github.com/microsoft/vscode/wiki/How-to-Contribute)，并开始准备工作。\n\n由于我电脑的系统是Windows，所以根据指南，我检查了我电脑上安装的，编译VSCode所必须的软件：**Git**、**Node.js**、**Yarn 1**、**Python**。接着，我看到文档中写道：\n\n```md\nif you install Node on your system using the Node installer from the Node.JS page then ensure that you have installed the 'Tools for Native Modules'. Everything should work out of the box then.\n```\n\n意思就是说，如果你是使用Node.js官方给的安装器安装的Node.js，那么你需要确保你有在安装时勾选并下载“Tools for Native Modules”，接下来的很多东西都是在此基础上运作的。因为我当时安装Node.js的时候没有勾选那个选项，所以我就去[Node.js官网](https://nodejs.org)重新下载安装了Node.js。\n\n## 下载源码\n\n这步简单！先fork[VSCode源码仓库](https://github.com/microsoft/vscode)，然后运行\n\n```bash\ngit clone https://github.com/{你的GitHub名称}/vscode.git\n```\n\n但是由于源码仓库体积过大，git下载了一会就罢工了，然后抛出错误：\n\n```txt\nRPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8)\n```\n\n于是我执行下面的指令解决了报错（在下载完源码仓库之后，把`HTTP/1.1`改成`HTTP/2`再执行一遍这个指令即可恢复）\n\n```bash\ngit config --global http.version HTTP/1.1\n```\n\n接着，我又得到一个错误：\n\n```txt\nRPC failed; curl 18 transfer closed with outstanding read data remaining\n```\n\n查了各大网站之后得到一个解决方案，那就是先浅下载，然后再进行深度下载。执行下面的指令\n\n```bash\ngit clone https://github.com/{你的GitHub名称}/vscode.git --depth 1\ncd vscode\ngit fetch --unshallow\n```\n\n那么源码到此就下载完成了。\n\n## 安装依赖\n\n官方文档给出的安装依赖指令是\n\n```bash\nyarn\n```\n\n运行了之后，只要前文提到的那些必须软件你装好了（尤其是Python）基本就没什么问题。这一步我没有遇到什么问题。\n\n## 编译\n\n接下来到了最关键的一步，编译代码。官方给出的编译指令是\n\n```bash\nyarn watch\n```\n\n或是用VSCode打开源码文件夹，然后同时按下`Ctrl`+`Shift`+`B`（MacOS是`CMD`+`Shift`+`B`）。\n\n但是这一步就没那么顺利了，我运行后立刻就看到报错：\n\n```txt\nError: Cannot find module 'ternary-stream'\n```\n\n于是我想当然地就运行了\n\n```bash\nyarn add ternary-stream\n```\n\n但结果却得到另一个报错：\n\n```txt\nError: Cannot find module 'vscode-gulp-watch'\n```\n\n那当然就是\n\n```bash\nyarn add vscode-gulp-watch\n```\n\n奇怪的是，接下来我再次得到刚刚`Error: Cannot find module 'ternary-stream'`的报错——好家伙，搁着死循环了是吧！又是查遍了各大网站，我发现，这个问题的根源在于我没有装好C++依赖，原因是我漏读了官方文档中的一些内容。\n\n官方文档在前面写道：\n\n```md\n..., add the following components corresponding to the architecture you are building for (x64/ARM/ARM64) and restart your build session\n\n- MSVC Spectre-mitigated libs (latest)\n- C++ ATL for latest build tools with Spectre Mitigations\n- C++ MFC for latest build tools with Spectre Mitigations\n```\n\n所以，我照着文档将里面提到的这3个C++依赖装好，重新运行了`yarn watch`。但本以为这次将顺利执行，结果我又撞上了另一个报错：\n\n```txt\nUnhandled Rejection at: Promise Promise {\n  <rejected> Error: bad export type for `tree_sitter_typescript_external_scanner_create`: undefined\n      at ...\n      at ...\n      at ...\n      at ...\n      at ...\n} reason: Error: bad export type for `tree_sitter_typescript_external_scanner_create`: undefined\n    at ...\n    at ...\n    at ...\n    at ...\n    at ...\n```\n\n于是，我将报错复制下来，粘贴到搜索框去搜索，可惜我没有找到什么相关的信息，除了这个VSCode源码仓库的[issue](https://github.com/microsoft/vscode/issues/166265#issuecomment-1361662887)。由于信息太少了，我就只好自己摸索，在这里卡了很久。最后，我发现这个报错与Node.js版本有关，但我明明是去官网下载的**最新版`20.11.1`**，怎么会出问题呢？\n\n而问题就出在这！我再次打开文档，查看前面的段落，发现文档中有提到Node.js的版本号必须符合`>=18.15.x and <19`。所以我又一次重新安装了Node.js，将版本从`20.11.1`退回到`18.16.0`。\n\n最后再次运行`yarn watch`，成功！\n\n## 运行\n\n官方给出的运行指令是\n\n```bash\n# Windows\n./scripts/code.bat\n# MacOS & Linux\n./scripts/code.sh\n```\n\n只要你前面的`yarn watch`成功执行，那么这一步应该也不会出什么问题。\n\n## 修改代码 & 调试\n\n首先，用VSCode打开源码的根目录文件夹，然后从侧边栏进入“运行和调试”。\n\n![打开“运行和调试”](/static/blog/img23.png)\n\n然后点击上面的“开始调试”按钮，就可以开始修改和调试代码了。\n\n![点击“开始调试”按钮](/static/blog/img24.png)\n\n## 小结\n\n这次编译运行VSCode过程中的许多曲折其实是因为我没有认真阅读文档，这恰恰说明了文档中的每一个字都不是多余的，阅读的时候不能随意落下某些段落或者内容，虽然报错有时是不可避免的，但对文档多留个心眼也可以大大节约精力和时间成本。\n",
            "url": "https://nocp.space/blog/coding_daily_7",
            "title": "[代码日记] 编译运行VSCode源码",
            "summary": "编译运行VSCode源码过程中的一些事",
            "date_modified": "2024-02-19T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/prove_some_derivative_conclusion",
            "content_html": "\n\n## $e^x$的导数\n\n令\n\n$$f(x)=e^x$$\n\n则有\n\n$$f'(x)=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)-f(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{e^{x+\\Delta x}-e^x}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{e^x(e^{\\Delta x}-1)}{\\Delta x}$$\n\n$$=e^x \\lim_{\\Delta x \\to 0} \\frac{e^{\\Delta x}-1}{\\Delta x}$$\n\n此时，设$t=e^{\\Delta x}-1$，则$\\Delta x=\\ln(t+1)$\n\n当$\\Delta x \\to 0$时，$t \\to 0$\n\n那么，原式可化为\n\n$$e^x \\lim_{t \\to 0} \\frac{t}{\\ln(t+1)}$$\n\n$$=e^x \\lim_{t \\to 0} \\frac{1}{\\frac{1}{t} \\ln(t+1)}$$\n\n$$=e^x \\lim_{t \\to 0} \\frac{1}{\\ln(t+1)^{\\frac{1}{t}}}$$\n\n因为\n\n$$e=\\lim_{t \\to 0} (t+1)^{\\frac{1}{t}}$$\n\n所以，原式可化为\n\n$$e^x \\frac{1}{\\ln{e}}$$\n\n$$=e^x$$\n\n故\n\n$$f'(x)=e^x$$\n\n## $\\ln{x}$的导数\n\n令\n\n$$f(x)=\\ln{x}$$\n\n则有\n\n$$f'(x)=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)-f(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\ln(x+\\Delta x)-\\ln{x}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\ln{\\frac{x+\\Delta x}{x}}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\ln(1+\\frac{\\Delta x}{x})}{\\Delta x}$$\n\n此时，设$t=\\frac{\\Delta x}{x}$，则$\\Delta x=xt$\n\n当$\\Delta x \\to 0$时，$t \\to 0$\n\n那么，原式可化为\n\n$$\\lim_{\\Delta x \\to 0} \\frac{\\ln(1+t)}{xt}$$\n\n$$=\\frac{1}{x} \\lim_{t \\to 0} \\frac{\\ln(1+t)}{t}$$\n\n$$=\\frac{1}{x} \\lim_{t \\to 0} \\ln(1+t)^{\\frac{1}{t}}$$\n\n因为\n\n$$e=\\lim_{t \\to 0} (t+1)^{\\frac{1}{t}}$$\n\n所以，原式可化为\n\n$$\\frac{1}{x} \\ln{e}$$\n\n$$=\\frac{1}{x}$$\n\n故\n\n$$f'(x)=\\frac{1}{x}$$\n\n## $\\log_{a}{x}$的导数 ($a>0$)\n\n令\n\n$$f(x)=\\log_{a}{x}, a \\in (0,+\\infty)$$\n\n则有\n\n$$f'(x)=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)-f(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\log_{a}(x+\\Delta x)-\\log_{a}{x}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\ln(x+\\Delta x)-\\ln{x}}{\\Delta x\\ln{a}}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\ln\\frac{x+\\Delta x}{x}}{\\Delta x\\ln{a}}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\ln(1+\\frac{\\Delta x}{x})}{\\Delta x\\ln{a}}$$\n\n与$\\ln{x}$导数推导过程同理，可得\n\n$$f'(x)=\\frac{1}{x\\ln{a}}$$\n\n$i$ 当$a=e$时，可得$\\ln{x}$的导数\n\n$$\\frac{1}{x}$$\n\n$ii$ 当$a=10$时，可得$\\lg{x}$的导数\n\n$$\\frac{1}{x\\ln{10}}$$\n\n## $\\sin{x}$的导数\n\n令\n\n$$f(x)=\\sin{x}$$\n\n则有\n\n$$f'(x)=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)-f(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\sin(x+\\Delta x)-\\sin{x}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\sin{x}\\cos{\\Delta x}+\\cos{x}\\sin{\\Delta x}-\\sin{x}}{\\Delta x}$$\n\n由于当$\\Delta x \\to 0$时，$\\cos{\\Delta x} \\to 1$\n\n故可将原式化为\n\n$$\\lim_{\\Delta x \\to 0} \\frac{\\cos{x}\\sin{\\Delta x}}{\\Delta x}$$\n\n又因为当$\\Delta x \\to 0$时，有\n\n$$\\sin{\\Delta x} \\approx \\Delta x$$\n\n所以，原式可化为\n\n$$\\lim_{\\Delta x \\to 0} \\frac{\\cos{x} \\Delta x}{\\Delta x}$$\n\n$$=\\cos{x}$$\n\n故\n\n$$f'(x)=\\cos{x}$$\n\n## $\\cos{x}$的导数\n\n令\n\n$$f(x)=\\cos{x}$$\n\n则有\n\n$$f'(x)=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)-f(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\cos(x+\\Delta x)-\\cos{x}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\cos{x}\\cos{\\Delta x}-\\sin{x}\\sin{\\Delta x}-\\cos{x}}{\\Delta x}$$\n\n由于当$\\Delta x \\to 0$时，$\\cos{\\Delta x} \\to 1$\n\n故可将原式化为\n\n$$\\lim_{\\Delta x \\to 0} \\frac{-\\sin{x}\\sin{\\Delta x}}{\\Delta x}$$\n\n又因为当$\\Delta x \\to 0$时，有\n\n$$\\sin{\\Delta x} \\approx \\Delta x$$\n\n所以，原式可化为\n\n$$\\lim_{\\Delta x \\to 0} \\frac{-\\sin{x}\\Delta x}{\\Delta x}$$\n\n$$=-\\sin{x}$$\n\n故\n\n$$f'(x)=-\\sin{x}$$\n\n## $\\tan{x}$的导数\n\n令\n\n$$f(x)=\\tan{x}$$\n\n则有\n\n$$f'(x)=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)-f(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\tan(x+\\Delta x)-\\tan{x}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\frac{\\sin(x+\\Delta x)}{\\cos(x+\\Delta x)}-\\frac{\\sin{x}}{\\cos{x}}}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{\\sin(x+\\Delta x)\\cos{x}-\\cos(x+\\Delta x)\\sin{x}}{\\Delta x\\cos(x+\\Delta x)\\cos{x}}$$\n\n$$=\\frac{1}{\\cos{x}} \\lim_{\\Delta x \\to 0} \\frac{\\sin(x+\\Delta x-x)}{\\Delta x\\cos(x+\\Delta x)}$$\n\n$$=\\frac{1}{\\cos{x}} \\lim_{\\Delta x \\to 0} \\frac{\\sin{\\Delta x}}{\\Delta x\\cos(x+\\Delta x)}$$\n\n因为当$\\Delta x \\to 0$时，有\n\n$$\\sin{\\Delta x} \\approx \\Delta x$$\n\n所以，原式可化为\n\n$$=\\frac{1}{\\cos{x}} \\lim_{\\Delta x \\to 0} \\frac{1}{\\cos(x+\\Delta x)}$$\n\n$$=\\frac{1}{\\cos^2{x}}$$\n\n故\n\n$$f'(x)=\\frac{1}{\\cos^2{x}}$$\n\n## 两函数相乘求导公式\n\n设\n\n$$h(x)=f(x)g(x)$$\n\n则有\n\n$$h'(x)=\\lim_{\\Delta x \\to 0} \\frac{h(x+\\Delta x)-h(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} \\frac{f(x+\\Delta x)g(x+\\Delta x)-f(x)g(x)}{\\Delta x}$$\n\n$$=\\lim_{\\Delta x \\to 0} (\\frac{f(x+\\Delta x)-f(x)+f(x)}{\\Delta x}g(x+\\Delta x)-\\frac{g(x)}{\\Delta x}f(x))$$\n\n$$=\\lim_{\\Delta x \\to 0} ((\\frac{f(x)}{\\Delta x}+f'(x))g(x+\\Delta x)-\\frac{g(x)}{\\Delta x}f(x))$$\n\n$$=\\lim_{\\Delta x \\to 0} (\\frac{g(x+\\Delta x)}{\\Delta x}f(x)+f'(x)g(x+\\Delta x)-\\frac{g(x)}{\\Delta x}f(x))$$\n\n$$=\\lim_{\\Delta x \\to 0} (f(x)g'(x)+f'(x)g(x+\\Delta x))$$\n\n$$=f(x)g'(x)+f'(x)g(x)$$\n",
            "url": "https://nocp.space/blog/prove_some_derivative_conclusion",
            "title": "证明一些导数结论",
            "summary": "尝试证明一些常用的导数结论",
            "date_modified": "2024-02-15T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_6",
            "content_html": "\n\n最近，Calcium源码仓库来参观的人越来越多了，star也是涨了挺多，让它一跃成为了我star数最多的仓库。这个数字与其他的大项目比起来仍然不值一提，但这也算是我的一小步成就了。随着star的不断增加，fork数也涨到了4个，尽管那些来fork的人都没有对代码进行任何修改，但这也算对我的一种肯定。\n\n当下的Calcium功能已经较为齐全，但仍然有许多的不足和bug，以及一些一直以来的“屎山”——虽然我在不断地克服。\n\n提到屎山，就不得不让我想到那个计算器输入框的代码。输入框组件的代码一直都比较抽象，甚至于有的地方随着代码量不断增多变得越来越难以阅读和维护。这次，我想为输入框添加一个字符高亮的功能（就是给诸如变量、函数之类的字符着色），结果我发现这部分的代码过于难以修改，所以我就重写了这里的一部分代码，增加了[`InputContext`](https://github.com/nocpiun/calcium/blob/fcdbe1823dd9c5c35eb3912c47b70bcddf60b703/src/components/InputBox.tsx#L197)，用来管理输入的字符。\n\n但是，毕竟这个类里面存储的字符并不是组件的state，所以在这些字符发生改变的时候，组件并不会自动重新渲染。因此，我需要增加一个机制，让它能自动检测字符发生改动然后刷新组件。下面是我想到的几个解决方案：\n\n### ProxyObject\n\n这是我最开始想到的解决方案，因为`ProxyObject`可以通过代理的方式监听对象内部属性的改变，进而进行对应的操作，而不需要借助`Emitter`事件系统。但这不知道为什么，在有的时候，字符改动的时候它会莫名其妙地拦截这个改动，进而使这个改动失效。\n\n### Setter\n\n这是我之后想到的另一个解决方案，因为`Setter`的写法会更加简单易懂。但相应地，它就需要借助`Emitter`事件系统。那么，为什么`ProxyObject`不需要`Emitter`，而`Setter`就需要呢？这正是因为前者是在外部监听属性变化的，而后者恰恰相反。\n\n有了解决方案之后，我就添加了下面的[代码](https://github.com/nocpiun/calcium/blob/fcdbe1823dd9c5c35eb3912c47b70bcddf60b703/src/components/InputBox.tsx#L201-L212)：\n\n```ts\nprivate _symbolList: InputSymbol[] = [];\n\npublic get symbolList(): typeof this._symbolList {\n    return this._symbolList;\n}\n\npublic set symbolList(newValue: typeof this._symbolList) {\n    this._symbolList = newValue;\n    /**\n     * Manually emit the event that makes `InputBox` component being updated forcedly,\n     * so that the value in the input box will be consistent with `symbolList`.\n     */\n    Emitter.get().emit(\"symbol-list-update\");\n}\n```\n\n原理很简单，我就不解释了。\n\n## InputContext的作用\n\n原本没有`InputContext`的时候，所有字符的管理和操作都得靠输入框组件来完成，甚至由于字符存储的方式（原本是[以`string`存储的](https://github.com/nocpiun/calcium/blob/e6ffa0788b9008bc4b44fc218edff74567d486d6/src/components/InputBox.tsx#L18)，现在以`string[]`来存储），字符的操作也更加复杂。现在有了InputContext之后，就可以把一些常用的操作封装成方法，接着就只要简单调用这些方法就能完成先前复杂的操作了。\n\n## 小结\n\nCalcium达到20stars之际，我写的代码仍然存在许多问题需要解决，就如上文提到的输入框组件的问题。因此我还需要更加努力地提升技术力，进而让这个计算器更加强大，让它的代码更加完备。\n",
            "url": "https://nocp.space/blog/coding_daily_6",
            "title": "[代码日记] Calcium源码仓库喜提20stars",
            "summary": "还记得我写的那个计算器吗？它现在已经获得了20个star了",
            "date_modified": "2024-01-21T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/canon",
            "content_html": "\n\n[PDF文件](/static/canon.pdf)\n\n<embed src=\"/static/canon.pdf\" type=\"application/pdf\"/>\n",
            "url": "https://nocp.space/blog/canon",
            "title": "C大调卡农（摇滚版）",
            "summary": "自己编的一首卡农，技术比较差，勿喷",
            "date_modified": "2023-12-24T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/neither_here_nor_there",
            "content_html": "\n\n<div align=\"center\">\n\n<audio src=\"/static/media/neither_here_nor_there.mp3\" controls></audio>\n\n</div>\n\n<br>\n\n> ### 望鄉\n\n> **词曲：陈升**\n\n> 彷彿還在昨天\n\n> 秋天的某一個日子啊\n\n> 我們躺在碧茵的草地上\n\n> 望著無言的天空\n\n> 學校外面的大草原 好像我們的全世界\n\n> 獨立在書本之外 一個陌生的孤地\n\n<br>\n\n> 孤單的燕子啊\n\n> 你要飛去哪裡\n\n> 那個曾許下的諾言\n\n> 而今是否都有實現\n\n> 告白都這麼難\n\n> 在一起會怎樣\n\n> 都說注定了要受傷\n\n> 莫非這就是成長\n\n> 分別都這麼難\n\n> 深愛了該怎麼辦\n\n> 望著故鄉的方向\n\n> 我深愛的人不知在何方\n\n<br>\n\n> 想起那首老歌謠\n\n> 和那些荒唐的日子啊\n\n> 望著故鄉遠去的方向\n\n> 我深愛的人不知在何方\n\n<br>\n\n> 隔壁班的那個男孩\n\n> 今天沒有經過窗前\n\n> 而掛在窗外的藍天\n\n> 你是否有點悲傷\n\n> 孤單的日子啊\n\n> 像一封迷失的長信\n\n> 寫滿了藍色的憂鬱\n\n> 也許深愛更不容易在一起\n\n> 分別都這麼難\n\n> 深愛該怎麼辦\n\n> 望著故鄉遠去的方向\n\n> 我深愛的人不知在何方\n\n<br>\n\n> 望鄉的日子啊 是迷失的長信\n\n> 孤單的燕子啊 你要飛去哪裡\n\n> 告白都這麼難 在一起會怎樣\n\n> 都說注定要受傷 莫非這就是成長\n\n> 分別都這麼難 深愛了該怎麼辦\n\n> 望著故鄉遠去的方向\n\n> 我深愛的人已不知在何方\n",
            "url": "https://nocp.space/blog/neither_here_nor_there",
            "title": "陈升新单《望鄉》发布",
            "summary": "《望鄉》為陳昇繼 2017 年《歸鄉》及 2022 年《他鄉》之後，描述鄉的意含三部曲最終篇。此次專輯概念，皆由一個人物、或是一段人生故事譜寫成歌曲。有懷揣著真摯深邃的坦白、有些打趣的幽默感、探討人性與現代文明的矛盾、不失赤子本色的語調操著精湛的說故事方式，將一幅幅充滿畫面感的生活經歷、風景、心境與深情書寫成篇。<br><em>——Youtube官方MV简介</em>",
            "date_modified": "2023-11-26T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/blog_update_2",
            "content_html": "\n\n从上一次更换主题到经典的landscape主题以来，我的个人网站[nin.red](https://nin.red)和**NBlog**已经有很长一段时间没有大变动了。然而，我一直觉得我个人网站的排版和设计都不是那么好看，因此，这次我对我的网站做了一次重大更新。\n\n这次我把整个网站用React和Typescript重写了一遍，布局时主要使用了TailwindCSS，less.js用来辅助布局。我将博客一起整合进了网站内，所以现在[blog.nin.red](https://blog.nin.red)已成为了历史。\n\n原网站的所有内容（包括评论区）现已全部迁移到新网站内。不过唯一一个例外就是百宝箱的评论区，我移除百宝箱评论区其实是觉得没什么必要，也没人会去那里评论，放在那里就是多余。\n\n网站的移动端适配已经做的差不多了，后续会继续优化。网站和博客这次大更新，所以发一篇文章纪念一下。\n",
            "url": "https://nocp.space/blog/blog_update_2",
            "title": "[博客更新] 全面重写整个网站",
            "summary": "我重写了我的个人网站，并将**NBlog**整合进了我的网站",
            "date_modified": "2023-11-11T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/calcium",
            "content_html": "\n\n没错，这就是在那篇[代码日记](/2023/01/18/coding_daily_5/)中讲的那个计算器，经过不断的更新迭代，它现在的功能已经较之前更加齐全与完善了。在这篇博客中，我就详细说明一下它主要的功能。\n\n## Calcium，启动！\n\n访问[https://calcium.js.org](https://calcium.js.org)即可启动Calcium，在这里要感谢[js.org](https://github.com/js-org)为这个项目提供二级域名。\n\n## 基础功能\n\nCalcium支持基础的各种计算，包括括号计算、连式计算、函数计算等。在这个巨大的输入盘上，你就能直接看到它支持的所有函数。\n\n![计算器输入面板](/static/blog/img13.png)\n\n当然，你可以点击输入盘上按钮来输入字符，也可以使用电脑的键盘直接输入。\n\n## 变量存储\n\n在这个输入盘上，你可以看到有一个板块上面有许多的字母，这些字母就是用来存储变量的（除去个别如`π`之类代表常量的字母）。\n\n你可以输入如`a=5`的式子来进行变量存储：\n\n![变量存储](/static/blog/img14.png)\n\nCalcium也支持使用希腊字母来存储变量，你可以通过输入一个希腊字母的名字来输入这个希腊字母。比如，输入`alpha`就会弹出`α`；输入`beta`就会弹出`β`。当然，你无法使用常量字母存储变量。\n\n接着，你就可以在算式中使用这个设定好的字母来代替数字，进行计算。\n\n![变量可用于计算](/static/blog/img15.png)\n\n同时，你也可以点击状态栏上的\"变量\"按钮来查看已设定的所有变量。\n\n![变量列表对话框](/static/blog/img16.png)\n\n## 函数\n\n在输入盘的最左侧，你可以看到Calcium支持的各种函数，下表是这些函数对应的名称和用法。\n\n|函数|名称|用法|\n|---|---|---|\n|$\\sin$|正弦|`f(x)`|\n|$\\cos$|余弦|`f(x)`|\n|$\\tan$|正切|`f(x)`|\n|$\\cot$|余切|`f(x)`|\n|$\\sec$|正割|`f(x)`|\n|$\\csc$|余割|`f(x)`|\n|$\\sin^{-1}$|反正弦|`f(x)`|\n|$\\cos^{-1}$|反余弦|`f(x)`|\n|$\\tan^{-1}$|反正切|`f(x)`|\n|$\\sinh$|双曲正弦|`f(x)`|\n|$\\cosh$|双曲余弦|`f(x)`|\n|$\\tanh$|双曲正切|`f(x)`|\n|$\\coth$|双曲余切|`f(x)`|\n|$\\text{sech}$|双曲正割|`f(x)`|\n|$\\text{csch}$|双曲余割|`f(x)`|\n|$\\ln$|自然对数|`f(x)`|\n|$\\lg$|常用对数|`f(x)`|\n|$\\log_{2}$|以2为底的对数|`f(x)`|\n|$\\exp$|指数函数|`f(x)`|\n|$\\text{stdev}$|标准差|`f(a,b,c,...)`|\n|$\\text{var}$|方差|`f(a,b,c,...)`|\n|$\\text{stdevp}$|标准偏差|`f(a,b,c,...)`|\n|$\\deg$|弧度转角度|`f(rad)`|\n|$\\text{rad}$|角度转弧度|`f(deg)`|\n|$\\min$|最小值|`f(a,b,c,...)`|\n|$\\max$|最大值|`f(a,b,c,...)`|\n|$\\text{median}$|中位数|`f(a,b,c,...)`|\n|$\\text{count}$|数量|`f(a,b,c,...)`|\n|$\\text{total}$|总和|`f(a,b,c,...)`|\n|$\\text{mean}$|平均值|`f(a,b,c,...)`|\n|$\\text{floor}$|向下取整|`f(x)`|\n|$\\text{round}$|四舍五入|`f(x)`|\n|$\\text{nPr}$|排列|`f(n,r)`|\n|$\\text{nCr}$|组合|`f(n,r)`|\n|$\\text{rand}$|随机数|`f(min,max)`|\n\n你可以直接输入一个函数的拼写来输入这个函数。\n\n同时，你也可以点击状态栏上的\"函数\"按钮，来查看Calcium支持的所有函数。\n\n![函数列表对话框](/static/blog/img17.png)\n\n## 高级计算\n\nCalcium还支持一些高级计算，如求和、积分等。对于这类计算，你无法通过键盘直接输入，只能点击输入盘上的按钮来进行输入。\n\n比如输入 $\\sum_{i=0}^{100}$ ：\n\n![高级计算对话框](/static/blog/img18.png)\n\n下表是Calcium支持的高级计算功能。\n\n|功能|名称|\n|---|---|\n|$$\\sum_{i=m}^{n} k$$|求和|\n|$$\\int_{a}^{b} f(x) dx$$|积分|\n|$$\\prod_{i=m}^{n} k$$|求积|\n\n## 函数图像绘制\n\n你可以点击侧边栏来进入**函数图像模式**。\n\n![函数输入](/static/blog/img19.png)\n\n接下来，你就可以在侧边栏输入函数式，绘制函数图像了。\n\n![函数图像绘制](/static/blog/img20.png)\n\n你可以通过鼠标来拖拽和缩放图像，也可以点击状态栏中的\"重载\"来重新加载图像渲染程序。\n\n![重载按钮](/static/blog/img21.png)\n\n如果你想截取并下载图像，可以点击状态栏中的\"捕捉图像\"；如果你想删除函数图像，可以点击对应函数右侧的叉叉。\n\n## 程序员模式\n\n你可以点击侧边栏来进入**程序员模式**。这个模式下的计算器可以进行多个进制的换算与计算，包括**十六进制**、**十进制**、**八进制**、**二进制**。\n\n![程序员模式](/static/blog/img22.png)\n\n同时，它也支持进行逻辑运算与移位运算。\n\n## 移动端\n\nCalcium在支持电脑端的同时也适配了移动端，你可以使用手机浏览器或微信、QQ访问[https://calcium.js.org](https://calcium.js.org)来使用Calcium。\n\n移动端下的Calcium由于移动端的种种限制，阉割掉了部分功能，但其他功能是和电脑端同步的，可以正常使用。\n\n<img src=\"/static/blog/img23.jpg\" width=\"300\"/>\n\n## 写在最后\n\n感谢你使用**Calcium**！如果你在使用时发现问题，可以通过[Issue](https://github.com/nocpiun/calcium/issues/new/choose)、[邮件](mailto:nriot233@gmail.com)向我反馈\n\n如果你喜欢这个项目，别忘了去[项目仓库](https://github.com/nocpiun/calcium)给个Star，或者可以[打赏](https://nocp.space/#/donate)支持一下我，感谢！\n",
            "url": "https://nocp.space/blog/calcium",
            "title": "我开发了一款计算器 (Calcium 使用手册)",
            "summary": "为了更好地写数学作业，我开发了这款基于网页的Calcium计算器",
            "image": "/static/blog/calcium.png",
            "date_modified": "2023-09-01T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/mc_free_play",
            "content_html": "\n\n0. **首先，你需要有一台电脑，系统最好是Windows 10以上或MacOS系统。**\n\n1. **安装Java环境**（即JDK 17）\n\n点击下面的链接直接下载安装包：\n\n- Windows: [https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.msi](https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.msi)\n- MacOS: [https://download.oracle.com/java/17/latest/jdk-17_macos-x64_bin.dmg](https://download.oracle.com/java/17/latest/jdk-17_macos-x64_bin.dmg)\n- Linux: [https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz](https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz)\n\n下载有时需要较长时间，下载完后一般双击即可安装。\n\n2. **安装HMCL启动器**\n\n点击下面的链接直接下载：\n\n[https://hmcl.huangyuhui.net/download/](https://hmcl.huangyuhui.net/download/)\n\n3. **在任意位置（如桌面）创建一个文件夹，并将刚刚下载好的HMCL启动器exe文件拖入文件夹，并双击运行。**\n\n4. **点击“账户”**\n\n![点击“账户”](/static/blog/img8.png)\n\n5. **点击“离线模式”**\n\n![点击“离线模式”](/static/blog/img9.png)\n\n6. **输入你的游戏角色名称，点击“登录”即可。**\n\n![添加账户](/static/blog/img10.png)\n\n7. **之后在“下载”处自行下载所需的游戏版本后即可开始游玩。**\n\n![进入“下载”界面](/static/blog/img11.png)\n\n![选择对应版本进行下载](/static/blog/img12.png)\n",
            "url": "https://nocp.space/blog/mc_free_play",
            "title": "论如何免费的游玩离线Minecraft",
            "summary": "免费游玩离线Minecraft教程",
            "date_modified": "2023-07-07T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/ferrum_got_2nd_prize",
            "content_html": "\n\n[上一次](/2023/02/01/ferrum_take_part_in_competition/)我提到我去参加了一个软件创新的比赛。这几天，这个比赛终于有消息了，而我在这次比赛中获得了二等奖。\n\n明年还有一次参赛的机会，所以我在暑假计划开一个新坑，这样明年就可以拿这个作品去参赛了。这个新坑是一个肉鸽(rogue)小游戏，名字就叫PixelWarrior，就是像素战士。现在的进度只是将主界面大致做了一下，暑假再正式动工。\n\n[PixelWarrior Github仓库](https://github.com/nocpiun/PixelWarrior)\n",
            "url": "https://nocp.space/blog/ferrum_got_2nd_prize",
            "title": "Ferrum文件管理器荣获软件创新大赛二等奖",
            "summary": "上次我去参加的软件创新比赛得奖了！",
            "date_modified": "2023-07-01T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/trigonometric_func_conclusions",
            "content_html": "\n\n做题推导出的一些小结论, 之后可能会继续更新.\n\n## 1. $\\frac{1}{\\cos^2\\alpha}-1=\\tan^2\\alpha$\n\n$$\\tan\\alpha=\\frac{\\sin\\alpha}{\\cos\\alpha}$$\n\n$$\\tan^2\\alpha+1=\\frac{\\sin^2\\alpha}{\\cos^2\\alpha}+1$$\n\n$$\\tan^2\\alpha+1=\\frac{\\sin^2\\alpha+\\cos^2\\alpha}{\\cos^2\\alpha}$$\n\n$$\\frac{1}{\\cos^2\\alpha}-1=\\tan^2\\alpha$$\n\n## 2. $\\tan(\\frac{\\pi}{4}+\\alpha)=\\pm\\sqrt{\\frac{1+\\sin2\\alpha}{1-\\sin2\\alpha}}$\n\n$$\\tan(\\frac{\\pi}{4}+\\alpha)$$\n\n$$=\\frac{\\sin(\\frac{\\pi}{4}+\\alpha)}{\\cos(\\frac{\\pi}{4}+\\alpha)}$$\n\n$$=\\frac{\\cos\\alpha+\\sin\\alpha}{\\cos\\alpha-\\sin\\alpha}$$\n\n$$=\\pm\\sqrt{\\frac{(\\cos\\alpha+\\sin\\alpha)^2}{(\\cos\\alpha-\\sin\\alpha)^2}}$$\n\n$$=\\pm\\sqrt{\\frac{1+2\\cos\\alpha\\sin\\alpha}{1-2\\cos\\alpha\\sin\\alpha}}$$\n\n$$=\\pm\\sqrt{\\frac{1+\\sin2\\alpha}{1-\\sin2\\alpha}}$$\n\n## 3. $a\\sin\\theta+b\\cos\\theta=\\sqrt{a^2+b^2}\\sin(\\theta+\\phi)$, 其中 $\\tan\\phi=\\frac{b}{a}$\n\n设角 $\\phi$, 令\n\n$$\\tan\\phi=\\frac{b}{a}$$\n\n则有\n\n$$a\\sin\\theta+b\\cos\\theta$$\n\n$$=\\sqrt{a^2+b^2}(\\frac{a}{\\sqrt{a^2+b^2}}\\sin\\theta+\\frac{b}{\\sqrt{a^2+b^2}}\\cos\\theta)$$\n\n$$=\\sqrt{a^2+b^2}(\\cos\\phi\\sin\\theta+\\sin\\phi\\cos\\theta)$$\n\n$$=\\sqrt{a^2+b^2}\\sin(\\theta+\\phi)$$\n",
            "url": "https://nocp.space/blog/trigonometric_func_conclusions",
            "title": "自己推导的三角函数二级结论",
            "summary": "之前做题有推导出一些小结论, 就以此记录一下吧",
            "date_modified": "2023-02-11T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/prove_helens_formula",
            "content_html": "\n\n很早就想尝试了, 今天就来挑战一下吧!\n\n### 什么是海伦公式?\n\n设平面内有一个三角形ABC, 其三边边长分别为a、b、c, 则该三角形的面积可以由下面的公式求得:\n\n$$S=\\sqrt{p(p-a)(p-b)(p-c)}$$\n\n其中, p为三角形周长的一半, 即\n\n$$p=\\frac{a+b+c}{2}$$\n\n### 证明\n\n设平面内有一个三角形ABC, 其三边边长分别为AB=a、BC=b、AC=c\n\n作AD⊥BC, 设AD=h, CD=x\n\n由勾股定理, 得\n\n$$c^2-x^2=h^2$$\n\n$$BD=\\sqrt{a^2-h^2}$$\n\n因为\n\n$$b-BD=CD=x$$\n\n所以\n\n$$x=b-\\sqrt{a^2-h^2}$$\n\n$$b-x=\\sqrt{a^2-h^2}$$\n\n$$b^2-2bx+x^2=a^2-h^2$$\n\n得\n\n$$h^2=a^2-b^2+2bx-x^2$$\n\n又因为\n\n$$h^2=c^2-x^2$$\n\n所以\n\n$$a^2-b^2+2bx-x^2=c^2-x^2$$\n\n$$a^2-b^2+2bx=c^2$$\n\n$$2bx=c^2-a^2+b^2$$\n\n得\n\n$$x=\\frac{c^2-a^2+b^2}{2b}$$\n\n将其代入 $h^2=c^2-x^2$ 中, 得\n\n$$h=\\sqrt{c^2-(\\frac{c^2-a^2+b^2}{2b})^2}$$\n\n接着, 由三角形面积公式, 得\n\n$$S=\\frac{1}{2}b\\sqrt{c^2-(\\frac{c^2-a^2+b^2}{2b})^2}$$\n\n化简:\n\n$$S=\\sqrt{\\frac{b^2}{4}(c+\\frac{c^2-a^2+b^2}{2b})(c-\\frac{c^2-a^2+b^2}{2b})}$$\n\n$$=\\sqrt{\\frac{b^2}{4}(\\frac{2cb+c^2-a^2+b^2}{2b})(\\frac{2cb-c^2+a^2-b^2}{2b})}$$\n\n$$=\\sqrt{\\frac{b^2}{4}[\\frac{(b+c)^2-a^2}{2b}][\\frac{a^2-(b-c)^2}{2b}]}$$\n\n$$=\\sqrt{\\frac{1}{4}\\times\\frac{(b+c+a)(b+c-a)}{2}\\times\\frac{(a+b-c)(a-b+c)}{2}}$$\n\n$$=\\sqrt{\\frac{a+b+c}{2}\\times\\frac{b+c-a}{2}\\times\\frac{a+b-c}{2}\\times\\frac{a-b+c}{2}}$$\n\n$$=\\sqrt{\\frac{a+b+c}{2}\\times\\frac{a+b+c-2a}{2}\\times\\frac{a+b+c-2c}{2}\\times\\frac{a+b+c-2b}{2}}$$\n\n$$=\\sqrt{\\frac{a+b+c}{2}\\times(\\frac{a+b+c}{2}-a)(\\frac{a+b+c}{2}-c)(\\frac{a+b+c}{2}-b)}$$\n\n即\n\n$$S=\\sqrt{p(p-a)(p-b)(p-c)}$$\n\n其中\n\n$$p=\\frac{a+b+c}{2}$$\n\n证毕.\n",
            "url": "https://nocp.space/blog/prove_helens_formula",
            "title": "证明海伦公式",
            "summary": "很早就想尝试了, 今天就来挑战一下吧!",
            "date_modified": "2023-02-04T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/ferrum_take_part_in_competition",
            "content_html": "\n\n我在2021年的时候创建了Ferrum文件管理器的项目, 起初做这个是为了方便给我[自己DIY的服务器](/2021/08/15/phone_server/)管理文件的. 那个~~旧手机~~服务器虽说有安装了MT管理器, 但如果要管理文件, 就得特意把它拿过来操作, 如果要用电脑来操作文件, 还得开启FTP远程管理, 而且每次要操作文件都得手动开一次, 其实也挺麻烦的. 所以说就有了这个项目.\n\n在编写Ferrum这个项目的时候, 我学会了React框架的基本使用方法, 学会了如何更好地规划代码的文件结构, 学会了如何提高代码的可读性(也许没有提高太多, 但总体还是有的), 同时也为现在我正在编写的[Calcium Calculator](/2023/01/18/coding_daily_5/)做好了充足的准备.\n\n加入学校的社团之后, 社团中的社长说有一个软件创新的比赛活动, 名字还挺长, 叫做\"全国师生信息素养提升实践活动\". 我了解了之后觉得Ferrum就非常适合去参加这个活动, 就去找信息老师询问参加活动的事, 最后成功参加了这个比赛. 结果是要在5、6月份才会出来, 也不知道能不能拿奖, 说不定只拿了个安慰奖呢?\n",
            "url": "https://nocp.space/blog/ferrum_take_part_in_competition",
            "title": "Ferrum文件管理器参加了一个软件创新比赛活动!",
            "summary": "学校社团说有这样的一个大型比赛活动, 于是我就去参加了, 不知结果如何",
            "date_modified": "2023-02-01T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/new_lunar_year_2023",
            "content_html": "\n\n2023新春快乐, 兔年大吉~\n\n> *图源: [人民日报](https://mp.weixin.qq.com/s/Wc4zRts-KU1o1FHYHqgu6Q)*\n",
            "url": "https://nocp.space/blog/new_lunar_year_2023",
            "title": "NBlog, 2023新年好!",
            "image": "/static/blog/new_lunar_year_2023.jpg",
            "date_modified": "2023-01-21T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_5",
            "content_html": "\n\nFerrum Explorer的开发暂时告一段落, 这下我又不知道下一个项目写什么了. 有一天, 我突然想到, 下一个项目可以是一个**多功能计算器**!\n\n## 开启新项目\n\n接下来就是用`create-react-app`搭建一个React+Typescript的新项目. 因为计算器的英文是\"calculator\", 钙的英文是\"calcium\", 它们的前四个字母相同, 所以我就将\"Calcium\"作为项目的名称.\n\n项目有了, 接下来就构思整个app的功能和页面的布局.\n\n#### 功能\n\n在功能方面, 我计划做三个模式: 通用模式、函数图像模式、程序员模式\n\n#### 布局\n\n在布局方面, 我打算参考VSCode, 做一个像下图一样的布局.\n\n![布局设计](/static/blog/img3.png)\n\n在最左侧的那条较窄的侧边栏中放三个模式的切换按钮, 在左侧较宽的侧边栏中放历史记录列表, 在右侧上部放输出栏, 在右侧下部放输入栏.\n\n## 制作模式按钮图标\n\n原本我是打算在[Google Fonts](https://fonts.google.com/icons?selected=Material+Icons)里找图标的, 但是找了一圈发现根本就没有符合我想法的图标, 于是我就自己用矢量图软件Ai画了几个.\n\n## 通用模式\n\n通用模式的开发还是比较顺利的. 大致的开发过程是: `输入栏 > 输出栏 (包括输入框) > 算式编译执行器 > 历史记录栏`\n\n#### 输入栏\n\n输入栏比较简单, 它无非就是几列几排的按钮, 难点在于如何使它正确布局.\n\n我这里使用**flex布局模式**. 将整个输入栏分成4大块: 一块是**数学函数类**, 一块是**常用类**, 一块是**变量或常量字符类**, 还有一块放版本号.\n\n![输入栏](/static/blog/img4.png)\n\n接着, 将每一排看作一个整体, 将整个输入栏再次分为11排, 每一排再用flex将每一个按钮放好, 中间的空格用单独的`<div>`占位, 较大的按钮(如上图的\"%\"和\"Result\")用css中的`flex-grow`来控制宽度.\n\n![输入栏布局方式](/static/blog/img5.png)\n\n#### 输出栏\n\n输出栏比较复杂. 我将它分为输入框与输出框两部分, 虽说是输出栏, 但是它既包括输入也包括输出. 由于原生HTML的输入框不是很友好, 因此我不得不自己做一个自制版的`<input type=\"text\">`, 所以我说输出栏是比较复杂的.\n\n输出栏的布局如图:\n\n![输出栏布局方式](/static/blog/img6.png)\n\n输入框的每一个字符都由一个单独的`<span>`来包裹, 如果遇到像\"sin\"之类的整体, 则将这个整体直接包进`<span>`即可, 这样一来才便于编译执行器解析. 如图所示:\n\n![输入框布局方式](/static/blog/img7.png)\n\n输出框就比较简单了, 将结果直接输出来就可以.\n\n#### 算式编译执行器\n\n这个编译执行器我觉得对我来说是最难的部分, 我将它单独存在[`Compiler.tsx`](https://github.com/nocpiun/calcium/blob/main/src/utils/Compiler.tsx)文件中.\n\n它大致的原理就是将输入框传来的算式(为字符串数组, 数组中每一个元素都是一个单独的符号)进行遍历, 识别每一个字符, 并将它存入编译后的数字列表与运算符号列表; 如果遇到括号, 就将整个括号内的内容单独存储, 然后运用递归来完成括号内的编译; 如果遇到函数, 就向函数列表中查找对应的函数, 然后进行计算.\n\n编译完成后就是执行. 执行的部分按照我们小学就学过的\"先乘除, 后加减\"的原则, 同时遍历数字列表与运算符号列表, 然后进行计算(此时括号内的算式已被转换为算式的结果).\n\n#### 历史记录栏\n\n历史记录栏是最简单的部分, 只需要监听输出框的输出, 然后将输出的内容连同输入的式子存入历史记录中并显示出来即可.\n\n## 函数图像模式\n\n函数图像模式的开发涉及到`<canvas>`上下文的调用与渲染, 然而这玩意性能比较差, 于是出了很多超出我现有水平的问题, 以至于我无法解决.\n\n#### 遇到的问题\n\n就在我以为函数图像模式的开发如此顺利的时候, 我发现仅需要2~3个函数图像就可以让整个`<canvas>`的画面非常卡顿, 于是我打算通过Javascript的新特性`Service Worker`来解决这个问题.\n\n但当我实装了Worker之后, 我发现它渲染出来的函数图像会不断闪烁, 并且渲染某些函数图像的时候会渲染错误, 这就太令人匪夷所思了. 最后归根到底还是我的水平太低, 以及`<canvas>`性能太差...\n\n于是乎, 整个开发进度就卡在这里了...\n\n## 总结\n\n没啥好说, 项目先搁置了, 咕咕咕~\n\n项目已经部署在: [calcium.js.org](https://calcium.js.org)\n",
            "url": "https://nocp.space/blog/coding_daily_5",
            "title": "[代码日记] 手写多功能计算器! (未完工+难题)",
            "summary": "最近用React写了一个多功能计算器, 但是还未完工, 而且遇到了难以解决的难题",
            "image": "/static/blog/coding_daily_5.png",
            "date_modified": "2023-01-18T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/im_back",
            "content_html": "\n\n最近这几个月我一直没有更新我的博客, 因为我在准备考试. 现在是考试结束一周之后, 发篇博客纪念一下.\n\n我这几天给[nocp.space](https://nocp.space)和[Ferrum Explorer](https://github.com/NriotHrreion/ferrum)做了一些更新, 有兴趣可以看看.\n\n这或许有些突兀, 但我还是要宣传一下 **HYCDGX** 这个Minecraft服务器. 这个服务器经常无人在线, 因此很适合当作云端存档来玩. 它里面有生存世界和创造世界, 以及其他玩家留下的大型或小型建筑, 最近又新开了个生存世界. **服务器IP: mc.hycdgx.com, 版本: 1.19及以下**.\n",
            "url": "https://nocp.space/blog/im_back",
            "title": "中考结束, 我回来了!",
            "summary": "总算结束了...",
            "date_modified": "2022-07-06T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_4",
            "content_html": "\n\nWebpack和Babel这两个工具非常好用, 但是要用好还是有点难度的. 于是我做了个`nriot-utils`给我自己.\n\n为了完成它, 我专门跟着官网的教程走了一遍, 顺便还装了`ts-loader`来加载Typescript代码.\n\n虽然`nriot-utils`非常简单, 只有那几个功能, 但是在对Webpack的配置上我还是花了很多时间. 你可以在这个博客的任何一个地方打开浏览器Devtools, 然后输入`NUtils`, 就可以尝试`nriot-utils`了（因为博客引入了它）\n\n![控制台中的NUtils](/static/blog/img1.png)\n\n## 安装 & 使用\n\n```cmd\nnpm i nriot-utils --save\n```\n\n```js\nconst { NUtils } = require(\"nriot-utils\");\n\n// 获取随机数\nNUtils.getRandom();\n// 删除数组中的某一项\nNUtils.arrayItemDelete([1, 2, 3], 2); // [1, 2]\n// 将数组中某一项移到最后一位\nNUtils.arrayItemToLast([1, 2, 3], 0); // [2, 3, 1]\n// 对比两个对象是否相同\nNUtils.isObjectEqual({a: 1}, {a: 1}); // true\n// 睡觉\nNUtils.sleep(1000); // Sleep for 1000ms (1s)\n\n// 调用WASM (wasm变量中存储的是test.wasm中导出的函数)\nconst fs = require(\"fs\");\n(async function() {\n    var wasm = await new NUtils.WASM(fs.readFileSync(\"test.wasm\")).getWASMInstance();\n    // ...\n})();\n```\n",
            "url": "https://nocp.space/blog/coding_daily_4",
            "title": "[代码日记] 上手实践webpack、babel",
            "summary": "为了实践webpack、 babel等模块的配置, 我给自己写了一个utils",
            "date_modified": "2022-04-17T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_3",
            "content_html": "\n\n在我朋友画好幽灵的贴图之后, 我就开始动工了. 在我的想法中, 幽灵应该要追着玩家跑, 至于要怎么追, 那就得为幽灵设计一个它专属的AI了.\n\n这个幽灵的AI能控制幽灵的移动. 我让它先获取蛇头的坐标, 再获取幽灵自己的坐标, 然后通过比较x轴与y轴来确定相对的位置, 最后才来决定要转哪个方向.\n\n但测试后, 我发现它跟得太紧了, 游戏难度大大增加, 那要怎么办呢?\n\n我是这么做的: 在幽灵移动之前, 抽取随机数(-1, 0, 1), 加在幽灵要移动到的坐标上, 以此打乱幽灵的路径.\n\n这样一来, 幽灵也就更像幽灵了, 游戏趣味大增.\n",
            "url": "https://nocp.space/blog/coding_daily_3",
            "title": "[代码日记] 在游戏中为实体写一个AI",
            "summary": "最近我写了一个贪吃蛇游戏, 我会把我觉得有意思的东西添加到游戏中.<br>这次我打算在里面添加幽灵.",
            "date_modified": "2021-12-05T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/why_copper_golem_is_better_than_allay",
            "content_html": "\n\n10月16号晚上，Minecraft Live在全球直播。每年的Minecraft Live都会有投票，这次也不例外，参与投票的生物是怒目怪、轻灵和铜傀儡。\n\n网上有许多人认为，轻灵才是这三个生物中的最佳选项，以至于在官方宣传片中，大片大片的弹幕都刷着轻灵的名字，更有甚者还会攻击其他的生物。轻灵是一个像恼鬼一样可以在空中飞舞的生物，它全身尽是蓝色，背上还有一对小翅膀。轻灵可以被音符盒发出的声音所召唤，给它一件东西，它还能帮你收集出更多这样的东西给你。或许是因为它的这个能力，网上有近半数的人都觉得这个生物是最好的。\n\n值得肯定的是，轻灵确实很可爱，而且可以帮你找出指定的物品。但官方设计这个生物也是会考虑到它的游戏平衡性的，因此，这项能力也有所限制。\n\n首先，它不能破坏方块、开箱子，找出指定的物品。试想一下，如果你给了你的轻灵一颗钻石，然后它就去帮你挖钻石、开宝箱，不久便弄到了一大堆。这么一想似乎还挺好的，但你想过这么做之后你还需要去挖矿吗？这个游戏的核心玩法就是挖矿，如果不用挖矿，那这个游戏还有灵魂吗？玩家还需要劳动吗？有句俗话说：“百行业为先，万恶懒为首”，如果你成天不努力，只靠着你的轻灵给你送钻石，那你玩这个游戏还有什么意义？在这个游戏中，玩家的本业便是挖矿。失去了挖矿，游戏便不再有可玩性了。那这么说，它收集物品的能力就是假的了？不是的，它只能收集以掉落物形式存在的物品。\n\n其次，它还只能收集一定范围内的指定物品。这么看来，它就只能替你捡起你身边的掉落物了。或许在某些场景下，这个功能是有一定用处的，但在原版生存的情况下，我认为这么做就没有多大意义了。如果你想要捡起周围的树苗掉落物，你不直接去捡，而是叫轻灵帮你去捡，这岂不是脱裤子放屁——多此一举？\n\n所以说，如果Mojang官方不给它添加别的功能，那么它除了当宠物，其实也没什么大用了。那铜傀儡怎么样呢？为什么支持铜傀儡呢？\n\n铜傀儡也是一个很耐看的生物，它有“正常”和“生锈”两种状态。正常情况下，它全身呈铜金色；生锈时，呈铜绿色。它头顶有一个小天线，身材矮矮胖胖的，会随时间推移而逐渐变为生锈状态。同样的，它也有一个能力，就是随机点击周围的铜按钮。\n\n有人说：不就是随便点周围的铜按钮吗，这能有什么用啊？如果你是这么想的，那你就大错特错了！它最关键的能力，便是这“随机”二字，按照这个思路，如果铜按钮下有红石机关或者命令方块，那么便可以实现一定的随机性功能，如：抽奖箱、随机分配等等。又有人说：要实现这个功能，以前的特性就足够了，哪还需要铜傀儡？是的，没有铜傀儡也是可以实现随机的，但是实现的方法很复杂，有的利用了投掷器的投掷角度偏移，有的利用了计分板的UUID，还有的利用了随机玩家选择器“@r”。但奈何这些方法都比较复杂，如果没用一定的基础，会比较难理解（这里不针对指令老玩家）。如果有铜傀儡的话，那么这个逻辑就变得简单多了：只需要在在一堆铜按钮中放一个铜傀儡，按钮下放一些要执行的指令方块，这样不就行了？\n\n而且，就外观设计来看，铜傀儡是要比轻灵好看得多的。轻灵像恼鬼一样飘来飘去的，配色也与周围环境的颜色格格不入，会显得格外突兀——想想：一片绿色中有一点蓝色，这样会好看吗？而铜傀儡的颜色能和周围的颜色很好地相处，不会有其他碍眼的地方。生锈的铜傀儡也很有摆设的价值，它放在墙壁的架子上再合适不过了，甚至还会有些古老的艺术气息。\n\n铜傀儡的能力或许没有那么强大，但在我看来，轻灵的功能才是最无用的。大多投票给轻灵的人有很多都是因为懒得收集材料、物品、矿物才投的，却没有考虑到这个生物的实际功能作用。官方添加这个生物或许只是想增添游戏性，而不是给玩家在游戏中偷懒用的。如果你连在游戏里都会偷懒，那么你在生活中也或多或少会有些懒惰的想法或行为。\n\n写这篇文章，目的不仅是想说铜傀儡比轻灵更好的原因，还有一点是想告诫那些懒惰的人们：懒惰，是靠不住的！\n",
            "url": "https://nocp.space/blog/why_copper_golem_is_better_than_allay",
            "title": "为什么铜傀儡比轻灵更好？",
            "summary": "Minecraft Live 投票过后的一些对于铜傀儡和轻灵的看法.<br>这是一篇小文章, 也是我第一次在博客里面发超过1000字的东西.<br><br><em>未经允许, 可以转载, 但需标明原作者(就是我, NriotHrreion)</em>",
            "image": "/static/blog/why_copper_golem_is_better_than_allay.png",
            "date_modified": "2021-10-23T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_2",
            "content_html": "\n\n上一篇代码日记里, 有个人来提了一个[issue](https://github.com/nodejs/nodejs.org/issues/4167), 反馈了网站内深色模式下跳转页面闪烁的问题.\n\n于是我迅速提交了一个修复这个bug的PR, 不久之后就被合并了.\n\n在Github中, Pull Request里其实也藏着挺多东西的:\n\n首先, 提交PR前你需要先Fork然后下载源码. 这里要用`git clone https://github.com/your_name/repo_name`指令下载源码, 因为这么做的话系统会自动生成`.git`文件夹, 方便后面的提交操作.\n\n接着, 修改源码, 通过`git push`提交代码.\n\n然后在Github进入你Fork到的仓库中, 此时你应该能看到你刚刚提交的东西(如果没看到, 那你应该好好检查一下上面的步骤), 点击Pull Requests, 创建一个新的PR即可.\n\n最后你就可以在官方仓库的Pull Requests里看到你提交的PR了.\n\n顺带一提, 提交了PR之后你首先要等的是reviewer来审核通过你的代码, 最后才能被合并. **还有, 不要提交错误或者垃圾PR, 这样会浪费reviewer们的时间!!**\n",
            "url": "https://nocp.space/blog/coding_daily_2",
            "title": "[代码日记] PR经历记录",
            "summary": "上一篇代码日记里, 有个人来提了一个issue, 反馈了网站内深色模式下跳转页面闪烁的问题.<br><br>于是我迅速提交了一个修复这个bug的PR, 不久之后就被合并了.",
            "date_modified": "2021-10-15T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/coding_daily_1",
            "content_html": "\n\n网站链接: [nodejs.org](https://nodejs.org)\n\n最近我在Github上给nodejs.org的网站源码提了一个[Pull Request](https://github.com/nodejs/nodejs.org/pull/4139), 大致内容是添加网页深色模式. 所以你如果在浏览器开启了深色模式, 那么你访问nodejs.org时就能看到我添加的样式.\n\n我发出PR之后, 很快就有管理员来审核. PR合并之后, 他们还有人来帮优化我原本写的样式.\n\n就在昨天, 有个人来这里提了一个[issue](https://github.com/nodejs/nodejs.org/issues/4167), 说切换到深色模式之后, 网站内跳转页面时会闪烁一下.\n\n于是我把这个bug修复, 并重新提了一个[Pull Request](https://github.com/nodejs/nodejs.org/pull/4174).\n\n修复这个bug的思路是: 想办法让那段深色模式的js脚本在css加载之前被加载.\n\n我具体这么做: 新建一个js文件, 把切换深色模式的脚本写进去, 而原本写那段脚本的地方留下一些必须要在css和dom加载之后才执行的代码(添加点击事件之类的), 最后在`<head>`标签中添加这个新js的引入.\n",
            "url": "https://nocp.space/blog/coding_daily_1",
            "title": "[代码日记] 为nodejs.org网站源码提PR",
            "summary": "网站链接: [nodejs.org](https://nodejs.org)<br><br>最近我在Github上给nodejs.org的网站源码提了一个[Pull Request](https://github.com/nodejs/nodejs.org/pull/4139), 大致内容是添加网页深色模式. 所以你如果在浏览器开启了深色模式, 那么你访问nodejs.org时就能看到我添加的样式.",
            "date_modified": "2021-10-12T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/blog_update_1",
            "content_html": "\n\n**NBlog** 主题换回了经典的默认主题: landscape\n\n这个主题说实话其实很耐看, 我以前用的那个主题我现在看感觉挺丑的. 感觉换来换去还是默认的好看啊!!\n\n在这基础上进行了一些小小的修改, 发个博客纪念一下.\n",
            "url": "https://nocp.space/blog/blog_update_1",
            "title": "[博客更新] 博客已更换主题至经典landscape",
            "date_modified": "2021-10-09T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/icraft_post_3",
            "content_html": "\n\n今天又对ICraft做了一些小更新.\n\n首先是游戏内的快捷键, 快捷键功能本来很早就想做的, 但因为各种原因拖到了现在才做.\n\n其次是游戏内左上角的那个图标. 那里原本是用于显示存档的图标的, 但是我觉得没什么用, 于是就用ICraft的图标稍微改一下, 替换了上去.\n\n最后是\"检查更新\"的功能. 我以前在关于页面放了一个\"检查更新\"的链接, 链接的地址是到[ICraft的Releases列表](https://github.com/NriotHrreion/ICraft-App/releases). 现在我觉得这个\"检查更新\"就应该点击之后直接检查, 而不是让用户自己手动去检查.\n\n我通过调用Github API来实现\"检查更新\"的功能. Github API中, 可以查询一个仓库的Releases列表, 于是我就调用这个API, 获取列表的第一个值, 并且用当前的版本号与这个值的版本号作比较, 以此实现这个功能.\n\n以上就是这次的改动.\n",
            "url": "https://nocp.space/blog/icraft_post_3",
            "title": "ICraft开发日志-3",
            "summary": "今天又对ICraft做了一些小更新.",
            "date_modified": "2021-09-18T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/yinbing_website_bug",
            "content_html": "\n\n这篇文章叙述了我在我偶然发现的一个反mc论坛网站中发现bug的过程.\n\n最近刷B站的时候看到了一个反mc的人发的视频, 点进去他的主页看到他开了一个网站: [https://yinbing.space](https://yinbing.space)\n\n于是我心情激动地就点了进去, 没想到在那个网站注册和登录的时候发生了一些奇怪的事情.\n\n在我登录账号的时候, 点击登录按钮便会提示\"网络错误\", 重新试过几次都是这样, 所以我就抱着试试的心态打开了`devtools`.\n\n下好断点, 调试了几次之后, 我终于发现了问题之所在!\n\n原来是他的源码中, 发起了一个xhr post请求, 而这个请求发送过去之后收到了一个错误的responseText.\n\n这个responseText里面是json格式的, 但是在最后结尾的地方漏掉了一个大括号, 于是导致了报错.\n\n至于为什么会报\"网络错误\", 是因为在那个xhr对象的onload函数里面, 有一个try catch语句, try语句中使用了`JSON.parse`来将那个responseText转换为`object`形式. 但恰好那个responseText有格式错误, 所以执行了catch语句中的代码.\n\n**这个错误的根源或许在服务端中, 服务端给客户端代码返回了一个错误的东西而导致它报错. 要想修复它, 最好的办法就是在服务端中好好地找一找有没有什么地方是错的.**\n",
            "url": "https://nocp.space/blog/yinbing_website_bug",
            "title": "发现某反mc网站的bug",
            "summary": "这篇文章叙述了我在我偶然发现的一个反mc论坛网站中发现bug的过程.",
            "date_modified": "2021-08-26T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/icraft_post_2",
            "content_html": "\n\n今天修复了多人游戏中玩家移动卡顿的问题, 这个问题的产生是因为玩家移动时, 客户端与服务端一起更新了玩家的位置, 但不是同时更新的, 导致客户端更新之后, 服务端才发来更新的信号, 便导致玩家移动时一卡一卡的.\n\n**Deed**是我的朋友, 他参与了ICraft的测试工作. 今天我把我最新开发好的源码拿给他调试的时候, 他那里弹出了一条ERR:\n\n`Error: Can't find module 'nriot-logger'`\n\n我看了之后, 发现这是在package.json的模块列表中没有`nriot-logger`这一项, 这是由于我在下载这个模块的时候没有在命令后面写上`--save`导致的. 不过之后我马上就在列表里把漏掉的这项给加上了.\n\n游戏界面的nav条上有显示**当前方块**一项, 但之前我只让它显示方块名称, 而实际上在玩的时候, 看名称其实是没办法一下反应过来是什么方块的. 因此我让它在那个位置显示当前方块的贴图, 便轻松地解决了这个非常不好的问题.\n\n游戏界面我做了很大的更改, 但仍然有许多问题, 如果你有什么建议或者问题, 可以在[ICraft-App Repo的issues](https://github.com/NriotHrreion/ICraft-App/issues)里面提出来.\n\n接下来, 我在游戏中添加了昼夜更新(daynight), 其实这个更新我自己觉得没那么好, 但是以我的水平似乎也只能这样了...... 还是要继续努力啊!\n",
            "url": "https://nocp.space/blog/icraft_post_2",
            "title": "ICraft开发日志-2",
            "summary": "今天修复了多人游戏中玩家移动卡顿的问题, 这个问题的产生是因为玩家移动时, 客户端与服务端一起更新了玩家的位置, 但不是同时更新的, 导致客户端更新之后, 服务端才发来更新的信号, 便导致玩家移动时一卡一卡的.",
            "date_modified": "2021-08-17T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/icraft_post_1",
            "content_html": "\n\n今天把上次没有修改好的“多人游戏中, 玩家角色贴图错误”问题.\n\n之前多人游戏玩家显示的bug也被修复了, 因为我在客户端脚本中没有正确处理服务端发来的信号, 而导致玩家列表中会出现重复的玩家对象, 才导致了这个bug的产生.\n\n为了修复这个bug, 我在客户端脚本中接收服务端信号的部分稍做了修改, 在原本接收服务器玩家列表的部分添加了一句“清空本地玩家列表数据”, 以此避免列表中出现重复对象.\n\n接下来, 我还修复了玩家退出服务器后没有保存坐标位置的bug.\n\n这个bug要修复其实很简单, 只需要在playerMove事件中添加坐标信息存储, 以及在服务端中添加玩家坐标信息存储即可.\n\n**在此之后, 我每天如果有对ICraft源码做出改动的话, 都会发布一条开发日志的.**\n",
            "url": "https://nocp.space/blog/icraft_post_1",
            "title": "ICraft开发日志-1",
            "summary": "今天把上次没有修改好的“多人游戏中, 玩家角色贴图错误”问题.<br><br><b>在此之后, 我每天如果有对ICraft源码做出改动的话, 都会发布一条开发日志的.</b>",
            "date_modified": "2021-08-16T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/phone_server",
            "content_html": "\n\n最近, 我找到了家里的一台旧手机, 于是就产生了一些奇妙的想法...\n\n由于Android手机是基于Linux开发的, 所以只要有方法, 就可以把手机当作服务器来使用.\n\n那该如何做呢?\n\n我先在手机上下载了**Termux**, 这款应用是一款终端应用, 可以通过它和一些Linux指令来进行更深的操作.\n\n打开Termux, 看到的是一个黑乎乎的界面, 接下来配置一下ssh远程连接, 就可以用电脑更方便地操作这台手机了.\n\n```sh\n# 下载openssh软件包\npkg install openssh\n# 启动ssh服务\nsshd\n# 检查是否启动ssh服务, 如果列表里有ssh的话, 就是开启了\nps -e | grep ssh\n# 查看ip地址(为接下来的远程连接做准备)\nifconfig\n```\n\n接着, 在电脑里的cmd窗口中输入: `ssh root@{刚刚看到的ip地址} -p 8022`\n\n这样, 就在电脑上连接并登录上了手机的终端了.\n\n下一步要安装java环境.\n\n安装java环境有两种方式, 一种是直接用**wget**获取jdk, 另一种是用pkg指令下载安装java软件包, 我选择了后者:\n\n```sh\npkg install openjdk-17\n```\n\n接下来, 就是下载MC服务端了. 我在官网下载了1.17版本的服务端jar包, 下载好之后简单配置了一下. 然后输入下面的指令来启动服务器:\n\n```sh\njava -Xmx2048M -Xms2048M -jar server.jar nogui\n```\n\n上面的命令中, 我给MC服务端分配了2GB的运行内存, 如果你想要让更多玩家一起来玩你的服务器, 那你可以自己调大这个数字(即命令中的`Xmx2048`和`Xms2048`).\n\n为了让其他玩家加入服务器, 你还需要一个公网IP或者是一个内网穿透工具. 因为我没有公网IP, 所以我果断选择了后者.\n\n> 我在这里使用了[Sakurafrp](https://natfrp.com), 如果你实在找不到合适的内网穿透工具, 不妨试试它\n\n最后, 打开Minecraft, 进入服务器, 就可以和朋友一起玩了.\n\n~~这也代表着一台旧手机重获了新生~~\n",
            "url": "https://nocp.space/blog/phone_server",
            "title": "在旧手机上部署MC服务器",
            "summary": "最近, 我找到了家里的一台旧手机, 于是就产生了一些奇妙的想法…<br><br>这篇文章记述了我改造旧手机的过程.",
            "image": "/static/blog/phone_server.jpg",
            "date_modified": "2021-08-14T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/function-painting",
            "content_html": "\n\n这是一个漂亮的函数图像生成器\n\n你可以去 [这里](https://nocp.space/using/function-painting/) 看看\n\n或者去这个项目的 [Github仓库](https://github.com/NriotHrreion/Function-painting) 看看\n\n## 使用\n\n简单地说, 这个生成器的使用方法非常简单\n\n你可以在输入框中输入你要生成的函数, 然后点击生成即可\n\n如果你想要保存某个函数, 你可以直接在书签栏中添加:\n\n`https://nocp.space/using/function-painting/?fx={你想添加的函数}`\n",
            "url": "https://nocp.space/blog/function-painting",
            "title": "函数图像生成器",
            "summary": "一个漂亮的函数图像生成器 By me",
            "date_modified": "2021-04-03T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/console-game",
            "content_html": "\n\n这是一个很粗糙控制台游戏.\n\n如果你好奇这个游戏的操作原理, 那么你可以去这个工程的 [Github仓库](https://github.com/NriotHrreion/Console-game) 看看, 或者继续往下看.\n\n## 原理\n\n在源代码 **lib.js** 中, 你可以在 `setCommand()` 方法中找到下面的代码:\n\n```javascript\n// command 是要设置的指令名称\n// func 要执行的指令程序\nsetCommand(command, func) {\n    window[command] = command; // 将指令名称设为全局变量\n    Object.defineProperty(window, command, { // 设置 getter\n        get: func,\n        enumerable: true\n    });\n}\n```\n\n**代码解释**\n\n将要设置的指令定义为全局变量, 接着为这个全局变量设置getter.\n\n这样, 当你在控制台输入指令时, getter便会执行刚刚设置的程序.\n",
            "url": "https://nocp.space/blog/console-game",
            "title": "一个控制台小游戏",
            "date_modified": "2020-09-23T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/startpage",
            "content_html": "\n\nNocp-startpage 是一个新标签页插件, 可以使你的Chrome新标签页更加简洁美观.\n\n## 预览\n\nDemo: [查看demo](https://nriothrreion.github.io/Nocp-startpage/demo/nstart.html)\n\n## 下载\n\n* [代码库](https://github.com/NriotHrreion/Nocp-startpage)\n* [最新版本](https://github.com/NriotHrreion/Nocp-startpage/releases)\n* [旧版本](https://github.com/NriotHrreion/tools/releases)\n\n## 许可\n\n[Apache-2.0](https://github.com/NriotHrreion/Nocp-startpage/LICENSE)",
            "url": "https://nocp.space/blog/startpage",
            "title": "Nocp-startpage",
            "image": "/static/blog/img2.png",
            "date_modified": "2020-07-31T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        },
        {
            "id": "https://nocp.space/blog/new",
            "content_html": "\n\n**NBlog** 已正式开启，欢迎！\n\n~~话说这已经不是我第一次开博客了吧....awa~~\n",
            "url": "https://nocp.space/blog/new",
            "title": "新博客正式开启",
            "date_modified": "2020-07-08T00:00:00.000Z",
            "author": {
                "name": "NriotHrreion"
            }
        }
    ]
}