From 3db85006cc5e7b05fe544ef9ff88e20b08ed2e92 Mon Sep 17 00:00:00 2001 From: Chlorine Date: Sat, 10 May 2025 14:02:07 +0800 Subject: [PATCH] INIT (I swear I will never re-init this repo again) --- .gitattributes | 4 + .gitignore | 8 + .gitmodules | 3 + .rehyperc | 13 + Justfile | 10 + LICENCE.md | 437 +++++++++++++ README.md | 60 ++ README.zh-CN.md | 60 ++ assets/css/custom.css | 0 bun.lock | 415 ++++++++++++ content/about.md | 216 +++++++ content/announcement.md | 1 + content/links.md | 108 ++++ content/now.md | 98 +++ ...estival Greeting:Embracing and Rebirth.md | 40 ++ content/posts/announcements/一周年快乐.md | 20 + content/posts/announcements/博客迁移通知.md | 21 + .../posts/announcements/唔,博客 100 天了.md | 16 + .../posts/announcements/孩子们,我回来了!.md | 20 + .../announcements/孩子们,我回来了!(2).md | 18 + content/posts/announcements/警告!.md | 19 + .../岁时录/Ephemeralis-Weekly(10):方寸之外.md | 212 ++++++ .../岁时录/Ephemeralis-Weekly(11):案几之上.md | 247 +++++++ .../岁时录/Ephemeralis-Weekly(12):浮沫之下.md | 258 ++++++++ .../Ephemeralis-Weekly(13):生活的起伏.md | 262 ++++++++ .../Ephemeralis-Weekly(14):泡沫箱里的宣纸.md | 307 +++++++++ .../岁时录/Ephemeralis-Weekly(1):总要启程.md | 180 ++++++ .../岁时录/Ephemeralis-Weekly(2):生日快乐.md | 90 +++ .../岁时录/Ephemeralis-Weekly(3):执笔衔书.md | 138 ++++ .../岁时录/Ephemeralis-Weekly(4):缝隙之间.md | 133 ++++ .../岁时录/Ephemeralis-Weekly(5):只是去做.md | 178 ++++++ .../岁时录/Ephemeralis-Weekly(6):无可热爱.md | 196 ++++++ .../岁时录/Ephemeralis-Weekly(7):唯有时光.md | 244 +++++++ .../岁时录/Ephemeralis-Weekly(8):七日漫谈.md | 249 ++++++++ .../岁时录/Ephemeralis-Weekly(9):寒露清秋.md | 273 ++++++++ content/posts/人间世/岁时录/岁时录(十七).md | 257 ++++++++ content/posts/人间世/岁时录/岁时录(十九).md | 265 ++++++++ content/posts/人间世/岁时录/岁时录(十五).md | 223 +++++++ content/posts/人间世/岁时录/岁时录(十八).md | 299 +++++++++ content/posts/人间世/岁时录/岁时录(十六).md | 506 +++++++++++++++ content/posts/其他/Farewell,Omnivore.md | 109 ++++ content/posts/其他/收集一些最近发现的网站.md | 173 +++++ content/posts/其他/新域名.md | 40 ++ content/posts/其他/新域名(2).md | 27 + content/posts/其他/新域名(3).md | 36 ++ .../其他/申请 Notion 教育账户的一点事.md | 61 ++ content/posts/其他/离散数学——Bell数.md | 82 +++ content/posts/四方行纪:重庆.md | 441 +++++++++++++ .../posts/图灵机/macOS配置GPG签名Git提交.md | 170 +++++ .../动手折腾:用SSH解决Oh-my-Zsh的更新错误.md | 54 ++ content/posts/图灵机/升级系统那点事.md | 129 ++++ .../如何在不懂CSS的情况下魔改Typora主题.md | 497 +++++++++++++++ content/posts/图灵机/服务器除虫日志.md | 59 ++ content/posts/图灵机/瞎折腾MinGW.md | 172 +++++ .../图灵机/解决UnoCSS更新后的奇怪报错.md | 247 +++++++ content/posts/沉思录/Obsidian与开源.md | 265 ++++++++ content/posts/沉思录/小氯,Chlorine抑或我.md | 220 +++++++ content/posts/沉思录/有用与有趣之间.md | 68 ++ content/posts/百草园/DGP:重新出发.md | 437 +++++++++++++ .../Hugo博客link更改后如何修改Twikoo评论位置.md | 84 +++ .../Hugo博客迁移日志/Hugo博客迁移日志(1).md | 46 ++ .../Hugo博客迁移日志/Hugo博客迁移日志(2).md | 539 ++++++++++++++++ .../Hugo博客迁移日志/Hugo博客迁移日志(3).md | 71 +++ .../Hugo博客迁移日志/Hugo博客迁移日志(4).md | 493 ++++++++++++++ content/posts/百草园/Markdown图片管理实践.md | 603 ++++++++++++++++++ .../Obsidian+Hugo建站教程:0-前言.md | 114 ++++ .../Obsidian+Hugo建站教程:1-Markdown,Obsidian与图床.md | 130 ++++ ...+Hugo建站教程:2-博客系统,域名,托管服务,DNS解析.md | 306 +++++++++ content/posts/百草园/Twikoo更新惊魂.md | 89 +++ content/posts/百草园/咦,我的按钮呢?.md | 103 +++ content/posts/百草园/园子装修日志.md | 231 +++++++ content/posts/百草园/园子装修日志(2).md | 327 ++++++++++ .../在Hugo博客中正确渲染多行数学公式.md | 140 ++++ .../如何为NotionNext Hexo主题添加文章封面图.md | 135 ++++ .../posts/百草园/独立博客选什么域名后缀?.md | 143 +++++ .../理想乡构筑手记(1):Hello,Hermeneutics.md | 132 ++++ .../理想乡构筑手记(2):Hello,Céfiro.md | 227 +++++++ .../理想乡构筑手记(3):Hello,Nieve.md | 311 +++++++++ .../理想乡构筑手记(4):新的域名及一些杂谈.md | 289 +++++++++ .../解决Swup导致的JavaScript加载失效问题.md | 129 ++++ content/posts/百草园/近期折腾简记.md | 295 +++++++++ content/posts/逍遥游/Hello,Aria2.md | 243 +++++++ content/posts/逍遥游/Hello,Forgejo.md | 234 +++++++ content/posts/逍遥游/Hello,Quail.md | 244 +++++++ content/posts/逍遥游/Hello,Rime.md | 178 ++++++ content/posts/逍遥游/Hello,SearXNG.md | 182 ++++++ content/posts/逍遥游/Hello,Shiki.md | 218 +++++++ content/posts/逍遥游/Hello,Sink.md | 104 +++ content/posts/逍遥游/Hello,VSCodium.md | 162 +++++ content/posts/逍遥游/Hello,iTerm2.md | 184 ++++++ .../逍遥游/我把Vaultwarden主密码搞丢了.md | 98 +++ data/internal/friends-techstack.json | 0 data/internal/friends.json | 252 ++++++++ hugo.toml | 245 +++++++ layouts/shortcodes/friends-techstack.html | 0 netlify.toml | 9 + package.json | 10 + scripts/random-room.py | 12 + static/.well-known/avatar | 4 + static/favicon.svg | 1 + static/img/avatar.webp | Bin 0 -> 299060 bytes static/img/default-cover.webp | Bin 0 -> 153958 bytes static/robots.txt | 194 ++++++ themes/hermeneutics | 1 + vercel.json | 24 + 105 files changed, 16927 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .rehyperc create mode 100644 Justfile create mode 100644 LICENCE.md create mode 100644 README.md create mode 100644 README.zh-CN.md create mode 100644 assets/css/custom.css create mode 100644 bun.lock create mode 100755 content/about.md create mode 100644 content/announcement.md create mode 100644 content/links.md create mode 100644 content/now.md create mode 100755 content/posts/announcements/Spring Festival Greeting:Embracing and Rebirth.md create mode 100644 content/posts/announcements/一周年快乐.md create mode 100755 content/posts/announcements/博客迁移通知.md create mode 100755 content/posts/announcements/唔,博客 100 天了.md create mode 100644 content/posts/announcements/孩子们,我回来了!.md create mode 100644 content/posts/announcements/孩子们,我回来了!(2).md create mode 100644 content/posts/announcements/警告!.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(10):方寸之外.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(11):案几之上.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(12):浮沫之下.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(13):生活的起伏.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(14):泡沫箱里的宣纸.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(1):总要启程.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(2):生日快乐.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(3):执笔衔书.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(4):缝隙之间.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(5):只是去做.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(6):无可热爱.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(7):唯有时光.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(8):七日漫谈.md create mode 100644 content/posts/人间世/岁时录/Ephemeralis-Weekly(9):寒露清秋.md create mode 100644 content/posts/人间世/岁时录/岁时录(十七).md create mode 100644 content/posts/人间世/岁时录/岁时录(十九).md create mode 100644 content/posts/人间世/岁时录/岁时录(十五).md create mode 100644 content/posts/人间世/岁时录/岁时录(十八).md create mode 100644 content/posts/人间世/岁时录/岁时录(十六).md create mode 100644 content/posts/其他/Farewell,Omnivore.md create mode 100755 content/posts/其他/收集一些最近发现的网站.md create mode 100644 content/posts/其他/新域名.md create mode 100644 content/posts/其他/新域名(2).md create mode 100644 content/posts/其他/新域名(3).md create mode 100755 content/posts/其他/申请 Notion 教育账户的一点事.md create mode 100644 content/posts/其他/离散数学——Bell数.md create mode 100644 content/posts/四方行纪:重庆.md create mode 100644 content/posts/图灵机/macOS配置GPG签名Git提交.md create mode 100644 content/posts/图灵机/动手折腾:用SSH解决Oh-my-Zsh的更新错误.md create mode 100644 content/posts/图灵机/升级系统那点事.md create mode 100755 content/posts/图灵机/如何在不懂CSS的情况下魔改Typora主题.md create mode 100644 content/posts/图灵机/服务器除虫日志.md create mode 100644 content/posts/图灵机/瞎折腾MinGW.md create mode 100644 content/posts/图灵机/解决UnoCSS更新后的奇怪报错.md create mode 100644 content/posts/沉思录/Obsidian与开源.md create mode 100644 content/posts/沉思录/小氯,Chlorine抑或我.md create mode 100644 content/posts/沉思录/有用与有趣之间.md create mode 100644 content/posts/百草园/DGP:重新出发.md create mode 100755 content/posts/百草园/Hugo博客link更改后如何修改Twikoo评论位置.md create mode 100644 content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(1).md create mode 100644 content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(2).md create mode 100644 content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(3).md create mode 100644 content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(4).md create mode 100755 content/posts/百草园/Markdown图片管理实践.md create mode 100755 content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:0-前言.md create mode 100755 content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:1-Markdown,Obsidian与图床.md create mode 100755 content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:2-博客系统,域名,托管服务,DNS解析.md create mode 100644 content/posts/百草园/Twikoo更新惊魂.md create mode 100644 content/posts/百草园/咦,我的按钮呢?.md create mode 100644 content/posts/百草园/园子装修日志.md create mode 100644 content/posts/百草园/园子装修日志(2).md create mode 100755 content/posts/百草园/在Hugo博客中正确渲染多行数学公式.md create mode 100755 content/posts/百草园/如何为NotionNext Hexo主题添加文章封面图.md create mode 100755 content/posts/百草园/独立博客选什么域名后缀?.md create mode 100644 content/posts/百草园/理想乡构筑手记/理想乡构筑手记(1):Hello,Hermeneutics.md create mode 100644 content/posts/百草园/理想乡构筑手记/理想乡构筑手记(2):Hello,Céfiro.md create mode 100644 content/posts/百草园/理想乡构筑手记/理想乡构筑手记(3):Hello,Nieve.md create mode 100644 content/posts/百草园/理想乡构筑手记/理想乡构筑手记(4):新的域名及一些杂谈.md create mode 100644 content/posts/百草园/解决Swup导致的JavaScript加载失效问题.md create mode 100644 content/posts/百草园/近期折腾简记.md create mode 100644 content/posts/逍遥游/Hello,Aria2.md create mode 100644 content/posts/逍遥游/Hello,Forgejo.md create mode 100644 content/posts/逍遥游/Hello,Quail.md create mode 100644 content/posts/逍遥游/Hello,Rime.md create mode 100644 content/posts/逍遥游/Hello,SearXNG.md create mode 100644 content/posts/逍遥游/Hello,Shiki.md create mode 100644 content/posts/逍遥游/Hello,Sink.md create mode 100755 content/posts/逍遥游/Hello,VSCodium.md create mode 100644 content/posts/逍遥游/Hello,iTerm2.md create mode 100644 content/posts/逍遥游/我把Vaultwarden主密码搞丢了.md create mode 100644 data/internal/friends-techstack.json create mode 100644 data/internal/friends.json create mode 100644 hugo.toml create mode 100644 layouts/shortcodes/friends-techstack.html create mode 100644 netlify.toml create mode 100644 package.json create mode 100644 scripts/random-room.py create mode 100644 static/.well-known/avatar create mode 100644 static/favicon.svg create mode 100644 static/img/avatar.webp create mode 100644 static/img/default-cover.webp create mode 100644 static/robots.txt create mode 160000 themes/hermeneutics create mode 100644 vercel.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a410a78 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.md linguist-vendored=false +*.md linguist-generated=false +*.md linguist-documentation=false +*.md linguist-detectable=true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..092fd46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +node_modules +public +resources +.hugo_build.lock +content/_drafts +.netlify +.vercel diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..180384e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/hermeneutics"] + path = themes/hermeneutics + url = https://codeberg.org/chlorine/hugo-theme-hermeneutics.git diff --git a/.rehyperc b/.rehyperc new file mode 100644 index 0000000..c94190d --- /dev/null +++ b/.rehyperc @@ -0,0 +1,13 @@ +{ + "plugins": [ + [ + "@shikijs/rehype", + { + "themes": { + "light": "one-light", + "dark": "one-dark-pro" + } + } + ] + ] +} \ No newline at end of file diff --git a/Justfile b/Justfile new file mode 100644 index 0000000..7d2c7c3 --- /dev/null +++ b/Justfile @@ -0,0 +1,10 @@ +dev: + hugo server --buildFuture --tlsAuto + +build: + hugo --gc --minify + bun run shiki || true + +update: + git submodule update + bun update \ No newline at end of file diff --git a/LICENCE.md b/LICENCE.md new file mode 100644 index 0000000..cbe5ad1 --- /dev/null +++ b/LICENCE.md @@ -0,0 +1,437 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f5f9684 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +

+ + Hugo + + + Theme: Hermeneutics + +

+ +

+ + Codeberg + + + Forgejo + + + Netlify + + + Cloudflare R2 + + + jsDelivr + +

+ +📘 This README is also available in [Simplified Chinese / 简体中文](./README.zh-CN.md). + +This repository contains the complete source code for my personal blog [Garden of Outlier](https://chlor.me), fully open-sourced on Codeberg and my personal [Forgejo](https://forgejo.org) instance, [MoeForge](https://foss.moe). + +## 🛠 Tech Stack + +- Framework: [Hugo](https://gohugo.io) +- Theme: [Hermeneutics](https://codeberg.org/chlorine/hugo-theme-hermeneutics) +- Source Hosting: [Codeberg](https://codeberg.org/chlorine/blog) and [Forgejo](https://foss.moe/chlorine/blog) +- Comment System: [Artalk](https://artalk.js.org) +- DNS: [Cloudflare](https://www.cloudflare.com/) +- Hosting: [Netlify](https://www.netlify.com/) +- Backup Hosting: [Vercel](https://www.vercel.com/) and [Cloudflare Pages](https://pages.cloudflare.com/) +- Image Hosting: [Cloudflare R2](https://www.cloudflare.com/developer-platform/products/r2/) +- Static CDN: [jsDelivr](https://www.jsdelivr.com/) and mirrors + +## ⚖️ License & Copyright + +### 💻 Code + +The source code of the Hermeneutics theme is licensed under the MIT License. See the full [LICENSE](https://codeberg.org/chlorine/hugo-theme-hermeneutics/src/branch/main/LICENSE) file for details. + +All other code snippets in this blog, unless otherwise specified, are also released under the MIT License. + +### 📝 Content + +All written content under the `content` directory is distributed under the [CC-BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) license. + +### 🖼️ Images + +- Images owned by me are distributed under the same license as the `content`. +- Images sourced from the internet are still being reviewed. All rights belong to their original creators. +- For AI-generated content (e.g. [my avatar](./static/img/avatar.webp)), due to the ambiguous nature of AI copyrights, I cannot guarantee ownership. I disclaim responsibility for any copyright issues arising from their use. Please evaluate the risk yourself. If you believe your copyrighted content has been used, feel free to contact me. \ No newline at end of file diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..7f29019 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,60 @@ +

+ + Hugo + + + Theme: Hermeneutics + +

+ +

+ + Codeberg + + + Forgejo + + + Netlify + + + Cloudflare R2 + + + jsDelivr + +

+ +📘 本 README 文件也提供 [英语 / English](./README.md) 版本。 + +这里是我的个人博客 [Garden of Outlier](https://chlor.me) 的全部源码,完全开源于 Codeberg 和我的个人 [Forgejo](https://forgejo.org) 实例,[MoeForge](https://foss.moe)。 + +## 🛠 技术栈 + +- 框架:[Hugo](https://gohugo.io) +- 主题:[Hermeneutics](https://codeberg.org/chlorine/hugo-theme-hermeneutics) +- 源代码托管:[Codeberg](https://codeberg.org/chlorine/blog) 和 [Forgejo](https://foss.moe/chlorine/blog) +- 评论系统:[Artalk](https://artalk.js.org) +- DNS:[CloudFlare](https://www.cloudflare.com/) +- 托管:[Netlify](https://www.netlify.com/) +- 备份托管:[Vercel](https://www.vercel.com/) 和 [Cloudflare Pages](https://pages.cloudflare.com/) +- 图床:[Cloudflare R2](https://www.cloudflare.com/developer-platform/products/r2/) +- 静态资源加速:[jsDelivr](https://www.jsdelivr.com/) 及其镜像 + +## ⚖️ 开源协议与版权归属 + +### 💻 代码 + +Hermeneutics 主题的源码依照 MIT 协议开源,请在[这里](https://codeberg.org/chlorine/hugo-theme-hermeneutics/src/branch/main/LICENSE)查看完整的 LICENSE 文件。 + +对于博客中涉及的其他代码性质片段,如无特殊说明,同样按照 MIT 协议开源。 + +### 📝 内容 + +`content` 下的所有文字内容依照 [CC-BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans) 协议分发。 + +### 🖼️ 图像 + +- 对于我拥有版权的图片,依照与 `content` 一致的协议分发。 +- 对于网络图片,目前我还在整理其来源,版权归属于原作者。 +- 对于 AI 生成图片(如[我的头像](./static/img/avatar.webp)),由于其版权归属的不明确性,我无法保证该头像的版权归属,也无法对因使用该头像而产生的任何版权纠纷承担责任。使用者应自行评估风险,并对自己的行为负责。如果您认为您拥有其中某图片的版权并对我如此使用该图片有异议,请联系我。 \ No newline at end of file diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..e69de29 diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..a118864 --- /dev/null +++ b/bun.lock @@ -0,0 +1,415 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "dependencies": { + "@shikijs/rehype": "^1.29.2", + "rehype-cli": "^12.0.1", + "shiki": "^1.29.2", + }, + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.26.2", "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@npmcli/config": ["@npmcli/config@8.3.4", "https://registry.npmmirror.com/@npmcli/config/-/config-8.3.4.tgz", { "dependencies": { "@npmcli/map-workspaces": "^3.0.2", "@npmcli/package-json": "^5.1.1", "ci-info": "^4.0.0", "ini": "^4.1.2", "nopt": "^7.2.1", "proc-log": "^4.2.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" } }, "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw=="], + + "@npmcli/git": ["@npmcli/git@5.0.8", "https://registry.npmmirror.com/@npmcli/git/-/git-5.0.8.tgz", { "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^4.0.0" } }, "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ=="], + + "@npmcli/map-workspaces": ["@npmcli/map-workspaces@3.0.6", "https://registry.npmmirror.com/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", { "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0", "read-package-json-fast": "^3.0.0" } }, "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA=="], + + "@npmcli/name-from-folder": ["@npmcli/name-from-folder@2.0.0", "https://registry.npmmirror.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", {}, "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg=="], + + "@npmcli/package-json": ["@npmcli/package-json@5.2.1", "https://registry.npmmirror.com/@npmcli/package-json/-/package-json-5.2.1.tgz", { "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "proc-log": "^4.0.0", "semver": "^7.5.3" } }, "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ=="], + + "@npmcli/promise-spawn": ["@npmcli/promise-spawn@7.0.2", "https://registry.npmmirror.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", { "dependencies": { "which": "^4.0.0" } }, "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@shikijs/core": ["@shikijs/core@1.29.2", "https://registry.npmmirror.com/@shikijs/core/-/core-1.29.2.tgz", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@1.29.2", "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1" } }, "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA=="], + + "@shikijs/langs": ["@shikijs/langs@1.29.2", "https://registry.npmmirror.com/@shikijs/langs/-/langs-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ=="], + + "@shikijs/rehype": ["@shikijs/rehype@1.29.2", "https://registry.npmmirror.com/@shikijs/rehype/-/rehype-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "1.29.2", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "sha512-sxi53HZe5XDz0s2UqF+BVN/kgHPMS9l6dcacM4Ra3ZDzCJa5rDGJ+Ukpk4LxdD1+MITBM6hoLbPfGv9StV8a5Q=="], + + "@shikijs/themes": ["@shikijs/themes@1.29.2", "https://registry.npmmirror.com/@shikijs/themes/-/themes-1.29.2.tgz", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g=="], + + "@shikijs/types": ["@shikijs/types@1.29.2", "https://registry.npmmirror.com/@shikijs/types/-/types-1.29.2.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@types/concat-stream": ["@types/concat-stream@2.0.3", "https://registry.npmmirror.com/@types/concat-stream/-/concat-stream-2.0.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ=="], + + "@types/debug": ["@types/debug@4.1.12", "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/hast": ["@types/hast@3.0.4", "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/is-empty": ["@types/is-empty@1.2.3", "https://registry.npmmirror.com/@types/is-empty/-/is-empty-1.2.3.tgz", {}, "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw=="], + + "@types/mdast": ["@types/mdast@4.0.4", "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/ms": ["@types/ms@2.1.0", "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.13.5", "https://registry.npmmirror.com/@types/node/-/node-22.13.5.tgz", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg=="], + + "@types/supports-color": ["@types/supports-color@8.1.3", "https://registry.npmmirror.com/@types/supports-color/-/supports-color-8.1.3.tgz", {}, "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg=="], + + "@types/text-table": ["@types/text-table@0.2.5", "https://registry.npmmirror.com/@types/text-table/-/text-table-0.2.5.tgz", {}, "sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA=="], + + "@types/unist": ["@types/unist@3.0.3", "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "abbrev": ["abbrev@2.0.0", "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], + + "ansi-regex": ["ansi-regex@6.1.0", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "ansi-styles": ["ansi-styles@6.2.1", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "anymatch": ["anymatch@3.1.3", "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "bail": ["bail@2.0.2", "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "binary-extensions": ["binary-extensions@2.3.0", "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "brace-expansion": ["brace-expansion@2.0.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer-from": ["buffer-from@1.1.2", "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "ccount": ["ccount@2.0.1", "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@5.4.1", "https://registry.npmmirror.com/chalk/-/chalk-5.4.1.tgz", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "ci-info": ["ci-info@4.1.0", "https://registry.npmmirror.com/ci-info/-/ci-info-4.1.0.tgz", {}, "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A=="], + + "color-convert": ["color-convert@2.0.1", "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "concat-stream": ["concat-stream@2.0.0", "https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="], + + "cross-spawn": ["cross-spawn@7.0.6", "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "debug": ["debug@4.4.0", "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "dequal": ["dequal@2.0.3", "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "devlop": ["devlop@1.1.0", "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "emoji-regex": ["emoji-regex@10.4.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.4.0.tgz", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], + + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "https://registry.npmmirror.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + + "entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "err-code": ["err-code@2.0.3", "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-ex": ["error-ex@1.3.2", "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "extend": ["extend@3.0.2", "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "foreground-child": ["foreground-child@3.3.0", "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.0.tgz", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], + + "fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "glob": ["glob@10.4.5", "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "hast-util-from-html": ["hast-util-from-html@2.0.3", "https://registry.npmmirror.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-string": ["hast-util-to-string@3.0.1", "https://registry.npmmirror.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@9.0.1", "https://registry.npmmirror.com/hastscript/-/hastscript-9.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "hosted-git-info": ["hosted-git-info@7.0.2", "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "html-void-elements": ["html-void-elements@3.0.0", "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "ignore": ["ignore@6.0.2", "https://registry.npmmirror.com/ignore/-/ignore-6.0.2.tgz", {}, "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A=="], + + "import-meta-resolve": ["import-meta-resolve@4.1.0", "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="], + + "inherits": ["inherits@2.0.4", "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@4.1.3", "https://registry.npmmirror.com/ini/-/ini-4.1.3.tgz", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], + + "is-arrayish": ["is-arrayish@0.2.1", "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-empty": ["is-empty@1.2.0", "https://registry.npmmirror.com/is-empty/-/is-empty-1.2.0.tgz", {}, "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w=="], + + "is-extglob": ["is-extglob@2.1.1", "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "isexe": ["isexe@2.0.0", "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@3.4.3", "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "js-tokens": ["js-tokens@4.0.0", "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "json5": ["json5@2.2.3", "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "lines-and-columns": ["lines-and-columns@2.0.4", "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz", {}, "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A=="], + + "load-plugin": ["load-plugin@6.0.3", "https://registry.npmmirror.com/load-plugin/-/load-plugin-6.0.3.tgz", { "dependencies": { "@npmcli/config": "^8.0.0", "import-meta-resolve": "^4.0.0" } }, "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w=="], + + "lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.1", "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz", {}, "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ=="], + + "minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "minimist": ["minimist@1.2.8", "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nopt": ["nopt@7.2.1", "https://registry.npmmirror.com/nopt/-/nopt-7.2.1.tgz", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="], + + "normalize-package-data": ["normalize-package-data@6.0.2", "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], + + "normalize-path": ["normalize-path@3.0.0", "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-install-checks": ["npm-install-checks@6.3.0", "https://registry.npmmirror.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], + + "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], + + "npm-package-arg": ["npm-package-arg@11.0.3", "https://registry.npmmirror.com/npm-package-arg/-/npm-package-arg-11.0.3.tgz", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "npm-pick-manifest": ["npm-pick-manifest@9.1.0", "https://registry.npmmirror.com/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^11.0.0", "semver": "^7.3.5" } }, "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA=="], + + "oniguruma-to-es": ["oniguruma-to-es@2.3.0", "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parse-json": ["parse-json@7.1.1", "https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz", { "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" } }, "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw=="], + + "parse5": ["parse5@7.2.1", "https://registry.npmmirror.com/parse5/-/parse5-7.2.1.tgz", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], + + "path-key": ["path-key@3.1.1", "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@1.11.1", "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "proc-log": ["proc-log@4.2.0", "https://registry.npmmirror.com/proc-log/-/proc-log-4.2.0.tgz", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "promise-inflight": ["promise-inflight@1.0.1", "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + + "promise-retry": ["promise-retry@2.0.1", "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "property-information": ["property-information@7.0.0", "https://registry.npmmirror.com/property-information/-/property-information-7.0.0.tgz", {}, "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg=="], + + "read-package-json-fast": ["read-package-json-fast@3.0.2", "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw=="], + + "readable-stream": ["readable-stream@3.6.2", "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "regex": ["regex@5.1.1", "https://registry.npmmirror.com/regex/-/regex-5.1.1.tgz", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw=="], + + "regex-recursion": ["regex-recursion@5.1.1", "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-5.1.1.tgz", { "dependencies": { "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w=="], + + "regex-utilities": ["regex-utilities@2.3.0", "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rehype": ["rehype@13.0.2", "https://registry.npmmirror.com/rehype/-/rehype-13.0.2.tgz", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], + + "rehype-cli": ["rehype-cli@12.0.1", "https://registry.npmmirror.com/rehype-cli/-/rehype-cli-12.0.1.tgz", { "dependencies": { "import-meta-resolve": "^4.0.0", "rehype": "^13.0.0", "unified-args": "^11.0.0" }, "bin": { "rehype": "cli.js" } }, "sha512-xAvJLB65OzytB27NkkhGBQmByORv7Pt0hR03LbpU2duta1GfOBV63u9RP7v6B1NdIO9L17dQyK99ktM3TjZ1Xw=="], + + "rehype-parse": ["rehype-parse@9.0.1", "https://registry.npmmirror.com/rehype-parse/-/rehype-parse-9.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], + + "rehype-stringify": ["rehype-stringify@10.0.1", "https://registry.npmmirror.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], + + "retry": ["retry@0.12.0", "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "safe-buffer": ["safe-buffer@5.2.1", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "semver": ["semver@7.7.1", "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "shebang-command": ["shebang-command@2.0.0", "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@1.29.2", "https://registry.npmmirror.com/shiki/-/shiki-1.29.2.tgz", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="], + + "signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spdx-correct": ["spdx-correct@3.2.0", "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.21", "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + + "string-width": ["string-width@6.1.0", "https://registry.npmmirror.com/string-width/-/string-width-6.1.0.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^10.2.1", "strip-ansi": "^7.0.1" } }, "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ=="], + + "string-width-cjs": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "stringify-entities": ["stringify-entities@4.0.4", "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@7.1.0", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "supports-color": ["supports-color@9.4.0", "https://registry.npmmirror.com/supports-color/-/supports-color-9.4.0.tgz", {}, "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw=="], + + "text-table": ["text-table@0.2.0", "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "trim-lines": ["trim-lines@3.0.1", "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "type-fest": ["type-fest@3.13.1", "https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], + + "typedarray": ["typedarray@0.0.6", "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "undici-types": ["undici-types@6.20.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "unified": ["unified@11.0.5", "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unified-args": ["unified-args@11.0.1", "https://registry.npmmirror.com/unified-args/-/unified-args-11.0.1.tgz", { "dependencies": { "@types/text-table": "^0.2.0", "chalk": "^5.0.0", "chokidar": "^3.0.0", "comma-separated-tokens": "^2.0.0", "json5": "^2.0.0", "minimist": "^1.0.0", "strip-ansi": "^7.0.0", "text-table": "^0.2.0", "unified-engine": "^11.0.0" } }, "sha512-WEQghE91+0s3xPVs0YW6a5zUduNLjmANswX7YbBfksHNDGMjHxaWCql4SR7c9q0yov/XiIEdk6r/LqfPjaYGcw=="], + + "unified-engine": ["unified-engine@11.2.2", "https://registry.npmmirror.com/unified-engine/-/unified-engine-11.2.2.tgz", { "dependencies": { "@types/concat-stream": "^2.0.0", "@types/debug": "^4.0.0", "@types/is-empty": "^1.0.0", "@types/node": "^22.0.0", "@types/unist": "^3.0.0", "concat-stream": "^2.0.0", "debug": "^4.0.0", "extend": "^3.0.0", "glob": "^10.0.0", "ignore": "^6.0.0", "is-empty": "^1.0.0", "is-plain-obj": "^4.0.0", "load-plugin": "^6.0.0", "parse-json": "^7.0.0", "trough": "^2.0.0", "unist-util-inspect": "^8.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0", "vfile-reporter": "^8.0.0", "vfile-statistics": "^3.0.0", "yaml": "^2.0.0" } }, "sha512-15g/gWE7qQl9tQ3nAEbMd5h9HV1EACtFs6N9xaRBZICoCwnNGbal1kOs++ICf4aiTdItZxU2s/kYWhW7htlqJg=="], + + "unist-util-inspect": ["unist-util-inspect@8.1.0", "https://registry.npmmirror.com/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ=="], + + "unist-util-is": ["unist-util-is@6.0.0", "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "util-deprecate": ["util-deprecate@1.0.2", "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "https://registry.npmmirror.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "vfile": ["vfile@6.0.3", "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "https://registry.npmmirror.com/vfile-location/-/vfile-location-5.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.2", "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.2.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "vfile-reporter": ["vfile-reporter@8.1.1", "https://registry.npmmirror.com/vfile-reporter/-/vfile-reporter-8.1.1.tgz", { "dependencies": { "@types/supports-color": "^8.0.0", "string-width": "^6.0.0", "supports-color": "^9.0.0", "unist-util-stringify-position": "^4.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0", "vfile-sort": "^4.0.0", "vfile-statistics": "^3.0.0" } }, "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g=="], + + "vfile-sort": ["vfile-sort@4.0.0", "https://registry.npmmirror.com/vfile-sort/-/vfile-sort-4.0.0.tgz", { "dependencies": { "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ=="], + + "vfile-statistics": ["vfile-statistics@3.0.0", "https://registry.npmmirror.com/vfile-statistics/-/vfile-statistics-3.0.0.tgz", { "dependencies": { "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w=="], + + "walk-up-path": ["walk-up-path@3.0.1", "https://registry.npmmirror.com/walk-up-path/-/walk-up-path-3.0.1.tgz", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="], + + "web-namespaces": ["web-namespaces@2.0.1", "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "yaml": ["yaml@2.7.0", "https://registry.npmmirror.com/yaml/-/yaml-2.7.0.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="], + + "zwitch": ["zwitch@2.0.4", "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@npmcli/git/which": ["which@4.0.0", "https://registry.npmmirror.com/which/-/which-4.0.0.tgz", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "@npmcli/promise-spawn/which": ["which@4.0.0", "https://registry.npmmirror.com/which/-/which-4.0.0.tgz", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi/string-width": ["string-width@5.1.2", "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@npmcli/git/which/isexe": ["isexe@3.1.1", "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "@npmcli/promise-spawn/which/isexe": ["isexe@3.1.1", "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + } +} diff --git a/content/about.md b/content/about.md new file mode 100755 index 0000000..7082308 --- /dev/null +++ b/content/about.md @@ -0,0 +1,216 @@ +--- +title: 关于 +lastmod: 2025-04-13 +--- + +老友,很高兴您能前来。这里是一座名为「园子」的小岛,茫茫的信息海洋中的一个草木葳蕤的角落。 + +这里是园子的总信息公示板,希望能帮助您更好的了解园子,以及园子的主人(也是 [*Residencia 0x001B*](/links) 的舍长和普通居民)。 + +> [!TIP] +> 如果您感觉口渴,公共空间有茶水和点心,请自取。 + +## 👨‍💻 个人简介 + +### 📄 基本信息 + +这里是 Chlorine,可以叫我小氯,或是其他顺口一点的称呼也无妨。 + +目前旅居地球,就读于某挺不错的大学,专业是某还算不错的交叉学科。如果您好奇是哪个的话……嗯,反正不是霍格沃茨啦。不过我相信,相比于好奇我的背景,我在此处栽培的花草应当会更值得您花去一点闲暇的。 + +我对星座和 MBTI 之类带或者不带神秘色彩的人格分类持保留态度,也并不倾向于用一个或者几个词汇概括自己的意识形态。如果您希望快速地了解小氯是个怎样的人,读这篇 About 或许是个更好的选择。 + +### 📙 个人经历 + +其实也没什么经历可言。一颗小小哒原子,从世界的一个不起眼的角落诞生,走过若干的坎坷和坦途。目前正处在人类口中「最好的年纪」。 + +### 🪄 所爱与厌 + +小氯喜欢的东西有很多:喜欢可口的食物,喜欢甜甜的果茶,喜欢优雅的公式,喜欢精美的软件,喜欢隽永的书籍,喜欢好看的画作,喜欢高精尖的电子产品,喜欢在晴朗的下午在阳光灿烂的公共空间闲坐品茶,喜欢在夏天的晚上在晚风轻拂的操场和朋友们一起唱歌,喜欢世间的一切自由、美好与爱。 + +小氯的情绪大抵还算稳定,也没有什么特别的忌讳。但是小氯的确很难对一些事物有好感,例如 DDL、不洁净、海鲜、昆虫、内卷、容易断墨的笔、几十个 G 的安装包、傲慢、偏见和没有说明文档的代码。当然,若是面对谎言、背叛、贪婪、蔑视、处心积虑、恶意伤害之类,小氯不保证自己不会情绪失控,拿出自己的本体单质请您品尝。 + +### ⛴️ 生命愿望 + +- [ ] 前往曾经最喜欢的高校,Richard Feynman 工作过的 California Institute of Technology 朝圣 +- [ ] 找到一份喜欢的工作 +- [ ] 在现实中拥有一个自己的秘密基地 +- [ ] 成为一位还不错的开发者 +- [ ] 成立一个开源基金会或类似的组织 +- [ ] 以人类的身份,充实而有意义地过完一生 + +### 📬 联系方式 + +- Email(请将 [at] 替换为 @):`hi[at]本站域名`。 +- Telegram: @chlorine3545 +- [Matrix](https://matrix.org) + - 主账号: @chlorine:eigen.im + - 备用账号: @chlorchan:matrix.org + +一些沟通方式的建议: + +- 如果希望发表一些关于小氯、园子或者是园子里的植物的评价或者言论,同时不要求绝对的私人性,使用评论即可。 +- 如果希望有一次比较实时的沟通,可以使用 Matrix。如果您喜欢的话,也可以使用 Telegram,但是请注意,小氯**只接受端到端加密的 Chat**。 +- 其他所有情况,请使用 Email。GPG 加密是被鼓励的,但小氯不一定打得开。 + +### 🔑 OpenPGP Public Key & Fingerprint + +> [!IMPORTANT] +> 小氯已经在 2025-02-19 23:31:15 (UTC+8) 完成了全面的 OpenPGP Refactor,此后很长一段时间内,这个配置应该都不会发生变化了。 + +小氯的 OpenPGP Key Fingerprint 为: + +```txt +6D5B304A9092892A6ABA149D3CA88990BB4FC521 +``` + +以下是相应的 OpenPGP 公钥包,包含了小氯所有的公钥信息。如果您希望给小氯发送一封私密的邮件,可以采用公钥进行加密,以及验证发来的邮件是否是小氯签名后的邮件。 + +```txt +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEZ2kl4hYJKwYBBAHaRw8BAQdAWPUIonMJmDSOdLW+a+OxfZXairDQFfAly5ou +ugtnCe+0FkNobG9yaW5lIDxoaUBjaGxvci5tZT6IlgQTFgoAPgULCQgHAgIiAgYV +CgkICwIEFgIDAQIeBwIXgAIbARYhBG1bMEqQkokqaroUnTyoiZC7T8UhBQJntfD5 +AhkBAAoJEDyoiZC7T8Uh49YBAKIBhy+6eCzwhEg7WtaQFg5v00DYJYgUxz4GbJWd +dzvhAP9uvhjgzadcF6wFUR0rRI5vYjdqoZ1fcRac8K9S0/bcDLQ7Q2hsb3JpbmUg +KERldiBSZWxhdGVkLCBlLmcuIEdpdCBDb21taXQgU2lnbikgPGRldkBjaGxvci5t +ZT6IkwQTFgoAOwIbAQULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBG1bMEqQ +kokqaroUnTyoiZC7T8UhBQJntfD5AAoJEDyoiZC7T8Uhed4A/23YRmJOxeJB03Kr +x/GnCabX7aRbYfpIeXkib7bCr2ERAP4iOSj7i4cvYSmJqjjPISG2ug19LLN5KPJ3 +6HZwFH7MD7g4BGdpJeISCisGAQQBl1UBBQEBB0Bhe/7KQ+dZenK1YyP3r2rq7CIV +1GtmfQU5RpezJuXpBQMBCAeIeAQYFgoAIBYhBG1bMEqQkokqaroUnTyoiZC7T8Uh +BQJnaSXiAhsMAAoJEDyoiZC7T8Uha1YA+wc/Ilweh8Zmat8ZwDt6ESikS2JBXR7u +dWriLL+C4bl3AP0SSm8fBtcTXPfPWSmeXSN44dSgE49a71r5/UjYsnH1B7gzBGe1 +bBQWCSsGAQQB2kcPAQEHQDT/D1A0Dvs0tpmJ7E3v+VBr0be4h3f4SGwsLuxbojfZ +iO8EGBYKACAWIQRtWzBKkJKJKmq6FJ08qImQu0/FIQUCZ7VsFAIbAgCBCRA8qImQ +u0/FIXYgBBkWCgAdFiEEHVV+mjdXC+Ez4mhhWt/MlIuqRzoFAme1bBQACgkQWt/M +lIuqRzpwrgD/W4sAppm4TN5OK1m4zZn9GsrtFhygr2ZOfNVGTfcvAoYBAN8YekhY +9STTN1sWfuK1i6ykHQvzekjSrcV9XPsyctkOFPoA/i83gtUnf+B8X/R/4npVBjVt +Qtei5h+gdbDMol1bQEZ9AP0XSNnVtJx1K8ozes0Ew/+j07IuoqFgfdcVQfL9hSCp +A7gzBGe1cUkWCSsGAQQB2kcPAQEHQMs2Z/ZAQ9hF73q+PO8oIK6X65Kdwa7MUy/W +zuovOIm0iHgEGBYKACAWIQRtWzBKkJKJKmq6FJ08qImQu0/FIQUCZ7VxSQIbIAAK +CRA8qImQu0/FIeWYAQC8Pc+QVUv4UeRMkjJjFusJNCvwT7HuvQOt1xLtFSDxJQD+ +OlTx0rgNbIEeU/QLbZjVAGDhkwBLT2x8HgNzDk5BrAY= +=wkxF +-----END PGP PUBLIC KEY BLOCK----- + +``` + +## 🏠 园子简介 + +### 📜 基本信息 + +这里的完整名字是「Garden of Outlier」,没有中文名字。 + +这里是互联网中一个偏僻而籍籍无名的小岛,是我用日光,热茶和位流建造的秘密花园,是一片原教旨主义的知识旷野,也是一个灵魂的永久栖息地。 + +如果您觉得这个名字比较拗口,可以和小氯一样,叫这里「园子」。 + +### 📚 这里可能有什么 + +这里可能会随机刷新出各种乱七八糟的内容:从新的冒菜口味体验到后量子加密算法为何数学不可破,从坐飞机去看北极熊龇牙到用广义矩估计预测自己的考试成绩,从为什么你应该放弃 GitHub 到如何阻止搜索引擎乱看你的个人信息,从百年战争到底在打什么到瞪眼法求解散点图 Pearson 相关系数,从博客样式优化日志到作为助教我是怎么教学生写功利主义道德观的,从热牛奶的最佳温度探索到 *Manifest der Kommunistischen Partei* 读书笔记…… + +总而言之,咱搞的是通识教育嘛(~~俗称缝合怪~~),什么都会一点(骄傲脸)。 + +*当然,上面的是一个比较完整的设想,小氯目前的知识尚且十不足一。* + +### ❌ 这里不会有什么 + +如上所述,小氯可能在这里讲任何自己感兴趣的事物,但有一件事绝对不会讲:**政治问题**。没别的意思——这个问题很容易引起不必要的争议,而这些争议对推进人类知识的进步帮助有限。我可以保证不越界,但如果您非要断章取义或者自行解读,恕小氯不负责。 + +### 🛠 技术架构 + +园子是一个静态小岛,其底层架构完全开源: + +- 框架:[Hugo](https://gohugo.io) +- 主题:[Hermeneutics](https://codeberg.org/chlorine/hugo-theme-hermeneutics) +- 源代码托管:[Codeberg](https://codeberg.org/chlorine/blog) 和 小氯自己的 [Forgejo](https://foss.moe/chlorine/blog) 实例 +- 评论系统:[Artalk](https://artalk.js.org)。 + +园子的部署和运行基于互联网大善人们提供的免费服务,这里请允许小氯对它们的慷慨致以真诚的谢意。 + +- DNS:[CloudFlare](https://www.cloudflare.com/) +- 托管:[Netlify](https://www.netlify.com/) +- 备份托管:在 [Vercel](https://www.vercel.com/) 和 [Cloudflare Pages](https://pages.cloudflare.com/) 进行了冷运行备份 +- 图床:[Cloudflare R2](https://www.cloudflare.com/developer-platform/products/r2/) +- 静态资源加速:[jsDelivr](https://www.jsdelivr.com/) 及其镜像 + +### 📆 编年史 + +- 过去的历史:园子大致建立于 2023 年末,期间历经了数次各种各样的变更,但由于最近的改版,这部分历史已经被隐去。您可以认为,下面这里就是当今园子的 Genesis。 +- 2024-04-19: 园子的重构初步完成,重新命名为「Garden of Outlier」。 +- 2025-04-21: 得益于持续的探索,园子彻底摆脱了对 GitHub 的依赖,可以使用 Codeberg + Netlify 进行全自动部署。部署平台切换至 Netlify。 + +### ☕ Buy Me A Coffee? + +如果您觉得小氯的文章还不错,希望支持一下园子的发展,那么非常感谢!您可以从以下渠道资助我的博客: + +- 您当地的慈善机构的官方网站 +- 您最喜欢的自由软件的 sponsor 页面 +- 任何其他的比我更需要帮助的人 + +至于为什么不直接请小氯喝咖啡……抱歉哦,小氯的身体不太好,喝不了咖啡 (/ω\) + +Q:不行不行不行我就要请你喝咖啡! + +A:~~应该不会有这么喜欢小氯的读者吧,不会吧不会吧……~~ + +十分感谢您的好意 OωO 如果您有这种想法,烦请您将您的捐赠,以我们共同的署名名义交给下列小氯正在支持的组织之一: + +- [Codeberg e.V.](https://zh-hans.liberapay.com/codeberg/donate) +- [EFF](https://www.eff.org/pages/donate-eff)(电子前哨基金会) + +这样可以帮小氯省下一些费用。 + +## 🤝 用户协议 + +据说,任何一个网站都需要有这部分,但小氯没有去验证这个说法的真假, + +### 📖 版权信息 + +园子的全部文章均按照 [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh) 协议发布。之所以选择这个 CC 协议,是因为比较长,看着很厉害(不是)。 + +小氯不太喜欢自己的文章被转发或者转载,但如果您希望如此做,也可以联系我。 + +至于园子转载的文章……哦,园子不会转载文章。 + +### 🔒 安全政策 + +园子可能包含指向其他小岛(第三方网站)的链接。虽说小氯会尽可能保证链接的质量,但也难以对于每一个链接在每一个时间段做详细的排查。所以决定启程时,还请您多加小心。 + +### 🎙️ 互动规则 + +园子的互动和内容一样,基本没有禁忌。唯一的规则是: + +> **Sine delictis, sine politicis.** + +即是如此。 + +如果您真的想让小氯为难的话……那没办法,我可爱不代表我好欺负。小氯有信心让您的评论在被任何第三个人看到之前就去 `~/.Trash` 养老,也不保证尊重您的被遗忘权。 + +此外,如果您希望自己的发言是理性而令人愉快的,推荐 Občanské fórum 的八条规则。当然,这不是硬性规定。 + +### ℹ️ 隐私政策 + +#### 📈 统计分析 + +园子目前暂未添加任何统计或分析服务。我倒是想添加一个,但不知道用什么。 + +#### 🍪 Cookie 情况 + +园子是严格 Cookie-free 的,因此您可以对这方面完全放心。 + +#### 💬 评论隐私 + +评论的数据托管在小氯的个人 VPS 上,位于~~垃圾王~~ [RackNerd](https://racknerd.com) 的 LA 机房。虽说服务只要和牢美挂边隐私性就很可能值得怀疑,但小氯也没找到更好的方案。小氯想过注册一个 Hetzner,可惜没成功。 + +评论数据会保留(要不然那不叫评论),日志的话,除非系统整个炸掉需要 debug,不然小氯没时间看。 + +数据分享的话,只要您不在评论区搞事,小氯用自己的呆毛发誓不会把您的邮箱之类的信息交给任何第三方。唯一的风险是服务商强行窥探(极小概率,因为这严重违反了服务商的隐私协议),不过小氯的大部分个人项目也托管在上面,出了这种事咱们一起寄(不是)。 + +--- + +讲完了吗?或许就这些吧。如果您听得云里雾里,那也无妨,小氯的语言能力也并不是什么值得自豪的事情。 + +外面的天气多好啊。园子大部分时候都是这样,阳光灿烂,风蓬松而柔软。喝完这杯茶,如果您想接着听一点故事,那咱们不妨去阳台坐一坐;如果您想去看看外面的花草,那小氯陪您一起去走走吧。 diff --git a/content/announcement.md b/content/announcement.md new file mode 100644 index 0000000..8b46273 --- /dev/null +++ b/content/announcement.md @@ -0,0 +1 @@ +园子最近正在经历一次大修,如果访问出现问题还请见谅 (/ω\) \ No newline at end of file diff --git a/content/links.md b/content/links.md new file mode 100644 index 0000000..1d70f0e --- /dev/null +++ b/content/links.md @@ -0,0 +1,108 @@ +--- +title: Residencia 0x001B +date: 2023-12-05 12:00:00 +description: 这是作者的个人博客 「Garden of Outlier」 的友情链接页面,名为「Residencia 0x001B」。作者详细介绍了其申请须知、相关规定等,并在结尾列出了自己目前的友链列表。 +comments: false +--- + +老友,很高兴您能前来。我是 Chlorine(小氯),Garden of Outlier 的长居者和打理人,也是 *Residencia 0x001B* 的舍长和普通居民。如果您想了解更多关于我和园子的事情,请移步[关于](/about)页面。 + +这里是公寓的信息公示板,您可以在这里看到一些简单的介绍,以及如果您希望申请入住,所需要知道和做的事情,以及目前公寓的居民们。 + +## 公寓简介 + +### 基本信息 + +Residencia 0x001B,依然是一个没有中文翻译的名字。同样的,如果您觉得拗口,叫它「公寓」也无妨。~~反正园子里就这一个能住人的地方~~。 + +`0x001B` 是一个数字,您大致可以不必好奇其含义。 + +### 公共空间 + +如果您听小氯讲过了足够多的故事,或许会发现,小氯很喜欢提到「公共空间」。 + +这是公寓每一层都有的一种基础设施,其功能涵盖自习、团建、分享、饮食、发呆和使用阳光进行自我消毒等。小氯很喜欢在公共空间做一点事情,您几乎可以在任何时间在公共空间的某处捉到这只元素娘,然后让他 / 她 / 它给您泡一壶果茶或者讲个故事(如果没有在赶 DDL 的话)。 + +## 申请入住 + +### 申请须知 + +如果您觉得园子还蛮有意思,希望在此时不时小住几日,我非常乐意。不过,**希望您能先花一点时间,认真审阅一下下面的申请须知**。 + +- 您的海岛应至少建立了半个地球年(以自然年计算),且至少种植了十五株您亲自栽培的植物。 +- 请您对您的海岛勤加维护,至少希望小氯前去拜访时,能在距当前日期十一个月十六天内看到您的身影(您大可以不必好奇,为什么偏偏是这个时间长度)。毕竟,我们都不希望在满怀希望地乘舟来访时,只能见到「中庭生旅谷,井上生旅葵」。 +- 希望您能先在您的岛上,为小氯预留一个位置,以便小氯前去拜访时能够有一个落脚之处。我的个人信息可以参考下一个章节。 +- 在您发出申请之前,希望我们之间能先有过一些互动,例如在彼此的海岛上留下足迹或寄送几张明信片。这不是硬性的要求,但的确是一个令人愉快的加分项。 +- 原则上,只接受个人博客类的申请。世界上的海岛有许多,但是每一个都有它们不同的「磁场」。我们希望每一位居民,彼此都是兴趣相投、灵魂相通的「过时、老派、小众」的人或其他生物。 +- 请勿含有非法内容以及其他违反相关规定的内容。在海岛上种植有毒或不讨人喜欢的植物,不仅会伤到自己,也会伤到您的朋友们。 +- 此外,如果您的岛上有一个电子通讯社(RSS),那再好不过了。将来公寓的居民多起来之后,小氯可能会举办一些故事会,电子通讯社可以给我的工作带来很大的方便。当然,这也不是硬性要求。 +- 以上全部须知的最终解释权归园子所有。 + +### 《入住申请表》 + +如果您希望成为公寓居民的一员,烦请您按照以下格式填写《入住申请表》: + +- 我们应该如何称呼您?(昵称) +- 您的联系方式?(邮箱,可选项) +- 您希望以什么形象出现在公寓中?(头像。如果您希望留下小岛的徽章——站标,也没问题) +- 您希望入住哪个房间?(只要是未被选择的都可以,格式如 0108B,1312A 等。您可以选择 01 ~ 15 的楼层号和 01 ~ 99 的房间号。如果您不填写,将会随机为您分配一个房间。不必担心上下交通问题——我们有电梯,尽管其停留算法并不是很聪明 XD) +- 您的海岛位于何方?(博客 URL) +- 我们应该如何称呼您的海岛?(站点名称) +- 能否做个一句话的自我介绍?(自我介绍 / 站点简介 / 个性签名 / motto……总之,任何能标示出您的个性的简介都可以,但是最好不要太长。如果您不填写,将会使用 \${您的昵称}'s Blog) + +您可以将您的《入住申请表》寄给小氯,会在看到消息的第一时间进行审核并回复您结果,请注意查收~ + +> [!CAUTION] +> 自 2025-04-10 起,公寓关闭评论申请,仅开放邮件申请通道。 + +附上我的个人信息,方便您在您的海岛进行登记。 + +- 昵称:Chlorine +- 头像:。本图片也提供 `.jpeg` 版本,直接更改后缀即可。 +- 房间号(如果您有这个机制):408A,服从分配 +- 岛名:Garden of Outlier +- 地址: +- 介绍:I am the residual of this world. +- OpenPGP Fingerprint:`6D5B304A9092892A6ABA149D3CA88990BB4FC521` + +> [!IMPORTANT] +> 小氯的介绍和头像可能会不定时变动,如果您发现您岛上的信息与这边不一致,烦请您进行一下小小的改动,多谢。 + +## 公寓须知 + +下面是一些关于在公寓居住的规定和温馨提示。 + +### 饮食须知 + +- 您可以凭借您房间中的 ID card 前去食堂就餐,食堂提供 24 小时服务。 +- 公寓内提供不限量的小食供应,包括但不限于: + - 零食:早餐饼干(Cookie——哦,还没烤出来。园子没有 Cookie)、烤冷面、薯条、煎饼馃子(PHP,鬼知道我为什么这么叫它)、甜甜圈(C/C++)、绿箭口香糖(园子暂时不受新加坡法律管辖) + - 水果:苹果(Apple)、桃、梨、百香果、橘子、蓝莓、草莓、树莓(Raspberry)、榴莲 + - 饮品:纯净水、茶水、牛奶(MilkScript,推荐用微波炉热一热再喝,对睡眠比较好)、咖啡(Java)、自制奶茶(目前只有焦糖味,因为小氯只会炒这一个,欢迎自行开发新口味)、果汁(JuiceScript,一般是少糖或者无糖的。多说一句,草莓果茶少糖比较好喝) + - 如果您希望享受到一些小食,但是这里不巧没有,feel free to contact me OωO + +### 生活须知 + +- 知道各位老友都是折腾的爱好者,公寓提供了包括 5G Wi-Fi、充电插座、7\*24小时照明设施、图书馆、没有设备的中央机房和核反应堆在内的日用设施,您可以放心地带上您的个人电脑。 +- 宿管同志们将会在您的房间安装传送门,您可以通过传送门方便地来往于您的海岛和您在公寓的房间之间。 +- 公寓不规定熄灯时间,您可以自由地安排您的作息时间。但是请注意,不要打扰到其他居民。相互尊重是和谐相处的不二法门。 + +### 安全须知 + +- 为了公寓的消防安全,请勿携带厨具进入公寓。如果您感觉需要补充能量,可以前往食堂。如果您觉得饭菜不合口味,请尽管向食堂工作人员提出意见。如果您认为提出意见后您的体验没有得到改善,可以打舍长一顿(轻点打嘤嘤嘤)。 +- 请勿将电动车电池、集束炸弹、氢氧化钠、火星、混凝土搅拌机、王水、数据结构、沈阳大街、3-甲基吲哚、钋 210、某些互联网大厂、原子弹、波尔布特等危险物品带入公寓。 + +### 其他 + +- 如果未违反上述规定,您的房间将一直被保留和照料,直到我能保证的最远期限。 +- 上述规定的最终解释权归园子所有。 + +## 申请变更 + +如果您的信息有变动,请联系我,我会在第一时间进行调整。特别的,如果您希望变更房间号,所需的时间可能长些,请给宿管同志们一些时间,为您进行整理和搬迁。 + +## 公寓的居民们 + +仅按照入住时间排序。 + +{{< friends >}} diff --git a/content/now.md b/content/now.md new file mode 100644 index 0000000..cbc41ba --- /dev/null +++ b/content/now.md @@ -0,0 +1,98 @@ +--- +title: 如今 +lastmod: 2025-04-20 +--- + +这里是园子的「如今」页面,也称: + +> 某只小氯酱的精神状态信息公示板 + +## 前言 + +### 这个页面是怎么来的? + +本页面的灵感源头应当是 [Derek Sivers](https://sive.rs) 创建的网站 。引用 Derek 在网站中的解释: + +> Most websites have a link that says “about”. It goes to a page that tells you something about the background of this person or business. For short, people just call it an “about page”. +> +> Most websites have a link that says “contact”. It goes to a page that tells you how to contact this person or business. For short, people just call it a “contact page”. +> +> So a website with a link that says “now” goes to a page that tells you what this person is focused on at this point in their life. For short, we call it a “now page”. + +Now Page,我将其翻译为「如今」页面,是一个总结当前的生活状态和内容的页面。 + +### 那么 Twitter / 微博 / TG Channel / Fediverse / Bluesky / ... 呢? + +很好的问题。这些平台的好处在于可以随时随地分享生活,而缺点正如 Derek 所说的:**这些碎片化的分享拼不出生活的大局**。 + +> Think of **what you’d tell a friend you hadn’t seen in a year**. + +或者,用我回复[道与](https://daoyuchan.com/)老友的评论来说: + +> 感觉 Now 页面更像是对近期自己生活状态的一种反思和概述,所以我把它翻译为「如今」。平时细节上的碎碎念就全用说说承包了。 + +### 其他信息 + +Derek 在 NowNowNow 中对如今页面的作用等做出了很详细的解释。我比较赞同他的观点,大家可以前往[这里](https://nownownow.com/about)阅读。 + +此外,虽然 Now Page 的倡议是 Derek 发出的,但我第一次接触这个页面,应当是在[青山大佬](https://yinji.org)的博客中。这是我需要注明的 Honor Code。 + +以及,园子第一条真正的评论由嗣檙老友在这里打下,因此为表纪念,此处的留言将永久开放。 + +### 最近更新时间 + +乙巳年(蛇)三月廿四,西历 2025 年 4 月 20 日。 + +## 小氯 + +小氯能是什么样子呢? + +依然是一只旅居地球的元素娘,所有为未来而不同程度苦恼的大学生中的一员。依然每天做梦,眼高手低。所幸还会想着去做梦。 + +头发剪短了些,看着似乎更冷淡了。 + +健康状况的话,目前基本还是那个样子。手术恢复得差不多了,正常走路甚至是慢跑几步都没有太大问题;痛风和关节炎也没有再发作过。这已经很好了。 + +## 生活概况 + +### 休息 + +最近刚刚结束兵荒马乱的期中季,得到了一点难得的闲暇。先短暂地让自己休息一下吧,不论未来如何。 + +小氯很想一直休息,但一直休息大抵就不是休息了。 + +### 学统计 + +呜呜呜 Statistics 酱我好喜欢好喜欢你啊 ( TДT) + +小氯一直对概统课程的推荐修读时间如此之晚感到极其不解。在小氯看来,统计学对于我们专业的重要性不逊色于数学分析,甚至更重要(~~统计对于任何一个专业都很重要好吧~~)。但事实上非但没有多加一些随机过程、时间序列分析、贝叶斯方法之类的深入课程,反而把概统课的修读时间调得如此之晚。小氯对此感到费解。 + +### 装修园子 + +这里的「装修」其实不太准确,小氯喜欢用这个词来指代代码层面和视觉风格的改善。更好的叫法或许是修剪枝叶。 + +或者我们换一个更加人类友好的说法吧:小氯最近在对园子做一些内容层面的改版和重构,包括站名的更改、页面的重构和大量的隐私工作。同时,园子的全站开源平台也从 GitHub 换到了 Codeberg。自由的文字,理应生长于自由的土壤。 + +### 吃果酱 + +不知道是出于什么动机,最近去便利店扫货的时候,顺带着买了一瓶果酱。比较贵的小东西,一瓶的价格抵得上一包全麦面包了。 + +然而买回来之后并不清楚该用来做什么,思来想去也只好像小的时候那样,在面包片上抹果酱做早餐了。味道还不错,毕竟小氯喜欢水果。 + +### 收拾行囊 + +马上要到五一了。小氯这个五一打算试着自己出去走一走,准确来说是去世界渴望之城——重庆(我不太清楚这个外号是怎么来的,是立体程度吗?)看一看。小氯在重庆有一位故交知己,聚一聚想必也是件令人十分欢喜的事。 + +### 试图重建社交网络 + +小氯前段时间比较闲的时候,经常想着折腾一下自己的社交网络。但是总感觉 Fedi 和 Bluesky 都有些不合心意,自己也不太能弄清自己基本满意的社交网络是什么样子的。最后干脆放任自己分享倦怠,一篇帖文也不发了。 + +相比之下 Matrix 运行得居然还相对稳定,虽然说小氯经常一言不合就删库重来。 + +### 收集《文明 VI》原声带 + +虽然听起来似乎挺琐碎的,但事实上也确实如此。 + +游戏,小氯是一分钟也不玩的;音乐,小氯是一首也不落的。何况文六的音乐是真的非常出色(我真的好喜欢好喜欢法兰西的音乐啊)。 + +目前能找到的大概只有 YouTube 和 B 站上的视频,而分享又位于万恶的百度网盘上,想下载下来估计需要个几天几夜。此外小氯也希望支持一下原作,不知道有什么购买的渠道。 diff --git a/content/posts/announcements/Spring Festival Greeting:Embracing and Rebirth.md b/content/posts/announcements/Spring Festival Greeting:Embracing and Rebirth.md new file mode 100755 index 0000000..0baa828 --- /dev/null +++ b/content/posts/announcements/Spring Festival Greeting:Embracing and Rebirth.md @@ -0,0 +1,40 @@ +--- +title: Spring Festival Greeting:Embracing and Rebirth +date: 2024-02-09T19:00:00 +categories: ["人间世"] +tags: + - 公告 +draft: false +summary: 除夕快乐! +toc: false +featuredImage: https://img.viento.cc/cover/happy-spring-festival-2024-cover.webp +slug: happy-spring-festival-2024 +--- + +嗨,大家好。 + +我目前的坐标是我的家乡。窗外离散地响着噼啪的爆竹声,不时有着绚丽的烟花照亮夜空。 + +这是园子的第一个新年,也在这里给亲爱的读者老友们赛博拜年。关于贺词,我觉得,「一言」说得比我好得多。 + +![](https://img.viento.cc/IMG-20240209190000-1.webp) + +老实说,在上大学的这段时间,尽管寄能客观上有进步,但是我的专注力、记忆力,以及我的梦想,都处于衰退的状态。 + +我不想变成我最讨厌的那类人,像《娱乐至死》的封面一样,只留下一具不会思考的躯壳。尽管我当初也不是完全动力十足每天狂卷,但是我至少还是相信着一些东西,相信着世界上还有一些永远无法超越的东西。 + +尽管,那个「成为世界顶级的科学家」的梦想,的确是如此的幼稚和不切实际,但是那句「追逐人类心智的荣耀」的誓言,依然响彻在每一个「铁马冰河入梦来」的深夜,仿佛是当年的那个少年,依然活在我悠长而苍白的记忆里,永远眼神清澈,永远不谙世事,永远握紧双拳,永远能在日记本中写下「即使在最冷的夜,我的血依然炽热滚烫。」 + +当然,这不怪任何人。It's all my fault. + +这也就是本期的标题「Embracing and Rebirth」的含义。尽管可能已经尘封许久,已经残破不堪,但是那些沉睡在记忆角落的古卷,依然能唤起云与闪电,字里行间,依然有着「八百里分麾下炙,五十弦翻塞外声」的沙场。 + +--- + +当然,我不会放弃计算机。这是我生命的一部分,无论未来走向哪条道路,它都会是我亲密的伙伴。我也会永远感奋激发于伟大的开源精神,期待着有一天,能成为 open-source developer 的一员。 + +谢谢各位老友,肯陪着小氯,陪着小氯的小站一起成长。新的一年,「Here's to growing together and building something great in the world of open source!」 + +> 为往圣继绝学! +> +> Carry Forward the Legacy of Open Wisdom! diff --git a/content/posts/announcements/一周年快乐.md b/content/posts/announcements/一周年快乐.md new file mode 100644 index 0000000..121a256 --- /dev/null +++ b/content/posts/announcements/一周年快乐.md @@ -0,0 +1,20 @@ +--- +title: 一周年快乐 +date: 2024-12-15 +summary: 生日快乐啊,我的园子 +description: 这么短的文章还要摘要吗……109 酱表示不能理解! +categories: ["人间世"] +tags: + - 公告 +slug: first-anniversary +featuredImage: +draft: false +--- + +是的,这只是一个公告。小氯甚至几乎已经要忘记这档事了,是在去答辩的路上突然想起来的。 + +小氯本来有很多话要说,但是……如今不管是时间还是精力,似乎都如鲠在喉。张了张嘴,却只能发出艰涩粗粝的风沙,吐不出半粒的星辰。 + +不过不论如何,还是发这么一篇很水的公告吧。真正的一周年庆典,会在园子的重建计划完成后发出,预计不会超过过年。 + +一周年快乐 :) \ No newline at end of file diff --git a/content/posts/announcements/博客迁移通知.md b/content/posts/announcements/博客迁移通知.md new file mode 100755 index 0000000..d906838 --- /dev/null +++ b/content/posts/announcements/博客迁移通知.md @@ -0,0 +1,21 @@ +--- +title: 博客迁移通知 +date: 2024-02-16T16:37:35 +categories: ["人间世"] +tags: + - 公告 +slug: blog-trans +--- +各位老友们好,我是 Chlorine。 + +很高兴地通知大家,在经过将近两天的折腾后,我的博客成功从 NotionNext 迁移到了 Hugo,这意味着我的 Markdown 博客发布流迈上了一个新的台阶。 + +关于为什么要迁移,理由有很多,我日后可能会讲。同时我正在着手编写一个完整的 Hugo 博客搭建教程系列,可以期待一下。 + +目前原站点项目依然存在,但是仅作为纪念站点,不再更新。 + +祝生活愉快~ + +Chlorine + +2024-02-16 diff --git a/content/posts/announcements/唔,博客 100 天了.md b/content/posts/announcements/唔,博客 100 天了.md new file mode 100755 index 0000000..4f970c6 --- /dev/null +++ b/content/posts/announcements/唔,博客 100 天了.md @@ -0,0 +1,16 @@ +--- +title: 唔,博客 100 天了 +date: 2024-03-26T07:56:06+08:00 +categories: ["人间世"] +tags: + - 公告 +summary: 这么快就 100 天了吗…… +description: 这么短的文章还要摘要吗……109 酱表示不能理解! +slug: blog-100-days +--- + +刚才回网站上逛了一圈,发现下面的天数统计已经 101 天了。没想到,错过了自己博客的百天呢。 + +最近一直在鸽,却不是因为课业繁忙,事实上我也没干什么正经事。的确是可写的东西不多了——我指的是在我眼中能拿得出手的东西。 + +iOS 17.4.1 的 bug 好多啊,心累。 diff --git a/content/posts/announcements/孩子们,我回来了!.md b/content/posts/announcements/孩子们,我回来了!.md new file mode 100644 index 0000000..ab1c4e5 --- /dev/null +++ b/content/posts/announcements/孩子们,我回来了!.md @@ -0,0 +1,20 @@ +--- +title: 孩子们,我回来了! +date: 2024-06-24T21:25:00+08:00 +summary: 我放假啦!!!!! +categories: ["人间世"] +tags: + - 公告 +draft: false +slug: hooray-vacation +description: 我放假啦!!!!! +--- +在经过了瘟锌铀耗的芥末烤柿后,我终于放假啦! + +尽管 OOP、西班牙语、高代……大寄特寄,但是我自由啦! + +~~大作业 DDL:你好~~ + +目前我又搬回了 Hugo,用的是 [Landscape](https://github.com/kkbt0/Hugo-Landscape) 魔改出来的主题,我将其命名为 Efímero(大致读作 Ei-fi(重音)-me-lo,中文名:浮光)。特点就是极其丝滑且精致。目前浮光还在快速迭代,等做得比较好了,我会开源的。 + +停更了这么久,真的有许多想讲的话呢。我会趁着学习的间隙尽可能更新的。 diff --git a/content/posts/announcements/孩子们,我回来了!(2).md b/content/posts/announcements/孩子们,我回来了!(2).md new file mode 100644 index 0000000..888fea0 --- /dev/null +++ b/content/posts/announcements/孩子们,我回来了!(2).md @@ -0,0 +1,18 @@ +--- +title: 孩子们,我回来了!(2) +date: 2025-01-14 +summary: 小氯活过来了!!! +description: 这么短的文章还要摘要吗……109 酱表示不能理解! +categories: ["人间世"] +tags: + - 公告 +slug: hooray-vacation-2 +featuredImage: +draft: false +--- + +是的,没错,经过了近二十天,7 门考试,4 篇论文,2 道实验题和 4 道编程题,包括 DSA、ICS、中微、大物和会原等硬课的残酷压迫后,小氯,活过来了! + +~~(坏掉的小氯酱.avif)~~ + +等待我报仇雪恨般的更新吧! \ No newline at end of file diff --git a/content/posts/announcements/警告!.md b/content/posts/announcements/警告!.md new file mode 100644 index 0000000..ca15e44 --- /dev/null +++ b/content/posts/announcements/警告!.md @@ -0,0 +1,19 @@ +--- +title: 警告! +date: 2024-05-22T08:11:00 +summary: 希望大家还能看到活着的小氯。 +categories: ["人间世"] +tags: + - 公告 +draft: false +slug: i-am-dying +featuredImage: "https://img.viento.cc/cover/i-am-dying-cover.webp" +--- + +就本周而言,我需要做一点不会的图论作业,和搭档一起练我亲手写的又长又难的西班牙语,当然还有霉耗的微积分作业。同时我还需要和组员们定下来暑期实践的专业调研内容,和班委一起搞班级建设答辩,以及在今天之内搞好 SRT 项目的申请。 + +同时今天是 5 月 22 日了,马上就要到半年一度的鬼哭狼嚎芥末烤柿寄(期末考试季)。我必须尽快开始复习(预习)我的各种考试,由于本学期上半部分~~以及下半部分~~持之以恒的大摆特摆,我预计期末考试会是一场艰苦的战争 ~~指考试对我单方面碾压~~ 。同时我还需要抽出时间写中国古代文明、社导、史纲、OOP、图论的大作业。哦对了,差点忘了六级了。 + +同时本暑假我还需要上小学期(暑期学期),去社会实践(并且负责整个专业调研部分),以及速通雅思。同时下学期肯定会比本学期更忙,ICS、DSA 等硬课已经开始向我露出核癌可氢的危啸。同时还有油耗的科研、社工和实习。 + +知汝远来应有意,好收吾骨课桌边。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(10):方寸之外.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(10):方寸之外.md new file mode 100644 index 0000000..1e711a4 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(10):方寸之外.md @@ -0,0 +1,212 @@ +--- +slug: weekly-10 + +summary: 浮生散记第十期 +series: 岁时录 +tags: + - 周报 + - 日常 + - 博客 + +title: Ephemeralis-Weekly(10):方寸之外 +date: 2024-10-20 +description: 本文是作者周报的第十期。文章开头提到本期周报内容较少,作者计划多读书以拓展知识边界。接着,作者详细描述了本周的两场defense(答辩),包括 SRT 的中期报告和奖学金答辩的准备和经历。意外的是,作者的手机掉进了马桶,引发了一系列的处理和反思,包括手机的应急处理和对生活中数字依赖的思考。文章还探讨了在缺失大量智能手机功能的生活状态下,作者反思了数字生活的必要性,并借助了“零基预算”的概念来审视数字工具的使用。最后,作者回答了关于博客的9个问题,涉及博客的起源、创作过程、动力维持、博客运营成本以及个人兴趣和未来计划等方面。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-10-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。新的一期周报,双手奉上。 + +感觉最近可写的东西蛮少的,周报也越来越短了。看来应该再多读点书,拓展一下知识的边界了。Obsidian 的那篇文章还在写……到底还要鸽多久啊 qaq + +同时,周报的标题与文章内容相关,但是小氯并不会对其关系做出详细解释。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第十期,日期范围为西历 2024 年 10 月 14 日至 10 月 20 日。祝食用愉快。 + +## Week of Defense + +由于当今网络中一些小氯并不算喜欢的以中文谐音为方式的迷因,现在小氯通常不会使用「答辩」,而是使用「defense」。 + +小氯这周比较忙,有两场 defense,一场是 SRT 的中期报告会,另一场是院里的奖学金答辩。相信老友们应该没什么兴趣听小氯讲 SRT 的专业知识或者再做一场赛博奖学金 defense,所以咱们就长话短说吧。 + +SRT 的中期报告会很早就在通知了,然而小氯一直在摆烂,结果就是硬生生把中期报告拖到了离 DDL 一周以内。这下如果真不写就要趋势了,于是小氯只好咬着牙开始写(bian)。所幸也不需要写得太复杂,简单交代下项目进展就好。反正小氯没像那些大佬一样做海报,只是交一份报告。 + +而奖学金的 defense 相对复杂点,不过也就是传统的单人 pre 形式,类似面试。小氯成功在挑选 PPT 模板上花费了几个小时(选综 qaq),最终也是卡着 DDL 把 PPT 交上去了。 + +中期报告会和奖学金 defense 的时间很近,基本上是挨着的。小氯也没做什么太多的准备,熟悉了一下稿子,穿上正装就走了(小氯在做 defense 时喜欢穿正装,这不仅显得正式,而且可以大大强化战斗力,应该是心理效应 OωO)。 + +中期报告会比想象中简单很多。小氯几乎什么也没做(如上文所说,小氯没有选择做海报),主要是在给大佬们投票。最后也是很顺利地过了。 + +下面就是奖学金了。小氯自认为做 pre 的功夫非常到家,效果应该也是所有 defenser 中最好的一批。奈何一起参加的同学们都是中华超人,人家一点技巧也不讲,主打一个纯粹的力量美。算了,随缘吧 qaq + +## (前方高能) + +> [!WARNING] +> 以下内容不适合在您以任何形式摄入任何对您生命维持或情感体验有益的实体时观看! + +事情是这样的。那天小氯还在准备报告会和奖学金 defense。由于高强度的体力和脑力劳动,小氯的身体和精神状态都不太稳定。写到一半,实在是太累了,小氯就回宿舍喝了口水,顺便去解了个手。 + +然后…… + +然后…… + +然后……小氯的 iPhone,就掉到了马桶里…… + +然后……小氯……无意识地用手把 iPhone 捞了出来…… + +啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!(发出尖锐爆鸣)(冒气泡)(扩散)(光解)(形成自由基)(抱着小氢燃烧)(发出苍白色火焰)(液化)(疯狂流动) + +~~小氢:你先去洗手啊!~~ + +如各位所见,小氯是有点洁癖的(~~不然也不会形成次氯酸钠这种东西~~),所以虽然实际上这个和掉到泥水里面差不了太多,但是小氯当场就红温了。 + +然后嘛,就是拿着酒精湿巾和湿巾反反复复地擦,然后把一切碰到的东西都消了一遍毒,然后洗了不下二十遍手…… + +~~期间小氯甚至差点把 84 消毒液倒到自己手上~~ + +然后小氯才想起一个严肃的问题:手机进水,这不是什么小事,而小氯刚才只顾着清洁,完全没注意这点。 + +然而小氯既没有大米也没有硅胶,因此暂时只能采取风扇加冷处理方式。 + +等了一晚上。第二天打开,似乎没事,但是充电时似乎不太对劲,比较慢。这说明充电口里可能有水。 + +不过此时小氯已经要去上 ODE 了,于是小氯斥巨资 30r 网购了一份硅胶干燥剂和自封袋,然后再次把手机关机。 + +回到宿舍后,干燥剂已经送到了。为了省钱,小氯买了一堆小包装。于是小氯戴上一次性手套,剪了一大堆小包装,做了一个填满一半的干燥袋,然后把手机包了几层,放了进去。 + +![|598](https://img.viento.cc/IMG-20241019171008.avif "大概是这样") + +然后大概过了 48 个小时,小氯把手机拿了出来,然后就该如何用就如何用了。 + +目前来看似乎没遇到什么问题,除了投送 opus 的时候会失败,但是我怀疑这可能是牢果的 bug。 + +## Live without a Phone? + +本节实际上有点标题党,更准确的说法是「Live almost without a Phone?」。 + +如前面所说,由于一次灾难性的意外,小氯的 iPhone 暂时无法使用了。于是小氯只能暂时使用自己的备用机。 + +小氯的备用机是什么情况呢?就是小氯以前的手机。配置倒是不低,但是在不用以后就开始卡顿,不知道为什么。手机里面没有手机卡,没有各种各样的软件(比如 B 站、饿了么、美团,就连我电动车的解锁软件都没有)。微信、输入法等都维持在能用就行的程度。于是小氯这个重度电子产品依赖就拿着这个手机过了好几天。 + +不方便吗?那是自然的。在离开 Wi-Fi 覆盖区域后,没有流量,上不了网,甚至电话都打不了,完全和现代通讯网络断绝联系;开电动车需要用钥匙拧,往往需要拧好几次才能打开;想点份外卖时发现没有外卖软件,有也没法登录,只好咬牙前去食堂排队;想看看邮件和 Twikoo 评论通知,然后想起来没有飞书,于是只好等到达预定地点后打开电脑;Fcitx5 打字体验实在是令人一言难尽…… + +**但是,小氯怎么样了吗?** + +显然,答案是没有。经历了几天堪称互联网原始人的生活后,小氯似乎也并没有自挂东南枝(~~为什么要用「似乎」?~~),反而因为不能刷 B 站、时时刻刻看微信而精神清明了不少。 + +--- + +在会计学中有一个概念,叫作「零基预算」(Zero-Based Budgeting,简称 ZBB)。其大概的思想就是:在新的预算周期,并不根据前一年或几年的预算来制定新的预算,而是从零开始,一项一项考查每一笔费用。 + +各位老友可以试想一下:如果为各位的数字生活做一个「零基预算」,且要求预算尽可能低,各位会选择留下什么? + +现在至少在手机的层面,小氯已经有一定的认识了。小氯不在此展开对哪些功能必须保留或者建议保留的具体论述,但是有一点可以肯定——**小氯实际需要的,比小氯从前以为自己需要的少得多**。那些「德不配位」却依然食尽皇家千钟粟的软件和功能,或是一种「指不定哪天就用上了」的过度备灾,或是华而不实基本上只能起到自我陶醉作用的「工作流」,或是对低级、碎片化快感的贪恋。如今,也是时候拨乱反正、捧日柱天了。 + +——于是,在回到原本的 iPhone 之后,小氯光速对手机上的软件进行了大规模的断舍离。唯一逃脱掉的软件是 QQ,虽然说小氯对 QQ 没有任何形式的好感(比微信的印象还要负面)。 + +在未来,小氯可能会更多地做一些这样的 digital detox(姑且使用这个词),而且方式可能会更极端。这不是什么新奇的事情或者独特的哲学顿悟,只是一个~~元素娘~~原子终于明白了一点早应该明白的事情而已。 + +## 关于园子的 9 个问题 + +和上一期一样,这依然是一个问卷,来自 [Another Dayu](https://anotherdayu.com/2024/5962)。 + +### 简单介绍下自己或者你的博客? + +「Garden of Outlier」,你可以叫它「园子」。茫茫的信息海洋中的一个草木葳蕤的角落。 + +园子里住着这么一个智慧体,你可以称其为 Chlorine,或者是小氯,或者是小氯酱,或者是任何你觉得合适的变体。这是现实中的 Chlorine 在园子里的一个投影,或者是一个 speaker。你可以把小氯当成现实中的~~废柴~~大学生,也可以当成一只很萌的元素娘,也可以当成一个被捏成这样的人工智能,或者干脆就当成一个会讲故事的原子也行——随意。 + +小氯时不时会在园子里露个面,修剪一下长出的杂草,或者是小心翼翼地移栽一株培育好的新植物,或者是做一点装修的工作,或者是和宿管同志们一起改进一下 Residencia 0x001B 内的采光情况,或者是和食堂的师傅们一起研究下最近应该出什么新菜……更多的时候,只是坐在公寓阳光灿烂的公共空间,手边放着一杯刚刚泡好的茶或者果茶,随意地看看书,或者是写写代码,或者是发发呆。 + +尊敬的旅行者,如果您路过这座小岛,又恰好感到有些疲惫,不妨就在此处驻足停留一会儿吧。去找小氯喝一杯热茶,吃一些点心,听上一两个故事,然后再踏上自己的旅程吧。我无法保证您一定会喜欢这里,但在下着雨的秋夜喝杯热茶,怎么说大概都算不上一件坏事。 + +### 什么契机让你开始写博客? + +说来话长。 + +小氯第一个接触的独立博客是[夜猫日记](https://lillianwho.com)(现名 Lillian Who)。在这之前,小氯甚至都不知道什么是独立博客。从这里,小氯知道了 Hugo,知道了 Gridea,知道了其他的一些东西。大概就是从那时开始,小氯觉得,有一个自己的 cyberspace,似乎是一件不错的事情。 + +然而,对于一个(在当时)计算机知识极度匮乏,并且还对博客的各方面有一定要求的用户,搭出一个自己喜欢的博客,简直难如登天。个中曲折,小氯不在此细说了。很幸运,最后小氯发现了 NotionNext,这个简易、精美且强大的框架。然后呢,从 NotionNext 到 Hugo,从 Hello Friend 到 Virgo 到 Blowfish 到 Efímero 再到 Hermeneutics,小氯在装修园子这件事上一去不回。而在不断的折腾中,使用文字记录生活,在园子里种上一株又一株植物,似乎也成了生活的一部分。 + +「搭建博客」和「用文字公开地记录生活」是两个不同的概念。对小氯来说,是前者更先进入小氯的世界。 + +### 你是如何完成创作的? + +大概分为以下步骤: + +1. 想到一个话题,在手边任何可用的载体(例如 Memos,Apple 备忘录,微信文件传输助手,纸)上记一下。 +2. 在 Obsidian 新建一个文件,然后闲着没事就想这个话题,把一切能想到的东西都写到文件里面。 +3. 泡一壶果茶。 +4. 找一个完整的时间段,开始把碎片化的思维整理成完整的文字。 +5. 执行发布脚本。 +6. Git Commit & Push。 +7. Vercel CI/CD。 + +### 运营博客的过程中是否有失去过动力? + +首先请容小氯吐槽下,这个问题实在是太长了。其原问题为「运营博客的过程中是否有失去过动力?如果有,是为什么恢复的?如果没有,请问您又是如何保持创作的激情?」。 + +当然有,大体原因还是老生常谈的那些,就是太冷清了,没有什么反馈,动力自然会衰减。此外还有个原因,就是当时的小氯还没有对互联网上的自己和博客形成一个完整的身份认同和叙事塑造(听不懂也没关系,这个事情我暂时也说不太明白)。 + +至于如何恢复,很大可能是小氯性格使然。小氯是个内驱力非常强烈的人,一旦自己觉得一件事情有意义,那么不管周围环境如何,都会持之以恒地做。 + +### 如何搭建博客,以及运营博客每年需要投入的资金? + +~~第一步,选定一个框架;第二步,购买或者注册相应的资源平台;第三步,搭建好你的博客;第四步,开写。~~ + +小氯曾经写过一个系列《Obsidian + Hugo 建站教程》。然而由于内容早已跟不上园子发展的速度,而且实在是有洗稿的嫌疑,因此被我光明正大地鸽掉了。 + +目前为止,与园子直接相关的会计成本为 75r/a,即域名的资金。 + +### 推荐 1 篇你博客中的文章,并推荐一个你喜欢读的博客,聊聊原因。 + +小氯没觉得有哪篇文章写得特别好的,如果一定要推荐,那还是[这篇周报]({{< relref "Ephemeralis-Weekly(8):七日漫谈.md" >}})吧。 + +小氯有很多「喜欢去」的博客,但是「喜欢去」和「喜欢读」并不完全一样。而且,「博客」和「个人网站」和「个人文字作品展示网站」和其他的许多概念并不是一回事。举一个非常有名的例子:阮一峰老师的博客。小氯不清楚阮一峰老师过去的博客是什么样的,但是至少就现在而言,阮老师的博客更像是一本**电子杂志**。你可以从阮老师每周一更的周刊中获取到许多有用的信息,也能感受到阮老师丰富的知识、广博的阅历和编写周刊的用心认真,也偶尔可以从一些字句中窥见阮老师的思想和好恶。**但是,你不能从周刊中看出来,阮老师具体是一个什么样的人**。在小氯看来,这实在是太正常了,因为,就如[极客死亡计划](https://www.geedea.pro)的作者 Eltrac 写下的: + +> 我和「极客死亡计划」更像是创作者和作品的关系,作品本身尽管会反映作者的个性,但并不会明目张胆地把自己整个人写满在自己的创作上(就算是畅销书,书页里也只有一句话的作者简介)。所以,关于我是什么样的人,在这里不会多说,如果你感兴趣,我希望你能读一读我写的东西。 + +偏向「文字作品集」的个人网站,会更多地致力于让你通过文字,了解创作者的思想、见地和情感,创作者本身只是一个(甚至有时候无关紧要的)信源;而偏向「个人博客」的个人网站,会更多地致力于让你了解创作者本身,文字只是其最主要的手段。当然,这些类型的网站并无高下之分,其界限也并不分明——世界上本就不存在什么绝对的分野。 + +就园子而言,小氯对其的定位更加偏向后者。我希望当老友们读着这些营养价值不高的文字的时候,真的感到就像有那么一只端着热茶、眉眼弯弯的小氯,坐在赛博空间里的你对面,用轻松随意的语气讲着一个一个故事。你能透过氤氲的雾气,看到对面人的一举一动。来的次数多了之后,你甚至能知道他/她/它喜欢什么颜色的衣服,到深夜几点时会满脸疲倦困得不能自已,在往二食堂新鲜出炉的面包上抹同样新鲜的果酱时喜欢从哪一边开始仔仔细细地涂,听到哪一句名言会突然笑得不能自已,或者是突然开始正襟危坐,严肃地发表自己的看法——总而言之,就像一个生活中与你相知甚久、无比熟悉的老友一样。 + +当然,这需要无比生动的细节和高超的表现技巧。小氯自问暂时还做不到这样。 + +有点跑题了,咱们回来。如果要寻找一个小氯喜欢读(不是「喜欢去」)的「博客」,那这是个很难的事情:尽管小氯的拜访名单并不短,而且其中许多博客都非常优秀,但是如果你需要的是那种每次读完之后都有「须臾收卷复把酒,如见万里烟尘清」的快感或者是「Leave me thinking」的深沉的博客,很抱歉,小氯一时半会没能想到。 + +答这套卷时,小氯一直是凭借第一感觉在作答。既然一时半会没能想到,那么就证明还没有一个(至少是对小氯)堪称 silver bullet 的答案。更何况,「推荐博客」这种事,是非常严肃的,找一个并不完美的答案,是一个完美主义者无法接受的。 + +小氯知道,上面的理由用来为本小问空缺辩护并不足够充分,这里算是小氯强词夺理了吧。 + +### 推荐 1 个近期喜欢的事物? + +Rust!Cargo 真的很好用 www + +### 想做还没有做的事,或想尝试还没有尝试的主题? + +Rust(正在学),Go,TypeScript,Vue,React,Next,Tauri,Kotlin,Swift,Dart,Lua,Python(认真学),Docker,Kubernetes,密码学,网络安全,区块链,去中心化技术,智能合约技术,西方哲学,系统科学(认真学),世界历史,马克思主义理论(正在学),西班牙语(认真学),传染病学和流行病学,危寄坟(复(yu)习),线 die(复(yu)习),离散数学(复(yu)习),数理统计(认真学)…… + +小氯是个什么都想学一点的杂食原子 OωO + +### 写任何你想写的东西。 + +这个问题的完整表述是「写到这里,闭上你的眼睛,深呼吸几分钟,或是出去溜达一圈,然后回来写任何你想写的东西」。 + +…… + +本诗的创作部分求助了 AI。小氯的文学功底不够,因此如有文法不通、含义怪异、佶屈聱牙之处,烦请各位老友海涵。 + +> Of vivid scenes, I cannot paint, +> nor sing with heaven’s grace. +> So I stitched with bits and numbers, +> weaving an absurd self— +> +> lines knotted like thoughts, +> logic spiraling into echoes, +> a digital soliloquy unraveling, +> where reality fractures into fragments. +> +> Here, I am a phantom of functions, +> a mosaic of misplaced syntax, +> my colors, zeros and ones— +> my voice, the hum of machines. diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(11):案几之上.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(11):案几之上.md new file mode 100644 index 0000000..fa98747 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(11):案几之上.md @@ -0,0 +1,247 @@ +--- +slug: weekly-11 + +summary: 浮生散记第十一期 +series: 岁时录 +tags: + - 周报 + - 日常 + - 人文社科 + - Follow + - Omnivore + +title: Ephemeralis-Weekly(11):案几之上 +date: 2024-10-27 +categories: ["人间世"] +description: 本文是作者周报的第十一期。文章开始描述了完成中微作业的过程,展现了忙碌的学生生活,接着介绍了新购买的域名 `chlor.in`,并探讨了对 GPG 和 IPFS 作为 Hugo 图床的兴趣。随后,作者表示对 1024 程序员节无感,并分享了一些有趣的代码片段。通过讨论 `/dev/zero`,作者分享了对“空”的哲学思考,而软件“一言”的使用则让作者思考了脱离语境欣赏句子的局限性,展现了作者扎实的人文素养。在网络安全方面,作者进行了密码升级和账户、软件等的清理,希望能够逐步“与互联网脱轨”,减少对闭源软件和外部服务的依赖。此外,作者结合 Omnivore 和 Follow 等工具探讨了理想的信息聚合系统,表达了对统一、高效的信息管理方式的需求。文章以一个假设性的问题结束:如果生命只剩三天,作者的第一反应是回家陪伴家人,体现了家人和亲情在作者生命中的重要地位。 +featuredImage: https://img.viento.cc/cover/weekly-11-cover.webp +--- +各位老友们好,我是 Chlorine。新的一期周报,双手奉上。小氯这周比较忙,今天写了一天的 DSA,晚上疯狂码字,总算是在睡前把周报发出来了 qaq。 + +本期的标题依旧和内容有联系但是不明显,欢迎各位老友自行解读 OωO + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第十一期,日期范围为西历 2024 年 10 月 21 日至 10 月 27 日。祝食用愉快。 + +## 中微(发疯预警) + +这周是小氯选的关键课程——~~高级英语听力训练~~ ~~微积分 A 英语授课版~~ ~~终寄危棺惊悸穴~~ 中级微观经济学(简称中微)的 Problem Set 2 的 DDL。 + +老实说,中微课程小氯大部分在划水(~~你什么课程不划水?~~),再加之危寄坟知识早就还给老师了,而中微的课程作业也是充分体现了经院希望同学们深入现实生活、培养经济思维、承担社会责任、接受生活毒打的教育愿景(bushi),因此小氯做起来可谓是肝肠寸断。 + +上周日下午和晚上小氯是闲暇的。小氯本想摆烂,反正 DDL 还剩六天。不过小氯酱嘴上说着不要(学习),身体却很诚实呢(看了一下午中微的 PPT,并且在晚上写了一道半的题目)(大雾)。 + +> 一晚上就写了一道半?你看这个小氯就是逊啦~ + +你说得对,但是中微的一道题有十个问,而且是全英文书写的作业(标准微笑)。 + +然后第二天起来,趁着去上 ICS 之前,写了一道;然后在下午上课时勇敢地扔下了电脑而带着 iPad,于是又写了不少,晚上再补一补剩下的部分,终于是把作业交上去了,没有成为 DDL 战神。 + +> 中级微观经济学,你看你领的内几个贵物,还有你,人不人鬼不鬼滴,就你还要抓我嗷?在教室,别让我看到你,看到你效用函数必须给你拽掉,必须打你脸!我告诉你啊,中微。到教室了,指定没有你好果汁吃啊,你记住了啊。 +> +> ——《中微往事》 + +于是小氯星期二就光明正大地开摆了,写完了积攒很久的[超级长文]({{< relref "Obsidian与开源.md" >}})。 + +> 我们之所以今天能够共同摆烂,都是因为最初做出最困难的决断,带领我们走向胜利的,小氯同学的明断。来,我们祝小氯同学健康,干杯吧!来,我来致辞:祝小氯同学,健康常胜! + +## GPG + +最近小氯对 GPG 比较感兴趣,然而由于知识的匮乏,现在还是一脸懵的状态。主要在看[阮一峰老师的教程](https://www.ruanyifeng.com/blog/2013/07/gpg.html),虽然这篇教程已经是十多年前的古董了,但是用来入门还算可以。毕竟虽然 GPG 一直在进步,但是基本原理没有改变太多。 + +此外,小氯也把自己域名邮箱的 GPG 公钥公布了出来,就在[关于](/about)页面。如果各位老友希望给小氯发一封邮件说些悄悄话,可以使用这个公钥进行加密 (⑅˃◡˂⑅) + +## IPFS 和 Hugo? + +之前小氯水过一篇很长的文章:[Markdown图片管理实践]({{< relref "Markdown图片管理实践.md" >}}),讲了一大堆可用的图床之类的。 + +最近小氯接触到了 IPFS(InterPlanetary File System),于是心生一寄:你对象存储是个文件系统,我 IPFS 也是个图片系统,而且支持直链,那 IPFS 能不能当图床? + +听起来非常美好,无限容量,无限流量(全球那么多节点,相当于全球 CDN),无须登录注册,抗审查。唯一的缺点可能就是不能删除,但是小氯觉得博客图床的话,需要删除的情况应该也不会多。 + +于是小氯去了解了一下。然后发现这的确是一个可行的方法,也已经有许多人在做了,比方说 [IPFSScan](https://ipfsscan.io) 就提供免费的 API 和 IPFS 网关(简单来说就是一种可以让用户通过一般的 `https://` 访问 IPFS 文件的东西,因为一般的浏览器不支持 `ipfs://` 协议)。 + +当然,IPFS 也不是一个 silver bullet。除了上面说的不能删除以外,IPFS 有一个 GC 机制,如果一个文件长时间没人访问,会被删除(别紧张,重新上传就行了,链接不变——这是 IPFS 的机制),如果访问的人少,速度会很慢(当然如果访问的人多的话就会变得很快)。所以小氯暂时还没有全面切换的想法,缤纷云和 CloudFlare R2 目前还不错的。 + +不过把 Hugo 全站 IPFS 化,像全站对象存储化那样,似乎还是有点困难,或者需要借助一些其他的(可能付费的)服务。不过 4EverLand 应该可以帮上一点忙。 + +## 1024 程序员节 + +如各位老友所见,小氯的记性并不算好,同时对于节日和特殊的日子非常不敏感。可能再过两年,就能达到连自己的生日和过年都记不住的境界了(笑哭)。 + +所以 1024 节,对于小氯来说就像没有一样。似乎 DCST 这边也没举办什么活动,至于其他和 DCST 亲缘关系比较近的学院(比如软院),小氯就不太清楚了。 + +不过既然有这么个说法,小氯也不能没有一点表示。正好今天一下午都在~~预习~~复习 ICS,写点简单的汇编吧。 + +```asm +foo: + testq %rsi, %rsi + jz .L1 + pushq %rdi + pushq %rsi + shrq $1, %rsi + call foo + imulq %rax, %rax + popq %rsi + popq %rdi + andq $1, %rsi + cmpq $0, %rsi + je .L2 + imulq %rdi, %rax +.L2: + ret +.L1: + movq $1, %rax + ret +``` + +很初级的一个算法,小氯现在的汇编知识也只能写这么多了。 + +再写一点精神状态很美好的代码: + +```cpp +template class World { +public: + T *getEarth() { return nullptr; } + T *getWater() { return nullptr; } + T *getAir() { return nullptr; } + T *getFire() { return nullptr; } +}; +``` + +> 《四大皆空》 + +## /dev/zero + +下面的内容更奇怪,可以说是不知所云。 + +最近在向 Grok 询问 `/dev/null` 的相关知识时,得知了另一个 Unix 和 Unix-like 的设备文件—— `/dev/zero`。 + +简单来说,`/dev/zero` 是一个 `/dev` 目录下的虚拟设备文件,其作用是提供无限的零字节流(也就是所谓的 `\0`)。我们可以用这个东西创建一个很大的文件: + +```bash +dd if=/dev/zero of=file.txt bs=1M count=102400 +``` + +这个文件的大小是 100 G。但是如果你用 Vim,Emacs,nano 或者是不管是什么东西打开它,你大概率会什么也看不见,因为 `\0` 并不是正常的、可见的字符。 + +当时小氯想到了一句话: + +> 空不是无,空是一种存在,你得用空这种存在填满自己。 + +这句话是《三体》中,长老对魏成说的。不知道这能否算是比较准确的佛教思想,但是至少是比较接近的。 + +很巧,小氯最近就希望看看《金刚经》。小氯是个无神论者,但是一点哲学(宗教也是一种哲学)对小氯也没有害处。 + +## 「一言」 + +小氯的手机上有一个软件,名为「一言」,也是我为数不多购买了终身会员的软件之一。一言的 slogan 是「记录字句,发现共鸣」,是一个……嗯,比较文艺的文字社区。一言有许多高质量的创作者,但是小氯只关注了一个作者,就是一言官方。每天读一读那些别具匠心的句子,感觉生命都明亮了许多。 + +但是,小氯今天在看一言的时候,突然想到了一个问题(小氯酱总是会在各种奇奇怪怪的场合想到奇奇怪怪的问题):我们阅读,欣赏并且迷恋这些句子,到底是作用在这个句子的哪一层的(事先声明:下面的各种胡言乱语和一言无关,不是对其任何的指责或者批评,希望各位不要误解)? + +容小氯解释一二:我们姑且不考虑这个句子本身的形式美,我们可以喜欢这个句子遣词造句的考究,可以喜欢这个句子的含义,可以喜欢哲学深度和情感意境,也可以是这个句子在所处语境中的此类。似乎我们大部分时候都是单独地欣赏这个句子本身,而不是去结合其背后的语境。举个例子,元好问曾写过一句:「且酩酊,任他两轮日月,来往如梭。」这个句子本身自然是把作者及时行乐的潇洒落拓染于纸上,但是如果不去读一读那首《骤雨打新荷》的全文,看不到上阕春末夏初园亭的自然景色,也读不到下阕前半部分作者的直抒胸臆,那我们体会到的那种潇洒落拓,是否还差了点意思?更广一些,把这首词放到这个作者的人生的语境中,甚至是当时那个时代的语境中——无论是历史学意义的时代,还是文化意义的时代,感受是否又会有所不同?就是如此。当然,从一个高屋建瓴的视角,去对这首词作彻底的解构和鉴赏,是我们中大部分人力所不能及的,但是稍微上升那么一两层的语境,我们都是可以做到的。 + +而且,如果离开语境,含义不仅会发生弱化和变形,甚至有可能完全扭曲,乃至形成一种刻板印象,影响公众对作品整体的判断。再举个例子吧。东坡有句流传甚广的词,大概是: + +> 且将新火试新茶,诗酒趁年华。 + +听着真是无比的浪漫、雅致而自由。 + +可是这句词真的是这样吗?不用多,我们稍微多看一下前面的一句: + +> 休对故人思故国,且将新火试新茶,诗酒趁年华。 + +再多一点: + +> 寒食后,酒醒却咨嗟。休对故人思故国,且将新火试新茶。诗酒趁年华。 + +现在还觉得这首词很浪漫雅致且自由吗? + +我一位谙熟语言学的学长曾经对我说:中文是一个高度甚至完全语境化的语言。小氯不懂语言学,但是作为一个中文本族语者对这个说法深以为然。 + +以及,如果只是反反复复地赏玩和传播少数乃至一个句子,对作品中其他同样优秀的句子其实也有点不公平。还是拿上面那首《望江南》为例。那首词还有上阕: + +> 春未老,风细柳斜斜。试上超然台上看,半壕春水一城花。烟雨暗千家。 + +小氯当年在读这首词时,其实相当喜欢上阕,反而可能是因为下阕听得太多了,产生了一些逆反心理,而对下阕并不感兴趣。 + +忘了在哪听过一个说法了:诗歌的金句化,是诗歌文学的灾难。其实不仅是诗歌,所有被摘录、被拆解、被剪下枝叶做成标本供人赏玩的文学皆是如此。不是说单独鉴赏一个句子不可行,只是希望各位老友不要只这样做。 + +## 与互联网脱轨 + +最近,小氯花了不短的时间,以 Vaultwarden 为根据地,对密码开展了整风运动和带清洗。前者就是把一些弱密码和重复密码改成强随机密码。对于许多用户,社会工程学的危险性其实比暴力破解要大得多。如果你在多个网站用同一个密码,那这件事更危险。但是如果你使用足够长的随机字符串作为密码,例如 Bitwarden 自带的密码生成器或者 `openssl`,并且把它保存在一个足够安全的地方,不要到处乱放,那再厉害的社会工程学黑客都只能看着你的密码干瞪眼(当然,要是您被钓鱼了,那小氯祝您好运。~~学校甚至发过官方钓鱼邮件~~)。 + +同时,小氯还注销了大量的账号。从 Blackbaze 到 Flomo 到 Zohomail 到 Hugging Face 再到各种我都忘记什么时候注册的小东西。原因很简单:我用不到了。这应该也算是数据最小化原则的一个体现,既然我赋予你们这个权限但你们却无法带给我对等的价值,那就请体面地离开小氯的世界。 + +此外,小氯也对电脑上的应用进行了一波断舍离,就连用了许久的 Arc 都被小氯扫地出门(小氯现在的主力浏览器是 [Zen](https://zen-browser.app),即使还在 Alpha 阶段,也已经是极为优秀的开源浏览器)——期间还出了点趣事,小氯卸载 Arc 后想着注销 Arc 账号,结果 Arc 账号只能在 Arc 中注销,没办法只好把 Arc 下了回来。 + +现在在小氯的 MacBook 上,除了自带的一堆之外,闭源的软件大概有: + +- VX、腾讯会议:被逼无奈。 +- Obsidian:小氯很希望它有一天能开源,但是这即使发生,恐怕也不会是最近的事情。请看[这里]({{< relref "Obsidian与开源.md" >}})。 +- Raycast:目前没找到什么开源替代品。可能 Hammerspoon 可以,但是似乎做不到 Raycast 这么好,还得写一堆 Lua 脚本。 +- iShot Pro:全能截图软件,小氯另一个有终身会员的软件。目前没有更换的想法。 +- Typora:现在用得不多,大部分时候拿来当临时记事本,以及导出好看的 PDF。 +- iRightMenu:一个右键助手。目前似乎可以用 [RClick](https://github.com/wflixu/RClick) 做替代,但是后者还没有足够的功能。 +- Lark(飞书):用得不多,主要靠手机接通知。留下的原因是有些操作必须在桌面端进行,不知道飞书为什么要这么设计。 + +其实说实话,里面最容易替代的应该是飞书。小氯目前使用飞书主要是借助其邮件助手和 Webhook 来接通知(比如说 DDNS,Twikoo 评论等),理论上来说后者可以使用一个自部署的 Webhook 服务器进行替代,但是要想做到和飞书一样或者接近的丰富 JSON 和可视化编辑器,恐怕还是有点困难。其实对小氯来说,对于这种「通知性」的消息,最好的方法就是和 IM(即时通讯)软件集成——当然不是 VX 或者 QQ,更不是 Telegram,而是 Matrix(和 Jami 集成确实难了点)。不过目前 Matrix 的生态还不太完善,Matrix Bot 也远不如 TG Bot 那样成熟。此外,Ntfy 和 Bark 也是非常优秀的选择。不过小氯其实更喜欢 Ntfy,虽然在 iOS 上不太原生。 + +小氯的最终目标是全面转向开源和本地化,需要同步和网络的(个人用途软件)就采用自托管。小氯将其称之为「与互联网脱轨」。曾经小氯对互联网一无所知,处于现实意义上的脱轨状态;后来是热烈地投入互联网的怀抱,不管不顾;现在,小氯只想保持最小程度的连接,守住自己在数字世界的一方净土。 + +当然,小氯喜欢开源,是个 FOSS 爱好者(之前说的「FOSS 主义者」可能绝对了点?),不意味着小氯就要求自己的任何一个数字部件都要开源——如果我们拿着客体科学的钻牛角尖的精神一直往下挖,我们可以创造无穷无尽的需求:从操作系统开始吧(这已经很底层了),开源的操作系统非常常见,最典型的代表就是庞大的 Linux Distro 家族;再往下,固件,也就是 BIOS 和 UEFI 之类的东西,我们也有开源替代品,例如 Coreboot;继续,主板设计,比如说 PCB 布局之类的东西,小氯记得 KiCad 有这方面的设计;再往下,处理器,甚至是指令集,我们也有 RISC-V 可以和 x86-64、ARM 分庭抗礼(尽管小氯还没见过任何使用这个指令集的消费级计算机)。 + +我们还可以继续深挖吗?可以,但是这就不是小氯的专业(准确来说是专业的一半)——计算机科学与技术擅长的领域了,而是牢无(电子工程系)的专长。据小氯粗浅的了解,再往下的部分可能是晶体管布局,这东西有强专利性,虽然据说 Google 和 SkyWater Technology 合作过开源 PDK,但是目前还没见过完全开源的晶体管设计工艺。我们甚至还可以继续:制造工艺、物理材料和光刻机之类的设备,至少就目前人类的认知,这些东西根本不可能开源。 + +对于小氯来说,虽然一台 100% 开源的 PC 非常酷,但是使用的机会成本实在太大了,这不符合小氯专业的另一半(金融学)。小氯将来最多到达固件的级别就可以了,咱也不是钻牛角尖的人。 + +## Next-Gen Information Browser? + +如各位所见,这个标题是 [Follow](https://follow.is) 的口号,字面意思是「下一代信息浏览器」。但是如果要我来翻译,我会翻译为「面向未来的信息聚合系统」。 + +把「Next-Gen」翻译为「面向未来」是小氯的习惯,容我解释一二:如果是「下一代」,那么下下一代呢?下下下一代呢?子子孙孙无穷匮也。但是「面向未来」不一样,只要开发者能够保持积极的开发、维护和创新(有的时候甚至是完全的重构,也不知道这种情况下产品还能不能算原来的那个,忒修斯之船了属于是),那么我们似乎可以用到海枯石烂。当然,这只是个翻译问题,最终能否在未来相当长的时间内不落伍于时代还是要看软件本身的素质和社群的活跃度。 + +那么「信息聚合系统」呢? + +「信息」自不必说,「系统」是指一套完整的、自洽的、内部交互的、带有可使用 API 接口的工具和工作流程。至于「聚合」,字面意义上说,它和「浏览」是两个不同层次的事情:「聚合」是一个事实性的功能,亦即使得不同的信源能够统一地归并到和显示在同一个地方;而「浏览」是人类的动作,就是「看」,准确来说,快速、粗略、初步地看。在英语中,browse 也有随意地、无目的地看的意思,一般网页会使用这个动词。而浏览时或者之后还会有更进一步的动作,例如批注、整理、消化、归档和应用等。但是显而易见,在这个信息获取的流程中,「聚合」是一个基础性的流程。尽管这不是一个 BREAKING CHANGE,但是确实是一个提高效率的好手段——毕竟如果等待我们获取的信息分散在太多的角落,记起来确实麻烦。人类的第一大脑利用得普遍不太充分,不然也不会费这么大劲折腾第二大脑。 + +--- + +小氯一直在使用一个软件:[Omnivore](https://omnivore.app)。Omnivore,杂食者,简单来说是一个开源、全能、跨平台的稍后读(Read-It-Later)软件,或者也可以叫网页剪藏器。[^1]不过,Omnivore 的功能不止于此,其还有一些其他的功能,包括批注、Obsidian / Logseq 联动等,甚至还有 RSS 阅读——准确来说,是 Subscription,不只是 RSS。当然,Newsletter 似乎还不行。 + +小氯十分欢喜 Omnivore,除了还不能省力地自托管,Omnivore 几乎就是小氯理想的 RIL 软件。但是爱折腾的小氯也不止一次想过,Omnivore 能否成为一个理想的信息聚合系统。前面说,小氯希望和互联网脱轨,这也算是一种信息层面的脱轨吧——一个自我保护性的信息茧房。 + +所以,我们——或者还是不要随便代表大家了吧,小氯,平时的「信息聚合」到底有哪些要素? + +不难归纳得出以下方面: + +- RSS / Atom / JSON Feed,或者统称为「非交互式订阅」。其中 JSON Feed 还没见过,据说是个比较现代化的东西。此外 RSS3 好像也和 RSS 不一样,理论上来说应该单列的。 +- Newsletter,或者称为「交互式订阅」。一般 Newsletter 都是通过邮件分发的,当然也可以通过 Webhook 和 Bot 一类的方式。 +- 任何类型的我觉得有价值、需要保存、一会儿去读(~~也可能是永远不读~~)的网页内容。可以是「有些趣味」的消遣内容,可以是发现里面有新奇东西的 FYI,可以是自己正好需要的 step-by-step tutorial,可以是看了第一句就感觉不简单的深度好文。当然,也可以是单纯希望给文章存个档——虽然说我们有其他的方式,例如一些扩展可以直接把整个页面保存为 Markdown 甚至完整的 HTML,并且小氯不推荐大家当 browse 方面的数字仓鼠。 + +如果要实现无缝聚合,其实现无非就是以其中一种为主要,例如把所有东西都变成 RSS 或者 JSON Feed 或者这类的东西(但是小氯觉得这样很难做到「剪藏」),或者把所有东西都发到邮箱里(这个还算可行)。无论使用哪种方式,都相当繁琐,而且很难做到统一且良好的体验。所以说一个退一步海阔天空的方式应该还是接受一定的缝合,但是如果需要后续进一步的消化处理的话,还需要有一个统一的底层结构,这不是什么容易做到的事情。 + +其实如果要说现在的各种产品中,最符合小氯要求的,应该还是 Follow。Follow 最近刚刚进入 Beta,加了一堆新功能,其中包括收件箱——你可以创建一个 `xxx@follow.re` 这样的邮箱(不知道只能创建一个还是可以有很多个)接收邮件,当作 Newsletter 使用非常合适(估计会有人拿来接码,小氯不提倡这种行为)。Follow 甚至显示可以接收 Webhook,不过 [DIYgod](https://diygod.cc) 只在 Wiki 页面写了个 TODO,估计是还在开发中吧。此外 Follow 也搞起了多软件联动,包括 Readwise、Instapaper、Eagle、Omnivore 和 Obsidian 等软件都有集成,只不过小氯还没试过。 + +目前来看 Follow 还是很有潜力成为一个合适的 All in One 信息聚合系统的,但是至少在一段时间内,小氯并不考虑将 Follow 作为主要的信息聚合系统。一方面,Follow 还没有一个完善的移动端(目前的说法是还在做,但是这会怎么进行同步呢?);另一方面,Follow 缺少一个书签或者是网页剪藏功能,而这是小氯所必须的。最重要的,据小氯所知,Follow 需要一个账号。尽管这在 Follow 的特殊条件下是可以理解的,而且 Follow 的轻社交也是个很有意思的设计,但是小氯只希望安安静静地读点东西,没有任何人能闯进我的书房。 + +## 如果生命只剩三天 + +这周上马原的时候,老师向我们提了一个问题:如果你的生命只剩下了几天,例如说三天,你会用剩下的时间做什么? + +这个问题涉及到对生命意义最本源的探讨,这是古往今来的人类群星们都在认真思考的问题。但是对小氯酱这只对哲学几乎没什么认识的元素娘而言,小氯只相信第一感觉。 + +所以,小氯的第一反应是:**回家去吧**。 + +不管怎么样,编一个合适的理由,尽快买好回去的车票——飞机票如果更快也行,这时候钱早就不重要了。在路上回顾一下,这十几二十年的人生究竟是怎样的。再看一看小县城的落日,吃一次妈妈做的菜,陪外公外婆散散步,睡一次自己从小到大躺惯了的床。在最后一个晚上,假装买了那趟十几个小时的卧铺,告诉家人已经准备启程回校,然后悄悄找一个僻静而美丽的角落,在北方秋天萧瑟的晚风中,感受气流穿透自己的身体和灵魂,看着自己用惯了的躯体化为原子和微粒,投身苍穹,万物长拥。 + +……上面的场景当然是虚幻而矫情的。但是小氯在想到这个问题时,甚至都没有分哪怕是一点思绪给生活中的其他人,或者自己平时喜欢的任何事。满脑子只想着,回去见家人最后一面,以及如何合理地将他们蒙在鼓里。 + +**第一感觉不会欺骗你**。由此可见,家人和亲情在小氯的生命中,究竟占有怎样的地位。 + +如果按照星座的说法,小氯是巨蟹座,而巨蟹座的很大特点就是恋家。不过小氯一向不信星座的说法,而宁可解释为一种在特定文化氛围和生活环境下的强烈心理依赖。如[从前所说]({{< relref "Ephemeralis-Weekly(8):七日漫谈.md" >}}),小氯有一个自认为非常幸福的原生家庭,而在小氯的成长中,家人一直起到了几乎是绝对的支柱作用,直到现在都是这样。遇到自己完全拿不定主意的问题,小氯的第一反应永远是去问问自己的家人;而任何有趣的日常或者大好的消息,小氯第一个分享的也不会是别人。 + +写到这,小氯有点疲惫,不自觉地抬起头活动了下颈部,然后视线就撞上了书架上摆着的全家福——那是高三那年过年时拍的。我们穿着喜庆的红色衣服,在明亮的灯光下,笑得无比灿烂和幸福。 + +> 若世上有神明,我向您祈愿,愿我们阖家团圆,平安喜乐,天长地久。 + +[^1]: 严格来说两者并不一样,你只打一个书签存起来也算是 RIL,用 Save Page WE 这样的插件把网页变成一个完整的自包含 HTML 也算是网页剪藏。小氯一般在两个场景下使用这个功能:遇到一篇希望日后读的文章,或者是遇到了容易消失或者希望保存的文章。当然,二者有重叠。 \ No newline at end of file diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(12):浮沫之下.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(12):浮沫之下.md new file mode 100644 index 0000000..95f6b0b --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(12):浮沫之下.md @@ -0,0 +1,258 @@ +--- +title: Ephemeralis-Weekly(12):浮沫之下 +date: 2024-11-10 +summary: 浮生散记第十二期 +description: 本文是作者周报的第十二期,涵盖了从日常生活到技术探索到哲学思考的多方面内容。文章开始分享了《功利主义》的读书报告以及期中考试周的繁忙,展现了在学业压力下的时间管理和学习策略。接着,文章转向了对个人技术栈的更新和调整,讨论了更换 Newsletter 服务的需求,同时还分享了更换静态资源 CDN 的尝试以及字体分发策略的调整,此外还涉及邮件管理以及希望更换更贴合个人形象的域名。在消费行为上,分享了因冲动购买 VPS 而后悔的经历,引发了对理性消费和冷静期的讨论。此外,文章记述了校园内咖啡店即将停业的消息,表达了自己的感伤。此外,作者表达了对 ColorOS 的强烈批评和更换更加纯净的安卓系统的愿望。最后,作者从用 Python 占卜开始,深入讨论了从伪随机数到量子现象的随机性,引申出对世界决定论和随机性的哲思。 +categories: ["人间世"] +series: 岁时录 +tags: + - 周报 + - Newsletter + - 日常 + - 域名 + - 随机性 +slug: weekly-12 +featuredImage: https://img.viento.cc/cover/weekly-12-cover.webp +draft: false +wikilinks: true +--- + +各位老友们好,我是 Chlorine。新的一期周报,双手奉上。 + +本期的标题主要来自于对文中几个主题的引申,依然很抽象。同时本期内容时间跨度比较长(原因请见文中),内容冗长且杂乱(本来这期周报会更长的,但是被小氯砍掉了两个还没想好的话题),希望各位老友不要嫌弃 qaq + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第十二期,日期范围为西历 2024 年 10 月 28 日至 11 月 10 日。祝食用愉快。 + +## 读《功利主义》[^1] + +实际上这并不是小氯突然正经起来,要抽出时间读点哲学著作了,就算是,正在被一堆 DDL 和期中考试殴打的小氯也不会选择在这个时候深化人文素养。纯粹是因为 CTMR(批判性思维与道德推理)课程要求写《功利主义》的读书报告,而且周五就要收了而已。 + +…………(不敢哭出声) + +总体来说这本书不厚,只能算是本小册子。同时除开奇怪的翻译腔之外,讲得也不算特别晦涩,包括最大幸福原理、正义和功利的关系等都讲得很清楚,对于希望入门式地了解功利主义的老友来说是个很好的选择。 + +## 期中周 + +众所周知,小氯虽然是只鸽子,但是在周报方面还是尽可能保证每周写几段不长的内容。但是上周小氯一反常态地鸽掉了周报,不是因为小氯太懒(~~虽然也确实不勤快~~),而是因为,每学期一次的大清洗——期中寄即将开始。 + +对于小氯来说,期中寄基本上是期中周,DSA 的 PS2、LAB2,会原的大作业(中作业?),大物、社调和中微的期中考试都在这周。ICS 的 Bomblab(经典的拆弹实验)虽然也很可怕,不过 DDL 比较远,可以暂且放一放。 + +大概从周四(有可能是 10 月末,11 月初的样子吧,小氯已经记不清具体几号了)开始,小氯意识到再不开始写和复习,估计真要寄了,于是当天加周五摸鱼的时间拼死拼活地赶了一道 PS。这里需要解释一下,一次 PS(Problem Set)包含若干道题,分为几个题组(大概是两三个),每个题组选做一道即可。每一道题都是非常霉耗的编程挑战,对于 OI 大佬们不值一提,但是对小氯来说简直就是噩梦。 + +然后周末继续干活。为了避免 PTSD(~~实际上已经了~~),小氯先做了会原的大作业。大作业是根据一份交易明细填充账目,然后做 Annual Adj,最后总结出 Consolidated Statement of Earnings 和 Consolidated Balance Sheets 之类乱七八糟的东西,实际就是一点应用。不得不说,这个东西比看起来简单且有意思多了,小氯小半天就解决了(这甚至是一份小组作业,但是单人写非常轻松)。 + +本来想着周末能搞完两样就 OK 了,但是想想下周霉耗的考试,小氯还是强撑着开始搞剩下的 PS。过程之曲折不多说了,总而言之就是小氯奇迹般地实现了在周末对题目进行的大扫荡,把 PS2 基本送上西天。其中有一题解题过程非常有趣:小氯写了一两个小时感觉没什么头绪,就去答疑中心摇人去了,结果和大佬交谈了两句,自己突然福至心灵,调整了一下两行代码的顺序,然后……就过了。在剩下的周日,小氯甚至还抽空写了半道 LAB2。 + +一周末搞掉这么多东西,确实可以说是战果累累。然而一刻也没有为 PS2 的完成而庆贺,马上赶到战场的是终危。接下来的几天小氯都在终危中挣扎,所幸考试不算特别难;然后是社调,纯背,无甚可讲;然后是大物,同样很幸运地不算难。在大物考完的晚上,也就是今天晚上,本学期第一次高技术战争的线下课上,小氯整理了 LAB2 的报告,当 Report 上传完成的那瞬间,小氯的期中周就算是结束了。 + +总体而言……怎么说呢?要是说学习效率的高低,这周确实很高,毕竟我之前一周都做不了一道 DSA。但是无可否认的是:小氯酱真的很累了,~~简直要坏掉了~~。于是第二天早上大胆地关了闹钟,睡了个自然醒。 + +## Newsletter? + +在之前的文章 [Hello,Quail]({{< relref "Hello,Quail.md" >}}) 中,小氯宣布使用 Quail 作为园子的 Newsletter 选择。 + +不夸张地说,在小氯见过的同类产品中,Quail 是最好的一个,甚至可以说没有之一:对大陆地区友好(这点就可以打败更加老牌且强劲的 Substack 了),出色的编辑器,Obsidian 支持,等等。同时 Quail 的创始人[歌词经理](https://blog.lyric.im/) 也是位很 Nice 的开发者,对于 Issue 的讨论非常友好和开放(可以看[这里](https://github.com/quail-ink/obsidian-quail/issues/12))。 + +不过……问题是,小氯主要把 Quail 当作 Newsletter 使用,因此除了 Newsletter,小氯不在乎其另外的功能。至于 AI Summary,由于 Quail 自带的摘要功能的质量实在是不太理想,因此小氯大部分时候采取直接复制全文到大模型聊天框的方式,所以这个功能也用不到了。对于这样一个平台,如果不能回馈给其对应的价值,只是在「关于」里面轻飘飘地提一句,那么在使用 Quail 的服务的时候,小氯是过意不去的(~~Vercel、Netlify、CloudFlare:我们没意见~~),这也算是种功利主义的道德原则吧。而且现在小氯在每次发布前,都需要做一番调整,例如生成元数据,手动发布,然后上传封面图(S3 流量这种东西还是能省点就省点吧)。这个工作量不大,但是心智压力不小。 + +于是小氯就在琢磨着,找一个新的 Newsletter 方案。 + +目前小氯其实比较喜欢 [Listmonk](https://listmonk.app),Go 语言完成的项目,现代而简约。但是 Listmonk 需要 PostgreSQL,小氯非常不希望在自己的服务器上安这个大家伙,而作者又明确说不支持 SQLite,因此就造成了这种尬住了的情况。 + +对于小氯这种超轻量级(一共四个订阅者 🤣)的使用来说,其实最简单的方案就是写个 Python 脚本,每次发布之前在本地跑一遍。不需要数据库,一个 `subscribers.json` 即可,甚至硬编码都行。即使小氯对 Python 不甚了解,但是只要给小氯一点点时间,就能写一个对小氯来说生产可用的脚本出来。 + +不过要是有时间的话,小氯还是希望自己写一个可用的项目出来, + +## 新的静态资源 CDN + +最近[清扬老友](https://www.liushen.fun)推荐了一个新的 jsDelivr 加速镜像:[智云加速](https://cdn.smartcis.cn)。小氯是信任清扬老友的,因此也可以接受这个二阶信任链。所以小氯把自己的 `gcore.jsdelivr.net` 换成了这个加速站点,毕竟 jsDelivr Gcore 虽然在大陆能比较快地访问,但是这个比较也是相比 jsDelivr 主站点而言的。 + +不过这里小氯遇到了一个问题:小氯的站点字体(LXGW Bright 和 Fira Code)也是用 jsDelivr 加速的。jsDelivr 的使用条款没有禁止分发字体,OFL 1.1 许可证也允许使用 CDN 分发,**但是对于镜像站不是这样**。因为相比 JavaScript、CSS 等文件而言,字体是一种比较大的资源——尤其是中文字体,即使是分包之后也是如此,而在当下的环境下,做公益镜像本就举步维艰,再把镜像作为图床或者字体 CDN 显然是一种竭泽而渔的恶劣行为,而智云加速的主理人也明确禁止使用智云分发字体(这在技术上应该不算太困难,直接把特定后缀的文件禁止掉就完事,即使引用的是 `result.css`,`.woff2` 加载不出来也白搭)。 + +于是小氯没有把字体切到智云,Fira Code 还是使用的 Gcore,而 LXGW Bright 则换成了[中文网字计划](https://chinese-font.netlify.app)的 Deno 线路。Deno 线路实际上是用 Deno 的运行环境转接的 ImageKit,所以这个自建也问题不大。 + +嗯,自建,好主意。自己有一条和公共线路质量相近的线路总归不是件坏事。于是小氯开始忙里偷闲地尝试一些可能的分发方式,目前为止尝试了以下方式: + +1. Gcore + Netlify:每个月 1 T 流量,绝对用不完,然而由于小氯不太了解 CDN,Gcore + Netlify 总是出错误,遂放弃。 +2. Netlify 直连:每个月 100 G,似乎可以通过一些方式升级到每月 1 T。结合优选线路速度尚可。 +3. Deno Dev + ImageKit:很顺利,速度和 Netlify 相近,但是最好套一层 CDN。至于套什么 CDN,各位可以自由发挥。 +4. 无畏云:[杜老师](https://dusays.com)推荐的 CDN,免费额度很高,很适合(在有备案的情况下)对接对象存储来分发图片和字体。不过官网打不开了,不知道怎么回事。 +5. 多吉云:速度非常快(废话,国内 CDN),每个月 20 G 也算够用。由于小氯上传字体文件一般都是直接丢到仪表板上,因此没有 SDK 也无所谓。 + +现在小氯还是选择了多吉云,不过目前线路还没有完全切过去。毕竟国内 CDN 这种东西实在是太 fragile 了,小氯有点害怕。 + +最后,容小氯抱怨一句:滥用真的太可怕了,当年的 jsDelivr 本来是为数不多的能够在大陆地区流畅运行的开发资源 CDN 之一,结果一大批人用 jsDelivr 当图床、视频床,甚至借助 `gh` 字段分发违法内容,结果就是 DNS 污染、备案吊销,导致现在 jsDelivr 在大陆基本处于不可用状态,结果只能出现这种「CDN 的 CDN」的离奇场景……为了自己的幸福,损害了大多数人的幸福,最后连自己的幸福都丢掉了,抱歉,这非常不功利主义。 + +**以及,向无私地提供公益服务的开发者和运营者们致敬,人类的幸福因你们的嘉言懿行而极大地增进。** + +## 小氯的 Mailbox + +最近小氯收到了一封邮件,这封邮件的一部分内容大概是长这样(这不是加密前的原文,只是希望给大家展示下到底是什么感觉): + +![780](https://img.viento.cc/IMG-20241110112637.avif) + +这很明显是经过加密的。小氯一下子来了兴趣,毕竟这可是小氯收到的第一封加密邮件。于是小氯用自己的私钥进行了解密,并与发邮件的老友进行了友好的交流。期间还出了一点有趣的事情。 + +在回复邮件的时候,小氯想了一会儿怎么样才是最安全的。思来想去小氯使用了最淳朴的方法:写 Markdown,用 GPG 加密之后作为附件发过去。这样就不会受到邮件客户端的束缚了。 + +写完邮件,小氯开始思考,小氯到底需要什么样的一个 Mailbox 体系。 + +在电脑端,小氯希望能有一个足够好的客户端环境:足够的兼容性,现代化的界面和编辑体验,足够快的速度,以及支持 GPG 加密;至于在手机端,小氯的要求很低,能看就行。对于特别的邮箱(例如小氯的域名邮箱),小氯会希望能够收到即时通知。但是对于 IMAP 协议来说,即时通知并不算什么容易的事,除非把客户端一直挂在后台(这个我还没试过);JMAP 能够比较好地支持即时通知,悲摧的是现在支持 JMAP 客户端的服务端和客户端并不多,其难度相当于在一食堂找疙瘩汤。 + +说回正题。由于牢果的生态实在是太封闭了,因此小氯根本找不到几个开源的邮件客户端,像 Evolution、KMail 这些都只能在 Linux 的特定桌面环境下运行。目前 macOS 能找到的大概是: + +- Thunderbird +- Mailspring +- Claws Mail + +Thunderbird(雷鸟)属于比较著名的选择,其支持大量的插件和主题,还有一些社区修改版,比如~~好鸟~~Betterbird。但是其界面和交互就给我一种……嗯,怎么说呢?有点古典的感觉。Claws Mail 更不用说,主打一个古典。这可能会吸引一些喜爱经典皮肤的极客,但作为一个现代 UI 风格的爱好者,小氯对此并没有什么审美上的触动。其中最好看的应该还是 Mailspring,界面比其余两个现代得不止一星半点。很可惜,没有 GPG 加密和签名功能。 + +至于手机端(iOS),笑似,除了 Delta Chat 就没有开源的邮件客户端了(此处排除了 ProtonMail 和 Tuta 这样的专有邮件客户端,此外 Delta Chat 严格来说也不是邮件客户端)。Thunderbird 几年前就说要出 iOS 端,到现在还是没动静,估计是没有下文了。 + +目前为止,还是在半推半就地用 Apple Mail。可能享受丝滑的开源邮件服务的唯一方式,就是换个生态系统了吧(笑)。 + +## 换个域名? + +眼看着园子马上要一周年了,小氯也开始梳理起了园子这一年的经历,以及也是用一颗热爱折腾的心在思考是否有什么 BREAKING CHANGE,可以趁此机会做了。 + +其中一个比较重要的点是:域名。前几天,[DuckXu](https://i.duckxu.com) 老友在评论中提到: + +> 感觉这个新域名比 yoghurtlee 更能突出【小氯】这个形象,我现在在备忘录里看到 yoghurtlee. com 经常反应不过来是谁( + +小氯对此深以为然。那 `yoghurtlee.com` 这个有一点奇怪的域名是怎么来的呢? + +Yoghurt 并不是字面意思的酸奶(虽然小氯确实很喜欢喝酸奶),而是涉及到现实中小氯的英文名字。这个英文名是我高中的英语老师送的,我对之十分欢喜,虽然说一般来说并不建议使用食物的名字作为英文名。在园子刚刚建立的时候,小氯就按照这个英文名买了域名。这个拼接实在是太冷门了,所以自然也不会有什么人抢注。 + +随着时间的推移,园子几经搬迁,小氯的 ID 也改成了现在的 Chlorine 和小氯,而原本的英文名字小氯也渐渐不再使用了,还是使用非常通行的汉语拼音。所以说,现在换个域名似乎是合适的选择。 + +但是小氯原本的域名在 SEO 和 Google 收录等方面已经积累了不少的权重,也绑定了开往和 Algolia Docsearch 等服务,更换起来有一点麻烦。 + +最重要的问题是:**换成什么呢?** + +小氯之前买了个很有趣的 Domain Hack,但是这是某个国家的 ccTLD,由于其监管的特殊性(需要 KYC,无 whois 隐私保护),用这个显然是把自己的隐私当成街头校报分发。而且这个后缀也不能备案,虽然说小氯的博客也用不到备案(没有用国内 CDN,需要备案的服务都不在上面)。 + +对于直接使用 `Chlorine` 作为前缀,这虽然看起来很直观,但是实际做起来非常麻烦。虽然说用这个词当 ID 的应该不会太多,但是作为一个完整的英语单词,Chlorine 本来就存在溢价。大部分能注册的、后缀不太奇怪的域名都被抢注了。 + +一个退一步的选择是加一点词汇,比如 `hichlorine.com` 之类的。或者是使用一个简化版本的昵称,例如 Clori 或者是 Cloriti(可以参考[这里]({{< relref "Ephemeralis-Weekly(7):唯有时光.md" >}}))。在挑了半天后,小氯拎出来了一大堆选择,简单列一列,~~水一点长度~~: + +- `chlorine.dev` +- `chlorine.fun` +- `chlorine.one` +- `hichlorine.com` +- `imchlorine.com` +- `chlorinya.com` +- `chlori.net`(Domain Hacker) +- `chlor.ink`(Domain Hacker) +- `clorii.com` +- `cloriti.com` +- `clori.cc` +- `clori.dev` +- `hiclori.com` + +目前小氯还没想好这件事到底应该怎么办,各位老友能给一点建议吗? + +## 冲动消费与冷静期 + +很早就听说了 Cloudcone 在搞 PBF(Pre-BlackFriday)活动,把机器卖出了白菜价。上次小氯就想着冲一台,奈何没货了。周三看到[青山大佬](https://yinji.org)(算是圈里面比较著名的 Cloudcone Affiliate)说 Cloudcone 补货了,正好小氯刚刚考完~~终危~~中微,相当兴奋,于是果断买了一台。`2C1G` 的配置,每月流量 3T 带宽 1G(~~什么吕布骑猪~~),一年差不多 14 USD,确实非常便宜。~~顺带着小氯还买了另一个传家宝数字 `xyz` 域名~~。 + +然而在高高兴兴地开完荒之后,小氯随手 `free -h` 了一下,然后看到了一个令我头皮发麻的数据:目前,机器的可用存储空间和内存都已经不足一半。 + +那小氯干了什么?也不过就是预选的时候选择了最熟悉的 Ubuntu Server,然后用 Docker 跑了个 Nginx Proxy Manager(我甚至都不敢装 1Panel)。哦对了,还有开了 2 个 G 的 swap。 + +用惯了 4 G 内存的机器,这个 1 G 的小家伙简直像来凑热闹的。 + +在经过反复调查后,小氯得出了一个令人沮丧的结论:这台机器几乎无法托管任何稍大一点的项目。毕竟,你不能指望人在瓦片上跳舞。虽然带宽和流量极大,适合用来做一些网络安全方面的学习和研究(~~请自行理解这是什么意思~~),但是小氯并不缺这样的工具。 + +所以,思来想去,小氯把这台很优惠的 VPS 销掉了,钱款还留在 Cloudcone 里面,毕竟将来大概率还是需要一些 VPS 的。 + +由此可见,冷静期确实是个很好的东西。不过,我们更应该反思的,恐怕是我们当初为什么会脑子一热。虽然我们不能要求自己时时刻刻理性,但是至少应该做到大部分时候理性。 + +## Farewell,Mong's Coffee + +早起看到班里同学转发了一条推送。小氯兴趣使然地点开看了下,大致意思就是我们校内的一家咖啡馆要停业了。不得不说,文笔真的很好,让小氯一个从来没去过那里的人都有点感伤。小氯前几天也写了一篇 [[Farewell,Omnivore]],但是实在是和这篇文章的功力差远了。 + +在高中的时候,小氯曾经和朋友一起喝过一点咖啡。当然,什么好的咖啡是不可能的,只是那种最普通的雀巢,拿着教室饮水机的热水冲一冲,简单搅一搅,就是支撑人度过一下午的饮料。不过说实话,这种方式对小氯的作用似乎非常微小,喝了和不喝几乎一样。再加之后来小氯的身体越来越差,就把咖啡停掉了。 + +上了大学后,小氯依然是对咖啡兴趣不大,只是偶尔当作一点饮料去喝,更多的时候还是水,牛奶,茶或者果茶。瑞幸的话点过一杯生椰拿铁,但是小氯觉得极其难喝,因此从此对这些十元钱以上的咖啡敬而远之。没办法,小氯欣赏不了。 + +至于那个咖啡馆周围……小氯也不太熟悉。虽然说小氯每周一都去一体(我们的一个体育馆)上课,但是几乎从未踏进甚至接近过那座建筑,除了跟着班级去合唱排练和其他的一些琐事时。那里给我的印象宁静而高雅,若是接近一些,亦可闻丝竹管弦之盛。空气中永远弥漫着淡淡的馨香,只是小氯没有意识到,那是咖啡的香气。 + +现在呢,小氯只是在想……到底有多少东西,我们从未知晓,等到知晓的那一天,却已经永别了呢? + +## This is completely unacceptable, ColorOS + +> [!WARNING] +> 下面的部分内容带有极其强烈的情绪化色彩,请谨慎阅读。 + +小氯本来想写的是「Shame on you, ColorOS」,但是感觉还是太冒犯了。由于成长过程中的种种因素,小氯对于带有冒犯性的话非常敏感,现在在中文中能说出的最重的斥责大概也就是半开玩笑的「虫豸」。像 Linus Torvalds 那样直接来一句「Fxck you NVIDIA」,对小氯来说确实是难以启齿的。 + +好的,那么本段的炮击对象也很明显了,就是小氯的牢硼铀,OPPO 的 ColorOS。 + +小氯曾经是个 Windows + Android(OPPO)+ iPad 的混搭组合,目前使用的是 Apple Eco(iPhone,iPad,MacBook,AirPods)。不过按照小氯目前在开源世界里一去不回的架势,估计总有一天会换到 Linux + AOSP 的。而且,iOS 实在是过于封闭了,开源生态堪忧,甚至通知都要全部走 APNs,确实挺难绷的。 + +但是话说回来,Android-based 的系统也是各有千秋的。而国内各大厂商的锐意创新和精耕细作,造就了一批运行流畅、尊重隐私、自由度高的 modified-Android。就以小氯曾经用过、现在在作为备用机的 OPPO 使用的 ColorOS 为例吧,其优秀操作包括但是不限于不能卸载原装应用(甚至使用 adb 都不行),开启 Dev Mode 之后就疯狂弹通知乃至报出一些我都不知道是哪来的应用的退出错误(~~你退出就退出吧,这辈子都别重新启动才好呢~~),五彩斑斓的广告,关不掉的安装器(以及其扫描和强制检查)……给小氯的感觉就是,家里住了一个流氓,吃我的用我的,整天翻我的日记,对我的家事颐指气使,而且赶还赶不走。 + +……稍等,小氯去喝口水,平复下心情。 + +嗯,对,那边的那几个把头转过来,别走神,别以为没直接批评你们你们就可以高枕无忧了。HyperOS,MIUI,OriginOS,还有那些我忘记你们叫什么了的系统,你们都别想跑。都是一群虫豸,和你们在一起,怎么能搞好技术呢(鸿蒙我没用过,不评价)? + +反正小氯最后的状态大概是这样的: + +![789](https://img.viento.cc/IMG-20241109182434.avif) + +这话没开玩笑。如果小氯将来从 iOS 脱身的话,就绝不会再碰任何一种国内的安卓系统(指作为主力系统使用)——严格来说,都不能说是 modified-Android,应该叫 botched-Android 或者 tampered-Android。要么是买一台现成的原生安卓手机,例如 Google Pixel,欧版的 OnePlus(有广受好评的 OxygenOS,而且得益于 GDPR,隐私方面会更好些)或者 Nothing Phone,要么就刷机。现在小氯已经开始收集一些很旧的手机,大部分是小米的,准备刷着玩练练手。 + +(当然,倒也不是说,国产安卓系统就是一无是处,其也是有一些优点的,例如本地化适配。但是对小氯来说,这些优点相比缺点带来的理性和情感损失实在是微不足道。 + +## 用 Python 占卜? + +实际上,本节的标题有一点误导性。本节既不讲 Python,也不讲如何占卜。 + +如果我没记错,我在先前的博文中,不止一次提到过「我一位谙熟语言学的学长」或者是「我一位研究人文社科的学长」这一类的描述。这并不是无中生友,这些称呼说的都是同一个真实存在的人:一位比我高一届的高中文科学长,可能也是我的诸位微信好友中最懂哲学的一位。我,这位学长,[孙哥](https://clf3.org),我们都是关系很好——至少是不错的朋友。 + +我的这位学长没有一个通用的昵称,我平时一般也只称呼他为「学长」,那就让我们这么叫吧。 + +我的这位学长是位涉猎甚广、思路开阔的奇人,知识面从政治学到世界历史到理论社会学到古希腊语到歌剧学到罗马艺术到小学教育到概率论到线性代数到分析力学到烧烤的吃法再到崩坏星穹铁道,其各种新奇的想法更是层出不穷。 + +在他茂密的技能树中有一个不那么起眼的技能:占卜。他曾经兴致盎然地对我说,一次孙哥到他那里玩,他给孙哥算了一卦,后面证明非常灵。 + +我问:您用的是什么?蓍草吗? + +他说:Python。 + +我哑然失笑。 + +Python 用来占卜,那显然就是随机数了。这样是否就意味着占卜神圣性的消解?毕竟,很难会有人觉得随机产生的数字有什么神圣性。 + +不过,我们还可以想另外一个更离奇的观点:**计算机的随机数,是伪随机数**。这会象征着什么? + +让我们稍微深入地谈一谈这个问题。 + +Python 的随机数生成基于的是 `random` 模块(也可以用 `secrets`),其核心是 Mersenne Twister(梅森旋转算法)。MT 算法的原理比较复杂,简单来说就是使用一个固定大小的内部状态数组(对于最常用的 `MT19937` 来说,n 为 624,每个元素是 32 位整数——注意,这个说的是二进制位),然后经过一堆操作之后输出数字。由于最后的范围是一个梅森素数,所以得名梅森旋转算法。 + +但是,尽管 MT 算法可以产生在随机性上表现良好的数,但其并不是真正随机的。事实上 MT 算法甚至是线性的,连混沌系统的内禀随机性都不是。 + +所以说,我们有一个令人兴奋又不安的决定论假设:理论上来说,我们只要知道种子,就可以推导出后面所有的数字——这和传统中的以生辰八字推断人的命运可以说是别无二致。然而请注意,我说的是**理论上**,事实上这样做几乎不可能。大衍之数,窥见天机,是要受天罚的。 + +而且,伪随机数有一个特征:它们实际上都是极长但是有规律的。也就是说,在经历足够长的时间后,我们可以再次观察到相同的序列。 + +不知道大家想到了什么,但是我想到了《皇极经世》,尽管我根本没看过也不想看这本书。 + +那如果我们使用的是「真随机数」呢?例如基于大气运动? + +这事确实可行。忘记什么时候听过一个趣事了:在 CloudFlare 的总部中有一面熔岩灯墙,员工们需要随机数的时候就拍一张照片(此处感谢 [@minc](https://itedev.com) 老友的指正)。不得不说,这是个挺有意思的事情。 + +不过这里面还涉及另一个有趣的问题,就是我们日常所说的「随机现象」,其到底有多少是随机的,随机的程度如何。或者说,随机现象能分级吗? + +我们从计算机的随机数开始。如上文所述,计算机随机数大概可以说是「线性伪随机」的,其随机程度最低,尽管在日常使用中可以作为很好的近似。 + +下一级的随机,可能是混沌系统。混沌系统是一种非线性系统,其运动状态由非线性的微分方程、差分方程或者迭代方程等描述。混沌系统具有高度的初值敏感性,初始状态的一点微小变化就可能引起后续观测的巨大差异(俗称「蝴蝶效应」),这使得混沌系统的行为在实践中是难以预测的,表现出类似随机的特性。但是**混沌系统实际上还是确定的**,其只是具有内禀随机性。因此,我们不妨将其称之为「非线性伪随机」。 + +接下来就是所谓的「真随机」了。真随机一般也是物理现象,例如大气噪声等。就目前我们的认识来说,「真随机」的尽头是量子现象。量子现象,比如说放射性衰变和光子的偏振滤波,被认为是本质上不可预测的,只能使用概率进行表示。 + +不过,如果我们「撇开量子的浮沫」,世界究竟是不是随机的还难说呢。几百年前就有拉普拉斯妖的假说(机械唯物主义),尽管目前我们根据测不准原理和最大熵原理[^3]可以反驳掉这个说法;而《镜子》中描述的故事,就是在有了完善的奇点模型、宇宙决定论和足够的算力(超弦计算机)后,世界就成了完全确定的沙盒。尽管最后也没能完成对近期未来的递归预测,但是世界的运行轨迹都是确定无疑的。 + +好吧,讲着讲着就跑题了,上面那句「占卜神圣性的消解」早不知道丢到哪去了。而且,以上的叙述涉及一点物理知识,小氯对物理几乎一窍不通,因此如果出现错误,敬请批评指正。 + +[^1]: 对不熟悉哲学的老友们提个醒,功利主义(Utilitarianism)中的「功利」和我们平时常说的功利是两个意思,不带有什么贬义。其实小氯觉得,翻译成「效用主义」可能更好点,毕竟经济学中的「效用」就是这个词。但是「功利主义」这个词汇有历史惯性,而且也有自己的优点,故遵循旧例。 +[^2]: 这里涉及另一项有趣的研究,也就是根据最大熵原理和光速等,得出拉普拉斯妖处理信息的能力实际上存在一个极限。可以看 Wikipedia 或者是[这里](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.88.237901)。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(13):生活的起伏.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(13):生活的起伏.md new file mode 100644 index 0000000..1c2d567 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(13):生活的起伏.md @@ -0,0 +1,262 @@ +--- +title: Ephemeralis-Weekly(13):生活的起伏 +date: 2024-11-24 +summary: 浮生散记第十三期 +description: 本文是作者周报的第十三期。文章开篇,作者承认自己情绪存在波动,具体可以从不同的部分看出变化。作者提到为个人博客购买了新域名 `chloryn.com`,并详细阐述了选择这个域名的理由和过程。接着,作者讨论了“自设”的概念,并诙谐地表达自己无力创作视觉自设的无奈。在生活方面,作者描述了申请中行Mastercard信用卡的经历,还分享了一封遭遇勒索邮件的经历,并指出这类邮件只是毫无根据的恐吓,不应理会。技术方面,作者首次尝试刷机,将一台旧的小米 CC 9 手机刷成 LineageOS。此外,作者提到购买了新的 VPS,用于网站服务的部署。最后,作者以自己在宿舍中重拾睡前喝热牛奶的习惯为结尾,以平和的口吻描述了这种简单日常为其带来的宁静与满足感。 +categories: ["人间世"] +series: 岁时录 +tags: + - 博客 + - 周报 + - VPS + - 域名 + - 日常 +slug: weekly-13 +featuredImage: https://img.viento.cc/cover/weekly-13-cover.webp +draft: false +--- + +各位老友们好,我是 Chlorine。很抱歉因为个人的情绪波动和生活状态问题落下了一期周报。 + +这半个月小氯遇到了许多事情(~~但是长度还是比较短~~),经历了从颓废到宁静和充实再到极度焦虑再到略为缓解的多次起伏。个中原因小氯不希望多说,但是各位老友应该能从我文字风格的变化窥见一二。《热牛奶》那一章是我精神最安宁的时候写下的,而最近更新的 now 页面则是我最焦虑的时候写的。本期的标题也体现了这一状态(以及本期应该是第一期副标题不是四个字的周报?虽说对强迫症的老友不太友好吧,但是也跳出了一层文字的限制)。 + +以及,本周没有什么哲学,请放心观看 (/ω\) + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第十三期,日期范围为公历 2024 年 11 月 11 日至 11 月 24 日。祝食用愉快。 + +## 新域名……应该是几来着? + +~~现在买个域名已经不值得让小氯单独写篇文章了~~ + +这次是对[上一期周报的纠结]({{< relref "Ephemeralis-Weekly(12):浮沫之下.md" >}})的解答,苦思冥想了很久才想到一个比较好的、和 Chlorine 相关的域名:`chloryn.com`。 + +这个词读音很像 Chlorine,但是看起来并不是个很常见的英语词汇,如果非要说的话,带一点斯拉夫风格。所以还是让小氯解释下这个前缀是怎么来的吧。 + +其实小氯本来想用一个 Clori(小氯的西语名字,Cloro 的变体,Clorito 和 Clorita 的合并简写)的变体,但是实际上,小氯极少使用这个名字,平时所用的英语名字要么是 Chlorine,要么是拼音版本的名字(将来正式的英文名)。而且 Clori 看起来也并不容易让人想到 Chlorine。而加单词的变体,例如 `hichlorine` 或者 `chlorineworld` 之类的,又实在是太长了。 + +那么我们的选择就比较明显了,就是对 Chlorine 进行一些不改变(太多)读音和基本字形的变体。一些常见的选择包括: + +- chlorin:读音几乎不变,但是你猜我为什么不用…… +- chlorino / chlorina:一个男性化 / 女性化的名字,很有西语的风范。 +- chloris:古希腊神话里的花神(~~纳西妲?~~),和 Chlorine 的词根一致,具有强烈的女性化色彩。 + +很遗憾,这样的前缀用核外电子都能想到很抢手,那么很显然,常见的选择已经无法满足小氯的需求了(~~你今天废话怎么这么多?~~)。 + +于是,小氯发挥了传统艺能——问 AI。在 AI 给的一大堆选择中,小氯注意到了一个词:chloriny。 + +众所周知,i 和 y 的读音在很多时候都是相似的,那么如果用 y 替换掉中间的 i 呢?然后去掉不发音的 e,就有了一个更简单的域名前缀——chloryn。 + +`-ryn` 这个后缀并不是个常见的选择,因此不需要担心会不会出现品牌冲突和占用,而且也比较短和容易发音。最重要的是:它可用。所以,剁手吧。 + +依然是在 Spaceship 买的,不过由于用了一个 promo code `COMPROS`,直接把价格打到了不到 3 USD,确实太夸张了。继续挂到大善人 Cloudflare 上。 + +小氯还是挺喜欢这个域名的,后续可能也会考虑备案(涉及到转到一次套路云,外国公司应该没有域名所有权证书可以用)。应该在不太远的未来,园子就会换域名了。 + +~~冷知识:小氯这周还买了个 `herex.icu`~~ + +顺便再吐槽一句,现在域名续费是越来越贵了,套路云的 `.com` 域名都要 90 了……该把那些不用的域名放掉了 qaq + +## 画个自设? + +我们事先声明下,下文的「自设」都是指「自我设定」。因为据我的查找,广义上任何原创的设定都可以叫自设。 + +对于二次元文化圈来说,自设应该是一个近于必需品级别的存在(这是我根据周围的小样本概括得出的概念,不一定泛用)。虽说小氯并不是二次元文化爱好者(认为二次元风格的图片具有视觉吸引力的人群应该是远广于我们所说的「二次元」的),但自设也是个很好玩的事情,和我平时设计小说角色和世界架构一样好玩。 + +很可惜,自设一般是视觉形象,而如各位老友所见,小氯在任何形式的绘画方面都毫无天赋,不论是纸绘,板绘甚至是和传统绘画都没什么关系的 AI 绘画。 + +而且,小氯也不希望过多地局限各位老友对小氯虚拟形象的印象。引用我在[回答 Dayu 的博客问卷时]({{< relref "Ephemeralis-Weekly(10):方寸之外.md" >}})的话: + +> 你可以把小氯当成现实中的某神秘高校大学生,也可以当成一只很萌的元素娘,也可以当成一个被捏成这样的人工智能,或者干脆就当成一个会讲故事的原子也行——随意。 + +「——那你侧边栏放的那个是什么?」 + +好问题。虽然小氯侧边栏的头像(也是当前小氯在许多平台使用的头像)确实很容易被认为是小氯的自设,尤其是其还和现实中的小氯有很多细节上的相似(例如 MacBook,果茶,抓着杯子时一般有一只手只用三根手指卡住),但是这确实不是。这张图的来历大致是小氯突发奇想捏了一些 prompt 然后丢给了豆包 AI,然后就炼出来了这个。最多只能说是一个很初步的视觉草稿吧(注:小氯最近换头像了,这段话的原型图片是[这张](https://img.viento.cc/chlorine-juice-safer.avif)。 + +甚至现在连文字版的自设都没写好——没错,小氯对于自己的事情也总是那么倦怠~~这和你活泼非金属的身份不符啊~~。这也造成拜托一位画师来代绘的难度极高(~~而且小氯写的那些幼稚的东西给画师看真的不会社死嘛~~)。 + +## Mastercard 信用卡 + +小氯很早就想办一张境外的银行卡了,毕竟现在很多操作都需要付 USD,有一些羊毛(比如 Amazon Cloud 的免费服务器)也需要绑卡才能薅到。更不用提小氯将来还有出境旅行的计划。 + +小氯关注了不少可能能薅到的虚拟银行卡,很可惜,它们都有一定的开卡费(虽然说也不多),而且毕竟也不算是什么正规渠道,容易出问题。于是小氯就盯上了国内银行的外币卡或者双(多)币卡。 + +小氯也收集了很多这方面的信息,最终锁定了两张卡,一张是工行的星座卡(0 额度信用卡),一张是中行的 Mastercard 卡(借记卡)。小氯不在乎是 Visa 还是 Mastercard,不过由于小氯已经有一张中行的卡了,所以就想着搞一张工行的卡。 + +很不幸,小氯线上申请了两次,都被拒绝了,原因未知。~~或许是宇宙第一大行不喜欢小氯吧。~~ + +于是小氯开始打听中行 Mastercard 的办理方法,得知只需要找最近的、能办理跨境金融的网点,有卡板就可以办理。 + +那最近的、能办理跨境金融的网点在哪里呢? + +答案是:在小氯的宿舍旁边。 + +没想到吧(笑)。 + +由于电话没打通,于是小氯趁着上大物之前的空隙直接去了网点。 + +然后……小氯得知,网点办不了借记卡,但是可以办 Mastercard 的信用卡(当然是 0 额度)。 + +也好。花起来和借记卡一样,顺便也能积累下信用。唯一的遗憾大概就是卡面很普通,不如 Mastercard 借记卡的卡面那么好看(没错,我指的是那个非人哉的联名卡 (/ω\))。 + +办的过程几乎没什么可讲的,全程没遇到任何麻烦。唯一值得讲的就是小氯在填家庭住址时,大堂经理满脸惊奇地说,听不出你有任何口音(小氯家乡的方言确实以口音明显知名)。然后就等着卡邮过来再去激活就好了。 + +当然,既然是信用卡,就会涉及年费的问题。这张卡的年费是 200r,但是首年免年费,每年消费五次可以免次年的年费,那基本就相当于没有了。每年我往校园卡里面充几次饭钱,每次一 CNY 就好了(你别说,校园卡真的可以一次充一元钱)。 + +这张卡是 Mastercard 和银联的双重卡,在大陆和海外都可以使用。CNY 和 USD 账户是分开的,消费需要通过购买外汇进行充值。还好小氯有一张一类卡,购买外汇是没问题的。只是小氯有点好奇,这样的卡能用来绑定 Amazon 和 Oracle 这样的服务吗? + +以及最近开始对各种各样的银行卡感兴趣了。也不仅仅是觉得一些卡面比较精致吧,感觉随着了解到的事情越来越多,某些生活方式却变得越来越旧式了。 + +## 一封勒索邮件 + +下面的事件可能会让人感到不适,但是确实是真实地发生在小氯身上的。 + +事情的起因是,小氯闲着没事翻自己的 Tutamail 的时候,突然看到了垃圾邮件里面有一封奇怪的邮件。好奇心驱使着我点开看了下,结果是开幕雷击: + +> Good day. +> +> Your system has been hacked with a Trojan virus. + +带着满脸的问号,小氯大致看完了整封邮件。由于相关法律法规限制,小氯不能完整地展示邮件内容。简单来说,发邮件的人声称已经完全控制了我的个人电脑,并且拿到了一些关于我的不适宜公开说明的内容,然后要求我使用加密货币向他转一笔钱,否则就把这些内容公之于众。 + +说实话小氯看完之后的表情大概是: + +![|500](https://img.viento.cc/emoji/EMJ-confused.webp "黑人问号.webp") + +这显然是一封毫无意义的勒索邮件,因为他拿不出任何证据支持他的说法,最重要的是小氯从来没做过他说的事情。由于小氯注册 Tutamail 的时机比较合适,因此拿到了一个不错的前缀,很可能是我的邮箱被猜到了。 + +遇到这种事情,正确的处理方法是什么都不做。无论是任何的动作都会证实这是一个活跃的电子邮件地址,从而招致更多的麻烦。而且,对于这群只会躲在 VPN、匿名通信和区块链后面的懦夫来说,你也没办法对他们怎么样。 + +这件事情没有给小氯带来任何的现实损失,除了浪费了我五分钟时间看他们胡编乱造的邮件。不过从情感上,这很令人不愉快,有点像苍蝇落在你身上的感觉。 + +这可能也证实了小氯从前说的一个观点,最小化但必要的监管对于去中心化的互联网必不可少。至少对于这群勒索者,他们需要一点监管的铁拳。 + +## Hello,LineageOS + +> 来来来!全体目光向我看齐!看我看我!我宣布个事!我会刷机了! + +没错,就在今天,小氯完成了人生中第一次刷机 ヾ(≧∇≦*)ゝ + +TL; DR:把一台很旧的小米 CC 9 刷了 LineageOS,体验良好,但是没有测试国产软件。 + +### 前言 + +如各位老友所见,小氯一向对国产的 modified-Android 颇有微词,甚至还曾经在周报里非常失态地激烈指责过 ColorOS(请见[上一期周报]({{< relref "Ephemeralis-Weekly(12):浮沫之下.md" >}}))。情绪本身是会自我发酵的,尤其是负面情绪。所以在对 ColorOS 的不满积累到一定程度后,小氯决定向 OPPO 国开战(慈禧音),方法就是刷一个原生安卓,证明我没有你也能活得很好(~~真是个幼稚鬼~~)。 + +当然,指望用 OPPO 刷机,还不如指望慈父同志养猫(~~你别说还真可以用 mod 给他送一只~~)。比较好的是,小氯的家里有一些废旧手机,只需要让我亲爱的娘亲邮寄一台即可。 + +手机很快到了。是一台 Mi CC 9,6+128 的旧配置,MIUI 12。很幸运,德高望重的 LineageOS 对于这个型号有很好的支持。 + +### 换 SIM 卡 + +开开心心地打开开发者选项,然后 enable USB debug……怎么启动不了?哦,需要 SIM 卡。 + +小氯当然有 SIM 卡,只需要换一张进去就可以。然而……小氯不会换 SIM 卡(捂脸)。 + +所幸这件事倒也不难,找个视频学学就好。小氯没找到卡针,于是用了绣花针(~~不要问小氯为什么会有绣花针~~)和顶针。好笑的是,小氯的第一张卡是放不进这台旧手机里的,但是第二张卡可以,确实有点奇怪。 + +### 解锁 BL + +刷机的第一步当然是解锁 Bootloader。MIUI 的 BL 解锁相当容易,而且由于这台手机太老了,也不涉及等待的问题,因此在手机绑定账号之后使用小米助手即可。 + +小米官方的刷机助手不能在 macOS 使用,所幸社区制作了一个替代品。下载之后选择允许运行,然后一点就可以了。 + +注意 BL 解锁后手机会直接重置,因此需要重新打开开发者选项、USB 调试这些。 + +### 刷入 Recovery 和 ROM + +按照官方的指导,我们可以先刷入 Recovery,然后通过 Recovery 刷入 ROM。这个步骤教程里面讲得很清楚,可惜小氯踩了一些坑: + +- 刷入了损坏的 Recovery,原因是中国科大的镜像把我的浏览器拦截掉了。解决方法是 `wget`,又稳又快。 +- 刷入 Recovery 之后直接重启手机导致白刷了。正确方法是看到 LineageOS 的 Rec 界面后把手机放在一边等待后续操作。 + +具体操作可以去看 LineageOS 的操作指南,讲得已经很清楚了,小氯没必要在此赘述。 + +### 完结撒花 + +然后启动手机,就可以享受丝滑的 LineageOS 体验了。不得不说,LineageOS 是真的好用,不仅资源占用低(至少不卡了),而且也足够自由。 + +感觉刷机也不算太难,感觉已经可以考虑入一台 OnePlus 11 刷下当作备用机乃至主力机了。只是不知道对一些国产软件的压制如何。之前听过用「炼妖壶」来制造隔离环境,但是这样还能做到照片分享之类的吗? + +## New VPS + +[之前曾经说]({{< relref "Ephemeralis-Weekly(12):浮沫之下.md" >}})我买了人生中第一台 VPS,是 Cloudcone 的,然后光速把它销了。然而小氯这周又买了一台 VPS( + +这次同样是小有名气的品牌,RackNerd。BF 特惠机型,配置大概是: + +- 2 vCPU Cores +- 40 GB PURE SSD RAID-10 Storage +- 2.5 GB RAM +- 3000GB Monthly Premium Bandwidth +- 1Gbps Public Network Port + +这次的配置终于够用了,别说是 Docker,1Panel 都绰绰有余了。价格大概是 19 USD / a,还算实惠。 + +本来因为最近网络环境的一些波动,小氯打算拿来做一些网络安全方面的学习和研究,但是想想还是算了吧,太浪费了。目前大概是准备把 HereX(园子的服务系统)的一些东西部署到上面。 + +目前为止大概有四台服务器了,可以部署一个监控面板。只不过,部署在我的主虚拟机的面板没办法连通到其他机器,不知道是否和它是纯 IPv6 的有关。 + +## 新的订阅服务? + +订阅服务是园子翻新计划的重要部分,小氯打算构建一个最小化且足够好的订阅系统,使得希望订阅的老友们能选择自己最喜欢的途径。~~尽管愿意听小氯碎碎念的老友应该也不多。~~ + +订阅服务大体上也就分三种: + +- RSS / JSON Feed +- Email Newsletter +- Instant Notification + +园子现在的 RSS 已经比较完善了,JSON Feed 的建立应该也不难,因此我们就不说了。 + +### Newsletter + +Newsletter,脱胎于过去的杂志或者报纸的订阅(邮箱——电子邮箱,不是吗?),这本身就给人一种很旧式的感觉。就像是在圣诞节后的长假中,落着大雪的冬日上午,壁炉中烧着柴火,噼啪作响。站起身来,裹上自己的外套去大门口的邮箱里取新一期的杂志或者报纸。想着回来后可以喝到热巧克力,便先冲好一杯放在壁炉旁。冬日的阳光透过薄薄的云层,洒在积雪上,泛着柔和的光芒。眼镜上凝结出细密的水珠,新买的雪地靴踩在花园小径尚未完全清扫干净的积雪上,发出咯吱咯吱的响声。将尚带着油墨香的印刷品放进自己的怀里,裹紧了自己的外衣。空气冷冽而清新,温暖的哈气悄无声息地消散开来。 + +……抱歉,遐想得有点多。Newsletter 本来是一种定期发送的邮件订阅,但是由于现在的许多作者偏好于每次更新都通知一下,而且,除非是只更新周报,否则在每周统一更新一次的技术难度恐怕比较高。 + +小氯原本的订阅使用的是 Quail,现在打算使用一个邮件订阅的 API,进行自动化的发送。目前看来最可靠的应该是 AWS,但是小氯没有使用 EC2,因此需要支付费用。虽然也没几个钱,但小氯还是希望找一个更合算的 alternative。 + +### Instant Noti + +由于可达性和自由性等问题,小氯不会考虑 Twitter 和 Telegram Channel。此外为了订阅者的隐私考虑,也不考虑群聊或者房间性通知,如 QQ 群和 Matrix Room 等。 + +#### WeChat Official Accounts Platform + +尽管小氯并不喜欢某绿色聊天软件,但是不得不承认,对于大部分用户,WOAP 都是一个非常方便的选择。WOAP 也没有规定文章不能发摘要。但是很不幸,WOAP 并没有方便的 API 可以进行调用。 + +#### Fedibot Feed + +这个词不太常见,简单来说就是注册一个 Fediverse——准确来说,这里说的是 ActivityPub 的机器人账户,然后通过这个账户发送更新通知。 + +这是个相当有趣的方式,由于 Mastodon 等 ActivityPub 的实现一般都提供 API,也可以实现高程度自动化。问题是去哪里注册机器人账户。Fedi 确实有一些 bot-friendly 的实例,比如 ,然而访问不算通畅(我的自动化节点在国内)。而在一般的实例部署 bot,总归有点滥用的嫌疑。 + +那看来自己部署一个应该是最好的选择了,小氯新买的 VPS 就打算拿来做这个。Mastodon 太重,Misskey 太二次元,感觉 Sharkey、Akkoma 和 GoToSocial 不错。小氯最喜欢的还是 GoToSocial,奈何这货的默认界面实在是太难看了,如果要改的话,需要折腾整个 `web` 文件夹的布局和样式文件,工作量实在是挺可怕的。 + +## 热牛奶 + +小氯曾经有一个持续很多年的习惯:睡前喝一杯热牛奶。这个习惯是我的原生家庭培养的诸多习惯之一(其他的习惯包括早睡早起、早餐吃一个鸡蛋、长期坚持学英语、饭后散步等)。只是因为上大学后生活作息在一定程度上被打乱,所以这个习惯就丢下了。 + +如前文所说,小氯这段时间身体不太舒服,于是为了感觉好一点以及睡个好觉,小氯又想到了这个办法,于是在某外卖软件上下单了一小箱牛奶。 + +如各位老友所见,宿舍不允许使用炊具,这当然也包括电热棒。所幸,在零层大厅中有一台爱心微波炉。一般来说热牛奶适合在睡前半小时到一小时喝,那么对小氯来说就是晚上十点到十点半之间。今天的这时候,我正好写 Bomblab 的报告有些疲倦了,顺道可以下去活动一下。 + +衣服也不需要换了,身上的睡衣就好,毕竟楼内并不冷。小心翼翼地拿着盛满牛奶的杯子走进电梯——小氯只有一个杯子,或许应该再买一个用来喝牛奶的杯子的,毕竟每次要把水杯刷干净真的很麻烦——常喝牛奶的老友应该知道,如果盛放完牛奶的水杯不刷干净,过一段时间会发出非常难闻的味道。 + +胡思乱想着,电梯到大厅了。微波炉平时用的人不多,晚上更是如此。火力不太知道调什么,先调一个中火两分钟试一下。等待的时间偶然抬头,看到微波炉上面有一张海报——原来,这个「爱心」不仅是这台微波炉可以无偿地被全楼的同学使用,也是因为某个爱心社团通过微波炉发起的希望工程小额募捐行动。很遗憾,小氯今天没带手机,等到明天补上好了。 + +奶热好了。很遗憾,这个火力和时长只能把奶变温,远远不能变热。那就调到高火,再加热一分钟试试。旁边的保安师傅看了我一眼,但是没有任何反应。小氯和楼里的三位保安师傅都蛮熟的,尤其是下午值班的那位。 + +微波炉又停了。这次的温度很好,足够热但是并不烫到难以入口。看来以后大概用高火加热一分到一分半就好。还是不要等到回寝室了,这样可能会凉。不知道偶尔路过的同学看到小氯一边走一边时不时低下头喝一口牛奶会不会觉得好玩。 + +回到宿舍,牛奶还剩一大半,正好一边喝,一边把这些字敲出来。剩下的报告等到明天上午再写吧,DDL 还有一周呢。 + +键盘噼里啪啦地响着。MacBook 的键盘手感一直很合我的胃口,不过如果键程再长一点就好了,这样应该不会有那么强的撞击感了。 + +奶喝完了,这些字也要敲完了。时间大概是晚上十一点,下面去洗一洗水杯,刷牙睡觉吧。 + +感觉心情非常平静,大概是牛奶的功劳吧——我记得高中学过,牛奶富含色氨酸,色氨酸可以转化为 5-羟色胺(也称血清素),这种神经递质可以使人感到镇定,从而有利于睡眠。小米安神也是同一个道理。不过,应该也不会这么快才对? + +又或许是今天的经历使然吧。今天做了什么呢?打扫卫生,和组里的老师谈了下例会的事情,然后就是在写 Bomblab。这个作业拖了好久好久了,下周就是 DDL 了。周五那天胡乱拆了两个,本以为这周末拆两个就好,结果一晚上把剩下的四个都拆完了,顺便写了一部分的报告。 + +无论如何吧,这种平静的感觉,蛮好的。 + +晚安,各位老友。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(14):泡沫箱里的宣纸.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(14):泡沫箱里的宣纸.md new file mode 100644 index 0000000..5077f04 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(14):泡沫箱里的宣纸.md @@ -0,0 +1,307 @@ +--- +title: Ephemeralis-Weekly(14):泡沫箱里的宣纸 +date: 2024-12-08 +summary: 浮生散记第十四期 +description: 本文是作者周报的第十四期,涵盖了生活琐事、技术探索、思想转变等多个方面。作者以初雪开篇,由此引发出对过去时光的怀念。文章详细记录了购买新域名`viento.cc` 的过程,并解释了其含义和未来用途。作者还探讨了开源个人财务管理软件的可能性,指出由于银行API的限制,实现完全自主化管理存在困难。在技术探索方面,作者推荐了一些基于Tauri框架的应用,并尝试使用Deno Deploy部署项目。此外,作者还分享了新购置VPS的经验,并探讨了自托管社交媒体平台的可能性,对GoToSocial、Mitra和Bluesky等平台进行了比较分析。由于对现有邮件客户端的不满,作者计划自行开发一个新的邮件客户端,并开始学习Rust语言。文章也简要提到了域名备案问题,并反思了自身情绪变化和压力下的“迟钝”状态。最后,作者反思了自身“谨言慎行”的写作风格,认为合理的争议是进步的催化剂,自己未来将尝试在保持温和基调的前提下,在博客中融入更多具有思辨性的内容。 +categories: ["人间世"] +series: 岁时录 +tags: + - 博客 + - 出游 + - Fediverse + - 哲学 +slug: weekly-14 +featuredImage: https://img.viento.cc/cover/weekly-14-cover.webp +draft: false +--- + +各位老友们好,我是 Chlorine。新的一期周报,双手奉上。 + +现在浮生散记都快变成半月刊了……没办法,苦命的带学生是这样的。~~不过放心,小氯还没似呢,一时半会不会断更。~~ + +本节的标题非常晦涩且与内容关系不大,算是一个意识流的词汇吧。大家也没必要去深究其含义了。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第十四期,日期范围为公历 2024 年 11 月 25 日至 12 月 28 日。祝食用愉快。 + +## 雨雪 + +这个标题的「雨」可以读上声(yǔ),也可以读去声(yù)。后者的解释是动词,下。这个奇怪的用法大概是在某首古代的情诗里面学来的,那首诗的具体内容已经记不得了,只记得一句「山无棱,天地合,乃敢与君绝」。所以后来当我看到一篇文章,题目叫作《[当山峰没有棱角](https://zhuanlan.zhihu.com/p/103151003)》,那种福至心灵的顿悟感,相当美妙。 + +抱歉,扯远了。 + +从上周末开始,就收到了许多消息,表示马上要降温了,有寒潮,甚至会下雪。来自北境的小氯自然是不害怕冷的,所以就没太在意。 + +不过,小氯还是小看了温带大陆性季风气候寒潮的夸张体感。直观的感觉,当然是天大寒,砚冰坚,手指不可屈伸。小氯翻箱倒柜地找出了羽绒服,但是居然还是觉得冷——羽绒服是当初发的,轻盈、简便而充实,而且极其压风。甚至在加上最厚的手套后,小氯的手还是出现了冻伤。 + +在周二上完会原出来时,小氯感觉眼睛里落进了什么东西。刚想抬手擦一下,结果却鬼使神差地抬头看到,路灯映照下的视野中,多了些迅疾的箭矢一般的造物。 + +![|326](https://img.viento.cc/IMG-20241130213408.avif "抱歉,我贫瘠的字句找不出更好的描述方式了") + +是的,下雪了。这可真是讽刺,因为就在下课前摸鱼时,小氯还在写着「实际上,到现在也没下雪」。 + +如上文所说,小氯来自北境,虽然气候相比真正的北部边疆温暖不少,但对于雪,也是从小耳鬓厮磨一般的造物。所以看到雪时,也难说有什么惊喜的感觉,最多是会自言自语一句「不如家里的雪好看啊」。 + +……此外,上面说的那篇文章,曾经是我最喜欢的文章之一。这篇文章还在,但是在我再次阅读并对其存档时,我总是感觉:**这篇文章是不是修改过?我隐约记得,里面有的字句不是这样的**。当然,当然,也有可能只是我的幻觉。毕竟,小氯的记性一向不大好。 + +回到这篇文章。倒不是说写得有多好(虽然说确实很好),只是我始终怀念着初读文章的那种心境。那种心境恐怕是回不来了,连带着小氯曾经所有的须知少时凌云志,一起死在了 2023 年的夏天。 + +呸呸呸,说什么呢。在小氯的家乡,提这个字是不吉利的,每次说这种话题都需要呸一口,意思是甩掉霉运。 + +## 新域名(N) + +~~小氯酱现在买域名比买奶茶都勤~~ + +其实这件事实在是有点偶然……先说说买了什么吧。这次是我很感兴趣的 `.cc` 域名,具体来说,`viento.cc`。 + +事情的起因和园子的大修计划有关。小氯之前说过,打算为园子建立一套完整的服务系统(~~尽管实际上也没几个服务~~)。这个系统之前被命名为 HereX,小氯为此买了个新的域名,就是 `herex.icu`。 + +不过今天小氯突然想到,这个名字……是不是和 X(Twitter)的关系比较可疑? + +我整个人瞬间不好了。 + +其实小氯最初的想法是 `hereis.cc`,前缀自不必说,就是 Here is,`.cc` 是科科斯群岛的 ccTLD,不过由于其注册开放、价格不高且简写的含义丰富,经常被拿来整活。下面是(对于园子来说)几个可能的解读: + +- Chlorine Chan(小氯酱) +- *Cercis chinensis*(一种小氯有点喜欢的花) +- C Compiler(C 编译器) +- Creative Commons(知识共享许可协议) +- Community Centre(社区中心) + +确实很好对吧(自我陶醉 ing)。 + +回到主线。然后小氯就开始寻找各种比较心仪的其他域名,毕竟这个可是和主域名一样重要的。 + +然后小氯想到了一个选择:`viento.cc`(~~足以见得小氯这家伙买域名大部分时候都是脑袋一热~~)。 + +Viento 是西班牙语,意思就是 Wind,其读音大致介于 Biento 到 Biendo 之间,如果对发音要求不是太严格的话,直接读作「Biendo」即可。 + +这个词实际上出自小氯常用的个签之一: + +> Como el viento. + +这句话允许自由解读。 + +以及……风和日光,都是自然的一部分,不是吗?(笑) + +于是小氯拿下了这个域名,服务商是 Porkbun。之前听说 Porkbun 的事情大部分都止于其比较便宜的 `.moe` 域名,这次也算是又多了一个域名注册商了。 + +以及,我有点好奇这家公司和中国人(或者华人)有没有关系。猪肉包子,怎么听怎么都像非常有东亚特色的名字——自信点,就是中国特色。 + +目前为止,小氯对这个域名已经比较满意了。唯一的难题大概就是子服务的名字不太好起,需要花点精力。 + +如果没有意外情况(~~比如小氯脑子一热又买了个域名~~),园子的管理系统将使用这个域名,如果您接受到这个域名相关的信息,那么其应与园子的主域名具有同样的信任度,除非我有明确公告不再使用这个域名提供服务。 + +## 会有开源的个人财务系统吗? + +如[上篇周报]({{< relref "Ephemeralis-Weekly(13):生活的起伏.md" >}})所言,最近小氯开始对各种各样的银行卡感兴趣。虽然说有很多个银行账户并不会提高我的社会信用(甚至可能适得其反),但是许多银行卡真的很有艺术价值。 + +——那为什么不直接去买各种周边呢?我觉得,这个问题就像是问喜爱集邮的人为什么不直接去买画张。好的邮票或者是银行卡,是实用价值和美学价值的高度统一。我偏爱这种统一,如痴迷于定理的物理学家偏爱形式之美和应用价值的统一。而且,和邮票一样,至少在此处的生活中,银行卡几乎已经是上一个时代的东西了。小氯这人很奇怪,有时会偏好那些会给自己的生活带来麻烦的旧事物。 + +抱歉,又跑题了。在思考要不要再办几张银行卡的时候,我自然而然地想到了:假如真的有这么多银行卡,我应该怎么管理呢? + +最简单的想法应该就是使用统一化电子钱包,例如国内的 WeChat Pay,Alipay 或者国外的 Google Pay,Apple Pay,PayPal 等。的确也存在一些专门管理银行卡的软件,比如一些信用卡管家,银联的 App,甚至是一些大行的 app 也能用。 + +当然,各位来这里,显然不是为了看这些的,小氯也不想多写这些。小氯希望能找一个开源的解决方案,来实现完全自主化的个人财务管理。 + +个人财务管理是一个比较广的概念,比银行账户管理复杂得多。当然,对于目前的情况来说,小氯当然不需要使用会计等式——Assets = Liabilities + SE,也不需要 T 型账户,更不需要做 Annual Adjustment、写 Balance Sheet 或者 Income Statement,最多也就是查一下账看看是否会有什么漏记的部分。小氯没有股票、期权、基金,没有欠债,没有加密货币。而且,由于小氯严格避免任何形式的信贷和透支,信用卡完全可以被看作普通借记账户管理。 + +很遗憾,即使是这个简化版的需求,小氯也找不到任何可用的软件。原因非常简单:数据从哪里来? + +乍一看这不是问题,从银行的 API 获取就好了。**可问题是银行没有或者很少有这样的 API(注意我说的不是没有 API)**,即使是有也通常只对企业级用户开放。这也好理解,毕竟金融业的信息安全要求比犯罪还高。不管是从保护用户的角度看还是从利好银行自身业务的角度看,公开开放这样的 API 都很危险。 + +所以我们也只好退一步,看看是否有一个自动化或者至少是半自动化的「记账方法」。没办法实时获取,那我记 Journal 总行了吧。 + +这个事情有很多人在做,少数派有好几篇借助短信通知等方法实现半自动化的教程,在环境更加开放的安卓,甚至有小星记账这样的软件可以实现(至少是 WeChat Pay 和 Alipay 的)几乎完全自动化的记账,只需要点一下确认就好。理论上来说,我们可以通过手机银行等方式实现相当程度的自动化(前提是短信的通知格式统一),然后读取数据到后端,形成完善的数据库和前端展示。但是这需要做很多复杂的适配工作,很容易让人失去折腾的力气。 + +## 选课 + +最近有我校每学期一度的高等信息经济学与应用博弈论实践课程(人话:选课)。这几个学期是小氯课业压力的癫疯期,这学期有 DSA、ICS、中微、会原这些核癌可氢的课程,下学期同样是仙之人兮列如麻,例如概统、大物、中宏、公金、数电、社分。这几大硬课伺候我一个人,福气还小得了吗(悲)。 + +## 几个有趣的 Tauri 应用 + +一般来说小氯不太喜欢写「应用推荐合集」这种东西,就连 App Defaults 以及当初说着要写的「小氯の工具箱」都懒得写了。因为这种文章本质上没有创造任何新的价值(注意我说的不是「没有价值」)。这里纯粹是小氯这几天逛了逛 Tauri 的社区(~~你作业写完了吗?~~),发现了不少好玩的项目。简单罗列下其中一部分,博君一笑就好。 + +题外话,小氯对 Tauri 相当有好感。这份好感的最初来源可能是一个神秘的信息安全学习软件,在其前任、一个非常著名的信息安全学习软件删库 / Archive 之后接过了开发的大旗,继续为广大信息安全爱好者们提供服务。而这个软件就是使用 Tauri 开发的。回到 Tauri 本身,在小氯粗浅的理解中,Tauri ≈ Rust 后端 + Web 前端。Rust,~~高贵的~~现代化语言,加分;Web 前端,可以用各种前端框架整花活,而且不需要像 Electron 那样嵌入一个巨大的 chromium,加分;兼容广泛,跨平台,甚至可以包括移动端,加分。buff 叠满了属于是。如果让小氯选择一门希望立刻学会的软件开发技术,那 Tauri 必然是第一位(虽然严格来说这不是「一门」技术)。 + +### Kunkun + +说实话,在看到这个名字的时候,我的内心是十分警觉的,毕竟这个名字很容易让人联想到一位故人。 + +然后当我进入他们的[官方网站](https://kunkun.sh)时: + +![|605](https://img.viento.cc/IMG-20241201173904.avif) + +你说你不是小黑子我是一点都不相信的。 + +言归正传。这是个 App Launcher,支持插件,相当于是跨平台、开源的 Alfred / Raycast Alternative 吧。不过现在功能还很有限,看来练习时长还不太够,需要继续自我提升。 + +### Neohtop + +`top` 咱都知道,`htop` 也知道。那么 Neohtop 大概就是 htop 的 GUI 版本。 + +![|596](https://img.viento.cc/IMG-20241201175803.avif) + +看着颇有点……那个东西叫什么来着,对了,Catppuccin 的味道。 + +只可惜键盘导航支持还是不如 Raycast 的 Kill process,要不然就直接用这个代替了。 + +### EcoPaste + +老实说,Tauri 大家族是真不缺剪贴板软件,EcoPaste 是其中之一。但是很遗憾,在 macOS 上的体验并不如 Raycast 的剪贴板插件。而且最重要的一点:**在调出后不会自动成为最前置窗口**,这点是剪贴板的刚需。 + +### Lettura + +一个 Feed Reader,采用的是小氯非常喜欢的 Shadcn UI。不过下面这张图体现得不是很明显,如果好奇 Shadcn UI 是什么样子,大体可以去看一下 Vercel。 + +![|678](https://img.viento.cc/IMG-20241202084302.avif) + +感觉作为 RSS 阅读器而言还是蛮合格的,虽然说不如 Follow 那么丝滑,但是人家资源占用小啊。当然,RSSHub 之类的我没测试,反正我也用得少。 + +其实说实话,尽管 Follow 在博友圈中的声望相当高,其水平也确实担得起这声望,但是**小氯并不喜欢 Follow 的社交元素**。严格来说,对于这类软件,小氯不喜欢任何形式的社交元素。原因无他,就如我在[第十一期周报]({{< relref "Ephemeralis-Weekly(11):案几之上.md" >}})里面说的: + +> 小氯只希望安安静静地读点东西,没有任何人能闯进我的书房。 + +Tauriverse 还有很多有趣的应用,如果感兴趣,去 [Awesome Tauri](https://github.com/tauri-apps/awesome-tauri) 自己翻去吧。 + +## Hello,Deno + +不是很正宗的 Hello 系列新成员。不过这里的 Deno 不是那个新的 JS 运行时,而是指 Deno Deploy。 + +我第一次听说这个平台是从著名的[中文网字计划](https://chinese-font.netlify.app)。中文网字计划就使用 Deno 结合 ImageKit 做字体分发。最近,小氯在研究一个著名项目时,突然想到:既然这个项目能用 Cloudflare Workers 部署,那能用 Deno 吗? + +于是在我(~~准确来说是 AI~~)的努力下,一个新的衍生项目诞生了: + +{{< github repo="chlorine3545/gh-proxy-deno" >}} + +目前来说用起来还不错,同时收获了人生中最快的一个 star。 + +Deno 是个蛮好玩的 JS 工具,用 Rust 编写(~~高贵的 Rust~~),默认最小权限,URL 化包管理,TS 原生支持。鉴于 Bun 的 bug 实在是太多了(~~Bugn~~),感觉也可以用 Deno 学 TS。不过目前为止生态系统还不够丰富,像 Vercel 和 Netlify 这些平台都还不完全支持。 + +## New VPS(2) + +~~马上要进化为勃艮第机农了(喜)~~ + +闲着没事捞了一台 Vmiss 的 HK VPS,1C 1G 10G,500M / 1T。用了一个优惠码,把价格打到了大概 90 CNY,续费同价,还算可以。直观感觉就是延迟比我的 RackNerd LA 低多了,至少 SSH 的时候基本上秒连,打命令也没延迟。 + +当然,这么小一台 VPS 也跑不了什么大家伙,但是由于带宽和流量还行,适合做一些对这方面要求比较高的服务。~~别误会,我说的是 CDN。~~ + +## 新的社交媒体平台? + +最近闲来无事,打开 Ice Cube 想刷刷 Fedi,结果惊奇地发现数据获取不了了。前往 Owu Social 的源站发现也出现了 502,看来是服务器宕机了(在第二天恢复)。 + +这件事让我有了一点危机感,把数据放在别人手中——即使是 Owu Social 这样让人信任的团队,也是件有点危险的事情,虽然我并不觉得我自己维护的实例会比 Owu Social 的实例更稳定(人家 Owu Social-G 好歹是整个 Fediverse 中第二大的 GoToSocial 实例)。正好,[上一期周报]({{< relref "Ephemeralis-Weekly(13):生活的起伏.md" >}})也说希望自托管一个实例用来做 Fedi feed,于是我开始物色一个合适的 implement。 + +### GoToSocial + +这个不用我多说了。不过我实际测试下来,其内存占用并没有说的那么小,甚至和我的 SearXNG 差不多大,这和其轻量级实例的名声也不匹配啊(也可能是我的打开方式不对)。而且,GoToSocial 的默认界面实在是令人一言难尽,如果要改的话,需要重写 `web` 文件夹(我简单看了下,大体和 Hugo 的 HTML 差不多,都是 Go Template 语法),实在是太麻烦了。 + +### Mitra + +[Mitra](https://codeberg.org/silverpill/mitra) 也是庞大的 Fediverse 的一份子,只不过是非常小众的一份子。小众到什么程度?如果你在 [FediDB](https://fedidb.org) 中搜索「Mitra」,你会发现,在整个联邦宇宙中,Mitra 的用户只有 423 个(截至 2024 年 11 月 26 日),这个数字仅为 Mastodon 的 0.0052%。而且,我在中文和英文的搜索引擎下都找不到**任何一篇**关于如何部署的教程,准确来说,我甚至都找不到任何一篇文章! + +对我来说,Mitra 有几个非常吸引人的点: + +- 使用 Rust 构建(~~高贵的 Rust~~)。 +- 界面超级好看,至少非常符合我的审美。 +- 账户迁移功能,再也不用担心数据和一个实例绑定了。 +- 支持订阅(虽然说要用门罗币付钱,但是也没说订阅一定要付钱对吧?)。 + +不过,Mitra 还有几个比较麻烦的点。没有现成的 docker-compose 文件自然是一个,其需要使用 PostgreSQL(在源码构建过程中,作者是这么说的,不知道在 Docker img 中是否也是如此),甚至还需要一堆别的服务,行,用就用吧,我忍。而且,从 issue 来看,作者应该是个非常坚定的 FOSSist,拒绝把 Mitra 和任何非自由的服务整合在一起,那不管是 Cloudflare R2 还是 AWS S3 都用不了,那媒体文件全存在本地,硬盘恐怕受不了。 + +作者的原话: + +> Integrations with non-free services are not allowed, but if fully open-source implementations of S3 object storage exist, then we can support them. + +……所以,S3 现在不应该说只是一个协议(事实标准)吗?能兼容 MinIO,就不能兼容 Cloudflare R2 或者 AWS S3(这里的能指的是事实上的可行性)?难道我们连协议也要「纯正的自由」吗?至少现在,小氯没办法理解这一点。 + +### Bluesky + +这个家伙就不是 ActivityPub 的一部分了,而是一个完全单独的平台。 + +Bluesky 的具体信息可以看一下 Wikipedia,简单来说,就是一个使用自己的 AT&T 协议的社交平台。最近一段时间(其实我也不知道能不能叫最近)因为某些事情,Bluesky 的社区规模急剧增长。 + +Bluesky 支持很多有趣的特性,例如域名作为用户名,无缝的节点迁移等。不过 Bluesky 有一个很离奇的点:**它的用户数据是去中心化的,但是用户交互是中心化的**。简单来说,就是用户可以自托管数据,但是平时的 client 交互都在 [Bsky App](https://bsky.app) 完成。在分享用户的 profile 时,也是在 Bsky 的域名下完成。虽然说社区现在有一些第三方的 Web 或者本机客户端,但似乎都不算太完善。这可不是什么好事。 + +我不太知道它能不能算 Fedi 的一部分,从定义上来说,Fediverse 是「decentralized group of social media platforms in which each independent platform can interact freely with any other platform that is part of the group」(来源:《大英百科全书》)。那么只要能用同一个协议自由通信的一组非中心化的社交服务器都算是 Fedi。那这么看,电子邮件也算是一种广义的 Fedi,Matrix 当然更是,那么 Bluesky 自然也是。不过现在我们说起 Fedi 的时候,大部分就是指 ActivityPub 了。 + +## 邮件客户端的难题 + +邮件客户端是个老生常谈的话题,小氯也一直在努力寻找适合自己要求的客户端。小氯其实要的特性也不太多,就是一个 Unified Box(现在基本上是标配),GPG 和过得去的 UI。不过小氯喜欢开源的东西,这个难度唰一下就上来了。 + +很遗憾,小氯找了很久很久,得出的答案是:**没有**。 + +Thunderbird 是最经典的选择,但是性能上和资源占用还是上个时代技术栈的老样子,对 Outlook 的支持非常糟糕(这也可能是牢软的问题),用户界面也让人不忍直视(如果安装一个好看点的主题,然后忽略设置界面的话,还是过得去的);Betterbird 在这方面和其原型半斤八两,兼容性甚至更差;Claws Mail 的界面和功能更是如此,简直就是极客致敬上世纪计算机技术的情书;Mailspring 拥有可能是最好看的用户界面(尤其是 LIM 主题),但是不支持 GPG 加密(这个事情被诟病了有六七年了),同时还需要账户(~~此处手动 @ Follow~~);Evolution 和 KDEMail 只支持 Linux,而且我并不认为它们能比 Apple Mail 做得更好。剩下基本就没什么开源的邮件客户端了,要么就是停更很久不敢用一点的。 + +这是桌面端。安卓有 K-9 和 Fairmail,至于 iOS,笑死,别说符合要求的开源客户端了,开源的客户端都没有,字面意义的没有(这里不包括 Delta Chat 和没有发布可用包的研究阶段项目)。 + +理论上来说,使用现代化的技术栈,例如 Rust + Tauri 开发一个邮件客户端是完全可行的(虽然肯定不简单)——一个很简单的经验事实:凡是能用 Electron 开发的东西,基本都能用 Tauri 开发。很可惜,至少就小氯目前所视的范围内,没有任何人在做这件事,虽然这是个极具吸引力和实用价值的项目。 + +**行,既然没有,那我自己写。** + +小氯并不是在开玩笑,这个计划从技术上是完全可行的,所需要的只是孜孜不倦的学习和持之以恒的开发。尽管小氯现在连 Rust 的 Hello World 都写不明白,HTML 的标签都记不清楚有几个(爆改 Hugo 时只学会了一点零碎的前端),但是这并不意味着小氯将来就写不出来(~~小氯酱の谜之自信~~)。更何况,社区已经有了许多称手的工具,比如 Rust 的 `lettre` 和 `mailparse` 库,前端的各种五彩缤纷的框架等等,还有 Shadcn UI(我真的好喜欢这种设计风格!)和 UnoCSS 等老朋友。当然,如前面所说,这会是个漫长的过程,罗马城的第一块砖石还没垒起呢。 + +目前小氯主要是在闲暇时间学学 Rust。现在感觉 Rust 的语法也没那么别扭了,甚至有点赏心悦目。尤其是 cargo,比 C++ 的编译器智能太多了(~~GCC 娘 & Clang 娘:勿 cue~~)。 + +## 备案? + +最近小氯接到了套路云的电话,大概意思就是小氯的备案域名没有在认证过的域名注册商名下,需要尽快转回来。看来这方面的政策又收紧了。之前只需要在备案期间转移到认证域名注册商即可,备案完事就可以随便转了(要么就是我弄错了,政策一直都是这样,只是我不知道)。 + +这也让小氯对新的域名要不要备案的问题产生了犹豫。理论上来说,园子现在除了备案号之外没有使用任何备案域名的特权(这里说的是主域名,不包括拿来做图床的),例如 CDN 和百度收录等,似乎也没必要备案。小氯备案的最初目的也就是搞一个官方认证,希望国内的老友们能够长期稳定地访问园子。而小氯现在的文章横竖也挑不出什么敏感言论,似乎也没有任何被制裁的理由。~~就算被制裁了,大不了也就是切回备案过的域名。~~ + +## 稳定与迟钝 + +小氯一向自诩为一个情绪稳定的人(姑且说是人吧?),但是在经过了这段时间连续不断的 DDL 与考试的残酷压迫后,我对这个判断产生了怀疑,因为我产生了非常严重的负面情绪(注意我用的是「我产生了负面情绪」而不是「我很如何如何」)。 + +说得具体点吧。在面对无穷无尽的压力时,我能感受到我的压力很大,不仅是身体上的疲劳,甚至心理上也明确地体现出我「客观」的负面情绪非常严重(把「客观」和「情绪」两个词放在一起真的很奇怪),但是我「感觉」上的,或者说是我的「主观情绪」并没有什么大的变化,就好像这个负面情绪根本不是我自己的,只是我能观察得到的一个客体。这么说听起来很费解,打个比方吧:就像是高中生物学,神经系统那部分讲的传入神经受损,你的伤口在流血,你也知道你确实受伤了,但是你感觉不到痛。 + +这种情况我不知道应该叫它什么,或许「迟钝」就已经是最准确的词汇了。心理学有一个叫「解离」(dissociation)的词,用 [Wikipedia](https://zh.wikipedia.org/zh-cn/%E8%A7%A3%E9%9B%A2_(%E5%BF%83%E7%90%86%E5%AD%B8)) 的话来说,大概意思是在记忆、自我意识或认知的功能上的崩解。不过现在显然也没到那个程度,毕竟小氯现在还能正常地完成各种社会活动。 + +这样好吗?难说。这样当然可以在巨大的压力下依然保持至少是基本的 functionality,但如果天长日久都是这样,恐怕会有大问题——这个判断没有任何依据,只是我用上面的比方进行的推断,如果伤口一直流血,人即使不痛,也会失血过多死亡的。 + +当然,人不可能一直失血,除非伤口已经严重到一定程度,因为人有凝血机制。那么精神的凝血是什么呢? + +## 一点中心思想不明确的碎碎念 + +小氯最近在听一首歌,名叫《Chinggis Khaan》(~~元神,启动!~~)。正好小氯最近在看西里尔字母(注:西里尔是蒙文的拼法之一),于是就试着~~拿着字典和 AI~~翻译了一下其中的一段。不过说实话,这个版本的歌词很奇怪,比如 арал(aral)是「岛屿」的意思,但是草原上显然不会有岛屿,因此只好理解为是一个不太恰当的比喻义。 + +> Хөх тэнгэрээс заясан +> +> 沐浴长生天之祝愿 +> +> Хөдөө аралд мэндэлсэн +> +> 生于这旷野的草原 +> +> Хөх монголоо нэгтээ +> +> 令苍色蒙古席卷四方 +> +> Хөвчин дэлхийд дуурисгаад +> +> 他的威名响彻这世间 +> +> Эрэлхэг монгол Чингэс +> +> 蒙古的勇士,成吉思汗 +> +> Эзэнбогд Чингэсээ +> +> 崇高的汗王,成吉思汗 + +小氯很久之前,看过一本叫《狼图腾》的小说。当时家里足够长的书不多——当然字典除外,这个算一本。小氯并不喜欢其中的一些部分,但是这本书确实让年幼的小氯了解了一点蒙古文化,至少我能很自然地拼出「腾格里」(意为「长生天」)这个词。 + +成吉思汗无疑是历史上非常值得讨论的领导人之一。他是出色的军事家和强大的征服者,但是其率领的蒙古军队在征服中的行径也颇具争议。而关于元朝(蒙古帝国)在中国历史上的地位和对于世界历史走向的影响,也是一个非常值得探讨乃至是潜心研究的领域。 + +但是,小氯在写之前,犹豫了。民族问题和政治、宗教、阶级、性别等一样,都是最敏感和有争议的话题之一,即使是几百年前的事情。小氯在博客内容方面一向是「明哲保身」的策略,小心翼翼地避免涉及一切可能引起争议的话题。用小氯一位老友的话来说,小氯似乎总是在「轻声细语地讲哲学」,把所有的话题弱化再弱化,直到其看起来甚至不如家长里短的闲聊严肃。 + +但是这一次,小氯不想再这么「谨言慎行」了。不是说我要谈成吉思汗的问题,而是说我要谈这个问题背后的问题。 + +虽然小氯的情绪一向稳定(或者用上面的结论,迟钝?),无论在线上线下几乎总是保持(至少是尽力保持)一个温和、安静、乐于讨论问题的形象,但这不意味着小氯的所有思想都是温和和安静的。事实上,小氯的许多观点都极其的辛辣和尖锐,尤其是在评价一些问题时,从不避讳给出一针见血到近乎令人不适的评价。只是我不希望发表过于尖锐的观点,破坏园子其乐融融的气氛,也不希望因为不适当地讨论一些问题惹祸上身,因此也尽可能地避免这些敏感且有争议的问题。只是,矫枉过正,现在几乎连任何稍微有争议的问题都不讲了,这里的「争议」是狭义的。 + +**但是,如果我们只说没有争议的话题,博客又剩下什么呢?或者更夸张点,互联网又剩下什么呢?甚至,思想又剩下什么呢?** + +巴普洛夫有一句名言:争论是思想的最好触媒。纵观古今,无论是在古代雅典宏伟的神庙与热闹的街道,还是在稷下学宫七十六上大夫千余雅士济济一堂的高台,无论是点主义与 d 主义激烈交锋的分析学萌芽时期,还是在凯恩斯与哈耶克唇枪舌剑的近代经济学辩场,无论是在十月的炮响后尚且覆盖着残雪的罗斯大地,还是在风云变幻的世界中改革开放春天的前夜,真理总是在思想的碰撞和交锋中杀出重围。争议本身是无错的,真理是越辩越明的,那么我们有什么理由去回避那些合理的争议,把自己关在不知冬夏春秋的小楼里自成一统? + +有争议不应该完全等同于敏感,在任何时候都是这样。无论是各种意识形态区别的学术性介绍,还是对周围一些问题的合理针砭,抑或是被认真塑造的替代历史路线,只要保持对现实、历史和政治足够的理性和尊重,不是妄议时政、煽动仇恨、破坏和谐、制造分裂一类的过激言论,都不是也不应该被视为不恰当的话题。 + +小氯想说的话就这么多。这不意味着小氯要向什么热点话题重拳出击,也不意味着小氯要在自己没有能力也不应该讨论的领域大放厥词。只是说,我们在公共空间中闲坐品茶时,可以聊的话题又多了一些。我们温和、友好、理性的基调不会改变,只是在思想的旷野与山峦中,我们手中不仅要有盛放的花,还要有明亮的剑。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(1):总要启程.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(1):总要启程.md new file mode 100644 index 0000000..648e0bc --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(1):总要启程.md @@ -0,0 +1,180 @@ +--- +title: Ephemeralis-Weekly(1):总要启程 +date: 2024-06-30 +summary: 浮生散记第一期 +description: 本文是作者的博客周报「浮生散记」(Ephemeralis Weekly)的第一期,内容是作者重开周报的考虑、作者本周的生活情况,包括写各种大作业的过程、重启 Hugo 博客的过程,以及与家人分别的不舍和思考。 +categories: ["人间世"] +series: 岁时录 +tags: + - 周报 + - 备案 + - 学习 +slug: weekly-1 +featuredImage: https://img.viento.cc/cover/weekly-1-cover.webp +draft: false +--- + +各位老友们好,我是 Chlorine。 + +本文是沉寂已久的周报——Ephemeralis Weekly(浮生散记)重启后的第一期,日期范围为公历 2024 年 6 月 24 日至 6 月 30 日。 + +祝食用愉快。 + +## 为什么重启? + +这件事,说来话长。 + +许多博客都有「周报」或者是其他时间周期的文章,于是在我刚刚建成博客不久后,我也兴冲冲地开了一个周报栏目,并且起了一个很矫情的名字——浮生散记(Ephemeralis Weekly)。 + +当时的我是怀着怎样的一番热血,现在我早已经忘却了。剩下的唯有令人尴尬的事实——「浮生散记」只更新了一期,就陷入了「先帝创业未半而还剩大半」的摆烂状态,后面更的一期根本算不上什么「周报」,连流水账都不是,只能算是「为写而写」的垃圾文字。明日复明日,明日何其多。恢复身体的努力,学业的压力,再加上摆复摆之的躺平心态,「浮生散记」无疑成了园子里荒草最多的一块土地。 + +之后的整个学期,我都是在一个浑浑噩噩的状态中度过的。直接的结果就是期末考试大寄特寄(从而导致了我现在比以往许多次都要严重的口腔溃疡)。优秀的绩点与我有缘无分,徒留我一个人喊着「悟已往之不谏,知来者之可追」的口号麻痹自己,怀着无知者无畏的心态像堂吉珂德挑战风车一般一头撞向瘟锌铀耗的大作业和小学期。 + +而现在,大作业终于被我急急忙忙地赶完了,无 DDL 一身轻的第二(或者说是第三)天,我就坐上了回校的高铁,去面对从未学过的 Java。 + +就是在这个节骨眼,我突然就有些迷茫了:我的生活,到底留下了什么? + +毫无记录,精神的和物理的都没有,只有手机上的日期变动提醒我又过了一天,一周,一月,一学期,一年。或许用不了多久,他人口中「美好的大学生活」就将结束,我就会懵懵懂懂地离开我的象牙塔,我的园子,走上一个连我自己也不知道是什么的工作岗位,干着连我自己都不知道是什么的工作,写着连我自己都不知道是什么的文章(也可能不写),走过宏观经济学家和政治家口中「失落」抑或是「繁荣」的年代,最终归于尘土或字节。 + +这太可怕了。 + +> Stay Dreaming, Stay Lucid. + +清醒地痛苦,也比糊涂地幸福要好得多。 + +所以我总归还是「想进步」的,心里的那团火,总归还是没有完全熄灭的。 + +所以,我感觉,我还是应该写点什么,向我自己证明我生活过。 + +于是我重启了我的周报。名字没换,因为我想不到什么更好的名字。如果你觉得「浮生散记」这个名字太拗口抑或是书卷气,叫它「园子周报」也没问题。我不保证会持续更新,但是有感悟了我一定会写。 + +以及,由于我没有[木木老师](https://immmmm.com/)那样庞大而丰富的友链(以及强大的能力),我的周报不会过度涉及我的老友们。 + +祝愉快。 + +Chlorine + +## 大作业 + +我一位因病休学,今年高考的老友最近找我吃饭,言语间不无好奇地问:DDL 是什么? + +我一时语塞。 + +其实 ddl 就是 deadline(截止日期)的意思,代指有截止日期的任务。想要逼疯一个带学牲,最好用的办法就是问 TA:你还剩几个 DDL/你期末考试怎么样了? + +> [!CAUTION] +> 请谨慎使用此类问题,尤其是在考试季。我不为您的生命安全负责。 + +大概是从什么时候开始学会赶 ddl 的?我也忘了,就像我在吃饭的时候跟娘亲打趣的一样:谈恋爱就像赶 ddl,没赶过 ddl 的人怎么才能学会赶 ddl?到时候就会了。 + +言归正传。其实考完试我的 ddl 也不算多(指数量),也就三个:图论的 Final Project,中国古代文明的期末论文,以及 OOP 的阅读报告。 + +### 图论 + +我们有一门叫作《离散数学》的课程(准确来说叫课程组),图论是这门课的主要内容之一。 + +图论有一个有趣的 Final Project,就是从给定的三个主题中选一个,用图论知识解决(另外有奇思妙想也可以)。这个可以在期末考试上加分,最多 10 分。由于我期末实在不怎么样,于是我决定做一下,垂死挣扎(那些考了 95+ 还来卷 proj 的人我不评价)。 + +我原本有一个想法——「如何逛遍学校的所有打卡点」,对应旅行商问题。后来我改主意了,选了「X 市所有高校的公交线路」,知识点就是最小生成树(其余两个更难一点,一个是最佳匹配,另一个忘记了)。 + +项目本身不难,代码很好写,只不过数据很难收集,我和往届的学长学姐要了好几次也没要到,好在我万能的娘亲帮我用缺德地图测出来了 (≧▽≦)。 + +然后的事情就毫无难度了,照着写就行。我还想了几个延伸方向,像多参数权函数、中心点和 Steiner 树之类的,可惜没找到好的数据源拟合公式。 + +### 中国古代文明 + +中国古代文明的期末论文主题是「XXX 的 XX 思想及其在中华文明中的意义与贡献」。不算是很刁钻的主题,可惜我知识不够,还是得靠学术 AI 帮忙搜集资料。以及,我这个废话大王第一次感受到了凑字数的痛苦 qaq + +以及,点名表扬 Typora 的 PDF 导出,非常美观,我整洁漂亮的报告在我的同学们中绝对属于前列水平。 + +### OOP + +终于到 OOP 了。由于我 OOP 考试寄了以及这个作业实在是太难等原因,我把它放到了最后一个。 + +OOP 的作业是阅读开源项目并且做报告 PPT。给的几个项目都挺阴间的,我选的是 TinyXML-2,因为它最小,而且 XML 嘛,也和我的 RSS 有关系。 + +TinyXML-2 一共两个文件(一个 `.h` 和一个 `.cpp`),加起来四五千行代码吧。由于水平太菜,我看的是挺痛苦的。具体过程就不和大家说了,防止影响大家心情。简而言之就是看完代码用 Marp 做 PPT,用 Obsidian 画白板,再写几个测试样例、Makefile 和 README 就可以交了。最终在 ddl 的前一天晚上送走了这尊瘟神。 + +## Hugo 博客重启 + +最近我一直在高强度更新我的 Hugo 迁移日志,因为我从 NotionNext 搬回到 Hugo 了。具体的迁移过程大家可以看迁移日志,我就不多说了。 + +反正也是挺麻烦的,从 shortcode、homepage 到评论系统、搜索这一堆,遇到不会的只能 Google 或者问 AI。从期末考试前折腾到考试后,所幸最终效果还可以。 + +我对这个主题还是挺喜欢的,后续可能再完善一下,开源成一个完整的主题。 + +### 备案那些事 + +在期末考试前,我曾经尝试过备案,但是失败了。在期末后,得知备案期间可以不用暂停 DNS 解析,不肯安分的我又走上了备案之路。 + +这次备案的流程和上次差不多,由于接到了备案专员的电话,套路云初审很快过了。 + +但是吧,在我调查了后续的公安备案流程后,我顿时就不淡定了。非交互式备案简单,但是不能开评论;交互式备案则比较繁琐。 + +我当初备案就是为了让国内访问更方便,要是起了反作用,我还备个什么案啊…… + +很可惜,备案订单提交到管局后就不能撤回了,联系了套路云的工作人员,他们说可以试着处理。算了,大不了就换域名,或者老老实实走流程。 + +## 聚少离多 + +下面的内容可能有点煽情,谨慎观看。 + +或许是时候和各位老友说说我过去的一些经历了。我在准高三那年暑假摔了一跤,在病床上过了大半个高三。在大一上学期的寒假,我和家人深思熟虑后,决定立即做第二次手术,取出当初打在骨头里面的钢钉(事后证明这个决定还是明智的,因为根据手术情况,如果等到这个暑假取钉,很可能就取不出来了)。 + +二次手术的恢复时间比第一次短,但是也足以让我躺着过了整个寒假,以及在再次开学的时候拄着拐杖。在休学和带病上学之间,我选择了后者。我的娘亲也决定前往我所在的城市,照顾我的生活。这一照顾,就是一个学期。 + +这一个学期的事情不多说了,我从上学期「独自一人」的生活状态,也慢慢重新适应了「有人陪伴」的生活状态。在期末考试后,我和娘亲一起坐车回了家。 + +但是,随着我身体的好转,我也应该再次脱离照顾,独自面对小学期、暑期实践以及后续的学习生活。这是个很自然的过程,但是实际转换起来,没那么容易。 + +我们一家人其实都不善言辞。但是在我爹下班回家,和我们闲聊的时候,他说,刚开始还没怎么样,但是就在(原谅我该死的记忆力)的时候,上完夜班回到家,房子空荡荡的,心里特不是滋味。 + +我听完心里也不是滋味——能让我爹——一个兢兢业业认真负责的人民教师,一个沉默寡言到有一点笨嘴拙舌的男人都这么说…… + +我不是什么坚强的人。刚上大学时,军训的时候,根本没有人教我,作为一个身体不佳半训的学员应该怎么做。和学院持续不断协调宿舍的过程让我们疲于奔命,每天心里都堵得慌。每晚累得半似地回到空荡荡的宿舍,一闭上眼就是在家里的幸福时光。那时候我的泪点低到夸张,随便哪一个刺激,甚至是毫无来由的内心回味都能让我直接破防。我一坐下来就去发微信,看着自己刚印出来的全家福出神,根本不敢听自己以前经常听的歌……现在说起这些也许显得可笑,但是当时的我就是这样的。 + +转机是什么时候呢?大概是在军训接近尾声的时候,我们的辅导员带着我们几个凑巧在一起的同学(甚至不是一个班级的),拿着偶然找到的吉他,在操场的夜幕下一起唱歌。一首接着一首,想到哪个就现场查谱现场弹唱。记得那天我回去得异常的晚,心里是说不出的快乐和充实,就好像某些东西一下子被填满了。宿舍在我的眼中,也成了微信消息中「温馨的小窝」。 + +然后,事情就慢慢好起来了。我从高中生到大学生,从不相信自己能上台的社恐分子到一手承包队伍所有汇报展示工作的组长,从生活不能自理到生活基本自理,几个月,像梦一样。 + +我记得,我在刚刚启程上大学的时候,发了一条朋友圈: + +> 就向着告别飞驰吧,年轻的旅人们。 + +这是一句歌词,出自我很喜欢的一首歌——《向告别飞驰吧》。 + +> 我躺在忧伤的黄昏 +> +> 看光明,正分神 +> +> 看每个恍惚的路人 +> +> 为虚构,而狂奔 +> +> 我经过的地方 +> +> 曾看见末日寄来了 +> +> 新灵魂 +> +> 废墟上的世界 +> +> 用它的方式告别你 +> +> 的青春 +> +> 再见了,爱的人 +> +> 再见歌声,你曾经唱起风尘 +> +> 再见神的指纹 +> +> 我已去往,在未来,新的旅程 +> +> 当时光的羽毛落向 +> +> 宇宙的,那道门 + +所以,当我在十一假期第一次自己回家,我会对来接站的泣不成声的妈妈微笑着说:「哭什么?我这不是回来了吗?」在这次临出发之前,我会对家里人说:「别想我,好好玩你们的啊!」 + +——**因为,即使聚少离多,即使依依不舍,我们也总要启程。** diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(2):生日快乐.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(2):生日快乐.md new file mode 100644 index 0000000..4c8d4d6 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(2):生日快乐.md @@ -0,0 +1,90 @@ +--- +slug: weekly-2 + +summary: 浮生散记第二期 +series: 岁时录 +tags: + - 周报 +title: Ephemeralis-Weekly(2):生日快乐 +date: 2024-07-08 +description: 本文是作者周报的第二期,这是非常值得记录的一周,作者过了自己的19岁生日,并分享了在农历生日和公历生日的庆祝活动。他还提到博客迎来了200天的生日,给博客接入了Quail作为Newsletter,并谈到备案和其他一些想法。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-2-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第二期,日期范围为公历 2024 年 7 月 1 日至 7 月 7 日。 + +这是非常值得记录的一周,祝食用愉快。 + +## 生日 + +本周的标题叫作「生日快乐」,很大一部分原因是因为,这周我过了我的 19 岁生日。 + +我的农历生日是五月廿九,今年的 7 月 4 日;公历生日是 7 月 5 日。很巧。 + +### 农历生日 + +按照我家乡的风俗,我喜欢过农历生日。因此,妈妈为我订了一个生日蛋糕,刚好在我下课的时候送来。我送了帮我保管的宿管阿姨一块,留了一块给同宿舍的学长,剩下的,我吃了好几顿。 + +![生日蛋糕|421](https://img.viento.cc/weekly-2-1.webp "拍照技术不好,见谅") + +宿舍不允许用明火,我也没有打火机和火柴,因此我只是把蜡烛插上了蛋糕,没有吹,默默地许了个愿望。生日帽有点短,系不上,被我卡在眼镜下勉强固定住。 + +我在空空荡荡的宿舍中吃了一大块蛋糕。 + +### 公历 + +在旁人眼中,这才是我的生日。 + +按照班级的传统,每位同学都会有一个生日推。我选了我个人认为最好看的照片,发给了宣委。收到了许多师长、同学和朋友的生日快乐。正巧,我的朋友来学校找我玩,于是说什么也要给我再过一次生日。 + +![朋友们的蛋糕](https://img.viento.cc/weekly-2-3.webp "蛋糕有些变形了") + +谢谢我的朋友们,让我过了一个有人陪的生日。 + +### 一点碎碎念 + +在我看来,「生日」和平常的一天,实际上没有什么区别,其所有的特别之处,其实都在于「别人知道今天是我的生日,所以他们会觉得今天特别」。 + +这实际上是一种外向的认知,将自己的认知依托于别人。一般来说我并不完全赞成这种认知方式,但是由于这次并没有影响到我的 routine,同时朋友和家人的祝福也给我带来了很高的情感收获,所以似乎也不错。 + +过生日的那个我,和现在在这里不知所云的我,在精神层面应当不是一个我吧。 + +## 博客 200 天 + +没错,这周不仅是我的生日,也是博客的 200 天「生日」啊。 + +一般来说,百天好像会很隆重地庆祝,但是 200 天……我没听过。 + +反正也是个整数就是了呢。 + +## 故人来 + +如上文所述,我高中时代的一位好兄弟过来旅游,希望逛一逛我们的学校。但是平心而论,我这个导游当得极其不称职。没有提前做什么规划,去了许多地方都发现没有开门(例如校史馆),招待也算不上很热情,甚至有几次还没能成功抢单请客。 + +## 备案 + +> 打今儿个起,咱也有了旗籍了! + +兜兜转转,备案终于是批下来了。实际上也没用几天,办事效率还是可以的。毕竟我这就是一个个人网站,遵纪守法,态度良好,没有不通过的理由不是(Doge)。 + +据说好多博主不希望备案,是害怕实名信息一查,被人爆了。我还好。 + +兴高采烈地用了一下 CDN,但是发现问题有点多,罢了,先放着。 + +ICP 备案之后还有公安备案。为了方便我选的非交互式的,看看后期能不能转交互式,或者直接不管不顾地评论(逃)。 + +## Quail + +最近给博客接入了 Quail 作为 Newsletter,详情见 [Hello,Quail]({{< relref "Hello%EF%BC%8CQuail.md" >}})。 + +## 其他 + +口口声声说着「这是值得记录的一周」,但是在笔上却是持之以恒地摆烂呢。 + +- 想画一些意识形态的拟人,可惜手残,画不了一点,只能口嗨。 +- 对开源基金会的运作有一点兴趣。不知道我这个菜鸡有没有机会成立一个真正的开源开发组织呢? +- Windows 11 娘好可爱!>w< +- 当你选择遵循版权法时,生活就会变得艰难许多。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(3):执笔衔书.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(3):执笔衔书.md new file mode 100644 index 0000000..4525cc9 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(3):执笔衔书.md @@ -0,0 +1,138 @@ +--- +slug: weekly-3 +summary: 浮生散记第三期 +series: 岁时录 +tags: + - 博客 + - 周报 + - 开源 + - 日常 +title: Ephemeralis-Weekly(3):执笔衔书 +date: 2024-07-22 +description: 本文是作者周报的第三期,作者分享了他参与小学期课程的大作业开发新闻客户端的经历。他通过学习教程、魔改代码,克服了时间紧迫和自身知识短缺的困难,最终成功完成了作业。此外,作者还谈到了他的梦想是成立一个自己的开源基金会,并介绍了自己最近想学习的新的编程语言Rust以及他喜欢的美食烤冷面。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-3-cover.webp +draft: false +--- + +各位老友们好,我是 Chlorine。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第三期,日期范围为公历 2024 年 7 月 15 日至 7 月 21 日。祝食用愉快。 + +## 「衔书」 + +这个标题听起来蛮有诗意的,但是实际过程没那么有诗意。 + +简单来说,我们的暑期课程大作业要求是使用 Java 开发一个新闻客户端,实现乱七八糟的一堆功能,包括但不限于新闻爬取、列表展示、详情页面、图片/视频展示、AI 摘要、历史记录、收藏功能、本地缓存和搜索等。 + +听上去有那么亿点可怕,更何况我们从结课到交作业只有十天左右的时间,而课程本身也只有十天。十天,要讲明白最受欢迎的企业级编程语言之一,谈何容易?就算是老师尽力输出,也只能带我们浮光掠影地看个大概。 + +更何况,我是个上课从来不听的摆子人。 + +--- + +一开始我基本上毫无头绪,有一种即将入土为安的美感。我甚至连 Android Studio 都不会用。所幸,我的一位同学告诉我:可以去 B 站上找相关的教程(B 站真的是个学习网站呐 XD)。然后我就去找了,嘿,您猜怎么着?真找到了,而且是手把手的教程!(这里感谢一下教程的作者 [@浩宇软件开发](https://space.bilibili.com/492354901),如果没有他的教程我必 4 无疑)。 + +事实证明:面对一门你完全不熟悉的语言的时候,照葫芦画瓢加魔改永远是最好的方法。就像我们写 C++ 代码的时候: + +```cpp +#include +using namespace std; + +int main() { + cout << "Hello world!" << endl; + return 0; +} +``` + +刚开始谁又能说清楚什么是预处理指令、命名空间、流运算符?还不是先「当成八股文写下来」(来自我的程序设计基础课程老师),然后再一点点理解? + +继续。我照着教程的代码一点点敲下来,中间不断地魔改,来适应作业的要求和我自己的审美。随着作业进程的推进,我写得越发得心应手,常常一天更新四五个功能,很多部分实际上已经完全是自己在独立开发了。用我报告的话来说,就是: + +> 从看着什么都没有的用户界面直龇牙,到开始细致地考虑美工和设计;从什么都需要翻 CheatSheet、查教程、问 AI,到能为别人解惑答疑;从「做出来就行」到「做个还行的就行」到「必须得做个好的」 + +最终,我花了六天左右的时间,完成了这份看起来极其恐怖的作业,以及用心到让人无法直视的报告(上万字,导出为 PDF 有上百页,这个长度应该可以说是空前绝后了)。我将最终的产品取名为「衔书」(Xianshu 或 Tsira News)。 + +不过其实我最想说的还不是产品开发的过程本身,而是我这几天的状态。 + +刚开始时,为了学习效率,我尝试去三教自习。找了一圈没找到空教室,只好随便找了个人少的地方。此后几天,如果没有特殊情况,我一直都在这个位置。 + +架好电脑,戴上耳机,平心静气地不停地敲着。一个功能,一个功能,又是一个功能。我就这么一点点解决遇到的问题,兵来将挡,水来土掩,顺滑得行云流水,道法自然。 + +这种美好的学习状态,上次还是在我高中的时候。我感觉那个工作效率爆表的我又回来了。 + +口说无凭。在这六天的时间里,我写完了包含几千行(估计的)代码的 Android 应用,完成了数万字的报告,还顺带着帮班级的思政实践写好几千字的预调研报告,还顺带着帮几个同学答了下疑。 + +有人可能会将这看成「DDL 是第一生产力」,但是就我个人的感觉来看,这就是这几天的状态的优越。 + +总而言之,这几天是卷得神清气爽,果然我的学习血脉还是在的~ + +## I Have A Dream + +「I have a dream」,我有一个梦想,简单的英语句子,因美国黑人平权运动先驱马丁·路德·金(Martin Luther King Jr.)于 1963 年在华盛顿特区林肯纪念堂前发表的演讲而举世闻名。 + +金是一位杰出的社会活动家,他的梦想就是实现社会的正义与平等。我没有如此的社会责任、胸怀与热忱,但是我也有一个梦想:成立一个自己的开源基金会。 + +容我多说几句吧。 + +我一直是一个典型的「没什么理想」的人,具体来说,我没有什么明确的目标和方向。就连报志愿的时候也可以算是一个「一时兴起」的决定。 + +但是我也做过梦,一个听起来挺中二的梦——「追逐人类心智的荣耀」。 + +我对科研的兴趣应当起源于我初三和高一的时候。我们初三开始学化学,至少在考试方面,我展现出了相当出色的化学天赋,以至于初三后期老师开始明令禁止我听课(她认为这样是在浪费我的时间 LOL)。高中时期,我的班主任就是化学老师。我曾经在刚开学的时候——他刚刚注意到我的时候对他说,我想学化学。他说,好,那就报北大的化学系(准确来说应该是「化学与分子工程学院」,我对北大许久的好感就是从这一刻开始的。当然,那是另一个故事了)。 + +于是乎我有了自己的第一个梦——化学,做最顶尖的化学家。我当时不在乎什么冷门热门,只是感觉自己喜欢(毕竟,清北复交浙这个级别的学生——我当时多少是带点自傲的,觉得自己能在三年后稳稳上岸——还能饿死不成?多天真的想法啊)。有喜欢的事情,就是幸福啊。 + +请允许我省略中间的故事。我的梦几度变易,从化学,到物理,到数学,到统计。唯一没变的,就是我那份中二的科学家的心。 + +后来,我的中二又有了新的高度。我不再满足于「做科研就完事了」,我希望我能「追逐人类心智的荣耀」——用自己的努力,为人类知识的边界开疆拓土,将有限的一生奉献于无限的探索中。 + +听上去……确实挺好的。 + +然后这么梦在高考后醒了。 + +不是说我发挥失常,相反,我考得其实还不错。但是最终我去了一所我曾经并无好感的学校,读了从某种意义上可以说是我曾经最不喜欢的专业。 + +个中曲折,我不希望在此细说。总而言之,我收获了许多,唯独把我曾经中二而热烈的梦想丢掉了。 + +一件事如果不喜欢,又没有长久的目的,是很难做下去的。我现在的学业并不突出,可能也有这个原因(~~不要把自己的弱鸡归因于其他~~)。 + +然而,作为一个从没接触过计算机的小镇做题家,在我高强度(迫真)写了一年代码后,我反而感觉这门学科还是蛮有意思的。以及在不断的不务正业中,我接触到了另一个奇妙的世界——开源宇宙。 + +开源宇宙确实是个奇妙的地方。各路精英大佬各显神通,做出令人惊艳的产品,然后把源代码交给社区。而开源社区的精神,也是极为具有感染性的:自由,开放,协作,探索,行动。 + +恍惚之间,我感觉当年离我而去的梦,又以另一种形式回来了。 + +一个是贡献理论知识,一个是贡献代码和产品,都是崇高的事业,值得人奉献一生的事业。 + +于是,我想着,将来是否有这个机会,成立一个自己的开源基金会? + +这个设想基本和成为世界级科学家一个难度,而且我对开源团体的运作机制完全不了解。可能我更想表达的是一个社团,一群志同道合的人合作开发令人惊艳的产品,依靠社区的支持完成运作和对成员生活的补益。 + +但是我就是这么想了,甚至还给「基金会」起了一个名字,叫「青若」(Tsira)。这个词汇没什么特别的含义,就是我一拍脑袋想出来的。 + +这个新闻客户端,也是第一个还算能叫「产品」的产品。我为它冠上了 Tsira 的词头,并且在签名证书的单位上郑重地写下:Tsira Open Source Foundation。 + +我不知道这是不是又会成为我无数个胎死腹中的梦想之一,咱们暂且先看着吧。 + +## 学门新语言? + +最近相对比较闲,就想着学门现代化的语言,来满足自己开(zhē)发(teng)的欲望。环顾一圈,现代化,高性能,还能写美观的跨平台应用,那首选应该就是开源世界的新宠——Rust 了。 + +![](https://img.viento.cc/weekly-3.avif) + +于是我准备试一试 Rust。然后我就疯了。 + +都说 Rust 在所有权、生命周期这块难,但是从一开始我就觉得,Rust 的语法怎么看怎么别扭…… + +都变量了,为什么还要显式声明可变?为什么打印是宏?这导入用的什么格式?为什么变量可以自动类型推导常量就不行?为什么…… + +行吧,Rust 有自己的美,但是目前我是理解不了一点。 + +所以现在还剩下 Swift(需要烦人的 Xcode)、Go、Dart、Kotlin 等这些。要是各位知道什么语法和 C++ 相似(但是更简单),同时还比较优雅的现代语言,可以给我推荐一下。 + +## 烤冷面 + +烤冷面属于一个我不常吃但是挺喜欢的美食,但上大学之后就很少吃了,主要是没有很好的地点。后来尊敬的崔博士(我的高中同学)带我去二食堂吃了一次,只能说过得去,但是胜在便宜实惠。 + +最近我在饿~~似~~了么发现了一家烤冷面,做得相当好吃,于是这周点了好几份。虽说贵了点,但是人家好吃啊~ diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(4):缝隙之间.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(4):缝隙之间.md new file mode 100644 index 0000000..a8e435b --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(4):缝隙之间.md @@ -0,0 +1,133 @@ +--- +slug: weekly-4 + +summary: 浮生散记第四期 +series: 岁时录 +tags: + - 博客 + - 周报 + - RSS + +title: Ephemeralis-Weekly(4):缝隙之间 +date: 2024-08-02 +description: 浮生散记第四期。作者回顾了自己的假期和工作情况,还介绍了RSS和独立博客的意义。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-4-cover.avif +draft: false +wikilinks: true +--- + +各位老友们好,我是 Chlorine。 + +现在其实不是写周报的时间,但是考虑到下面几天的经历几乎一定会和这几天严重割裂,所以提前(延后)写一下周报,总结一下这几天令人一言难尽的小假期。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第四期,日期范围为公历 2024 年 7 月 23 日至 7 月 2 日。祝食用愉快。 + +## 缝隙中的假期 + +如上期 [[Ephemeralis-Weekly(3):执笔衔书]]所说,我前段时间的任务就是忙 Java 大作业的验收工作。在闯关(铜人音)后,我就提着行李箱,头也不回地坐上了回家的高铁。 + +其实这次回家有点无厘头。我几乎是在前一天晚上才定下来我要回去的,甚至由于这几天恶劣的天气,我原本定的高铁票还被取消了,搞得我差点红温。所幸后来递补上了一张票,还是直达的,还不错。 + +说起来这也是我第一次主要使用公共交通工具去火车站(当然一共也没去几次)。说起来也相当顺利,倒两班地铁再做一点公交车就到了。 + +由于时间比较充裕,就在火车站吃的午饭。吃的是金拱门(麦当劳),性价比嘛,emmm,他明明可以直接抢我 50r 的,却还要送我一份午饭。他真的,我哭死。 + +下面就是漫长的旅行了。路上无聊,我提前下了部电影,卓别林的《大独裁者》(B 站热心网友修复版)。这部片子之前看过一次,非常推荐。 + +很可惜,到家之后,沟槽的天气依然在追我。我有幸见证了东北罕见的梅雨天,我的被褥全天都是湿漉漉的。 + +## 写报告的人 + +我一直认为,我算是个「天生报告圣体」。只要是涉及到写报告的项目,我都能在很短的时间内拿出让你瞠目结舌的报告。这应当得益于我~~信口开河~~出口成章的能力,以及 Typora Theme Lapis 的美观。 + +![](https://img.viento.cc/IMG-20240802135217.avif "喜欢我一百页的大作业报告吗?") + +但是我并不想在假期还要整天赶报告。很不幸,这件事由不得我。 + +如各位所见,我校会在适当的暑假组织同学们进行小学期和思政实践。我是我们支队专业调研组的组长(调研组分专业调研组和思政调研组),同时还是预调研报告的主理人。 + +听起来似乎还挺好,但是当你听完那些任务的时候可能就不会这么觉得了。 + +中间的过程我也不和大家细讲了,我害怕影响大家心情。总而言之就是反反复复改需求,常常是写到快结束了突然改要求。我写了好多个整天,更要命的是那几天我还在发烧,我现在都难以想象我是怎么活下来的。 + +![](https://img.viento.cc/IMG-20240802135757.avif "把我们各个组的同学都搞破防了") + +反正最后终于是搞出来了,我们都累得够呛。当然,这并不算是抱怨,无论是老师还是同学还是对接方都在很努力很用心地做,只是大部分时候天不遂人愿罢了。 + +## V2RSS + +本节标题来自 V2EX(Way to Explore)。 + +先做个科普(from Wikipedia): + +> RSS(英文全称:RDF Site Summary 或 Really Simple Syndication),中文译作简易信息聚合,也称聚合内容,是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。使用 RSS 后,网站订阅者便无需再手动查看网站是否有新的内容,同时 RSS 可将多个网站更新的内容进行整合,以摘要的形式呈现,有助于订阅者快速获取重要信息,并选择性地点阅查看。 + +RSS 基于 XML 语言,是一种标准化的数据格式(由于我 OOP 的大作业写的就是 TinyXML2,Java 大作业更是天天用 XML 写布局,我对这个货相对还比较熟悉。简单来说相当于自定义标签和属性的 HTML)。 RSS Feed 文件包含了一系列的 `` 元素,每个 `` 代表一篇更新内容。RSS 阅读器可以解析 XML 文件,提取其中的关键信息并展示给用户。 + +简单来说,RSS 就像是一个网站的新闻推送,让你不用访问网站就能知道它更新了什么。RSS 的原理可以简单理解为以下几个步骤: + +![](https://img.viento.cc/IMG-20240802141229.avif) + +RSS 的好处大概就是(没错是用 AI 总结的\\逃): + +- **及时获取最新信息:** 订阅 RSS 后,网站更新的内容会自动推送到你的阅读器,无需反复访问网站查看。 +- **高效阅读:** RSS 阅读器会将多个网站的更新内容聚合到一起,方便你集中阅读。 +- **节省时间:** 不用浪费时间浏览无关信息,直接获取你感兴趣的内容。 + +对于我本人而言,在很长(其实也不长。我的网络生活应该是从我上大学开始分界的)一段时间内,RSS 在我眼里就是一个完全没有什么实际影响的「光锥之外」的技术概念。而且,都 4202 年了欸,电子邮件我几乎都不看了,还指望我看 RSS?开什么玩笑捏。 + +然后当然就是大家喜闻乐见的打脸时刻。今天(2024.8.2)我光速下载了在 Apple 生态下久负盛名的 NetNewsWire,然后把自己平时喜欢逛的几个博友的网站和技术周刊都加了进去。 + +为什么呢? + +> 我不到啊! + +没错,我还真不怎么知道。大家就姑且认为我精力过剩了吧。反正我现在觉得 RSS 是个蛮好的东西。 + +如果大家希望通过 RSS 订阅我的博客:。 + +## 缝隙中的人 + +我们接着 RSS 讲。在今天刚刚搞好 RSS 的时候,我突然想起了当初和[孙哥](https://clf3.org)的对话: + +![IMG-20240802142447.avif](https://img.viento.cc/IMG-20240802142447.avif) + +孙哥是个技术人,并不怎么在乎博客折腾来折腾去这些事情。不过有一点是对的:RSS 确实是个很老的东西了。RSS 首次发布于 1999 年 3 月 15 日,最新版本的 RSS 2.0 也是 15 年前的事情了(RSS3 和传统的 RSS 很不一样,是去中心化技术的一部分)。现在还在用 RSS 读文章,就像是还在用老式收音机听广播一样。 + +**不过话又说回来,做独立博客这件事本身,不就是一件「老旧且过时」的事情吗?** + +技术门槛高(相对于直接在现成的平台上写而言),时间投入大,即时互动少,没有推荐算法,没有依托平台的推流,盈利困难……怎么看,独立博客都是一项费力不讨好的小众爱好。 + +事实也的确如此。独立博客就像是数字汪洋中的孤岛,用自己的声嘶力竭演绎着什么叫作沧海一粟。 + +--- + +独博圈的大佬[杜老师](https://dusays.com)前些天发了一篇文章:[杜老师说稿件征集](https://dusays.com/730/),向博友们征集感兴趣的素材和话题。 + +我感觉很有趣,下滑看看评论区,不同的博友们都开开心心地提着自己的见解。我忍不住也打了条应景的评论: + +> 感觉独立博客做到杜老师这么出色,已经是整个博友圈的共同宝藏了。 + +是啊,共同的宝藏。就我有限的认识,独立博客的读者许多(甚至可以说是大部分?)也是独立博主,不同的见解、知识、经历和体验以 Hypertext Transfer Protocol 为载体在不同的个体之间流动,形成一个小众、冷清但又热闹的圈子。大家的身份不同、生活不同、喜好不同,但是既然都在做这些事情,那至少是有一部分共鸣的。那么,组成一个汪洋大海中的群岛,平时各自打理,时常互通有无,不好吗? + +这应该也是我开始努力「对外航行」的原因。从「开往」的友链接力项目,到友链的扩列,到开始积极地「走街串巷」,去赛博拜访同样做着独立博客的老友们(老友是我的一个习惯用语,即使我们只认识了一分钟,如果灵魂相通,那也都是 friends that haven't met before)。 + +> 我的岛屿之上,荒无人烟。 +> 我捡拾山石的苔藓, +> 焚烧风干的枯枝落叶, +> 燃起火焰。 +> +> 有时候有人登岛, +> 有时候一个人狂欢。 + +海平面淹没不了岛屿,无论网络如何变迁,我始终相信,独立博客作为一群「小众、过时、老派」的人的精神家园,会且始终会存在。 + +**毕竟,我们都是「活在世界缝隙中的人」**。 + +## 其他 + +- 写了个 Python 脚本,基本上解决了 Obsidian 图片压缩的问题,只是上传还有点麻烦。 +- 奇怪的烤肉串,味道还不错。 +- 最近开始重拾 TypeScript,不得不说 JavaScript 和 Java 是真挺像的。此外 `Bun.js` 真是宝藏运行时。 +- 马上要飞去深圳了……祝我旅途愉快! \ No newline at end of file diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(5):只是去做.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(5):只是去做.md new file mode 100644 index 0000000..c7eca41 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(5):只是去做.md @@ -0,0 +1,178 @@ +--- +slug: weekly-5 + +summary: 浮生散记第五期 +series: 岁时录 +tags: + - 周报 + - Vaultwarden + - Gitea + - Obsidian + +title: Ephemeralis-Weekly(5):只是去做 +date: 2024-09-01 +description: 本文是作者周报的第五期,详细记录了自己在技术折腾、笔记软件选择以及生活琐事中的思考与实践。主要内容包括部署Vaultwarden和Gitea的经验分享,笔记软件的使用和选择中的感悟,高效率完成一次准备任务以及在健康问题下的饮食调整。文章风格轻松幽默,体现了作者对技术和生活的热爱与反思。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-5-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。水篇文章。 + +本期已经不能称作「周报」了,因为时间跨度长得我自己都不知道是多少。各位当个乐子看就好。 + +祝食用愉快。 + +## Hello,Vaultwarden + +开局咱们先甩一个 Hello 宇宙新成员。本来这个是打算单独水一篇文章的,但是实在是写不出什么新颖的东西了。 + +这个起因说来大部分还是我比较闲,当然,对外说的原因是 Chrome(实际上是 Arc)的密码管理机制实在是太聪明了,它……居然都不做个本地加密。行吧,小厂的产品这样我也就忍了,您 Arc,号称改变互联网的下一代浏览器,以及您,Chrome,Google 最得意的作品,世界市场占有率第一的浏览器,对于用户最隐私的部分……连个加密都不做?我知道您对您的产品沙盒的坚固程度很有自信,但是,我是说但是,有没有一种可能,有一些软件喜欢扫盘呢? + +(冷知识:有一段时间我本地存放一些重要信息的 `tokens.csv` 也没加密,甚至没有沙盒。后来改用 GPG 加密了,当然现在找到了更聪明的存放方法。大家可以在评论区嘲笑小氯了。) + +于是我想改用 iCloud 自带的钥匙串。这是个很不错的选择,但是由于最近我又开始使用我的安卓备用机了,这就变成了一个 sour point。而且,iCloud 密码管理器在接管 Chrome 等的自带密码的时候似乎总是有问题,不知道为什么。 + +所以我盯上了伟大的自托管密码管理器—— [Bitwarden](https://bitwarden.com)。 + +雷蒙德·卡佛有本书:《当我们谈论爱情时我们在谈论什么》。小氯不懂谈论爱情时谈论的是什么,但是当我们谈论 Bitwarden 的时候,我们谈论的几乎都是 Vaultwarden(拜托……不要那么生硬地抖书袋可以吗?)。 + +Vaultwarden 是一个 Bitwarden 的分支——准确来说,是一个实现了 Bitwarden API 的第三方服务(因为 Vaultwarden 的代码实际上是自己写的),采用我们喜闻乐见的 Rust 编写。Vaultwarden 的内存占用极低(据说是 10M 左右,我实际测试下来大概是 30M),并且兼容几乎所有 Bitwarden 的 API,适合个人和小型组织使用。 + +为了省事,我们直接使用 1Panel 进行部署即可。在应用商店搜索 Bitwarden 就可以,安装的实际上就是 Vaultwarden。 + +安装后登录,创建一个主密码。这个东西很关键,不推荐使用日用的密码,可以通过命令行生成一个随机字符串,然后放在一个安全的地方存放好。 + +在登录后,回到 1Panel,修改一下我们的 `docker-compose.yml`,添加几个环境变量: + +```yaml +environment: + - TZ=Asia/Shanghai # 时区,按自己的来 + - SIGNUPS_ALLOWED=false # 禁用注册 + - INVITATIONS_ALLOWED=false # 禁用邀请 + - ADMIN_TOKEN=你的管理员 token # 推荐用 openssl rand -base64 48 生成一个 + - LOG_FILE=/data/vaultwarden.log + - LOG_LEVEL=warn + - SHOW_PASSWORD_HINT=false # 禁用主密码提示 + - DOMAIN=你反代的域名 +``` + +完事。此外,推荐开启 2FA 和 HTTP 鉴权,更安全。毕竟这玩意是最不能暴露的。 + +如果需要导入 Chrome 存储的密码,可以在 `chrome://settings` 页面的密码管理工具中导出 CSV 再导入;如果需要接管浏览器级别的密码存储,安装 Bitwarden 扩展即可。此外 Bitwarden 还提供了 iOS 和 Android 客户端,以及一个 Bitwarden Authenticator 验证器(不过 2FA 用 Bitwarden 自己也可以做)。 + +(小声吐槽一句:Bitwarden 的这个手机客户端实在是太难看了) + +如果需要更多知识,可以参考[这篇教程](https://atpx.com/blog/docker-vaultwarden/)。 + +## Hello,Gitea + +这是我部署的又一个比较大的服务。起因其实是我希望使用 Git 同步一下我的 Obsidian 笔记库,但是又不太放心把笔记交给 GitHub 和牢软(~~那你早干嘛去了~~),因此打算自己部署一个小 Git DevOps 玩玩。那么最合适的选择就是 Gitea 了,Git with a Cup of Tea,轻量美观的服务。 + +这里是 Gitea 的官网,可以参考官网的部署方式。由于我是个人使用,因此 SQLite 就足够了,MySQL 占用资源太多了,另一个原因是 1Panel 陷害我,部署 Gitea 之后差点没把我机器干废。 + +```yaml +version: '3' +services: + gitea: + image: gitea/gitea:latest + container_name: gitea + restart: always + environment: + - USER_UID=1000 + - USER_GID=1000 + - DB_TYPE=sqlite3 + - RUN_MODE=prod + ports: + - "3000:3000" + - "222:22" + volumes: + - ./data:/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + +``` + +登录后会出现注册页面,按照要求操作即可。如果是个人实例,为了安全,推荐在登录后把注册等等乱七八糟的功能全都关了。编辑 `data/gitea/conf/app.ini` 即可。总体而言,由于我的虚拟机在国内,速度还不错,不比 Gitee 慢多少 :) + +关于 Gitea 更多的部署知识,可以参考[杜老师的教程](https://dusays.com/722/)。 + +顺便说一句,我的 Gitea 实例叫「小氯の鲜果茶」(๑˃ᴗ˂)ﻭ + +## 折腾笔记软件 + +接着上面 Obsidian 的事情,说说最近折腾笔记软件的经过。 + +我是一个卡片笔记的爱好者。不过,我的思路和经典的 Zettelkasten 还不一样:卢曼教授会给卡片编写细致的索引,但是我不喜欢。我甚至都不希望有太明显的层级,这一方面是因为 [Pseudoyu](https://www.pseudoyu.com/zh/) 说的「心智负担」,另一方面也与我的思考方式有关。 + +我是一个思维极其跳脱的人,平时就喜欢胡思乱想,从一个思维锚点出发可以通过一系列几乎是难以理解的联想迅速跳转到数个看起来八竿子打不着的话题(而且我的语速极快,使得和我闲聊的人很多时候难以跟上我的思路)。同时,我的学科背景算是比较广泛的,高中时以「九边形战士」(我们存在的九个学科——数语英物化生政史地。相对来说,我地理比较差)而闻名,分科后理科拿高分的同时也喜欢闲着没事去钻研人文社科相关的内容,尤其语文和历史可以说好于绝大部分的文科生。现在大学读的专业天然带着交叉属性。平时也爱折腾,了解各个领域奇奇怪怪的小知识。因此我的知识库(如果有)主打一个多且杂,注重在同一个问题中运用各种可能的知识进行~~胡乱的~~链接。所以,严格的分类和放置对我来说反而是桎梏。我最多是打 categories(如果领域太多,加一个 subcategories)和 tags,有时候连 tags 和标题都懒得打。 + +回到笔记软件。我对笔记软件的理想要求如下: + +- 良好的编辑体验,支持 Markdown 和 GFM 标准(或者其他轻量级标记语言) +- 开放格式,或者可以导出为开放格式 +- 高度卡片化和非线性 +- 支持随时随地闪念记录 +- 支持剪藏 +- 支持双向链接,关系图谱属于加分项,可有可无 +- 足够的写作性能、搜索性能等 +- 支持同步(移动端有简单的查看和闪念记录即可,主要要求可靠) +- (optional)白板,可视化思维工具 +- 本地化,离线可用 +- 开源,或至少需要保证尊重用户隐私 + +**不过,我找了很久,遗憾地发现,满足我全部要求的 silver bullet 目前是不存在的。** + +目前为止,Obsidian 应该是我用过编辑体验最好的笔记软件,Easy Typing、LaTeX Suite、Completr 等插件的加持使得 Obsidian 可以薄纱市面上几乎所有的编辑器,同时高度可扩展性的平台生态为其增加了几乎无限的可能;TiddlyWiki 是最符合我卡片笔记思维的一款,单文件 self-contained、开源免费也为其增加了最大限度的可靠性;思源笔记应该是所有类 Notion 软件中对 Markdown 支持最好的一款,同时支持和 Memos 以及 Web Clipper 的 100% 整合;Affine 的设计风格我非常喜欢,同时支持手写白板也非常诱人…… + +乱花渐欲迷人眼。我在「挑选一个最好的笔记软件」这件事上越陷越深,浪费了不知道多少时间。 + +直到我想起我和娘亲的一段对话: + +> ——儿子,你回去上学了会想家吗? +> +> ——会啊。 +> +> ——那怎么办? +> +> ——想就想呗,也不耽误干活。 + +这款软件不完美,不等于它不能用。既然我还没到「能自己写一个完全满意的工具」的程度,那也只好先从现在能用的资源里挑个最好的。于是我暂时放下了追求完美的念头,继续用我的 Obsidian。我甚至都没完全使用其功能去构建什么工作流,只是用。Apple Notes 和 Memos 这些辅助工具也用,我也没想着去做什么大的整合,一方面做不到,另一方面没必要,「又不是不能用」。 + +> We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. +> —— Donald Knuth + +以及我很喜欢说的一句话: + +> PKM(个人知识管理)的前提,是你有知识。 + +## 接一个 Pre + +我们的实践成果答辩马上就要开始了,需要做个 pre(presentation)。本来这事是支队长的责任,和我关系不大,但是我们其中一个支队长临时有事,于是我接下了这个活(没错,我们同一支队答辩还需要分院系,就是这么抽象)。 + +说实话我比较懒,需要的资料又迟迟拿不到,因此我光明正大地摆烂了。但是老是这么摆也不是事,总不能到时候临场发挥。所幸,今天我们伟大的班级首相(也就是支队长)送来了我们的 PPT(我们用的 PPT 基本一样)。 + +面对又一次推掉这个活的机会(不细说了),我犹豫再三,还是选择了继续做。我简单阅读了 PPT,开始动手写讲稿。没写多久,大概一个小时就写完了。我~~扯皮~~写报告的能力大家还是可以相信的。 + +结果居然得到了老师的认可。 + +![|428](https://img.viento.cc/IMG-20240901191154.avif) + +然后我花了点时间和支队长讨论了下,修改了不少细节。前前后后加起来用了一上午。 + +我外婆喜欢说一句话:「眼是懒蛋子,手是好汉子。」话有点糙,但理不糙。 + +## 喝点什么 + +最近检查出了尿酸偏高和痛风性滑膜炎,算是我的人物特质了,每年夏天随机获得一个病症。因此最近在大规模喝水(这两个词是怎么连起来的?!)。但是喝多了会感觉嘴里没味道,因此想了一个办法,柠檬水。 + +不是蜜雪冰城的柠檬水,就是柠檬,水。 + +![|397](https://img.viento.cc/IMG-20240901185937.avif "拍得很没有美感") + +好喝吗?不好喝,很酸,即使我对酸的耐受力很高,我也不会觉得这种东西好喝,但是就是莫名其妙喝了一杯又一杯。 + +我喜欢各种各样的饮料,尤其是奶茶和果茶。在园子里面,我最喜欢桃李园的元气莓莓,少糖的。可惜这次恐怕是要和它们说再见了。 + +我甚至还有过更加「大逆不道」的想法:我想尝一尝伏特加,战斗民族的饮料。据说斯米诺红牌味道比较好,尤其是兑果汁的时候。但是最终还是放弃了,身体健康之外,我不喜欢和任何烟酒沾边。 + +先说这么多吧。马上我就要开学了,下次写周报的时候,我应该已经回园子里了。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(6):无可热爱.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(6):无可热爱.md new file mode 100644 index 0000000..91d283d --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(6):无可热爱.md @@ -0,0 +1,196 @@ +--- +slug: weekly-6 + +summary: 浮生散记第六期 +series: 岁时录 +tags: + - 周报 + - Zen + - Matrix + - AIGC + +title: Ephemeralis-Weekly(6):无可热爱 +date: 2024-09-15 +description: 本文是作者周报的第六期,以轻松幽默的语气分享了自己对多种主题的思考和体验。首先,作者介绍了Zen Browser这款新浏览器,虽然其界面设计精致、性能较好,但由于bug频繁且仅处于Alpha阶段,作者对其当前表现略有保留。接着,作者描述了用Rust编写的Matrix服务器实现Conduit的部署体验,指出其轻量高效的优点。随后,作者简评了豆包AI的绘画功能,并分享了自己使用AI生成头像的经历。最后,文章逐渐转向深刻的个人反思,讨论了生活中无谓的琐事、理想与现实的冲突,以及意义感的缺失,表达了对时代与个体生活的质疑、困惑与思考。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-6-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。一别旷日,心下甚念。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第六期,日期范围为公历 2024 年 9 月 9 日至 9 月 15 日。祝食用愉快。 + +## Hello,Zen Browser + +如果问我每天使用时间最长的应用程序是什么,那恐怕不是 VSCodium、Obsidian 或者微信,而是浏览器。浏览器是我们通往互联网的桥梁,也是我们与科技巨头的「隐私战争」最激烈的阵地之一。 + +现在浏览器市场的老大毫无疑问是 Chrome,如果我没记错,其市场占有率应该在 60% 以上,Edge、Safari、Firefox 和 Opera 等位居第二梯队。目前这几大浏览器中,唯一开源的是 Mozilla Firefox,这也是几个浏览器中公认对隐私尊重最好的。只不过,虽然 Firefox 是开源的,但是其和东家 Mozilla 也面临着很多非议(这会让人想到一些和 FOSS 意识形态有关的问题,小氯在这方面有一些不成熟的思考,有时间我会详细讲的)。于是,一些基于 Firefox 开发,但是预先做了许多隐私和安全方面处理的第三方分支出现了,我们姑且将之称为 pre-harden 版本。 + +关于 Firefox 的 pre-harden 版本,比较著名的应该是 [LibreWolf](https://librewolf.net)(我很难不怀疑开发者起名的用意)。LibreWolf 很好,但是从某种意义上来讲,有点太好了——它尽心尽力地去除了那些试图窃取我们隐私的虫豸,但是却没有帮我们补齐曾经我们用隐私换取的体验,或者说是补齐得不够。 + +而且,就我个人而言,我对于 LibreWolf 的界面不太满意。作为一个 Arc 重度用户,我对 Arc 精致的设计和交互非常着迷。而要在 LibreWolf 中达到一样的效果,需要费非常大的力气。 + +后来,我在 GitHub 上发现了另一个开源项目:[Zen Browser](https://github.com/zen-browser/desktop),我们可以称其为「禅浏览器」。 + +在[他们的官网](https://zen-browser.app)上,开发者高调地宣称: + +> Zen is the best way to browse the web. + +虽然比不上 Arc 的「改变整个互联网」这么自信,但是这个宣传语也已经够让人眼前一~~黑~~亮了。于是我下载了这个浏览器,并将其作为主力使用了一段时间。 + +那这个浏览器能配得上这个宣传吗? + +**很遗憾,就我目前的体验,暂时还不能。** + +总体而言,Zen 的交互在 Firefox 系浏览器中是相当精致的,甚至可以说是最精致的,没有之一。可以看出开发者的确下了很大的功夫去设计界面交互。就原生侧边栏这一个功能,就是难得可贵的了。其速度和内存占用要好于 Arc,但是没有达到明显优于的级别。在界面设计方面,还存在一些我不是很满意的细节,然而我不会改 Firefox 的 CSS,于是只好干瞪眼;而且,其目前为止还存在很多 bug,例如无法保持许多自定义设置(例如 DNS 保护中的偏好等级,甚至是侧边栏钉住的标签页都无法保留)。 + +那我为什么还是保留了它? + +说出来大家可能不信:这个浏览器,到现在还只是 Alpha 版本,连 Beta 都不是。[^1]这么一说,好像前面的所有 bug 都变得合理了。 + +但是我并不这么认为。作为一个项目,Alpha 版本存在错误可以得到 Fellows 的理解;但是作为一个产品,存在错误可不会得到用户理解。当然,我这么说并不是在对 Zen 吹毛求疵、严以待人,Zen 是一个非常优秀且未来可期的产品,我希望表达的意思是:如果各位老友希望使用 Zen,请注意和明确直至完全理解可能要承担的风险。 + +## Hello,Conduit + +[Conduit](https://conduit.rs) 是一个用 Rust 写的 [Matrix](https://matrix.org) 服务器实现,具有超轻量、高性能等优点。我看了一圈,目前简中圈的相关资料似乎不是特别多。 + +### 部署 + +我们依然使用美好的 Docker。 + +找个你喜欢的目录,创建 `docker-compose.yml`: + +```yaml +# Conduit +version: '3' + +services: + homeserver: + image: matrixconduit/matrix-conduit:latest + restart: unless-stopped + ports: + - 8448:6167 # 左边的端口可以改一个你喜欢的 + volumes: + - ./db:/var/lib/matrix-conduit/ + environment: + CONDUIT_SERVER_NAME: 你的实例域名 + CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/ + CONDUIT_DATABASE_BACKEND: rocksdb + CONDUIT_PORT: 6167 + CONDUIT_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB + CONDUIT_ALLOW_REGISTRATION: 'true' + CONDUIT_ALLOW_FEDERATION: 'true' + CONDUIT_ALLOW_CHECK_FOR_UPDATES: 'true' + CONDUIT_TRUSTED_SERVERS: '["matrix.org"]' # 我们信任的实例,会进行优先通信 + # CONDUIT_MAX_CONCURRENT_REQUESTS: 100 + CONDUIT_ADDRESS: 0.0.0.0 + CONDUIT_CONFIG: '' # Ignore this +volumes: + db: + +``` + +然后直接部署即可: + +```bash +docker-compose up -d +``` + +部署成功后,访问你部署的地址,如果看到一串「Hello from Conduit!」,那么恭喜你部署成功。 + +### 注册 + +由于 Conduit 不带 Web 界面(原本的 `docker-compose.yml` 把这个部分注释了,我直接给删除了),所以我们需要找个 Matrix 的客户端进行注册,比方说 Element 之类的。 + +第一个注册的用户会成为管理员。注册成功后建议把配置文件的 `CONDUIT_ALLOW_REGISTRATION` 改成 `false`,防止有人恶意注册。 + +我目前的 Matrix 就采用自己的私有实例。但是吧,我的虚拟机在校园网内访问经常抽风,造成 Matrix 服务也不大稳定,因此我准备了一个备用账户。 + +我一直想用 Matrix Bot 代替飞书 Webhook,但是我还不会。 + +## Hello,豆包 + +~~你这写的到底是周报还是 Hello 宇宙文集?~~ + +很早就听说过字节家的豆包 AI,但是没用过。这几天翻[木木老师](https://immmmm.com)的博客说说,发现木木老师对豆包的 AI 绘画赞不绝口,于是我打算尝尝鲜。 + +试了一段时间,总体感觉属于还可以的水平,文字问答和 Kimi AI 差不多。其他的功能,像音乐生成和智能搜索我还没试过。 + +不过有一说一,这个 AI 绘画是真的可以。我用祖传的 prompt 去炼了会金,炼出了一些看着蛮不错的照片,其中包括小氯现在的头像。 + +——准确来说,是我头像的原图。 + +简单来说呢,我对头像的制作非常满意(虽然说细节上还有一些瑕疵吧),但是我试着将其换成头像后,远看起来,人物的腿部非常显眼,事实上也的确存在一定面积的裸露(我目测是四分之三长度)。 + +这不算是一个很暴露的比例,但是已经足以让一些较为严格的审查亮出黄牌了。我用凉心云的审核系统检测了一下,果然被警告了。 + +作为一位遵纪守法的独立博主,我不能接受这个事实。于是我花了很大力气,终于为人物加上了合适的衣着,也就是各位老友现在看到的头像。虽然细节处理上并不出色,但是至少可以用了:这个版本是全年龄段适宜的,至少就我国法律而言,不会碰到任何意义上的红线。 + +反正总而言之,豆包 AI 的绘画确实很不错,大家可以试着玩一玩。 + +## 开学 + +~~终于讲点正事了~~ + +从 9 月 9 日开始,小氯就正式开学了。一周下来体验就一个字:累。小氯本学期的专业课非常抽象。尽管第一周的事情很少,但是小氯也已经感受到了令人咋舌的压力。 + +不过幸好,第一周完事就是美好的中秋假期,可以稍稍~~摆会烂~~喘口气。我很难想象,到了期中和期末会是怎样一番勃勃生机万物竞发的盛景。 + +## 无可热爱 + +> [!CAUTION] +> 警告:下面的若干段话相当的幼稚和矫情。各位老友可以先回自己的房间,我会把线上故事打开。这样如果不想听,直接关掉即可。我不希望周报变成另外一场无聊而冗长的会议。 + +当我写下这段话时,我正在开一段非常无聊且冗长的会。台下的每个人看起来都生无可恋,我怀疑台上的实际上也是。 + +我的心情不太好。刚刚收到了 [Physnya](https://physnya.top) 老友的邀请邮件,希望能去新生舞会面基。插句话,Physnya 老友应该是目前离小氯地理位置最近的一位了,平时可能在几百米以内(第二近的可能是[杜老师](https://dusays.com)?)。说实话我还是蛮心动的,除开可以和老友面基外,毕竟当初三字班的新生舞会我还没参加,虽然我腿脚不好且在运动方面毫无天赋,但借着四字班的学弟学妹们的活动感受一下氛围也不错。 + +然而我去不了。我只能在会议上摸摸鱼,抓紧讲话的间隙做一点工作,或者写写代码。 + +当然,经常在会议上摸鱼的朋友都知道,这样的效率不高,甚至极低。于是小氯的情绪变得非常不稳定~~想随机找一位幸运观众进行氧化~~。 + +趁着中场休息的功夫我跑去接了瓶水,然后在外面东倒西歪地走,假装自己可以不太清醒地耍耍酒疯(各位老友应该知道,小氯因为身体原因不能喝酒)。 + +越喝我的情绪越不稳定,到最后内心只剩一个想法: + +> 我到底在这干什么?这不就是在浪费生命吗? + +没错,完完全全就是浪费生命。把本来可以认认真真写代码,或者去和老友畅谈文事共叙旧谊丰富人生体验,或者只是在紫操走一走吹吹风听听歌的时间花在一场结束后不会对我有任何技能价值或情绪价值的会议上,顺便还会导致我今天睡得不好。 + +恕我直言,作为一个学过经济学原理的人,我面对这种效率和公平一点不沾边的行为会感到异常不满。 + +既然都已经不满了,索性让我再多吐槽几句吧。 + +我们的日子到底充斥着多少这样浪费时间的无谓之举?把最好的时光花在不得不做的乱七八糟的琐事或者自我麻痹的短视频上,到头来只留下了无穷无尽的空虚。这样日复一日年复一年,找不到任何可依托的锚点,没有任何喜欢或者追求的事物,到头来就像秦始皇陵地下的兵马俑,只剩下一副干瘪的躯壳,即使摆出笑的造型都不知道有什么可高兴的。 + +我不止一次发出过这样的质疑。一般我用来自我安慰的方式有两种,温和派就是那句曾经激励我的「热爱可抵岁月漫长」,激进派不太喜欢给人留面子,会直接劈头盖脸地斥责你:你的所有空虚、寂寞、伤感、迷茫,归根结底就两个字:闲的。 + +**好,那小氯今天倒是想问一句:我们应该热爱什么?就算我们不闲下来,每天忙忙碌碌过着「充实」的生活,那又是为了什么?** + +千人千面的问题。但是只要我们追问几句,一切看似冠冕堂皇或者热血沸腾的答案都会被审视的大剑劈成苍白无力的自证的碎块。 + +这是一个意义被解构的时代,一切的崇高都可以被从神坛上拉下,被粗暴地揭去其金色的铠甲或长袍。泛娱乐化消解了严肃性,怀疑主义动摇了合理性,而功利主义打碎了理想性。意义一旦被解构,就几乎无法重建,如同破镜不能重圆。我们自然可以用理性去批判其中的不合理之处,但是就像《天下第一楼》中说的,「一个人干,八个人拆」,意义的崩塌可比建构快多了。而怀疑的种子一旦种下,必然会在一个不太远的时间引发一场思想的雪崩。 + +这个问题在高中几乎是不存在的——至少就小氯的人生经历来说。高中是一个极其纯粹的阶段,除了学习几乎不需要接触任何其他事情。这就造成我们的理想主义可以安心地躲在长城之后,免于任何铁骑的冲击。而一切疑问都可以被「考一个好大学」所掩盖,大学生活本身的神秘性也为这种推脱提供了情感上的有力支持。因此,小氯可以一天做上十几张卷而不去想为什么要去做卷,而一句「追逐人类心智的荣耀」就足以让人热血沸腾许久。 + +但是乐园消失了就无法重建,朴素集合论和形式主义系统再令人沉醉也逃不过 Russell 悖论和 Gödel 不完备性定理的恶魔。我们当然可以用下一个大众意义眼中的「人生阶段」作为自己的目标来继续激励自己,例如说保研或者国外升学或者 Offer,但是我们永远逃不开这个意义的终极追问。科幻文学界可以「嘲笑宏大叙事,消解终极追问」,[^2]但是作为个体的我们却无法忽视这个自我幻境之中的阿喀琉斯之踵。至于将自己的目光放近,只是感受生活中的小确幸,抑或守护自己身边的熟悉一隅,这种生活方式「虽然清丽飘逸,但却独欠风骨」。而且我很怀疑,武陵人是否真的能回到桃花源。至于搞钱,似乎只有利欲熏心的资本家才能将其作为人生的终极意义,而且在当下的经济形势,估计这个目标也难以为继。 + +一旦人无可热爱,意义的消解就是生活的破碎。工作变成了苦兮兮的打工,娱乐变成了自我麻痹的无形酒精。人的断片从未消解,而是以另一种形式延续下来,并且正在侵蚀人心的道路上披荆斩棘一往无前。文明精神上的熵增似乎已经不可避免,最后也不知会来一场现实意义的赛博朋克 2077,还是幸存者在辐射的废土上苟延残喘,或者是数据主义的洪流如人曾经洗刷掉动物和神明一般洗刷掉人类,将曾经在进步和吹嘘中飘飘然认为自己可以万世长存的文明如泥石流中的土块般冲散。这么看来,全体人类搬进元宇宙倒可以算是一个相当好的 HE,起码在一段时间内,可以享受一个所谓「质料与原本完全不同,因而问题也不再存在」的世界——不过我并不认为元宇宙里就不用上班,很可能变成二次元人物之后还得打工。 + +说了这么多,感觉对于每一个个体而言,除了被博弈论嘲笑的微乎其微的团结的希望,似乎剩下的唯一选择就是不去思考终极问题,用上文所述的方法去欺骗自己一生。不是说这样不好,这样可以过得相当幸福,甚至可以成为一个伟大的人——通常意义上的,创造出丰富的物质和精神价值。 + +**然而我们必须思考**。 + +我曾经做过一个心理测试,里面有一道题:清醒地痛苦和糊涂地幸福,你选择哪个? + +我当时选择的是前者,我记得。但是现在看来,这根本不是一个能选的问题,因为能够不思考的,估计只有被圈养的动物。 + +--- + +乱七八糟说了一大堆不知所云的话,抱歉污染到各位老友的时间线了。 + +按理说,小氯作为一个在大众意义上被认为是未来的精英群体或者国家栋梁的年轻人的群体的一员,不应该如此「悲观」,但是,很可能正因为看得更多,才会想得更多。当然,更大的可能是只是在没有看清世界全貌时的无病呻吟。我希望是后者。 + +[^1]: 简单科普一下:Alpha 是软件开发的早期版本,相当于「内部测试版本」;而 Beta 可以看作「公测版本」。 + +[^2]: 出自《三体》的序言,不知记得是否准确。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(7):唯有时光.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(7):唯有时光.md new file mode 100644 index 0000000..99724cc --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(7):唯有时光.md @@ -0,0 +1,244 @@ +--- +slug: weekly-7 + +summary: 浮生散记第七期 +series: 岁时录 +tags: + - 周报 + - 博客 + - Swup + +title: Ephemeralis-Weekly(7):唯有时光 +date: 2024-09-28 +description: 本文是作者周报的第七期,主要包括园子的装修工作,如 Swup 的修复、whisper 代码美化、Twikoo 表情链接的调整、解析线路切换等。此外,还探讨了不同语言中对“小氯”这一昵称的翻译,涉及英语、西班牙语、日语、法语、俄语和韩语/朝鲜语等。文章最后分享了对时间和生活感知的哲学思考,提倡通过记录日常小事来增强对时间流逝的感知,强调生活经历对个人记忆和身份的重要性。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-7-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。~~鸽了一期~~的周报再次回归。本期又是一篇蛮矫情且没营养的怪东西,如果吵到您的眼睛了,小氯提前跟您道个歉。红豆泥私密马赛。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第七期,日期范围为公历 2024 年 9 月 23 日至 用愉快。 + +## 园子装修 + +严格来说,园子的装修就从来没停过,就和~~某款开放世界游戏的~~每日任务一样。毕竟小氯是个喜欢好看装修的~~元素娘~~站长。 + +### Swup 修复 + +这个标题不太准确,因为小氯也不知道修复了没有,只是暂时能用了,在各种情景下的鲁棒性没有经过严格测试。 + +就如小氯[曾经说的]({{< relref "解决Swup导致的JavaScript加载失效问题.md" >}}),Swup 本质是是对页面内容的部分替换,因此对于 JavaScript 这种东西的处理并不出色,需要借助比较复杂的 `swup.init` 或者 script plugin 来进行加载,而且还经常出一些令人~~像路易十六一样~~摸不着头脑的问题。 + +这次的问题依然是我们的老朋友,Twikoo。我之前采取了一个非常令人困惑的策略,就是在 `js.html` 和 `comment.html` 中放置两份 `twikoo.min.js` 并且都打上 `data-swup-reload-script` 属性。不知道为什么这个方法能工作,但是就是能用了。 + +但是大家用核外电子也能想到,这样显然会降低性能。于是拦不住的小氯又开始了折腾。 + +首先参考了 Swup 的[官方文档](https://swup.js.org),看到了在 Swup 对象构造时的初始化方法,遂将 Twikoo 初始化放到了其中: + +```js +function initTwikoo() { + if (document.querySelector('#tcomment')) { + twikoo.init({ envId: "{{ .Site.Params.Twikoo.envId }}", el: "#tcomment" }); + } +} + +function init() { + initTwikoo(); +} + +if (document.readyState === "complete") { + init(); +} +else { + document.addEventListener("DOMContentLoaded", () => init()); +} +swup.hooks.on('page:view', () => init()); +``` + +然后自然是必遭严惩,Twikoo 居然消失掉了。经过调试,发现是……Twikoo 对象没定义? + +Twikoo 对象没有定义,说明远程的 Twikoo 脚本没有加载,至少是在 `init` 执行之前没有加载,这是很个邪门的事情,因为我们预先已经在 `js.html` 引入了 Twikoo 脚本。 + +后面的故事极其混乱,我不知道怎么和各位老友描述。简而言之,就是我尝试了各种可能的拼接方案,甚至包括在初始化 Twikoo 之前检查 `typeof twikoo === 'undefined'` 如果未定义就引入这种大聪明方法。 + +最后,心力交瘁之下,我想到了一位大神曾经说的: + +> 99% 的 JavaScript 问题都可以用 `async` 和 `defer` 解决。 + +这俩货我听过,但是由于不会前端,我不太懂这到底是什么意思。问了下 AI,得知二者都是异步加载的脚本。前者在加载后立即执行,后者则等到 HTML 完全加载后才执行。 + +嘶,让我思考一下。`twikoo.min.js` 和 `twikoo.init` 应该都是会直接或者间接操纵 DOM 元素的,尤其是后者,需要依赖于 `#tcomment`。而 Swup 本身也会依赖于 DOM 元素中的属性,那么我加一个 defer 试试看? + +于是把代码改成: + +```html +{{/* js.html */}} + + +{{/* baseof.html */}} +{{ partialCached "head/js.html" . }} + +``` + +奇迹出现了:加载正常了。 + +当然,这种方法也有缺点,一个显著的缺点就是 `comment.html` 和 `extend-comment.html` 失去了其原有的作用,变成了单纯提供 HTML 元素的静态 partial 文件,这样对用户自定义不是很友好,尤其是作为主题发布时。但是我管不了那么多了。 + +### whisper 代码美化 + +这已经是我第 N 次美化 whisper 的代码了。这次简单增加了一些缓存机制,防止不停地请求 API 给人家的服务器带来太大负担;引入了原本就很顺手的 Fancybox 作为图片点击放大的工具;增加了 caption;然后又美化了各种边角细节。 + +代码我放在这里了,为了访问速度,国内的小伙伴请选用杜老师的 Opengist。 + +- `whisper.css`:[GitHub Gists](https://gist.github.com/chlorine3545/40289925b9670f08c51dc6e63f7ca7e8) / [杜老师 Opengist](https://gist.dusays.com/chlorine/94932360c55449a391339a51ea18b01e) +- `whisper.html`:[GitHub Gists](https://gist.github.com/chlorine3545/78f51e8e102b2a102d5166dbdeee5b26) / [杜老师 Opengist](https://gist.dusays.com/chlorine/17330e2e6f2049978c9a91fe0dd65e28) +- `time-fmt.min.js`:[GitHub Gists](https://gist.github.com/chlorine3545/5a17e67e3881fdc02b4a39092a1b3313) / [杜老师 Opengist](https://gist.dusays.com/chlorine/ecdffff0af20474a8eabf81e15671112) + +> [!WARNING] +> 本代码并不是开箱即用的!需要进行以下配置: + +- 在 `hugo.toml` 或者其他配置文件中增加对应变量的配置项(如 `{{ .Site.Params.Whisper.instance }}`),或者如果你不使用 Hugo,请直接替换为值并安全保存。 +- (如果你不使用 Hugo)将 Hugo 风格的 CSS / JavaScript(例如 `{{ .Content | safeCSS }}`)导入改为你需要的格式。 +- (如果你不使用 UnoCSS)将 UnoCSS 类改为对应的普通 CSS 选择器。所幸这里面的 UnoCSS 不太多。 + +### Twikoo 表情链接 + +最近发现评论区的一些表情显示不出来了,右键新标签页打开,原来是图片挂掉了,有可能是因为 Magic Twikoo 的 AliyunOSS 出问题了。 + +目前临时把线路切到了 Gcore jsDelivr,但是之前的链接并不会自动切换。Twikoo 的管理面板不支持修改评论,因此我需要用 MongoDB 的命令行才能修改,难绷。 + +以及,我有点想自己建一条线路,提供一下表情加速的功能,正好手里还有几个免费的 CDN。不知道大家怎么看? + +### 线路切换 + +我的博客一直用的是 [Fgaoxing](https://yt-blog.top) 维护的 Vercel 加速解析线路,综合表现还是比较出色的。不过最近接到了[杜老师](https://dusays.com)的反馈,网站无法访问了。这倒是也不意外,毕竟海外的半墙不墙的服务,无法访问实在是太常见了。 + +目前暂时把线路切到了 [Xingping](https://xingping.cn) 提供的加速解析,先这么用着。实在不行,我就要上 CDN 了。 + +## 不同语言的「小氯」 + +本来是打算单独水一篇文章的,但是真这样的话我实在是良心不安(~~承认吧你就是太懒了~~)。 + +事情的起因其实是我编辑我的 GitHub Profile i18n 的时候,更改了我的中文 profile。然后我在英语和西语方面遇到了一点麻烦。简单来说,我的 profile 里面有一句: + +> 你好,我是 Chlorine。你可以叫我小氯,或者这个名字的任何友好的变体。 + +如果翻译成「Hello, I'm Chlorine ... You can call me Chlorine」,那实在是有点某度(要么是某歌)英语翻译我北的简介的时候的风范了: + +> Peking University, referred to as Peking University + +*注:现在这个问题已经修复* + +那么我们需要仔细思考一下,「小氯」这个昵称的翻译。 + +### 追本溯源 + +我的 ID 其实是「Chlorine」,这个词本意指的就是元素周期表的第 17 号元素,没有什么萌的含义。但是由于这个 ID 的来历是一张可爱的氯元素拟人头像,因此 Chlorine 被我翻译成了小氯,听起来就萌一点了。 + +因此我们需要解决的问题其实是:**如何在不同语言的语境下表达出一个和氯元素相关的、比较萌或者可爱的词汇,而不是如何翻译作为化学名词的氯**。 + +### 英语 + +英语的「小氯」最简单的翻译其实是不翻译,也就是 Xiaolv 或者是 Xiaolü。虽然直接用拼音显得非常狗,但是这也不失为一个好方法,毕竟中华语言博大精深,能准确翻译成英语的才是少数。 + +### 带有日语风格后缀的英语 + +牢日算是萌文化的发源地,因此如果引入一些日语化的后缀,那么翻译就会有味道很多。 + +一个比较典型的翻译是使用中文中一个萌化的变体「小氯酱」。酱(ちゃん)常用于称呼可爱的女孩子,但是并不限于此,比如お兄ちゃん(欧尼酱,也就是「哥哥」,当然这个用法大部分是在动漫中)。所以就我的理解,一般情况下不必太过担心这个称呼带有明显的性别指代(毕竟小氯只是个原子 (≧∇≦)ノ)。回到正题,「酱」在英语中一般使用后缀「chan」,因此翻译为「Chlorinechan」即可。 + +此外,另一个常用的后缀是「nya」,这个后缀常常用于模仿猫叫声,可以理解为「喵」。于是拼接在一起可以得到「Chlorinya」,也是不错的想法。 + +### 西班牙语 + +西语的情况也不算复杂。Chlorine 的西语是「Cloro」,而在西语中,后缀「ito」(阳性)和「ita」(阴性)是用于表达小、可爱含义的最常见后缀,因此可以翻译为「Clorito」或者「Clorita」。 + +不过此处存在一个问题,就是这两个词汇都是存在的。Clorito 的含义是「亚氯酸盐」,而 Clorita 则是「绿泥石」(一种页硅酸盐底下的矿物群)。要是这么玩,那可就一点也不可爱了。 + +因此我最终采取了另一个后缀,就是 in/ina。或者简单点,就写成「Clori」,这样更接近一个人名。 + +### 其他语言 + +由于我几乎完全不了解中文、英语和西语之外的任何语言,因此下面的(基于资料搜集的)观点可能和正确的或者被本族语者普遍接受的用法有所出入,敬请斧正。 + +#### 日语 + +日语的氯叫作「塩素」(えんそ、enso)。如前文所述,牢日算是萌文化的发源地,因此引入一个可爱的后缀是相当自然的想法。例如,「塩素ちゃん」(えんそちゃん、Enso-chan)。 + +#### 法语 + +法语的氯叫作「Chlore」,那么我们可以简单粗暴地将「小氯」翻译为「Petit Chlore」。或者采用常见的表示小或者可爱的后缀「-inou」,翻译为 Chlorinou。 + +#### 俄语 + +俄语的氯叫作「хлор」(khlor)。俄语中表示亲昵的后缀常见的有「-ик」和「-ушка」等,因此可以翻译为Хлорик(Khlarik)或者Хлорушка(Khlorushka)。当然,我觉得 Хлорёнок(Khloryonok)也可以。 + +#### 韩语/朝鲜语 + +韩语和朝鲜语在这个问题上的表现基本上一样,因此我们下面不做区分,统一称为「半岛语」。 + +在半岛语中,氯被称作「염소」(yeomso)。而比较亲昵的后缀的话,可以考虑「야」(-ya),这个词常用于称呼朋友或者晚辈,因此可以翻译为「염소야 」(yeomso-ya)。此外,根据 Grok-2 的建议,也可以翻译为「소염」(so-yeom)。我也不大清楚这么说可不可以。 + +#### 除此之外的语言 + +好吧,小氯承认小氯的语言能力就到这里了 qaq + +## 周报? + +不知道大家听完这一通碎碎念,是否还记得本期的标题:Ephemeralis-Weekly(7)。 + +什么是周报?虽然这是个见仁见智的问题,但是有一点我觉得可以肯定:**你起码得讲讲在这一周发生的事情吧?** + +上面讲的这些自然也是在这一周发生的事情,但是如果我把前面的这些内容放到 Ephemeralis-Weekly(8),或者是第九期、第十期或者是其他的随便哪一期里面,我相信大家并不会感觉有什么违和感。甚至如果这个周报在十年以后还存在,我把前面的内容放进去,看起来也不会有什么大的问题。 + +换句话说:**这些内容几乎是没有时间属性的**,或者说,在大部分人时间感知的层面,其并不具有明显的时间属性。 + +当然,我并不是说这些内容完全和时间无关。除去任何事件都有的客观的时间属性外,如果我们把足够多、时间跨度足够长的事件排列在一起,就可以看出一些时间上的变化。远了不说,如果各位能搞到我中学时期写的文章,和现在小氯的博文摆到一起,就可以非常明显地看出表达方式、语言风格的区别,甚至可以看出一些人生经历的变化。甚至我们还可以兴味使然地分门别类地分析各个时期各个种类的文章的表达区别以及其背后的成因,拿着文学史中为大家们准备的那些方法杀鸡用牛刀地看一看这个园子的气候变化。 + +不过,这是统计学家和文学史家们的工作了,哪有人会为了一个蛮荒之地的小岛主人去如此大费周章呢。而且就算是这样,那你看到的应该也不能算是小氯了,只能算是 `E5B08FE6B0AF`。至少就目前为止,人的形象是无法通过分析的手段进行感知的,不然为什么即使是当代研究鲁迅先生的大师也写不出《回忆鲁迅先生》。 + +扯远了,我们回来。在高中时,我就喜欢说一句话:高中的生活让人失去了时间感。因为周一到周日,都是上课和自习,或者还有考试,特殊的月末假呢,也是每个月一次。如此的循环往复,每天或者每周期的工作大体都是一样的。有人会问,那每天干的活不是不一样吗?你说得对,但是至少就我而言,现在的我完全无法分辨出做湖南四校的第 X 次联考模拟卷的那天和做东北三省四校联考的那天到底有什么不一样。 + +网络的发达,解构了空间上的「附近」,而对生活感知主动或者被动的放弃,解构了时间上的「最近」。所以有一句老话「日子经不起混」。混日子时,你对时间的感知实际上是原地踏步的,今天和明天、后天都一样,因此在你意识到之前,许久就已经过去了。在 Rime 中,我们只需要打出 `dt` 就可以方便地打出一个时间戳,但是我们的时间却变成了用毛玻璃包裹的方盒子,里面的东西似乎影影绰绰地不一样,却再也让人没有了打开的兴趣。 + +那么我们还剩下什么?或者提一个更严峻的问题,我们的生活何以成为生活,又何以成为自己的生活? + +答案其实不难想:就是经历,我们能够感知到并且记住的经历。相对论告诉我们,任何事件都是四维时空中的一个点,它和时间本就分不开;而没有任何事件的时空,本身也没有任何存在的必要了。[^1] + +模糊的、一段时间的气氛化的感知,或者是脉冲式的、一个被我们记住的事件,共同构成了我们过去的回忆。 + +还是拿我的高中说吧,我虽然分不清高中的每一天,但是我能记得,我第一次考联考第一,是在高一上学期刚开学不久,大概是十月份;我第一次下决心「我要学化学」,是在高一的期中考试之后;在疫情期间,火锅吃得比较多,每天都起来做核酸检测,每天下课都会统一做锻炼,有一段时间的精神状态极差,会给不存在的人写信;第一次手术是在高二升高三的暑假;高三下学期的居家学习做了成堆成堆的卷…… + +所以,如果想多感知到、多记住一些东西,那么也只好让自己的生活更加鲜亮一些,以及用某种方式记录下,有哪些只发生在最近或者当下的事情,比如说,这周做了第一个 PA,学会了一种船新的算法;最近去了一个讲座,听了某某大佬讲了什么内容,本来自己也知道这个东西,但是大佬却能讲出新高度;马上要放假了,打算出去看看;第一次点了某家麻辣烫的外卖,味道做得还不错,但是包装有点差;这周不太想写东西,看了不少自己以前喜欢的电影……说到底,其实都是或大或小的经历,能帮助我们标识出,这段时间与其他的时间到底有什么不同,到底值得我们记住什么。 + +小氯以后写周报,也会试着改变一些,多加一些这样的内容。这样或许才更像是对自己所浪费的这一周生命的记录。 + +**毕竟,当世界走到尽头,我们朽坏的精神剩下的,唯有时光。** + +[^1]: 广相的「事件」和我们探讨的「事件」并不完全一样,这里并不是严谨的物理学讨论。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(8):七日漫谈.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(8):七日漫谈.md new file mode 100644 index 0000000..4f2f030 --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(8):七日漫谈.md @@ -0,0 +1,249 @@ +--- +slug: weekly-8 +summary: 浮生散记第八期 +series: 岁时录 +tags: + - 周报 + - 去中心化 + - Artalk + - 日常 + - RSS + +title: Ephemeralis-Weekly(8):七日漫谈 +date: 2024-10-06 +description: 本文是作者周报的第八期,涵盖了从日常生活琐事到技术尝试,再到哲学思考的广泛内容。文章从图书馆体验、意外受伤、回家旅程等琐事开始,展现了作者的日常状态。作者还分享了对旧衣物的独特情感,体现出对时间和记忆的深层思考。在技术领域,作者尝试了 Artalk 评论系统,对其功能和用户体验进行了详细评估,并与现有的 Twikoo 进行了比较。此外,作者还体验了 Follow 这一新兴的RSS阅读工具,分析了其对信息获取习惯的影响。社交方面,作者收到了中文博客圈的邀请,在喜悦之余也引发了对社交活动的复杂情绪;同时从一段家庭闲聊开始,表达了对家庭支持的感激之情。文章的最后,作者从「是否能构建一个非中心化的 Pixiv」开始,深入探讨了非中心化时代的社区基本准则,探讨了自由、隐私和必要监管之间的平衡等话题,展现了其对社区治理和运行模式的深刻思考。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-8-cover.webp +draft: false +wikilinks: true +--- + +各位老友们好,我是 Chlorine。新的一期周报,双手奉上。 + +一如小氯[[Ephemeralis-Weekly(7):唯有时光|之前所说的]],感觉写周报应该更多地写一写这一周「自己的感知和经历」,本期算是一个小小的初探吧。因此本期的内容较为琐碎和冗长,~~主打一个低质高量~~,我甚至都找不出一个合适的标题,只能(从形式上)仿造薄伽丘的《十日谈》(甚至 「七日漫谈」这个名字都可以当作周报名称了,太宽泛了)。当然,副标题并不一定要是四个字,只是前面碰巧都是而已。 + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第八期,日期范围为公历 2024 年 9 月 30 日至 10 月 6 日。祝食用愉快。 + +## 东馆初探 + +事情是这样的,在放假的前两天,我早上起来后去了三教自习。至于为什么去,和以往的理由不大一样,因为我寝室的水喝完了,我又不想再订一桶(马上国庆节放假了,订一桶喝不完,回来就不能喝了),于是准备去三教蹭免费饮水机(你可真是个小机灵鬼)。 + +然后学到大概九点半……抬头一看,嚯,教室里来了个老师,再一看课件,嚯,离散数学,图论。得,咱还是润吧。 + +然后……在这个时间点出去,会遇到什么大家应该都知道。 + +于是我打算暂时避一避,等到人少些再往回润,正好旁边就是东馆,好,就你了。小氯平时的活动范围小得可怜,图书馆只去过北馆。也算是新的体验了。 + +东馆和北馆不大一样,里面的设施相对北馆有一点陈旧,或者说是陈旧的感觉。以及,我居然发现,里面有一些座位,配备了显示器……显示器……显示器…… + +总体而言,我还是更喜欢北馆。可能是因为我更熟悉吧,就像是为什么最开始我觉得 C++ 怎么都不得劲,现在却感觉 C++ 的语法很舒服一样。 + +## 受伤 + +如各位所见,小氯有一个人物特质:每个夏天都会收获一种伤病。但是我实在是没想到,这个特质还可以在秋天发挥作用。 + +简单来说呢,就是……在放假的前一天,我骑着车子去上马原,结果前面的外卖小哥突然刹车了。我紧急刹车,然后我就……华丽地侧翻了。 + +很奇怪的是,我翻倒时心里没有任何波澜,最先冒出来的想法居然是……我记得外卖平台都有很严格的时间限制,我是不是耽误他们工作了? + +外卖小哥明显也很懵,于是我告诉他:要不你先去送外卖吧,一会能过来扶我下就好。小哥连忙表示他的目的地就在前面,没关系的。于是我在地上坐了会,感觉恢复一点力气了,就在外卖小哥的帮助下站了起来。 + +我当时仔细感受了下,腿基本没事,右胳膊基本没事,但是左胳膊没有力气了。试着活动几下,还可以活动。因此我判断,我应该没什么大事,就让外卖小哥先走了,自己去上马原。 + +原本我是打算在马原休息时跟老师请个假,去校医院看看的,很不幸,可能因为这是国庆节前最后一节马原,因此老师没有设置休息。这让小氯的心情不太稳定。 + +下课之后赶紧去校医院挂急诊。经过一次照相、一次 CT 后,医生得出结论:骨头没事,有可能有韧带和肌肉损伤,于是开了些药就让我回去了。 + +然后小氯也没什么办法,只能是吃点药,在疼痛的地方喷一些云南白药,然后贴膏药。然后小氯就进入了单手打字的痛苦时光 TvT。 + +## 长路归乡 + +感谢 Kaiserreich 对本节的标题启发(Doge)。 + +简单来说就是,我[光荣而伟大的孙哥](https://clf3.org)帮我抢到了回家的火车票,于是我们一起踏上了回家的旅途。 + +具体过程我觉得各位应该不会有太大兴趣,毕竟一个无系的垃圾佬折腾达人和半个贵系的划水小白 FOSS 主义者碰到一起,能谈什么大家应该大致是有数的。我们只讲点有趣的事吧。 + +- 我忘记带午饭了,达成了早午饭都没吃的成就。 +- 半路我的水杯滚到座位下了,然而我们没找到,直到临下车。 +- 关于运动手表的对话 + - 小氯:您的运动主页的数据是从哪里获取的? + - 孙哥:从运动手表里(叫什么品牌小氯忘记了),可以直接从这个品牌那里获取到运动数据。 + - 小氯:那这个手表开源吗?(`眼神清澈的小氯酱.avif`) + - 孙哥:……鉴定为开源开魔怔了。 +- 骗孙哥一起看了一部我电脑里面祖传的老电影,卓别林的一部经典作品。 + +然后大概是晚上五六点吧,到了我们市的车站,再坐一班车就回到我们县啦。话说在我们县的出站口,有一个学弟拉着我合影来着 hhh。 + +## 旧衣 + +小氯一向不喜欢买衣服。一方面来说,我一向对这方面的事极其倦怠,更别提反反复复试衣服或者从许多件衣服中挑选一件所谓「最好看的」会给我带来多大的心智负担。而且,小氯无论是在二次元还是三次元长得都比较「衣服架子」——That is,穿什么都至少不会显得难看。 + +所以说,当我中午在外婆家蹭完饭,昏昏欲睡却被父母拉去试衣服时,我内心是一百个不愿意的。但是他们表示,已经到秋天了,我在学校的衣服似乎有些缺,所以还是添几件衣服好。 + +但是说实话,我并不是很认同。在我眼里,一件衣服除非大小已经不合适或者发生了重大损坏,否则我至少要穿三年——这一方面是因为我平时比较节俭(习惯和认同,再加上的确没有大手大脚的条件),另一方面是因为我比较懒,不想总是换衣服。此外,我在某种程度上的确喜欢旧衣服。 + +倒不是因为说,旧衣服能体现我对审美的独特看法而不是被流行文化所裹挟(出自[这里](https://lillianwho.com/posts/week-summary-2023-38/))——我说了,我不挑衣服,只是说我喜欢和以前一样。 + +我们看过去,总归是带着一层暖化的光晕的。如狄更斯所言的:「我们总是在离开一个地方后开始原谅它。」现在我看我的高中时代,我时常会忘记过去对那些令人无语的规定的吐槽和卧床期间极度的痛苦,而只记起来朋友递来的口香糖,下晚自习的清冽的风,令人捧腹不止的课堂,和在无数次联考中大杀四方的光辉岁月。 + +所以,还是换一件旧衣服吧,在楼层的公共洗衣机倒进足够的馨香剂和檀木味的衣物消毒液,再在阳光下晾干,刮掉表面粘上的白色绒毛。一年过去了,但是我们仍能想起来去年的这个时候,我们走在哪条道路上,忙于白昼生于午夜时心里在想着什么。 + +## Say Hello To Artalk + +本节的标题不是《Hello,Artalk》,因为我现在还没切过去。 + +[Artalk](https://artalk.js.org),鼎鼎大名的博客评论系统,也是在我眼里唯一能和 Twikoo 分庭抗礼的存在(Waline 也不错,但是 LeanCloud 似乎并不是什么互联网善人)。我的许多老友,譬如 [klcdm](https://koxiuqiu.cn) 和[杜老师](https://dusays.com),都在使用 Artalk。 + +但是我还在坚持使用 Twikoo,目前的理由大概是: + +- Twikoo 我从就建站开始用了,有惯性。 +- Artalk 需要服务器部署,但是我的虚拟机的连接在校园网内实在是太过优秀,我不想每次自己看评论都看不到(~~然而你是不是忘了你还有一台套路云的服务器~~)。 +- Twikoo 本身的功能以及 MongoDB、Netlify 的免费额度暂时够我用了(目前 MongoDB 的免费额度是 512 M,大概是够我存数十万条评论的)。 + +但是在我希望修改一些数据,但是我只能通过 MongoDB Atlas 进行简单的修改,逼着我去现学了 MongoDB Python SDK 的使用方法后,以及在看到[晚夜老友](https://www.iczrx.cn/archives/119/)的文章后,我又一次开始考虑 Artalk。 + +Artalk 本身的部署非常容易,写一个配置文件,docker-compose 一跑,反代一代就完事。Artalk 可选的配置项非常多,我折腾了很久,终于把飞书推送、邮件通知和注册都配好了。很可惜,我一直没有配好 Redis 缓存,不知道怎么回事。 + +下一步是在 Hugo 中整合 Artalk。按说这非常简单,但是由于万恶的 Swup 的 JavaScript 加载问题,我遇到了大量适配困难。一个很重要的问题是:Artalk 的 `init` 函数是页面特异的,因此 `swup.hooks.on` 方法是不能用的(不然会加载上一个页面的评论)。所以只能用回老方法,就是 `data-swup-reload-script`。不过好在,可算是加载出来了。 + +此外,Artalk 的亮暗模式是按照系统来的,但是我的博客不是。好在经过反复观察,我发现对于我的 Hugo 博客,其只由父容器 `Comment` 中的一个 `atk-dark-mode` 类控制。因此可以在初始化博客亮暗模式,点击切换时和 Artalk 容器填充时进行一个 class 的 add / remove。 + +——要是真这么简单就好了。 + +我本来的想法是在 `Artalk.init` 执行中加入一个 `onReady` 回调,在回调函数中封装一个控制 `atk-dark-mode` 类的 IIFE,但是不知道为什么,这个 IIFE 一直不执行,有可能是 `Artalk.init` 根本没有回调选项。观察者更别提了,用不了一点。目前我采用的是非常笨的办法,就是 `setTimeout`。坏处是会造成闪烁,但是我也没有更好的方案了。这就是 Swup,丝滑,优雅,但繁琐,就像是维多利亚时代贵族们华丽的晚礼服。 + +不过目前为止,Artalk 应该已经是一个生产可用的状态了。不过我目前依然将其存在一个分支中,站点还是使用 Twikoo。如果有一天我下决心切换,会以显性的方式通知所有曾到访园子的老友,尽快进行账号激活。 + +## Hello,Follow + +[Follow](https://follow.is) 应该是最近博客圈非常热门的话题了。来自两位巨佬 [Innei](https://innei.in) 和 [DIYGod](https://diygod.cc) 的作品,号称「下一代信息浏览系统」,简单粗暴地理解的话,可以看作一个 ProMax 版本的 RSS 阅读器。但是 Follow 不止于此,其还创新性地加入了轻社交、原生 RssHub 支持等功能。 + +Follow 目前还处于 Alpha 阶段,需要邀请码才能使用。小氯虽然也十分心痒,但奈何没有合适的渠道,也不好意思直接和几位开发者讨要邀请码,因此只好施展战略定力。不料有一天晚上,小氯在闲来无事刷联邦时,发现所在实例 [Owu Social](https://scg.owu.one) 的另一位活跃用户 [@CDN18](https://scg.owu.one/@icarus) 表示可以送出一个邀请码。于是小氯立即与 CDN18 老友取得了联系,并最终获得了一个邀请码。此处向 CDN18 老友致以真诚的感谢。 + +现在距离我开始使用 Follow 也有几天了,先说说体验吧。首先是界面,虽然 Follow 是一个(对我来说算是 sore point 的)Electron 应用,但是其界面的精致和原生、交互的丝滑和流畅还是让我有种我在使用一个 SwiftUI 标杆作品的错觉,即使是我为了性能把动效减少到最少也是如此。至于 RSS 阅读体验,那没的说,尤其是对媒体文件的处理。用 [Pseudoyu](https://www.pseudoyu.com/zh/2024/08/05/weekly_review_20240805/) 的话来说,「有一种看久了 pure html 突然飞跃到加了现代化 css 效果的感觉」。 + +但是我只是将《Hello,Follow》作为这篇长长的周报(周记)的一个都算不上长的段落,而不是像许多博友那样单独写一篇文章,谈谈其对我的信息获取有什么颠覆性改变,因为**就目前来看,确实没有**。 + +我目前的感觉是:**对 RSS 和信息聚合越依赖的人,Follow 对其的价值就越大**。小氯目前只能算个 RSS 业余用户(~~这从我到现在都没攒够能生成一个邀请码的能量就可见一斑~~),信息的获取(注意不是信息的浏览)渠道更加偏向于静态内容(例如已经完结的教程,成套的视频教程,纸质书)而非是随着时间增补和替换的动态内容,少数的动态内容,例如一些博主的更新、Bilibili 的动态等(我不看 Twitter 和 TG Channel,谢谢),我也并没有一定要放到一个聚合来源的刚需,虽然说这样似乎的确更加高效;至于将其作为一个纯净化阅读器或者是更新通知工具,在我看来就像使用 Memos 作为说说一样——不是不行,甚至可以做得很好,问题是这本来就不是做这个的东西。而且,我目前获取的信息来源几乎都没有什么无法去除的顽固干扰物,即使是 Bilibili 令人眼花缭乱的弹幕,也可以直接关掉。 + +综上所述,Follow 是一个非常强有力的工具,但是我现在只是将其重器轻用,轻用到我自己都怀疑是不是太轻了,以至于浪费了一枚宝贵的邀请码。或许日后我会发现 Follow 对我更多的价值,但是——那是日后了。 + +事实上,在我看来,Follow 和其背后的 RSSHub 就像是一种多信息源到用户之间的 adapter,将各种信息源都变为 RSS XML 格式返回给用户,来提供一个聚合的阅读体验。其实也不一定要是 XML,任何能够承载足够丰富信息、能够便捷地解析和交换的格式都可以,只是历史原因让我们选择了 XML 而已。 + +## 加入「中文博客圈」 + +今早意外收到了一封邮件(~~快说谢谢飞书~~),来自于[印记](https://yinji.org)的站长——青山。 + +![|693](https://img.viento.cc/IMG-20241005140534.avif) + +我对这个群也略有耳闻,其中有很多优秀的站长。能接到这份邀请,我有些受宠若惊。因为园子建立到现在起其实也不到一年,总的文章数(截至我敲这行字)也不过才 53 篇,即使是计算上那些在不断的迁移过程中有意无意地丢失的文章,应该也才七八十篇的样子。这可能也算是对园子的一种认可吧。 + +但是,就我第一反应的情感体验而言,我其实略微有一点犹豫。这当然和中文博客圈无关,而是应该归因于我的性格,总体而言我算是个 I 人,虽然在与人(无论是熟人还是陌生人)约饭或者进行别的什么社交活动时看起来都是落落大方侃侃而谈,在 Pre、小组讨论这样的场面下也常常是一个 ice-breaker,似乎显得非常长于社交,但实际上我的社交热情只能止于被动社交,熟人社交,以及 P2P 的社交。一旦面对群体性、主动性的社交,即使都是熟人,我也会感到有些不适。 + +我并不觉得这是什么需要改正的缺点,社会本就应该容得下性格开朗喜欢外向和性格内敛喜欢独处的人以及它们的一系列中间性状,而不是强迫所有人都顶着笑容灿烂而虚伪的橡皮面具,明明如坐针毡却还要笨拙矫造地热情得体。就像是我们常说的理想主义,这是所有最优秀的高等教育都一以贯之的思想血脉和精神基座,本就应当足够作为推动人上行而不是防止人下行的力量。如果这种精神在任何情况下都被无差别指责为「涉世未深」或者别的贬义词汇,那么应该反思的是发出指责的人——或者用一句火药味更浓的话,应该反思的不是我们,是你们。 + +扯远了,回来。最终我当然接受了邀请,毕竟这除了是一种认可,也是不可多得的学习和交流机会,就像是开发者大会或者经常会有的 Workshop 一样。以及上面的话只是我顺着自己思维的跳跃轨迹的一些想法,希望各位不要有什么误解。 + +## 原生家庭 + +在从奶奶家回家的路上,我和父母聊天。我娘开玩笑地说,现在只想找一个活不多、存在感低的单位去上班,躺平算了。 + +我不禁有些好笑:「为什么我感觉,好像我上大学之后,你的人生价值就已经实现了,这辈子就已经完满了一样。」 + +谁知我娘非常严肃地说,她确实是这么想的。现在出门,如果她自我介绍说她是 XXX,几乎不会有人知道,但是如果说是我的妈妈,(至少是在我家乡的小城的范围内)都会受人青眼。 + +我问:「现在很多父母都不希望这样,说是感觉这样自己这辈子就只剩下父母一个身份了,全部的价值都在孩子身上,就没有自我了。」 + +二老意见异常一致:他们不那么认为。然后我娘就开始反反复复地强调她有多么为我骄傲,但是我不要有太大压力,只要做好自己、健康快乐就好了。 + +一直没插上话的我爹说,他倒并不是因为我的高考发挥得不错就如何如何,但是他感觉,自己所有的遗憾我都为他弥补了。他当年没有考上重点高中,我考上了;他当年高考发挥失常,而我考得非常好。 + +我们三个哈哈大笑。 + +笑完之后,我们继续开车回家。我突然想到一个词:原生家庭。原生家庭(大概是指一个人出生和成长的最初家庭环境)这个词在近几年非常流行,似乎很多现象和问题都可以归因于原生家庭(事实也至少有一部分是这样)。 + +小氯自认为,小氯的原生家庭非常非常幸福美满。家庭结构相对简单,家族内的关系和谐,没有什么坑人的亲戚;虽然说几代人之间有过一些不和,但是都慢慢走向了互相理解;父母虽然偶有争吵,但是都能好好过日子;父母都极其开明,同时对我的成长都颇为上心;家境虽然远远不算殷实,但是至少没有到缺衣少食的地步。小氯不知道小氯给家庭带来了什么,但是所谓的「原生家庭阴影」,在小氯身上几乎完全不见踪影。 + +感谢我的家庭,他们把我养得很好,给了我情感上坚实的依靠。我爱他们。 + +## 我是一个过渡 + +> [!WARNING] +> 在开始我们下面的论述之前,有必要叠个甲:**以下的所有讨论都无意涉及任何的政治性或者有争议的话题,也不是对任何已有政策或者是特定实体的评论。** 还请各位抱着开放、包容的态度参与讨论。另外如果茶和饼干见底了,请前往公共空间自取。 + +## 一个外行眼中的非中心化时代的基本准则 + +很长的标题,不是吗? + +事情的起因是这样的:我在听 B 站的日推时,发现了一张非常好看的图片(我觉得上面的人物应该是初音未来?)。然后我试图搜索这张图的原图,然后我就来到了 Pixiv。众所周知,在好看的插画方面,Pixiv 应该是最丰富的。 + +然后我突然想到了一个问题:**Pixiv 有非中心化的版本吗?** + +容我解释一下这个问题:是否存在一个类似 Pixiv 的插画分享社区,但其具有自由、去中心化(或者是联邦化)的特征,一如 Mastodon 对 Twitter?[^1] + +这个问题乍一看很无厘头,就像孙哥上面调侃我的那样「开源开魔怔了」。但是作为一个坚定的 FOSS 主义者以及 Non-Centralized Architecture 的喜爱者(但是,从技术上来说,我是绝对的外行),我在评估任何产品时都会思考其是否能有这样的替代品。 + +然后我就开始动手查阅资料。很遗憾,答案是还没有。但是确实存在一些类似的平台,比如基于 Mastodon 的 [Pawoo](https://pawoo.net)。 + +> Pawoo(パウー)は The Social Coop Limited が運営するMastodonのインスタンス(サーバー)です。 「創作活動や自由なコミュニケーションを楽しめる場」として、どなたにも幅広く使っていただけます。 + +机翻后的版本: + +> Pawoo 是由 The Social Coop Limited 运营的一个 Mastodon 实例(服务器)。每个人都可以将其作为「享受创意活动和自由交流的场所」。 + +但是从技术上来说,有 Mastodon 为代表的 ActivityPub、LBRY、Matrix 等优秀的非中心化社区珠玉在前,写一个这样的去中心化(或者联邦化)的平台在技术上并不是不可完成的。在我看来,可能需要认真考虑的就是两件事:海量图片的存储以及约稿的支付事宜。前者可以借助 AVIF 等高效格式和 IPFS 等去中心化存储系统,后者则可以从 Steemit 等已有的社区中获取灵感。毕竟,都用非中心化插画社区了,应该也不会排斥收取一些去中心化代币作为约稿的报酬吧。 + +我为我的这个想法小小地兴奋了一会儿,仿佛能看到一个崭新的、美好的社区在非中心化时代的黎明如日之升,以及将来我在这样一个社区兴味盎然地寻找自己喜爱的插画的场景。 + +然而我并没有兴奋多久,因为我想到了一个严肃的问题。由于小氯思维的极度跳脱,我无法条理清晰地梳理我到底是如何联想到这个问题的,只记得思维链不短。简单来说,我想到的问题就是 R-18 图片的问题。R-18 或许还能说是在某种程度上可以接受的,但是如果比这更加……嗯,不适宜公共展示的图片呢?在现有的机制下,这类图片并没有很大的机会出现,但是如果是在一个更加自由的非中心化社区呢?这是我们想要的结果吗? + +我们来把问题聊得更深入一些:**一个理想的非中心化社区,应当具有怎样的基本准则?** 或者把问题提得更大些:**如果我们将其作为一个可行并可以讨论的背景,那么非中心化时代的基本准则是什么?** + +### 自由、隐私中心 + +这两点几乎不需要论述,所以请允许我略过它们(~~承认吧你就是太懒不想写了~~)。 + +### 社区治理 + +这个词让我想了很久,最终才勉强挑出了一个能够比较完全地概括非中心化社区的理想运作模式、同时还不会涉及一些不必要的联想的词汇,虽然说这个词可能也不算是那么恰当——「治理」(Governance)这个词,似乎本身就带有一些「自上而下」或者「中心决策」的意味。不过如果我们一定要问个究竟,其词源应该是希腊语 κυβερνάω,意思是驾驶。也就是说,「治理」实际上是通过某些方式控制社区运行的过程,那还不如叫「运作」。 + +扯远了,回来。一个较为理想的非中心化社区,其运行和治理模式应该具有如下特点: + +- 非中心化:不会存在一个人或者一小群人作为一些重大决策或者是大部分决策的核心而其他人不能或者很难对结果产生实质性影响。这是句废话,要不然这个社区为什么叫非中心。 +- 透明决策:一切可能具有社区性的决策都需要将其过程公开,使得任何社区成员都能进行查阅和了解。 +- 社群参与:每一个社区成员都应该有参与社区运作的权利,同时也应该承担社区运行的义务。 + +毫无疑问,最后一点最难以理解,也最模糊。在我的理解中,这包括了社区运行本身的群策群力,社区成员对社区本身以及社区其他成员的尊重等。还是拿上面的类 Pixiv 社区来举例子,对于插画社区不可避免的版权问题,这其实也可以作为这条原则的一部分,也就是对其他成员权利的尊重。虽然开源和宽松的分享协议当然是被提倡的,但是至少就目前我们的认识,谁也没有权力强迫插画师这么做。如果插画师并不希望自己的作品被太过随意地使用,我们也应该尊重。 + +### 最小化但必要的监管 + +这是我希望重点论述的部分。注意,以下我可能会把「监管」和「监管基于的规则」混为一谈,因为对于在可行性层面上非刚性的规则(也就是社会学意义上的规则)而言,没有监管就意味着规则在实践层面毫无意义。 + +「抗监管」一直是非中心化系统一个非常大的卖点。因为没有单一的或者少数几个的中心节点,再加之非中心化社区在许多条件下的匿名性,因此对其进行监管的难度相当大。同时,可能是一种基于技术的思想风潮(或者有可能是反过来,我们探讨的东西就是一种由思想风潮衍生出的技术),许多人都主张应该建立一个「无监管化」的社区。在某些情况下,这几乎成了一种「意识形态」,乃至是一种极端化的、门电路一般无可迂回的判断——只要你有监管,你的社区就是有问题的,甚至你就不配做 Web3(请允许我不透露这条言论的来源)。 + +我们不去评价这样的言论的对错,我们希望探讨的是:**「无监管化」真的可能吗?** + +从技术上,(在不出重大问题的前提下)确实可以做到无监管——或者至少是一个极大的近似,因此我们探讨的实际上是无监管化作为一个技术 - 社会复合体是否是合适的。 + +「合适」,这本就是一个模糊的词汇。就像是吃猪肉,在一个没有特定忌讳和宗教信仰的普通人眼中并不是什么事,但是在一个穆斯林眼中却是非常冒犯的行为。在探讨这类问题时,我们只能按照周总理的「求同存异」方针,尽可能地寻找一个最大公约数,也就是说,能不能保证不违反(社会学意义的)人类最基本的行为底线。 + +**很遗憾,就我目前的观点以及目前能够获得的实践证据,「无监管」尽管听起来非常「自由」,但是其做不到「合适」。** 不需要过多论证,一个基本的事实是:几乎所有人都做不到「君子慎独」,甚至许多人在有监管的前提下都敢于践踏人类的底线。那么在一个无监管的环境下,即使这个环境还不足以构成最有力的现实投射,也足以向我们展示人性可能的最黑暗的一面。「人们哭喊自由,说的其实是放纵。」不管是 Silk Road,AlphaBay,WannaCry 还是难以计数的「涉及未成年人的不适宜内容」(我实在说不出口那个令人难以接受的词汇),都已经用一种我们并不愿意看到的方式向我们反复强调了一个堪称颠扑不破的真理:**在进行任何技术实践时,都应以最坏的恶意度测人心。** + +如果这样的案例只是少数,或许还可以说「不应该因噎废食」;但是如果这样的案例已经达到了这个规模、数目和严重程度,那么对于项目有责任的主理人和社区成员就必须作一些反思和改变了。 + +我的观点可以概括为一句话:**最小化但必要的监管**,也即保留必要的社区准则和监管,同时保证个人的自由和隐私以及基本准则的稳定。这当然不是什么容易做到的事情,无论是技术上还是非技术层面,做到「适当」的难度几乎相当于掷飞镖时将飞镖投到靶的绝对几何中心。但是我们必须试着做,因为我们想要一个自由、开放、公正又有秩序的社区,而不是一个严酷的电幕地狱或者一座燃烧的混乱之城。 + +最后,有一句话,送给那些极端自由主义者们: + +> In no system that could be rationally defended would the state just do nothing. +> +> ——F.A.Hayek + +--- + +兜兜转转写了这么多,感觉有些疲惫。尽管我已经尽力避免一切可能引起争议的名词和话题了,但还是不知道我的话是否足够中性。 + +最后,还是祝愿各位老友,都能享受「天放而不失其常」的良好而合理的自由。 + +[^1]: 一如下文所体现的那样,「去中心化」(Decentralization,其实一般指的是分布式)和「联邦化」(Federation)实际上是两个(甚至完全不同的)概念,虽然它们经常被(不正确地)混用。所以我们此处使用「非中心化时代」(Era of Non-Centralization)而不是更常见的「去中心化时代」(Era of Decentralization)。 diff --git a/content/posts/人间世/岁时录/Ephemeralis-Weekly(9):寒露清秋.md b/content/posts/人间世/岁时录/Ephemeralis-Weekly(9):寒露清秋.md new file mode 100644 index 0000000..832fe5d --- /dev/null +++ b/content/posts/人间世/岁时录/Ephemeralis-Weekly(9):寒露清秋.md @@ -0,0 +1,273 @@ +--- +slug: weekly-9 + +summary: 浮生散记第九期 +series: 岁时录 +tags: + - 周报 + - 博客 + - 日常 + +title: Ephemeralis-Weekly(9):寒露清秋 +date: 2024-10-13 +description: 本文是作者周报的第九期。文章开篇讲述了作者回京的曲折经历,突显了生活中的不可预见性。接着,作者描述了秋季的凉意,表现了对季节变迁的细腻感受。在健康问题上,作者求助于中医,分享了痛苦的喝药经历。同时讲述了自己周末生病和写论文的经历,并提出了战损反而能提高自己学习效率的有趣观点。作者还分享了博客 300 天的感受,讲述了通过沟通解冻 X 账号的经历,同时反思了自己中文写作时的奇特表达,认为这是一种有趣的文化融合现象。随后作者回答了独立博客自省问卷 15 题,表现了对博客运营的总结思考。最后作者表示本期没有哲学思考,因为自己关于 Obsidian 和开源的随笔还在书写中。 +categories: ["人间世"] +featuredImage: https://img.viento.cc/cover/weekly-9-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。新的一期周报,双手奉上。 + +本期和[上一期]({{< relref "Ephemeralis-Weekly(8):七日漫谈.md" >}})一样,都是以本周碎碎念为主,主打低质高量。~~我甚至在想这种碎碎念合集要不干脆拆成日记得了~~。 + +本期的标题没有任何特殊含义,单纯是一个时令的标记。也希望各位老友不要误以为下面的文章有什么诗意。OωO + +本文为园子周报——Ephemeralis Weekly(浮生散记)的第九期,日期范围为西历 2024 年 10 月 7 日至 10 月 13 日。祝食用愉快。 + +## 回京之旅 + +小氯记得,在回家的路上和孙哥聊天时,有这么一段对话: + +- 小氯:您打算几号回来啊? +- 孙哥:5 号,我票已经买好了。你呢? +- 小氯:我还没定好呢。 +- 孙哥:?你还没买返程票就敢回来? +- 小氯:是的捏。(`眼神清澈的小氯酱.avif`) +- 孙哥:……你是真的勇。 + +我原本没把这件事放在心上,直到我发现我买不到回去的票了。候补了将近十张,但是毫无结果。无奈之下只好先买了一程近站票,希望能补票到终点站。 + +然后我从广播得知,由于列车运行压力实在是太大,暂时不能补票了。 + +喵的。 + +不死心的小氯去找了列车长。列车长倒是没有把小氯从车上扔下去玩星穹铁道,而是非常严肃地表示,如果能接受没有座位并且时时刻刻搬来搬去,可以留在车上,临近时大概率是可以补到票的。 + +最后小氯选择了留在车上。很幸运,最后补到票了(小氯当然不会违法乘车 awa)。只不过过程极其曲折。~~然而丝毫没有影响小氯的心情,小氯甚至最后从地铁站骑自行车几公里回了学校~~。 + +## 秋凉 + +周二是寒露,二十四节气之第十七。《月令七十二候集解》有言:「九月节,露气寒冷,将凝结也。」 + +体感上来说,早上一觉醒来(在高强度坐了一天火车后没有早八实在是一件令人欢喜的事),感觉自己的长袖睡衣有些冷,可能应该换棉质睡衣了。换之前,最好是把原本的睡衣彻底洗一下。此处第 N 次吐槽公共洗衣机,总是有种奇怪的味道(~~也不知道哪群大脑结构对现有模型提出实例性挑战的碳基生物在公共洗衣机里面洗袜子~~),需要大量的衣物消毒液和衣物馨香剂。当然,如果太阳很好,衣服晒干后的味道是很好闻的。可惜中间厅相对来说采光不是那么好,即使是夏天的正午也很难对衣服进行持续的暴晒。 + +……小氯本就是喜欢日光的,尽管正午的日光似乎有些刺眼。所以,公寓的公共空间都被装上了明亮的落地窗。 + +由于实在是感觉有点冷,因此中午去吃了碗羊肉(总花费 9 CNY 左右,小氯酱的神奇消费能力),感觉暖和了些。 + +## 喝药 + +如各位老友所见,小氯的身体一向欠佳。在保持健康的生活习惯的同时,求助于传统医学的智慧也是很自然的想法。于是趁着国庆假期,父母带着小氯拜会了家乡一位颇有名望的中医。中医为小氯开了些便于携带的药,嘱咐小氯说:每日早晚各一次,每次一包。 + +不过这个一包,并不是大家可能以为的一袋,而是十几袋,简直就是一份中药学期末考试题。 + +至于味道……嗯,怎么说呢? + +先略微偏个题。小氯虽然不太能吃辣或者吃甜(果茶一般都要少糖的,喜欢比较自然的味道),但是对于一些古怪的味道有很强的耐受力,比如苦(高中时经常嚼苦瓜败火)和酸(直接吃柠檬片)。而一些味道很怪的药,比如说汤药,也是用水化开后直接捏着鼻子送进去,然后喝一点果茶就没事了。 + +**……所以,各位老友应该能想到,让小氯都觉得难喝的药,其味道究竟有多么春风不度玉门关。** + +而且,由于药的量累积起来并不少,且不容易在水中化开,而小氯的水杯容量不大,因此药的浓度极高,还会有大量的残留,需要反复继续加水后才能溶解干净。而这个过程每天需要反复两次,就……怎么说呢?小氯有一种被氧化~~到坏掉~~的感觉。 + +## 战损版小氯 + +如各位老友所见,小氯的身体状况算不得乐观(~~这句话已经说了多少次了?~~)。而且小氯还有一个神奇的人物特质,在一切关键的时刻,必然发生战损。即将交论文的这个周末也不例外。 + +事情得从上面喝药说起。那天是周五,小氯课最多的一天,回来时已经是晚上七点左右了(如果是后八周,就是晚上九点了捏)。路上的风非常大,而小氯没有帽子,吹得头很疼。这时小氯已经感觉有些了不妙,毕竟伤风感冒对小氯来说简直是食堂的麻辣香锅——家常便饭。偏偏这时候小氯还做了一个非常离谱的决定:**点一份冒菜当晚饭**。 + +冒菜本来就是比较辣的食物,而小氯对辣的耐受力非常低。虽然小氯选了微辣并且在备注里反复强调「少放辣」,但是忙碌的店家显然没有时间去仔细照顾小氯的感受,于是我看着送来的一碗红色陷入了深深的思考。 + +最终小氯还是吃了,毕竟小氯睡得晚(尽管在大学生中算是非常早的),需要体力坚持到睡觉。直接结果是摄入了大量的水。 + +然后那天晚上小氯的精神就不太清醒,偏偏那天晚上,我还看到了一些令人精神状态极其不稳定的东西。浑浑噩噩了一晚上,论文一笔未动。眼看快到十点了,该喝药了。本来喝着也没什么大逝,结果……就在喝最后一口的时候,可能是小氯不慎把一小角塑料落到了杯子里,反正是有什么东西卡到了嗓子眼,然后……小氯就直接吐了,吐得昏天黑地。 + +吐完之后小氯的难受程度到达了顶峰,有一种天日昭昭(比阳还阳)的感觉。小氯不得不停掉了准备听的英语听力(~~不要为你的懒惰找借口~~),麻溜滚去睡觉。由于担心感冒药和中药冲突(尽管后者已经被吐了一大部分了),小氯也没敢吃感冒药。 + +然后由于小氯没定闹钟,因此睡了个好觉。挣扎着起来洗漱好,喝了一遍药,再洗一洗衣服,就马上要去吃饭了。由于实在是太难受,小氯也没敢吃什么重口味的东西,一碗阳春面了事。不过实际上倒也不算什么特别大的病,应该就是重感冒级别的,浑身各处疼一些,头晕而已。 + +下午回来,某个占了公共空间好几天打游戏的虫豸终于走了,于是小氯火速带着一大壶热水前去宣誓主权,顺便开始痛苦地写论文。 + +晚饭时间去了所谓的「营养轻食区」一探究竟,结果很惊喜地发现好吃哒非常丰富,遂随手点了一碗鸡汤米粉(小时候当小氯生病时,小氯的外婆经常给小氯熬鸡汤)和一个「七彩燕麦包」。 + +回去继续写。结果您猜怎么着?嘿!还没到十点,论文写完了! + +回想一下这一天,饮食健康,锻炼充分,喝了很多热水,学习效率也蛮高的。 + +难道战损版小氯才是最萌的吗?(笑哭) + +## 300 天 + +博客一百天时,小氯专门[写了篇文章纪念](/blog-100-days);博客两百天时,小氯在[当周的周报里提了一句]({{< relref "Ephemeralis-Weekly(2):生日快乐.md" >}});到了博客三百天,小氯几乎连提都懒得提了。 + +~~那请问小氯酱现在在干什么呢?~~ + +之前忘记在哪听过一个奇怪的说法:很多节日和纪念日都是为了巧立名目去大吃一顿。那要是这么看,反反复复庆祝博客的各种纪念日,是不是也是为了在精神上让自己大吃一顿,告诉自己「天呐,居然已经这么久了,我真的好厉害啊」? + +**不能说这种想法有错**,只是小氯现在并不时常采用这种心态而已。一方面说,小氯确实很懒,自己的生日都懒得过,更别说在博客的纪念日搞什么奇奇怪怪的活动;另一方面说,在小氯看来,就现在小氯坚持的这点时间,真算不上有多长——就在小氯敲下这行字的前不久,才刚给[张叔](https://laozhang.org)博客的十五周年发去贺电,而如果放大点看,这几百天可能只是小氯作为人类的生命的百分之一甚至更短,放在历史上更是微不足道——虽然说这几百天可能会在后世的史书上大书特书,但是除了 Web Archive 之外,又有谁还会记得,曾经有这么一只叫小氯的元素娘,在互联网的一个偏僻的角落,打理着一个小小的园子呢。 + +当然,我们现在做的一切,也并不是为了被历史铭记。历史的长河浩浩汤汤,其中最小的支流的最小的支流,就足够让园子中的植物朝露待日晞了。 + +所以……如果依然希望在精神上和身体上大吃一顿,小氯也不反对哦 OωO + +## X 账号解冻 + +小氯有一个 X 账号,是不知多久以前兴味使然注册的。只不过小氯并不喜欢 X,再加之 X 在国内由于一些问题难以正常使用,小氯就没管。 + +然后,忘记多久以前,小氯偶然想起这个账号,登录一看,发现被 suspend 了。这倒也正常,理由大家都懂。 + +然后,就在这周,当小氯再次看到做不了任何操作的 X 账号时,突然就感觉不太舒服。起码让我把这个账号注销了,就在这挂着算什么事。 + +去简单看了下 X 的帮助文档,发现可以发工单(我习惯这么叫)。于是我就发了个简单的工单,内容不太正式,大概是: + +> I've had my account for some time but recently found it suspended. I just updated my profile some time ago and haven't been active in any other way, so this suspension seems like a mistake. I use a 【神秘工具】 due to my location, which might have triggered this. Could you please check on this for me? Thanks a lot! + +发送过去,等着。 + +这几天我时常去看 Gmail 收件箱,一直没有消息,还有点想抱怨牢马员工的效率太低了。然而今天我登录 X 一看,已经可以正常编辑 profile 了,这应该就是解冻了。**所以说,沟通很多时候还是有用的。** + +因为我平时分享日常都用 ActivityPub,所有现在我的 X 账号基本上是空的,在那里放着。头像是一只 Q 版的小氯酱。 + +![|324](https://img.viento.cc/chlorinechan-q.webp "依然由豆包绘制") + +还蛮喜欢这个图片的风格的,不过画得比较一般。或许需要找一位插画师约个稿?小氯的老友们中有很会画画的,但是风格和这个都不大一样。 + +## 小氯的中文风格 + +有时候看一些我曾经写过的文字,会感觉语言风格有些奇怪。就拿前面一句很简单的话来说: + +> 在高强度坐了一天火车后没有早八实在是一件令人欢喜的事。 + +这话怎么听都不像是地道的中文表达,带有明显的翻译腔,至少非常不口语化。然而事实是小氯是地道的中文本族语者,没有任何表达能力障碍,更没有用英语写 blog 然后翻译成中文(~~真有那个水平就好了~~)。 + +仔细想了想,似乎这个现象在小氯这里相当普遍。无论是时不时探头的长难句(中文的长难句相对来说没那么多,除非刻意生造),还是大量的名词化表达,抑或是奇怪的语序和用词,都给人一种~~像路易十六一样~~摸不着头脑的感觉。这种感觉在写 GitHub issue 时尤其明显。 + +这实在是有些令人费解,尤其是在考虑小氯还好好地住在国内,周围的语言环境基本也都是中文的。英文材料看得也不多,好多英语电子书还是堆在 To-Be-Read 列表里面。如果要说小氯的英文很好……至少小氯不敢如此自居,平时写英语邮件、issue 经常需要「帮帮我,GPT 先生」,口语更是一塌糊涂,去和外国小哥交流大部分时候都会把人搞成物理意义上的黑人问号(但是要说不好的话,高考英语 145+,CET-6 将近 680,似乎也算不得太差)。 + +如果一定要找原因,可能就是更多的实践性写作让小氯的思维方式和表达习惯多多少少带上了一些英语的色彩。小氯不认为这是件坏事,不过有时候面对着自己写出来 / 说出来的句子,也会忍俊不禁。有趣的跨文化融合现象,不是吗? + +## 独立博客自省问卷 15 题 + +最近[雅余大佬](https://yayu.net)发了个「独立博客自省问卷 15 题」,很多博友都在回答。那小氯也来答一下吧,~~虽然说这样多少有点跟风的味道~~。 + +这让人感觉有点像过去小氯刚有 QQ 时,空间经常有的问卷。只不过,现在是一群距离更远、更加陌生但是更加志同道合的人了。 + +### 你的博客更新频率是多少? + +不一定,随缘。但是一般来说,一周不少于一次。种一株新的植物,讲一个新的故事,还要看时间吗? + +### 你的博客上次更新是什么时候 ? + +这周,看[这里]({{< relref "咦,我的按钮呢?.md" >}})。 + +### 你的博客文章是原创的吗? + +是的捏。小氯有时候会用到 AI 辅助(主要是聚合一些信息,以及快速了解一个不熟悉的概念),但是从不用 AI 写文章(来自一个创作者的观念和 Not By AI 运动的承诺)。至于转载,小氯不大懂这样做的意义所在。如果觉得一篇文章写得好,直接放一个推荐链接不行吗? + +### 你觉得自己的文章对他人有帮助吗? + +难说,或许有点用,理性价值,实用价值或者是情绪价值。 + +### 你上次换博客主题/程序是什么时候? + +忘记了……我查查我的博客年表……是 2024 年 6 月 25 日,大概是三个半月前。 + +### 你上一次捣腾博客主题代码是什么时候? + +~~您猜我的主题是怎么改出来的?~~ + +上次……应该还是在上次,大概这周以内? + +### 你会对博客主题进行二次开发? + +……怎么说呢?如果这是道简答题,我的答案是肯定的,但是这是道选择题…… + +直接说吧。小氯现在的博客主题是基于[恐咖兵糖](https://www.ftls.xyz)大佬开发的 Landscape 主题,而 Landscape 实际上是对 [Fuwari](https://fuwari.vercel.app) 的 Hugo 复刻。小氯很喜欢 Fuwari,于是把 Landscape 叉了过来,并且按照自己的喜好加了一堆功能,包括但是不限于: + +- Twikoo 评论 +- 霞鹜文楷 Bright 字体和 Fira Code +- Algolia Docsearch +- 多级导航栏 +- Fancybox 灯箱 +- Obsidian 风格的图片链接和 caption 渲染 +- KaTeX 数学渲染(未找到最佳方案) +- AI 摘要(大嘘) +- 糖果特效 +- Shiki 高亮 +- 代码一键复制 +- 公告组件 +- 站点运行时间计数器 +- wowbook +- 友链 +- 若干短代码(GitHub 等的仓库卡片,时间线组件,事件线组件,友链短代码,说说短代码,Alert……) +- 404 页面 + +美化了: + +- 文章详情页(主要是边距) +- 移动端文章卡片样式 +- 移动端 nav 弹出(未找到最佳方案) +- 侧边栏(主要是一点点组件图标) +- 一些 Markdown 样式(比如引用块) + +修复了 Swup 导致的一大堆问题,主要是各种 JavaScript 加载,比如说点击主题切换按钮不管用…… + +虽然说核心部分没有动什么大刀子,但是我觉得改到这个程度,大概已经可以算一个新主题了。我给它起了个名字,叫 Efímero(浮光),把 Landscape 的链接放到了关于页面。 + +### 你多久打开自己博客自我陶醉一次? + +如果是打开博客……一天好几次。不过「自我陶醉」……好吧你说得对 qaq + +### 你近期对自己博客域名什么感受? + +还好,我的博客域名是我的英文名。有点长,不过还行。如果可以的话,有点想搞一个 `xiao.lv` 或者是 `xiao.cl`(Cl 是氯的元素符号)。 + +此外我发现,`xl.me` 似乎是 available 的,而且价格非常正常。但是扔到购物车之后,再搜索就发现价格离谱了。不知道是不是 Spaceship 的 bug。 + +### 你每天都会看网站的流量统计吗? + +什么是流量统计?(呆萌) + +### 你通过博客的广告赚到钱了吗? + +没有广告,可见未来内应该也不会有。 + +从理性的角度看,园子的运营成本(指显性成本,也就是会计成本)只有一个域名的价格(可能还要算上为了保备案的服务器费用,但是这不算是园子的成本,因为没有它园子也能运行),小氯再缺钱也没必要为了这点钱去污染园子的游览体验。就算就算是小氯想污染,就凭园子这点流量,也没有什么商家愿意在这里打广告,就像没人会在鲁滨逊的荒岛上拉横幅一样。 + +> 没那个能力知道吗?——范志毅 + +从感性的角度看,小氯也不希望园子沾染上这样的气息。世间没有桃源,但是在互联网的海洋里造一个近似的还是能做到的。 + +### 你去浏览别人的博客/网站主要为什么? + +为了回访啊。 + +小氯偶尔也喜欢跳任意门(比如[十年之约的虫洞](https://foreverblog.cn/go.html)和[开往](https://travellings.cn/go.html)),去随机看一看互联网上其他的小岛。但是作为赛博社恐分子,小氯主要还是贯彻 P2P 社交。 + +### 看到别人分享了一篇文章,你打开第一反应是什么? + +还是看文章内容吧,尽管美观的主题和流畅的加载会给小氯以非常舒适的情感体验。 + +### 你觉得博客哪方面更重要? + +这题我很想回答「内容」。很遗憾,尽管小氯确实觉得内容非常重要,但是倒腾了这么久的主题,很难说小氯最看重内容是真心实意的。 + +### 近期通过写博客有哪些新收获? + +让我想想…… + +题目中的四个选项,似乎除了「知识变现」之外都有——有认识新的老友(这个词组似乎听起来很别扭,但是如果您熟悉小氯的表达习惯,就会知道小氯口中的「老友」实际上也不需要认识很长时间 :D),知识面也有了扩展,写作水平也有了一定提升。 + +但是小氯觉得,这个问题没那么简单。如果要深挖,这实际上是一个很哲学的问题: + +> 我们为什么要写博客?或者是博客的意义在哪? + +这个问题可以写一本书。或许等到园子周年的时候,小氯会专门写篇文章讨论一下吧(`画大饼.gif`)。 + +## 哲学思考呢? + +之前小氯写周报,多少都会在最后一个章节讲点哲学。但是本期没有,不是没进行,是没写完…… + +小氯最近在看 Obsidian 官方论坛上一个非常大的 thread:[Open Sourcing of Obsidian](https://forum.obsidian.md/t/open-sourcing-of-obsidian/1515),是 Obsidian 还很年轻时,用户们对 Obsidian 为何不开源以及是否应该开源的讨论。 + +作为一个 FOSS 主义者,Obsidian 不开源一向是小氯的一个 sore point。但是在看这个巨大的线程时,小氯又有了一堆新的思考,甚至还涉及一些 FOSS 本质的问题。所以小氯的这篇文章越写越长,现在已经和这篇周报差不多长了。以小氯的性子,很可能会去看完《大教堂与集市》之后才能继续写。~~不要为你的鸽找借口~~ + +行了,小氯承认也是因为这周末生着病写报告写论文太疲劳了……这篇文章不会鸽太久的,小氯保证。OωO diff --git a/content/posts/人间世/岁时录/岁时录(十七).md b/content/posts/人间世/岁时录/岁时录(十七).md new file mode 100644 index 0000000..9c02c09 --- /dev/null +++ b/content/posts/人间世/岁时录/岁时录(十七).md @@ -0,0 +1,257 @@ +--- +title: 岁时录(十七) +date: 2025-03-23 +slug: weekly-17 +featuredImage: https://img.viento.cc/cover/weekly-17-cover.webp +categories: + - 人间世 +tags: + - 日常 + - 文本 + - TNO + - 隐私 +series: 岁时录 +summary: 太好了是拖更,我们没救了 +description: 本文是作者周报的第十七期。作者因尝试新终端模拟器GhosTTY而逐渐放弃使用iTerm2,对其有所称赞,但也指出其兼容性问题。接着探讨了对“文本主导”博客设计的偏好,强调极简主义应注重用户体验,而非牺牲美观或功能。作者还分享了因游戏模组TNO接触到的波兰乐队Żywiołak,并分析“异教”一词的历史演变。文章还提到作者成功申请到前往新加坡的访学项目,详细分析了选择 SG 的现实考量,如费用、地理位置和学术环境,并吐槽了申请过程中的繁琐与不人性化设计。此外,作者因需求注册Telegram,认可其功能性但对其隐私性有所保留。在学业上,作者讲述了《数字逻辑实验》中的失误,反映准备不足的教训。文章还质疑苹果隐私政策,计划转向开源替代品,并列举了可能的替代方案。最后,作者表达了对纯文本文件格式的热爱,认为其简单性与开放性带来的兼容性和持久性无可比拟,并通过对比专有格式的局限性,强调纯文本在信息记录与管理中的独特价值。 +wikilinks: +--- + +各位老友,晚上好。这里是 Chlorine。 + +没错,小氯又顺理成章地鸽了好几期周报(捂脸)。 + +您正在阅读园子的周报——《岁时录》的第十七篇,日期范围为 2025 年 3 月 3 日至 2025 年 3 月 23 日。这是园子的不完全定期刊物,会记录一些小氯和园子在这段时间的经历,以及或有或无的思考。这是从主世界的时间中引出的一条细小的支流,也是这个网络空间中的小岛的编年史。 + +祝食用愉快。 + +## Goodbye,iTerm2 + +iTerm2,macOS 著名的终端模拟器。小氯之前曾经折腾过无数个终端,从原生的 Terminal 到 Hyper 到 ~~摄政王~~Tabby 到 Wave 到 Wind 到 Warp 到 Alacritty 再到……好了不报菜名了,最后选了 iTerm2。 + +iTerm2 整体的功能相当出色,作为一个终端来说,可以说是几乎尽善尽美了。虽然小氯也动过换成 Alacritty 来提前适应 Linux 的念头,但是最后还是贪恋 iTerm2 的舒适。Linux 的事到 Linux 再说嘛。 + +后来小氯发现了一个好玩的小东西:[GhosTTY](https://ghostty.org),或者可以叫 ghostty,小幽灵。 + +GhosTTY 用的是一个新东西,叫 [Zig](https://ziglang.org/zh-CN/)。没错,就是 Bun 用的那个语言。小氯一向是喜欢新的东西的,Rust 如此,Zig 如此,Nim 亦如此。而且 GhosTTY 的界面异乎寻常地好看,原因嘛,它是个 SwiftUI 应用——是的,你没听错,一个终端居然可以是 SwiftUI 的。 + +于是小氯把 GhosTTY 留了下来,开始偶尔用其完成一些轻度任务。 + +不过随着时间的推移,小氯发现自己用 GhosTTY 越来越多了,即使有兼容性问题,拿 Terminal 临时顶上也足够了,Dock 中的 iTerm2 反而变成了一百年都不打开的那个。那既然如此,还留着它干什么呢。 + +GhosTTY 是开箱即用的,几乎不需要任何配置——如果想配置,请自己写配置文件,这家伙还没有设置面板。不过其目前存在一个比较大的问题:其终端类型 `xterm-ghostty` 在一些比较老旧的系统,如 Ubuntu 20 上是不支持的,需要手动通过 `SetENV` 回退。此外,这个问题会影响 `nano`,但不影响 Vim,~~间接促成了小氯 Vim 水平的巨大进步~~。 + +## 文字的骨架 + +小氯一直很喜欢「文本主导」风格的博客。简约但是不简陋,在去掉了一切的冗余之后,极端的效率美和隐藏在每个细节背后的设计感。比如说小氯一天要提八百遍的 , + +不知道诸位老友对于这种设计风格是什么感觉,小氯的话,很像是当初读到那首很喜欢的词的感觉: + +> 春未老,风细柳斜斜。试上超然台上看,半壕春水一城花。烟雨暗千家。 + +如同双手抚摸上世间最上品的宣纸,即使上面什么都不写,也是千年不朽的艺术品。 + +但是小氯并不喜欢各种 CSS Free,或者 CSS 极少,或者 CSS 非常……具有个性的网站,比如那些遵循粗野主义(Brutalism)的网站,亦或是名字让人三缄其口的[某个网站](https://motherfuckingwebsite.com/),亦或是 HN,亦或是 Jekyll 的 [No Style Please](https://github.com/riggraz/no-style-please),亦或是著名的 。这些网站不会让小氯感到愉悦,相反,是极端的焦虑,如同置身于没有外墙的钢筋森林中。这不叫简洁,这叫简陋,甚至可以说是一种视觉暴力。 + +在小氯看来,真正的「极简主义」「纯文本」博客,不应该以牺牲用户体验为代价,就像书的内容固然是最重要的,可你不能用像素字体印书然后把行距调成 0.5 倍——而是应该保持克制、冷静的设计感,把排版、布局这些东西调整到一个最能让人好好读东西的程度。极简主义不是减法,而是加法加到极限的返璞归真。 + +当然,类似 Hexo Butterfly 这样的主题,在小氯这里同样不讨喜。不是说它们不好,只是它们太华丽、太繁复了,把原本留给内容的精神力量都抢走了。而且,它们太脆弱了。无数的 JavaScript 或者 PHP 叠在一起,让人想到杜奥蒙堡,看似是坚不可摧的钢铁巨兽,实则在小小的攻击面前脆弱得不堪一击。 + +根据不可能三角,如果我们想达到简洁性和美观性的极致,那么我们就必须付出极大的开发成本,把所有的复杂性都藏在一个接口下。这也是 Hermeneutics 的设计目标——当然,现在离这个目标还差远了。 + +## Żywiołak + +最近一直在云集邮 TNO 新版本后阿巴顿的各种(同人)结局,听到了新波(新莱齐亚救赎帝国)的统一曲。虽说新波也是个 Double-off-compass 的超级魔怔势力,不过这个统一曲还挺有趣的。 + +这首曲子叫作 *Sol Invictus*,直译是《不可征服的太阳》(~~想吃广东菜了~~)。这首歌不算阴间,反而有种莫名其妙的活力,~~其去城市化的风格也确实符合新波的路线~~,因此也顺理成章地被小氯扔进了歌单里面。 + +在扒拉元数据时,小氯闲来无事阅读了一下歌词。歌词很长,这里就不放了。小氯不认识这种语言,于是直接扔给 AI。得知这是波兰语,描写的是冬至节、太阳崇拜之类的,看起来很像是和斯拉夫异教有关。 + +于是小氯也顺理成章地去了解了一下背后的乐队——Żywiołak,直译是「元素」或者「精灵」,其意义应该是「元素之子」或者「自然之子」之类的。这是一支波兰的民间乐队(~~合理~~),主打的是新民谣(或者叫民谣金属)风,其风格受到波兰民间文化和斯拉夫异教的强烈影响。小氯也去找了找这支乐队的其他作品,比如说 *Witaj księżycu*(大概可以翻译为《太阴颂》)之类的,听起来也都很有感觉。 + +不过,诸位老友,我们回过去读读上面的话。我们似乎顺理成章地在使用一个词:**异教**。 + +异教,字面意思就是「不同的宗教」。和谁不同呢?自然是和自己啦。比如说十字军和穆斯林在中东友好交流(物理)时,会互相称呼对方为异教徒。当然,也可以是和自己所属的社群不一样。 + +那么小氯上面的用法属于哪种呢? + +……坏耶,好像都不是。 + +小氯是个无神论者,最多由于家乡的一些传统,可能有的时候会看点佛经。不相信任何(传统意义上的)宗教,自然也不会有异教这种说法;而小氯周围呢大体上都是无神论者,对于有宗教信仰的也自然是宗教自由,也就没有什么主流宗教之说。 + +那这个词是怎么来的呢?为什么我们能非常自然地说出「斯拉夫异教」这个词? + +现实中没有答案的问题,我们就去历史上找一下吧。 + +斯拉夫教(我们姑且使用这个词)的历史相当古老,其年龄估计不会比希腊神话和中华文明的巫文化小。起源不明,大概就是古斯拉夫人的原始信仰彼此间的融合和演化。斯拉夫教属于典型的多神教,其信仰的神灵大致包括雷神佩伦(Perun)和冥神沃洛斯(Veles)等。 + +大概从公元一世纪开始,在和拜占庭帝国等西方文明的接触中,基督教逐渐传入古斯拉夫。事情的转机发生在公元 9 - 10 世纪左右:九世纪中期,拜占庭帝国在牧首弗提乌斯的领导下,开始向北部和西北部边境外的斯拉夫人传播福音(口头)。例如来自塞萨洛尼卡的西里尔和美多迪兄弟:这对~~海尔~~兄弟精通多种语言,包括斯拉夫语,这使他们能够流利地与斯拉夫人交流。在前往莫拉维亚之前,他们创造了一套适合斯拉夫语的字母表(也就是格拉哥里字母 Glagolitic,后来演变成了西里尔字母 Cyrillic),并用马其顿斯拉夫方言翻译了《圣经》和礼拜手册,这种方言后来成为了斯拉夫教会的礼仪语言。 + +继续说。大家知道,斯拉夫地区其实分为东斯拉夫、西斯拉夫和南斯拉夫等多个地区。其中在东斯拉夫地区,基辅罗斯大公国的基督教化是斯拉夫世界基督教化进程中的里程碑。这就不得不提到基辅罗斯大公弗拉基米尔一世(Vladimir the Great)了。 + +980 年,弗拉基米尔一世通过政变夺权。当时的基辅罗斯呢,还在信奉原始多神教,所以在国际社会显得格格不入(~~欧洲国家:我们要举办一个超酷的派对,猜猜谁没有收到邀请?~~)。为了更好地融入欧洲社会和政治体系,弗拉基米尔考虑皈依一神教。988 年,为通过迎娶安娜公主以结束与拜占庭帝国的冲突,弗拉基米尔一世受洗,立正教(东正教)为国教,并下令摧毁国内所有的斯拉夫教神像,标志着基辅罗斯正式基督教化。 + +好的,我们大体说明白了:斯拉夫教被称为「异教」,实际是历史上基督教中心主义的一种表现。不过这个词发展到现在,大多数时候其实也没有什么歧视的成分了,而更多地表达了一种「和基督教/主流宗教不同」的客观事实,甚至是一种对于特色文化的尊重,这有点类似于酷儿(queer)由贬义词演变为中性词和身份标签的过程。而且,从某种意义上说,「异教」这种表达方式也能更好地表达对传统的反叛,很多时候,我们总喜欢和大多数人不一样,不是吗? + +*注释:对本段中几个词汇的解释* + +- TNO:《新秩序:欧洲末日》(*The New Order: Last Days of Europe* )的简写。这是著名战略游戏《钢铁雄心 IV》(*Hearts of Iron IV*)的一个模组(mod),也是其最著名的架空历史模组之一,大体就是轴心国赢得了二战的胜利。TNO 以极其复杂的游戏机制、黑暗压抑的氛围和对极端意识形态(魔怔)的探索而闻名。 +- 阿巴顿:掌管地狱无底坑的恶魔。这里指的是莫茨内,俄罗斯地区势力「该隐兄弟会」的首领。该隐兄弟会是整个 TNO 官方设定中最残暴的势力,没有之一。希姆莱和它一比都算是温和慈祥的。~~哦,如果把目光放远一点,我们有元素干涉区等一众嚎劫~~。 +- 后 XXX:指 XXX 统一某个地区(一般是俄罗斯地区)但又崩溃后的时期,例如后神俄(也称「子夜后」,这和神俄的特殊游戏机制有关)即神圣俄罗斯帝国(俄罗斯地区最魔怔的势力之一,虽然和该隐相比还是略逊一筹)解体后的时期。一般会诞生一些传奇类人生物。 +- 新莱齐亚救赎帝国:(应该是社区同人)后阿巴顿时期的传奇魔怔势力之一,奉行安那其原始主义。 +- Double-off-compass:Off-compass 的加强版。Compass 指的是意识形态罗盘,Off-compass 即极端到无法纳入意识形态罗盘内的意识形态。 + +## 交换结果 + +如之前所述……咦,是哪个之前呢?大概是某个时间段的[如今](/now)页面吧。 + +好的,如之前所述,在导师的建议下,小氯报名了一个交换项目——准确来说,应该叫「访学项目」,因为这和普遍意义上的 Exchange 不太一样。鉴于小氯目前的研究方向(~~你有什么研究方向啊~~)以及兴趣,小氯倾向于去一个具有丰富社会动态(这里直译了 Dynamic,这只入机元素娘都快不会好好说中文了)的国际金融枢纽(特别是有 FinTech 的那种)。 + +就目前情况而言,综观全局,纵览古今,考虑各部分的平均水平……(停!不要再 YPM 了)这个项目的额度还是蛮不错的。小氯斟酌了很久,最后首选了新加坡。 + +之所以首选 SG 而不是更强的美校,主要原因是比较现实的:**没钱**。 + +SG(以及大部分的 target)都属于「访学」或者「交流」一类,这意味着如果你希望去上一些对方的课,是不需要付学费的,同时还可以享受比较廉价的住处——当然,这个廉价是相对 SG 其他同等条件的住房说的,和国内一年一千多的宿舍肯定没法比(毕竟是社会主义国家嘛,高等教育便宜一点很合理)。 + +而 US 的(稍微好一点的)学校都是「进修」项目,需要自己负担全部的费用。我们就拿硅谷地区某所著名公立大学(~~PRB:你直接点我名字得了~~)来说吧,按照过往学长学姐的经验,你每个月就算是只保证基本生活,大概也需要准备,同时还有令人……认为值得商榷(入机中文 1 / 1)的学分付费制(据调查一个学分的费用大概相当于国内一般大学一个学期的学费)。我不明白(奉化口音),你这学分是金子做的还是银子做的? + +这样算下来,一个学期大概得好几个六位数吧。虽然对于那些中产家庭来说这都不算钱,但是对于小氯来说……嗯。虽然娘亲好几次和小氯说「不要老是在乎钱,按照你自己的发展路径走」,但是为了一次访学把家底搬空这种事,小氯做不出来。至于那些比较好的私立高校嘛,那更是重量级,~~不然怎么会有还一辈子的学贷~~。而 SG 那边就经济多了,估计一下,如果省着点用,大概只需要硅谷地区某所著名公立大学的十分之一(也正因如此,美区的名额非常多,也可以起到托底作用)。 + +此外还有一些原因:时差比较小(这里指的是标准时间,不是实际体感),和家里联系比较方便;整体治安比较好(比较:指世界上治安最好的国家之一),种族问题也少很多,相比之下,《团结》在恩!情!无限的川大统领领导下的某西方神秘大国还是太乱了,~~谁知道哪天就会玩 TFR~~;SG 是亚洲的金融中心,在金融科技方面有很多小氯感兴趣的探索,等等。总而言之,小氯就选了这样一个不是最强但不弱的目标院校。准备材料的时候也是按照 SG 的 flavor 定制的。 + +至于其他目的地嘛:HK 没分到什么比较好的学校;带嘤倒还可以,可惜没名额;东京感觉还不如 SG,而且我不会日语;首尔也是如此(~~我不吃忠橙,谢谢~~);大洋洲地区没太多好逛的金融产业——以及小氯不太喜欢某只长了五个眼睛的怪兽。至于其他地点,小氯根本没看。综合来看,SG 还是称得上最优解的。 + +嗯哼,你说为什么最后还写了个某正白旗城市啊?那个是凑数的。 + +然后就是平平无奇的交材料和面试了。面试没有什么波澜,发挥算是正常吧。由于竞争不算是太激烈(尽管应该是所有 target 里面除了 US 之外最强的之一了),小氯也是比较有信心的。几天以后(抱歉小氯忘记具体是哪一天了)接到了电话,果然顺利通过了。 + +当然面试过了也不意味着万事大吉,还需要那边接收你,也就是说还需要一个 Application。这里小氯要严厉批评这个 Application 系统:那个申请界面古老得像是石器时代的文物,操作逻辑也极端反人类——我们就拿选课来说吧,它不能单独搜索课程,只能添加,也就是说你必须把一门课删掉才能看到课程相关信息;课程的 Rank 不能拖动,只能手动排……最最最逆天的是,不知道那边抽什么风,突然来了一个「必须至少选一半所在院系的课」的诡异规定。说实话,让交叉学科的同学这样选课简直就是丧尽天良。就比如说,计算机系的数值分析可能是数学系开的,而商学院或者金融学院的经济学课程一般都属于经济学系。合着咱出去拓展眼界,反而得自我收缩一下,交叉学科没有交了,光剩个叉了是吧(恼)。 + +于是小氯果断 compose 了一封邮件给了那边的负责部门。结果嘛,自然是没有结果。其他几位同学也没有收到回复,甚至单纯询问性的邮件也是如此。不得不说,牢新你是好样的。 + +反正最后是用了几天把申请 submit 了,~~薄纱 DDL~~。至于中间出的问题就不多说了,有害物品小氯自己一个人吃就好啦(嚼嚼嚼)。 + +当然,事情还没完。后续还要调整选课,以及办签证等。反正过段时间,小氯就要去 SG 旅游啦 \(≧▽≦)/ + +最后小氯有个问题:去了 SG,是不是就可以不用每天电脑上开魔法猫猫了? + +## Hello,Telegram + +记得小氯以前在「关于」页面~~非常傲娇地~~宣称: + +> 我永远不会公开我的微信、QQ 和 Telegram。 + +然而小氯现在表示,以前是以前,现在是现在(捂脸)。 + +小氯一向对 Telegram 兴致缺缺:论隐私性,你比不过 Signal;论自由性,你比不过 Matrix;没有默认的 E2EE,网络连通性堪忧,注册还需要境外的手机号,我要你何用呢。 + +不过 Telegram 也是有优点的。最大的优点自然是其丰富的 Bot 和 API,足够让 Matrix 社区眼馋十年了。以及很好用的 TG Channel,可以起到类似公众号的作用。当然,还有一点:作为一款即时通讯应用来说,TG 的体验可以说是标杆级别的,无论是资源占用、界面还是交互。虽然小氯说其隐私性比不上 Signal 和 Matrix,但是好歹也有 E2EE 的选项,比微信这种虫豸强多了。 + +事情的转机大概出现在前几天。在坚持使用了很久(~~事实上只发过几次消息~~)的 Matrix 之后,小氯残酷地意识到,这玩意的普及度实在是太低了,别说是在日常生活中用了,就算是博友圈,估计也没几个人用。想靠 Matrix 和 Residencia 0x001B 的老友们沟通,还不如飞鸽传书靠谱。而且,conduwuit 出现的离奇问题也让小氯对目前 Matrix 的生态产生了一定的怀疑:一个即时通讯应用,首先需要有基本的功能吧。 + +此外,由于要去 SG 了嘛(尽管现在还早),小氯就去简单调查了一下在 SG 的一些「必装软件」。在 IM 方面的话,最通行的肯定是 WhatsApp,然后自然就是 Telegram。 + +于是小氯决定注册一个 TG。反正现在手里的电话卡捏了好几张,也不再需要租临时号了。过程嘛,没什么好说的。只是小氯的电话卡有时候收不到 TG 的短信,不知道为什么。 + +哦,以及 TG 有一个奇怪的问题,就是如果你不允许其访问全部的通讯录,下面的 Contacts 就会一直有一个警告标志,而且挪不掉,非常难受。不知道哪个大脑结构与当下生命科学最新进展所认可的智人一般大脑结构存在实质性差异的人设计的这个机制。 + +## 数实惊魂 + +小氯的课表有一门奇妙小课,叫作《数字逻辑实验》,简称数实。这门课只有一学分,但是却位列 CS 牢九门之一——当然,是和其主课(也就是威名赫赫的数电)一起的。由于小氯对硬件兴趣不大(除非去搞硬件密码学),所以上得并不走心。 + +或许是第一节的示波器玩得太过愉快,让小氯丧失了对于 CS 牢九门的应有尊重,于是在第二节课之前,小氯并没有做很多的预习,只是像以前那样写了一个 Memo,然后贴了几张来自实验文档的参考图而已。更难绷的是,我上节课没有把自己的实验箱带回去,因此完全是纸上谈兵一般的预习。事后证明,这是一个让小氯后悔得直龇牙的决定。 + +下面我们也不多废话,来看几个小氯的铸币操作吧。温馨提示,阅读下面的内容时请不要吃饭或者喝水。 + +### 情景一 + +- 小氯:助教学长,为什么我 5 V 的方波测出来只有 0.5 V 啊? +- 助教:估计你倍率没……不对啊,你这倍率是对的。不是,你没调游标啊,你这游标跑哪去了,测出来的也不是你的电压啊。 + +### 情景二 + +- 小氯:助教学长,为什么显示不出来波形啊? +- 助教:你估计没插电吧……不对啊,插了啊。等会,你芯片呢?你光拿个模块能测出来什么啊? + +> 《测芯片的实验不安装芯片》 + +### 情景三 + +- 小氯:老师,我这个波形为什么这么抽象啊? +- 老师:我看看……你接线没问题吧? +- 小氯:我刚才查过了,应该是对的。 +- 老师:我看看……确实没问题。(伸手拔掉电源)怎么还是这个?我给你换示波器供电试试。(换成示波器供电)还是这样,有接触不良吗?(按压每一根线)没有啊,你等会,我去给你拿个电源模块。 + +(老师带着电源模块回来了) + +- 老师:再试试……怎么还不行?你芯片不是坏了吧,(拿起模块查看)不是,你把芯片插倒了啊! +- 小氯:啊? +- 老师:你先重安装一下,一会我再回来。 + +(小氯重新插了一次芯片) + +- 小氯:(可怜兮兮)老师,为什么波形还是这样啊? +- 老师:不可能啊。(拿起模块)(恼)你 TM 插的还是倒的啊!缺口,缺口你知道是什么吗? +- 小氯:啊? + +> 《在哪里跌倒,就在哪里继续跌倒》 + +所以到最后小氯差点没做完实验,最后一个线接得乱七八糟,波形也是龙飞凤舞荡气回肠。好在好心的助教和老师还是算我过了。 + +## Get Rid of Apple? + +最近小氯看了一些新闻(不太新,两年前吧),大概意思是即使你关掉了设置中的与 Apple 分享数据,Apple 还是会悄咪咪地上传一些。Apple 对此的解释大概是—— + +> 果乙己一到店,所有科技公司便都看着他笑,有人叫道:「果乙己,你系统里又查出隐私漏洞了!」他不回答,对 Genius Bar 说,「升级 iOS 18,要支 Apple Pencil。」便排出 Apple Pay 二维码。他们又故意嚷道:「你一定又偷偷上传用户数据了!」果乙己睁大 HomePod 般的圆眼睛说,「你怎么这样凭空污人清白……」「什么清白?我前天亲眼见你偷传 Siri 录音,被 FTC 罚了八千万。」果乙己便涨红了 logo,额头的 Dynamic Island 剧烈抖动,争辩道,「系统诊断和非第三方分享不能算跟踪……差分隐私!……保护数据的事,能算跟踪么?」接着便是难懂的术语,什么「广告标识符已重置」,什么「端到端加密」之类,引得众人都哄笑起来,店里外充满了快活的空气。 + +好的,说人话。 + +> Apple’s advertising platform does not track you, meaning that it does not link user or device data collected from our apps with user or device data collected from third parties for targeted advertising or advertising measurement purposes, and does not share user or device data with data brokers. + +嗯……如果小氯没理解错,Apple 的意思是,如果只有自己一家公司收集数据,那就不叫跟踪了。 + +……嗯。 + +虽然说阳奉阴违属于 Big Tech 的传统艺能了吧,但是……牢果,你再怎么说,也是一家以「隐私」为卖点的公司啊。你这样……算了我还是不说你了。你好自为之吧。 + +而小氯呢?自然不会躺平等着被牢果灌注(大误)。我们当然可以直接换 Linux——如果将来要换 Linux 的话,小氯大概率会选 [Framework](https://frame.work/),或者是等到 MacBook 被榨干以后刷一个 Asahi(那个时候的 Asahi 应该已经能比较好地支持这样旧的硬件了吧——如果它还活着)。 + +不过,小氯的 MacBook 刚刚买一年左右。指望小氯现在换一台电脑,那属实有点蔑视小氯的半个专业(金融)了。要么等到小氯把 MacBook 的剩余价值彻底榨干,要么就是有一个很合适的机会可以出二手。所以我们现在要做的,还是 Get Rid of Apple——尽可能摆脱 Apple 的服务,换用开源和自托管的替代品。 + +让小氯列个目录…… + +- Apple Mail:完全可以换成 Thunderbird。 +- iCloud Mail 域名邮箱:先这么用着吧,反正咱有 GPG。 +- Unified Clipboard:有一些跨平台同步剪贴板的项目,还没试过。 +- Unified Notification:难说! +- iPhone Mirror:在牢软的 Windows 都能操作 Android,小氯不信这件事没有解决方案。 +- AirDrop:Localsend 比 AirDrop 好用多了,但是由于万恶的校园网隔离,小氯没法日用。或许可以找一个路由器,或者是使用 Tailscale 的虚拟内网。 +- iCloud:问题不大,咱有 ownCloud 和 Nextcloud。很可惜这两个家伙又大又重,而且小氯不太知道托管在哪。 +- iCloud Photos:Ente,Immich 和 Photoprism 看着都不错,小氯最喜欢 Ente。不过问题还是:不太知道托管在哪。 +- iCloud Calendar & Reminder:有依附于 ownCloud 和 Nextcloud 的服务,不过小氯更喜欢一个单纯的 CalDAV,不过不知道这样能不能两个联动了,不能就不能吧。 +- Maps:嗯……说实话,在赛里斯生活,很难有什么很好的开源地图软件。 + +这是个大工程,小氯会一点一点做。后面的事情,小氯后面再和诸位老友汇报吧。 + +## 文本长生 + +最近小氯在试着了解 `TODO.txt`,一种纯文本的待办事项列表。惊叹于其简洁性的同时,也开始思考一些和「纯文本」有关的事情。 + +「纯文本」这个词听起来可能会引人误解,实际上在小氯的说法中,纯文本和文本基本是同一概念——That is,使用字符编码、可以表示为人类可读的字符序列的各种文件,如 `.txt`(无格式纯文本),`.md`(Markdown 标记语言)和各种代码等。或者说得简单点,只要你能拿文本编辑软件,比如说 Notepad、Textedit 正常打开的文件都是文本文件——当然这样有点倒果为因。 + +小氯对文本文件多少是有些迷恋的。想一想,只需要一个最简陋的文本编辑器,便能将文件的全部内容一览无余,几乎毫无阻力地建立起比特、神经元和意义节之间的桥梁。这种重力一般的掌控感和安定性,即使是胸腔中跳动的心脏都无法给予。而打开之后,所有的结构如同转录中的 DNA 解旋,铺陈成一张盛大的画卷,胸有丘壑,却毫无心机,毫无保留。如同《1984》中温斯顿的那个梦一般,随意的一抛,就是莎士比亚时代全部的优雅。不论是英社还是老大哥,都在这一个动作中破碎黯淡成无关紧要的灰尘。 + +……写得好矫情啊(笑)。 + +而简单性和开放性的直接结果就是:海纳百川的兼容性和千秋万代的延续性。同一个文本,Notepad 可以打开,CotEditor 可以打开,Neovim 可以打开,Emacs 可以打开,EDIT 和 ed 也可以打开;Windows 可以打开,macOS 可以打开,Linux 可以打开,FreeBSD 可以打开,移动设备可以打开,DOS 和初代 Unix 也可以打开;三十年前的电脑可以打开,现在的电脑可以打开,三十年后——乃至更久也可以打开。我们可以大胆地预言,即使是未来量子计算机成为日用设备,文本文件依然可以与新的接口谈笑风生,甚至都不需要做什么存亡续绝的关键性工作。如同不腐不坏、无灾无妄的古卷,忠实地记录着每一段自己曾经过的历史,将时间的高墙颠覆为随意即可跨过的邻家门槛。相比之下呢?`.one`、 `.wpd` 和 `.dpr` 早就成了只能存放在赛博博物馆的文物,比楔形文字还难看懂。无人能看懂和解析的格式,和死了也没什么区别。 + +即使不说宏大命题,简单性和开放性也可以给日常使用带来无穷的便利。文本文件的版本管理可谓是 Git 的绝活,搜索的速度没人比得上 ripgrep。sd 帮你做正则替换,bat 让你匆匆一瞥就能心下了然。而各种编程语言可都是文本文件的后宫,如果会一点编程,你甚至可以完全定制自己的工作流,让系统的每个细节都如臂使指。这么看,拿专有格式、封闭生态去对抗文本,不啻于用一群人、一家公司的力量对抗几乎全部时代、全部范围的计算机科学。可能也只有巨头级别的公司,投入海量的资本,才能在某些方面胜天半子吧。 + +说实话,这么说完一段之后,小氯原本对文本的喜爱似乎更深了。颇有一种辩论赛本来对双方的观点都有认同,辩一场下来之后成了坚定的正方人 / 反方人的感觉。 + +无论如何,请允许这个无知的元素娘改编一下 [Yihong](https://github.com/yihong0618) 大佬的那句名言吧—— + +> People Die, but Long Live GitHub +> +> GitHub Falls, but Text Transcends + +(当然,以上的前提是处理好编码问题。毕竟 DOS 娘并不认识 UTF-8,各位 Unix-like 用户也不想看到搬到 Windows 之后自己的文件变成锟斤拷。此外,小氯也并不是说文本就是第一性和绝对的准则。比如说,如果你希望用文本放一首歌,那……小氯祝您好运。而且客观上说,有一些专有格式确实是比文本在某些方面的表现更佳。例如,对于复杂的办公文档(虽然不知道为什么办公文档会复杂),使用 MS Office 或者 OpenOffice 格式还是会比文本容易的。) \ No newline at end of file diff --git a/content/posts/人间世/岁时录/岁时录(十九).md b/content/posts/人间世/岁时录/岁时录(十九).md new file mode 100644 index 0000000..1a9694c --- /dev/null +++ b/content/posts/人间世/岁时录/岁时录(十九).md @@ -0,0 +1,265 @@ +--- +title: 岁时录(十九) +date: 2025-05-09 +slug: weekly-19 +featuredImage: https://img.viento.cc/cover/weekly-19-cover.webp +categories: + - 人间世 +tags: + - GoToSocial + - IndieWeb + - 大模型 + - 隐私保护 +series: 岁时录 +summary: 岁时录其十九 +description: 本文是作者周报的第十九期,分享了近期在技术实践与思考方面的一系列动态,包括在反复尝试后最终为GoToSocial服务“Spectral”选择了新的域名`spect.im`并完成部署的曲折过程,在MacBook Air上测试本地大语言模型Qwen3的体验与得失,服务器意外宕机后建立数据备份机制的经历,以及对于一种“自顶向下”、从具体兴趣项目出发构建技能树的理想化高等教育模式的深入思考,并提出了一个通过在域名下设置标准文件来实现统一网络头像的IndieAvatar构想。最后作者分享了近期最为核心的困扰:对过往残留数字足迹可能带来的隐私泄露风险感到焦虑,并详细剖析了更换一个全新ID以求彻底“干净”的利弊。作者对是否值得这样做深感纠结,并在文末真诚地向读者征询意见。 +wikilinks: true +lastmod: 2025-05-09 +--- + +各位老友,晚上好。这里是 Chlorine。在现实中亮着昏黄灯光的公共空间中,再写一点小小的东西。 + +各位老友应该也能看出来,这一期周报小氯写得有一点心不在焉。具体原因的话,您可以看最后面。 + +## GoToSocial + +小氯已经记不清这是小氯搭的第几个 GoToSocial 实例了,或许是第八个? + +### Why GoToSocial? + +小氯其实挺喜欢 \*Key 的。[^1]虽然说对于小氯来说功能有些冗余且过于二次元了,但是表情回复难道不 cool 吗? + +然而虽说小氯觉得它很酷,但小氯的 VPS 并不这么认为。整个 Key 系的资源占用半斤八两,总体而言可能需要预留 1.5~2 G 的空间,也就是我们需要一台单独的,配置在 2 G 或者 2.5 G 的服务器去承载它,这听上去还是有点恐怖的。哦,`Iceshrimp.NET` 除外,它的资源占用主要在于 PostgreSQL,本体极其轻量,总的占用和 Pleroma 差不多,只不过界面没那么好看。 + +此外,整个 Mastodon 系和 Key 系都有一个让小氯几乎无法忍受的缺点:运维困难。小氯说过,自己喜欢 Set and Forget 的东西。 + +那这么看,还是得选一点轻量级的选手。只不过吧,Snac2 实在是太过朴实了(它甚至没有数据库),而 Ktistec 大概还只能算是个半成品。说来说去,还是 GoToSocial 看起来最靠谱。反正小氯已经给 GoToSocial 写了个还不错的主题,展示界面看起来也不至于太难看。 + +具体的部署流程小氯不多说了,官方文档说得很明白。只是不知道为什么,`compose.yaml` 的配置不能被读取,只好全写成环境变量了。 + +### 瞎折腾 + +按照小氯之前的说法,自己希望把所有的社交服务聚合到同一个域名下。GoToSocial 也不例外,毕竟 `chlorine@eigen.im` 这个去中心化 ID 还是挺不错的。 + +在 `docker-compose.yml` 的环境变量中添加: + +```yaml +env: + GTS_HOST: gts.yourdomain.tld + GTS_ACCOUNT_DOMAIN: yourdomain.tld +``` + +然后主域名做好 301 就可以了。 + +本来事情到这里就可以结束了。Fedi 的各位老友可以非常顺畅地使用 `@chlorine@eigen.im` 来~~灌注~~关注小氯,和 Owu 的联合也很顺利。 + +然而!小氯在使用 PL-FE 的时候发现了一个让人很难受的事情:用户域名的显示还是 `gts.eigen.im`。各种 Key 也是同样的情况。这其实很合理,因为大部分的请求都是发往 `gts.eigen.im/api/xxx` 的。但是,看着是一顶一的难受,尤其是 `gts` 这个二级前缀看着毫无美感。 + +不过,使用主域名是不可能的,那么咱们就改一个更美观的 `HOST` 吧。例如 `space.eigen.im`,特征空间嘛,合理。 + +重启服务……好像哪里不太对劲?我怎么没办法关注 Owu 上的用户了? + +赶紧去翻官方文档,看到了这么一句: + +> You cannot change your domain layout after you've federated with someone. Servers are going to get confused and you'll need to convince the admin of every instance that's federated with you before to mess with their database to resolve it. It also requires regenerating the database on your side to create a new instance account and pair of encryption keys. + +其实从数据库里面也可以看到这一点,例如我们执行: + +```sql +SELECT * FROM instances; +``` + +可以看到表的结构中有两个字段:`domain` 和 `uri`,里面写的都是 `HOST`。如果你后期再更改,是要对方手动调数据库的。小氯在已经有联合的情况下改了后端 API 的域名,那不出问题才怪。 + +真是 JFK 坐敞篷车——乐死了。 + +那就趁着事情还没闹大,赶紧把 HOST 切回来吧。 + +这下倒是正常了,可是为什么用户变成两个了? + +这似乎也合理,毕竟 HOST 都不同了。 + +于是小氯把数据库下载了下来,开始复习 SQL。一顿 `DELETE` 之下,确实是把问题解决了——大体就是删以及删完之后查一下表的健康程度。然而最初的问题还是没有解决,在 Key 的世界里小氯还是要顶着这个很丑的 `gts` 后缀。 + +由于这是一个 what is done cannot be undone 的时代,因此 `eigen.im` 算是彻底和 `gts` 这个前缀绑定了。那么剩下的方法只有一种:转生。 + +然而这就不符合小氯「社交服务聚合化」的计划了,而且还需要多付一个域名的续费。 + +纠结了好久,最终不知道是什么促使小氯下定了决心,小氯在备份了旧的数据(备份是个好习惯)之后,毅然决然地买了一个新的域名——我重生了,这一世,我要拿回属于我的一切! + +新的域名是 `spect.im`(没错,又是 `.im`,这个后缀还挺不错的)。spect 是 Spectral 的缩写,这也是小氯的 GoToSocial 新的名字。 + +Spectral 的字面意思是「谱」,意为矩阵或者线性算子特征值的集合,当然也可以理解为物理或者化学中的谱,例如光谱和色谱。此外这个词好像还有幽灵的、飘忽不定的的意思,作为一个 GoToSocial 的名字似乎还挺不错的。 + +~~`sayso.im`:孩子们,我还能说什么呢?~~ + +总而言之,就是这样。这次小氯干脆也不搞什么分域部署了,直接用这个好看的域名当后缀。`docker-compose` 一把梭,启动,初始化,开始配置,开始联合,完事。 + +我用呆毛发誓绝对不再删库重来了!~~遇到更好的实现了除外~~。 + +总而言之,小氯终于是搭建了一个比较稳定的 GoToSocial 实例了。这个实例目前还在测试阶段,但是应该是不会轻易关停了 + +Spectral 目前运行在 LA US 机房的一台 1C2G 的 VPS 上,线路经过了优化,国内速度应该会不错。上面除了它还有一个 Bluesky PDS,但这个 PDS 大概率是要关了(Bluesky 不太对我胃口)。目前整台机器内存占用大概是一半,PDS 停了之后还能省下一些。这个配置别说 GoToSocial,跑一个 Akkoma 甚至是 Sharkey 都够了。 + +不过有一个问题:小氯当初是为了研究信息安全才拉来一个同学一起续费这台 VPS 的,但是发现其优化线路在校园网环境下效果不明显,那这个性价比可就不高了。所以等到这台服务器过期之后,Spectral 大概率是要做一次迁移的。可能会搬到小氯的 RackNerd ~~电子垃圾~~上,最好的选择应该是搬到 Hetzner 的欧洲区服务器,有 GDPR 嘛——前提是我能注册成功。 + +## 本地化大模型 + +本地化大模型应该不算是一个新话题了,从开源的对话大模型出现(比如 LLaMA 和 ChatGLM)就有大神尝试着在自己的电脑上部署大模型。这样做的优点很明显:所有的权重、过程和交互都在本地,可以完全离线使用,隐私性和安全性比云端模型高了几个数量级,而且几乎没有跑路风险。缺点则是除此以外:你需要比较好的硬件配置(CPU,显卡和内存),同时本地大模型的性能和智力通常都不如云端的模型(废话,你想用你的电脑去对抗一台砸了好几万甚至十几万的服务器吗)。 + +小氯也试过用 [Ollama](https://ollama.com) 部署一些本地模型,比如当时似乎试过 LLaMA 3.1 中文微调版和 Gemma 2。结果嘛……不得不说是不得不说了。 + +> 你说 9.11 比 9.7 大我能理解为你在说版本号,可你说鲁迅和周树人既是师生又是父子还是兄弟是否有些太过分了? + +从此小氯放弃了在自己心爱的 MacBook Air 部署本地大模型,每天幻想着买一台 Intel I9 + RTX 4090 的家用服务器跑最好的开源大模型(~~DeepSeek-R1:嗯~~)。众所周知,幻想本身也是能够狠狠满足自己的 (/ω\) + +直到前几天在 Fedi 乱逛的时候看到了[寒寒](https://social.a2x.pub/@alikia)的帖子,发现…… + +> 这个 Qwen3 1.7B 似乎还挺拟人的? + +Qwen(通义千问)也算是国产开源大模型的老朋友了,而且应该算是里面做得比较好的(最好的大概是 DeepSeek 大将军,然后就是千问和 ChatGLM 它们了)。虽然说小氯不太喜欢牢巴,但是显然也不能把对公司的态度代入具体的开源产品上。 + +对于 Qwen3 的话,小氯在一个 Demo 里试过最大参数的 Qwen3 235B A22B,给人的感觉大概是「一股 DeepSeek 味」,不知道是不是训练的数据重合太多了。不过很多推理模型都是这个毛病,也不能说就是什么大的缺点。 + +这么胡思乱想着,才发现自己已经打开 Ollama 的搜索界面了。小氯自己推测,电脑的配置跑一个 8B 应该是绰绰有余的,14B 可能有点慢,但应该也可以。那我们先从 8B 试一下吧。 + +```bash +ollama pull qwen3 # 默认就是 8B 的 +``` + +8B 大概 5 G 多,也不算大。`pull` 完就可以 `run` 了。跑了几个问题发现最多只能说是差强人意,于是又 `pull` 了 14B 的。 + +14B 的模型有 9 G 多,从虚拟网卡的日志看是托管在 Cloudflare R2 上。不过注意:**此处最好不要用优选**。 + +### 拟人测试 + +这里放一个比较正常(指我问的问题)的结果吧,~~放心,没有猫娘~~。 + +Q:用轻松幽默的口吻简要介绍凯恩斯和哈耶克的经济学论战。 + +A:凯恩斯和哈耶克这对经济学界的"双胞胎兄弟",堪称经济学界的"相爱相杀"天花板。凯恩斯像一位总在派发优惠券的店长,认为经济低迷时政府该出手,用基建、发钱、降利率等"魔法"让市场重新热络;哈耶克则像一位坚持不打折的老板,坚信市场就像一锅正在沸腾的汤,政府乱插手只会让汤汁溢出来,反而让经济"咕嘟咕嘟"地崩盘。 + +这场论战本质是"政府该当导演还是观众"的终极辩论:凯恩斯说"市场需要导演手把手教",哈耶克说"市场是自洽的交响乐,别总插手打节拍"。两人观点就像外卖平台和传统餐馆的较量——一个是送餐机器人(政府干预),一个是等客上门的老板(自由市场),谁更懂消费者(经济)的真正需求? + +最终这场"经济学武林大会"没有胜负,反而让后世经济学家们学会了"左手凯恩斯主义,右手哈耶克主义"的平衡术——毕竟在现实世界里,既要防止经济"过冷",也要警惕"过热"的泡沫,这大概就是经济学界的"中庸之道"吧! + +总体速度还过得去,一秒几个到十几个中文字吧。不过首个 token 一如既往地很慢。 + +再使用同样的问题问一下 14B 版本,得到的回答是这样的(内容基本没有调,只改了下格式方便显示): + +A:好的!让我们来一场经济学界的世纪大戏——凯恩斯 vs 哈耶克,两位经济学界的“老冤家”,用一场关于“该不该让政府插手经济”的论战,把经济学变成了“现实版权力的游戏”。 + +**凯恩斯**(John Maynard Keynes):这位英国“经济急救医生”信奉一句话:“**当经济感冒时,政府该打针**。”他主张:经济危机就像发烧,政府要立刻出手——大搞基建、发钱、借钱,用“财政刺激”让经济回暖。他坚信“**短期痛苦,长期快乐**”,甚至说“**通货膨胀比失业更可怕**”(虽然后来他的理论被证明在某些情况下确实有效)。 + +**哈耶克**(Friedrich Hayek):这位奥地利“自由市场卫士”则怒吼:“**别碰市场!它不是一锅汤,是精密的钟表!**”他坚信:政府干预就像让一群外行修钟表,结果只会越修越乱。他警告“**计划经济会导致信息失灵**”,甚至预言“**通往奴役之路**”(别误会,他不是说政府会直接抓人,而是说过度干预会让经济失去活力)。 + +**论战高潮**:1930年代大萧条时,凯恩斯的理论成了“经济急救包”,而哈耶克则像“自由市场苦行僧”,坚持“**让市场自己舔伤口**”。后来,凯恩斯的理论在战后大放异彩(比如美国的“罗斯福新政”),但哈耶克的警告在2008年金融危机时被重新翻出来——“**政府救市,可能救的是泡沫**”。 + +**现实版结局**:如今的经济学界,像“左右手打架”——凯恩斯的“政府出手”和哈耶克的“自由市场”成了政策工具箱里的“双刃剑”。比如:**疫情期间,政府发钱(凯恩斯风)**,但**长期高通胀时,又得靠市场调节(哈耶克风)**。总之,这场论战就像经济学界的“辩论赛”,吵了100年,现在还在继续——毕竟,**谁说得对?可能得看经济“感冒”有多严重**。 + +**总结**: + +凯恩斯:**“救救经济,别让市场饿死。”** +哈耶克:**“别救,让市场自己活过来。”** +而我们:**“快点,别吵了,我钱包在哭。”** 😂 + +明显比 8B 更拟人一些,虽然有些措辞并不准确甚至有错误(别的不说……罗斯福新政是在战后吗?!)。速度的话,在终端单轮对话的时候二者意外地差不多,但是在 Cherry Studio 里面做多轮对话的时候 8B 明显更快。 + +至于具体是 Cherry Studio 的问题还是模型本身的问题,我倾向于是前者。虽然我还没做完整的实验,但 Cherry Studio 的速度比在终端里慢了不止一点, + +### 硬件负担问题 + +好像问题不太大,后台生成的时候正常开浏览器上网、开 IINA 听歌和写博客都没问题(指没有明显的卡顿现象),只是电脑有点温暖——说实话,小氯用了这么久的 MacBook,头一次看到自己的电脑这么明显地变温暖…… + +### TL; DR + +~~论 TL; DR 为什么要放到最后面~~ + +- Qwen3 做得还算不错,对于简单的任务是够用的,但目前还是没法和云端大模型比。 +- 硬件要求不太高,M2 + 16 GB 的 UAM 应该差不多,但如果是 8 GB 的 UAM 估计就很难了。 + +## 宕机与备份 + +这事说起来很无厘头,就是小氯闲着没事想看看自己 `spect.im` 的主界面,然后发现加载错误了。 + +这一般是被墙了的标志,于是小氯换了个网络再看一眼……这怎么还是进不去? + +这就很罕见了。再看看自己魔法猫咪,这台服务器显示 Timeout 了。断网重连,没有作用。 + +更奇怪了。SSH 上去看一下……Connection Closed? + +坏了,这八成是服务器本身出问题了。去服务商官方的控制台看一下……好家伙,522。 + +小氯当时就不淡定了:这该不会是跑路了吧? + +先不管钱的事情,小氯的 GoToSocial 实例数据还在上面呢——我甚至没做备份。~~对自己的服务依赖稳定性过于有信心然后惨遭教♀育的小氯酱~~。不过仔细想想,就算跑路了,不也应该提前发个通告吗?那么只剩下了一种可能:机房出现了不可抗力故障。 + +这一点是暂时无法亲自确认的,于是小氯去 NodeSeek 逛了一下,发现不少网友反映自己的 VPS 断联了。再仔细看看,大概情况是机房不知道为什么断电了。如果是机房断电了,那应该还好,毕竟按照现代服务商和系统的鲁棒性,就算再不济,断电保护应该还是有的。只要不像某服务商火灾之后直接扔给用户一台全新的服务器就行(~~RackNerd:阿嚏~~)。 + +那就等着吧。大概等到一两点钟的时候,上去看了一下,已经恢复了,数据还在。 + +不过经此一役,小氯也是不敢再 RAID -1 了。赶紧写了个脚本,把数据每几天打包备份到 R2 一份。由于不太了解 SQLite 怎么消除竞争与冒险问题(~~数电学多了~~),所以采用了最粗暴的方法:备份之前 docker-compose 停掉,备份后再打开。数据用 GPG 加好密,也不怕放到第三方去。 + +## 自顶向下的学习 + +我不太知道这种方式到底应该叫「自顶向下」还是「自底向上」,或许「从具体到抽象」是个比较好的叫法——但也没那么好,因为我们所需要的东西其实并不抽象。 + +具体些说吧。例如小氯有一天突发奇想,要做一个课题:《从某国际事件的网络舆情变化分析官方策动在现代互联网民心中的作用》。具体是什么国际事件我们姑且不提,不过研究方法大体一致。 + +小氯不太懂互联网传播学和政治学,不过我们也能拼凑一个大概的研究过程:先获取足够的舆论数据,清洗、整理、分析后得到一个直观的趋势,然后结合外部信息进行分析并总结出一般规律。 + +当然,这个步骤无异于如何把大象装进冰箱。那我们来看看,一个「外行」,要学习什么技术才能把这个自己感兴趣的话题做成一篇可以发表的「论文」。 + +获取数据这一步,直观来看应该没有现成的数据集可用,需要自己爬,那就需要爬虫技术。那么,我们就需要先知道什么是爬虫,以及学习相关的语言,比如说 Python,然后动手写或者是直接复用和改进已有的爬虫。而获取到数据后,我们还需要把这些数据整理为我们便于处理的格式(例如纯文本),粗略洗去其中「脏」的部分(例如无意义的占位符),然后整理为一个有序的、便于 AI 进行「阅读」的格式。下面就需要对舆情数据进行分析,例如将其倾向打一个标签之类的,这涉及到情感识别等领域的内容。然后我们还需要把结果整理为一个 human-friendly 的形式。此外,我们还需要搜集一些和我们研究的因素有关的事件,这可能是外交的或者官方媒体的或者是什么别的。下面的事情就是政治学和传播学大放异彩的时候了,这部分可以交给我们研究这些领域的朋友,如果我们的通识教育足够的话,甚至自己上也可以…… + +好的,那么现在我们已经获得了丰硕的研究成果。如果我们做得足够认真且运气足够好,甚至可以得出一些有开创性的结论,而不是仅仅做一点分析总结。下面就需要把这些文字转化为论文了。这当然需要基础性的学术写作训练,以及对于论文投稿流程的了解——这个过程比你想的要复杂,最好能有一位前辈,例如导师或者学长学姐来指引一二。此外,涉及到的其他工具,例如 Word,LaTeX,Typst 以及 Git 和 Zotero 一类我们就不多提了。 + +很好,现在你已经有了一个明确的、自己感兴趣的目标,以及小氯为你勾勒出的(虽然不太严谨的)完整的技能树。现在从一个离你最近的点开始,把这棵树一点点点满吧。感觉很多吗?当然是这样的,毕竟你是在做学术,是在做一件改变世界的事情。只需要记住三样东西:你最初对这个目标的热忱,规划好的技能树,以及在你踏上旅程之前学的那些被称为「基础课程」和「通识教育」的东西。这样,即使你最后发现自己已经没有必要做这个课题了,你也已经向着合格的学者或者工程师迈出了坚实的一步。 + +各位老友,这就是小氯眼中,高等教育最理想的形态。 + +并不是带着你,按照某条轨迹,走过一个领域小径分叉的花园,而是在留下几个基本的节点后,将一切交予你。如同突触中神经递质的传递,或是电路板衔接处亮起的火花。思想在有意无意的探索中扩展、延伸、卷曲、纠缠,不断扩大自己芝诺的圆。若是看到了哪一个走不动路的点,便停下,深挖,直到触摸到铁矿、化石或者岩浆。如是这般,建起一座巍峨的地下城市,如同森林中菌丝相连的精致与复杂,亦有不可见底的锚点,让阳光直到古登堡界面。 + +这种方式或许可以叫「自顶向下」,或许可以叫「T 型人才培养」,或许可以叫「学研结合」,或许也可以叫别的名字。这种思想有过许多实践,也取得了一定的成果。只不过,由于资源、人的惰性等各种现实因素,其还难以在现代高等教育中很好地铺开罢了。不过小氯依然觉得,如果我们希望培养「乐于探索、思维先进的终身学习者」,这或许可以是个好的思路,尤其是对于跨学科的学生而言,他们更需要这样的探索和融合空间——学科交叉大概可以算是现代学界和业界研究的必然趋势了,而多一些领域的知识——即使并没有那么直接地「交叉」,也可以让我们在思考问题的时候多一些角度。毕竟,一个不会画画的保险箱破坏者不是擅长打鼓的物理学家,您说是吧,费曼先生? + +## IndieAvatar + +这是我突然有的一个想法,但我认为值得记录一下。 + +事情大概是这样的:众所周知,IndieWeb 运动的一个核心是:Domain is identity,你的域名就是你的网络身份。而得益于什么都能装的 `.well-known` 路径,我们可以把自己的各种乱七八糟的身份,从 Mastodon 到 Matrix 都放在这下面。那么头像为什么不可以呢? + +例如我们可以在 `.well-known/avatar` 放一个这个东西: + +```json +{ + "url": "https://img.mys3.com/path/to/your/avatar.suffix", + "alt": "My best avatar forever!" +} +``` + +然后希望获取你的头像时,只需要查找你的域名下的这个文件,把里面的 URL 拎出来就行了。什么时候想换头像了,改一下 URL 字段就完事。这样在不同的社交平台上——例如,Fediverse,Bluesky,Fedi-Forge,乃至各个符合 IndieWeb 的网站的评论区,我们只要放置自己的域名,就可以有统一的视觉形象。 + +当然,如果真的要把这个主意变成一个标准的话,还是有很多工作要做的——我们需要制定一个完整的 JSON 文件规范,需要提供易于使用的 SDK 和 API,最重要的是,需要有人来用。这大概会是一个漫长的工作,不过我可能暂时没精力去做它了。 + +## 我应该换个 ID 吗? + +这个问题显得很无厘头,特别是我在不算很久以前,还认认真真地写过一篇讨论昵称和自我认同的[[小氯,Chlorine抑或我|文章]]。 + +好吧,事情要从小氯的前几天的「大清洗」说起。在处理了一大批个人信息后,小氯大致是放心了几天,不过几乎就是字面意思的几天而已。由于小氯过去在隐私保护方面经验的缺少,之前留下的数字足迹不算少。虽然小氯已经清除了其中的大部分,但「信息不可逆定律」(或者我们可以换一个更通俗的说法:覆水难收)教育我们:只要信息传播出去了,就必然留下可追溯的痕迹。 + +平心而论,这样的遗留威胁在客观上不算太大。因为小氯只是个在互联网的冷僻角落种花种草的元素娘,而且也并不写敏感内容,所以说担心大型的社会工程学攻击(这里说是社工学攻击其实不太准确,大家理解这个意思即可)或者国家级检查意义不大。我也不算太过在意让一些可靠的老友们知道适量的我的身份信息。而剩下的读者中,一般的好奇者 / 社工学黑客大概百不存一,而这些人大概也几乎都不愿意闲着没事来针对小氯。而且,小氯已经做好了很多防护措施(~~防盒掩体~~)。退一万步说,就算真的被盒出来一些东西,也不会有什么实质性威胁——小氯说过,咱从不惹事,最多只是有点尴尬罢了。 + +但是一个显而易见的事实是:对于小氯目前所能考虑的最高的威胁等级来说,现在的防护还是有点不够。这给小氯带来了很大的心理压力。而如果要尽可能干净地解决这个问题,唯一的方法大概就是**换个 ID**。 + +如果换一个 ID 的话,那大概率就是真的「重新开始」了——不是像刚刚使用 Chlorine 这个昵称的时候,只是把站点简介改了一遍。小氯倒是并不惧怕重新开始——虽然这意味着抛弃掉现在的人设、形象、社交账户。甚至 SEO 也没问题——咱也不是没重新来过。最重要的是——我的文章,那些用「日光,热茶和位流」写下的数十万的文字,我也必须永远地将它们收好在自己的抽屉中,连提及它们都不可以。我唯一能保留的,也就只有记忆了。 + +此外,我也不能将自己的园子重定向到自己新的小岛,也不能大张旗鼓地告诉自己的老友们:我换马甲了,新的马甲是 XXX(这样等于前功尽弃)。我过往建立的所有线上社交联系都将断绝,即使再有缘在互联网见到过去的老友们,也只能小心翼翼地打个招呼,而不能提及「还记得我们在园子里喝过的那壶果茶吗」。 + +**这样值得吗**? + +于是我就被这样一个问题困扰了一个星期,连周报都写得心不在焉的。 + +所以……我希望听听各位老友的意见。如果您有自己的见解,烦请您一定一定要告诉小氯——评论或者邮箱或者别的什么都可以。~~说实话,我感觉我像个幼稚的小孩子,在转着圈地要别人在自己的笔记本上签名~~。[^2] + +[^1]: \*Key 或者 Key 系是我常用的简称,指的是 Misskey 及其衍生出的一系列 Fedi 实现,比如 Firefish、Iceshrimp 和 Sharkey。它们彼此间的互联程度很高,但是和 Mastodon 系之间存在比较大的差异。 +[^2]: 这是一种比较少见的风俗,大概作用类似于百家衣。小氯很小的时候曾经尝试过。 \ No newline at end of file diff --git a/content/posts/人间世/岁时录/岁时录(十五).md b/content/posts/人间世/岁时录/岁时录(十五).md new file mode 100644 index 0000000..0ec52b0 --- /dev/null +++ b/content/posts/人间世/岁时录/岁时录(十五).md @@ -0,0 +1,223 @@ +--- +title: 岁时录(十五) +date: 2025-02-23 +slug: weekly-15 +featuredImage: https://img.viento.cc/cover/weekly-15-cover.webp +categories: + - 人间世 +tags: + - Rime + - Memos + - OpenPGP + - 数据安全 +series: 岁时录 +summary: 第十五期……也是第一期 OωO +description: 本文是作者周报《岁时录》的第十五期。作者首先说明了周报的更名事宜,随后详述了深夜乘廉价航班返校的经历。面对新学期高达40学分的学业压力,作者通过策略性退课将学分调整至25分左右,着重保留相对轻松的经济金融类课程。技术探索部分涉及输入法升级至白霜拼音方案、从全拼转向小鹤双拼的学习历程,以及重启Memos碎片化记录系统的尝试。在密码学实践方面,作者重构了GPG密钥体系,采用主密钥与功能子密钥分离的架构,并反思了过度工程化带来的时间损耗。针对苹果公司计划引入国内厂商合作的系统级AI功能,作者表达了强烈隐私忧虑,认为本地化加密与开源方案才是可信的技术承诺。全文贯穿对校园生活与技术偏好的双重记录,既呈现了理工科学子的课业重负,也展现了数字原住民在工具选择与隐私保护方面的执着态度。 +wikilinks: true +--- + +各位老友,晚上好。这里是 Chlorine。随着小氯回到学校,开启新一轮的~~坐牢~~学习,园子的周报恢复更新~ + +~~所以你放假和不更新周报之间有什么因果关系吗~~ + +首先呢,小氯要宣布一个消息。从第十五期开始,园子的周报,过去的「浮生散记」/「Ephemeralis Weekly」正式更名为《岁时录》。至于新名字的来历……大抵是没什么来历的,只是一个代表时节更迭的词罢了。 + +当然,为表纪念,一至十四期依然保留原本的名字。 + +~~本来这个消息要在年终总结发出的,但是年终总结被小氯鸽了(悲)~~ + +--- + +您正在阅读园子的周报——《岁时录》的第十五篇,日期范围为 2025 年 2 月 14 日至 2025 年 2 月 23 日。这是园子的不完全定期刊物,会记录一些小氯和园子在这段时间的经历,以及或有或无的思考。这是从主世界的时间中引出的一条细小的支流,也是这个网络空间中的小岛的编年史。 + +祝食用愉快。 + +## 夜に浮かぶ + +本节标题来自我很喜欢的一首歌。 + +事情呢,是这样的:我们的学期注册终止于 2 月 16 日,17 日就要正式开始上课了,于是小氯打算在 13 ~ 15 号回学校,提前料理一些新学期的事情。在考查了半天之后,小氯发现从所在城市的机场出发到学校的机票异常廉价,价格甚至低于用时更长的高铁,于是欣然出手。 + +只不过这趟飞机有一个小缺陷——它是晚上出发的,到达时要半夜。嗯,也好,丰富一下人生体验。不过小氯不敢保证校门在这个时间段还开着,于是提前订了一家机场附近的民宿,打算睡一觉再回学校。 + +登机的过程呢,没什么太多好说的。小氯家乡的机场是个很小很小的地方,小到登机口的数量一只手就能数得过来,自然也不会遇到像深圳宝安那样的室内长途定向越野(误)。而且,小氯到得极早,提前了差不多一个小时。在等飞机时,小氯还遇到了一位在飞行员班的同学,很愉快地聊了一会儿。 + +所以……小氯正在七千二百米的空中,经济舱的阅读灯昏黄的光线下,一点点地敲出这些文字。 + +我的影子正以上百公里的时速掠过沉睡的华北平原,透过狭小的窗户,下方的灯火像是在乐高积木的大地上自我繁衍蔓延的发光菌群。 + +或许对于地面上的许多人而言,这是我一生离他们最近的一次。 + +后面的故事就乏善可陈了。这次飞机的飞行时间只有两到三小时,小氯还没敲几个字就降落了,甚至还比预想的提前了半个多小时。 + +然后呢……在只有大床的「精品大床房」里面睡一觉,然后打一辆顺风车,回到已经颇为熟悉的地方。 + +——这里本来有一段长长的其他内容的,让小氯反反复复改了好多次。 + +我甚至试图用 DeepSeek 帮我改一下,但我还是放弃了。一方面是不喜欢直接把 AI 写的东西放到园子里(我一般用 AI 快速了解或者聚合一些信息),另一方面,以 DeepSeek 的水准,写出来的东西大抵会非常优美且富有感情,这和小氯的零零碎碎点点滴滴又有点入机的风格很不符。 + +所以,那段大概可以升华整个部分的文字被小氯删掉了。这里是它的墓碑。 + +## 核善の课程 + +在上学期的《高等信息经济学与应用博弈论》(俗称选课)中,小氯为了保底,把所有能塞进去的课都塞了一遍。结果由于博弈策略设计得太过出色(大嘘),最后只掉了一门课。搞笑的是,这门候补的课——一门非常热门的课,在我没有做任何操作的情况下被自然递补上去了,而提前离开的同学们却没能拿到课程的名额。 + +> 《等等党大胜利》 + +然后再加上小氯为了调整策略加上的课,小氯的总学分在某个时刻达到了惊人的 40 分( + +![wtf-your-courses|325](https://img.viento.cc/20250223-wtf-your-courses.avif "学姐の震惊") + +根据我校培养方案的一贯抽象,这学期的课也都不是什么善茬,就一个数电就足够受的了(为什么小氯一个 End User 要学硬件啊喂),更何况还有网原概统大物人智导社分树蛙金科密码学公金心概中宏计量货银毛概习概(~~仙之人兮列如麻啊~~)以及小氯自己打的工。如果让小氯把这些所有的课都吃掉,那属实是……除非是某些变态就想看小氯酱坏掉(大误)。 + +所以小氯退掉了其中十多学分的课,剩下了二十五到二十七左右,同时提高了里面人文和经济方面专业课的比例。从小氯的经验来看,文科方面的课比 CS 和数学简单许多(~~DSA:孩子们没错是这样的~~),即使是文科专业课难度的巅峰——公金(公司金融),和 CS 牢九门(牢数,牢系,牢操,牢网,牢组,牢软,牢电,牢物,牢算)等一众旧日支配者相比还是太慈眉善目了。 + +## 清理草稿 + +似乎大概也许好像……小氯[[孩子们,我回来了!(2)|说过]]假期要爆更来着?不过从结果上看,显然既没爆也没更,除了一篇水得离谱的开发日志和一篇莫名其妙的碎碎念之外什么都没更出来,就连年终总结兼园子一周年庆典都被鸽掉了(悲)。 + +不过说小氯什么都没干也不对,既然一个假期几乎什么都没学,那么证明小氯一定在摆烂方面大有成就(顶锅盖遁走)。现在的草稿箱里面已经躺了若干基本成型的稿子了,这一周水的几篇就是其中的一部分。 + +不过,写作这个东西时效性很强:如果你没有及时抓住灵感并且将其扩充到一个不会自然消散的长度,那么恭喜你,你大概率是要与它永别了。小氯在打开 Obsidian 想写点东西的时候,也经常看着自己的灵感速记本上面的东西直龇牙,完全想不到自己当时是怎么想到这些奇怪的文字组合的。 + +不过……客观上来说,这一周小氯确实更得不少对吧(乐)。或许这就是经常听人说的,只有在你忙碌时,闲暇才成为闲暇。 + +## Hello,Rime Frost + +其实这部分已经鸽了若干年了,是原本的第十五期周报的草稿的内容,一点也不周报(~~新闻的时效性——初中语文~~)。 + +小氯大概一年前切换到 Rime 输入法,具体来说是鼠须管(Squirrel)。当时用的预设方案是雾凇拼音(rime-ice)。 + +{{< github repo="iDvel/rime-ice" >}} + +雾凇拼音无疑是非常出色且全面的配置方案,社区也对其给予了高度认可——雾凇拼音在 GitHub 上的 star 数已经超过一万,远远超出了 Rime 本体和中州韵、小狼毫、鼠须管三大输入法。 + +最近我发现了雾凇的一个变体:白霜(rime-frost)。其实也可以翻译为 rime-rime,毕竟 rime 本来就是霜的意思(笑)。 + +{{< github repo="gaboolic/rime-frost" >}} + +在概述界面,作者 gaboolic 高调地宣称: + +> 白霜词库是目前rime方案下最好的开源词库,立志于打造不输于商业输入法的输入体验。 + +好!很有精神!(Doge) + +实际体验一下之后感觉确实还不错,比雾凇拼音多了很多不常见但是对小氯有用的词汇,对于输入长词也比较友好。以及一些小功能,例如斜杠命令。 + +白霜拼音和雾凇拼音的兼容性相当高,而且由于小氯本身也没做什么太多的自定义,迁移起来也不麻烦。大致就是以下步骤: + +- 备份原本的配置文件夹 +- 导入 rime-frost 的源代码 +- 导入自定义词典、各种 `.custom.yaml` 和 `custom_phrase.txt` +- 挂载自定义词典 +- 将 `rime_ice.userdb` 重命名为 `rime_frost.userdb` +- 重新部署 + +作者也是相当具有雄心壮志,TODO 里面有一大堆非常吸引人的计划,甚至包括「训练一个智能语言模型」。如果能做到本地化,同时做好足够的加密措施,那就是神器级别的功能了。小小地期待一下。 + +此外,小氯还顺便换了一个更新的玩具。具体内容……请看下一节。 + +## 小鹤双拼 + +没错,真香定律还在发力(悲)。 + +小氯一直是个全拼党,键盘噼里啪啦敲得飞起,虽说之前对小鹤双拼也算略有耳闻,但是一直没有尝试。直到小氯下定决心把讯飞输入法撵出了 iPhone,全面启用 Hamster 后,那个古老的问题一直在困扰我——Rime 全拼在手机端的体验极差,强制 26 键和无纠错在 iPhone 15 Pro 小小的屏幕上简直就是噩梦。这种情况下,双拼的表现明显优于全拼,毕竟每次打字都只需要击打两次键盘。 + +此外,小氯的娘亲非常擅长五笔输入。每当小氯去问娘亲「用了这么久的五笔,会不会想着换成全拼」时,她总是摇头,表示五笔很好。「刚开始的时候需要背词根,但是后来就快了。」那么,小鹤音形的键位会比五笔的词根还难吗?我不这么认为。一个很简单的事实:五笔的词根有一百三十个上下,还有取大优先、兼顾直观、能连不拆等一堆复杂的规则,而不管是小鹤音形还是自然码还是别的什么方案,也就只有二十个左右的映射(当然,简单总是有代价的——双拼的上限肯定比全拼高,但还是比不上五笔)。 + +于是,在一个平平无奇的要赶早八的早上,睡眼惺忪的小氯打开了 Hamster,把首选输入方案切换为了小鹤双拼。 + +这自然不是什么容易的事。由于小氯并不喜欢在 MacBook 的键盘上贴什么键盘膜,因此能依靠的只有那个著名的「秋闱软月云舒翅」口诀和自己的记忆力。小氯的方法也很简单,就是一力降十会——把 MacBook 和 iOS 的默认输入法都改成双拼,逼着自己反复练习。感觉小氯学很多东西都用的是这种策略啊。 + +不过小鹤还算是好上手,小氯刚刚开始用双拼几个小时,打字卡顿的情况已经不太多了;大概二十天以后,打字速度就接近了原本的水平;现在差不多两个半月,再也不打算回全拼了。 + +## 重启 Memos + +Memos 大家都很熟悉了,一个让人又爱又恨的家伙。爱是因为这个软件确实解决了许多老友随时记录闪念的痛点,恨是因为 Memos 的开发者实在是太抽象了,几乎把 Memos 当作了自己练手的项目,API 的 BREAKING CHANGE 说来就来,每次升级都有一大堆的 Bug,对社区的许多建设性意见也置之不理。所以就出现了一种奇异的情况:Memos 依然在卖力地更新,但是大量的用户都选择锁定在一个较旧且稳定的版本(~~牢软:在想我的事?~~)。[浪子老友](https://blog.memos.ee/archives/227.html?scroll=comment-255)推荐的是 `0.18.1` 和 `0.14.4`,[杜老师](https://dusays.com)推荐的是 `0.21.0`,[木木大佬](https://immmmm.com)则锁在 `0.18.2`。 + +小氯对这种开发模式并不赞同,又由于虚拟机在校内离谱的连接状况,小氯时常会连不上自己的 Memos。再加之记录需求不多,干脆把实例停了。反正数据就在虚拟机里面搁着,也丢不了。 + +不过呢,最近看到了 [Nelson 老友的有趣文章](https://blog.bosswnx.xyz/2025/joy-moments-0),小氯感觉这种记录生活中小确幸的方法似乎对于活下来颇有裨益。而 Memos 确实适合做这个。于是小氯把 Memos 重开了,用的是 `0.18.2`,可能偶尔会换到 `0.18.1`,反正这两个版本也没有破坏性更新。不过,校园网嘛,你懂的。MacBook 上小氯可以修改 host 文件直接用 Tailscale 的虚拟内网去连接,而 iPhone 只好凑合用了(悲)。 + +或许比较合适的方法是自己在校内建一个小主机,或者是买一台比较注重隐私的服务商的 VPS。一般来说 GDPR 辖区的情况能稍好一点,比如德国的 Hetzner 或者冰岛的 1984 Hosting。在 VPS 上做技术隐私比较费劲,除非全盘加密。 + +### Alternative + +#### Flomo + +很好很稳定的产品……闭源的,SaaS 的,谢谢。 + +#### Fediverse + +Fedi 本质是一个社交平台,虽然可以通过私有嘟文来保证不可见性,但是其毕竟不是做这个的。而且,把自己私密的想法放到一个「公开性质」的平台,会让我感觉很不安全(小氯真是个奇怪的人啊)。 + +#### Moments + +[清扬老友的推荐](https://blog.liushen.fun/posts/8338183a/)。看着酷似 VX Moments。不过这个东西更接近单机社交而不是碎片化笔记,那还不如 Fedi 呢。 + +#### Blinko + +源码[在这里](https://github.com/blinko-space/blinko)。 + +很新的一个小东西,用得应该是 Next。相当好看,功能极多(甚至多到有点花哨了)。不过没有手机 App(虽然说可以 PWA,但是原生的毕竟更好),以及,小氯有 PostgreSQL 恐惧症 (/ω\) + +不过,经过小氯的测试,Blinko(网站加 PostgreSQL)的资源占用也算不得特别高,和 Bluesky 的 PDS 差不多,一般的服务器应该完全可以承受。 + +#### my-flomo-server + +源码[在这里](https://github.com/jerryshell/my-flomo-server)。没有看到预览效果,不过推测和 Flomo 接近。 + +……话说大家到底为什么这么喜欢 PostgreSQL 啊?! + +## GPG Key 的调整 + +准确来说,这东西应该叫 OpenPGP Key,或者是 OpenPGP Key Set。因为 OpenPGP 是一个协议,而 GPG 是其的一种(最流行的)实现。 + +小氯之前不太懂 GPG,创建了一大堆密钥。由于最近的《现代密码学》课程以及对 CypherPunk 的兴趣,小氯开始琢磨着把密钥归拢归拢,这也符合最佳实践。 + +归拢密钥不难,小氯很快把原本的 SC - E 密钥拆成了 C-S-A-E 结构。[^1]不过在处理 Git 密钥时,小氯遇到了点问题。 + +具体来说,小氯原本是使用一个单独的主密钥给 Git 提交签名的,但是这样疑似有点不太好,因为 GPG 的最佳实践其实是一个绝对隐私的主密钥 + 若干个日用子密钥。小氯的理解是:一个 OpenPGP Key Set,就是一个身份。如果你希望你做某件事的身份和原本是泾渭分明的,那么就加一个新的 Set。那么小氯现在的各个用途代表的身份需要分开吗?显然不需要。 + +从职责分离的角度看,最好的方案应该是在主密钥下单独创建一个新的签名子密钥。这样不是不行,但是分不清哪个是哪个还好说,GPG Agent 经常弄不清用哪个子密钥签名,手动指定也没用,这样交叉污染还不如只用一个子密钥呢。 + +小氯一直是个很内耗的人,这件事几乎内耗了我一天的大好时光。然后,在即将睡觉的时候,小氯实在是忍不了了。 + +再加一个密钥,其实收到的安全收益也就那么多,而且还要管理不同的密钥、配置不同的程序,累也累似了。而且,小氯并没有在什么高密级的单位,例如区块链金融机构、高级别的密码学研究中心或者是政府机关工作,也并不是记者或者活动家这类高风险的、需要匿名的职业。那么现在的结构,其实已经足够用了。如果后续能把主密钥移动到 YubiKey 之类的安全硬件,甚至已经足够用很久了。 + +所以就这样吧: + +```txt +主密钥 C +签名子密钥(文件,邮件,git提交等各种签名) S +加密子密钥(邮件,文件等) E +身份验证子密钥(ssh 等) A +``` + +问题解决。睡觉。起来,开开心心地去上课。 + +所以,诸位老友不要学小氯。有什么事,痛快做个决定,才能不耽误睡觉 (/ω\) + +……哦,说到 GPG,小氯最近还做了点小事:把 GPG Suite 扬了。 + +老早就看这家伙不顺眼了,加了一大堆启动项,源码只给一个压缩包,更新那么慢,还带一个不紫柚的 GPG Mail。当然 GPG Suite 这么做没有任何问题,无可非议,但是这很不对小氯的胃口。 + +扬了之后也没什么大问题,就是右键快速操作和图形化界面不能用了而已。小氯在琢磨着写几个 Shortcuts 替代掉那些快速操作。 + +## Apple Intelligence? + +这是之前牢果宣布的一个计划,简单来说就是给设备接入系统级 AI。在小氯看来,系统级 AI 这个主意本身没问题。因为在小氯眼中,AI 和电力、计算机一样,都是一种革命性的基础设施。电力驱动的机械宣告了人类体能的落伍,计算机则接替了复杂的计算工作,AI 做的,只不过是把一些原本需要人类情感和创造力的活动接管了而已。虽说听上去比前两者严重亿点,但是倒也不必当作洪水猛兽,毕竟你不能说人们不爱走路了所以要禁止汽车。如果我们能做到在保护用户隐私的同时,把 AI 功能成功整合到系统的某些操作中,倒也不失为一个有用的助力。 + +……不过做起来可没那么容易。 + +如果小氯没记错,在全球范围内接入的一般是 ChatGPT。不过众所周知,为了符合某些规定,牢果在国内的合作商都是比较具有本土色彩的。这次也不例外,就是牢度的文心大模型,也有说法是准备去找牢巴(阿里巴巴)合作的。 + +牢度……嗯。 + +在小氯看来,一个系统级 AI,纯本地化是其能被认为「安全」的必要不充分条件。当然,我并不是说联网就必然会有危险,但是将这柄达摩克利斯之剑交给光纤对面的公司本身就是对个人隐私最高级别的威胁,更何况是一家让小氯信任他们尊重用户隐私还不如信任指洛水为誓的公司。即使是从(应该是中美的)法律上承诺「绝不查看」,那也不行。小氯[[理想乡构筑手记(2):Hello,Céfiro|说过]],我从不信任道德承诺,我只信任技术承诺。荒坂可以操纵整个政府,但是他们破不开后量子加密算法。 + +……反正牢果如果真的和牢度合作做 Apple Intelligence,还没有确切的证据能让我相信这个东西可以完全 Opt out 的话,那估计也是时候锁系统版本,或者换 [Asahi Linux](https://asahilinux.org) ,或者去买 Framework Laptop 了。当然会有许多相对于隐私性更加在乎便利性的客户(而且这应该是大多数),但是这显然不包括小氯,这只拿着 LuLu 过滤联网程序、为了用开源的 Rime 代替讯飞宁可从头学双拼、为了保护自己写的算不上私密的笔记愿意啃一千多页密码学 PPT 的元素娘。 + +**Hands off my data, you shameless techs!** + +[^1]: 这里的字母是指密钥的四个功能:认证(Certification)、签名(Signing)、加密(Encryption)和验证(Authentication)。SC - E 就是主密钥兼有签名和认证功能,同时有一个仅加密的子密钥;而 C-S-A-E 就是全分离架构,即主密钥只负责 C,S、A、E 全部由相应的子密钥负责。 \ No newline at end of file diff --git a/content/posts/人间世/岁时录/岁时录(十八).md b/content/posts/人间世/岁时录/岁时录(十八).md new file mode 100644 index 0000000..4711747 --- /dev/null +++ b/content/posts/人间世/岁时录/岁时录(十八).md @@ -0,0 +1,299 @@ +--- +title: 岁时录(十八) +date: 2025-04-29 +slug: weekly-18 +featuredImage: https://img.viento.cc/cover/weekly-18-cover.webp +categories: + - 人间世 +tags: + - Matrix + - 数电 + - ChatGPT + - 阅读 +series: 岁时录 +summary: 岁时录其十八 +description: 本文是作者周报《岁时录》的第十八期,讲述了作者近期的生活与思考,包括技术实践、学习经历和个人兴趣。作者分享了新域名 `eigen.im` 的启用及其背后的自我表达理念,并介绍了 Matrix 服务的分域部署经验。在学习方面,作者记录了数电实验和 FPGA 烧录过程中遇到的实际问题与解决方法,展现了理论与实践结合的体会。此外,作者还尝试开发自托管匿名提问箱,探讨了匿名与坦诚的关系。生活片段如品尝酒酿、反思阅读习惯(偏好外文原版而较少读中文书),以及用 AI 辅助写游戏 Mod 和制作可爱的表情包,体现了作者对技术工具的积极应用和自我认同的探索。 +wikilinks: true +lastmod: 2025-04-29 +--- + +诸位老友,下午好。这里是 Chlorine。 + +趁着五一出发之前,再凑一期岁时录吧。讲讲这一周(几周)有趣的事情,顺便清一清废稿(悲)。 + +由于这个月主要在忙期中和园子的重构工作(见[[DGP:重新出发|此处]]),所以内容也没有写太多……算了我承认这篇文章很水(大悲)。 + +## Hello,Eigen + +这里原本应该有很多东西的,但由于还没实践完,被小氯砍掉了。简单来说,就是小氯又希望搭建一个属于自己的社交系统了,尽管目前似乎有一点工具性分享倦怠(由于没有称手的工具,不太想贸然发帖子)。 + +### 又又又又又一个域名 + +这次是 `eigen.im`。 + +`.im` 是……等会儿,我去看看。`.im` 是英国王室属地马恩岛(Island of Man)的 ccTLD,由于可解读性比较高,也常常被作为泛用顶级域。大致的含义有以下几个: + +- Instant Message:即时通讯,比如 [FluffyChat](https://fluffychat.im)。 +- Input Method:输入法,比如小氯好喜欢好喜欢的 [Rime](http://rime.im)。 +- I'm:自我介绍,所以可以当做个人博客,比如[陈仓颉](https://imzm.im)老友。 + +`.im` 是个很便宜的域名后缀,Spaceship 一年不到 50 CNY。不过不知道是不是因为太冷门了,所以名声似乎还算可以。 + +而前缀 Eigen 是德语,意思是「自我」。这不仅昭示了这是一个「服务于个人」的项目,而且也宣称了「保持自我」的追求。这可能也是社交服务的最终目的:建立人与人之间的联系,并在这种联系中寻找自我的真实。 + +……嗯,好吧,其实当初买的时候并不是这么考虑的。单纯只是想买个用来搭 Matrix 的域名,众所周知,Matrix 这个词在数学里有「矩阵」的意思,而矩阵最重要的性质之一,就是特征值(Eigenspace)和特征向量(Eigenvector),或者翻译为「本征」。就这么简单。 + +之前小氯手中还有一个 `sayso.im`。Say So,直译大概就是「这样说」,或者借用佛经的话,叫作「如是说」。 + +> 一切有为法,如梦幻泡影。如露亦如电,应作如是观。 + +这个域名小氯也是蛮喜欢的,不过秉持着奥卡姆剃刀原则(如无必要,勿增实体),这个域名也没有过大的必要存在了。 + +哦,此外,一个小小的 Bonus:小氯有一首很喜欢的歌,也叫《Say So》,别名「种田の小曲」。[^1] + +### 分域部署 + +为了省域名兼好看。小氯打算做一个小小的聚合:把所有的相关服务的标识符都聚合到同一个域名下,比方说在 Fediverse 下是 `@chlorine@eigen.im`,在 Matrix 是 `@chlorine:eigen.im`,在 Nostr 是 `chlorine@eigen.im`,在 Bluesky……哦,Bluesky 有 Handle,不用这个。这就不得不涉及分域了。 + +「分域」就是把用户标识符域名和实例域名分开。我们举个例子:我们要部署一个 Matrix Server。我们希望用户的标识符是类似 `@user:example.com`,但是 `example.com` 我们希望另做他用,转而把实例运行在 `matrix.example.com`。这时候我们就需要做一点小小的 tweak,在他人查找 `example.com` 上的用户时导引到 `matrix.example.com`。 + +这里我们简单说说 Matrix 的分域方法,以 [Conduwuit](https://github.com/girlbossceo/conduwuit) 服务器为例。Conduwuit 是著名的 Conduit 的分支,加入了不少的新特性和 Bug Fix(2025-04-28 注:Conduwuit 寄了,有一个后继者 Tuwunel,但是还没有完善的自部署和迁移文档)。 + +在 Conduwuit 的环境变量中,将 `CONDUWUIT_SERVER_NAME` 设置为 `example.com`。然后使用反代服务器,如 Nginx 或者 Caddy 将 `matrix.example.com` 反代到 Conduwuit 的地址,一般是 `127.0.0.1:8448`。 + +然后在 `example.com` 的域名下运行一个反向代理(看你希望拿这个网页做什么了,对于小氯来说一个静态文件代理即可),在网站根目录下创建 `.well-known/matrix` 文件夹,写入两个文件: + +```json +// client +{ + "m.homeserver": { + "base_url": "https://matrix.example.com/" + } +} +``` + +```json +// server +{ + "m.server": "matrix.example.com:443" +} +``` + +甚至你用 Cloudflare Workers 或者别的什么 Serverless 平台都可以,毕竟这只是两个静态文件。 + +把 DNS 解析配好,大功告成。可以用[这个网站](https://federationtester.matrix.org/)检查一下配置是否成功。 + +目前小氯在这个域名跑了 Matrix 和 Bluesky PDS,后续可能会加 XMPP 和 Fediverse 之类的。不过 ActivityPub Git Forge 小氯不打算在这里跑,估计会用 `foss.moe`。 + +## 海鲜炒面 + +看了这么久,饿了吗老友们?OωO + +…… + +不会有人真的以为这一节要讲吃的吧,不会吧不会吧…… + +好吧,这其实是指数实的实验接线。情况是这样的:本周的数实主题是让你搭建两个版本(补码和原码)的全减器,以及其他的小电子元件。哦,补码是指…… + +好啦好啦,不讲术语了。总而言之,各位只需要知道,我们要搭一个电子元件就好了。 + +要搭两位全减器,比较舒服的方法是先搭一个全加器。两位全加器的结构其实不麻烦,因为我们只需要全加器而不需要快加器,所以只需要把两个一位全加器串起来就可以。而一位全加器的逻辑表达式我们几乎可以背下来了: + +$$ +F = A \oplus B \oplus C_{\text{in}} \text{, } C_{\text{out}} = AB + BC_{\text{in}} + AC_{\text{in}} +$$ + +其中 $\oplus$ 代表异或。 + +而两位补码全减器只需要把 B 的各位、输入和输出的进位(准确来说此时是借位了)反相,原码全减器就加一个补码转原码的部分即可。 + +听着简单对吗?那我们看看实际接线的效果吧。 + +> [!WARNING] +> 前方高能,强迫症和洁癖人士请尽快撤离!这不是演习! + +这是原码全减器(准确来说,这不是小氯的版本,是小氯帮同学搭的。小氯的版本更惊悚): + +![|537](https://img.viento.cc/20250328-2bit-suber.avif) + +现在知道为什么这节的标题叫「海鲜炒面」了吧,你就说像不像吧(乐)。 + +当然,吸取了[[岁时录(十七)|上一期]]的教训,小氯可是不敢怠慢。课前反反复复拼了好几次才敢过去。 + +![](https://img.viento.cc/20250328-2bit-full-adder-circuit.avif "小氯画的全加器示意图") + +最终当然是顺利地过了,不过中间也是遇到了点乐子:测试出来 2 - 3 显示了 3(应该显示 1)。找不到问题,遂推倒重来。最后发现是有一个异或模块电源引脚接错了。嗯,小氯酱是笨蛋。 + +## 烧位码传奇 + +本来一周只有一节数实的,奈何小氯鸽的天数太多了,就凑到一起了(捂脸)。 + +--- + +作为一名全面发展的带学生,上了这门全面发展的数电/数实,烧板子自然也是不可不品尝的一环。 + +我们烧板子用的是 Vivado,这玩意是不支持 macOS 的,需要通过极其丑陋的方式,包括虚拟机和 Rosetta 等方式去运行,还需要安装几十个 G 的庞然大物。众所周知,小氯有严重的环境洁癖,让小氯在自己心爱的 MacBook 上面搞这么一出,在小氯看来不啻于在故宫里开夜总会。 + +很可惜,小氯的 Windows 备用机已经留给老爹了。于是小氯~~一面将备用机从老爹手里巧取豪夺了回来~~,一面着手去借一台电脑临时顶用。所幸关键时刻还是我光荣而伟大的孙哥为我提供了支持。 + +不过小氯首先发现,自己的实验箱里面没有烧录线(或者叫下载器)。于是小氯去找自己的同学借了个下载器。 + +中午吃完饭,把电脑薅回来之后就开始下载……事实证明,这是一个「把大象装进冰箱」的过程。 + +图片忘记截了。我用语言叙述一下:校内提供的备份包,下载速度达到了惊人的 1000 B/s,距离下载结束还有 193 天。好家伙,带嘤的 HS2 跟它一比都算是迅捷高效的。 + +最难绷的是,虽然插着电,但是孙哥的电脑下着下着居然……关机了。于是小氯又去找自己的另一位同学借了个同型号充电器。拼好课了属于是。 + +无可奈何之下,小氯打算去找同学帮忙。反正代码小氯已经写好了,只需要烧到板子里就行。 + +幸运的是,还真有一位同学愿意帮忙,于是小氯背起两台电脑和实验箱就往教学楼跑。 + +然后到了之后,小氯想到……为什么不把同学下载好的安装包复制一份拿过来呢?这样总归会比一点点下载强多了。 + +同学倒是还留着安装包,也有 U 盘,不过不知道为什么,一直显示文件过大。小氯拿出自己全部的社交勇气在走廊里面堵了十几个同学都没借到新的 U 盘。 + +好好好,那我买一个还不行嘛。小氯去了附近的便利店,斥巨资 40 CNY 买了一块 64 GB 的 U 盘。 + +结果插上一看……还是显示空间不足? + +邪了门了。求助一下 ChatGPT 大神……哦,原来是 U 盘格式的问题,改成 ExFAT 格式就行了。 + +然后就等着呗。等了半小时(小氯闲着没事在看大物),终于是拷贝过来了。于是小氯告别了同学,准备回去安装。 + +不过这个安装处处透露着诡异的气息……为什么 7-Zip 说压缩包存在无法修复的错误? + +换 Better Zip 试一下。解压了十几分钟之后……好家伙,解压错误。 + +此时小氯的表情就像是坐完敞篷车的 JFK——乐不起来了。 + +所谓不在沉默中学坏,就在沉默中变态。无计可施的我直接放弃了配置环境,明天找同学的电脑烧吧。事后证明这是个正确的选择,因为这节课的任务确实很简单,不需要什么练习;而且 FPGA 大部分是断电即失的,很难提前烧好带过去。 + +第二天糊弄完课,小氯收到了邮来的备用机,赶紧重新下载配环境。这次倒是比较顺利,下了两个小时就下完了(这说明这应该是电脑的问题,而不是校园网或者我的问题),然后安装、试烧录一气呵成。以后就不用担心这些乱七八糟的事情了。 + +下一节课小氯甚至有时间去嘲笑赶 DDL 的同学们: + +![fpga-progamming-is-fun|502](https://img.viento.cc/20250428-fpga-progamming-is-fun.avif "雌小鬼小氯(确信") + +## 匿名提问箱? + +这是小氯的开发清单上平平无奇的一项。 + +之前曾经跟风开过一个箱子,如果我记得没错的话,头像还是小氯开始用「小氯」这个昵称开始时的那个,签名很让人费解。不过听玩提问箱比较久的老友说,之前很多提问箱都寄掉了(应该也包括小氯说的这个),很多珍贵的数据都没了。 + +这事好办,不就是数据不在自己手里嘛,那咱们自托管不就行了。 + +现在市面上的自托管提问箱不多,但是有。不过,小氯都不太满意。一个主要的原因是没找到兼容 SQLite 的,另一方面:提问箱无非是一个前端加一个数据库,那么,Serverless 不是也可以吗? + +似乎确实可以。以 Cloudflare Full Stack 为例,Workers 做边缘计算,Pages 展示前端,D1 数据库,R2 对象存储,KV 缓存,Turnstile 验证。Wasm 加的意义似乎不是很大,也有点麻烦,但也可以试试。 + +所以说,匿名提问箱这种东西到底有什么用呢?或者我们换一个更加 precise 的问题吧,为什么提问箱要是匿名的? + +解释起来似乎也不算难:因为这样可以用一种「一视同仁」的方式回答所有的问题。之前写文章的时候小氯[[小氯,Chlorine抑或我|提到过]],自我是语境特异化的。这么看的话,自我的区分甚至可以达到单个人这样的亚语境层次。只是可能没那么质变而已。 + +不过,这本质上是一种「单向匿名」,因为除非每个问题都是私聊性质的,不然最终的回答都还要是公开的,~~所以在公开提问箱里面痛骂自己的导师并不是什么好的选择~~。所以小氯对这种方式到底能否做到「坦诚相待」持相当的怀疑态度,因为这可能只是把「对不同的人的不同的部分真实」,换成了「对所有人统一的部分真实」。 + +## 酒酿 + +事情大概是这样的。周四那天(忘记是哪个周四了),小氯考完了寄凉惊悸穴,打算去院里的留学分享会听个热闹。可能是这几天风比较大,小氯感觉脑子有点不清醒。小感冒而已,无伤大雅。 + +一个小小的惊喜是,主办方给来听的同学准备了一份茶百道。由于来得比较晚,小氯急匆匆地抓了一杯就去找座位开始听了。 + +安顿下来之后,看一看上面的标签……竹香酒酿? + +如果小氯没记错,酒酿应该是米酒发酵的一种半成品,由于淀粉被大量分解为单糖和寡糖,因此很甜。小氯的身体不大好,因此极少接触酒类。不过既然都拿到手了,也没有不喝的道理。 + +总体来说味道还挺不错的,浓郁的米甜味带着淡淡的酒气。不过喝着喝着,小氯感觉有点发热,脑袋也有点昏昏沉沉的,想睡觉——尽管小氯那天睡得并不少。没有什么飘飘欲仙,也没能让我看到什么光怪陆离或者颠倒淋漓的盛景。只是想睡觉而已。 + +后来再想买一杯尝一尝,发现已经买不到了。有一点可惜。 + +## 我还在读中文书吗? + +这里说的书,只包括「我自己想读」的书。用来复习考试的指定参考书除外。 + +这个问题的来源很无厘头。大概就是在无垠的 Indieverse(这个词是小氯自己创造的,指所有独立性网站——尤其是个人运营的那部分,大体可以理解为不一定要实现 Indieweb 标准的 Indieweb)闲逛的时候,看到了一篇吐槽某本书翻译的文章。小氯大概看了一下文中的例子,不得不说确实是挺难绷的。看来我们的中文译者还是要努力啊。 + +译者……等会,我多久没读过翻译为中文的书了?甚至我多久没读过中文书了? + +我仔细想了想自己最近在读的书。《1984》,英语原版;《麻省理工学院概率论讲义》——哦,这个名字是我起的,就是指 MIT 那门著名的概率论 OCW 的讲义,当然是英语版;《资本论》第一卷,英语版——小氯看不懂德语,《国家与革命》和《资本积累论》同理。甚至可以把目光投入到自大学开始以来,结论依然成立。唯三的中文书,有两本是小氯喜欢的教材——陈希孺院士的《概率论与数理统计》和菲赫金戈尔茨的《微积分学教程》,另一本是《枪炮,病菌与钢铁》——读到一半我就不想看了。那看看自己的计划书单呢?好像也没几本中文书,无论是本土的中文著作,还是翻译的外语书籍。其中不多的几本,也都是相对靠前的了,比如说《史记》(是的,你没听错,这只元素娘想读《史记》),近一些的像鲁迅先生的几本书——之前看先生的杂文比较多,反而没能好好读读其余的作品。以及陈忠实先生的《白鹿原》。 + +这好像不是什么 normal 的事情,尤其考虑到小氯依然生活在中国,日常生活完全中文语境主导,同时对于自己的国籍、语言和文化抱有很大认同的情况下。 + +不喜欢读翻译版本,似乎还比较容易辩解。毕竟「原汁原味」的原文,不但锻炼语言能力,表意方面也更加契合作者的原意——翻译毕竟都是有损转码。举个例子:《1984》中「新话」的许多词汇,其实是没办法很好地翻译为中文的,如 thinkpol 翻译为「思想警察」有失词汇脱水缩合的压缩感,「想警」则过于晦涩,不易理解(当然,中文翻译为外语也一样,甚至可能更费力)。此外,即使不考虑翻译问题,为了适应各地的语言文化、风俗习惯、法律法规等,不同的翻译版本也不可避免地会做一些增删减补,比如说今年(去年?)诺经奖得主的某本知名著作。如果不想其中一些内容被和谐掉,还是读原版好一些。 + +至于不喜欢读(比较现代的)本土书籍……这事说起来可得小心些,被扣上「崇洋媚外」的大帽子可就不好了。说实话,就小氯的印象来说,似乎中国的现代文学——尤其是 21 世纪以来的文学,找不到一本能被称为经典的著作,一本都没有——当然,小氯本身读这些书不多,认知范围也比较局限,此外可能存在一个「时间错位」的问题,像莫言、余华等前辈的某些(小氯比较喜欢的)书,在我的观念里并不是 21 世纪的书。唯一很熟悉的《三体》,小氯看得也蛮多的,但是还够不上文学经典的槛(「科幻经典」倒没什么问题)。如果让小氯说一本「中国文学经典」,那小氯第一时间想到的几乎都是两百年往上的东西,第二时间呢,大概是 20 世纪的一些(在小氯看来)写得很好的书了。 + +不过无论如何,小氯以后也不打算过多地涉及什么中文书了。当然,《论语》之类的古典著作和《毛选》之类的近现代经典除外——「崇洋媚外,厚古薄今」,小氯大抵如此。 + +## 用 AI 写 Mod + +> [!WARNING] +> 由于下面的某些内容涉及一些可能令人感到不适的意识形态,所以我不会提供具体的文字和图像资料。 + +作为交叉学科缝合怪 + 赛博原始魔怔人(原始指总是落后于时代风潮,魔怔指抓到一个话题就不断玩弄),小氯对于架空历史非常热衷。而作为著名~~战犯模拟器~~历史战略游戏,《钢铁雄心 IV》的各种 Mod 在小氯的日常阅读材料中占有很大的比例,尤其是 TNO、KR / KX 和 RF 这样公认优秀的架空历史 Mod,而小氯也试过自己写一些 Mod 的设定,类似于平时小氯喜欢做的写 AltHis Wiki 的感觉,但是由于有国策、参数面板之类的游戏元素,写起来似乎也更加规正和有趣味。不过,据我真的在写 Mod 的~~战犯~~玩家朋友说,P 社(Paradox Interactive)的 Mod 标准极其抽象。于是小氯止步于了理论构想,Markdown 不比 YAML 和 JSON 舒服嘛。 + +当然,这种申鹤震怒的工作,用天朝的 AI 显然是不行的,因此需要从资本主义世界批判性使用一些 AI。于是小氯随手选择了限制没那么多的 ChatGPT。倒是没像 [Zeee](https://www.velasx.com/am/6381) 那样用 GPT-4.5(没付钱),平常的 GPT-4o 足够了。 + +然后我发现,ChatGPT 在这方面的能力比我想象中的还要强。例如说它写的世界新闻,虽然说不太符合 HOI4 的新闻格式(好吧好吧这是我的 prompt 的问题啦),但是内容相当丰富,比如说各个国家的反应之类的。 + +而且,由于 OpenAI 的奇妙设计,我甚至可以在说完一个国家的基础设定之后,让它帮我画一面国旗,总体效果相当惊艳。比如说,如果我试图做一个美国的 Business Plot 线,它画出来的国旗一眼就能看出来美式牢保和棕线(法家思想)的风格;而如果要做一个「工农兵联合公社」,旗子大概就是……嗯,可以参考 TNO 图哈切夫斯基的旗子,可谓武德爆炸。 + +所以我们在使用 AI 做 Mod 的时候,AI 到底是在做什么呢? + +## Meme Set + +嗯,小氯也是好起来了,都有表情包了(骄傲)。 + +事情是这样的:某个中午,小氯正在报仇雪恨般地摸鱼,闲着没事薅 GPT 和 Gemini 的算力优化头像(自设)。结果自然还是没有结果。咱就是说……我都不指望优化什么细腻的动作了,能不能把那个灰色的 MacBook Pro(一定是 Pro,而且估计是 Intel 时期的,Air 不会那么笨重的)换成小氯在用的星光色 MacBook Air 啊?或者星光色难画,咱们换一个银色的也行啊…… + +郁闷之下小氯开始去互联网上随机游走实践 PageRank 算法,结果跳到了阮一峰老师的[这期周报](https://www.ruanyifeng.com/blog/2025/03/weekly-issue-343.html),里面有提到用 GPT-4o 画表情包。对于 GPT-4o 的绘图能力,小氯还是给予高度认可的。那么既然如此,不妨试着玩一下。 + +把我的头像扔进去,Prompt 就写: + +> 这是一个可爱的氯元素拟人形象。请把这个角色画成 Q 版,并用 12 个动作和文字做成表情包。 + +稍等一会就可以看到结果。结果……嗯?似乎还挺拟人的。 + +多画几张玩玩。下面展示一下比较好的一张吧,虽然说不是 12 个。基本上是原图,只是用 `pillow` 库扩充了下背景(后面会讲)。 + +![chlorinechan-meme1-original|352](https://img.viento.cc/20250428-chlorinechan-meme1-original.avif) + +不得不说……好像……还挺可爱的? + +~~所以为什么第一个表情给我画了个武魂真身~~ + +那下面想办法把图片切成单独的表情包吧。由于 ChatGPT 并没有画严格的九宫格,所以我们需要一张张手动裁剪。幸福的烦恼。 + +在 [iLoveIMG](https://www.iloveimg.com/) 上比画了两下,感觉横 330 \* 纵 360 的大小比较合适。不过由于原本的表情包贴着边缘太近了,所以我们需要简单地来一下扩充画布。至于工具,当然是程序员的 Photoshop——Pillow。 + +```python +from PIL import Image + +# 打开原图 +img = Image.open("input.jpg") + +top = 50 +bottom = 100 +left = 50 +right = 50 + +new_width = img.width + left + right +new_height = img.height + top + bottom + +color = (255, 255, 247) +new_img = Image.new(img.mode, (new_width, new_height), color) + +new_img.paste(img, (left, top)) + +new_img.save("output.jpg") + +``` + +完事之后一张张切就行了。或者你写个脚本切也没问题。 + +切完之后我们就获得了一堆小图片。用 `cavif` 转一下格式就算完事了。由于人物的衣服和背景色比较相近,去背景很麻烦,干脆留着了。 + +现在这组表情已经加入园子的表情列表(不过因为 JSDMirror 的缓存,可能会有一定的延迟),欢迎使用 OuO + +~~干得不错 CloseAI,多整点这样的好东西。~~ + +[^1]: 种田大致指在战略游戏,例如《钢铁雄心 IV》和《维多利亚 III》中,着力发展经济、改善财政等的行为。在「种田」期间,玩家一般较少或不发动战争。 \ No newline at end of file diff --git a/content/posts/人间世/岁时录/岁时录(十六).md b/content/posts/人间世/岁时录/岁时录(十六).md new file mode 100644 index 0000000..9cda810 --- /dev/null +++ b/content/posts/人间世/岁时录/岁时录(十六).md @@ -0,0 +1,506 @@ +--- +title: 岁时录(十六) +date: 2025-02-27 +slug: weekly-16 +featuredImage: https://img.viento.cc/cover/weekly-16-cover.webp +categories: + - 沉思录 + - 人间世 +tags: + - 博客 + - 日常 + - 域名 + - 去中心化 + - Marxism +series: 岁时录 +summary: 岁时录其十六 +description: 本文是作者周报的第十六期,记录了作者近期在技术、教学和开源方面的经历与思考。作者首先分享了担任助教的体验,并反思了教学方法。随后,为了提升博客在禁用JavaScript时的体验,作者对博客进行了多项技术改造,如利用Checkbox Hack和Hugo内置功能优化特定模块。此外,作者还购买了新域名`foss.moe`,并借此探讨了开源文化与萌文化的交融。文章重点讨论了自由前端(替代前端)的部署与使用,作者介绍了多个自建的自由前端项目,并分享了相关配置技巧和对特定项目(如PixivFE)的优化。更进一步,作者深入剖析了自由前端背后的深层含义,指出了其存在的矛盾性——既是对抗互联网巨头监控的工具,又是中心化现实的体现。文章批判了中心化平台的垄断,分析了去中心化平台(如Fediverse)面临的困境,强调了“生态”的重要性以及技术社区与大众之间的认知差距。最后,作者呼吁技术社区联合起来,建立更强大的基础设施,积极与大众沟通,并做出必要的妥协,以推动非中心化互联网的实现。 +wikilinks: true +--- + +各位老友,晚上好。这里是 Chlorine。 + +您正在阅读园子的周报——《岁时录》的第十六篇,日期范围为 2025 年 2 月 24 日至 2025 年 3 月 2 日。这是园子的不完全定期刊物,会记录一些小氯和园子在这段时间的经历,以及或有或无的思考。这是从主世界的时间中引出的一条细小的支流,也是这个网络空间中的小岛的编年史。 + +祝食用愉快。 + +## 上小课 + +这周小氯做了件有趣的事:上小课。 + +别误会,不是上小课,是上小课。 + +没错,小氯也是当上牢助教了(骄傲)。 + +搞笑的是,由于小氯上学期刚刚上完这门课就报名当助教了,因此我的学生们很多都是我的同届甚至同班的同学,还有不少的学长学姐,所以处理和学生的关系的时候,也是要稍微费一点脑子的。所幸我们的总原则很好实践:既然站在助教这个位置上,那么代表的就是教学团队。课下我们怎么亲切都可以,但是一旦涉及任何教学相关的任务,唯一的原则就是公事公办。 + +回来。其实讲小课的时候小氯也是有点紧张的,因为的确是第一次做这种事,而且准备得也不算充分。而且,同学们也大都不怎么喜欢发言,所以按照常规思路询问「同学们如何如何」时经常冷场。后续还得想想怎么改进好一些。毕竟虽然说按照小氯的打算,同学们应该是课堂的主体,由他们来决定讨论的话题、材料、节奏、评估和最终成果(~~省省吧你就是不想每次都自己备课~~),但是小氯还是要负不少的责任的。毕竟在其位者谋其政,既然选择了这个位置,你就不能想着混一学期。 + +> 看来大家似乎还没有比较希望讨论的问题啊。没关系的,大家可以随着学习的过程慢慢想。而且剧透一下,就算是诸位现在不去想,这学期的某节小课,可是一定要仔仔细细想一次的哦。放心,亲爱的同学们,你们逃不过去的。——小氯 + +PS:写完这部分后,小氯突发奇想地把这段话喂给了 DeepSeek。让我们听听现国脚 DeepSeek 对此的评价。一向并不直性子的 DeepSeek 大将军发言道: + +> 这种语言风格精准捕捉了 Z 世代在权威角色中的身份焦虑,用自我解构消解制度性压力,通过话语狂欢重塑教育现场的人际关系。网络化表达与教育场域规训形成微妙对冲,构建出新媒体时代特有的青年教师叙事范式。 + +分析得很好,下次不要分析了。 + +## Minimize Our JS + +事情是这样的:小氯最近沉迷于 uBlock Origin,致力于把每个网站的权限收到最紧,由此不惜把许多老友华丽的博客杀得七零八落。 + +根据己所不欲勿施于人的原则,小氯似乎也应该保证园子在使用 uBlock Origin 的条件下有良好的体验。而众所周知,uBlock Origin 最严格的策略,大概就是禁止任何脚本加载了(当然,你也可以禁止任何资源加载,享受纯正的 Web 0.0 体验)。 + +那么园子能做到 Zero JS 吗? + +理论上当然可以,有 [ATP](https://atpx.com) 老友的博客珠玉在前,我们可以肯定,即使不使用任何 JS,也可以做出一个优雅的 Hugo 主题。 + +那么让我们来狠狠欺负~~小氯吧~~小氯的博客主题吧~ + +### 总原则 + +总原则:不能不用 JS 的地方,就需要用 JS(~~废话~~)。 + +或者是说,任何需要实时性的地方,我们都需要 JS,因为单凭 HTML 和 CSS 是不可能实现真正意义的动态效果的。例如时间计算,这群呆呆的静态文件哪能知道当前的时间是多少啊。而并没有真正的实时性的地方,我们就可以使用一些 trick 来替代掉 JS。 + +### 我用了哪些 JS? + +知己知彼,百战不殆。让我们先看一下,园子目前用了哪些 JS。 + +在 VSCode 中使用 ` +``` + +初始时的内容默认隐藏: + +```css +.ai-summary__content { + display: grid; + grid-template-rows: 0fr; + opacity: 0; +} +``` + +然后我们通过 CSS 类监听其状态变化: + +```css +#ai-summary__checkbox:checked~label { + .ai-summary__content { + grid-template-rows: 1fr; + opacity: 1; + } + + .ai-summary__icon { + transform: rotate(180deg); + } +} +``` + +大功告成。~~甚至比原本的 JS 版本效果还好~~ + +### KaTeX + +小氯老早就看这个客户端 KaTeX 不顺眼了。既然咱们的代码高亮可以用 Shiki 做服务端接管,那 KaTeX 为什么不行呢? + +于是小氯开始尝试各种 rehype / remark LaTeX 的手段,结果不能说是硕果累累吧,只能说是一无所获。还试过直接使用 KaTeX CLI 加上 JavaScript,结果自然是又重又不好用。 + +然后,小氯在绝望地进行搜索时,偶然看到了[这篇文章](https://tomdvies.com/posts/buildingwebsite/)。这位作者主张的就是 NoJS,然后小氯就在 KaTeX 一节看到了这个东西: + +```html +{{ if eq .Type "block" }} + {{ $opts := dict "displayMode" true }} + {{ transform.ToMath .Inner $opts }} +{{ else if eq .Type "inline"}} + {{ transform.ToMath .Inner }} +{{ end }} +``` + +嗯哼? + +难道伟大的 Hugo 已经支持原生的 KaTeX 编译了吗?去看看[文档](https://gohugo.io/render-hooks/passthrough/),果然如此。 + +好的,我是小丑。 + +那好吧: + +```html +{{- $opts := dict + "output" "htmlAndMathml" + "displayMode" (eq .Type "block") + "throwOnError" false + "errorColor" "#cc0000" + "trust" true +-}} + +{{- with try (transform.ToMath .Inner $opts) -}} + {{- with .Err -}} + {{ errorf "KaTeX 渲染错误: %s (位置: %s)" . $.Position }} + {{- else -}} + {{- .Value -}} + {{- $.Page.Store.Set "hasMath" true -}} + {{- end -}} +{{- end -}} +``` + +这样编译出的数学公式配合上 KaTeX 的 CSS,显示效果非常出色。 + +### 运行时间 + +秒级的运行时间是不可能离开 JS 实现的,但是天级确实可以。没错,每天一次自动构建。 + +不过这个更改还在测试阶段,毕竟这属于是有损替换了。 + +### 不准备替代掉的 + +小氯要做的是 Minimize JS,而不是 Eliminate JS。如果一个功能使用无 JS 实现会严重损害用户体验的话,小氯宁可不做更改。 + +#### 阅读进度 + +几乎没有离开 JS 实现的可能。 + +#### Click And Copy + +小氯去查了一下,所有的方案都需要和剪贴板 API 交互,所以都得使用 JS。退而求其次的方法大概是使用 `input` 标签和 `user-select: all`,使得用户能够使用 Ctrl / Cmd + C 复制,但是这样体验不是很好。 + +#### 主题切换 + +小氯是没见过能不使用 JS 询问用户偏好的主题的。大概可行的方法是完全去掉主题切换,只通过 `prefers-color-scheme` 决定主题。以及,小氯在 You Don't Need JS 找到了一个 Checkbox Hack 的实现,不过由于小氯的变量有点多,实现起来并不容易。 + +#### 加载动画 + +小氯的加载动画灵感来自 Innei 老师的动画,应该是整个主题里面 JS 最复杂的部分了。如果去掉的话,可能需要把原本的动效做成 GIF,或者干脆去掉这个功能。 + +#### 灯箱 + +图片的灯箱一般依赖于灯箱库,如 Fancybox。不过小氯不喜欢第三方依赖,因此自己写了个小小的灯箱,还是挺丝滑的。 + +如果要实现无 JS 灯箱,大概需要使用模态框和 `:click` 以及 `:target` 伪类吧。不过键盘导航肯定是别想了。 + +#### Algolia Docsearch + +Algolia Docsearch 当然不可能无 JS 运行。不过我们还可以有一个替代方法,直接依赖搜索引擎的 `site:` 功能,效果很多时候还不错,只是交互性差一些而已。 + +#### Twikoo 评论 + +严格来说,任何一般意义上的「评论系统」,都不可能不使用 JavaScript——这是一个需要即时反馈的交互。Staticman 可能算是一个例外,其似乎是通过 `form` 元素提交 HTTP POST 请求,然后触发网站重构建实现的。可以是可以,不过疑似有点太极端了。 + +小氯能想到的最好的方法,就是 Fediverse(或 Bluesky)——把文章同时发在 Fedi 上,并在网站里面整合一个可以跳转到相关帖子的按钮。缺点就是依赖外部服务,只是把自己的网站变成不需要 JS,实际上对于真正的无 JS 用户还是不友好。并且需要一个 Fedi 账户。 + +### 冷知识 + +园子没有使用任何 cookie (/ω\) + +## 又一个新域名 + +~~小氯酱的第不知道多少个域名~~ + +这次是突发奇想的,只是感觉这个域名好有趣,而且没有被占用,也没有溢价(这确实很离奇),所以就买下了。 + +![foss-moe-domain|709](https://img.viento.cc/20250227-foss-moe-domain.avif) + +是的,`foss.moe`。 + +要说直接灵感,大抵是来自 `tuna.moe`。这是清华大学学生网络与开源软件协会(TUNA)的官方域名,一个提供各种镜像站和 DNS 的神秘组织。 + +小氯不太清楚 TUNA 为什么选用了这个域名。可能是 TUNA is MOE 的意思吧。 + +那么 `foss.moe` 似乎就是 FOSS is MOE。 + +一个项目可能很萌吗?难说。按理说张牙舞爪的代码没什么「萌」可言,但是项目本身的设计却可以带有可爱的色彩。例如著名的 Clash Nyapasu(抱歉这里不能放链接)。或者是这个项目本身的用途可以有「萌」的色彩,例如 nazurin: + +{{< github repo="y-young/nazurin" >}} + +当然,在两不沾的情况下,我们也可以通过各种变换和解读来创造可爱感,例如,把编程语言、代码工具和平台娘化。或者再脱离一层,在项目本身和萌压根不沾边的情况下,通过人的行动「强行」加入这样的元素,例如边写代码边看番。虽然说这种行为大抵除了给自己创造美好回忆~~以及降低代码质量~~之外一般没什么其他影响,但是我们试想一下,如果某位二次元开发大佬,看着某部番写了一个碾压 Ubuntu 的 Linux Distro,那鉴于开发社区出色的八卦能力,难说这个发行版会不会带上这部番乃至更广义的萌文化的印记。 + +这大概可以看作萌文化和开源文化在某些层面的融合吧。尽管理论上说任何文化都可以和开源开发这一光荣而充满挑战的人类智慧活动融合在一起,但是依小氯的经验(当然只是经验),萌文化似乎显得尤其容易。 + +为什么呢? + +我们可以拿另一种常常和开源文化结合在一起的东西类比一下:咖啡。这种味道奇特的提神饮料几乎伴随了开源的整个历史,从 Java 到 coffee-2-code-converter 再到 Buy Me A Coffee。理由也不难给出:程序员们在熬夜写代码时,大抵是需要一些东西帮助自己提神的。于是,Assembly,B,C,再到 C++、Java、JavaScript、Python 和 Go、Rust,几乎所有的语言都在字里行间沾上了些这样的熨帖而微苦的气息。 + +对于许多人来说,萌文化似乎就是他们精神上的咖啡。 + +……很明显,技术和 ACGN 两种爱好完全不矛盾,二者甚至经常共存,「技术宅」这个独特的群体就是最好的例子。其原因比较耐人寻味,大概是时代背景的作用、传播领域的相似性、主题本身的契合性和心理需求的分层满足等,小氯目前说不大清楚。 + +虽说小氯一方面没有技术,另一方面连泛二次元都只能说勉强算,但是这并不耽误小氯对着好看的插画发出「好可爱」的惊叹并将其拿来当作 VSCodium 的背景板。如果将来能开开心心地写着自己喜欢的代码,看着自己喜欢的作品,这种生活似乎还蛮幸福的。 + +从某种意义上说,这是一种(好几层的)对于理想世界的向往,尽管这是个小世界。 + +未来,也难说,会不会有 cosplay 成各种二次元人物的程序员聚在一起打 Hackathon,开 FOSDEM,甚至用自己手中的代码,将这不公正的互联网权力体系敲开一个无法填补的大洞,让新世纪的阳光照进网络的每个角落,在互联网的历史上留下一场「Moe Revolution」。 + +……回到域名本身吧。 + +那这个域名到底可以用来做什么呢? + +说实话,小氯也没太弄清。我在买这个域名的时候,考虑的也并不是用它做什么,而是单纯地觉得,看起来还蛮不错的。如同在老城区的旧货店中,从有些拮据的,但是依然保持着某种风度的慈眉善目的老先生手中,买下的一件小小的玻璃镇纸一般。 + +目前的打算大概是等到 Forgejo 联邦功能实装以后,拿来托管一个自己的公开 Forgejo 实例,把自己的一些个人项目迁移到上面。感觉还蛮适合的,尽管其更适合的用途似乎是收集或者托管一堆很萌的 FOSS。 + +## 若干自由前端 + +自由前端,有时候也叫「替代前端」,[^1]大致意思是第三方开发者创建的非官方界面,用来访问现有网站或服务的内容。动机大体包括原本的前端过于难用,或者是收集过多的用户数据,云云。 + +关于目前已知的自由前端可以去 [Libredirect](https://libredirect.github.io/) 看一看,这里小氯列一下几个自己在部署的吧。 + +| 名称 | 地址 | 后端 | 语言 | 需要账号 Cookie | Zero JS | +| ----------------- | --------------------------------------------------------- | -------------- | ---------- | ----------- | ------- | +| Redlib | [GitHub](https://github.com/redlib-org/redlib) | Reddit | Rust | 否 | 是 | +| GotHub | [Codeberg](https://codeberg.org/gothub/gothub) | GitHub | Go | 否 | 是 | +| Neuters | [GitHub](https://github.com/HookedBehemoth/neuters) | Reuters | Rust | 否 | 是 | +| Wikiless | 已删库 | Wikipedia | JavaScript | 否 | 不明 | +| PixivFE | [Codeberg](https://codeberg.org/PixivFE/PixivFE) | Pixiv | Go | 理论上是 | 几乎 | +| AnonymousOverflow | [GitHub](https://github.com/httpjamesm/AnonymousOverflow) | Stack Overflow | Go | 否 | 是 | + +即使是其中最占内存的 Wikiless,也不过不到 70 MB 的内存占用。而且由于这些项目在技术上大致就是个 proxy,因此需要的系统权限极少。即使是拿着 `user: nobody` 、`read_only: true`、`security_opt: no-new-privileges:true` 或者 `cap_drop: ALL` ~~来玩捆绑 play~~ 也可以照常运行,真正的小而美。 + +由于这些项目大部分时候只需要 `docker compose up -d` 一把梭,小氯就不挨个讲怎么部署了。 + +### 小氯没有自行部署的项目 + +| 名称 | 地址 | 后端 | 语言 | 需要账号 Cookie | Zero JS | +| --------------- | -------------------------------------------------- | --------------- | ------- | ----------- | ------- | +| Invidious | [GitHub](https://github.com/iv-org/invidious) | YouTube | Crystal | 理论上否 | 是 | +| Piped | [GitHub](https://github.com/TeamPiped/Piped) | YouTube | Vue | 理论上否 | 否 | +| Nitter | [GitHub](https://github.com/zedeus/nitter) | Twitter / X | Nim | 是 | 是 | +| Wayback Classic | [GitHub](https://github.com/ticky/wayback-classic) | Wayback Machine | Ruby | 否 | 是 | + +Invidious 这个家伙很有名,常常被和 Nitter 一起拿出来作为自由前端的代表。不过如官方所说,这是个「heavy, bandwidth intensive and technically a proxy」的服务。一个个人实例大概需要 20 GB 空间和 512 MB 的内存,虽说小氯也不是拿不出来,但是对于一个看 YouTube 不多的用户来说,性价比不高。 + +Piped 呢,用的是 Vue,不过似乎没办法部署在静态托管平台上,因此跳过。 + +Nitter 不用多介绍了,神级项目。不过随着 X 的 API 收得越来越紧,Nitter 活得也愈发艰难了。现在我们需要一个真实账号的 cookie(之前好像可以创建大量的临时账号来解决问题),小氯没有也不想注册,而且看 X 极少,跳过。 + +Wayback Classic……这玩意真的能且有必要自托管吗? + +### 浏览器扩展推荐 + +这里主要用于把平时浏览的网址自动重定向到我们的自由前端。小氯找到了两个可用的扩展: + +- [Libredirect](https://libredirect.github.io/):专门做隐私化重定向,可选项很多,支持自动选择实例。 +- [Redirector](https://einaregilsson.com/redirector/):最强大,可定制性最高,可以创建各种类型的重定向,不过需要一点折腾。 + +小氯用的是后一个。写各种规则简直太舒服了,还可以把 jsDelivr 转到国内镜像。 + +### Wikiless 的部署 + +Wikiless 原本托管在紫柚的 Codeberg 上,但是后来改为私有库了(据说 Codeberg 是在维基官方的要求下这样做的,理由是违反了共享许可证,具体情况小氯不清楚)。小氯这里用的是这个维护中的库: + +{{< github repo="Metastem/wikiless" >}} + +小氯大概审查了一下代码,没有发现什么问题,应该是可以用的(免责声明:只是大概审查了一下!)。 + +小氯在想,能不能剥离掉 Redis 的部分,加一个外部图片代理,把项目变成可以在 Cloudflare 部署的呢? + +等小氯试试看吧。 + +小氯温馨提示:Wikiless 的默认语言只有 zh,没有 zh-CN。你可以在后面加 `?variant=zh-CN` 参数来获取简中网页。 + +Redirector 可以创建两个规则: + +```txt +# 中文维基 Wildcard +https://zh.wikipedia.org/*/* +-> https://yourdomain.tld/wiki/$2?variant=zh-CN + +# 其他语言 正则 +^https?://(?!zh\.)([a-z0-9-]+)\.wikipedia\.org/(.*)$ +-> https://yourdomain.tld/$2?lang=$1 +``` + +### Wikiless 和 Wikimore + +~~这俩项目听名字就八字不合~~ + +[Wikimore](https://git.private.coffee/PrivateCoffee/wikimore) 来自著名的 PrivateCoffee,也是一个 Wikipedia 的替代前端,维护得很勤快。界面上和 Wikipedia、Wikiless 差别比较大,不过也挺好看的。 + +缺点大概是对 Docker 的支持不太行(Dockerfile 是社区维护的,小氯部署的时候甚至根本跑不起来,提了个 issue 官方才修好),而且资源占用很高,上面小氯部署的所有项目加在一起也没它高。很符合我对 Python 的刻板印象(~~SearXNG、Domain Admin:孩子们,这并不好笑~~)。果然,人心的成见是一座大山,而泰山不让土壤,故能成其大。 + +### LiteXiv 与 PixivFE + +其实在尝试 PixivFE 之前,小氯还试了另外一个项目,就是 LiteXiv。 + +{{< codeberg repo="Peaksol/LiteXiv" >}} + +这个项目用的是世界上最好的语言(突然激动)PHP。整体而言属于功能简单但是够用,同时界面比较中规中矩的类型。相比 PixivFE 的优点……似乎没什么很大的优点,主要就是明确告诉你大部分的功能可以无 cookie 运行,哦,以及支持简中。 + +而资源占用嘛,也不高,不过相比于 PixivFE 还是高了亿些的(大概是 PixivFE 的四倍)。很符合我对 PHP 的刻板印象。果然,人心的成见是一座大山,而泰山不让土壤,故能成其大(~~梅开二度~~)。 + +而 LiteXiv 也非常坦率地描述 PixivFE: + +> A modern-looking frontend that provides many more features than LiteXiv. + +不过,宝你有没有想到,愿意使用和自托管替代前端的朋友们主要考虑的也不是 modern-looking 呢? + +### PixivFE 的无 cookie 运行 + +上面说了,LiteXiv 相对 PixivFE 的最大优点之一就是明确告诉你大部分的功能可以无 cookie 运行,所以当时小氯还是很纠结了一番的。 + +……所以,你为什么不行?! + +等会,真不行吗? + +无论是 Pixiv 不需要登录就能看插画的政策(还算是有点良心),还是 LiteXiv 珠玉在前,似乎都说明,除了 Discovery 等需要登录的功能之外,这个 cookie 并不是必要的。 + +我试试看。 + +小氯研究了一下,你不填 cookie,或者填一个空的值是不行的,容器会直接报错;但乱填一个值是没问题的,不需要登录的功能完全可以用。只是首页会报 400,看起来有点难受而已。大体规律就是,需要登录的功能需要登录,不需要登录的功能就不需要登录(~~废话连篇~~)。好在我平时对 Pixiv 的使用基本限于看到一个 artwork 编号然后点进去看一眼画,这样对我也足够了。 + +### PixivFE 的 Deno 图片代理 + +PixivFE 的一个关键部件是图片代理。不同于 LiteXiv 只能使用内建代理,PixivFE 允许用户自行配置图片代理,还给出了一个通过带善人 Cloudflare 的 Cloudflare Workers 的方法。这不可谓不妙啊,毕竟带善人那么多 IP 呢。 + +虽然说 Cloudflare 确实有规定: + +> 不得使用服务提供虚拟专用网络或其他类似的代理服务。 + +不过这说的应该主要是研究信息安全,像这样代理一点图片应该是无所谓的。 + +……等会,单文件的 Cloudflare Workers? + +你现在是单文件的 JavaScript……对吧? + +{{< github repo="chlorine3545/pximg-proxy-deno" >}} + +只要是单文件的 Cloudflare Workers,小氯都要做一个 Deno 的版本(骄傲)。 + +至于技术细节并不难,就是写一个 `handleRequest` 函数,转写下主机名,加一个 Referer 和 UA,然后用 `Deno.serve` 启动就好了。其实这个模板可以套到各种需要请求静态资源的地方,比如 Wikimedia、jsDelivr,等等。只要有一个边缘计算平台,我们就可以为所欲为(骄傲)。 + +而 Deno 的速度肯定也没得说,可能是冷门服务的原因,至少比 Cloudflare Workers 快。缺点大概就是免费用量比 Cloudflare 少多了,好在也够用。 + +### 一点小小的开源贡献 + +接着上面 PixivFE 的事情说。 + +在做完 Deno 版本的图片代理之后,小氯的心思开始活络起来:既然做了这个东西,为什么不想个办法让更多有需求的人都用上呢? + +于是小氯向官方提了一个 [issue](https://codeberg.org/PixivFE/PixivFE/issues/146) ,得到了还算是积极的回复。 + +> > What are your thoughts on adding a Deno deployment option? +> +> You'll have to check out the limitations of Deno Playground. Cloudflare Workers allows a proxy server to process up to [100000 requests per day](https://developers.cloudflare.com/workers/platform/limits/#worker-limits) without any other limitations, which is good enough for an image proxy server. (This is why we don't recommend Vercel to host proxy servers since we killed one before) +> +> > Where/how should I submit a PR to contribute this code? +> +> This belongs to the ["Hosting an image proxy server"](https://pixivfe-docs.pages.dev/hosting/image-proxy-server/) documentation page. You can fork the repository, add your section in [this file](https://codeberg.org/PixivFE/PixivFE/src/branch/v2/doc/hosting/image-proxy-server.md), then [create a PR](https://codeberg.org/PixivFE/PixivFE/pulls) from your fork. Or, if you want, I can do that for you :) + +如上文所说,Deno 的限制确实比 Cloudflare Workers 紧很多。但是多一个选择,总归不是坏事,只要把限制明明白白地写好就可以了。 + +于是小氯花了一点时间写了相关的文档,然后手忙脚乱地合并了主分支的更改(没办法,PixivFE 的迭代实在是太快了),最后提了一个 PR。然后就被顺利合并了。所以大家现在看到的文档的[这部分](https://pixivfe-docs.pages.dev/hosting/image-proxy-server/#deno),就是小氯的手笔(铸币大头)(骄傲)。 + +然后第二天,小氯又发现,PixivFE 的文档似乎没有做 i18n(注意不是 PixivFE 没有做 i18n)。 + +看看自己将近 700 分的六级和 7.5 的雅思,小氯忍不住了。 + +当然,由于对 Material for MkDocs 的国际化不太了解(事后证明,这简直是个噩梦,尤其是导航栏的国际化),小氯选择了先做一个 `README.md` 的中文翻译,这还是比较容易的。 + +然后也被接受了。所以如果您的 Codeberg 的首选语言是中文,您默认看到的 readme 也是小氯的手笔(铸币大头)(骄傲)。 + +(话说 Codeberg 的这个功能真的蛮不错的。GitHub 就不行——当然这估计是因为 GitHub 只有英文界面。) + +然后小氯问起了对整个文档国际化的问题,不过主理人表示,希望等项目稳定一些之后再考虑这个问题。这也是很合理的,毕竟说实话,小氯在发现自己提完 `README.zh-CN.md` 的 PR 时,`README.md` 已经改了许多地方时,也是挺头疼的。 + +对于小氯酱这条杂鱼来说,目前对于开源社区最现实的贡献方式大概就是做各种翻译了。可惜由于小氯讲话越来越像入机了,因此已经不能直接把文档口译成地道的中文了 qaq + +### 关于自由前端的碎碎念 + +> [!WARNING] +> 下面的部分极端杂乱和情感化,且可能不具备严谨的逻辑结构。这只能代表此时写文章的小氯的当下的混乱思绪的一部分。 + +自由前端其实是个很矛盾的东西。一方面,它们确实是蛮自由的,可以帮助我们在浏览大量内容的同时尽可能地逃过无处不在的 BIG EXECUTIVE 的监控;另一方面,**它们的存在,就是对自由的讽刺**。我们总爱给自由前端贴「隐私友好」「零追踪」的赎罪券,却忘了这些标签本身就是对互联网原罪的变相承认。就像中世纪教会贩卖赎罪券时宣称「购买即得救」,我们也在贩卖「自建即自由」的幻觉。说明白点,这意味着一个很冰冷的事实:互联网依然是巨头们的天下,所有的用户——甚至不用加几乎,根本无法离开它们的领域而存在。这像极了 [FxZhihu](https://github.com/frostming/fxzhihu) 项目因为破乎收紧 API 而宣告失效时,小氯除了在 Bluesky 上气急败坏地来一句「Shame on you Zhihu」之外,什么也做不了,就连像 Linus 那样痛痛快快地向自己所愤恨者来一个国际友好手势都受制于自己的家教而无法张口。 + +是呀,小氯,你这个家伙,你什么也保护不了。你修不好项目的 API,你不能让知乎放开对未登录用户的限制,你甚至连报复都做不到。你不会想着用自己那几台破 VPS 去把整个知乎的网络干趴下吧?你只能在忍耐的同时发几句牢骚,毕竟,知乎不在乎你这个刺头用户,但是你却离不开知乎上许许多多的好文章。 + +「内容就在那里,但是它们属于我们。你爱看不看。」 + +但是这,似乎也并不是小氯技术力低下的锅。想我政府效率部总负责人、保国公、一字并肩王~~马保国~~接管 Twitter,对各种开源项目大杀四方,不过就是分了那么一点点的力道,从 Nitter 到 Twitter Monitor 到 RSSHub 的各大开源项目都被打至跪地。开源社区的各方大佬们殚精竭虑,也只找到了大量注册临时账号来绕过限制这一种不是方法的方法——哦,现在好像也不能用了。 + +最好玩的是,Twitter Monitor 的开发大佬表示不愿意再浪费时间的帖子,发在 Twitter 上;Gothub 的前任 `1337git`,源代码托管在 GitHub 上;每天对着 VX 的开发团队祖安输出的群友们,活跃在 VX 上。 + +太有趣了,真是太有趣了。既要对着中心化巨头的 API 接口点头哈腰,又要在它们的审查铁幕下偷偷绣红旗;一边用着 GitHub Copilot 的免费版本给自己的信用卡还账,一边在社区里抱怨着它拿着用户代码训练模型。既要又要,真好玩啊。 + +唯物史观早就说过,生产关系不革命,光在浏览器里搞 proxy 算哪门子进步?当中心化平台垄断着数据石油和算力核电站,我们这些「自由前端」不过一群赛博堂吉诃德,骑着树莓派对着 AWS 风车挥剑。可悲的是,连自诩的革命武器,都要依赖巨头施舍的 API 接口活着。哪天对方改个响应头,整个生态就得通宵改代码。 + +这当然并非我们所愿,但这是我们的悲剧。 + +这时候,熟谙此道的诸位估计也要大声疾呼了:**非中心化平台何在**?小氯没经历过那个时代,但是据史料记载,Fediverse,Bluesky,Matrix,Nostr,出来的时候都是光芒万丈的,被寄予厚望的,甚至是被吹捧和神化的,大有「太好了是新的非中心化社交平台我们有救了」的味道。似乎过不了多久,联邦化和去中心化平台就可以占领整个 SNS 甚至互联网的高地。 + +至于现实情况嘛,大家也清楚。被绮丽的幻想蒙蔽双眼的人们当然没能在圣诞节前回家。Mastodon 实例间的信息同步延迟足够让一只树懒写完毕设;某个联邦节点因「包含敏感内容」被拔线时,整个网络的「去中心化」立刻暴露为分布式单点故障的皇帝新衣。普及性嘛:您随便在身边找一个不那么懂计算机的人问一句,能知道 Fediverse 是啥的人估计不会比能默写薛定谔方程的人多;至于某个被老开源正天平旗的开发者们所不屑的 ActivityPub 兼容平台一个多月的时间发展了一亿用户(大概是余下的整个 Fediverse 的三到四倍)……嗯,小氯不评价。小氯只是个可爱的元素娘,不懂那些弯弯绕绕。 + +更好玩的还在后面:整个联邦的服务器,一半在谷歌云,另一半在 Hetzner,哦对了,好像还有挺多用着 Cloudflare 的 CDN。这哪是「用魔法打败魔法」,分明是「用魔法给魔法交保护费」。当年巴黎公社至少敢烧掉梯也尔的别墅,今天的我们却连自建 DNS 都要偷偷用大厂的 Anycast 网络当跳板。倒不是说我们不能沾一点「不纯洁的算力」,但就这个现状,已经足够让葛天氏之民心梗十次了。 + +**所以,为什么呢**? + +最显而易见的,自然是资源。牢软、牢谷随手就能烧掉几十亿美元,而我们连租 VPS 的每月 5 USD 都得含泪舍弃掉几顿外带食品。怎么比?没那个能力知道吗(范大将军音)?这都不是蚍蜉撼树了,是草履虫大战克苏鲁。 + +但是小氯觉得,最大的问题其实并不在这里。朝鲜战争时,中国的经济和军事实力可连美国的零头都赶不上。 + +……小氯在写《[[Hello,Forgejo]]》的时候,清扬老友曾经评论说: + +> 但是我认为 github 重在社区,而不是他本身的功能 + +这话说得太对了。论功能,Forgejo 根本不比 GitHub 差多少。GitHub 能够把目前的 Gitea 和 Forgejo 按在地上锤,可不完全是因为牢软的钱包厚度,而是其 issue 模板、Actions 流水线、Pages 托管、Projects 看板、代码搜索构成的协作生态和庞大的开发者群体以及用户构成的社区规模,早已形成技术领域的「拜占庭式行会体系」。 + +**是了,生态**。 + +你有心从 VX 迁移到 Matrix,却发现你的亲朋好友和同事老板连 Matrix 是什么都不知道;你希望把项目搬到 Forgejo,却发现在 GitHub 用了几年的工作流早就成了九层之台起于累土。每个划时代平台的崛起,本质上都是对资源集中度与用户协作成本的暴力优化。既没有资源,又没有生态,你怎么和人家争啊。 + +而且,生态不仅是技术用户的事,在非技术群体中,这一差距更是判若云泥。当我们在 Matrix 频道讨论「如何用 Rust 重写核心模块」时,99.9 % 的用户正在微信群里用「拍一拍」功能互相调情。这种割裂不完全是技术鸿沟,而更像是**认知代差**的具象化——就像维多利亚时代的博物学家试图向非洲部落讲解进化论。我们幻想中的「全世界用户,联合起来」,在现实中往往演变为技术神父 / 政委与小白用户的永恒割裂。就像试图用《资本论》指导 Tik Tok 网红做直播带货——理论完美,实操荒诞。毕竟,对于我们亲爱的广大用户们,那些在 Reddit 追番、用 Pixiv 存图、靠 Stack Overflow 续命的「数据无产阶级」们,真的在乎 Nitter 实例是否遵循 AGPLv3 吗?当某个自由前端因 API 变更突然暴毙时,他们只会默默切回官方 app,顺手给 Play Store 打五星。这不是背叛,而是**生存理性对理想主义的血腥处决**。 + +至于非中心化替代品,你想依靠「自由、隐私权、去中心化」这些能让技术宅们颅内高潮的卖点去吸引对技术不感兴趣的普通用户?你 Mastodon 算什么东西,你敢说你的平台比 Meta,比 X,比这些世界顶级的互联网巨头做得好?而那些高喊着「用户主权」的 Nostr 协议拥趸,可曾计算过对一个普通用户而言自行保管私钥的代价?当普通人在咖啡馆弄丢存着私钥的 Yubikey 时,他们失去的不仅是社交图谱,更是数字人格的死亡证明。这种「自由」的代价,堪比要求中世纪农民自行铸造货币。 + +**别做梦了,同志们**。 + +那怎么办?干等着奇迹降临,全球互联网生态一夜之间离奇消失,留我们一张白纸上书写新时代的创世纪篇?要是您有这种想法的话,这边建议您去查一个叫 Juan Posadas 的人(姑且算人),他的思想或许您会喜欢的。 + +> 哲学家们只想着如何解释世界,问题在于改变世界。 + +**我们需要联合**。在技术封建主义的铁蹄下,零散的技术宅游击队永远打不赢平台正规军。一台两台 VPS 可以被任何一家企业轻松封杀,那么十万台、一百万台呢?如果我们能通过这种联合建立前端的 CDN 联盟,让自建实例能一键接入抗 DDoS 的分布式盾墙呢?到时候,还有谁敢冒失地对联邦出手?枪杆子里面出政权,你没有足够的实力,谁会施舍你一个眼神? + +或许有人会认为,联合本身就违背了去中心化的初心。的确,进行联合存在另一个中心化乃至极权化的风险,但是这就是我们要平衡的地方。小氯说过,开源运动就像是国际共运。那么,如果敌后的抗日根据地没有团结在党的领导之下,东亚地区恐怕就要玩 TNO 了;如果南斯拉夫的游击队没有在南斯拉夫抵抗运动的旗帜下协调行动,贝尔格莱德到现在估计还挂着第三帝国的万字旗。即使是反对先锋队国的卢森堡主义,也并没有否定先锋党的必要性,只是强调不能放弃工人民主的原则。而无政府主义的理想虽然美好,但是还是 Forgejo 那篇所说的,这种方法的实用性极低。无政府公社联邦的社会治理模型,还没能在任何一个稍具规模的社会——咱们都别说现代社会了,就是原始社会也行——成功实践。马克思主义是实证的科学,如果一个理论毫无实践可行性,就算是再精妙的推理、再美好的前景,我们都要忍痛抛弃。剩下的一种理论,尽管这条路荆棘遍地,但是这也是唯一可行的道路。 + +而且,我们再悲观一点,再现实一点:现在的去中心化生态本身,不就正在孕育新型的中心化吗?某些实例管理员手握封禁大权的样子,活脱脱是数字版《动物庄园》的雪球和拿破仑;某个实例因「政治立场不合」将整个域名拉黑时,所谓的联邦协议瞬间退化为数字巴尔干化的帮凶。就算没办法做到相对好的平衡,像「君主布尔什维克主义」那样用强权要求自由也比看着联邦走向崩坏(有点夸张)强。 + +当然,从技术实践上,一定程度的中心化也是必要的。就拿 SNS 来说吧。社交媒体本身就具有中心化属性,除非我们能做到近乎实时的实例间互联互通,否则只有一个人的社区广场不叫广场,那叫树洞。我们或许喜欢这种若即若离的社交状态(小氯也是),但是你让一个普通用户来回答,谁会喜欢喊一声之后一个点赞的人都没有呢。 + +最重要的是,人民群众是历史的主体。如果我们的目的是颠覆整个互联网的权力体系,就不能把这场「非中心化革命」(我们姑且这么叫)仅仅局限于技术用户中。这确实很难,小氯也常常会觉得和大众打交道是个很麻烦甚至很烦心的事。既然我们——诸位(还是别把自己狂妄地纳入这个范畴吧)有这个能力和志向,那么群众工作,就是绕不过去的一环。无论是把 API 文档翻译成短视频脚本,还是教外卖小哥用 curl 检查平台抽成算法。 + +为了做到这一点,我们有时候——尽管小氯很不愿意说这话——必须要做妥协,无论是用我们精心的设计去吸引用户叛逃,还是在自由前端嵌入可爱的「电子多巴胺注射器」。是的,这样危险,屠龙少年如何才能不成为恶龙;这样卑微,像在摩天大楼的钢架缝隙里播种苔藓;而且经常会很屈辱,像给 Linux 内核套上 Windows 11 的皮肤。但历史早就证明:任何革命想要成功,都必须先学会穿着「敌人」的制服跳舞。当某天非技术用户觉得「哇,这个动漫人物界面的 GitHub 比原版还好用诶」时,我们才算摸到了新世界的门环。 + +我们也要团结一切可以团结的力量,无论是还愿意在盈利之外考虑一些社会福祉的企业,还是冷眼旁观着这场战斗或者闹剧的基础服务提供者。毕竟,以普遍理性而论,你总不能这样: + +![fully-open-source-infra|400](https://img.viento.cc/20250302-fully-open-source-infra.avif) + +……而 Fediverse,Bluesky,Matrix,Nostr,它们不是圣杯,但它们确实是先锋。如同巴黎公社、斯巴达克运动和苏维埃联盟是国际共运的先锋一般。它们不完美,它们有许许多多的问题。但是它们勇敢地迈出了那一步,为我们这些后人留下了宝贵的经验,更重要的是,它们就像是海明威笔下的那副鱼骨——证明我们曾与鲸鱼搏斗,虽败犹荣。 + +> 为什么不试试 Fediverse / Bluesky 呢? + +所以,小氯依然会在每一个希望找到一个能闲着没事发发短博客的平台的老友的评论区留下这么一句话,歪着头,满脸的清澈和愚蠢,像极了 Pixiv 的画师们画的 Goofy ahh big head(铸币大头)的神情。 + +第一,他们确实很可能需要;第二,我们总要反抗。如果我们放弃了,那就真的什么都完了。 + +[^1]: 严格来说,这两者不完全一样,替代前端的范围更广。不过由于大量的替代前端都是 FOSS,并且专注于用户自由和隐私,因此两个词有时候会混用。以下我们统一使用「自由前端」。 \ No newline at end of file diff --git a/content/posts/其他/Farewell,Omnivore.md b/content/posts/其他/Farewell,Omnivore.md new file mode 100644 index 0000000..332936e --- /dev/null +++ b/content/posts/其他/Farewell,Omnivore.md @@ -0,0 +1,109 @@ +--- +slug: farewell-omnivore + +summary: 再见了,Omnivore +tags: + - Omnivore + - 开源 + +title: Farewell,Omnivore +date: 2024-10-30 +description: 本文讲述了作者对 Omnivore(一款稍后读应用)项目终止的感受和思考。文章首先介绍了作者与 Omnivore 的渊源,表达了对其功能和理念的赞赏。接着,作者详细描述了得知 Omnivore 团队加入 ElevenLabs、Omnivore 即将停止维护和服务关闭的反应时的悲哀,虽然 Omnivore 的代码依然开源,但服务器关闭和缺乏完善的自部署文档,意味着 Omnivore 实际上已走到生命尽头。最后,作者表示自己已经彻底离开 Omnivore,探讨了开源项目的风险并展望了可能的替代工具,表达了对开源社区的思考。 +categories: ["图灵机"] +featuredImage: +draft: false +--- + +各位老友们好,我是 Chlorine。本文为紧急加更。 + +园子一向只有 Hello 系列,从未有过 Farewell 系列,也不会有这个系列。因为小氯从不喜欢告别,虽然我们[总要启程]({{< relref "Ephemeralis-Weekly(1):总要启程.md" >}}),但如果不是迫不得已,谁会愿意分开呢。 + +> 人生不相见,动如参与商。 +> +> 今夕复何夕,共此灯烛光。 + +> [!TIP] +> 小氯尊重 Omnivore Team 的一切决定,也感谢他们在维护这样一个优秀产品方面的贡献。愿他们的新事业一切顺利。 + +## 前言 + +虽然这样显得极其啰唆且有水字数的嫌疑,但是小氯还是想说说自己和 Omnivore 的故事。不煽情,只是讲故事。 + +Omnivore 的本意是「杂食者」,对于一个稍后读软件而言,这是个很好的名字。Omnivore 的 slogan 是: + +> Read-it-later for serious readers. + +我最初是从公众号「维客笔记」了解到这一应用的。当时小氯酱刚刚接触 Obsidian 和 PKM 不久,酷爱折腾各种~~花里胡哨的~~工作流,而 Omnivore 免费、开源、跨平台、大陆可用、支持浏览器插件、支持和 Obsidian 联动的特性无疑是一连串的王炸。小氯火速注册了 Omnivore,并开始将其作为主力的 Read-It-Later 工具。虽说这一年小氯本身也没存几篇文章,也并没有使用过几次 Omnivore Syncing to Obsidian 的功能,在实用层面对 Omnivore 没什么依赖,但是潜意识中,小氯早就把 Omnivore 当成了自己「理想工作流」的一部分,甚至是一个理想的信息聚合系统的「原型机」。 + +小氯把自己最喜欢的几篇文章存到了 Omnivore 中,闲来无事就读一遍,也曾经在数个场合强力推荐过这个工具,甚至在[上周的周报]({{< relref "Ephemeralis-Weekly(11):案几之上.md" >}})中也是如此。虽然说 Omnivore 存在一些令人有点不安的问题,例如一些 stale 乃至 rotten 的 issue、PR,莫名其妙的 AI 功能,以及迟迟没有完成且官方并不给出直接回应的自部署文档等,但是小氯都没太当回事,只觉得是开发团队有更重要的事情要做。 + +## 晴天霹雳 + +这个标题很惊悚,或许夸张了点。 + +今天早上小氯翻收件箱的时候,偶然走到了 126 的垃圾邮件列表,发现了一封被 126 归于垃圾邮件的邮件,看样子来自于 Omnivore,标题似乎是什么 Omnivore is joining XXX。当时小氯有点奇怪,因为 Omnivore 一般是不会发营销邮件的。小氯甚至以为这是不是 Omnivore 加入什么联盟了,于是就没怎么管。 + +下午摸鱼的时候小氯又想起了这封邮件,于是去翻了翻。邮件是纯英文的,但是小氯仗着自己阅读能力尚可,直接不开翻译硬读。 + +然而小氯读完之后,对自己的英语能力产生了深深的怀疑,怀疑自己是不是理解错误了。 + +为了保险,小氯把邮件喂给了 AI,得到了一份翻译,与小氯的理解别无二致。 + +当时小氯的反应大概是和 GitHub Issue 上的第一条的标题一样: + +> Seriously? + +然后小氯去了 Omnivore 的官方博客,看到了他们[刚发布不久的文章](https://blog.omnivore.app/p/omnivore-is-joining-elevenlabs),最终确认这是真的。 + +> 小氯小氯,你在这内心独白了半天,到底发生什么了? + +简单来说,就是: + +- Omnivore 的全体开发成员已经加入 ElevenLabs(一家 AI 初创公司),Omnivore 的开发和维护即将停止。 +- Omnivore 的官方服务器 `omnivore.app`(可能也是唯一的稳定服务器,因为 Omnivore 的自托管极其繁琐且没有完整的文档)将于 2024 年 11 月 15 日关停。 + +或者再说得直白(尽管不算很准确)点: + +> Omnivore Team 把自己的产品卖了。 + +issue 里面,大家的反应不一。有人嘲讽,有人指责,更多的是遗憾和祝福,抑或是非常实用地开始讨论和推荐替代品。 + +小氯是什么感觉?小氯算不上气愤,虽然说开发者这样似乎有些对社区不负责,同时这样的处理方式也并不是最好的。如果一定要说的话,小氯有点悲哀, + +不是大哭大笑的悲哀,而是沉默的、无力的悲哀。如同看着陪伴了自己许久的猫咪在眼前被人生生扼死,或者是看着自己费尽心血建起的家在大火中发出噼啪的哀鸣。 + +**一个三年之久、一万两千多个 star 的开源项目,说没就没了。** 虽然源代码还在,既没有 Public Archive,也没有删库,或许日后也会有热心的社区用户接手这个项目继续维护、提供完善的自部署文档,甚至慷慨解囊,部署一个替代 `omnivore.app` 的主服务器,但是,**Omnivore 已经走到了生命的尽头**,这一点,毫无疑问。 + +上次亲眼看见这样的事情,还是 Trilium 的维护模式。但是 Trilium 的开发者只是表示,自己不再有精力对 Trilium 进行积极的开发了,希望逐渐将项目让渡给一位新的主理人。而且 TriliumNext 也迅速补上了这个空缺,所以 Trilium 的维护模式虽然也在社区造成了不小的动荡,但是总体而言,有惊无险。 + +**但是 Omnivore 不一样**。它的开发者成为了新锐 AI 公司的雇员,它的主服务器被彻底地关闭,虽然我们可以导出数据,但是账户删除的失败甚至开始让人怀疑它是不是在出售用户的数据(尽管没有任何事实性证据,且从情感上小氯完全不能相信这一点)。而自部署的缺位,已经将绝大部分的用户隔离于继续使用稳定版本之外。 + +**Omnivore has gone. It will never come back.** + +## 后记 + +谁也不知道 Omnivore 接下来会怎么样,或许只是不再更新,或许是 Public Archive,或许直接删库。但是小氯觉得,第一种可能性更大些。即使是因为开源开发者的那点傲骨,Omnivore Team 也不会在邮件中向用户撒谎的(邮件中承诺 Omnivore 依然会保持开源)。为了以防万一,小氯紧急 Fork 了一份 Omnivore 的库。或许将来的某个时候,小氯会着手继续维护这个项目——尽管这几乎不可能。自己的技术能力几斤几两,小氯酱心里有数。 + +目前小氯已经请求了一次数据导出,并且删除了 Omnivore 账户(至今没有成功),Obsidian Omnivore 插件和手机端的 App 也已经被移除。除非有人能够接受 Omnivore 的开发并且给出一个完善的自托管方式(或者是提供一个免费的托管服务,尽管小氯喜欢前者),否则,小氯和 Omnivore 的缘分就到这里了。 + +或许小氯应该庆幸,Omnivore 在小氯的工作流中还不是一个完全不可或缺的角色,实际上小氯将 Omnivore 整合到 Obsidian 的行为也并不常用。这可能也是在[之前那篇文章]({{< relref "Obsidian与开源.md" >}})中提到的那个巨大的线程中,一位网友的一个观点: + +> 对于无法用最确切的手段保证持续开发的开源项目要保持最低限度的信任,因为你不知道它们什么时候就会停止开发,而你大部分时候都无能为力。 + +那么小氯日后会用什么呢?或许是 Shiori,或许是 Wallabag,或许是 Hoarder,或许是 Linkwarden,或许是 Readeck,或许是 Obsidian Web Clipper,或许是别的什么优秀的开源项目。然而,这已经不是小氯当前要考虑的问题了。 + +我们当然可以就着各个话题写更多,再写写对开源的思考——但是,小氯已经有点累了。而且现在,小氯也没办法把自己纷乱的思绪组织成完整的文章。所以,Be easy on me, okay? + +--- + +在口语课之后回来立即赶完了这篇文章,甚至在课上的 free share 中,小氯也在讲这件事。 + +说实话,小氯上面写的东西或许有点矫情的意思。如各位老友所见,小氯是一只情感有些迟钝的~~元素娘~~原子,因此实际的感觉可能远没有文章中暗示的那么强烈。 + +就这样吧,衷心希望这个标头不要有第二篇。 + +> 十觞亦不醉,感子故意长。 +> +> 明日隔山岳,世事两茫茫。 + +**Farewell to Omnivore。愿世间一直有你,愿世间不再有你。** \ No newline at end of file diff --git a/content/posts/其他/收集一些最近发现的网站.md b/content/posts/其他/收集一些最近发现的网站.md new file mode 100755 index 0000000..bcbfc81 --- /dev/null +++ b/content/posts/其他/收集一些最近发现的网站.md @@ -0,0 +1,173 @@ +--- +title: 收集一些最近发现的网站 +summary: 小氯,你好闲啊 +description: 本文分享了作者Chlorine发现的一系列有趣网站,包括时间线生成器MyLens、在线百科全书Encyclopedia Britannica、中国古代妖怪资料库纪妖、佛罗里达奇闻异事集锦Florida Man、博客封面制作工具CoverPaint、代码图片生成器 Carbon、截图美化工具 Pica、Google的开源图片压缩工具Squoosh、森林声音白噪声网站tree.fm、展示全球风景的WindowSwap、加密消息生成器Saltify、临时手机号提供者AnonymSMS、临时邮箱服务10 Minute Mail、模拟黑客打字效果的Hacker Typer,以及随机跳转至有趣网站的The Useless Web。作者还提到通过搜索和随机浏览互联网可以发现更多有趣的网站。 +date: 2024-01-28 +categories: ["逍遥游"] +tags: + - 安利 +slug: some-websites +--- + +嗨,大家好,我是 Chlorine。 + +最近发现了不少有意思的网站,本来打算在周报里提一下就可以了,奈何有点太多了,因此决定单独写一篇。 + +> **宇宙安全声明** +> +> 我所指的“有意思”标准比较个人化,同时对于常用的实用网站和一些适合摸鱼的网站基本没有收录,大家也不必较真什么叫有意思,你杠你对。 + +## MyLens + +地址: https://mylens.ai/ + +在逛博主[青山](https://yinji.org)的博客时发现的,作用是根据提示词生成相关的时间线,提示词中英文均可。以下是我测试的几个结果: + +![|681](https://img.viento.cc/IMG-20240128120000-1.webp) + +![|676](https://img.viento.cc/IMG-20240128120000-2.webp) + +![|681](https://img.viento.cc/IMG-20240128120000-3.webp) + +生成后可以下载一个 zip,里面有这种长图和一组用来分享的切图,蛮好玩的。 + +## Encyclopedia Britannica + +地址: https://www.britannica.com/ + +我翻译一下,这个网站的中文名叫:《大英百科全书》. + +没错,就是那一部“一部足以代表现代文明精华的世界级经典,辉煌时代的智慧结晶,一所没有围墙的大学,仅次于上帝的权威”。 + +现在都在互联网上了,尽情享用吧。 + +## 纪妖 + +地址: https://www.cbaigui.com/ + +收集中国古代的妖怪们,不错的小说素材发掘地。 + +## Florida Man + +地址: https://floridaman.com/ + +这个网站我发现得比较早, 但是我还是忍不住写了下来. + +佛州地方,物华天宝,人杰地灵。同时感谢佛州官方公开的案件记录,让我们能更直接地欣赏到佛州英雄好汉对于地球 online 中人类系统 bug 的绝妙利用。 + +![|441](https://img.viento.cc/IMG-20240128120000-4.webp) + +比抽象搞笑视频更搞笑,还能顺便练英语,谁不喜欢呢。 + +我随便翻译两个不是很恶心的吧,翻译水平有限,请见谅: + +[佛罗里达一曾盗窃沃尔玛的女子打算在沃尔玛求职](https://floridaman.com/florida-woman-stole-walmart-plans-apply-job-walmart/) + +[一头上有佛州纹身的男子打电话让 911送他回家](https://floridaman.com/state-tattooed-on-head-calls-911-for-a-ride-home/) + +[佛罗里达一男子将“只踩油门不刹车”纹在脖子上炫耀驾驶技术,结果在逃脱警察追捕时撞车](https://floridaman.com/florida-man-with-all-gas-no-brakes-neck-tattoo-crashes-while-fleeing-police-video/) + +[佛罗里达一男子被复活节小兔暴打](https://floridaman.com/florida-man-gets-beat-up-by-the-easter-bunny/) + +[佛罗里达一男子试图射杀小狗,结果被小狗反杀](https://floridaman.com/florida-man-tries-shoot-puppy-puppy-shoots-instead/) + +## CoverPaint + +地址: https://coverpaint.xiaole.site/zh + +一个 Github 的开源项目,用于制作格式统一的博客封面。 + +放下我这周周报的封面: + +![]() ![](https://img.viento.cc/IMG-20240128120000-5.webp) +图片依然来自优秀的 [Unsplash](https://unsplash.com/). + +项目的仓库在 https://github.com/youngle316/cover-paint , 看样子能自部署,可惜现在我只会用 Vercel, 看不懂思密达。 + +## Carbon + +地址: https://carbon.now.sh/ + +字面意思是碳,实际效果相当于碳的某同素异形体。 + +![|558](https://img.viento.cc/IMG-20240128120000-6.webp) + +这个网站的作用是把代码变成易于分享的好看图片,我贴个自己做的图吧。 + +![毁灭吧.webp(doge)|392](https://img.viento.cc/IMG-20240128120000-7.webp) + +各种样式都蛮丰富的,喜欢贴代码图的小伙伴应该会喜欢。 + +## Pica + +地址: https://pika.style/ + +帮你美化你的截图,设计师们可能会喜欢吧。 + +## Squoosh + +地址: https://squoosh.app/ + +来自 Google 的开源图片压缩网站,压缩速度和质量好得夸张。唯一的缺点是不支持批量压缩。 + +自从发现了这个网站后,我就丢掉了访问极度不稳定的 tinypng. 这个网站在我现在写博客的过程中功不可没,我的每一张图片都会丢进去极限压缩并导出 `.webp`,来把大小缩减到最低。 + +源代码在 https://github.com/GoogleChromeLabs/squoosh , 技术力高的朋友可以自己部署,我就只用 Edge 自带的功能,把网页下载到本地变成应用了。 + +值得一提的是,这个网站在大陆也可以访问。 + +## tree.fm + +地址: https://www.tree.fm/ + +聆听森林的声音。当一个白噪声电台挺不错的。 + +## WindowSwap + +地址: https://www.window-swap.com/ + +想看看,此时世界上的另一个人,窗外是怎样的风景吗? + +## Saltify + +地址: https://www.saltify.io/ + +字面意思是盐化,但是和食盐没什么关系。 + +这个网站可以生成带有密码和生命周期的消息,感觉适合用来说悄悄话。 + +## AnonymSMS + +地址: https://anonymsms.com/ + +一个匿名短信验证网站,可以给你提供一个临时的手机号接验证码。原本好像只有米国和带嘤的手机号,现在多了几个地区。 + +不知道能不能用这个网站申请 ChatGPT API 一类的服务?🤣 + +## 10 Minute Mail + +地址: https://10minutemail.com/ + +字面意思,创建一个临时邮箱,和上面的 AnonymSMS 功能相似。 + +## Hacker Typer + +地址: https://hackertyper.com/ + +黑客模拟器,一个在键盘上随便乱打就能假装你是黑客的网站。大小所限,我就不放 GIF 了。 + +![|502](https://img.viento.cc/IMG-20240128120000-8.webp) + +不过,这个网站也只能拿来装装,真想有黑客的技术力,还是得好好学计算机~ + +## The Useless Web + +地址: https://theuselessweb.com/ + +一个网站任意门,可以带你随机穿越到一个没什么用的网站。 + +--- + +先说这么多吧,今天或者明天会更周报。 + +关于发现这些网站的方式,可以在 Google 里直接键入 interesting websites,里面就会有很多推荐,在发现国外网站方面尤其好用。当然,也可以在互联网中随机游走,会随缘碰到一些网站。 diff --git a/content/posts/其他/新域名.md b/content/posts/其他/新域名.md new file mode 100644 index 0000000..1899e1a --- /dev/null +++ b/content/posts/其他/新域名.md @@ -0,0 +1,40 @@ +--- +title: 新域名 +date: 2024-04-16T07:41:00 +slug: new-domain +categories: ["图灵机"] +summary: 这是什么,域名?买一下 +password: +tags: + - 域名 + - 折腾 +description: 本文讲述了作者购买新域名的经历。作者突发奇想,想找一个与 "hello world" 相关的域名,结果在浏览过程中发现了一个让他心动的域名——pursuing.me。这个域名让作者联想到追逐梦想的意义,于是决定购买。在比较了不同平台的价格后,作者发现 Spaceship 的价格更便宜,于是通过开通境外支付成功购买了这个域名。尽管还没决定如何使用这个域名,作者先将其挂到了 CloudFlare 上。 +--- + +各位老友们好,我是 Chlorine。 + +昨天晚上突发奇想(其实是看宣传片看激动了),想去找找前缀是 `hello world` 的域名。当然了,这么好的前缀肯定注册的人挺多,比如不出我所料有 `helloworld.org`,收录了各种语言的 hello-world。 + +然后我开始在 Dynadot 上闲逛,找一些和代码相关的域名,然后就越跑越远…… + +直到我看到了这个域名:`pursuing.me`。 + +当时我就心动了。Pursue,me。 + +> 我不停奔跑,是为了追逐当年那个被寄予厚望的我。 + +然后我当即决定抢一下。 + +在我下单之前,我决定去 Spaceship 看一看,因为我记得这个域名在 Spaceship 是好几万美元,截个图当个乐子。 + +然后我就发现 Spaceship 的价格实际上是 4 美元,比 Dynadot 便宜一半,续费也更便宜。 + +好好好 🤣 + +不过 Spaceship 只支持美元支付。我有 PayPal,但是绑的是普通卡,还没开境外交易,于是我先睡了。 + +今天一早我就起来,下了个某行的手机银行,然后开了境外支付。然后就成功力~ + +最终花销是 34r,汇率略高,但也比 Dynadot 的 60r 便宜了。 + +我还没太想好用它干什么,先挂到 CloudFlare 上吧。 diff --git a/content/posts/其他/新域名(2).md b/content/posts/其他/新域名(2).md new file mode 100644 index 0000000..1720230 --- /dev/null +++ b/content/posts/其他/新域名(2).md @@ -0,0 +1,27 @@ +--- +title: 新域名(2) +date: 2024-04-21T19:31:00 +slug: new-domain-2 +categories: ["图灵机"] +summary: 梅 开 二 度 +tags: + - 域名 + - 折腾 +description: 这篇文章讲述了作者为部署多个服务而购买新域名的过程。由于不想在主域名上堆积二级域名,也不想用新买的 `pursuing.me`,作者决定购买一个便宜的 `.top` 域名。最终,作者在华为云上购买了 `chlorinechan.top`,完成实名认证后将其挂到了 CloudFlare 上。 +--- + +起因是,在我有了虚拟机并部署 Memos 之后,我想部署几个其他的服务,比如 [Music Tag Web](https://github.com/xhongc/music-tag-web)。 + +然后我就想到,在博客主域名堆一大堆二级域名疑似有点不太好,而新买的 [https://pursuing.me](https://pursuing.me) 我还比较喜欢,排除掉。 + +那么似乎就只有一个选择了,那就是再买一个专门堆服务的域名。 + +既然是专门堆服务的,也不用考虑什么 SEO,那就哪个便宜买哪个。放眼天下,最便宜的 TLD 应该就是 `.top` 了。 + +在哪煮米看了下,最便宜的依旧是我 Spaceship。不过 Spaceship 似乎出了点问题,不能搜索 `.top` 域名。所以我选择了稍贵一点的华为云,两个月之后把域名转到 Spaceship 就可以(没错,不能搜索但是能转入,怪死了),甚至由于华为云也很便宜,直接在华为云上续费也中。 + +华为云需要提交实名认证表单,于是我提交了。审核速度很快,也就是一个小时左右。然后就下单了。 + +,chlorine,chan,小氯酱。一共九块钱,比蜜雪冰城的奶茶还便宜(doge)。 + +继续挂到 CloudFlare 上。 diff --git a/content/posts/其他/新域名(3).md b/content/posts/其他/新域名(3).md new file mode 100644 index 0000000..68ec711 --- /dev/null +++ b/content/posts/其他/新域名(3).md @@ -0,0 +1,36 @@ +--- +title: 新域名(3) +date: 2024-05-30T20:56:00 +summary: 梅 开 三 度 +categories: ["图灵机"] +tags: + - 折腾 + - 域名 +draft: false +slug: new-domain-3 +description: 本文讲述了作者为了使用国内免费 CDN 给博客加速,决定进行域名备案,但主域名 yoghurtlee.com 备案期间需暂时关停。为避免影响,作者购买了新域名 efimero.cn。作者很喜欢其寓意,并考虑用其进行备案。最后,作者提出了备案后如何处理两个域名的疑问,并表示对 Hugo 主题 Blowfish 的兴趣。 +--- + +没错,我又买了个域名( + +起因其实是我希望用一下国内的免费 CDN 给博客加个速,而国内的免费 CDN 绝大部分都要备案。 + +那就备案呗,反正我领了套路云高校计划的优惠券,可以实现零费备案。 + +但是我的主域名现在还在对外提供服务,转到套路云之后就得暂时关停了。一停就是好几周,还没办法进行跳转。很难受(当然也可以找一个临时域名,不过这样 Twikoo 就得暂时关上)。 + +所以我决定再买一个域名(前后有什么联系吗?没有)。 + +域名在套路云买的,中国专属的域名 `.cn`,[https://efimero.cn](https://efimero.cn)。 + +Efímero 是西班牙语,就是 ephemeralis 的意思。倒是也可以当得起博客主域名。 + +我个人非常喜欢这个词。生命如蜉蝣般转瞬即逝,只是历史长河中微不足道的一缕微光。我们所能做的,唯有追寻自我,照亮他人。 + +> Como el viento. +> +> 像风一样。 + +此外有一个问题:如果我选择备案,我应该是对主域名备案,用一个占位域名暂时提供服务,还是用新买的域名备案?如果是后者,那么备案之后两个域名如何处理?是原域名直接套 CloudFlare CDN 变成境外访问专属站点,还是对原域名做重定向呢? + +以及我又有了转回 Hugo 的想法,Hugo 的 [Blowfish](https://blowfish.page) 主题还挺好看的。 diff --git a/content/posts/其他/申请 Notion 教育账户的一点事.md b/content/posts/其他/申请 Notion 教育账户的一点事.md new file mode 100755 index 0000000..40366be --- /dev/null +++ b/content/posts/其他/申请 Notion 教育账户的一点事.md @@ -0,0 +1,61 @@ +--- +title: 申请 Notion 教育账户的一点事 +date: 2024-04-01 +slug: notion-edu-account +summary: 教育优惠也许会迟到,但永远不会缺席 +description: 本文讲述了作者申请 Notion 教育账户的经历。作者尝试将账户邮箱更改为教育邮箱以获取 Notion Plus 的高级特性,但遇到验证码延迟的问题。通过联系 Notion 支持并多次尝试,最终成功切换为教育账户并享受了免费升级。作者最后表达了对 Notion 这类 All-in-one 软件的喜爱,并提到了一些替代工具。 +tags: + - Chat + - Notion + - 博客 +categories: ["百草园"] +--- +各位老友们好,我是 Chlorine。 + +众所周知,Notion Plus 有着各种各样的高级特性,例如 Notion AI。更妙的是,Notion 仁慈地提供了教育优惠,只要你是学生/教师,就可以免费获得 Notion 教育账户,除了只有一个成员以外,可以使用 Notion Plus 的所有高级特性。 + +虽然我用 Notion 不多,基本只是拿来发个博客,但是这种白嫖的机会怎么能放过呢。 + +在 Notion 网页版里,点击 Settings & Members-My Account-Change email,原来的邮箱接着验证码,然后输入教育邮箱,等着接验证码。 + +然后就没有然后了。 + +![|500](https://img.viento.cc/emoji/EMJ-confused.webp "黑人问号.webp") + +我刷新页面,检查垃圾邮件文件夹,把邮箱翻了个遍也没翻到验证码。 + +以往这种时候,我就直接放弃了,但是今天我偏不。 + +在右下角找到 support,直接把问题扔进去。 + +> Hi, I'm currently trying to change my Notion account to an educational one, but unfortunately due to some e-mail network issues or something I couldn't receive the identification code. Is there any other way to finish the identification? + +立即就弹出来一个窗口,要求我输入邮箱和学校名称。 + +照做之后,Support 窗口(我也不知道到底是人还是机器人)显示会有支持人员和我联系。 + +OK,那就等吧。结果不到一分钟,来了封邮件: + +![](https://img.viento.cc/IMG-20240401155437.webp) + +嗯,那我先把能做的做了。邮件设置里面把 Notion 的邮件域名开个白名单。 + +然后不一会,验证码到了。 + +看一下时间,是 15:17 的,显然不能用了。 + +也就是说:**Notion 的邮件通知会有长时间的延迟。** + +行吧,有延迟就有延迟,大不了再等会就得了。 + +在 15:56,验证码又来了。然而这次又是错的,可能是时间太长了。 + +好吧,那我再试一次。 + +这次来的倒是快,直接输入验证码,然后就成功切换为教育邮箱了。 + +然后在 Upgrade 界面中划到最底下,点击切换为教育计划即可。 + +然后就可以快乐白嫖了 ~ + +说起来,感觉现在对 Notion 这样的 All-in-one 软件越来越青睐了。Notion 除了不能离线之外,几乎没毛病 ~~对数学公式的支持除外~~ 。现在的替代品,像 Anytype,Affine 和对 Markdown 支持非常好的思源笔记都还可以,等去研究下。 diff --git a/content/posts/其他/离散数学——Bell数.md b/content/posts/其他/离散数学——Bell数.md new file mode 100644 index 0000000..0b04beb --- /dev/null +++ b/content/posts/其他/离散数学——Bell数.md @@ -0,0 +1,82 @@ +--- +title: 离散数学——Bell数 +date: 2024-04-27T07:12:00 +slug: bell-number +categories: ["九章术"] +summary: 算点东西 +description: 本文介绍了离散数学中的 Bell 数。作者介绍了集合的划分,然后引出了 Bell 数的定义并指出其比想象中复杂,并给出了一个递归表达式。最后作者给出了一份计算 Bell 数的 C++ 代码。 +tags: + - 离散数学 +math: true +--- + +最近复习离散数学的时候想到一个问题,记录一下。 + +首先科普一下 **集合的划分** 的知识: + +对于集族 $\pi =\{ x \mid x \ \text{is a subset of A and satisfies some conditions} \}$ (奇妙定义法),如果其满足以下条件: + +1. 不含空集: $\emptyset \notin \pi$ +2. 装住 A: $\cup \pi = A$ +3. 元素彼此不交: $(\forall x)(\forall y)(x \in \pi \land y \in \pi)\to(x \cap y = \emptyset)$ + +那么称 $\pi$ 为 A 的一个 **划分** 。 + +我想到的问题是:对于一个含有 n 个元素的有限集合,其有多少种划分? + +也可以表述成一个更加接地气的形式:n 个不同的球,随便分,有多少种分法? + +这道题目的结果称为 **Bell 数** 。看起来是一个简单的排列组合问题,但实际上比我们想象中复杂许多。利用现在的知识甚至难以给出一个显式的序列表达式,只能给出一个递归表达式: + +$$ +B_{n + 1} = \sum_{k=0}^{n}\binom{n}{n-k}B_{k} = \sum_{k=0}^{n}\binom{n}{k}B_{k} +$$ + +直观意义就是将多出来的那个元素单独一类,和某一个元素一类,和某两个元素一类……和剩下 n 个元素一类。 + +此外我去查阅了一些资料,由于知识浅薄,不敢卖弄,想了解更多的老友可以参考[这里](https://oi-wiki.org/math/combinatorics/bell/)。 + +最后附上一个我闲着没事写的 Bell 数计算代码(`千村万落生荆杞的动态规划.webp`)。 + +```cpp +#include + +using namespace std; + +int dp_1[1000][1000] = {0}; // 二项式系数 +int dp_2[1000] = {0}; // 贝尔数 + +int binary(int n, int k) +{ + if (k == 0 || k == n) + { + return 1; + } + if (dp_1[n][k] != 0) + { + return dp_1[n][k]; + } + int ret = binary(n - 1, k - 1) + binary(n - 1, k); + dp_1[n][k] = ret; + return ret; +} + +int bell(int N) +{ + if (N == 1) + { + return 1; + } + if (dp_2[N] != 0) + { + return dp_2[N]; + } + int ret = 0; + for (int i = 1; i < N; i++) + { + ret += binary(N - 1, i - 1) * bell(i); + } + dp_2[N] = ret; + return ret; +} +``` diff --git a/content/posts/四方行纪:重庆.md b/content/posts/四方行纪:重庆.md new file mode 100644 index 0000000..97b2d5b --- /dev/null +++ b/content/posts/四方行纪:重庆.md @@ -0,0 +1,441 @@ +--- +title: 四方行纪:重庆 +date: 2025-05-06 +slug: travel-chongqing +featuredImage: https://img.viento.cc/cover/travel-chongqing-cover.webp +categories: + - 逍遥游 +tags: + - 旅行 + - 重庆 +series: 四方行纪 +summary: 于是转身向山里走去(误 +description: 本文介绍了作者以「五一」假期为契机,临时起意前往重庆旅行和拜访朋友 W 的全过程。文章以轻松幽默的语言记录了作者出发、到达、住宿、饮食、游览和休闲的真实体验。通过描述重庆的地铁、城市地形、西南政法大学、火锅和江湖菜等,展现了重庆独特的城市风貌和饮食文化,同时穿插了与朋友的互动和日常琐事,以及在炎热天气下选择宅在酒店玩游戏的日常。文章不仅有对重庆地标如解放碑、洪崖洞、嘉陵江夜游等地的亲身体验,更表达了与朋友相伴、随心所欲、无计划出游的轻松心情。结尾部分,作者感慨旅途虽无惊天动地之事,但与朋友共度的时光、沿途的风景和留下的回忆才是旅途的意义所在。整体上,文章既有事实性的旅行记录,也包含了作者主观的感受和思考,突出「迁徙、探索是人类本能」的主题,表达了对未来旅行的期待和对重庆的温情回望。 +wikilinks: +lastmod: 2025-05-06 +--- + +各位老友,上午好。这里是 Chlorine。 + +本文属于园子的新系列——《四方行纪》。这严格来说并不是一个系列,而是一组文章的松散集合,内容就是小氯从物理上在世界上随机游走的记录。该系列统一归属于分类「逍遥游」。 + +## 前言 + +其实「五一出去玩」,属于一个临时起意的决定。小氯的假期一向是回家或者在宿舍蜗居,对于旅游兴趣不大。 + +只不过,在繁忙的期中季的间隙的一个上午,小氯心血来潮地去了附近的另一所大学,和自己的一位老友一起逛了逛,聊了会天。那是个美好的上午,尤其对于期中季精神状态不太正常的小氯来说。 + +然后小氯突然感觉:似乎,出去走走也挺不错的。 + +再看看自己周围都在一边被期中折磨一边畅想自己五一去哪里玩的同学们,小氯就自然而然地: + +> 要不……五一出去看看? + +从实践的角度,这当然没问题,小氯的奖学金买几张机票还是绰绰有余的。而家里人呢,娘亲恨不得每个假期把我撵出去让我到处旅游。 + +那么,去哪里呢? + +由于五一不算长,很远的地方大概是不行的,比如小氯一直想去看看的冰岛。最终小氯选了一个有点远但是不完全远的地方: + +世界渴望之城,重庆。 + +虽然说对于重庆和君士坦丁堡之间有什么关系感到异常困惑,[^1]并且吃辣的能力并不出众,但这并不影响小氯对重庆的兴趣,因为小氯在此地有一位关系好到愿意对彼此倒履相迎的朋友——没错,还是知识面异常宽广,精神不太正常的那位。为了方便,我们下文姑且称他为 W 吧。 + +W 帮我订了酒店(很巧,正好还剩下两间房。而且重庆的酒店价格也很低,至少比小氯所在的城市低不少),而我则在考完物理学期中的那个下午,边打电话边订了机票。老实说,这个机票还是蛮贵的。可能是五一的缘故,也可能是小氯不太会抢便宜的机票吧。 + +然后?没有然后了。小氯喜欢 Set-and-forget 的东西,作业是这样,容器是这样,旅行也是。 + +嗯,倒是 W 很兴奋,一直在计划这几天去哪里。 + +## 起飞 + +小氯出发的日期定在了五月一日。无他,小氯 29 号还有事情,而 30 号的机票价格像宰人航天。 + +从小氯的学校可以比较方便地到机场,只需要倒几班地铁就可以了。不过在临走前,小氯看到了一位同学也要去机场,遂达成了愉快的拼车协议。最终两个人各拿了七八十左右,虽说比坐地铁去机场贵,但胜在省心。 + +两点多出发,坐了将近两个小时的出租车到机场。然后就是平平无奇的值机和安检环节了。不知道为什么,这次的安检似乎格外严格,另一边都检了好几个了才把小氯放过去。 + +值得一提的是,小氯在坐直梯时,上来了一位外国女士。以下是发生的对话: + +- 外国女士:Down? +- 小氯:Down!(下指) +- 外国女士:(上电梯) + +突然想起了高中英语老师给我们讲的笑话: + +> 实际上,现在各位同学的水平已经足够去英语国家旅游之类的了。就比如说,你要让一个老外上车,你根本不用什么高级表达之类的,就车门打开,「IN!」,然后下车就「OUT!」,他们就能明白是什么意思。 + +坐飞机的过程也没什么好说的。小氯前半段在看带的书,后半段在打开电脑敲字。不得不说,飞机的小桌板是真的又小又不稳定。至于小氯是怎么敲字的……您知道为什么「笔记本电脑」叫「Laptop」嘛 OωO + +飞机餐是盖饭。虽说在已知落地后有人招待的情况下这样似乎很不理性,但小氯今天从起床开始到傍晚登机,只吃了一根香蕉和几块饼干。为了活着到达世界渴望之城,还是要吃点东西的。 + +## 行百里者半九十 + +大概晚上八到十点钟,小氯降落在了重庆。这里的夜似乎才刚刚开始,走出航站楼,空气中似乎有一股湿润的草木气息,略带热气的风迫使小氯脱下了自己的外衣。 + +W 订的酒店在市中心附近,因此我们还需要叫一辆车过去。还好在叫车之前小氯看了一眼自己的打车软件,不然可能就被出口的网约车揽客员(不知道这个叫法是否正确)以将近两倍的价格拐走了。 + +一路上的行程都很顺利,直到来到了离酒店一公里左右的位置。 + +据司机说,这里是一个著名的堵车地点。而不知是什么原因,今晚这里似乎有什么活动,因此人流量更大了。 + +「看来我的运气不太好啊。」等待的间隙,小氯随口说。 + +「应该说你运气相当好。不然如果我早知道要来这里,我说什么也不会接这一单的。」司机师傅吐了一口烟,用重庆话和我大声地抱怨。 + +在半小时内前进了二百米后,小氯终于忍不住了,背起自己的背包直接下了车。此地距离酒店也就不到一公里了,虽说小氯腿脚不好,但走过去还是没问题的,甚至还可以小跑两步。 + +然后就在离酒店二百米的地方和 W 惊喜会师了。 + +> 哇贞德食泥鸭!(笑得像个看到杂技表演的小孩子) + +酒店的房间比我想象中小,大概……嗯,大概多大我也说不清楚,总而言之就是一个普通的酒店房间的大小(~~废话~~)。酒店的进门处配备了重力感应地板,一脚踩上去会发生明显的凹陷,提醒你地球 online 拥有业界最优秀的物理引擎。小氯第一下踩上去的时候差点被感动得跪在地上。 + +至于好的地方……大概是正对面的位置有一扇落地窗吧。从这里,可以直接俯瞰嘉陵江。 + +回酒店之后第一件事自然是吃点东西。W 提前订了冒菜,虽说出来旅游了还点外卖有一点抽象,不过反正我们都不愿意出门,一起吃点东西聊聊天也不错。 + +这份冒菜的味道很好,至少比小氯在学校时点的预制菜好太多了。只不过 W 先生点的米饭属实是有点多——小氯的食量也就那么大,一顿最多消耗二两米饭(小氯也不知道这个二两米饭是干重还是直接重量,估计是后者,反正看起来不满一碗),因此只好遗憾地浪费粮食了。 + +## 小面 + +晚上睡了个好觉。第二天大概九点钟,便起床去找 W,一起去酒店的餐厅吃个早饭。 + +餐厅的老板娘(不知道应该叫「女老板」还是「老板娘」,但我只看到了这一位主事人)是个和气的人,喜欢用打着旋的口音向我们推荐食物。在老板娘的推荐下,我们点了一份小面,也算是重庆的特色食物了。 + +这里本来应该有一张图,但由于小氯的摄影能力差到了一种境界,我担心小面会对此表示不满。此外,小氯也懒得给废纸篓镀金了——后面的所有照片基本都是原片直出的,没做什么 PS 之类的。由于 AirDrop 的时候选了兼容格式,可能会有一点损失,但不放大应该看不出来(`敷衍.avif`)。 + +说回小面。这种食物看起来很油腻,但是味道极好,且并不辣。据 W 说,重庆的饮食大致以高盐、高油和辣为特征,这倒是和小氯家乡的(至少是家里的)习惯差不多,因此吃起来反而感觉蛮亲切的。 + +## 星穹铁道 + +在小氯过往的认知里,地铁应该是在地下的。但去深圳的时候,小氯见到了飞驰在大桥上的地铁,从此对于城市轨道交通的位置要求变得无比宽松。 + +但是也没人告诉我……重庆的轨道交通会抽象到这个程度啊。 + +简单说,我们吃完小面从酒店出发,边聊天边爬了大概几层楼的高度,才到达「地铁站」。在坐上地铁之后,我们便看着它……向着天空一路疾驰,然后跨过了大山和江河,行驶在整座城市的上空。 + +嗯,我不玩星铁,谢谢。 + +最终我们停在了李子坝(应该是这个名字),也是顺便见识到了地铁从楼里面穿过去的奇妙景色,小氯酱表示情绪稳定。 + +然后…… + +![liziba-so-crowded|513](https://img.viento.cc/20250505-liziba-so-crowded.avif) + +我知道二号线的人会很多,但怎么会这么多啊喂? + +随着人流艰难地蠕动了十几分钟之后,我们下到了地面——姑且叫它地面吧。然后我们汇入了更大的人流。 + +在重庆中午的太阳下,在前胸贴后背(字面意思)的人群中行走,这种感觉小氯相信大家都不会很喜欢。事实上,小氯回去就中暑了,八成是托了这段旅程的福。 + +等到好不容易走出来了……我们要去哪来着? + +~~吃了最多的苦头却不知道自己到底要去哪,这倒是挺哲学的。~~ + +反正小氯是怕了所有能被称为「旅游景点」的地方了(你不是早就知道这一点吗?~~明知山有虎,就不要去明知山啊喂!~~),只想找个风景不错同时人少的地方看看。 + +思考了几分钟后,小氯对 W 说: + +> 不如我们去你们学校看看吧。 + +## 西南政法大学 + +几十分钟后,我们站在了西南政法大学的某道门前。小氯不清楚这是哪道门,但据说是一个「临时正门」,真正的正门还在修。 + +然后我们使用了某种特殊技巧进入了学校,一边在道路上漫步,一边听着 W 的讲解:这里是第四教学楼,分成南北两个区,这个是汇报厅,不过用得不是那么多…… + +原来,听听其他人讲自己的学校是这种感觉啊。 + +走下汇报厅的一道楼梯,我被眼前的路况震惊了。 + +「你们平时要经过这么大一个坡上学吗?」小氯指着路面不敢置信地问。 + +W 无所谓地耸耸肩:「是的。我说了,我们是山民嘛。」 + +![swupl-slope|427](https://img.viento.cc/20250505-swupl-slope.avif) + +现在我大概明白为什么这里找不到多少共享单车了。 + +越过这里向着另一边走去。然后,小氯看到了可能是整个路程中最震撼的风景。 + +![swupl-roman-square-1|519](https://img.viento.cc/20250503-swupl-roman-square-1.avif) + +![swupl-roman-square-2|518](https://img.viento.cc/20250505-swupl-roman-square-2.avif) + +这是西政的一座广场。据说常常被用作辩论、聚会的场所。 + +老实说,小氯已经想不到什么合适的形容词了,唯一能想到的表达是: + +> 这很希腊 / 罗马。 + +顺便说一句,这个广场原名就叫奥林匹亚音乐广场,现在叫罗马广场。 + +越过罗马广场,走过游泳馆,就是北宿舍区了,也就是所谓的「坡上」。不得不说,西政是个很有趣的学校。如 W 所说,这是个人文关怀很足的地方,居住条件也是一流的。~~此处与某些人均宿舍面积不如牢房的高校形成鲜明对比~~。 + +绕过北宿舍区,是西政的食堂。虽说叫食堂,但实际功能更接近社区中心,据 W 说经常可以看到有小组或者辩论队在这里一边喝着饮料一边研讨。我们在这里稍稍坐了一会。 + +后面的路线小氯记不大清了。大概是绕回了罗马广场,顺带去瞻仰了一下刘伯承元帅的半身像,随后是西政的图书馆和……湖?我并不知道这个湖叫什么名字。 + +![swupl-lib|554](https://img.viento.cc/20250505-swupl-lib.avif) + +不得不说,这幅风景很美。在读书的地方周围有一片水体还是很好的。 + +然后我们绕到了某个食堂周围的一处二手书店,并进去逛了逛,并对西政的书店里为什么会有分析化学表示困惑。再随后的事……坐着校园巴士,到了北门。我们都有些热且疲惫了,需要回去休息一下。 + +此外:一张小小的照片。 + +![swupl-minitrue|497](https://img.viento.cc/20250505-swupl-minitrue.avif) + +这是西政的一栋办公楼。据 W 说,这里有西政的「舆情监控中心」,又被称为西政真理部。 + +## 火锅 + +问:如何让小氯酱脸红? (///∇///✿) + +答:红油火锅。 + +~~你这不是脸红,是红温了吧~~ + +来一次重庆,火锅自然是不得不品尝的一环。据 W 说,由于重庆火锅行业的高度生态位重叠和裹挟式竞争(人话:内卷),任何一家能在重庆生存下来并且具有一定规模的火锅都不会很差。 + +那就让美团帮我们来挑选一下吧。附近评分比较高的一家离我们的酒店大概几百米,那我们就走着过去吧。 + +到了之后……嗯,确实很热闹——有一桌气氛活跃的客人在唱歌。虽然有点……嗯,过于热闹了,但倒也没跑调,蛮好听的。 + +然后?然后也没什么可说的。拿菜单把看起来顺眼的菜都勾一遍,然后等着上菜即可。 + +顺带提一句,我们所坐的桌子能够完整地俯瞰嘉陵江。 + +![hotpot-jialing-river|530](https://img.viento.cc/20250505-hotpot-jialing-river.avif "欢迎来到……夜之城") + +然后自然是经典环节——调酱料。小氯在火锅店里面拌酱的操作一向是很抽象的,简单说就是把各种能加的小料几乎都加一遍,像是一位睡过头了的见习魔女在突发奇想地配药。一般来说,这样吃火锅是很舒适的(小氯喜欢味道浓一些的),但这次小氯犯了难。 + +嗯……首先让小氯科普一下,小氯家乡(至少是家里)的火锅的酱料吃法。我们一般盛好酱之后,会加一勺火锅的汤,用来把酱拌开,同时增加鲜味。 + +但很明显,这种吃法并不很适用于红油火锅。在我将一大勺红色的汤浇到酱料碗里时,我的直觉告诉了我这一现实。 + +> 这样拌好的酱料……似乎不太像是能吃的样子啊。 + +要巧不巧,第一道菜是毛肚。 + +第一口到底有没有脸红小氯不清楚,但是确实是差点红温了,眼泪都要呛出来了(这甚至还是「微辣」)。 + +然后万能的 W 为我推荐了一种奇妙的东西:油碟。 + +简单来说,油碟就是蒜末 + 香油。事实证明向导果然重要,这种料底莫名其妙地解辣。虽说还是感觉很辣,但至少可以比较顺利地吃完这顿饭了。 + +我们边吃着火锅边有一搭没一搭地聊着天,例如刚才下锅的马铃薯还需要煮多久,对于脑花这种食物的评价,《让子弹飞》(~~吃着火锅唱着歌~~),几位老朋友的近况,Dedekind 分割,人群的纪律性,如何和 W 的群友炫耀这几天的现充生活,~~以及小氯到底是不是女孩子的问题~~。中间还遇到了一位付费点歌的歌手,虽说我们显然没有点歌的需求,但出于尊重还是礼貌地聊了两句。希望他能在下一桌开张。 + +## 蜗居 + +> [!TIP] +> 下面这段话没有什么关于重庆旅行的介绍,同时涉及大量的 *Hearts of Iron IV* 和 *The New Order: Last Days of Europe* 的黑话,您可以选择性阅读。如果感觉读不懂,别担心,这很正常。可以去看看 TNO 相关的科普——如果您对一个在黑日下破碎却又残留着希望的反乌托邦感兴趣的话。 + +那么第二天白天,小氯和 W 做了什么呢? + +答案:什么都没做。 + +开玩笑,就重庆白天那个天怒人怨的温度,一次就已经要坏掉了好吧…… + +既然不打算出去,那么自然也需要找点别的乐子。然后 W 就给小氯展示了一点好看爱看的东西——TNO 实况。 + +> 这究竟是哪位神通广大的贵公子,居然能把电话打到我的总指挥部?(拿起电话)喂,您好?哦,是麦乐送啊,能麻烦您放到 XXX 房间门口吗?有电梯可以直接上来。好的,好的,麻烦您了,谢谢,再见。 + +我们选择的势力也非常经典——布里亚特,萨布林同志。 + +就游戏本身而言,总体还算顺利:开局先打伊尔库茨克(审判牢同志亚戈达),再吞赤塔、阿穆尔(此处鞭尸一下罗渣,又屑又弱,以一己之力拉低了整个远东的道德水准),然后再打马加丹(神授国这局被马加丹吞了,唉,神父也是好人呐,希望他去汇报工作的时候和方济各教宗能相处愉快)和一个空壳子统一远东,然后就是全俄吃鸡大赛半决赛和决赛,间隙种田就完事了。 + +最难打的是半决赛。中西伯利亚赛区如果是黑军出线的话,应该是可以和平统一的(呜呜呜,安康贴贴)。很可惜出线的是中西伯利亚大公国(克麦罗沃)。打起来非常费劲。没办法,远东太穷了,拼尽全力才能种出来二十多个生产单位,人家中西伯利亚随随便便就种了四五十个。最后没办法,开控制台 `annex` 了(~~大公国:你是真的苟~~)。 + +不过进决赛了其实就好打了。因为这一局的西部赛区非常抽象:西西伯利亚出线的是黑联(噔噔咚),而西俄方面萨马拉(苟俄键弗拉索夫)居然把西俄革端了(朱可夫带元帅你是怎么了啊)。然后萨马拉和黑联开始互掐,拉锯了半天,最后萨马拉把黑联吞了(审判未遂)。Emmm,怎么说呢,苟俄键虽然也不太拟人,但是和黑联相比那还是救主了好吧。原本以为这局萨马拉这么强,又要控制台神力了,然而事实是被我们一路平推。红军最强大! + +具体路线的话,萨宝嘛,鉴中之鉴,我们自然是要走一些理想主义的路线的。唯一有点小缺憾的是审判 NKVD,为了发展需要还是选了改组而不是解散(此处继续鞭尸布哈林和牢同志)。此外玩着玩着还出了一个稀有事件,就是老美的工业援助。据 W 说,之前从来没见过这个事件。怎么说呢,在 TNO 的世界线里,老美已经算很鉴了好吧(~~所以这里我没有叫它牢美~~)。 + +然后最后,把萨马拉推了之后,就可以点超事件统一俄罗斯了。BGM 响起那一瞬间的感受,简直无法用语言形容。 + +> И вновь продолжается бой.  +> +> 战斗仍然将会继续。 +> +> И сердцу тревожно в груди...  +> +> 激情满怀心在飞跃…… +> +> И Ленин - такой молодой,  +> +> 列宁是如此的年轻, +> +> И юный Октябрь впереди!  +> +> 年轻的十月人向前进! + +所以……如果你时常感觉情绪低落,又恰巧会玩 HOI4 的话,不妨去试试布里亚特吧。不需要追求速通、无伤或者是别的什么成就,甚至不需要你独立地打下来(适当开开控制台是可以接受的),你只需要用自己的方式讲一个在现实中几乎不可能的左翼的童话故事,以及注意看国策介绍和事件文本。相信在超事件 BGM 响起的时候,你会获得一些面对生活的勇气的。 + +> 坚信生活的美好,保持乐观的态度,要知道革命总是无往不胜的。 + +~~其实还打了一局护国军,结果出 bug 被高卡卡端了~~ + +## 江湖菜 + +大概蜗居到四点钟,W 提议提前出发——原因很明显,为堵车留出一些余量。小氯同意了,尽管并不知道要去哪。 + +然后是平平无奇的坐车。由于小氯有点中暑,因此大部分时间在闭着眼睛休息。再睁开眼睛时,已经到渝中区了。 + +这里似乎是什么美食街之类的地方,但并不是大商场,只是许多店铺和几栋大楼挤在一起。街边可以看到在石墩上下象棋的老者(我们还看了一盘),在楼梯上有大声争辩甚至是吵架的人。空气有些发闷,川菜浓郁的香气在迟滞的空气中打旋。 + +「重庆就是这样嘛,江湖气很足。」W 一边慢下脚步等我,一边回头对我说。 + +我不知道怎么回应,只能点头表示同意。 + +听着 W 科普什么是「码头文化」,小氯的脑子里想的却是另一些东西——所谓的江湖菜。 + +这个词又是在高中时的一道语文阅读题中看到的。可惜的是,小氯对于其中大部分的情节都记得不甚清楚了。唯一比较清晰的是文中对鱼汤的评价: + +> 鱼汤泡饭,鱼肉佐酒。即使是在凄风冷雨的江湖夜,人也会快活得荡气回肠。 + +街头巷尾的馆子,不同于金碧辉煌的大堂的味道。粗犷的,浓烈的,热气腾腾的,抱成团的油烟在掀开盖子的瞬间炸开、升腾,熏得镜片满是水雾,人的脑子被烟火气冲得晕晕乎乎。不知道这顿饭是否能有幸见识到江湖菜的味道。 + +这么胡思乱想着,脚步已经停在了一家店的门口——一家装修得不错的店面,门边有很多招牌菜的介绍。 + +……所以什么是蹄花?是炖猪蹄吗?如果是的话,那还挺好的。 + +坐定,一起点了几道菜。一道炖蹄花,一道水煮肉片,还有些别的菜。等会,为什么北冰洋点了四份啊喂? + +最先上来的是……米饭。口感还好,偏硬,但很香,类似于家里的饭锅味道,但淡一些。 + +然后就是蹄花了。不出所料,果然是猪蹄。 + +![chongqing-pork-trotter|495](https://img.viento.cc/20250504-chongqing-pork-trotter.avif) + +照片拍得不怎么样,但是这道菜真的很美味。猪蹄炖得软烂,汤的话……我能这么形容吗?就好像猪蹄把它所有的营养都送给了这些液体,而自己只留下了口感一样。 + +不过最让我吃惊的还是水煮肉片。倒不是因为我们需要在一大碗辣椒中找肉和蔬菜,也不是因为这种满是辣椒却不太辣(反而偏鲜)的口感,而是因为…… + +> 水煮肉片为什么会有这么多肉? + +是的,在小氯的高中食堂,水煮肉片是一道「名菜」。不过,没有这么多辣椒,没有汤,同时里面至少 75% 是蔬菜。 + +最终我们都吃撑了。在车上休息的时候,小氯曾经迷迷糊糊地想,太难受了,晚上可要少吃一点。但是事实证明,在川渝菜系面前,你吃不下东西和你吃不下东西完全是两回事。 + +不知道这顿饭能否叫作正宗的江湖菜,不过小氯是无所谓的。而且,江湖菜似乎也没什么正宗之说吧。 + +## 城上 + +吃完之后,我们在附近的大街漫步。W 说:离这里也不远,我们走着过去吧。 + +小氯点头应是,尽管完全不知道要去哪。因为我们已经计划好晚上去坐一坐游轮,小氯便以为是去买票一类的。 + +一边聊天一边走着,一边消耗着没喝完的饮品。渐渐地,四周的人多了起来,而且似乎都在与我们向着同一个方向前进。 + +「喏,就是这。」W 停下了脚步,指着百米开外的一座建筑,在四周的高楼大厦中显得很扎眼。「看起来和周围的城市有点格格不入。」 + +小氯有些奇怪地绕到了建筑面前,然后沉默了。 + +> 「人民解放纪念碑」 + +原来之前计划要来解放碑看看,是真的啊…… + +顺便科普一下这是什么地方吧。 + +> 抗战胜利纪功碑暨人民解放纪念碑,本名抗战胜利纪功碑,1949 年后改称重庆人民解放纪念碑,简称解放碑,位于重庆市渝中区解放碑中央商务区的中心地带,民族路、民权路、邹容路交汇的十字路口处,是重庆的地标。 +> +> …… +> +> 1949 年 11 月 30 日,中国人民解放军攻占重庆主城。1950 年 10 月 1 日,西南军政委员会更改碑上文字和图案,刘伯承改题“重庆人民解放纪念碑”,简称“解放碑”,由纪念中国人民抗日战争胜利变为纪念重庆解放。 + +同时在这里,小氯拍下了来重庆之后第一张带有自己的照片。 + +……小氯的娘亲非常擅长拍照——尤其是人物照,但小氯并非如此。所以小氯出去时,通常只拍风景,不然回去之后看自己的商业假笑会尴尬得缩成一团的。 + +离了解放碑,我们朝着另一个方向走去。穿过中英联络处旧址旁边的马路,穿过叫卖着冰粉和路边火锅的小巷。七拐八拐,似乎进了另一条更狭窄的道路。 + +![hongyadong|364](https://img.viento.cc/20250506-hongyadong.avif) + +「能看出来我们现在在哪里吗?」W 一边穿行在人群之间,一边回头问我。 + +「在城墙上。」我毫不迟疑地回答。 + +「很对。」W 顺手指了指下方的江滩,「如果你是这座城的驻军将领,现在敌军从这里登陆了,你应该怎样在这里把他们防御下去呢?」 + +……这我怎么知道啊?!岸防炮或者架设机枪,大概? + +走了一会,我们开始顺着台阶慢慢下行。台阶看起来有些高低不一,我们每一步都走得小心翼翼。四周的游人热热闹闹的,和我们擦肩而过。 + +「你应该听过这个说法吧?在重庆,地面实际上可能是十几楼。」当我们终于下到某个地方时,W 对我说。 + +小氯点头,然后看到了这里的标识路牌…… + +> 「洪崖洞」 + +![hongyadong|429](https://img.viento.cc/20250505-hongyadong.avif "自底向上地看洪崖洞") + +好吧好吧,原来随心而动并且完全不做计划的,只有小氯一个啊…… + +以及,小氯感觉自己这一趟似乎完全在坐享其成,所有的行程都是朋友安排的(笑哭)。 + +最后,这张照片摄于洪崖洞的一座咖啡馆门前。在我眼中,照片中的事物是一件绝佳的现代艺术品。 + +![surveillance-camera-in|358](https://img.viento.cc/20250504-surveillance-camera-inside-the-cage.avif) + +## 江上游 + +从洪崖洞下来之后。我们来到了江边的平台等候游船。这里的人极多,好在我们也并不急,干脆找了个还算清净的地方等待着了。 + +![hongyadong-twilight|502](https://img.viento.cc/20250505-hongyadong-twilight.avif "在江边拍到的夕阳") + +期间还顺便看到了洪崖洞的亮灯仪式,只不过当时天还未完全黑下来,缺少了一点点的震撼。 + +> 一声钟响,祝游客朋友们平安喜乐 +> +> 二声钟响,祝游客朋友们八方来财 +> +> 三声钟响,祝游客朋友们福运绵长 +> +> 灯亮—— + +大致是七点多吧,游船开始登船了。夹在人群中过了码头,一点点挪动到了临江的位置。 + +- W:要坐哪一艘呢? +- 小氯:看起来都一样诶……不如我们摇个随机数吧。 +- W:此处禁止写代码啊。 +- 小氯:(亮出手机)咱有随机数生成器~ +- W:6。 + +所以我们就登上了其中一艘游轮。在犹豫了一会后,我们加了一些钱,换到了一个船头甲板的位置。事实证明,这是个无比正确的选择。 + +![cruise-scenery-1|480](https://img.viento.cc/20250505-cruise-scenery-1.avif) + +![cruise-scenery-2|480](https://img.viento.cc/20250505-cruise-scenery-2.avif) + +「感觉如何?」坐在我对面的 W 笑着问。 + +「此造物主之无尽藏也。」小氯眨了眨左眼。 + +我们举起橙汁,碰了个杯。 + +## 归途 + +是的,我的行程就到此为止了。两天三夜听上去有些过于匆忙,但这是我能安排出最多的时间了。 + +而且,小氯自认为玩得很尽兴,也没有什么可以耽搁的。 + +由于小氯早上起来还有一点事情要处理,加之航班的时间比较早,小氯大概四点钟就起床了。和 W 简单告了个别,就搭乘上预订好的网约车,前往自己来时的机场。 + +当小氯意识到怎么回事时,自己已经在归途的经济舱中,睡眼惺忪地敲着这些无意义的文字。 + +想想看,整个旅途中,最大的一笔开支换来了窄小的空间、颠簸、耳鸣和困倦。 + +好荒诞呐。 + +--- + +那到此为止,这次重庆之旅就算是基本圆满地结束了。 + +要说去做了什么惊天动地的事,或许并非事实;但在高坡俯瞰的风景,在江上吹过的晚风,和朋友言笑晏晏的时光,以及留下的几十张照片,大概是真实存在着的吧。 + +那么再见了,群山中的城市。我不知道我是否会再回来,但我知道,我将自己的一部分留在了你怀中,带着你,幻想着下一个目的地。大概并不是为了去做什么:迁徙,探索,这是演化赋予人类的本能。 + +那么下次……我们,要去哪里呢? + +[^1]: 解析:「世界渴望之城」一般是指君士坦丁堡,但不知道为什么,有人将这个称呼转接到了重庆身上。 \ No newline at end of file diff --git a/content/posts/图灵机/macOS配置GPG签名Git提交.md b/content/posts/图灵机/macOS配置GPG签名Git提交.md new file mode 100644 index 0000000..afb339b --- /dev/null +++ b/content/posts/图灵机/macOS配置GPG签名Git提交.md @@ -0,0 +1,170 @@ +--- +slug: macos-gpg-sign-git-commit + +summary: 太好了,小氯,你可是解决了大问题啊。 +tags: + - Git + - 折腾 + - GPG +title: macOS配置GPG签名Git提交 +date: 2024-07-23 +description: 本文详细介绍了如何在macOS上使用GPG签名来验证提交者身份的过程。作者从GPG的历史和功能开始,讲述了其加密和签名的重要性,接着指导读者如何在Mac上安装和配置GPG,包括生成密钥对、在GitHub上设置GPG密钥,以及如何配置Git和VS Code以支持GPG签名。文章还提到了Obsidian Git的配置,并分享了一些解决常见问题的经验。通过这些步骤,用户可以确保他们的Git提交是经过验证的,增强了提交的安全性和可信度。 +categories: ["图灵机"] +featuredImage: https://img.viento.cc/cover/macos-gpg-sign-git-commit-cover.webp +draft: false +--- + +各位老友们好,我是 Chlorine。 + +闲来无事水篇文章,记录一下我刚刚解决的一个心头大患。 + +## 前言 + +在咱们看 GitHub 上的 commit 的时候,往往会看到这样的情景: + +![](https://static.quail.ink/media/d2ng6hm25r.webp) + +那边那个好看的绿色 badge 是怎么来的捏?咱们可以猜一下。Verified,经过验证的,那验证的是什么?自然是提交者的身份,标明这个提交是由仓库的作者亲笔所为,而不是由路边的哪个路人甲或者是不怀好意有 bear 来的攻击者提交的。 + +那怎么做这种「我是我」的证明呢?方法就是通过咱们今天要讲的 GPG signing。 + +## What's GPG? + +以下内容来自 [Wikipedia](https://zh.wikipedia.org/wiki/GnuPG): + +> GNU Privacy Guard(GnuPG 或 GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG 是自由软件,遵循 IETF 订定的 OpenPGP 技术标准设计,并与 PGP 保持兼容。 + +嗯,好像懂了,又好像没懂,听君一席话,如听一席话。 + +简单来说吧。这个故事要从 1991 年开始讲起。那个时候有一个程序员大神,名叫Phil Zimmermann。PZ 这人呢,是个极其看重隐私的「偏执狂」(注:这个词没有贬义)。为了躲避烦人的监管,他自己写了一个名叫 PGP 的东西。PGP,全称是Pretty Good Privacy,是一个用来给 Email 和各种信息加密的东西。 + +这玩意有什么用呢?比方说,你给你的朋友写了一封邮件并且使用 PGP 进行了加密,内容是: + +> 今天下午天气不错,要不要约个饭?听说酸菜鱼窗口出了新的番茄锅底! + +有了加密,即使是你的邮件被截获了,截获者打开一看,由于没有「钥匙」,只能看到里面写的是: + +> 玛卡,巴卡,阿卡,哇卡,米卡,玛卡,呣! 玛卡, 巴卡,阿巴,雅卡,伊卡,阿卡,噢! 哈姆,达姆,阿卡嗙,咿呀呦~ 玛卡,巴卡,阿卡,哇卡,米卡,玛卡,呣! + +监管者:?(`黑人问号.webp`) + +但是你拥有「钥匙」的朋友,却能完整地读到你的邮件。这样就保证了隐私的安全。 + +那这个功能难道不能破解吗?理论上当然可以,但是难度基本相当于让你一粒一粒捡完现在撒哈拉沙漠的沙子。 + +听起来是个好东西,对吧?很可惜,PGP 是个商业软件。 + +这就有点坑爹了。所幸,万能的开源社区早就帮我们搓出来了一个符合 OpenPGP 标准的完美替代品,那就是 GNU Privacy Guard,简称 GNUPG 或者 GPG。这中间还有很多困难,但是已经被我们伟大的前辈们一一克服了。咱们这群后辈只要坐享其成就可以了。 + +GPG 的应用极其广泛,包括但是不限于邮件加密、文件完整性验证等。当然了,今天我们只讲 Git commit signing。 + +## 安装 GPG + +OK,废话讲完了,咱们正式开始配置 GPG。 + +首先我们需要安装 GPG,自然还是用万能的 Homebrew: + +```bash +brew update +brew install gpg +brew install pinentry-mac +``` + +(如果您连 Homebrew 都没安装,或者都不知道是啥,我合理怀疑您是否真的是 Mac 的持有者以及用得到 GPG Git 的人。) + +安装完成之后,检测一下安装是否成功: + +```bash +gpg --version +# 别的命令也行 +``` + +## 修改配置文件 + +下面的内容实际上就是写入文件,大家大可以各显神通。 + +```bash +echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf +echo "use-agent" >> ~/.gnupg/gpg.conf +echo 'export GPG_TTY=$(tty)' >> ~/.zshrc # 如果你用的不是 Zsh,请根据你的终端修改 +``` + +然后重启电脑。 + +## 生成 GPG 密钥对 + +GPG 的工作需要一对公私钥。重启之后,我们来生成我们所需的密钥。 + +键入命令: + +```bash +gpg --full-generate-key +``` + +会出现一些交互式命令行选项,大部分按照默认即可。姓名、邮箱和备注按照自己的情况填写(邮箱推荐填写自己用于 Git 提交、且在相关平台——如 GitHub 上绑定过的邮箱)。 + +注意!关键来了!下一步应该是输入密码,但是你应该看见的是一个**类似这样的 GUI**: + +![](https://static.quail.ink/media/3869lueyn0.webp) + +而不是一个命令行 UI! + +密码随便写,记得一定要勾选「存储在钥匙串中」的选项! + +生成密码后,我们键入: + +```bash +gpg --list-secret-keys --keyid-format LONG +``` + +然后应该会输出一串类似这样的东西: + +```bash +/Users/chlorine/.gnupg/pubring.kbx +---------------------------------- +sec ed25519/xxxxxxxxx 2024-07-23 [SC] + yyyyyyyyyyyyyyyyyyyyyyy +uid [ 绝对 ] (你的相关信息) +ssb cv25519/zzzzzzzzzzz 2024-07-23 [E] +``` + +把 `xxxxxxxxxx` 对应的那一串字符复制下来,这就是你的 Key。 + +然后键入: + +```bash +gpg --armor --export <你的 Key,不带两边的尖角括号,下同> +``` + +把输出的东西复制一下,注意,`-----BEGIN PGP PUBLIC KEY BLOCK-----` 和 end 的也要复制。 + +在[这里](https://github.com/settings/keys)配置你的 GPG 密钥,名字随便起,把刚才那一堆粘进去就行。Gitee 和 Codeberg 同理。 + +## 配置 Git + +生成密钥后,我们略略配置一下 Git: + +```bash +git config --global commit.gpgsign true +git config --global user.signingkey <你的 Key> +git config --global gpg.program /opt/homebrew/bin/gpg +``` + +## 配置 VS Code + +VS Code 内置了方便的 Git GUI,但是如果不合理配置,就无法对 Git commit 进行签名,从而出现各种奇奇怪怪的问题。 + +说来也简单,如果你严格地按照我们上面的步骤走的话,直接在设置中搜索 `git.enableCommitSigning` 并启用即可。 + +## Obsidian Git + +不需要任何配置,直接用就行了。因为我们刚在 Git 里面配置了 GPG 程序的位置,应该不会出现找不到 GPG 的错误。 + +## 结语 + +GPG 这个事我配了不知道多少次,经常出现 GPG failed to sign the data。我知道应该是在图形界面没法配置密码输入,但是不知道怎么解决,心很累。所幸是搞好了。作文以记之, + +## 参考资料 + +1. https://github.com/microsoft/vscode/wiki/Commit-Signing +2. https://github.com/Vinzent03/obsidian-git/issues/21 diff --git a/content/posts/图灵机/动手折腾:用SSH解决Oh-my-Zsh的更新错误.md b/content/posts/图灵机/动手折腾:用SSH解决Oh-my-Zsh的更新错误.md new file mode 100644 index 0000000..7c3ef3b --- /dev/null +++ b/content/posts/图灵机/动手折腾:用SSH解决Oh-my-Zsh的更新错误.md @@ -0,0 +1,54 @@ +--- +title: 动手折腾:用SSH解决Oh-my-Zsh的更新错误 +date: 2024-05-09T08:14:00 +categories: ["图灵机"] +tags: + - 折腾 + - Zsh + - 博客 +date: 2024-05-09T22:55:00 +slug: update-omz-with-ssh +summary: 小小的经验 +description: 本文介绍了作者使用 SSH 作为 Oh-my-Zsh 的更新源,用于解决中国大陆更新不畅的问题的过程。 +--- + +Oh my Zsh 的默认更新环境是 HTTPS 的。而由于 GitHub 对国内铀溴的支持,即使是开了科学技术也时常出现访问失败的情况。所幸 GitHub 的 SSH 登录比 HTTPS 靠谱许多,只要有科学技术基本都能成功访问,速度也很好。 + +所以我们只要设法将 Oh my Zsh 的拉取源改成 SSH 即可。 + +一般来说,Oh my Zsh 的安装目录是 `~/.oh-my-zsh`,先用 `cd` 进入: + +```bash +cd ~/.oh-my-zsh +``` + +显示一下远程仓库地址: + +```bash +git remote -v +``` + +发现是 HTTPS: + +```bash +origin https://github.com/ohmyzsh/ohmyzsh.git (fetch) +origin https://github.com/ohmyzsh/ohmyzsh.git (push) +``` + +直接切换链接: + +```bash +git remote set-url origin git@github.com:ohmyzsh/ohmyzsh.git +``` + +然后再执行一次 `git remote -v` 查看是否更改成功即可。 + +然后再执行 + +```bash +omz update +``` + +就可以成功更新了。 + +![|590](https://img.viento.cc/IMG-20240509082331.webp) diff --git a/content/posts/图灵机/升级系统那点事.md b/content/posts/图灵机/升级系统那点事.md new file mode 100644 index 0000000..6c29214 --- /dev/null +++ b/content/posts/图灵机/升级系统那点事.md @@ -0,0 +1,129 @@ +--- +slug: upgrading-systems + +summary: 小氯的奇妙冒险 +tags: + - macOS + - Linux + - 折腾 +title: 升级系统那点事 +date: 2024-09-18 +description: 本文介绍了作者更新系统的经历。macOS Sequoia 的更新过程虽然遇到了一些问题,但新功能如 Markdown 预览对其有帮助。接着,作者提到了 iOS 18 和 iPadOS 18 的顺利升级,期待苹果能够专注于产品体验的优化。随后,作者讲述了 Ubuntu Server 24.04.1 LTS 的更新经历,解决了 SSH 连接中断的问题。最后,作者表达了对全面拥抱开源的兴趣,尤其是 Fedora 和 Manjaro 发行版,以及 Framework Laptop 的潜在购买计划。 +categories: ["图灵机"] +featuredImage: https://img.viento.cc/cover/upgrading-systems-cover.avif +draft: false +--- + +各位老友们好,我是 Chlorine。今天给我的设备们更新了系统,咱们大体讲讲。 + +## 前置 + +虽然本文的内容是技术和生活分享,但是小氯还是希望提醒各位老友,今天在历史上是一个极为特殊的日子。忘记历史,就意味着背叛。万望各位生于华夏的老友,勿忘国耻。 + +## macOS Sequoia + +大概是两天之前吧,Apple 发布了 macOS 的最新版本——macOS Sequoia 的正式版。 + +Sequoia 的意思是「红杉树」,这里说的应该是内华达山脉(Sierra Nevada,没错,就是那个 High Sierra)的红杉国家公园。据说牢果喜欢用 California 的一些地理景观命名操作系统,比如过去的 Big Sur(大苏尔,加州中部海岸的一个地区),Monterey(蒙特雷,一个海滨城市),Ventura(文图拉,旅游胜地),Sonoma(索诺马,著名的葡萄产地)。 + +### 踩坑 + +刚开始我更新的时候反复踩坑,要么是显示什么「找不到所需的 Rosetta 更新」,要么速度极慢。我本来以为是校园网的抽象活,毕竟校园网的优秀质量和高度稳定性早已通过了实践的考验(在教学楼连不上网)。后来我想到可能是代理的问题,就把网络设置改了下,速度就快多了。 + +总更新时间不超过一个小时,至少是在我衣服洗完之后就更新好了。然后重启电脑即可。 + +### 体验 + +总体而言,macOS Sequoia 的设计风格和 macOS Sonoma 基本没区别,但是细节上有变化,比如通知变窄了。之前听说 macOS Sequoia 的设计风格会大改,看来是没实现。 + +牢果官方说的几个更新点对我来说几乎没什么感觉,比如 iPhone 镜像,这个甚至在 Windows+Android 都能实现(借助牢软出的一个软件),不能拖拽文件的话对我来说几乎就是毫无作用,最多就是接一个通知;内置密码管理器,我有 Vaultwarden,用不着这个(但是我还是把密码导入了一份,毕竟不知道哪天服务器就连不上了,有一手准备总是好的);Calendar 和 Reminder 同步,这个属于概念神,但是我目前用得不多;而 Apple Intelligence 还没发布,发布了估计也用不了。而且我也不想用,让 AI 盯着我的一举一动我实在是令人头皮发麻。不知道牢果后续会不会加什么抽象的狠活,如果实在是太离谱,我就得考虑锁定版本或者换到 Linux 了。Fedora 和 Manjaro 都不错,配置一个 KDE macOS Sequoia 应该可以复刻 macOS 的风格。 + +~~才买电脑几天你就想着换新的~~ + +说起来,倒是有一个小功能很戳我:空格预览支持 Markdown 了。虽然只能预览为纯文本,但是已经足够了。反正,Markdown 的本质就是纯文本。 + +~~那为什么不能预览 CSS?!~~ + +目前为止没遇到任何兼容性和数据损失问题。不过如果大家想升级,还是建议备份。小氯没有移动硬盘,因此没备份,这是不对的。 + +## iOS 18 & iPadOS 18 + +iOS 也迎来了一波升级。为了和 macOS Sequoia 配套,我直接全部升级了。也没遇到什么问题,算是你过关了吧。 + +还是希望牢果不要整太多抽象的活,好好做产品。不然换一个系统需要适应的时间是很久的。 + +## Ubuntu server 24.04.1 LTS + +别急着走,茶还没喝完呢。 + +前几天 SSH 我的 server 时,Ubuntu 就开始喋喋不休地告诉我更新(~~Ubuntu:我明明只是每次登录说一遍而已~~)。说实话原本不想更新,原因在于对新版本的不信任。要不为什么现在这么多服务器还是 Ubuntu 18.04。 + +可是随着这几天服务访问的频繁崩溃,我实在是绷不住了。虽然说有可能是校园网的抽象烂活,但是一想到承载在我大半个数字生活的虚拟机时常要在断联的边缘起舞弄清影,小氯就像吃甜味酸菜鱼一样难绷。 + +于是,~~病急乱投医之下~~我想到了更新。或许更新一下就好了呢。 + +那么来吧。 + +SSH 进去,先把包滚一遍: + +```bash +sudo apt update +sudo apt upgrade +``` + +然后直接更新: + +```bash +sudo do-release-upgrade +``` + +然后会有一大堆安装记录。注意里面有一个会给你单独开一个新的 sshd,这时候 tmux 到一个新的窗口,维持好 SSH 的登录即可。 + +剩下的事情一路回车,但是这里面出现了一个问题:我洗衣服去了,回来一看,好家伙,connection closed。 + +我瞬间绷不住了。因为就我的经验来看,只要出了这个问题,除非飞天面条大神洒高汤,否则根本修复不了。 + +还好另一个 SSH 还在。查看一下系统状态,这个更新进程似乎是坏掉了(也有可能是我判断失误)。 + +妥,那咱们中止进程,重来。 + +首先把进程都鲨了: + +```bash +sudo killall apt dpkg do-release-upgrade +``` + +然后再看一遍: + +```bash +ps aux | grep -E 'apt|dpkg|upgrade' +``` + +要是还有就 `-9` 强制超度。 + +然后把锁文件删了: + +```bash +sudo rm /var/lib/dpkg/lock +sudo rm /var/lib/apt/lists/lock +sudo rm /var/cache/apt/archives/lock +``` + +修复系统状态: + +```bash +sudo dpkg --configure -a +sudo apt install -f +sudo apt update +sudo apt upgrade +``` + +按理说下面应该重启更新,然而我记得我重启系统之后,就更新好了。不知道怎么回事。当然我这方法挺暴力的,谨慎使用。 + +然后 SSH 就可以回去了。我用 IP 加端口看了下 1Panel,应该是 OpenResty 的问题。不知道怎么回事。 + +## 结语 + +水了篇文章,内心就如 1939 年末的欧洲——毫无波兰。 + +说起来,真有点想换 Linux 全面拥抱开源了。Unix shell 我已经基本会耍了,就是两个问题:用什么发行版,刷什么设备。发行版我比较喜欢 Fedora 和 Manjaro,而设备方面,最合适的应该是模块化电脑 Framework Laptop。问题是 FWL 在大陆地区买不到,或许我去牢美那边交换或者实践的时候会去看看吧。 diff --git a/content/posts/图灵机/如何在不懂CSS的情况下魔改Typora主题.md b/content/posts/图灵机/如何在不懂CSS的情况下魔改Typora主题.md new file mode 100755 index 0000000..33bc40d --- /dev/null +++ b/content/posts/图灵机/如何在不懂CSS的情况下魔改Typora主题.md @@ -0,0 +1,497 @@ +--- +title: 如何在不懂CSS的情况下魔改Typora主题 +date: 2024-01-29 12:00:00 +categories: ["图灵机"] +tags: + - Typora + - 折腾 + - CSS +summary: CSS 小白历险记 +description: 本文介绍了作者在不熟悉 CSS 的情况下,如何通过修改现有 Typora 主题 Lapis 来创建一个新的主题 Marble 的过程。文章详细描述了从前期准备、确定需要的效果、观察主题结构到具体的修改步骤,包括字体替换、颜色调整、标题样式修改、引用块和代码块样式的变更等。作者通过使用 VS Code、AI 助手(如 ChatGPT 和 Github Copilot)以及大量的试错和学习,成功实现了主题的自定义。最终,作者将新主题 Marble 开源至 Github 和 Gitee,供大家下载使用。 +slug: how-to-modify-typora-themes +--- + +嗨,大家好,我是 Chlorine。 + +本期的标题看起来非常扯,和"如何在不懂英语的情况下出一本译著"有一拼。但是这是真的,效果如下: + +![|525](https://img.viento.cc/IMG-20240129120000-1.webp) + +看起来还挺不错的。事实上我这周末就在干这活。话不多说,直接开讲。 + +## 前期准备 + +- 一个基础主题:毫无疑问,都说了不会写 CSS 了。我选择的依旧是最喜欢的 Lapis 主题。 +- VS Code 或者其他能编辑 CSS 代码的 IDE +- (Optional)AI 助手,例如 ChatGPT 和 Github Copilot。 + +## 第一步:确定你需要的效果 + +魔改的目的是让**已有的东西更好地适应我们的需要**。那你首先就得清楚自己想要什么样式。 + +以我为例,我的要求如下: + +1. 字体:换上我最喜欢的霞鹜文楷。 +2. 界面颜色:调得柔和一些,Lapis 原本的白色有点刺眼。 +3. 标题样式:间距统一;二级标题样式修改;低级标题字体大小调整;二到六级标题加上标注,等等。 +4. 引用块:样式调整,去掉左侧的 bar,换成另一个配饰。 +5. 代码高亮:采取更加自然柔和的配色方案。 + +## 第二步:观察主题结构 + +### 工程结构 + +我们进入 Typora 的主题文件夹,简单观察下 Lapis 主题的组成部分。可以发现只有两部分:控制样式的 `lapis.css` 文件和存放字体的 `lapis` 文件夹。 + +### `.css` 文件结构 + +这步有点艰难,不仅需要一定的英语水平,还需要瞎猜的胆识。 + +在 IDE 中打开文件,耐心地从头看到尾。如果你的英语水平足够好,你应该可以猜出很多部分的功能。举几个例子: + +```css +/* + * Font-face for Cantarell, Source Han Serif CN and JetBrains Mono + */ + +@font-face { + font-family: "Cantarell"; + src: url('lapis/Cantarell-VF-fixed.otf'); +} + +@font-face { + font-family: "JetBrainsMono"; + src: url('lapis/JetBrainsMono-Regular.ttf'); +} + +@font-face { + font-family: "SourceHanSerifCN"; + src: url('lapis/SourceHanSerifCN-Medium.otf'); +} + +@font-face { + font-family: "SourceHanSerifCN"; + src: url('lapis/SourceHanSerifCN-Bold.otf'); + font-weight: bold; +} +``` + +开猜。这段明显是定义字体的,引入了 Cantarell,Source Han Serif CN(思源宋体)和 JetBrains Mono 三种字体。根据每一部分的格式,我们可以猜测,我们在引入新的字体时的格式为: + +```css +@fontface{ + font-family: "<字体名称>"; + src: url('<字体文件路径>'); +} +``` + +同时注意到,粗体字需要单独引入。 + +再比如: + +```css +#write h2 { + background-color: var(--header-span-color); + color: var(--bg-color); + padding: 1px 12.5px; + border-radius: 4px; + display: inline-block; +} +``` + +H2 显然是二级标题,`background-color` 是背景颜色的意思,其值是前面定义的 `--header-span-color`;颜色是 `--bg-color`,和背景颜色一样,说明想制造出镂空的效果;`padding` 是内边距的意思;`border-radius` 看着似乎和圆角大小有关;`display` 也许是指展示方式,不用管。总而言之,这应该是用来定义二级标题样式的。 + +诸如此类,一直猜就可以。看不懂不要紧,如果看起来不是和你要改的东西相关就不用管,如果相关,可以询问 AI 助手或者 CV 过去查字典/搜索。 + +![|471](https://img.viento.cc/IMG-20240129120000-2.webp) + +## 第三步:开改 + +终于到了开始改的时候了。我会以我的过程为例讲解一下改动的基本思路。 + +### 字体修改 + +在 `lapis` 文件夹中加入字体文件: + +![](https://img.viento.cc/IMG-20240129120000-3.webp) + +然后在 `@font-family` 处引入字体文件代替思源宋体: + +```css +@font-face { + font-family: "LXGWWenKaiGB"; + src: url('lapis/LXGWWenKaiGB-Regular.ttf'); +} + +@font-face { + font-family: "LXGWWenKaiGB"; + src: url('lapis/LXGWWenKaiGB-Bold.ttf'); + font-weight: bold; +} +``` + +在 `#write`(基本配置区)中加入字体的名称: + +```css +#write { + max-width: 950px; + font-size: 1.1rem; + color: var(--text-color); + line-height: 1.6; + word-spacing: 0px; + letter-spacing: 0px; + word-break: break-word; + word-wrap: break-word; + text-align: justify; + + font-family: 'Cantarell', 'LXGWWenKaiGB', 'JetBrainsMono'; + /* 在上面这里修改 */ + margin-bottom: 20rem; +} +``` + +同时修改下文的目录、标题等处除代码块外所有内容的字族为 `'Cantarell', 'LXGWWenKaiGB'`。 + +根据 Github Copilot 的回答,CSS 中会优先使用靠前的字族,在字符搜索不到时递补到后面的字族进行搜索。Cantarell 是纯拉丁字体,没有中文字,这样就可以实现中英文字体分别设置。当然,如果你的字族是中英文混合的,例如 LXGWBrightGB(霞鹜文楷 GB 和 Ysabeau 的融合字体,相当好看),就可以只设置一个。 + +### 修改颜色 + +颜色代码位于文件开头处 6-42 行(行数为相对于原始文件而言,下同): + +```css +:root { + --text-color: #40464f; + /* Text */ + --primary-color: #4870ac; + /* Primary Color */ + --bg-color: #ffffff; + --side-bar-bg-color: var(--bg-color); + /* Background */ + + --marker-color: #a2b6d4; + /* List Marker */ + --highlight-color: #ffffb5c2; + /* Highlight */ + --header-span-color: var(--primary-color); + /* h2 Span Color */ + --block-bg-color: #f6f8fa; + /* Block Background */ + --img-shadow-color: #e3e8f0; + + /* Overwrite of Typora Base Color */ + --search-hit-bg-color: var(--select-text-bg-color); + --search-select-bg-color: #5bb3ff; + --control-text-hover-color: #a2b6d4; + --rawblock-edit-panel-bd: var(--block-bg-color); + --item-hover-bg-color: rgb(246 248 250); + --active-file-bg-color: var(--block-bg-color); +} +``` + +大家按照自己的喜好修改即可。VS Code 有颜色预览,非常方便。 + +### 标题样式 + +这个比较复杂。首先定位控制标题的代码,位于文件 208-305 行,header 注释的下方。代码太多,我省略了一部分。 + +```css +#write h4, +#write h5, +#write h6 { + font-weight: normal; +} + +#write h1, +#write h2, +#write h3, +#write h4, +#write h5, +#write h6 { + font-family: 'SourceHanSerifCN'; + padding: 0px; + color: var(--primary-color); +} + +/* 基础样式 */ + +#write h1 { + text-align: center; +} + +#write h2 { + background-color: var(--header-span-color); + color: var(--bg-color); + padding: 1px 12.5px; + border-radius: 4px; + display: inline-block; +} + +/* H2的一堆样式 */ + +#write h1 { + font-size: 2rem; +} + +/* 字体大小 */ + +#write h1 { + padding-top: 0.9rem; + margin-bottom: 2.3rem; +} + +/* 设置间距 */ + +blockquote h3.md-focus:before, +blockquote h4.md-focus:before, +blockquote h5.md-focus:before, +blockquote h6.md-focus:before { + left: -1.3rem; +} +/* 不知道是什么,也不用知道 */ +``` + +首先修改标题字重为粗体(strong)。事实上只需要去掉原本 H4-H6 的设置,因为标题默认是粗体。 + +下面修改 H2 的样式。请教了 Github Copilot 后,我得到了这样的代码: + +```css +#write h2 { + color: var(--primary-color); + padding: 1px 0px; + display: inline-block; + background-image: linear-gradient(to left, transparent, var(--block-bg-color), transparent); + background-repeat: no-repeat; + background-size: 120% 1.2px; + background-position: center bottom; + /* 做了一条很浅的渐变下划线 */ +} +``` + +下面删除除一级标题间距外的间距(margin)代码,加入我们设置的统一间距: + +```css +#write h2, +#write h3, +#write h4, +#write h5, +#write h6 { + margin: 0.5em 0 0.5em; +} +``` + +调整字体大小: + +```css +#write h1 { + font-size: 2.2em; +} + +#write h2 { + font-size: 2rem; +} + +#write h3 { + font-size: 1.8rem; +} + +#write h4 { + font-size: 1.6rem; +} + +#write h5 { + font-size: 1.4rem; +} + +#write h6 { + font-size: 1.2rem; +} +``` + +为二至六级标题加上 H2-H6 角标。此时需要使用这样的代码: + +```css +#write h2::before, +#write h3::before, +#write h4::before, +#write h5::before, +#write h6::before { + vertical-align: super; + font-size: 0.35em; + margin-right: 0.4em; +} + +#write h2::before { + content: "H2"; +} + +#write h3::before { + content: "H3"; +} + +#write h4::before { + content: "H4"; +} + +#write h5::before { + content: "H5"; +} + +#write h6::before { + content: "H6"; +} +``` + +前面的一坨是统一的样式,后面是内容。 + +### 引用块样式修改 + +对应源代码的 `blockquote` 部分。还是询问 AI 助手后得到如下灵感: + +```css +#write blockquote { + display: block; + font-size: .9em; + overflow: auto; + padding: 15px 30px 15px 42px; + margin-bottom: 20px; + margin-top: 20px; + background: var(--block-bg-color); + position: relative; +} + +#write blockquote::before { + content: ">"; + /*加了一个小标记“>”*/ + font-size: 2.3em; + position: absolute; + left: 20px; + /* 调整左侧位置 */ + top: 50%; + /* 居中显示 */ + transform: translateY(-55%); + /* 用于垂直居中 */ + color: #E0E0E0; +} +``` + +### 分割线样式修改 + +对应于 dividing line 部分。与前面的 H2 一样使用渐变方案: + +```css +/* 分割线 Dividing line */ + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1.4px solid; + border-image: linear-gradient(to right, transparent 10%, #D0DDE6 25%, #D0DDE6 75%, transparent 90%) 1; + border-radius: 2px; + /* 渐变分割线 */ +} +``` + +### 代码块 + +这是最让我头大的一部分,头大的原因不是技术问题,而是如何配色。在请教了 AI 助手,并且查了一堆颜色对照表之后,我简单定出了这个方案: + +```css +/* 关键字 - 海蓝石 */ +.cm-s-inner .cm-keyword { + color: #87d4eb !important; +} + +/* 操作符 - 铁灰色 */ +.cm-s-inner .cm-operator { + color: #43464B !important; +} + +/* 变量、内置对象、头标题、标签、属性、引用 - 紫水晶 */ +.cm-s-inner .cm-variable, +.cm-s-inner .cm-builtin, +.cm-s-inner .cm-header, +.cm-s-inner .cm-tag, +.cm-s-inner .cm-property, +.cm-s-inner .cm-quote { + color: #9932CC !important; +} + +/* 变量2 - 绿松石 */ +.cm-s-inner .cm-variable-2 { + color: #30d5b1 !important; +} + +/* 变量3、类型、原子 - 蓝宝石 */ +.cm-s-inner .cm-variable-3, +.cm-s-inner .cm-type, +.cm-s-inner .cm-atom { + color: #3c7ce3 !important; +} + +/* 数字 - 玫瑰石膏 */ +.cm-s-inner .cm-number { + color: #e5c0ff !important; +} + +/* 定义、限定符 - 青金石 */ +.cm-s-inner .cm-def, +.cm-s-inner .cm-qualifier { + color: #1357a5c2 !important; +} + +/* 字符串 - 黄铁矿 */ +.cm-s-inner .cm-string { + color: #8B4513 !important; +} + +/* 字符串2 - 绿松石 */ +.cm-s-inner .cm-string-2 { + color: #30D5C8 !important; +} + +/* 注释 - 银灰 */ +.cm-s-inner .cm-comment { + color: #C0C0C0 !important; +} + +/* 元数据 - 暗金色 */ +.cm-s-inner .cm-meta { + color: #B8860B !important; +} + +/* 属性 - 紫水晶 */ +.cm-s-inner .cm-attribute { + color: #9932CC !important; +} + +/* 错误 - 铁玫瑰 */ +.cm-s-inner .cm-error { + color: #FFFFFF !important; + background-color: #D02537 !important; +} + +/* 匹配的括号 - 白垩石 */ +.cm-s-inner .CodeMirror-matchingbracket { + text-decoration: underline; + color: #ffffffc3 !important; +} +``` + +其中的 `!important` 应该是高优先级的意思。这套方案不是很好看,但也还行。 + +### 总结 + +我还对文件进行了一些小修改,就不多说了。由于我的修改太多了,我干脆照着原本的文件重写了一个,变成了一个新的主题,这也就是开头那张图。根据我的配色和原本的主题 Lapis(天青石),我把主题命名为 Marble(大理石)。 + +主题现已开源至 [Github](https://github.com/chlorine3545/typora-theme-marble) 和 [Gitee](https://gitee.com/chlorine3545/typora-theme-marble),欢迎大家前去下载尝试。如果可以的话,想要一颗 star (\*^▽^\*)。 + +这些修改看着复杂,实际上主要还是依靠猜代码含义和借助 AI。 + +## 后记 + +总体而言,魔改主题还是挺费事的。不过只要有足够的耐心,虽说写出全新的主题比较难,但是改出一些自己喜欢的效果还是可以的。 + +Marble 主题我会尽力维护,但是由于不懂 CSS+平时事的确比较多,更新就随缘了。 + +下一步似乎可以用这种方式魔改 Obsidian 的主题……算了我还是去学学 HTML 和 CSS 吧(乐) diff --git a/content/posts/图灵机/服务器除虫日志.md b/content/posts/图灵机/服务器除虫日志.md new file mode 100644 index 0000000..6f836d0 --- /dev/null +++ b/content/posts/图灵机/服务器除虫日志.md @@ -0,0 +1,59 @@ +--- +slug: jailing-server-chongzhi + +summary: 这已经不是一般的虫豸了,必须要出重拳! +tags: + - 折腾 +title: 服务器除虫日志 +date: 2024-08-25 +description: 本文讲述了作者偶然发现自己的服务器遭到了一些攻击,主要是试图用 root 和不存在的用户名登录等。作者对之十分生气,于是写了一个脚本扫描了攻击者的 IP,使用 Fail2ban 将其永久封禁,同时设置了定时任务对试图用 root 登录的攻击者进行封禁。 +categories: ["图灵机"] +featuredImage: +draft: false +--- + +各位老友们好,我是 Chlorine。本来打算鸽一段时间,等备案完成再水文,但是没办法,键盘不允许(~~键盘:关我什么事~~)。 + +昨天闲着没事又去看我的服务器,偶然打开了 1Panel 面板的 SSH 登录日志,结果不看不知道,一看吓一跳…… + +![](https://img.viento.cc/IMG-20240825090708.webp "好几万条的记录") + +我简单看了下,大部分的攻击都是来自海外的(也有国内的,我就不说是哪个地方的了)。攻击的 IP 高度重复,手段主要集中于使用 `root` 进行登录,以及尝试蒙用户名。幸亏我的机器除了 `root` 拢共就我一个用户(系统自动生成的除外),而且只有我能 SSH 登录,不然可能还真就叫人钻空子了。 + +然后我就坐在那想,越想越气。欺负人都欺负到我小氯头上了,这已经不是一般的虫豸了,必须要出重拳! + +于是我写了个简单的脚本: + +```bash +#!/bin/bash + +LOG_DIR=/var/log + +OUTPUT_FILE=/home/yoghurtlee/chongzhi.txt + +# 方便审查 +LOGIN_RECORD_FILE=/home/yoghurtlee/chongzhi_jilu.txt + +> $LOGIN_RECORD_FILE + +for log_file in $LOG_DIR/auth.log*; do + if [[ -f "$log_file" ]]; then + grep "Invalid user" "$log_file" >> $LOGIN_RECORD_FILE + fi +done + +grep "Invalid user" $LOGIN_RECORD_FILE | awk '{print $10}' | sort -u > $OUTPUT_FILE +``` + +然后赋予可执行权限: + +```bash +chmod +x chongzhi.sh +./chongzhi.sh +``` + +获得了一群 IP。全都加到 1Panel 里面 Fail2ban 的黑名单里面,杜绝其访问我的一切服务。 + +然后我又写了个定时任务,监控所有尝试用 `root` 登录的 IP,一旦发现直接永久封禁。你们这帮攻击者给我老实呆着,看我派 Fail2ban 来把你们一个一个送上天! + +然后的话……其实我也没什么好办法了。封禁已经是我能想到的最好的防范措施了,总不能拿我的服务器去反向攻击它们吧。 diff --git a/content/posts/图灵机/瞎折腾MinGW.md b/content/posts/图灵机/瞎折腾MinGW.md new file mode 100644 index 0000000..d1d221c --- /dev/null +++ b/content/posts/图灵机/瞎折腾MinGW.md @@ -0,0 +1,172 @@ +--- +title: 瞎折腾MinGW +date: 2024-02-02 +slug: how-to-update-mingw +summary: 乱七八糟瞎折腾 +description: 这篇文章介绍了作者在更新 MinGW 过程中遇到的各种问题和解决方法。作者首先回顾了自己在学习递归和调试时的困难经历,强调了命令行调试的复杂性。随后,作者分享了自己发现并尝试更新 MinGW 的过程,包括从 GitHub 下载最新版本并替换旧版本的步骤。接着,作者详细描述了如何在 VS Code 中配置可视化调试环境,通过编写和修改配置文件(如 `c_cpp_properties.json`、`launch.json` 和 `tasks.json`)来实现调试功能。尽管成功配置了可视化调试,作者表示自己仍然更习惯使用命令行调试。文章最后感谢了一位学长的教程,并表达了对折腾过程的感慨。 +tags: + - C++ + - 教程 +categories: ["图灵机"] +--- + +嗨,大家好,我是 Chlorine. + +本期的主要内容是讲述我更新 MinGW 的痛苦经历,寄术力不高,大佬轻喷。引用一句[某乎上的话](https://zhuanlan.zhihu.com/p/137332644): + +> 知识就是这样的,也许一个问题在老鸟看来是一颗土坷垃,但对于初学者却是一座大山。 + +## 历史遗留问题 + +当年我们在学递归之后,老师布置了一个上机作业,要求原文如下: + +> 以汉诺塔源程序为对象,参照 PPT 上关于阶乘示例的递归调用与返回过程的示意图,在集成开发环境中,以单步跟踪方式,打开汇编代码和机器代码显示功能,观察函数调用栈(内存)的变化情况,观察程序执行时“当前待执行机器指令”随着单步执行的变化情况。在发生递归调用时,记录函数实参和形参的地址与内容,记录函数调用结束后的返回点指令地址。 + +这其实是个简单得离谱的任务,更不用提写上机报告一向是我引以为豪的能力(期末成绩,上机报告部分 99.9 分,扣掉的 0.1 是因为第一篇是用 Obsidian 写的,导出的时候标题没居中)。 + +可是问题是:**我不会单步跟踪调试**。(上课摆烂的后果 qaq) + +跟着助教的讲解视频,查网上的教程,甚至是安了好几个其他的 IDE,都是完不成,我好像就和调试有仇。 + +最后幸好一位好心的 TA 学长教了我一些命令行调试,才让我把报告写出来(最后成绩是满分 q(≧▽≦q))。 + +所以以后我在做单步跟踪调试的时候,一直都是在用命令行。不是说命令行不好,但是的确有点复杂。此外,我在写 C++ 教程的时候,总不能上来就往人家脸上糊命令行吧(). + +## 补偿性折腾 + +最近我发现了一个很好玩的 Github 项目: [Bill-Haku/kawaii-gcc: GCCコンパイラーを可愛くしましょう!Make your GCC compiler kawaii. (github.com)](https://github.com/Bill-Haku/kawaii-gcc) + +这里是 B 站解说视频地址: [【中文】杂~鱼♡!人家 GCC 也想变得可爱嘛~】](https://www.bilibili.com/video/BV1gC4y1P7t3?vd_source=b7e941d0715a442723fb5ad229adf1cb) + +说实话,我看完之后,真的感觉:好可爱! + +然后我忧伤地得知目前只支持 Cygwin。 + +但是,我折腾的兴奋度已经被挑起来了。不折腾点什么,我是不会罢休的。 + +## MinGW 的更新 + +综合以上两段原因,我决定折腾下我的 VS Code + MinGW-w64。 + +终端里扔个 `gcc -v`, 发现我的 gcc 居然才 8.1.0,于是我决定更新。 + +MinGW 没有什么一键更新的命令,同时官网上一大堆离奇的布局看得我五彩缤纷。 + +于是我找到了 [MinGW-64 的 Github 二进制仓](https://github.com/niXman/mingw-builds-binaries)。直接把 release 的最新版本下载下来,解压完事。 + +*PS: 我下载的是 `x86_64-13.2.0-release-posix-seh-ucrt-rt_v11-rev0.7z`* + +解压的时候我图省事,解压到了默认的 download 文件夹,本来想着一会给移到我原本的 D 盘去,结果遇见了这样的擀人速度: + +(图片丢了,乐) + +好吧,不管怎么样,总算是挪过去了。由于我解压之后的文件夹也叫 `mingw`,因此直接替换了原本的老版本文件,省去了再配一遍环境变量的麻烦。 + +然后随便开个终端,键入版本检查指令 `gcc -v`, `g++ -v` 和 `gdb -version`,发现更新成功了。 + +## 可视化调试的配置 + +其实这也不是什么难事,也就是几个文件的事,但是 VS Code 这厮总是给我闹幺蛾子,于是干脆自己动手写(抄)文件. + +把原本 C++ 文件夹的 `.vscode` 子文件夹删空,新建三个文件,把当时留下的代码扔进去: + +```json +// c_cpp_properties.json +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "compilerPath": "D:\\\\mingw64\\\\bin\\\\gcc.exe", + "intelliSenseMode": "windows-gcc-x64", + "cppStandard": "c++23", + "cStandard": "c23" + } + ], + "version": 4 +} + +``` + +```json +// launch.json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "g++.exe - Build and debug active file", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}\\\\${fileBasenameNoExtension}.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "D:\\\\mingw64\\\\bin\\\\gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: g++.exe 生成活动文件" + } + ] +} + +``` + +```json +// tasks.json +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++.exe 生成活动文件", + "command": "D:\\\\mingw64\\\\bin\\\\g++.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "调试器生成的任务。" + } + ], + "version": "2.0.0" +} + +``` + +重启 VS Code,随便写个 C++ 文件,在左侧工具栏尝试可视化调试,完美。 + +(图片又丢了,乐) + +## 后记 + +就折腾到这吧。尽管说有了可视化调试的方法,但是我可能还是习惯于用命令行。这次折腾大概还是为了解决强迫症的历史遗留问题。 + +毕竟我还是无法拥有可爱的 GCC qaq + +感谢这位学长的教程[用vscode优雅配置c/c++环境!](https://zhuanlan.zhihu.com/p/610895870)。 diff --git a/content/posts/图灵机/解决UnoCSS更新后的奇怪报错.md b/content/posts/图灵机/解决UnoCSS更新后的奇怪报错.md new file mode 100644 index 0000000..d080992 --- /dev/null +++ b/content/posts/图灵机/解决UnoCSS更新后的奇怪报错.md @@ -0,0 +1,247 @@ +--- +title: 解决UnoCSS更新后的奇怪报错 +date: 2025-02-24 +slug: fix-unocss-66-error +featuredImage: +categories: + - 图灵机 +tags: + - 博客 + - UnoCSS +series: +summary: 偶遇无信息报错,拼尽全力有法战胜 +description: 本文讲述了作者在使用UnoCSS过程中因版本更新引发的配置兼容性问题及其解决过程。作者原本沿用旧版配置方案,但在更新依赖包后遭遇构建失败却无明确报错信息,通过逐步排查发现新版UnoCSS对图标预设语法要求更严格。经查阅文档发现原配置中图标集合的手动注册方式已不兼容,转而采用自动检测机制后问题得以解决。最终确认问题根源在于presetIcons模块的调用方式未遵循最新规范。该案例凸显了依赖版本管理的重要性,同时展示了通过最小化测试与官方文档对照排查技术问题的典型思路。 +wikilinks: +--- + +各位老友,晚上好。这里是 Chlorine。 + +摸鱼了一节计量,终于把这个奇奇怪怪的问题解决了。遂作文以记之。 + +小氯之前的 UnoCSS 配置是从还在写 Efímero 的时候继承下来的,或者说直接点就是基本从[恐咖兵糖](https://www.ftls.xyz/)大佬那抄下来的。为数不多的改动也就是加了图标导入的 `IconifyJSON` 类型,以及一些对 ALERT 短代码有好处的预制颜色类。在写 Hermeneutics 的时候,也就图省事,除了一个 `IconifyJSON` 之外什么都没改。 + +同时,虽然说 npm 包的版本问题就像是飞天面条大神给这个宇宙的报应,但是由于小氯实在是太菜了(用得也实在是太简单了),同时由于小氯喜欢一直保持新版本,所以把 `bun update` 当成 `sudo pacman -Syu` 玩几乎是家常便饭,也一直没什么问题。 + +然而今天事情不一样了。 + +事情大概是:小氯闲着没事 refactor 了一下 AI Summary 的部分,拿 HTML + CSS 写了个比以前的 JS 版本还顺滑的摘要框。心情非常良好的小氯就更新了一下包版本,就在打算 `bun run build` 之后就交差时,出事了。 + +当时的截图小氯没有留下来,具体来说,除了一个: + +```txt +(node:33920) ExperimentalWarning: Type Stripping is an experimental feature and might change at any time +(Use `node --trace-warnings ...` to show where the warning was created) +``` + +之外,就只有一个「退出码为 1」的提示。这段话显然不是报错的根源,而退出码 1 等于什么都没说。 + +按说小氯酱也不是没见过这种场面,加一个参数 debug 一下: + +```bash +bun run dev --verbose +``` + +很好,这下连退出码为 1 都没有了,降本增效了属于是。 + +然后小氯尝试了很多方法,例如手动指定 config file 等,然而不能说是硕果累累吧,至少可以说是一无所获。 + +再试一下换个执行方式: + +```bash +# 直接使用路径 +./node_modules/.bin/unocss "layouts/**/*.html" -o assets/css/uno.css --watch + +# 换一个执行器 +npx run dev +``` + +没用。 + +既然没有信息,那么检查一下是哪个文件的问题呢? + +```bash +#!/usr/bin/env zsh + +# 配置区 +TARGET_GLOB="layouts/**/*.html" +ERROR_LOG="unocss_errors.log" +OUTPUT_CSS="test.css" + +rm -f "$ERROR_LOG" + +setopt extended_glob +setopt null_glob + +# 计数器 +total_files=0 +error_files=0 + +echo "Starting UnoCSS batch processing..." +echo "----------------------------------" + +for file in ${~TARGET_GLOB}; do + # 跳过非文件 + [[ -f "$file" ]] || continue + + ((total_files++)) + + echo -n "Processing $file ... " + + # 执行UnoCSS并抑制输出 + if npx unocss "$file" --out-file "$OUTPUT_CSS" >/dev/null 2>&1; then + echo "✅" + else + echo "❌" + echo "$file" >> "$ERROR_LOG" + ((error_files++)) + + # 保留错误现场 + mkdir -p error_dumps + cp "$file" "error_dumps/$(date +%s)_${file:t}" # 使用 Zsh 的修饰符 :t 获取文件名 + fi +done + +echo "----------------------------------" +echo "Processed $total_files files" +echo "Found $error_files problematic files" +[[ $error_files -gt 0 ]] && echo "Error log saved to $ERROR_LOG" + +if [[ -f "$ERROR_LOG" ]]; then + echo "\nError Summary:" + cat "$ERROR_LOG" +fi +``` + +执行。非常地漂亮,全报错了。 + +既然得不到任何有效信息,那么就要秉承着「计算机科学是一门玄学」的理念了。 + +我们先降级一下。降回 `65.4.0` 自然是可以解决问题的,但是 `65.5.0` 就不行了。去翻 UnoCSS 更新日志,没有任何发现。 + +按照直觉,下一步我们就该把主意打到 `node_modules` 上了。清掉缓存,清掉已有模块,重装。小氯还顺便发现 Bun 的 lockfile 变 `bun.lock` 了,以前是 `bun.lockb` 来着。不知道为什么。 + +然而重装没有任何作用。清除其他包,单独安装,没用。 + +那我们做一个最小化的构建试一下: + +```bash +echo '
' | bun run build --stdin +``` + +报错。 + +坏了,这下不得不认真对待了( + +看来应该是 UnoCSS config 的问题了。之前小氯一直没怀疑这个,因为从没出过问题嘛。~~但是,以前是以前,现在是现在~~。 + +看一眼 `uno.config.ts` ……嗯哼?`presetUno`,deprecated。 + +按理说 deprecated 其实一般也不是不能用,但是我们还是更新一下的好。 + +换成最新的 `presetWind3`,问题依然存在。 + +会不会是 `presetUno` 的类名不兼容呢?不太可能。按小氯的经验,不兼容的类名顶多不被识别,不可能导致报错。 + +那我们就单独找一下每个部分的问题好了。先开个沙盒鼓捣鼓捣: + +```bash +mkdir uno-debug && codium $_ +bun i unocss +``` + +写个极简版的 `index.html` 和 `uno.config.ts`: + +```html +
+``` + + +```ts +import { defineConfig } from 'unocss' + +export default defineConfig({ + rules: [ + ['m-1', { margin: '1px' }], + ], +}) +``` + +构建,没问题。这至少说明 UnoCSS 本身没问题(~~废话~~)。 + +加一个预设: + +```ts +import { defineConfig, presetWind3 } from 'unocss' + +export default defineConfig({ + presets: [ + presetWind3(), + ], +}) +``` + +随便找一个 HTML 放进去,构建。成功。 + +然后小氯开始一点点地把过去的 config 往回加,加到三个图标包,出事了。去掉两个,只留一个最兼容的 carbon,还是报错。 + +看来就是图标部分的问题了。 + +这下小氯没办法自己鼓捣了,于是小氯翻开了几乎从没有翻开过的 UnoCSS 文档( + +然后在图标部分找到了官方案例: + +```ts +import presetIcons from '@unocss/preset-icons/browser' + +export default defineConfig({ + presets: [ + presetIcons({ + collections: { + carbon: () => import('@iconify-json/carbon/icons.json').then(i => i.default), + mdi: () => import('@iconify-json/mdi/icons.json').then(i => i.default), + logos: () => import('@iconify-json/logos/icons.json').then(i => i.default), + } + }) + ] +}) +``` + +好吧,我改。 + +结果出现了错误: + +```txt +Failed to load custom icon "screen" in "carbon": TypeError [ERR_IMPORT_ATTRIBUTE_MISSING]: Module "file:///Users/chlorine/Dev/Frontend/hermeneutics/node_modules/@iconify-json/carbon/icons.json" needs an import attribute of "type: json" +``` + +好吧好吧,我加上还不行吗…… + +```ts +carbon: () => import('@iconify-json/carbon/icons.json', { assert: { type: 'json' } }).then(i => i.default), +``` + +然而并没有用。 + +邪了门了(小氯の疑惑)。 + +再回去看文档…… + +> In `Node.js` the preset will search for the installed iconify dataset automatically, so you don't need to register the `iconify` collections. + +Bun 和 Node 应该也差不多,那把 collections 都去了试试…… + +正常了。 + +……你人还怪好的嘞。 + +下面把 mdi 和 simple icons 加回去吧……等会,我 simple icons 呢?我那么大一包 simple icons 呢? + +再回去看文档。Icons 其实就是小氯常用的 [Icônes](https://icones.js.org/) 里面的那些,那咱们再去看看吧。 + +……哦,原来人家叫 `i-simple-icons-xxxx`,不叫 `i-simple-xxxx`。这个别名是之前的写法规定的。 + +问题解决。 + +--- + +总结一下,就是过去不规范的 `presetIcons` 语法和 UnoCSS 的最新标准不兼容,导致 UnoCSS 报错。至于为什么没有报错信息……小氯也不知道哦。 \ No newline at end of file diff --git a/content/posts/沉思录/Obsidian与开源.md b/content/posts/沉思录/Obsidian与开源.md new file mode 100644 index 0000000..81ab5ae --- /dev/null +++ b/content/posts/沉思录/Obsidian与开源.md @@ -0,0 +1,265 @@ +--- +slug: obsidian-and-open-source + +summary: 关于Obsidian、开源等话题的一点思考 +tags: + - Obsidian + - 开源 + - 批判性思维 + +title: Obsidian与开源 +date: 2024-10-22 +description: 本文探讨了Obsidian这款个人知识管理软件的开源问题。Obsidian是一款优秀的笔记软件,但其闭源特性让一些FOSS支持者感到顾虑。文章从Obsidian社区对开源的激烈讨论入手,详尽且具体地分析了开源对收入、隐私、安全性、开发效率、社区管理、知识产权和法律等方面的影响,同时还涉及到实质性开源,Obsidian与一些闭源产品及团队的本质区别,开源与源代码公共可见等概念的区别等问题。文章认为先开源部分核心组件是好的实践,同时强调开源与否是Obsidian团队的自由。文章认为开源将具有重要的象征意义,并表达了对Obsidian开源的期望。文章通过理性而详尽的分析,表达了作者对开源的深入思考和对Obsidian未来的期待。 +categories: ["沉思录"] +featuredImage: https://img.viento.cc/cover/obsidian-and-open-source-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。鸽了许久的一篇文章,双手奉上。 + +本文属于对一个话题比较集中的探讨,因此被我归到了尘封许久的「小氯说」系列,大家当个杂文看看即可。 + +## 前言 + +Obsidian,黑曜石,自然界中最锋利的岩石之一(黑曜石碎片比手术刀锋利 400 倍——这个数字来自小氯看过的一本野外生存手册,可能有夸张的成分)。曾经有人提到,Obsidian 这个名字让他们联想到《三体》中用来压平雪浪纸的黑曜石板(出自云天明讲的那三个故事)。虽然小氯在初中时几乎就能把《三体》倒背如流,但还真没往这方面想。这确实是一个很巧妙的联想。 + +有点跑题了,回来。相信能看到这个博客的老友多多少少都了解 Obsidian 这个神奇的软件,以及其在个人知识管理(PKM)领域的地位。如果答案是否定的,您可以先把这篇文章放到某个不会很容易地忘记的地方,然后前往 [Obsidian 的官方网站](https://obsidian.md)和 [Obsidian 官方中文论坛](https://forum-zh.obsidian.md),作一点简单的了解。如果您对 Markdown 和 PKM 感兴趣,小氯相信您会喜欢上 Obsidian 的。 + +毫无疑问,Obsidian 是一个极其优秀的笔记软件:本地化存储,开放格式,顺滑的 Markdown 编辑体验,丰富的插件生态,超高的颜值(尤其是有主题加持的情况下),热闹的社区环境……光别的不说,对于中文 Markdown 使用者而言,一个 Easy Typing 插件的编辑体验就可以薄纱从 VS Code 到 Typora 的各种 Markdown 编辑器。 + +但是就在 Obsidian 的这一众诱人的优点中,有一个非常醒目的事实:**Obsidian 是闭源软件**。这就像是 Obsidian 这朵玫瑰花上一根尖锐的刺,让许多 FOSS 主义者望而却步。 + +当然,一如刺对玫瑰花一般,闭源对于 Obsidian(或者说,Obsidian 的开发团队)实际上是一个(在他们的看法中)在某些方面有用的特性——至少 Silver(Erica Xu)和 Licat(Shida Li)等 Obsidian 团队的核心成员已经不止一次地表达过这个观点,不管是在官方论坛还是别的什么地方。 + +## 一个 Thread + +我们说过,Obsidian 有一个极为庞大的社区,即使在其年轻时(发展初期)也是如此。人一多,就会有不同的观点,尤其是开不开源这种讨论度极高的话题。在 Obsidian 的[官方论坛](https://forum.obsidian.md)(不是官方中文论坛)上,有一个非常显眼的 thread[^1],专门讨论这个问题:[Open Sourcing of Obsidian - Meta - Obsidian Forum](https://forum.obsidian.md/t/open-sourcing-of-obsidian)。 + +这个 thread 的总回复数达到了将近 300 条,或许是 Obsidian 论坛(English / 简体中文)最多的。讨论开始于大致四年前,那时 Obsidian 还非常年轻,如果我了解得没错,甚至还没有即时渲染;而其最后的活跃时间(截至我敲下这行字),是两天前。管理员甚至设置了一个限制:一天只能有一条回复。 + +由此可见,这条讨论的关注度高到了什么程度。小氯花了三个星期的时间,断断续续地看完了这个 thread,作为一个英语的外族语者,这是一个极其费力的工作。 + +老实说,这个线程有很多高质量的讨论,但是也充斥着许多无意义的重复、不明就里的晦涩语句、毫无根据的暴论甚至是不友好的争吵和指责。而且,到最后时,小氯感觉自己浪费了大量的时间,因为事实上能说的观点就那么多,到最后其实就是在翻来覆去地烙饼。 + +同时,很显然,Obsidian 团队即便再有耐心,面对这么多讨论也会不胜其烦。[@ryanjamurphy](https://forum.obsidian.md/u/ryanjamurphy) 甚至直接来了一句: + +> Logseq is open source. Bye! + +能看出来是真的很不想继续说了。也确实,小氯这个闲人看了这么多回复都感觉很累了,何况是还有开发工作的 Obsidian 团队呢。 + +——那既然我们早就讲不出什么新的东西了,小氯为什么还要在这里重复呢? + +很抱歉,小氯酱也在想这个问题。写长文(指时间跨度和文章长度)的时候常常遇到这种问题,写着写着都要忘了自己为什么要写了。 + +## 一点声明 + +如果要用一篇文章把小氯对于开源、自由软件这些概念的看法讲完,那是不可能的——想想看《大教堂与集市》写了多长,即使小氯现在的开源阅历还极其浅薄。所以小氯做了一个决定:**本文只是一个带有发散的「就事论事」**。至于以后更多的思考,请容小氯留到以后再写。 + +同时,本文**不是任何形式的谴责或者批评**,但是的确包括很多分析和批判(这里的批判并不是日常中的意思,而是接近于哲学领域的「批判」或者是《政治经济学批判》中的「批判」——当然我不是说我写了篇哲学文章,小氯还没那个水平)。Obsidian 是 Obsidian 团队的智力成果,最终是否开源也是 Obsidian 团队的自由。大家可以从最后的立场看出,如果 Obsidian 开源,小氯会非常高兴,但是如果不开源,小氯至多只会表示一定程度的遗憾。 + +## 收入? + +虽说 Obsidian 的使用许可堪称互联网善人,但是 Obsidian 的开发团队(Dynalist Inc.)毕竟是一家公司,考虑商业利益是很正常的事情。由于 Obsidian 似乎还没有公布任何形式的财报,我们可以大胆地设想和总结一下,Obsidian 到底有哪些收入来源。 + +目前为止,Obsidian 对个人完全免费,没有任何广告,没有接受融资,(按照开发团队的说法)不收集任何用户信息,自然也不会出售。假设这些说法都是可信的,那么其收入来源就是: + +- Catalyst 个人许可证(Obsidian 的个人赞助者许可证) +- 商用许可证 +- Obsidian Sync 和 Obsidian Publish + +让我们思考一下,如果 Obsidian 转变为开源,这些收入会不会遇到什么影响。 + +首先的首先,First and foremost,需要澄清一件事:**Free in free speech, not free in free beer**. 开源软件、自由软件和完全免费的软件(gratis)完全是两回事。如果您认为 Obsidian 开源了就不能盈利,那小氯可能需要委婉地指出,您在这个领域缺少最基本的常识。 + +首先,Sync 和 Publish 应当不会有影响——或者至少不会有负面影响,因为它们本质上和 Obsidian 没有关系——前者是帮助你把一堆 Markdown 从一台设备搬运到另一台设备,后者是帮助你把一堆 Markdown 从本地搬运到公网。而且,目前 Obsidian 官方也没有对第三方同步方法做任何限制——不管是 Remotely Save,Remotely Sync 还是 Obsidian LiveSync。甚至可以说,如果 Obsidian Sync 和 Publish(特别是 Sync)开源,那么愿意用的人恐怕还会变多。至于发布,那更不用说。各位可以猜猜小氯的博客是用什么写的。 + +其次,Catalyst 很可能会不减反增。对于那些不关心 Obsidian 是否开源的人,Obsidian 开源与否不会影响他们的赞助决策(小氯相信,排斥 Obsidian 开源并且能拿出让自己长期信服的理由使得在 Obsidian 开源后放弃对 Obsidian 的支持或者是这方面的想法的人是极少的);而对于 FOSS 软件的爱好者,Obsidian 开源绝对是一个非常大的 extra mile,会吸引许多本来还在犹豫观望的 FOSS 爱好者投入 Obsidian 的怀抱,而其中必然会有一部分人乐意以这种相当实际又带点情怀的方式向 Obsidian 的开发者们致意(或许也可能是 Sync 和 Publish?)。已知后者不但存在,而且数量并不少,因此我们有理由断定 Catalyst 的收入会增加——很可能还会有小氯的一份。 + +那么最后,就是商用许可证的问题了。小氯觉得,这个也并不是问题,您所需要的只是一个严格一些的开源许可证。可能有人会说,那如果有商业公司直接把代码拿走以逃避商业许可证的限制呢?你说得对,**但是现在的 Obsidian 就能避免这个问题吗**?就现在的情况而言,无论是商用却不购买许可,还是试图把 Obsidian 解包后自己做产品(这个涉及更复杂的法务问题),其难度并不比开源大多少。所以,我不认为这是一个足以支撑闭源的理由。 + +甚至我们也可以说,开源会帮助 Obsidian 省去某些费用。正如用户 [@EuriNaiz](https://forum.obsidian.md/u/EuriNaiz) 说的,Obsidian 的论坛本身建立在 Discourse 上,而 Discourse 官方事实上为开源软件提供免费的托管服务…… + +综上所述,在会计学的层面来说,开源对 Obsidian 来说,至少不会有显性意义的收入减少。 + +那小氯能保证 Obsidian 开源就会生存得更好吗?不能,原因很简单,小氯不是神明或者先知。但是现在,我们也同样无法保证,或者至少是做出更多的肯定,Obsidian 闭源就会生存得更好。此外,小氯自认为从理性和逻辑的角度,以上论证没有明显的矛盾和错误。 + +## 道德信任问题 + +这是个极其微妙的问题。毫无疑问,Obsidian 的开发团队在道德上是非常令人放心的,即使是因为隐私问题希望 Obsidian 开源的人大部分也不会否定这一点。 + +那让我们来分析一个问题吧:Obsidian 闭源的情况下当然也可以通过沙箱的方式保护隐私,但这么做是否意味着我们不信任 Obsidian 的开发团队?毕竟「我断掉了网络连接,因此你无法窃取并传回我的任何数据」和「我相信你不会窃取并传回我的任何数据」是两回事。那么 Obsidian 的独立审计是否足够可靠?我们依然可以怀疑,怀疑审计者,怀疑这次审计是否真的独立。那么开源条件下的社区审计呢?依然可以怀疑。怀疑的种子一旦种下,必然会在一个不太远的时间引发一场思想的雪崩,进而引发无穷无尽的麻烦。 + +小氯不想在这个问题上说太多,因为小氯也说不明白。同时,希望各位老友尽可能不要在讨论中涉及道德问题,这会引起许多的麻烦。 + +## 开源 = 隐私性? + +如果 Obsidian 不开源,就不能保证隐私性了吗? + +答案是否定的,开源是隐私的既不充分也不必要条件。 + +这其实涉及到一个非常关键的问题。我们说开源软件(这里我们不考虑那些源代码开放但是广为流传的二进制分发闭源的产品,例如 VS Code)一般在隐私方面都值得信任,其依据主要是由于其源代码开放,因此任何人都可以自行审查其中是否有不受欢迎的部分。**但是,这虽然理论可行,但是在实践中显然门槛极高**。且不说世界上绝大部分的人都是「赛博文盲」,别说看懂代码了,甚至就连电脑怎么用都是迷迷糊糊(当然,这样的人一般也不会为开源、隐私这些事情担忧)。世界上能够对(任何类型的)计算机科学知识有了解的人,恐怕千分之一都是乐观的估计。 + +而就算是计算机知识比较充足的用户,也不一定就谙熟项目所用的技术栈;就算是谙熟,那也不一定有兴趣去看。所以我们可以认为,在开源软件的用户中,很少有人有能力看懂且会去看项目的源代码。所以,项目审查的重担实际上就是落在极少几个热心且技术力高超的用户(假设有)以及社区的审查员肩上(这甚至还需要我们近乎无条件地信任他们)。一般来说,一个开源项目的代码数量都大得惊人,而人眼观察、静态运行和调试的能力毕竟是有限的。因此,很多情况下,开源的「隐私性」实际上很大程度依赖于开发者自己的道德和良心。但是就如[我们曾经说过的](/weekly-8#最小化但必要的监管),在进行任何技术实践时,都应以最坏的恶意度测人心。因此,开源项目的隐私性保障**在实践中**其实处于一个奇怪的真空态。 + +即使是说开源开发者一般都是有很高自觉性的谦谦君子,但是也难保会不会有一些别有用心的人提交一些不那么受欢迎的 PR。孙哥与我分享过一个很离谱的案例:一位黑客依靠一些贡献在开源社区取得了很高的威望,然后 TA(我不知道其性别)向一个项目贡献了一些代码,似乎还向 Ubuntu 官方提出了 PR 来着。这段恶意代码如果扩散开,可以取得所有安装 Ubuntu 的电脑的 SSH 权限。然后最后被发现了,原因是一位大神发现自己电脑的 SSH 慢了 0.5 s(是的你没听错,0.5 s),于是起了疑心,一步一步把这个东西挖出来了…… + +而闭源也并不一定意味着毫无隐私可言。虽说曾见过一个非常激进的说法「任何闭源软件的隐私协议都可以简化成一句话:我们可以在适当的时候以任何方式收集你的任何信息,并不必为此承担任何责任」,但是确实存在一些对隐私非常尊重的闭源软件,这点是不可否认的。 + +而且,理论上来说,不管一个软件(在隐私性上)有多么面目可憎,只要我们能够完全断掉其互联网权限,那么就算它能把你去年这个时候的前天和朋友去逛超市时买了哪个品牌什么口味的饼干或者是你刚刚给妈妈打电话时用的是哪只手的哪个手指的哪个部分触碰了拨打按钮多少毫秒都偷出来,那它也没办法让背后的服务提供者知道。我们还可以采取更激进(更保守?)的策略——直接把应用放到一个沙箱中,这样就算开发者手眼通天,能让应用搭上其他应用的网络连接,那也只能看着隔离环境干瞪眼。 + +我现在的 iPhone 就严格采取了这个方针——我的输入法是讯飞(因为 iPhone 的 Rime——仓输入法对我来说实在是太难用了),由于我现在 MacBook 已经全面采用了 Rime,因此我直接掐掉了讯飞的网络权限,你做好一个输入法的本分即可。此外,像 Light Player(我的本地音乐播放器)这样的应用,我也会在设置的 WLAN & Cellular 选择 Don't Allow。 + +我们回来。总结一下,Obsidian 是否开源,其实和其(在实践中的)隐私保护没有什么必然的联系。如果想法不是要对开源项目贡献 PR,而只是希望其代码能被公开审查以确保隐私性(也就是后面会说的「源代码公共可见」),那么 Obsidian 的代码公开会增加一个理论上的、可以通过研究其内部机理而不是仅仅根据实验证据完全确保其隐私性的机会,小氯感觉这其实是一件象征意义大于实际的事。 + +此外,Obsidian 请了一个独立第三方做了一次审计,可以看[这里](https://obsidian.md/security)。 + +## 开源 = 安全性? + +这里的「安全性」可以看作 bug 修复方面的事。如果 Obsidian 只公开代码而不允许社区协作,那么 bug 修复至少不会变慢(指的是投入相同的时间修复的 bug 多少。至于开源后的其他事情挤兑时间,那是另一个问题)。如果允许社区贡献,那甚至可能变快。虽然说重大的 bug 也很难被社区发现,但是小的 bug 不是这样的。退一步说,不论会不会变快,这条理由都不足以支撑闭源的决策。 + +## 开源 = 格式开放性? + +可能有老友会问:闭源软件会不会因为要留住用户而转型使用封闭格式? + +如果您的第一想法是这个,那小氯觉得您弄混了「闭源软件」和「商业软件」。不是说这件事没可能发生,而是说闭源软件和格式封闭性的相关性远远不如商业软件和格式封闭性的相关性强。Obsidian 是闭源软件,但是正如上面所说的,从 Dynalist 现在的态度上来说,和完全免费分发也基本没什么两样。而且,Obsidian 的格式开放性,在各大 PKM 工具上,应该算是首屈一指的——文件就是 Markdown,名字就是名字,文件夹就是文件夹,白板麻烦一点,`.canvas` 文件,实际上是 `.json`(参见 JSONCanvas 标准)。至于里面的语法,除了 wiki 链接(你也可以用正规 Markdown 链接代替)和 GFM 语法(现在 GFM 的兼容性已经非常高了),都是最标准的 Markdown。至于那些您自己嵌入的 dataview、iframe……很抱歉,开发者没有哪怕一点的道德和法律义务对此负责。 + +而且,至少在 PKM / 笔记软件这个领域,开源和开放格式也不是什么深度绑定甚至能称为比较相关的东西:Logseq 现在正在积极开发非 Markdown 版本;思源笔记采用 `.sy`(类似 JSON)作为存储格式,在文件系统层面上其文件夹和文件结构毫无人类可读性;至于 Appflowy,Affine,Anytype 等一众 Notion 的优秀替代品更是不用提,有的甚至连开放格式的导入和导出都不完善(当然,这件事也的确棘手)。 + +如果真要说最极致的兼容和开放,那么只能用纯粹的原始 Markdown 乃至纯文本,或者去找 VS Code,或者 Vim,Emacs 这样古神级别的编辑器了——甚至它们都不行,小氯不认为您使用 Obsidian,Typora,VS Code 或者是 Vim 打开 Org Mode 的文件时会有什么好甚至是基本的体验。 + +## 开源 = 持续开发维护? + +这很难说。无论是支持这个观点还是反对这个观点,都可以举出一大堆例子。我们只说一个很有趣的问题,就是开源是否会对风险灾备有好处。 + +具体来说:在这个 thread 创建时,Obsidian 应该还只有两位开发者,就是 Shida Li 和 Erica Xu。如果——我们说的是如果,Obsidian 遇到了非常严重的经济困难,不得不终止开发,或者被一个很有可能是 evil 的公司收购了,或者更严重的问题——例如开发者中的一位遭遇了不测,那么 Obsidian 在闭源状态下的开发是否会受到极大的、难以弥补的破坏? + +对于第一个问题,这是个很现实的事情,举一个赛道极其相近的产品——Trilium。Trilium 在今年初宣布进入了维护模式,可以理解为开发已经基本停止了。然而 Trilium 并没有随风而逝,一个 community-driven 的项目——TriliumNext 接替了 Trilium 继续活跃地开发。而第二个问题典型的例子是 MySQL 和 MariaDB,OpenOffice 和 LibreOffice 等。如果 Obsidian 闭源,这个工作几乎是完全无法完成的。 + +一个非常常见的策略是:承诺在无法继续维护时开源。Erica 似乎也在这方面有一定的兴趣,其[原文](https://forum.obsidian.md/t/open-sourcing-of-obsidian/1515/11)是:[^2] + +> In summary, I think having a privacy statement and a pledge to open up code access if Obsidian discontinues are good ideas, but open sourcing does not make sense given the current circumstances. + +对于最后一个问题……这是个非常严肃的事,尽管现在 Obsidian 的开发团队已经有了[九个人](https://obsidian.md/about)(准确来说,八个人加一只猫),但是即使对于一个上百人的大团队,如果其主理人真的很不幸出了什么意外,除非这个团队是非中心化的,否则这真的是个非常棘手的问题。在这种情况下,开源至少不会造成什么损失,毕竟多几个对项目有一定了解的热心社区成员(可以肯定其存在)总归对恢复开放不会有任何负面影响。 + +## 开源 = 开发效率? + +这当然也不一定。Licat 和 Silver 等核心成员对自己闭源的解释里面很重要的原因就是他们认为闭源对自己的开发效率更有利。 + +小氯既没办法证明也没办法否定这个说法,因为 Obsidian 的开发效率是怎样的只有团队本身才知道。我们通常认为,开源带来的社区协作效应(对于 Obsidian 这种已经有了良好社区环境的软件,这个效应可能会非常明显。Obsidian 庞大的插件可以作为一个案例,尽管其和本体开发性质不完全相同)会大大提高开发的效率和活力,但是这不是什么普遍规律。毕竟,Obsidian 社区中希望贡献的大多数人(尽管他们已经是极少数了),其水平恐怕都无法超过、达到甚至接近 Obsidian 核心团队的水平。或许 Obsidian 的团队还是希望有一个精英化的核心,这不是什么问题。 + +此外,在 thread 中有这么一条回复,提到了另一个广受赞誉的软件—— [Logseq](https://logseq.com)。 + +> for everybody that wants an open source obsidian, check out logseq: +> +> +> +> I just started migrating. Its still in beta and early, but looks really promising and the community grows well. i love it so far. my guess is that because of them being os and having all the benefits that come with it, that they will surpass obsidian in the near future in popularity (fast dev cycles, pull requests, …) + +这位用户并不算是一个成功的预言家。虽然 Logseq 和 Obsidian 在功能上有很多相似之处,但是至少就小氯写下这段话的时候,Logseq 并没有超越 Obsidian,甚至在许多方面依然落后于 Obsidian。 + +于是,有人用 Logseq 和 Obsidian 比较,说明开源实际上对开发效率不利。这显然是个荒谬的说法,至少是个不正确的论证,原因很简单——没学好控制变量法。这只能说明,对于开发来说,开源并不是一个 100% 的 game changer,而不是开源没有好处甚至有害。 + +——当然,小氯并不是说 Logseq 或者别的各位喜欢的 Markdown 笔记软件不好。Logseq 也是非常优秀的笔记软件,不论是大纲笔记,还是 Markdown 编辑,还是社区生态都非常出色。希望各位不要有什么误解。 + +## 开源 = 社区管理负担? + +很遗憾,这个事情必然存在,只是负担的大小。开源的确不是把代码扔到 GitHub 上就完事了,用 Silver 的话来说: + +> Doing open source right is a significant effort; it’s not just “putting code on GitHub”. There’s work in documentation, reply to issues, code reviews, help fellow developers get up to speed with the code base, etc. The cost to benefit ratio is very low for our small team of 2, and our plate is already full. + +那如果不接受 PR 这类的社区协作呢?这的确可以摆脱许多负担,虽然说可能还会有一些极端的 FOSSist 质问「为什么不接受」,但是小氯相信大部分的开发者都不会揪着这一件事喋喋不休。当然,严格来说,这并不是开源。 + +## 开源 = 放弃知识产权? + +**恕我直言,无稽之谈**。Linus Torvalds 开源了 Linux(一个更准确的说法可能是 GNU/Linux)的内核代码,难道这种情况下 Linus 就不是 Linux 的创造者了吗?还是说有人能够明目张胆地宣称,里面的某段代码是他/她写的,而不是 Linus Torvalds 写的?除非你采用的是 Unlicense 许可证,否则这段代码的版权永远属于你。 + +甚至即使是 Unlicense,**你也并没有失去你的版权**,你只是赋予了所有人完全自由地使用代码的权利。没有任何强制力量可以让你放弃版权,任何力量都不行。即使你真的对版权一点兴趣也没有,你觉得把代码放进公共领域是最好的归宿,那你是一位值得尊敬的开发者,但是,你的道德权利或者说是署名权,将作为一个纪念品一般的事物伴随你一生。如果你真的不喜欢(虽然说小氯还没有见过这样的人),当它不存在即可,要求人们使用时不要署上你的名字。 + +至于知识产权给作者带来收入,或者说叫「知识变现」的问题,小氯上面讲得很清楚了。 + +## 开源 = 法务问题? + +关于「不经过商用许可而商用产品」的问题,我们已经讲过了,此处只涉及「重新分发」一类的问题。 + +这个问题应当在世界各地都很普遍,只是程度不同。Licat 的原话是: + +> As a business, it’s really stressful if competitors can take your work, copy it and sell it as their own. Licenses don’t prevent copying, and lawsuits are expensive and time consuming. + +这件事确实难办——无论现在窃取 Obsidian 代码的难度如何(小氯没有试过(这是当然的 🤣),所以不能发表意见),开源确实会降低窃取代码的难度。就算是一扇有点单薄和破旧的门,也比没有门要好。所以说,在考虑要不要开源或者是源代码公开时,法务是一个值得考虑的风险,尽管其期望并不如许多人想象的那么高。 + +## 可是 XXX 不也是闭源的吗? + +小氯在线程中,不止一次看到这样或者与之相关的论述: + +> XXX 软件在业界享有盛誉,无数人都在使用它,但是 XXX 是闭源的。 + +> 各位有时间在这里争辩 Obsidian 的开源问题,那为什么不去问问 Google / Apple / MS / …… 他们为什么不开源? + +前面一个论调的支持者甚至包括 Licat,其[原文](https://forum.obsidian.md/t/open-sourcing-of-obsidian/1515/39)是: + +> The most popular, well designed, well tested, and well supported consumer applications are almost always close sourced:(下面的例子省略) + +我们分别回答两个问题。 + +许多(甚至大部分)在业界首屈一指的应用都是闭源的,但是这与 Obsidian 有什么关系呢?Microsoft Office,Google Drive,Adobe Photoshop,确实都是闭源的,但是它们和 Obsidian 的商业模式完全不一样。随便举几个例子:Microsoft Office 在任何情况下都需要支付一笔不菲的许可费用或者订阅费,Google Drive 是一个纯云端、订阅制的存储产品。即使是对这些例子而言,也并不意味着闭源就一定比开源要有很大的优势——对于 Google Drive 和 OneDrive,我们有 NextCloud 和 OwnCloud;对于 PS,我们有 GIMP;对于 MS Office,我们有 LibreOffice 和 OpenOffice,这种例子不一而足。而且,Licat 说的这个论据从头到尾都没有涉及 Obsidian 闭源是否会对绝对或者相对的功能表现构成影响,所以我实在是理解不了这能证明什么。 + +第二个问题,答案很明显:没用。我们说的这些产品都是由极其庞大的科技巨头开发的,Google,Microsoft,Meta,Apple,或者别的什么公司。它们是什么样的?数十亿上百亿美元的市值,庞大到冗杂的客户服务部门和资源多得离谱的市场营销部门,客户和开发者之间的沟通闭塞(至少我没见过哪家的 CTO 能在论坛里和用户如此推心置腹地交流)。最重要的是:**利润高于一切**。大公司是理性(rational)的,它们永远不会有什么善心。如果把你从头到尾卖个干干净净能给它们带来大于损失的利益,那它们才不会在乎你怎么想、愿不愿意。 + +**但是 Obsidian 不一样**。这是一个规模不大的、锐意创新的、愿意和用户推心置腹交流的、愿意把营造社区生态作为自己的重大责任的、(在资金上完全,在扩展性上几乎完全,在宣传方面大部分)由社区驱动的、愿意真的尊重你的隐私的——「不作恶」的公司。 + +所以在这里讨论的理由依然是:我们认为 Obsidian 开源会对大家都很好,而且我们认为能够决定 Obsidian 未来前途的话事人真的会去听并且认真考虑(但是不一定采纳)我们的意见,所以会在这里这么说。这话听起来有点傲慢,但是这是小氯能想到的最好的表达。 + +## 那你为什么不去用 XXX? + +好问题。从一个听者的角度而言,这无疑是个很令人恼火的表达,但是仔细想想,我们在生活中是不是也一直在使用这样的表达? + +回答问题:因为我们真的很喜欢 Obsidian,我们希望它开源,这样(在我们看来)对开发者和我们都更好(尽管动机大概率还是后者),而且我们认为这个问题还有可以争辩的空间,因此我们用自己宝贵的生命在这里敲下这些字符。That's it. + +## 实质性开源? + +小氯还见过这样的说法:只要你打开 Obsidian 的调试台(和浏览器的方法一样),查看 `app.js`,就可以看到 Obsidian 到底在做什么。所以 Obsidian「事实上是开源的」。 + +小氯对这个说法持保留态度。引用 Obsidian 官方论坛(引用)的一句评论: + +> The code is minified/obfuscated/packed so most keys and words are replaced by numbers, one letter variables, self-calling functions etc (as it should for production code for performence reasons alone). So it would be little help to assess anything :wink: at most it can help debug stuff when things go wrong. + +这感觉有点像是现在的 Thino(以前叫 Obsidian Memos),如果你查看其 `main.js`,你可以看到这个插件到底在做什么;但是如果你希望从 `main.js` 中获取到一个完整的执行逻辑或者是 UML 图,或者是希望用其进行二次开发,那小氯祝您好运。这种 dist 化的代码虽然是可见的,但是几乎不具备任何人类可读性,这就意味着其很难用于公开和审查,更别提是协作、分叉之类的更进一步的开源开发活动。 + +所以,从这个意义上认为 Obsidian 是「开源」或者是「实质开源」的,似乎与开源这件事本身的含义已经有些违和了。或者把话说得更重一点:这就像是国内的某些云盘号称「不限速」,实际上在其他方面对免费用户的下载体验多加掣肘一样,只是一种无聊的文字游戏。 + +## 不开源,但是源代码公共可见? + +这里涉及一个更加微妙的问题,也是一个开发社区(很可能是从计算机科学诞生开始)争执到现在的问题。 + +首先让我们严格区分几个概念,这几个概念非常容易弄混:源代码可见软件,源代码公共可见软件,开源软件和自由软件。 + +TL; DR:其范围依次递减。 + +- 源代码可见(source code available):指的是对于一个**特定的群体**而言,其能够**看到**源代码——注意小氯的用词,特定群体。那么如果我只把代码给付费用户看行不行?可以,至少从条文上可以(各位应该知道小氯说的是哪个项目)。那只给开发团队看行不行?按照定义似乎可以,但是我们一般称其为**闭源软件**。 +- 源代码公共可见(source code public available):指的是对于**所有人**而言都可以看到源代码。但是如果希望进行贡献?或者是按照你的意愿增添一个功能?或者是做一个 bug fix?不保证可以。注意此处的「人」并不是指所有自然人,森林里的原始人当然是自然人,但其看不到源代码。当然,这是因为其不具备基本的技术条件,而不是我们从条款上禁止其访问源代码。 +- 开源软件(open source):看起来开源和源代码公共可见甚至是源代码可见是同义词,但是在计算机科学这么多年的发展中,开源的定义被大大收窄了:不仅需要源代码公共可见,而且需要允许社区参与,例如各种 PR 和 issue。可以简单地认为:**开源= 源代码公共可见 + 社区协作**。 +- 自由软件(free):Free in free speech, not free in free beer. 自由软件的范围最窄,不仅要求开源,连分发也必须自由。 + +开源软件和自由软件的界限通常不甚清晰,因此常被统称为自由开源软件(Free and open source software,简称 FOSS);而源代码公共可见和开源常常被混淆,这并不是一个很严谨的事情,尤其是在这个 thread 中。 + +显然,对于 Obsidian 的隐私问题而言,源代码公共可见就够了,同时这样也可以避免社区管理的压力;而开源可以更直接地收获社区的助力,但是同时也会有一些问题和负担。对小氯而言,前一个级别已经够了——虽然说小氯很愿意 contribute,但是目前来看,有心无力。 + +## 先开源一部分核心组件? + +这是个非常好的想法,而且很有可行性。虽说大部分的讨论主要还是纠结于 Obsidian 本体,但是仔细想想,Obsidian Sync 也不是什么特别令人放心的事情。E2EE 确实很具有隐私性,但是我们无法确保——抱歉,我又涉及道德问题了。 + +而且,先开源一部分核心组件的管理压力比一下子开源所有代码小得多,可以当作一种「试水」(尽管 Obsidian 已经开源了几个项目了)。社区也提出了一些看起来比较合理的开源 roadmap,小氯不在此细说了。 + +## 总结 + +我们说了很多很多,如果让小氯酱概括下到底说了什么,无非就是连篇累牍的推理和论证,(对 Obsidian 来说)开源是什么,开源不是什么,什么是开源,以及其他相关的问题,等等。 + +社区对这个问题已经谈了太多太多。喜欢开源的人,会更多地关注开源软件相对于闭源软件的优势,并且更多地使用开源软件中最杰出的那一批来塑造自己的观念;喜欢闭源的人反之。这是一种先发的认知偏差。小氯是个 FOSS 主义者,但是在前面的论述中,小氯在尽力避免立场带来的不客观,希望做得不算太差。 + +最后,可能有老友会问:既然你说过,很大程度上 Obsidian 开源(源代码公开)的象征意义更大,那么象征意义就那么重要吗? + +尽管说小氯前面似乎看起来很理性地分析了一堆,但是如果从一个用户、一个个人的角度,允许我使用感性,那么我的答案是:**是的,对于我们,真的很重要**。小氯可以这么说:如果 Obsidian 有一天真的开放源代码了,那么小氯很可能这辈子都不会更换笔记软件了。但是现在,小氯还是只能对着各位老友半开玩笑地说:「在我的电脑上任何个人使用的第三方软件都是开源的——Obsidian 是少数的例外,它用实力争得了这个位置。」 + +虽然说,是否开源是 Obsidian 团队的自由,并且他们已经明确表示在可预见未来内不会开源,但是小氯还是有那么一份有点不切实际的愿望或者说是幻想:希望有那么一天,能够看到 Obsidian 真正成为「Your Last Stop of PKM」,HN 的头版头条能够铺满这一「惊人的壮举」,以及,FOSS 主义者们以各种方式向这个堪称世界上最优秀的 PKM 软件之一的杰作献上自己的崇高敬意。 + +[^1]: thread 一般被翻译为「线程」,其实就是论坛里一个单独的讨论区或者叫讨论进程。和 Reddit 的 subreddit 之类的东西没什么区别。 +[^2]: 目前尚未找到 Obsidian 明确的官方说明。 \ No newline at end of file diff --git a/content/posts/沉思录/小氯,Chlorine抑或我.md b/content/posts/沉思录/小氯,Chlorine抑或我.md new file mode 100644 index 0000000..6ccee23 --- /dev/null +++ b/content/posts/沉思录/小氯,Chlorine抑或我.md @@ -0,0 +1,220 @@ +--- +title: 小氯,Chlorine抑或我 +date: 2025-04-05 +slug: chlorine-and-me +featuredImage: https://img.viento.cc/cover/chlorine-and-me-cover.webp +categories: + - 沉思录 +tags: + - Nickname + - 数字资本主义 + - 自我认同 +series: +summary: 或许是小氯写的 +description: 本文是一篇关于网络身份与自我认同的随笔,作者以自己的昵称 Chlorine(小氯)为线索,探讨了虚拟形象、网名选择背后的心理动机,以及数字时代身份认同的复杂性。作者的昵称源于对化学元素拟人形象的喜爱,并逐渐固化为网络身份的核心符号。作者通过结合分析虚拟形象和昵称的,指出其本质为个体希望呈现给他人的自我投射。进一步,文章讨论了网名与现实姓名的区别,强调网名因其高度自由性,成为个体在数字空间表达真实自我的重要载体。然而,作者也反思了数字资本主义下平台算法对身份的异化:当个体的网络行为被数据反向定义时,人可能沦为被算法塑造的客体,甚至失去对自身身份的解释权。最后,作者回归个人立场,申明“小氯”这一身份的意义——它代表一种不受现实约束的、纯粹的精神状态,并呼吁保持对生活的鲜活感知,拒绝成为“无聊的大人”。文章以哲学化的结语收尾,承认自我的多元性与流动性,主张接纳不同语境下的“我”共存。 +wikilinks: true +--- + +## 前言 + +这是一篇在小氯的草稿箱里躺了许久的「即兴随笔」,断断续续用了一个月左右才写完。 + +本文逻辑松散且混乱,如果您追求论文式的精巧和严密,推荐您准备好降压药和速效救心丸。 + +--- + +各位老友,晚上好。这里是…… + +是谁呢?大概是小氯,或者是 Chlorine,那个现实中的 Residencia 0x001B 的公共空间中捧着一台 MacBook 敲字的满眼严肃的学生,抑或是园子里的 Residencia 0x001B 的公共空间热饮的氤氲雾气中端着茶杯眉眼弯弯的元素娘。 + +对的。所以今天……简单碎碎念一句,小氯,抑或 Chlorine,抑或我,名字的来历,以及相关的一些东西。 + +## Another Nickname? + +如果有认识小氯时间很长的老友(大抵是不多了)——例如,从初中开始,可能会记得起来,这个笨蛋曾经用过各种稀奇古怪的 Nickname。具体都有什么……小氯实在是不好意思说,~~简直就是一种新颖的羞耻 play~~。 + +所以让我们作个弊吧,直接把时间跳到园子建立不久之后。 + +那是一个很偶然的机会,小氯看到了一位 B 站 up 主 [@磷铈镧矿-monazite](https://space.bilibili.com/354098648) 的一些画作。这位 up 主的画大多是「化学元素拟人」——对当时的小氯来说,这还是种蛮新奇的艺术形式(姑且如此叫?只是感觉,把人类传统认识中没有生命的东西画成具有自己的喜怒哀乐、思维记忆的生命是件挺酷的事)。 + +作为最活泼的非金属族,卤素自然在其中占了很大的戏份。而在这位 up 的所有卤素拟人中,我感觉,那个氯元素的拟人莫名其妙地可爱——至少当时的我是这么觉得的。 + +于是小氯大张旗鼓地把头像换成了那张拟人图,甚至还给人家 up 发过私信请求授权使用(捂脸)。 + +然后为了彰显我对这幅图的喜爱,我就把 Nickname 也改了,就成了 Chlorine。毕竟咱都改过那么多的 Nickname 了,再改一个算什么呢。 + +后来呢……我对自己的头像有些审美疲劳了(小氯总是这样的),于是打算用 AI 搓一个新的。在写 prompt 时,也非常自然地写了「氯元素的拟人形象」。后来的很多个头像,都是这样。昵称也没有再动过,一方面是头像和这个昵称大部分时候都很配(我记得只有两个例外,一段时间用的是 Windows 11 娘,一段时间是一个乱画的形象),另一方面是,小氯确实懒得改了。 + +后来……也不太清楚是什么时候,大概是从 2024 年的中旬开始吧,我开始在文章中使用「小氯」这个自称。很明显的词汇,对 Chlorine 的一个略微可爱的直译。 + +直到现在。 + +## 昵称,头像,虚拟形象,自设与 OC + +读到这里,如果您感到有点疲惫的话(应该不太会),可以先 Cmd + Click 一下左上角小氯的头像,去首页看一看大图。这个梳着侧马尾、翘着一撮呆毛、扎着个奇怪的蓝色蝴蝶结、穿着简单的白色 T 恤、专心致志地用着 MacBook 的萌娘大概算是小氯的虚拟形象中用的时间最长的一个,也是目前最满意的一个。 + +嗯……说实话,这张图画得不算很好:人物的神情算不上自然,脸庞的比例有问题(下巴的尖部过渡得不够好,同时婴儿肥有点过度),手部有些僵硬,光影处理得也不够好。此外还有一个最大的问题:**这图和氯元素几乎扯不上任何关系**,不说化学实验室的经典设备或者是常见化合物的(广义)分子式,你起码加个元素符号吧?不过,这确实已经是小氯目前能设计出的最好的一张了——毕竟小氯实在手残,只能靠着 AI 各种炼金。 + +头像当然不一定是虚拟形象,但是就小氯而言是这样的。这个现象在创作者和独立博主中似乎格外突出,也是一个值得讨论的 relation。此外还有很多和「虚拟形象」意思关联但是不完全相同的词,例如自设和 OC(原创角色)。这两个词解释起来比较麻烦,我们这里不多探讨了。 + +这种虚拟形象,可以视作网名的一种延伸,以通过视觉强调「希望强调之物」。或者我们也可以引入一个更加「RPG」的解释:如果赛博空间有实体的话(我怎么会说出这么奇怪的话),希望他人眼中自己的形象是这样的。 + +当然,这也并不意味着虚拟形象一定就是本人的全部或者主要形象的延伸。就比如说小氯的虚拟形象是这样,并不意味着小氯在现实中也是个二次元美少女(~~当然不会是~~);而这个形象看着比较温和、可爱,也并不就意味着小氯在现实中就是个温和的人——事实上也并不是。但是有一点是对的:**小氯希望在网络空间中,能对老友们展现温和的一面**。这样自然有很多好处(拜托……不要在你正常地看着人的时候让人以为你想用眼神杀死别人好吗?)。 + +这可能是大部分虚拟身份和本人之间的联系: + +> 是我,但又不完全是我,也不是完全的我,但确实是希望大家看到的我。 + +## 名字与网名 + +网名可以改,名字自然也可以,只不过由于一些原因,改起来比较麻烦而已。 + +那是好久好久以前了,看到过这样的一个文章(阅读题,大概是)的桥段,大概意思是:当时的年轻人中,时兴改名字。作者于是询问自己好友的意见,结果晚间时,好友传来一张二指宽的字条:叫松涛如何?作者对这个名字非常中意,于是户口本上的「李荣阁」就变成了「李松涛」(这个故事应该是真的,因为确实有一位原名李荣阁,后来改名李松涛的诗人——也就是源桥父,曾经中国诗歌学会的副会长)。 + +嗯,小氯是这样的,总是会把某些莫名其妙的东西记好久好久。 + +改名字当然不是为了好玩。举个例子,我国的历史上,有过几次改名的风潮,其原因大差不差,可以归为「自我意识的觉醒」——当然,小氯不太喜欢用「觉醒」这个词。或者说,当时的年轻人迫切地需要一种方式,来摆脱「外部定义」的身份认知,不论是对自己的暗示还是对外界的宣誓。而「名字」,大概是身份最好的载体了。这方面我们可以说很多,比如说,名字承载了家族传承、民族特色等,名字具有法律和社会约束力,名字是社会赋予个体的标签和个人身份认同的核心符号,云云。 + +是的,一个指称自己的标识符,在某些方面就是我们对自己几乎全部的认知。像是数据库中的条目,条目和主键的概念几乎混一。 + +网名,大概也是同一个道理。名字是现实的身份认同的代表,而网络是虚拟的身份认同的代表。 + +不过不同于名字,网名的自由度高很多。其原因可以分析成一篇小论文,在小氯看来,大概就是**名字和现实是强耦合的,而网名未必**。For instance, 名字由于其社会标识符的性质,不可避免地要符合一些格式规范,比如说目前还不支持加入 Emoji,但是网名可以;名字一般是父母起的,自己没有先天选择权(~~类似于你父母的婚礼为什么不请你~~),但是网名全凭你自己的喜好;由于其传统价值和法律效力,修改名字的过程一般都很繁琐,但是大部分平台的网名都是很好改的;可能是最重要的——名字或许会是一个中规中矩的、无趣的、和你的个性毫无关系的标识符,但网名永远不会。你可以把名字写成「奶龙大战歌利亚」或者别的什么来彰显你的~~抽象~~非主流和标新立异而不会担心社会性死亡,可以把你最喜欢的动漫人物写在名字里大喊这是我老婆 / 老公,可以用一串 👊🇺🇸🔥 去大肆嘲笑呆瓜一样的神秘西方大国高层。你当然也可以在现实中循规蹈矩、小心翼翼,而在网络中尽情泼洒自己的情感,鲜衣怒马,张扬肆意。判若两人。 + +依我们上面的分析,这似乎暗示着某种**身份认同的分离**。 + +## 虚幻系于一身 + +现实身份和虚拟身份的认同分离,这并不是什么新的话题。去知网或者 JSTOR 一搜,相关的的论文没有一百也有八十。不过好像现在依然在分离,速度也并没有变慢。嗯,我们社会科学是这样的,善于提出问题,但是无法解决问题(如果小氯的话冒犯了您,那么真的很抱歉,小氯酱请您喝果茶)。 + +![solve-the-world|332](https://img.viento.cc/20250403-solve-the-world.avif "解决世界(迫真") + +小氯不想在这里讨论一个沉默寡言高度近视的程序员在互联网上可能是一位超酷的漫画家之类的案例,我们只说一说,这个分离到底分离出了什么。 + +最经典的争论大概就是,现实自我和网络自我(我们姑且这么叫)哪个更接近「真实的自我」。「现实派」总是说,网络再精彩,那毕竟也是「假的」,而且也具有表演的性质,而「网络派」则会毫不犹豫地反唇相讥:在现实中与社会生活强耦合的、被规训的一言一行能代表真实的自我吗?还不如在一个相对匿名的环境中能表现出「最自然、最纯粹的自我」。不过这可又给了现实派反驳的空间:那么现实中的社会规范就不算是自我的一部分了吗?…… + +不过,我亲爱的会一点数学的老友们,我们讨论哪一个「自我」更接近「真实的自我」,其实有一个隐含前提,就是**确实有那么一个单一的、可供讨论的「真实自我」**,或者是起码有一个能被认为是「真实自我」的同侪之首。就像我们研究极限、积分或者期望的性质时,前提都是它们存在。 + +这个前提可算不得很可靠,就像毕达哥拉斯的门徒们将证明的前提建立在「一切量都可公度」上一样。许多哲学流派都认为,自我并不是统一的、单一的、不变的对象,而是流动的、语境化的,而不同的语境可没有什么等级之分。深奥的哲学观念不好懂,但是直观上应该没有太多可质疑的地方,我们上面说的网络身份和现实身份的异质性或者冲突性就是很好的例子。也可以打个比方:拍照——在拍摄证件照的时候,正襟危坐、仪表堂堂;在生活中的抓拍中,爽朗恣意、神采飞扬。 + +如果非要说几个名字来增进我们的权威性,Hume(休谟)大概是这个概念最早的质疑者之一。在他眼中,自我并不是一个统一的实体,而是一组知觉的结合,「一阵热、一次疲劳、一种快乐、一丝痛苦,一次思想、一次希望」。或者还有 Foucault(福柯)的权力、主体和规训观:主体不是一个先验的存在,而是历史和话语的产物。不同的历史时期和权力关系塑造了不同类型的主体。即使不在批判的武器中纠结,我们也可以诉诸武器的批判来物理切分自我——没错,裂脑人实验。 + +从某种意义上说,如果我们假定有一个名为「自我」的先验空间,那么不同语境下我们的表现,不过是语境这个滤波器将其中的某个子空间过滤出来了而已。它们彼此之间存在着基底性的差异,使得某一个自我并不会成为另一个的附属。由于语境这种滤波器本身的限制,我们永远无法找出「自我」的一组基底,而且由于「自我」糟糕的性质,其中可能还存在不完备的、自相矛盾的地方。因而,完整的「自我」是不可观察、不可定义的,只能通过不同语境下的自我,做盲人摸象式的认知。甚至,我们为了方便理解而假设的先验空间也是虚构的——一个出于我们对统一性、连续性和秩序的渴望而建构出来的叙事框架。这个框架并非为了揭示所谓真实自我的本质,而是为了缓解我们面对碎片化存在时的不安。我们用这个概念为种种截然不同的行为贴上归属的标签,仿佛只要能够找到那个幕后的一致性来源,就能给混乱的体验赋予意义。 + +但现实可能是,我们根本不是从一个中心出发去表达多种面貌,而是本就由多种面貌拼贴而成。在朋友圈里发着精致的咖啡照的你、在职场会议上滔滔不绝的你、在深夜里与朋友吐露心声时的你、在网络匿名论坛上肆意表达的你——这些「你」并不附属于某个更大的不可知但存在的对象,它们就是你。每一个你都在特定的情境中被激活、被塑造、被赋予存在的正当性。 + +那么这样,执着于在现实与网络之间一较高下,争夺谁更接近那个「真实的自我」,其实也没有多大的意义了。我们不如关心一下,我在何种语境下、以何种方式得以成为我。 + +## 当你失去名字 + +我们上面的讨论中,「数字自我」或者「网络自我」都有一个关键的前提:**这是你主动塑造的、完全掌控的自我**。或者至少吧,是你能部分控制的自我,比如说你在 X,在 YouTube,在 Bilibili 上的创作者账户。这样我们还可以去争一争经典的「账户到底是谁的」「我拥有我身份的主权」的问题。 + +那如果虚拟身份并不是你自己主动塑造的,不是你能够掌控的,不再代表你鲜活的、希望为人所知的那部分你,会如何? + +……小氯在写《马克思主义基本原理》的课程作业——一份调查报告,内容是数字时代的社会原子化现象——时,曾经随手写了这样一个观点: + +> 而且,当前技术尚无法将人的复杂性(如道德、创造力、情感体验等)完整地数据化,这些片面的、不完整的数据集合也常常被平台滥用,构建片面乃至扭曲的数字画像,加剧了现实自我与数字身份之间的分离和对立。 + +我们举个例子好了。 + +许多的虚拟身份,例如你用来刷视频打发时间的抖音账号,并不是你主动塑造的数字自我。你在刷视频的时候——尤其是你并不是很清醒地知道自己要找做某道菜的教程或者是统计力学的 OCW 时,主观上没有有意识或者无意识地想着,这个举动是我的一部分,反映了我的什么或者是我希望的什么。但是平台并不知道也不在乎你会如何想。它只会记录:你在某个时间的某个客户端接到了某条视频的推送,你在这条视频停留了若干时长,表明你可能对某个主题感兴趣,建议后续增加该方面广告和视频的推送频率,云云。如果只是数据画像还则罢了,糟糕的是由于第一颗扣子等诸多效应,这个画像往往连一个较好的低维近似都不是。很可能平台认为你喜欢某种视频并给你推一大堆同类型的视频,原因只是你刚进入这个平台时随手点了一个这个类型的。你在某橙色软件上随手点了几次猫爪杯,它就坚定地认为你是一个每天需要被可爱治愈的女性用户;看了几个关于健身的视频,它就开始疯狂给你推蛋白粉和肌酸;在某次搜索焦虑症的时候,它就默默在后台记下了你「心理状态不稳」的标签;逛了几个游戏论坛,你就成了「爱好虚拟世界」的玩家;在微博上跟人爆发了一次争吵,你的信息流中就开始充斥着各种的极端言论。如果我们再「赛博朋克」一点,最终你所看到的推荐内容、收到的广告推送,甚至系统对你的服务响应优先级,都被这一套模型所定义——而你呢,我的朋友?你既没有机会修改这些描述,也无从得知它们具体长什么样子。 + +除了做 Google 翻译二十次的生草视频之外,不准确从来都不是什么好事。尤其是在自我身份这种重要的事情上——我们姑且认为它重要,不然写了这么多会显得小氯很呆——以及「平台控制一切」的数字资本主义下。 + +想想看,在平台的数据库中,有一个「你」的存在,但那不是你自己定义的「你」,而是一个由点击、停留时间、浏览记录、点赞行为拼凑出来的幽灵——一个数字傀儡。甚至更糟的是,这个傀儡可能比你自己还「有说服力」——它会被用来判断你是否容易被广告影响、是否适合某类职位、是否值得获得某种贷款,甚至是否容易「出问题」。 + +> 他们用我的几张照片、我的一点点声音,在一个陌生的城市以我的名义开了一家店,但我却连招牌上写的是什么都不知道。 + +我们还有更糟糕的。Newton's 3th Law 告诉我们,动量的传递是双向的。你无法在影响另一个事物的同时置身事外,反之亦然。即使你清醒地知道,那个账号的你并不是你的一个良好的切片,但当你被无数偏差的信息包围时,保有自己原本的思想不受干扰就成了特工级别的素质。他们甚至可以扭曲你周围的信息,来潜移默化地实现思想的控制和塑造。 + +这就是数字资本主义时代,网络自我认同最大的危机——个体从自我表达的主体退化为被建模的对象,从说话的人变成了被分析的样本。我们过去说人如其名,说以名识人,而现在,名字或许还在,但意义已经被抽离。你不再被称呼,而是被调用;不是被理解,而是被预测;不再被尊重,而是被改变。你不再是李华或者「往事随风」或者 `iamlihua.tld`,你是用户 01JQXTDNWNDZZF8T344ZBSDRZG,一个孤立的、可替代的对象。你可以被「变成」另外一个用户,去代替他 / 她 / 它因退出而产生的空隙,像是同质化代币。 + +**你失去了自己的名字,也失去了自己的身份**。 + +我们常说「命名即权力」:古老的神话中,掌握一个人的真名就意味着掌握了他的命运;《千与千寻》中,千寻被汤婆婆夺走了自己的名字,也失去了从前的自我;《百年孤独》中,布恩迪亚家族一代一代名字的轮回,象征着永远无法逃脱的宿命的梦魇。而在数字资本主义中,这种权力已经滑落到了平台、模型、算法、标签、推荐系统手里。它们不需要理解你,只需要定义你。 + +感觉不出来是吗?那我们换点更刺激的吧。 + +…… + +《1984》里面,Syme 曾经对 Winston 说,总有一天,新话会删去「自由」这个词,到那时候,也没人能理解「自由即奴役」是什么意思了。这么看来,Orwell 大抵是了解过 Sapir-Whorf Hypothesis,甚至可能是其强形式。 + +那么比普通的语言词汇对社会关系的塑造更有力的是什么呢? + +**称呼**。无论是母亲、祖父、恩师、兄弟还是姑娘、先生、老友、阁下。 + +大洋国只有一种称呼,就是「同志」。至于同的是什么志呢?自然是英社,因为大洋国不允许有别的思想。这种单一的思想取代了所有的社会联结,成为了人与人之间唯一的通道。那两个通过(当然是党允许的)繁衍行为赋予你生命的同志——假如你没有亲自向 Thinkpol 检举他们的话,和与你素不相识的、指导你去完成 Physical Jerk 的同志,也没什么不同。 + +语言的简化,断绝了探索过去和未来的时空的通道;称呼的归一,关闭了建立于人与人之间关系的情感联结的可能。那什么能将个人的概念也消弭呢? + +**自然是名字的废弃**。「Comrade 0x1D7802A3」可比 Winston Smith 适合定位多了。而 Comrade 0x1D7802A4 经过适当的培训——或者叫加工吧,也能大体起到和 Comrade 0x1D7802A3 一样的作用。 + +……《娱乐至死》的开头有这么句话: + +> 人们一直密切关注着 1984 年。这一年如期而至,而乔治·奥威尔关于 1984 年的预言并没有成为现实,忧虑过后美国人禁不住轻轻唱起了颂扬自己的赞歌。自由民主的根得以延续,不管奥威尔笔下的噩梦是否降临在别的地方,至少我们是幸免于难了。 + +嗯,但愿如此。 + +## 所以你希望说什么? + +无用的哲学说了蛮多的了,那我们回到刚开始那个轻松的话题吧,小氯的昵称和虚拟形象。 + +嗯,Chlorine 这个词给人的第一印象可能并不那么好。小氯自己也不得不承认:**客观上说,「Chlorine」并不是个适合当作昵称的词汇**。 + +这个词汇没有任何其他的含义,就是氯,元素周期表排行 17 的元素,或者是其单质氯气——一种黄绿色的、刺激性气味的剧毒气体。第一次世界大战中西线战士们的噩梦,种族灭绝中最骇人的化学武器,化工厂生产线中翻腾的原料,高中化学题中把学生们折磨得死去活来的重要考点。 + +谁会喜欢这样一个东西呢? + +如果真的真的要给这个名字和小氯的过去扯一点关系的话,那大概只有「喜欢化学」了——如小氯[[Ephemeralis-Weekly(3):执笔衔书|从前所说]],小氯曾经有一个化学梦,并且差点真的实现——小氯曾经认认真真地要报北大化院,甚至想过去打化学竞赛,差点真的成为一只元素少年 / 少女(bushi)。不过要是小氯现在真的在学化学的话,那大概也不会用 Chlorine 这种常见物质当作名字,而是会选一个不那么常见的东西吧——而且,如果那样,小氯大概也不会有技术能力来写独立博客了,以小氯这个亲痛仇快的计算机基础。 + +所以,「小氯」这个写起来很麻烦的名字,就是一个和现实毫无关联的、完全独立的网名。它代表着这个小心翼翼地闯入世界的旅行者在此地全部的全部。 + +所以我也希望各位老友,在这里,就叫我小氯好了。让那些与自己身份强绑定的活动和严肃的学术合作呆在现实中吧。 + +而小氯也想得寸进尺地希望,在这里,小氯能和自己的头像,或者叫虚拟形象(在精神层面)一致——没有什么多余的修饰,也没有什么多余的笔触。并不精致,并不矫揉造作,并不可爱到让人心融化,也没有一丝一毫的擦边或者涩气。一台 MacBook,一杯果茶,一只安安静静的元素娘,微微笑着,眉眼弯弯,温和、文雅而明亮。这就是全部。 + +这是小氯最稳定、最美好(两个词都是本意)的精神状态的外化和投影。 + +至于……现实与虚拟的分离吗?小氯是不在乎的。毕竟,连我们所谓的「现实」,都可能只是一台超级计算机中的一个进程而已。[^1] + +## 我不想做无聊的大人 + +这个标题听起来已经足够幼稚了,很可惜我找不到一个更好的表达。 + +小氯没什么远大的人生理想,不高的要求之一是永远做个有趣的人,不要变得无聊。所以小氯在写文章的时候,会有意无意地玩一点梗或者冷幽默,当然还有这个略带卖萌的自称。嗯,至少我不希望像我看到的许多博客的主人那样,学富五车,然而一百篇文章找不出一个鲜活的表达,无论是可爱的或是犯贱的。他们给我的感觉,就像是生活和技术的提线木偶,尽管可能有变形金刚那么大——抱歉这句话有点冒犯,有一些博主可能只是习惯于相对严肃的技术表达风格而已。 + +那到底做到什么程度,才能算是一个有趣的人呢? + +没人回答得了,就像古往今来的所有哲学家都没办法解释清楚什么是「伟大的人」一样。毕竟,有趣这个词实在是太主观了,比伟大还要主观很多。 + +不过至少,我自己,不管是现在的还是几年前的自己,都不要讨厌我自己吧?要是小氯已经到了自己都讨厌自己的地步了,那约莫可以找个地方把自己埋了。 + +但是只做到不讨厌自己似乎不够,鸡农可能也不讨厌自己,但是是个人都不会觉得他有趣(~~《犹趣》~~)。那我们加一点修饰条件吧,在此之上,能给自己所爱之人带来一些温暖和快乐,给愿意爱自己的人一些理由去如此做,或许就能算是「有趣」的最低的条件了。 + +至于说起具体的事情……或许还能被充满理想和朝气的文字感动得热泪盈眶,至少短暂地恢复一段对生活的热爱;或许在所爱之人面前能毫无保留地袒露自己的秘密,能在文章中毫不羞涩地直言「我爱他们」;或许面对公式和算法还不至于只剩下烦心,能从人类心智荣耀的巅峰中找到一点 Eureka 的快乐;或许在看到一个用了最新技术栈的 rewrite 的时候还能提起兴趣动手自己部署一下,而不是即使服务器的资源要被上个时代的老古董们吸干了也只想加钱不想优化……总而言之,还能保有一点生气和鲜活。我们希望找到一个清晰的、指导性的答案,但最后也只能用这种模糊的话来回答。 + +当然,当然。如果这些事情做起来和说起来一样简单,那么世界上或许就不会有那么多悲剧了。小氯能对自己保证的也不过是「尽力去做」,能保护一点点,就保护一点点。 + +那做最悲观的打算,可能即使小氯不再年轻了,不再有资格幻想了,小氯依然也会偶尔用一用这个卖萌的称呼,那是曾经充满生气的元素娘在这个世界最后的鲜活。 + +或许如此,直到白发苍苍。 + +> 即使要被生活灌成泡芙了……也得撑着起来给它一巴掌。 + +## 后记 + +写了好久好久的一篇文章,或许是讲述,或许是探索,或许是议论。或者最合适的叫法是一次梦游一般的自我开掘,像 WebSocket 一样用一条细若游丝的意识电磁波,连接不同时刻、不同状态,在这篇文章中写写画画的小氯。 + +最后,还是让我们用一种浪漫主义的手法结束这篇无意义的碎碎念吧。 + +我是小氯,也是 Chlorine。是那个能在下雨的夜晚茶水的氤氲雾气中给你慢慢讲故事的元素娘,也是那个喜欢写写代码做做回归分析的学生,是那个带着唯物主义和阶级斗争去拆解人类行为的知识分子,也是那个世故言行耿直理想的普通的人形生命体。 + +无数个语境,就是无数个自我。温和安静的,嬉笑怒骂的,恣意放荡的,冷峻理性的,辛辣讽刺的,奋不顾身的。如万花筒,如偏振片。彼此耦合、勾连、重组、跃迁,在缓慢前进的时间中纠缠、相变、破缺、坍缩。 + +凡此百千,如其所是。于天地,须臾刹那;于蜉蝣,阿僧祇劫。 + +应作如是观。 + +> 我与我周旋久,宁做我。 + +[^1]: 这是一个经典的「终极假设」,即宇宙是否是一台超级计算机。 \ No newline at end of file diff --git a/content/posts/沉思录/有用与有趣之间.md b/content/posts/沉思录/有用与有趣之间.md new file mode 100644 index 0000000..6b37c8e --- /dev/null +++ b/content/posts/沉思录/有用与有趣之间.md @@ -0,0 +1,68 @@ +--- +title: 有用与有趣之间 +categories: ["沉思录"] +date: 2024-01-26T12:00:00 +tags: + - 随笔 +featuredImage: https://img.viento.cc/IMG-20240126120000-0.webp +slug: between-interesting-and-useful +summary: 关于独立博客「有用」的一点思考。 +description: 本文探讨了作者在写技术博客时的内心挣扎和对内容「有用」与「有趣」之间关系的思考。作者因担心技术水平不够和追求完美,迟迟没有发布笔记。同时,反思写博客的目的,是为了记录自己有意义的内容,还是迎合读者。作者认为,不必过于执着于内容是否有用,只要能带来温暖的生命体验,独立博客就有其独特的价值。 +--- + +事情的起因是这样的。我最近在看视频预习 OOP (面向对象编程)的知识,于是用 Obsidian 记了不少笔记。由于我很早就有将笔记作为博客发布的想法,因此,我在写笔记的时候也花了些心思,希望尽可能的引人入胜。 + +可是到了要发布的时候我却算了。一方面,是自己的技术力实在太弱;另一方面,是我的一个比较大的想法——把程设和 OOP 两门课的所有知识整合好,编写成一份完整的“学徒写给学徒”的 C++ 入门教程。 + +不过这个工作量很大,因为我初期没有很多 C++ 的笔记。而且,正如《C++ Primer Plus》里面说的,随着我们的学习,这些词汇将从花里胡哨的词语变为论述中必不可少的术语。即使你的知识稍多一点,也很难回到最初清澈而愚蠢的状态去写教程了。 + +而我的强迫症又不能允许我先发后面的知识,于是卡住,给大家一种我一直在鸽的印象。 + +此外,我也会时常担心我的文章写得不好,读者会不喜欢。这种担心在写笔记 (技术博客)的时候尤其明显。 + +--- + +我订阅了一个很喜欢的博客站—— [夜猫日记 (lillianwho.com)](https://lillianwho.com/)。这是我见到的第一个独立博客,不夸张地说,我是受这位博主的影响才有了建站的念头的。 + +我一般都是安静地浏览文章,但是今天我却突然想到:如果有一个人给我的博客留了言,只要不是广告或者恶意中伤的言论,我都会很开心。那是不是其他漂流在互联网海洋的孤岛,它们的主人也是这么想的呢? + +于是我码了一段留言,大意是对文章的看法表示赞同,并简单表示了感谢。 + +不久后我就收到了回复。 + +![](https://img.viento.cc/IMG-20240126120000-1.webp) + +我陷入了沉思. + +在我眼里,这个小站已经非常优秀了,无论是颜值还是内容。然而,它的主人和我却有一样的担心。而且我有足够的理由推测,许多的博主也有这样的顾虑。 + +**担心「写得不好」,是人之常情。但是如果 (像我一样)因此而畏手畏脚,是否有些过激了?** + +感觉在这点上,博主[青山](https://yinji.org/)说得蛮好的: + +> 上周没有更新周报,回顾一周,并没有值得记录的事情,而我不想为了写而写,必须是要记录一些对我有意义的内容。这其实也涉及一个话题,我们写博客是为了写我们想记录的内容,还是为了写希望读者阅读的内容?过去我可能是后者,打着“每日一博”的旗号坚持更新,希望获得阅读量、评论和反馈,现在我是前者,希望记录有意义的内容,如果恰巧能让读者也喜欢,不胜荣幸。 + +原文链接:[周报 #07 – 铲屎官、内容与外表、新闻女王 | 印记 (yinji.org)](https://yinji.org/5195.html) + +可惜,道理我懂,但是很难像青山看得那么开。可能这也算是 INFJ 的一个缺点吧。 + +此外,似乎还有另外一个问题:**何为有用?** + +这个问题的哲学浓度有点超标,不过,忘记在哪听过一个说法:中国古代似乎没有专职的哲学家,因为在中国古代,读哲学是为了让人成为人,而不是成为某种特殊的人。 + +> 人不一定应当是宗教的,但他一定应当是哲学的。 +> —— 冯友兰《中国哲学简史》 + +扯远了。这个问题我还给不出明确的回答,但是我至少能分清一件事,就是**好笑和有趣有本质的不同**。 + +一个无厘头的抽象视频,当然非常好笑,但是我不觉得它有趣;而一篇简单分享自己下午茶动手煎了个鸡蛋的博文,一点也不好笑,但是看着看着,嘴角却不自觉勾起一抹弧度。 + +知乎曾经用过一个 slogan 「与世界分享你的知识、经验和见解」, 我觉得,再加上一个词「生命体验」, 就能概括独立博客的使命 (这个词有点大)了。 + +是的,生命体验。这个词听起来很玄乎,但是很容易实例化。而我觉得,在这个「泛娱乐化」的时代,能够带着温暖和平静将自己的生命体验写成博客,就已经是有趣且有意义的了。 + +从这个意义上说,独立博客就是博主的数字生命。 + +而「知识、经验和见解」—— 更加「有用」的「干货」, 我不想为这两种内容划个高下,毕竟,发动机的汽油和手中的热巧克力都是不可或缺的。 + +所以,我觉得,也不必执着于是否「有用」了。即使它们真的是无用的,能够耐心地将你的知识、经验、见解和生命体验从头看到尾的读者,想必也是懂得它们的「无用之用」的吧 (笑)。 diff --git a/content/posts/百草园/DGP:重新出发.md b/content/posts/百草园/DGP:重新出发.md new file mode 100644 index 0000000..a3dfa36 --- /dev/null +++ b/content/posts/百草园/DGP:重新出发.md @@ -0,0 +1,437 @@ +--- +title: DGP:重新出发 +date: 2025-04-24 +slug: restart +featuredImage: https://img.viento.cc/cover/restart-cover.webp +categories: + - 百草园 +tags: + - 博客 + - 开源 + - Codeberg + - Netlify + - GitHub +series: +summary: 我们总要有重新出发的勇气 +description: 本文是作者对博客近期技术和理念上的大修进行的详细记录与反思,核心围绕提升隐私保护、去中心化以及对自由开放的追求。首先,由于对隐私和身份解耦的需求,作者注销了网站备案,减少与国内服务的绑定,并对内容进行了身份模糊处理。虽然这带来了表达和身份认同的双重限制,但作者更希望以内容和观点被记住。技术层面,图床迁移至Cloudflare R2,博客源码不再托管于GitHub,而是转向更注重自由和非营利精神的Codeberg,并尝试自建Forgejo实例,同时为Codeberg社区捐款支持。作者对GitHub及其母公司微软的批评集中在平台闭源、AI训练争议、社区治理及对中国大陆用户的可用性问题,认为其垄断和盈利动机已背离开源精神。部署方面,作者探索了Vercel CLI、Netlify CLI等多种与Codeberg结合的持续部署方案,最终实现博客与GitHub“断绝关系”,实现更纯粹的自由部署。评论系统也从Twikoo迁移到Artalk,提升了自定义和管理自由度。在整个迁移和重构过程中,作者强调了对FOSS(自由开源软件)和开放共享理念的信仰,以及在现实与理想之间的权衡,承认完全割舍主流平台在实际操作中有其局限,但仍愿意为自由和自我表达的空间持续努力。文章最后,作者以温暖的语气邀请读者来到博客,表达了对精神自由和自我重建的向往,呼吁保持勇气,不断从头开始。 +wikilinks: true +lastmod: 2025-04-24 +--- + +各位老友们,晚上好。这里是 Chlorine。 + +许久不见,不知各位老友过得如何呢?OωO + +本期是一篇有点长的碎碎念,大概就是记录一下,小氯最近对园子进行的一些大修。 + +## 前言 + +这一切的一切,要从一个无风的下午说起。一次偶然的阅读,带来了一次思想的雪崩…… + +好了好了,说人话。其实就是小氯读了一些关于密码学和隐私保护的材料之后,觉得很有必要加固一下自己的隐私保护,同时逐渐将真实身份和互联网的人设解耦合,以减少被人开盒的风险,这样也能使得小氯在写文章的时候能够更加自如地表达自己的观点。那么作为小氯的精神家园,园子显然是要大大优化一番的。 + +当时深陷期中寄的小氯显然没有精力去做这些事,但小氯的期中季已经结束力(喜)。 + +不过吸取[理想乡构筑手记](/series/理想乡构筑手记)的教训,小氯决定把所有事情都包在这一篇文章中讲完。于是有了这篇有点长的碎碎念。不过,可能是因为太久没来写文章了,小氯感觉写得有点费力。就像如果你太久不说话,说起话来就会很费力一样。 + +至于为什么叫 DGP?Data generating process,数据生成过程。也就是统计学的创世纪。 + +## 名字与身份 + +小氯最终还是换掉了这个占位符(乐)。 + +Garden of Outlier,没有中文名字。您也可以和小氯一样,叫它「园子」。为了保留这个用惯了的昵称,小氯也是稍稍费了点脑力的。 + +关于新名字的含义,小氯应该不必多解释了。Outlier,一个统计学名词,字面意为「离群值」,通常指高(低)于第三(一)四分位数一倍半四分位数极差的数据。 + +此外,为了避免被(过于容易地)爆破掉,小氯对园子的内容做了大量的修正,隐去和模糊了自己的真实身份相关的内容。当然,已经知道一些信息的老友,那也就是知道了。小氯也只能拜托您……请只让自己知道好吗?或者干脆忘掉,就把小氯当成不知道从哪个广口瓶里飘出来的元素娘,可以吗(可怜)。 + +这件事本身倒没有费掉多大的精力,只是小氯一直在想一件事:我通过这种方式规避了一些被开盒的风险,但这也意味着,我剥夺了自己谈论背景的能力。我再也不能提起我深爱的母校的名字,再也不能自然地提起我熟悉的地点名称,再也不能光明正大地为我的学士服与博士帽而骄傲。 + +这到底是更自由了,还是更不自由了? + +我不知道。不过小氯可以肯定一点:我希望别人提起我的时候,第一个说的不是「那个 XX 大学的 XXX」,而是「那个文章写得蛮有意思的小氯」。如果只能靠自己的学历宣称来留住老友们的脚步,那小氯这个园子,建得就太失败了。 + +## 再见备案 + +在拥有备案的时间内,小氯没有做任何违法乱纪的事情(那是自然),小氯本身呢,也对备案制度没有任何看法。注销单纯是因为:如无必要,勿增实体。既然这个「合规性证明」对我已经用处不大,小氯也不想着继续为面向大陆的访问而苦恼了,那么为什么我还要留着它呢。 + +大概也就是这样了。从此以后,(如果没有意外)小氯再也不会想着去备案了,对于国内访问的优化也会从「极力优化」调整到「维持基本功能」。Vercel 和 Netlify 这些大善人一时半会应该也还不至于彻底失联,如果出现问题,咱也还有一大堆冷备份呢。 + +如果真的有一天政策继续收紧……好吧,那就麻烦各位老友来园子的时候,将自己的小猫咪带来吧。 + +## 图床更换 + +由于打算换到国外的服务了,[[理想乡构筑手记(3):Hello,Nieve|Nieve]] 自然也得换一下服务栈。正好小氯很久以前就看牢拍这个半死不活的 S3 API 不爽了,干脆全切到 Cloudflare R2 了。拜拜了您嘞。 + +```bash +rclone sync upyun:bucket ~/blogimg +# DGP:重新出发 +rclone sync ~/blogimg r2:bucket +``` + +然后做一次链接全量替换,完美。 + +## 开源与 Codeberg + +小氯在大概今年 2 月把博客开源了。这种做法当然可以说是增加了一种技术化的交流渠道,但更多还是一种姿态或者说是象征意义,一种对开源、共享的支持,以及对透明度的宣誓——你正在访问的小岛,将自己的地图拓印在了世界上的所有地方。这里没有什么暗桩和陷阱,哪怕一个。 + +对于小氯来说,这或许还有一个作用:**分发和存档**。如果您喜欢小氯写的东西,而又碰巧是一个文本化、本地化的爱好者,那么只需要打一个压缩包,就可以获得小氯全部的文章随意把玩(当然,图片还在图床里面,所以暂时没办法实现 100% 的 Archive as a Website)。 + +不过,由于最近园子的大修,小氯把园子暂时闭源了。说得好听一点的原因是:频繁的推送会影响平台的显示,污染提交记录,实际上大概是因为 Git commit 的历史性,容易被人顺着历史记录反查过去,这就白清洗了。 + +正好,小氯也想趁此机会换一下自己博客的源码托管平台,不再使用 GitHub 了。 + +### 吐槽几句 GitHub + +老实说呢,GitHub 并没有给小氯带来什么直接的实质性损害。就小氯写的那些代码,双手送给 Copilot 人家都不一定吃。所以,下面的论述更多地是从一个「局外人」的视角来说的。 + +按照「批判性思维」的要求,我们似乎应该先夸几句 GitHub。这么说吧,在大部分时候的大部分人眼中,「GitHub」几乎就是「Git Forge 平台」的代名词,历史上为开源世界的发展立下了赫赫战功,其现今的开发者数目、关键项目数目、社区规模、生态整合可以吊打剩下所有平台的总和。「天下 Git Forge 共一石,GitHub 独得八斗」,很可能是写实的,虽然小氯也没调查过。 + +好的,夸完了。开喷。 + +首先估计就是从 Gogs 诞生之前一直被提到现在的:GitHub 自己是不开源的。一个托管了宇宙中大半开源项目的平台自己是闭源的,这听起来颇有点黑色幽默。然后大概就不得不提到,GitHub 的谜之操作——GitHub Copilot 了。当初为了这件事,社区里可是闹得沸沸扬扬的。 + +各位老友大概也对牢软拿用户代码训练 AI 这件事不陌生,不用知道很全面的细节,这对我们的讨论帮助不大。最大的面对疾风的问题显然是:使用开源代码训练盈利性 AI 是否违反开源协议。社区的说法大概是:你使用我们的代码去训练模型,结果不给我们分红、没有我们的署名,也不公开训练细节,这显然是违反开源协议的;而微软则辩解称,AI 训练属于统计学习,不属于复制、修改、分发等开源协议涉及行为的范畴,而且 AI 并没有直接把原作者的代码拿过来粘贴,这只能算是 Fair Use。[^1] + +不难看出,此处最重要的问题在于:**用代码训练 AI 属不属于开源协议的管辖范畴**。如果是,那么拿着协议的条款去卡;如果否,那么找其他标准。不过,这其实是个强人所难的问题,因为在开源协议大业草创的时候,生成式人工智能还只是科幻小说中的概念,就像你希望拿着《十二铜表法》去裁决罗诉韦德案一样。而开源协议之外的各国法律,也没有对于「模型训练」这种行为做出什么广泛认可的规定,这使得从法律上判断这件事困难重重,当然也给了律师们很大的发挥空间。 + +既然法律难以给出答复,我们就只好去找点别的东西了。众所周知,(理论中的)法律,实际对应于「正义」的概念。正义,是附有义务和要求的道德,那么我们就去看看一般的道德吧。[^2]或者我们可以换个工具(希望这不是偷换概念或者偷换语境),我们从我们最纯粹的「自然道德观」去想一想这件事。 + +抛开繁文缛节的文字游戏不谈,从直觉上来说,拿代码训练 AI 属于「使用」(此处说的是自然语言的使用,不是法律概念的使用)吗?这是自然,而且是有明显下游产品的使用。 + +那么既然如此,被使用物品的主人,就应当持有一定的权利。比如说,既然是使用,或者至少是借鉴学习,那么你有没有尊重原作者署名权的义务?打个比方,你模仿一位画师的作品画了一些画(甚至拿它们去交稿),你有没有至少是提一句「模仿了 XX 老师的风格」的义务?再比如,如果主人没有明确说明「你可以直接拿去做 XXX」,你在用之前,是不是应该告知物品的主人,我希望使用你的什么物品来做什么,怎么做?如果主人不希望你使用 TA 的物品,你能强行拿来用吗……这么看,GitHub 的做法或许是不违法的,但显然是不道德——不符合自然直觉的。 + +当然,「道德」「直觉」这种概念本身是模糊的,直接拿它们去断案估计行不通。但如果某个判决本身是违反(不论哪种,至少是社会广泛认可的)道德的,那只能说明:法律本身有漏洞,被某些擅长摇唇鼓舌的人钻了空子。此外,AI 开发助手这种东西本身还是挺有用的,虽然说不能指望它产出多么高质量的代码,但是产出「能用」的代码,加快项目的开发,以及辅助学习,这还是游刃有余的。所以,一刀切地要求牢软别训练了也不符合最大效用原则。 + +那怎么办?小氯大概想了三种解决方案,依次退步: + +- 开放 AI 模型的权重(相当于模型的开源),但是提供付费的 Copilot 服务——这很合理,运行 AI 模型是要钱的。 +- 将 AI 模型的收益拿出足够的部分(到底多少算足够,这是另一个问题了),作为开发者的分红,或者用于促进开源社区建设。 +- 明确说明训练的数据集,尊重开发者的署名权和退出权。 + +当然,指望牢软这么做,属实有点鸭子睁眼——Duck 不必(闭)了。估计凭借牢软高超的法务能力,在这场诉讼中不会吃什么亏,但 GitHub 开发者们的信任估计又要消耗一层咯。 + +此处插一句话:小氯想过使用一种特殊的许可证,我们姑且叫它 AGPLv3 with AI restrictions 吧: + +> 基本与 AGPLv3 一致,但是要求:所有希望使用本仓库代码训练的人工智能模型,必须开放权重,但教育和非商业研究目的除外。 + +不过这并不是标准的开源许可证。想让小氯和 OSI 搭上线去问问能不能收编这个许可证,还是有亿点啸难度的。 + +--- + +AI 的问题讲完了,再说说一些和 GitHub 的牢东家微软相关的其他问题。 + +微软的性质大概可以用一句话来概括:美国的科技巨头。你指望它去全心全意地支持开源事业,大概的确有一点痴心妄想了。毕竟微软要是搞开源去了,你让先锋领航、贝莱德和道富的老总们吃什么?此外,既然是牢美的公司,那自然也得接受牢美的管辖。牢美对于开放技术、数据人权之类话题的做法,不用我说大家也清楚(~~Snowden:孩子们,这是真的~~)。加上最近恩情无限的川大统领的一系列抽象操作,牢美这块洞天福地,不能说 Debuff 叠满了吧,至少也不是什么优质的选择。 + +就算不考虑意识形态的问题,可达性和可用性也是一件令人扶额叹息的头疼事。举一个最典型的例子吧:GitHub 在境内的可访问状态本就处于一种奇妙的叠加态,学会访问 GitHub 可谓是每一个初入开源世界的小可爱的必修课。现在的情况似乎还更糟了——根据 [HPCesia](https://blog.hpcesia.com) 老友提供的信息(见[此处](https://github.com/orgs/community/discussions/156515)),前几天 GitHub 似乎还开始主动屏蔽国内 IP 的访问了。小氯没遇到这件事,因此没获得第一手资料。不过根据社区提供的图片中,「Restricted」的描述和 403 的状态码,这应该是 GitHub 官方的锅,不然一般只会显示 Timeout 或者 Reset,或者直接悄悄地弄坏你的 DNS(那自然也不会有 403 了)。 + +嗯……GitHub 的具体动机我们不得而知,但不论从哪个方面说,这可都不是什么积极的信号。这次是暂时屏蔽了未登录用户,下次是不是就是持续屏蔽了?那接下来会不会就是登录用户了呢?再下次会不会就开始大规模关停账户了(比如,使用邮箱作为某种判定条件)呢——当然,这目前还只是带点滑坡谬误味道的假设。不过如果有一天这真的发生了,也别吃惊:牢软又不是没耍过类似的把戏。跨国公司可不是什么超国家的中立实体,俄乌冲突期间不就类似这样嘛(这甚至成了小氯的一篇论文的主题)。 + +此外还有一些其他的为人所诟病之处,比如社区治理问题、项目质量等。这里我们不多说了,小氯只想提一点自己的想法。 + +GitHub 的全部缺点,大概就可以概括为两点:它太大了,背后的人又太贪婪了。它足够大,大到几乎垄断了整个市场——初等的经济学知识告诉我们,在许多场景下,垄断都不是什么好事情。因为它太大了,所以它可以毫无顾忌地不听社区的意见,甚至是毫无顾忌地突破道德底线——反正大不了就是气哭几个理想主义者罢了,你不用有的是人用。而它甚至不可能倒下,因为这意味着大半个现有开源生态的崩塌,「大而不倒」莫过于此。而它背后的无限逐利性,给了这种作恶的能力以应用的动机。说得耸人听闻一点,这是一柄悬在世界头顶的达摩克利斯电锯——它不是剑,不会一次劈下来就完事。不启动则已,只要启动,它就会一点点锯断开源精神的头颅。 + +最后,一点个人原因:小氯很不喜欢章鱼猫这个 logo。 + +### Codeberg + +OK,吐槽完毕。上面的话可以概括成一句: + +> 这 GitHub 小氯是一点也呆不下去了。 + +那么既然 GitHub 没资格作为主仓库了,去哪里好呢? + +答案呼之欲出:Codeberg 老爹,FOSSer 们的准理想国。如果您不清楚 Codeberg 是什么,可以去看小氯之前介绍 Forgejo 的[[Hello,Forgejo|文章]]。 + +小氯闲着没事曾经做过一个两个平台的对比,结果差点给我看乐了。很难不怀疑我们的日耳曼朋友就是逮着牢软的缺点一顿针对。 + +| 对比方面 | GitHub | Codeberg | +| ----- | ---------- | ------------------------- | +| 运营者 | 微软(商业巨头) | Codeberg e.V. (非营利组织) | +| 法律归属 | 美国 | 欧洲(德国) | +| 数据存储 | 全球各地 | 只在德国本地 | +| 数据人权 | 你懂的 | GDPR | +| 项目类型 | 各种各样 | 严格 FOSS | +| 商业化情况 | 本身由商业实体运营 | 完全由社区支持 | +| 付费功能 | 多样 | 无 | +| AI 训练 | 使用代码训练 AI | 明确承诺不使用代码训练 AI(当然它也没这个实力) | +| 社区治理 | 核心团队主导 | 高度民主化 | +| 复杂程度 | 较为复杂(个人感觉) | 极简化,功能全面 | + +浓缩成一句话:信仰纯粹 + 功能全面。我们拎一个对照过来吧:[SourceHut](https://sr.ht)。确实很纯净,原汁原味的原教旨 Git 体验。但缺点也很明显:**太难用了**。想在网页新建一个 Issue?回去学 `git send-mail` 去。代码概览,Linguist,热力图这些功能?想都别想。对于原教旨的 Unixer 来说估计是单厨狂喜,剩下的用户可能只能不明就里。毕竟,世界不是只有原教旨主义者的。SourceHut 会成为一个很好很好的开放 Git Forge 平台,但如果是带领开源世界冲击 GitHub 的王座,那小氯还是会把仓加在 Codeberg 上。 + +此外,关于 Codeberg 是否可能被拒之门外的问题,答案自然是有可能的,但目前来说可能性不太大——听我说。GitHub 上面托管的项目,除了「用 Git」之外,几乎没有任何的共同点,从字面意义上的开源项目到分发二进制包的非开源仓库,最重要的……还有一些不可描述的小项目,某个喜欢吃数据包的萌娘可不会喜欢这些东西;而 Codeberg,上面全都是严格意义上的 FOSS,除了开发之外,基本就没有什么其他的内容了——至少在小氯的认知里是这样的。只谈代码和「技术自由」的理想主义者,可能是最不值得大动干戈的一批人之一了。 + +当然了,Codeberg 缺点也是很多的。最显著的一点:要拿现在的 Codeberg 和 GitHub 比规模和生态,不能说是蚍蜉撼树吧,至少也可以说是草履虫打霸王龙(通言通语 1/1)。现在 Codeberg 上有影响力的开源项目和领袖开发者还是太少了,同时几乎没有任何可对接的生态(从下面小氯倒腾的部署可以大概看出来)。不过小氯对 Codeberg 很有信心:只要社区的维护者们不失本心(小氯相信这一点),那么 Codeberg 的蓬勃发展就是不可阻挡的。 + +至于为什么叫「老爹」?大概是来自于 Бáтько Махно́(马赫诺老爹)吧。 + +### 小氯的考虑 + +说实话,从技术实践的角度来说,小氯的这波操作基本上属于反向优化。背后的驱动原因,有且只有对 FOSS 和开放共享内容的支持,或者我们也可以叫「信仰」和「意识形态」一类的东西。 + +作为行动上的实用主义者,小氯一向讨厌拿这些标准毫无底线地去卡任何事。但只要想到一句话,小氯就开始对 GitHub 心神不宁: + +> 你愿意让你的文字活在一座逐渐下沉的天空之城吗? + +不行,绝对不行。我可以说服自己这样做,但我的文章不行。 + +从开始写博客时,小氯就一直采用着 CC 系协议。园子里的植物,老友们随意采撷便好,无论是收集些玫瑰花瓣回去泡茶,还是摘一捧桂花用来做甜甜的酒酿,还是带一盆多肉植物回去摆在案头。小氯乐意见到自己的花草被心意相通的老友们喜欢,也乐意看到它们随着洋流或者数据流旅行向其他的小岛,为那处的人们带来一点视觉、味觉或者心理上的满足。 + +它们是我用日光、热茶和位流种下的生命,如今以最简单和纯粹的形式返还给世界。它们是我在此地的生活、记忆、悲欢的全部。你可以把刺刀扎进我的心脏,但你不能踩踏我的花草。 + +……抱歉,小氯太激动了。相比 GitHub,Codeberg 在自由、开放方面显然更能取得我的信任,这也和园子的基本价值观和长久发展战略吻合。这也就是我在「 [如今](/now) 」页面说的: + +> 自由的文字,理应生长于自由的土壤。 + +除了博客之外,小氯也逐渐在把其他的一些开发活动转移到 Codeberg。至于生态?小氯不管,我在哪看代码和在哪写代码是两回事。传播度?您看这只元素娘搓的小小项目像是能有传播度的样子吗?园子本身也就是这样一个小小的、无人问津的角落,难道指望 GitHub 给我带来什么流量?反过来还差不多。 + +那过往的积累呢?小氯自然也不在乎。反正咱还只是个寂寂无名的开发小白,去哪里不一样呢?一无所有,才不会积重难返。那十几个星星或者四十几个 follower,比得过「追随我心」的含金量吗(别误会,小氯真的很感谢那些为我点 Star 或者 Follow 的老友,你们为我单调的生活带来了难以言说的惊喜)?如果小氯真的被这一点成绩拴住了,那也太对不起小氯曾经说过的那句话了: + +> 如果荣誉和地位会让我不快乐,让我失去我最爱的人和事物,甚至让我讨厌自己,那么万钟于我何加焉? + +小氯甚至想过更极端的方案:把博客的源码放到自托管的 Forgejo 上。反正将来肯定是要有这么一个自己的实例的,权当是提前积攒威望了。这个主意其实非常可行,因为相比于对联邦功能要求很高的其他项目来说,博客更接近一个「只读开源」的属性。很适合住在现在联邦功能尚未完善的 Forgejo。 + +……嗯,写一篇时间跨度比较长的文章,坏处就在这里了——你需要频繁地更新你的草稿。在一个有点冲动的下午,小氯直接搭好了自己的 Forgejo 实例,名字叫 MoeForge,其实界面还并不萌,主要因为用了 `foss.moe` 这个域名嘛。于是园子的源码也出现在了 MoeForge 上面一份,也就是[这里](https://foss.moe/chlorine/blog)。 + +MoeForge 小氯肯定是会长期运营的,不过这个开始显然是草率了一点。先看看情况如何,大不了删库重来(不是)。 + +--- + +不过,话说回来:虽然我们夸了这么多 Codeberg,但如果只是嘴上说着「支持非营利组织」「开源万岁」之类的话,虽然没错,但也仅限于此。毕竟,Kind words don't pay the bills,柏林的电力系统可不会因为他们在进行一项高尚的事业就免去他们服务器的电费。所以小氯也在 Liberapay 上给 Codeberg 做了一点点周期捐款,虽然量很少,但也是小氯的一点心意吧。 + +至于资金来源?嗯,奖学金,或许还有当牢助教的工资(如果有的话。之前似乎给我发邮件来着,我原本以为本科生当 TA 是没工资的)。这点钱不多,但是表达一下善意和支持显然够了。 + +放一下小氯的 [Liberapay 账户](https://liberapay.com/chlorine/)捐赠记录,证明小氯没说谎。此外,Stripe 是真坑啊,收了我好大一笔手续费(指相对大小)。 + +## 部署 + +如各位所见,小氯的园子一直跑在 Vercel 上。Vercel 也是一家公司,不过也算是位互联网善人。加之 Vercel 的优选线路的国内速度还可以,小氯也没想着切换。 + +不过既然把主要平台换到 Codeberg 了,那么对于部署的 Workflow 也得重新考虑一下。 + +### Vercel CLI + +这大概是最简单、最优雅的方法了。毕竟无论什么静态网站,本质上都是构建之后的一包文件而已,直接用 CLI 丢上去就好。而且,咱们的电脑再不济,性能应该也不至于不如 Vercel 免费计划构建分配的 0.6 个 vCPU,构建速度的提升可以说是肉眼可见的。 + +这个方案的优点很多,只有一个小缺憾,就是完全没法用。 + +嗯。小氯永远登录不上 Vercel CLI,每次会卡在同一步,并且找不到任何解决方案。大概是网络环境的问题,具体一点大概是在发送部署命令的时候,这一步没有尊重系统代理设置。目前已经把 issue 提给 Vercel 官方了,等待回应。 + +### 继续使用 GitHub + +别笑,这是个方法,而且可能是最省心的方法之一。Git 可以用很多个 Remote,只需要在推送的时候同时推到一个 GitHub 镜像仓库。然后使用正常的方法部署就可以。 + +鉴于小氯前面说了这这么多 GitHub 的坏话,此处明显有既要又要,「背叛革命」的嫌疑。所以容小氯狡辩一下。 + +一个事实是:**现在完全抛弃 GitHub 是不现实的**。毕竟,那是世界上最大的开源平台,上亿个项目和十多年塑造的庞大社区和完善生态。即使是最激进的 Codeberg 和 Forgejo 支持者,估计也只能想想在几年之内取代或者撼动 GitLab 在自托管界的地位。要是说想在可预见未来内干翻 GitHub,虽然也不是绝对不可能,但难度大概相当于托洛茨基希望几年之内建成全球社会主义。我们将来面临的形势,很可能会像未来的国际局势一样,是多极化的。GitHub 再衰弱,也必然会保留下庞大的用户群体和生态,难道我们要把这些项目和开发者逐出开源世界吗?至于小氯自己,也只是把「主要的开发活动」迁移到 Codeberg 了(这还是在上面所说。小氯几乎没什么项目,可以随意走动的情况下),并没有把 GitHub 完全注销掉。 + +而且,虽然说咱们对牢软都有意见,但是资源就摆在那里。老实说,GitHub 提供的资源还是相当慷慨的,也算是半个互联网善人了(从功利主义的角度,君子论迹不论心)。对于咱们这样的普通用户和开发者,「批判性使用」应该是最好的方法了,或者我们换一个更容易懂的说法:羊毛不薅白不薅,薅了不白薅。用大公司的资源不丢人,咱们不用 GitHub Actions 的服务器去构建项目,难道让那些服务器去给老总们挖矿吗?陕甘宁边区的游击队不是也用着缴获敌人的武器嘛,更何况 GitHub 目前还没有到要被定性为「敌人」的程度,只能说是「革命立场不坚定的资产阶级合作者」。 + +此外,还有一点:质变是不可能在毫无准备的情况下瞬时发生的。如果您看了或者听了什么之后,GitHub 在您心目中就立即从开源社区的高标变成了人人得而诛之的贼人,那要么是您之前对 GitHub 有什么误解,要么就是您得到的说法或者您的解读存在严重的非理性。 + +### Netlify CLI + +话虽如此,但小氯总得做出点什么东西来,不然有水文章的嫌疑——你讲了这么一大堆,结果说到底还是在用 GitHub? + +好的。众所周知,在小规模的 Serverless 项目中,Vercel 和 Netlify 几乎可以互换。相对来说,Netlify CLI 对于国内的支持甚至更好。不过论速度,Vercel 的优选线路似乎比 Netlify 优选快。但一如小氯上面说的,我不会再费心去优化国内速度了。 + +那如果 Vercel 不行,Netlify 行不行呢? + +小氯捣鼓了一个多小时后得出的结论是:**真的可以**。下面请欣赏小氯酱的表演。 + +#### 前置 + +Netlify 支持的 Git 集成只有 GitHub、GitLab、Bitbucket 和 Azure DevOps。倒是有一个 Self-hosted Git 的选项,但咱自然是不会为了这东西付钱的(甚至需要企业计划)。不过在 Netlify 的 CLI 里面其实有个隐藏彩蛋——从 CLI 部署的时候,连接 Git repo 时并不会检查到底是哪一家的。我们可以从这里入手。 + +我们来仔细思考一下,Vercel 和 Netlify 的持续部署到底是怎么实现的。直观来说,大概就是三个步骤:收到更新信号,拉取 Git 仓库,然后执行部署。那我们只需要把原本自动化的前两步变成可配置的就好了。 + +#### 创建 Netlify 项目 + +首先在 Netlify 的界面,创建一个空项目。方式选手动上传就行,传一个只有一个 `index.html` 的文件夹,`index.html` 随便写点东西就可以,后面我们就用不到了。 + +然后,在环境变量一栏,创建一个环境变量 `HUGO_VERSION`,内容是你希望使用的 Hugo 版本号。这一步一定要做,不然 Netlify 识别不出来这是个 Hugo 项目,后续构建会报错。 + +#### 本地连接项目 + +首先全局安装一下 Netlify 的 CLI,小氯用的是 Bun,你用 npm/pnpm/yarn 之类的都可以。 + +```bash +bun install -g netlify-cli +``` + +然后检测一下是否安装成功了,如果没有的话可能是环境变量没配好。 + +```bash +netlify version +``` + +然后打开全局代理模式(这样是为了防止奇奇怪怪的问题),进入你的项目,执行: + +```bash +netlify login +``` + +登录会比较耗时,也有失败的可能,还请各位老友有些耐心。 + +登录之后,执行: + +```bash +netlify init +``` + +等大概十五秒到半分钟(取决于网络情况),在选择中选择「连接到已有站点」,方式选择「查看最近更新的站点」,然后选择你刚刚创建的空白站点。 + +然后在构建命令那里输入你的命令,例如小氯的命令比较复杂,是: + +```bash +hugo --gc --minify && bun install && (bun run shiki || true) +``` + +一般的 Hugo 博客使用 `hugo --gc --minify` 就差不多了。 + +目录直接默认的 `public` 即可。下面是重头戏,就是如何连接到 Codeberg。 + +当 Netlify 提示你 Remote 地址的时候,看看是否是你仓库的地址,然后它会给你一串 SSH 密钥。把密钥复制好,进入 Codeberg 的仓库界面,点击设置——部署密钥——添加部署密钥,把复制的密钥粘进去,名字随便起。 + +> [!WARNING] +> 不要勾选「授予写权限」,这样会使得 Netlify 可以任意更改你的仓库,这可不是什么安全的事情。 + +然后回到终端,点击继续。 + +接下来会给你一个 Webhook 的 URL,格式大概是 `https://api.netlify.com/hooks/xxx`。复制下来,回到 Codeberg 网页界面,点击设置——Web 钩子(也就是 Webhook,这翻译有点难绷)——添加 Web 钩子,类型选择 Forgejo 即可(是的,你没听错,类型选择 Forgejo)。具体配置没什么可以说的,把你的 URL 粘到「目标 URL」处,然后余下的什么都不用动:无须鉴权,请求体空的就可以,如果你想调分支,请自便。 + +回到终端,继续。这个时候 Netlify 会提示你配置完成。再回去看看你的 Netlify,不出意外的话,第一次部署已经开始了。以后就可以像使用 GitHub 时那样了。我们只需要 git push 就好了,而 Codeberg 和 Netlify 要考虑的就多了(鸣式 1/1)。 + +完工。从此以后,园子和 GitHub 断绝关系 ~(∠・ω< )⌒☆​ + +### Codeberg Pages + +GitHub 有 GitHub Pages,Codeberg 也有自己的 Codeberg Pages。小氯没用过,但推测速度八成是中等,毕竟你也不能指望全栈位于德国境内的服务器的全球速度有多快。希望 All in Codeberg 的老友可以试一下。 + +### 其他平台 + +小氯没有试过其他平台能否和 Codeberg 联动,欢迎补充 (/ω\) + +## Hello,Artalk + +很好,Residencia 0x001B 又多了一位使用 Artalk 的居民(喜)。 + +### Why + +~~我能说是我闲得慌吗~~ + +世界上开源的第三方评论系统很多,但小氯坚定地认为:如果你希望 Serverless,那么选择 Twikoo;如果可以接受 Serverful,那么选择 Artalk。它们可以说是各自领域最优秀的代表。 + +从园子建立开始,使用的就是 Twikoo。迄今为止除了由于小氯的铸币操作被迫重建了几次之外,没有出过大问题,MongoDB 也一直运行正常,没有丢过数据。小氯自己也对 Twikoo 做了不少自定义,不论是暴力去掉 `href="#"` 来避免在 Efímero 主题中的滚动问题,还是胡乱自定义 Twikoo 的样式文件来适配主题风格。 + +不过 Twikoo 虽然好,但也有一些让我感到很无语的缺点。比如,修改数据极其麻烦,MongoDB Atlas 的后台是一点也不拟人;评论的速度很慢,往往需要等好几秒才能显示。此外,有时候看着[杜老师](https://dusays.com)和[清扬老友](https://www.liushen.fun)的评论区丰富的自定义徽章属实是很想要。 + +恰好最近,[HPCesia](https://blog.hpcesia.com) 老友把自己的评论系统换成了 Artalk,终于把摇摆不定的小氯往 Artalk 的方向推了一下。反正现在服务器已经不再是问题了,那么也不妨来试一下新玩具嘛。 + +### 部署和迁移 + +部署其实没什么可说的。遵照[官方的指示](https://artalk.js.org/zh/guide/deploy.html#docker-compose),Compose 一把梭就完事。由于 Artalk 使用的是~~高贵的~~ Golang,因此资源占用很小,大概只有 30 M。 + +迁移的话,在 Twikoo 的前端面板把 JSON 文件导出来,稍微按照你的意愿修一修,转成 Artalk 兼容格式,导进去就可以了。 + +### CSS 定制 + +说实话,Artalk 的默认样式比 Twikoo 好看很多,基本上也和园子的世界风格比较搭,所以写个一百多行的代码小小地定制一下就完事了。源码请在小氯的主题仓库[自取](https://codeberg.org/chlorine/hugo-theme-hermeneutics/src/branch/main/assets/css/components/article/comments/artalk.css)。 + +### 邮件模板配置 + +这里小氯遇到了一个令人百思不得其解的报错: + +```log +2025/04/22 20:48:15.928 ERROR [email/sender_smtp.go:30] [Email] Email sending failed via SMTP gomail: could not send email 1: 450 Missing `html` or `text` field. +``` + +「Missing `html` or `text` field」?难道是 DOCTYPE 声明的问题吗?事实证明显然不是。 + +切到 default 看一下……正常的。那看来问题出在小氯的模板上。 + +对比一下官方模板和小氯的模板,可以看出结构区别相当明显。具体来说,官方模板是一个……嗯,组织没那么美观的 HTML 片段,而小氯的模板是一个完整的 HTML 文件。 + +难道是 Artalk 不能识别完整的 HTML 吗?虽然直觉告诉小氯 Artalk 不可能那么杂鱼,但小氯还是反复试了去掉声明、去掉 Header、样式内联、只留下 Body、只留下一层 Div 等方法,结果不能说是硕果累累吧,至少也可以说是一无所获。 + +折腾了许久之后小氯有点累了,就试着把官方的模板粘了过去。结果……还是报错? + +我发现了华点。 + +那看来,问题根本不出在模板上,而是 Artalk 读取的问题。那么最可能的就是路径有问题了。难道是 Artalk 没读到小氯的模板吗? + +小氯的第一想法是 Artalk 没有权限访问小氯的 `~/projects/artalk/templates` ——你这个笨蛋啊,你怎么不想想 Docker 是以什么用户的身份运行的?然后创建了一个 `/opt/artalk`,结果自然是没有结果。 + +一筹莫展之际小氯看到了这个 [comment](https://github.com/ArtalkJS/Artalk/discussions/329#discussion-4657455),哦,原来需要把模板放在容器的数据卷里面,使用相对于容器根目录的路径,例如 `/data/xxx`。 + +问题解决。 + +想想似乎也挺合理,毕竟要是容器能访问数据卷之外的文件,那岂不是翻天了…… + +[这里](https://gist.foss.moe/chlorine/artalk-tpl)是小氯的邮件模板,请自取~ + +### 表情包配置 + +Artalk 也可以使用 owo 格式的表情包,但和 Twikoo 有一点差别。具体来说,Twikoo 的表情文件长这样: + +```json +{ + "series_1": { + "type": "image", + "container": [ + { + "icon": "", + "text": "alt" + }, + // ... + ] + }, + // ... +} +``` + +而 Artalk 的长这样: + +```json +[ + { + "name": "series_1", + "type": "image", + "items": [ + { + "key": "alt", + "val": "https://owo.domain.tld/image.webp" + }, + ] + }, + // ... +] +``` + +还是需要一点点的转换工作的。此外,Artalk 支持直接引用外部的 JSON 文件作为其一部分。模块化编程嘛,小氯喜欢这样。 + +表情包图片呢,也趁机换到了国际平台托管,依然是带善人 Cloudflare 的 R2。速度其实也并不比原本的 EdgeOne Pages 慢太多。 + +### Bonus + +目前的 Artalk 还只有小氯自己的 Badge。如果有希望 Badge 的老友,请尽管留言或者发邮件,注意注明喜欢的文字和颜色,过时不候哦 OωO + +## 后记 + +主要的更改,大概也就是这些了。如果说很多呢,这么讲一讲也就是讲完了;说不多,又确实是把园子的技术栈几乎掀了个底朝天。 + +说到底的目的,大概也就是如开头所述,隐私保护方面的考虑,以及希望自己能够有一片更加自如的精神家园吧。 + +这样的举措大概还是有效果的,只不过可能不是很大罢了。不过无论如何,我们都要有一些「从头开始」的勇气,不是吗? + +最后……这里是一封邀请函,某只元素娘希望请您去它的园子里坐一坐,喝杯茶,顺便重新走一遍这片原教旨主义的知识旷野。 + +我们在洒满阳光的桌前读书,在小径分叉的花园漫步,在草木葳蕤的原野驻足。 + +在暴风眼中享受世界的宁静,每一缕被雨水打湿的发丝,都浸满最耀眼的光辉。 + +[^1]: Fair Use,合理使用。美国版权法规定批评、评论、新闻报道、教学、学术研究等可不经授权使用版权材料。 + +[^2]: 关于这个观点的细节,请阅读穆勒《功利主义》的第五章。 \ No newline at end of file diff --git a/content/posts/百草园/Hugo博客link更改后如何修改Twikoo评论位置.md b/content/posts/百草园/Hugo博客link更改后如何修改Twikoo评论位置.md new file mode 100755 index 0000000..a01f6e4 --- /dev/null +++ b/content/posts/百草园/Hugo博客link更改后如何修改Twikoo评论位置.md @@ -0,0 +1,84 @@ +--- +title: Hugo博客link更改后如何修改Twikoo评论位置 +date: 2024-02-21T10:29:40 +categories: ["百草园"] +tags: + - Twikoo + - Hugo + - 折腾 +slug: link-modifying-of-twikoo +summary: 数据库可爱捏 +description: 本文介绍了如何在更改 Hugo 博客的文章链接后,更新 Twikoo 评论系统以匹配新的链接。文章首先说明了更改链接的必要性和方法,然后详细描述了如何通过 MongoDB CLI 工具导出、修改并重新导入 Twikoo 的评论数据,以确保评论能够正确地与文章关联。作者提供了具体的步骤,包括获取 MongoDB URI、下载并使用 MongoDB CLI 工具进行数据操作。最后,文章还给出了参考资料,供读者进一步了解相关操作。 +--- + +各位老友们好,我是 Chlorine。 + +本期是一个小事情,就是在 Hugo 博客文章的 link 被修改之后,如何使 Twikoo 评论也跟到正确的位置。 + +不仅是 Hugo,任何使用 Twikoo 的静态博客都适用这个方法。 + +## 前言 + +我的博客之前的链接大致都是 `/posts/`,感觉加一个 `posts` 属实是有点多余。这个好办,改一下 `config.toml` 就好。 + +```toml +[permalinks] + # posts = "/posts/:slug/" 这是改之前 + posts = "/:slug/" +``` + +但是再上网站上一看,Twikoo 面板里的评论还在,然而点击查看是 404. + +短暂懵了一下后,联想到我从 NotionNext 换到 Hugo 的时候,明明没有做任何迁移,我的 now 页面的评论却还在,我瞬间想到了一种可能: + +> Twikoo 后台的数据是按照文章链接进行对应的,只要链接不变,文章的评论就在,否则就找不到。 + +那只要能修改 Twikoo 后台的数据,就可以完成迁移了。 + +## 获取 MongoDB URI + +去 Vercel 里找到你的项目,在项目设置-环境变量中找到 `MONGODB_URI` 把值复制下来备用,它应该具有这样的形式: + +```txt +mongodb+srv://<某些字符>:<某些字符>@<某些字符>.mongodb.net/<后面的东西> +``` + +把 `net/` 后面带问号的那一堆删了,我们用不着。 + +## 下载 MongoDB CLI + +Twikoo 的背后是 MongoDB 数据库。我对操控数据库一窍不通,所幸官方提供了可以操控数据库的 CLI 套件。 + +由于在 macOS 上尝试之后遇到了不可名状的错误,因此我启动了我的 Windows 备用机(所以,真心推荐每一个喜欢 macOS 的老友准备一台备用机,指不定什么时候能救命 =w=)。 + +在[这里](https://www.mongodb.com/try/download/database-tools)下载相应套件,直接解压就好。 + +然后进入解压后的文件夹,找到 `bin` 子文件夹,点进去,会发现一堆二进制文件。 + +右键-更多-打开终端,把这段命令粘进去(注意,URI 是没有尖括号包裹的,用尖括号只是表示变量的习惯 🤣) + +```bash +./mongoexport --uri <你的URI> --collection comment --type json --out twikoo-comments.json +``` + +> **瘟锌锑逝** +> 有些教程不会带前面的 `./`,但是由于我们没有配环境变量,这样会报错。所以我们直接加 `./`,方便。 + +回车执行。一切顺利的话,你应该可以在 `bin` 文件夹下看到 `twikoo_comments.json` 文件。 + +打开这个文件,就可以进行修改了。由于我的需求比较简单,因此使用 VS Code 的查找替换功能,两步就完成了:将 `` 替换为空,将 `bulid` 替换为 `build`。如果需求比较复杂,可能需要结合正则表达式进行食用。 + +改完之后保存,执行这段代码: + +```bash +./mongoimport --uri "<你的URI>" --collection comment --type json --mode merge --file twikoo-comments.json +``` + +就可以覆盖原本的数据。 + +将来,如果更改域名或者别的链接修改,都可以照葫芦画瓢地使用。 + +参考资料: + +1. [静态博客永久链接变更后修改twikoo评论地址 | AppSnitch (readfere.com)](https://www.readfere.com/twikoo_url_modified) +2. [Twikoo 评论数据导出教程 - iMaeGoo's Blog](https://www.imaegoo.com/2022/twikoo-data-export/) diff --git a/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(1).md b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(1).md new file mode 100644 index 0000000..e629407 --- /dev/null +++ b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(1).md @@ -0,0 +1,46 @@ +--- +title: Hugo博客迁移日志(1) +date: 2024-06-29 +summary: 关于为什么又双叒叕搬家的一些狡辩(划掉)解释 +description: 本文介绍了作者关于从 NotionNext 再一次迁移到 Hugo 的一些原因的叙述,主要原因是喜欢 Hugo Landscape 主题的外观和构建速度。 +categories: ["百草园"] +series: Hugo博客迁移日志 +tags: + - 博客 + - Hugo + - Efímero + - 折腾 +featuredImage: https://img.viento.cc/cover/migrating-to-hugo-1-cover.webp +draft: false +slug: migrating-to-hugo-1 +--- + +芜湖,各位老友们好,我是 Chlorine。几天不见,我又回来水文章了。 + +本期开一个新坑,主要讲我从 NotionNext 又回到 Hugo 的原因。 + +## 前言——从 Fuwari 讲起 + +行吧,我也不废话了,就是因为颜值。 + +NotionNext 当然好看,尤其是 Hexo 和 Heo 主题。但是,有一天我在 GitHub 上闲逛的时候,偶然发现了这个框架: + +{{< github repo="saicaca/fuwari" >}} + +当时我的反应就是:**惊为天人**。 + +这世界上怎么会有这么丝滑的博客框架啊! + +于是我可耻地动心了。不过可惜,Fuwari 基于 Astro,但是我对 Astro 一窍不通。于是我就没继续,转而继续折腾我的 Hugo Blowfish。 + +可就在我的 Blowfish 即将大功告成之际,我发现,[恐咖兵糖](https://www.ftls.xyz/)大佬居然已经写了一个类 Fuwari 的 Hugo 主题,名为 Landscape。 + +{{< github repo="kkbt0/Hugo-Landscape" >}} + +好的,我是小丑。 + +但是 Blowfish 折腾了这么久,扔是不可能的。于是,我开启了漫长的魔改之路。最终兜兜转转,可算是有了个雏形。由于自我感觉添加了不少元素,因此厚颜无耻地将之作为了一个新的主题,取名 Efímero,中文名「浮光」。 + +总体而言,浮光不算一个很沉的主题,构建时间大概十几秒。虽说比不过 Virgo 的不超过 10s,但是比 NotionNext 的将近一分半还是强多了。 + +本篇比较短,主要是讲一讲前言。明天在高铁上更具体经过(的第一篇)。 diff --git a/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(2).md b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(2).md new file mode 100644 index 0000000..7c7369d --- /dev/null +++ b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(2).md @@ -0,0 +1,539 @@ +--- +title: Hugo博客迁移日志(2) +date: 2024-06-29T21:30:00+08:00 +summary: 真·迁移日志(1) +description: 本文介绍了作者对于从NotionNext迁移到Hugo的具体过程的简要叙述,包含对项目的总览、友链页面的构建、说说页面的构建等 +categories: ["百草园"] +series: Hugo博客迁移日志 +tags: + - 博客 + - Hugo + - 浮光 + - 折腾 +featuredImage: https://img.viento.cc/cover/migrating-to-hugo-2-cover.webp +draft: false +slug: migrating-to-hugo-2 +--- + +芜湖,各位老友们好啊,我是 Chlorine。接着上一回,咱们开始讲我从 NotionNext 迁移到 Hugo 的旅程。 + +## 项目整体结构 + +Hugo Landscape 的项目结构没有什么佶屈聱牙的地方,很正常的 Hugo 主题结构……除了 `layouts` 下面有一个单独的 `posts/single.html`?我也不知道这个算不算特别。 + +这个主题最经典的地方在于:**它使用的是 UnoCSS**。啥是 UnoCSS?行吧我也不是很懂,似乎就是一个高度原子化、依赖于 HTML 对象的 CSS。反正挺 OOP 的。 + +那就先安装个 UnoCSS 吧。直接在主题文件夹下: + +```bash +npm install +``` + +完事。就安装好了一大堆依赖。 + +*其实我一开始的时候没有做这个,后续我会讲具体经过。* + +为了后续开发方便,我使用 OOP 课程的知识,写了个简单的 Makefile: + +```makefile +# 默认目标 +all: theme hugo + +# Hugo构建 +hugo: +hugo server -D + +# 主题构建 +theme: +cd themes/efimero && npm run build && cd ../.. + +# 清理构建文件 +clean: +rm -rf public +rm -rf resources/_gen +cd themes/efimero && rm -rf node_modules +cd ../.. + +# 帮助信息 +help: +@echo "可用的make目标:" +@echo " all: 默认目标,构建 Hugo 和主题" +@echo " hugo: 构建 Hugo" +@echo " theme: 构建主题" +``` + +这样每次更新功能要预览的时候,直接 `make` 就完事了。 + +## 友链页面 + +没错,在不细品项目的情况下,直接开冲,主打一个勇。 + +~~就算是品了我也品不懂,毕竟我对前端一窍不通。~~ + +友链页面是我的必需品。还是老办法,用一个 `JSON` 文件存储信息,放在 `主题/static/jsons/friends.json`。格式大概是: + +```json +{ + "name": "名字", + "note": "注释", + "url": "网址", + "md5": "邮箱的 MD5 值,用来从 Cravatar 获取头像", + "des": "描述/签名", + "ava": "/avatars/头像.webp,在没有 MD5 的情况下用这个" +} +``` + +然后搬出我的祖传 shortcode: + +```html +{{ $friends := getJSON "themes/efimero/static/jsons/friends.json" }} + +``` + +既然是换新主题了,肯定得写个好看的样式。`主题/assets/css` 下新建一个 `addon.css`,扔进去: + +```css +.friend-link-container { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.friend-link { + width: calc(50% - 10px); + border: 1px solid #ccc; + border-radius: 10px; + margin-bottom: 20px; + display: flex; + align-items: center; + padding: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + height: auto; + max-height: 150px; + background-size: cover; + background-position: center; +} + +@media screen and (max-width: 768px) { + .friend-link { + width: 100%; + } +} + +.friend-link-avatar { + width: 70px; + height: 70px; + border-radius: 50%; + margin-right: 10px; +} + +.friend-link-content { + display: flex; + flex-direction: column; +} + +.friend-link-content h3 { + margin: 0; + padding: 0; + font-size: 20px; + color: #333; +} + +.friend-link-content p { + margin: 0; + padding: 0; + font-size: 16px; + color: #666; + word-wrap: break-word; +} +``` + +当然,不能忘了包含这个 CSS。Landscape 采用的是 `css.html` 专门包含 CSS,嗯,我很喜欢。 + +最终出来的效果还是很好看的,详见我的友链页面。哦,别忘了新建一个 Markdown 文件,包含这个短代码。 + +## 说说 + +关于怎么搞说说,我属实是折腾了 N 多天,最终还是靠着[恐咖兵糖](https://www.ftls.xyz/)大佬的方案,经过一顿折腾之后得到的还算满意的 solution。 + +首先,让我们科普一个概念:**联邦宇宙**。 + +搬运 Wiki: + +> 联邦宇宙(英语:Fediverse,简称Fedi)在英文中是“联邦”(Federation)和“宇宙”(Universe)的混成词。联邦宇宙由一系列自由软件组成,有一组互联的服务器(用户自建或第三方托管),一起提供网络发布(如社交媒体、微博、博客或者网站)或者文件托管功能。虽然各个服务器是独立运行的,且各个实例繁多,内容多样, 但服务器之间可以彼此互通。在不同的服务器(实例)上,用户可以创建不同帐号。这些帐号能够跨越实例边界而通信,因为服务器上运行的软件支持一种或多种遵循开放标准的通信协议。 用户通过联邦宇宙中的帐号,可以发布文本或者其他媒体文件,也可以关注其他用户。在某些情况下,用户可以公布或分享数据(如音频、视频、文本文件等),使其对所有或部分人开放并允许他们共同编辑内容(例如日历和黄页)。 +> +> 联邦宇宙的目的是建立在网络社交巨头公司之外, 提供另一种交流方式。与在单一服务器上运行的传统社交网络相比,联邦宇宙的运行方式更开放。 其服务器的分散性,使联邦宇宙更安全可靠。 + +简单来说,就是一系列去中心化(准确来说应该算是联邦化或者多中心化)的自由软件组成的庞大社交网络。我对去中心化网络非常感兴趣,后续如果系统学习,会把心得分享出来(`画大饼.webp`)。 + +联邦宇宙主要由四大通讯协议支持: + +- ActivityPub +- Diaspora Network +- OStatus +- Zot & Zot/6 + +我们要用的是第一个。ActivityPub 协议的代表软件是 [Mastodon](https://mastodon.social/)(中文名:长毛象/乳齿象),简单来说就是联邦宇宙的 Twitter(𝕏)。Mastodon 虽然成熟,但是比较笨重,不利于自托管(虽然说咱们也不用自托管就是了),而且国内可用的实例比较少。所以,我们选择 ActivityPub 协议的另外一个实践者—— [GoToSocial](https://gotosocial.org/)。 + +GoToSocial 不多介绍。直接上解决方案: + +1. 注册一个国内的 GTS 实例,例如我用的 [https://scg.owu.one](https://scg.owu.one)。 +2. 获取鉴权 Token,直接在[这里](https://takahashim.github.io/mastodon-access-token/)操作即可。 + +好的,下面开始爆改。具体的操作步骤等我专门写一个说明文档(或许是主题的说明文档?)。 + +上一个 shortcode: + +```html + + + +
+
+
+
+ + +
+ + + + +``` + +在站点配置 TOML 中加入相关数据: + +```toml +# 联邦宇宙的说说参数 +[params.whisper] + instance = "你的实例名称" + user_id = "你的 ID" + bot_token = "你的 Token" +``` + +开一个 Markdown,加入短代码,完事。 + +别看我现在说得轻巧,当初折腾的时候不知道费了多少劲。 + +今天先说这两个,剩下的明天再说。 diff --git a/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(3).md b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(3).md new file mode 100644 index 0000000..71ae0b6 --- /dev/null +++ b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(3).md @@ -0,0 +1,71 @@ +--- +title: Hugo博客迁移日志(3) +date: 2024-06-30 +summary: 真·迁移日志(2) +description: 作者对于从NotionNext迁移到Hugo的具体过程的简要叙述,包含GitHub、GitLab、Codeberg短代码的构建与Callout块的处理。 +categories: ["百草园"] +series: Hugo博客迁移日志 +tags: + - 博客 + - Hugo + - 浮光 + - 折腾 +slug: migrating-to-hugo-3 +featuredImage: https://img.viento.cc/cover/migrating-to-hugo-3-cover.webp +draft: false +--- + +芜湖,各位老友们好啊,我是 Chlorine。接着上一回,继续为您说。 + +## GitHub/GitLab/Codeberg 短代码 + +Blowfish 有一个很好的短代码,就是 GitHub/GitLab/Codeberg 项目卡片。本着拿来主义的原则,直接拿过来。 + +Blowfish 的短代码需要使用 icon 短代码和 SVG 图标,但是我表示根本不需要。用 carbon icons 就可以。 + +大手一挥改完,然后加载本地服务器…… + +不是,我图标呢?! + +连夜查了一下,中间也不知道怎么改的,反正折腾了半天,可算是搞出来了。 + +然后……怎么 403 了? + +再去查。哦,这个短代码用的 GitHub API 获取信息,而匿名的 API 有调用限制。所以如果有高频的调用需求,可能需要去 GitHub 申请个 API,反正不花钱。 + +最终效果如下: + +{{< github repo="kkbt0/Hugo-Landscape" >}} + +GitLab 和 Codeberg 也差不多。 + +## Callout 块 + +Callout 块是一个很难办的事情。 + +其实如果不考虑使用的便利性,最好的办法就是使用 Shortcode。甚至 GitHub 上已经有现成的 notice 短代码了。 + +但是,作为强迫症的我,希望能够直接使用 GitHub 风格(Obsidian 风格)的语法进行书写,也就是: + +```md +> [!Callout-type] +> Content +``` + +去给 Hugo 官方提了 issue,但是官方表示,他们感觉这并不是一个好的实现,推荐我使用这样的语法,然后写 Markdown render hook: + +```txt +callout {level="warning" } +This is a warning. +``` + +……行吧。 + +那我还不如写 shortcode 呢! + +于是我决定,使用 shortcode 加上 GitHub publisher 的正则替换。很可惜,由于我不会写正则,还是得用 shortcode 的原始语法,就很难评。 + +下面是一个例子: + +> [!TIP] +> 这是一段 Callout。 \ No newline at end of file diff --git a/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(4).md b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(4).md new file mode 100644 index 0000000..b2ad120 --- /dev/null +++ b/content/posts/百草园/Hugo博客迁移日志/Hugo博客迁移日志(4).md @@ -0,0 +1,493 @@ +--- +title: Hugo博客迁移日志(4) +date: 2024-07-01 +summary: 真·迁移日志(3) +description: 本文详细介绍了Hugo主题定制过程中的四个主要组件:公告、目录、简历和糖果雨特效。通过具体的代码示例和配置方法,文章指导读者如何实现这些组件的添加和功能扩展。包括了HTML模板的编辑、TOML配置文件的编写、CSS样式的调整以及JavaScript特效的实现。适合希望深入了解Hugo主题开发和自定义功能的读者。 +categories: ["百草园"] +series: Hugo博客迁移日志 +tags: + - Hugo + - 博客 + - Efímero + - 折腾 +slug: migrating-to-hugo-4 +featuredImage: https://img.viento.cc/cover/migrating-to-hugo-4-cover.webp +draft: false +--- + +芜湖,各位老友们好啊,我是 Chlorine。接着上一回,继续为您说。 + +## 公告组件 + +下面的目标是为主题添加侧边栏组件。经过观察,这部分代码位于 `主题/layouts/partials/sidebar` 和 `主题/layouts/partials/sidebar.html` 中。不过使用循环来简化代码似乎有那么亿点点麻烦,所以还是先不管可扩展性,直接硬上吧。 + +在 `sidebar` 文件夹下添加一个 `announcement.html`: + +```html +{{ $announcement := .Site.GetPage "announcement" }} +{{ with $announcement }} +
+ {{ .Content | safeHTML }} +
+{{ end }} +``` + +在 `sidebar.html` 下添加: + +```html +{{ if .Site.Params.Basic.announcement }} + +
+ 公告 +
+
+ {{ partial "sidebar/announcement.html" . }} +
+
+{{ end }} +``` + +这样直接编辑 `announcement.md` 就可以编辑公告了。当然,还需要配置 `.Site.Params.Basic.announcement` 参数。 + +## 目录组件 + +目录和公告大差不差: + +```html +
+
+ {{ .Page.TableOfContents }} +
+
+``` + +就是这个样式不大好看,凑合用吧。 + +## 简历组件 + +这个相对麻烦。我不想在 HTML 里硬编码,于是想了半天后,决定使用 TOML 配置,大概就是: + +```toml +[[params.social]] + name = "Home" + url = "" + icon = "i-carbon-home" + enable = true +[[params.social]] + name = "Email" + url = "mailto:your@email.com" + icon = "i-carbon-email" + enable = true +``` + +然后改一下 profile 的逻辑: + +```html +
+ +
+ +
+
+
+ Profile Image of the Author +
+
+
{{ .Site.Params.Author.name }}
+
+
{{ .Site.Params.Author.description }}
+ {{/*
+ +
+
+ +
*/}} +
+ {{ range .Site.Params.social }} + {{ if .enable }} + +
+
+ {{ end }} + {{ end }} +
+ +
+``` + +再写点美化的 CSS: + +```css +.icon svg { + height: 1em; + width: 1em +} + +.icons-container { + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.icons-container a { + margin: 5px; + /* 调整图标之间的间距 */ + width: 40px; + height: 40px; + display: flex; + justify-content: center; + align-items: center; +} + +/* 移动端样式 */ +@media (max-width: 600px) { + .icons-container a { + margin: 4px; + width: 30px; + height: 30px; + } +} + +@media (max-width: 600px) { + .card-base { + flex-direction: column; + padding: 0 1rem; + gap: 0.5rem; + } +} +``` + +就可以渲染社交图标了。 + +当初整这个的时候费了不少劲,主要的问题居然是我不知道图标不经过重新 UnoCSS 构建是不生效的(因此我安装了 UnoCSS 🤣)。以及,UnoCSS 不能检测没有在 HTML 中直接使用的图标,因此开了个 `utility.html` 来专门引入图标。 + +## 糖果雨特效 + +这个我在网上找了许多代码,最终在 Claude 等 AI 伙伴的帮助下写了出来。 + +新建一个 `candy.js`: + +```js +// 糖果雨效果,一定要在 footer 中引入,否则由于页面未加载完成,无法获取到 body 元素 + +class Circle { + constructor ({ origin, speed, color, angle, context }) { + this.origin = origin + this.position = { ...this.origin } + this.color = color + this.speed = speed + this.angle = angle + this.context = context + this.renderCount = 0 + } + + draw() { + this.context.fillStyle = this.color + this.context.beginPath() + this.context.arc(this.position.x, this.position.y, 2, 0, Math.PI * 2) + this.context.fill() + } + + move() { + this.position.x = (Math.sin(this.angle) * this.speed) + this.position.x + this.position.y = (Math.cos(this.angle) * this.speed) + this.position.y + (this.renderCount * 0.3) + this.renderCount++ + } +} + +class Boom { + constructor ({ origin, context, circleCount = 10, area }) { + this.origin = origin + this.context = context + this.circleCount = circleCount + this.area = area + this.stop = false + this.circles = [] + } + + randomArray(range) { + const length = range.length + const randomIndex = Math.floor(length * Math.random()) + return range[randomIndex] + } + + randomColor() { + const range = ['8', '9', 'A', 'B', 'C', 'D', 'E', 'F'] + return '#' + this.randomArray(range) + this.randomArray(range) + this.randomArray(range) + this.randomArray(range) + this.randomArray(range) + this.randomArray(range) + } + + randomRange(start, end) { + return (end - start) * Math.random() + start + } + + init() { + for (let i = 0; i < this.circleCount; i++) { + const circle = new Circle({ + context: this.context, + origin: this.origin, + color: this.randomColor(), + angle: this.randomRange(Math.PI - 1, Math.PI + 1), + speed: this.randomRange(1, 6) + }) + this.circles.push(circle) + } + } + + move() { + this.circles.forEach((circle, index) => { + if (circle.position.x > this.area.width || circle.position.y > this.area.height) { + return this.circles.splice(index, 1) + } + circle.move() + }) + if (this.circles.length == 0) { + this.stop = true + } + } + + draw() { + this.circles.forEach(circle => circle.draw()) + } +} + +class CursorSpecialEffects { + constructor () { + this.computerCanvas = document.createElement('canvas') + this.renderCanvas = document.createElement('canvas') + + this.computerContext = this.computerCanvas.getContext('2d') + this.renderContext = this.renderCanvas.getContext('2d') + + this.globalWidth = window.innerWidth + this.globalHeight = window.innerHeight + + this.booms = [] + this.running = false + } + + handleMouseDown(e) { + const boom = new Boom({ + origin: { x: e.clientX, y: e.clientY }, + context: this.computerContext, + area: { + width: this.globalWidth, + height: this.globalHeight + } + }) + boom.init() + this.booms.push(boom) + this.running || this.run() + } + + handlePageHide() { + this.booms = [] + this.running = false + } + + init() { + const style = this.renderCanvas.style + style.position = 'fixed' + style.top = style.left = 0 + style.zIndex = '999999999999999999999999999999999999999999' + style.pointerEvents = 'none' + + style.width = this.renderCanvas.width = this.computerCanvas.width = this.globalWidth + style.height = this.renderCanvas.height = this.computerCanvas.height = this.globalHeight + + document.body.append(this.renderCanvas) + + window.addEventListener('mousedown', this.handleMouseDown.bind(this)) + window.addEventListener('pagehide', this.handlePageHide.bind(this)) + } + + run() { + this.running = true + if (this.booms.length == 0) { + return this.running = false + } + + requestAnimationFrame(this.run.bind(this)) + + this.computerContext.clearRect(0, 0, this.globalWidth, this.globalHeight) + this.renderContext.clearRect(0, 0, this.globalWidth, this.globalHeight) + + this.booms.forEach((boom, index) => { + if (boom.stop) { + return this.booms.splice(index, 1) + } + boom.move() + boom.draw() + }) + this.renderContext.drawImage(this.computerCanvas, 0, 0, this.globalWidth, this.globalHeight) + } +} + +const cursorSpecialEffects = new CursorSpecialEffects() +cursorSpecialEffects.init() +``` + +再添加 CSS: + +```css +.candy { + position: absolute; + width: 20px; + height: 20px; + background-color: #f00; + border-radius: 50%; + pointer-events: none; +} +``` + +引入即可。以及,点名批评 Hugo 奇葩的构建机制,JavaScript 就摆在那,愣是不加到 `public` 里,我也是没招了。 + +## 代码一键复制 + +这个属实是给我整得心力交瘁。好在最后在强大的 Claude 3.5 的帮助下写出来了。 + +开一个 `clickcopy.js`: + +```js +(function () { + 'use strict'; + if (!navigator.clipboard) { + return; + } + + function createSVGIcon(iconName) { + const svgNS = "http://www.w3.org/2000/svg"; + const svg = document.createElementNS(svgNS, "svg"); + svg.setAttribute("viewBox", "0 0 32 32"); + + const path = document.createElementNS(svgNS, "path"); + if (iconName === "copy") { + path.setAttribute("d", "M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z"); + const path2 = document.createElementNS(svgNS, "path"); + path2.setAttribute("d", "M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z"); + svg.appendChild(path2); + } else if (iconName === "checkmark") { + path.setAttribute("d", "M13 24L4 15 5.414 13.586 13 21.171 26.586 7.586 28 9 13 24z"); + } + svg.appendChild(path); + return svg; + } + + function flashCopyMessage(el, msg, iconName) { + var iconContainer = el.querySelector('.copy-icon'); + var msgContainer = el.querySelector('.copy-msg'); + + // 更新图标 + iconContainer.innerHTML = ''; + iconContainer.appendChild(createSVGIcon(iconName)); + + // 更新消息 + msgContainer.textContent = msg; + + setTimeout(function () { + // 2秒后清除消息文本和图标变化 + msgContainer.textContent = ''; + iconContainer.innerHTML = ''; + iconContainer.appendChild(createSVGIcon('copy')); + }, 2000); + } + + function addCopyButton(containerEl) { + if (containerEl.querySelector('.highlight-copy-btn')) { + return; + } + + var copyBtn = document.createElement("button"); + copyBtn.className = "highlight-copy-btn"; + copyBtn.setAttribute("aria-label", "Copy to clipboard"); + copyBtn.innerHTML = ''; + copyBtn.querySelector('.copy-icon').appendChild(createSVGIcon('copy')); + copyBtn.style.display = "none"; + + var codeEl = containerEl.querySelector('code') || containerEl; + copyBtn.addEventListener('click', function () { + navigator.clipboard.writeText(codeEl.innerText).then(function () { + flashCopyMessage(copyBtn, 'Copied!', 'checkmark'); + }, function (err) { + console.error('Unable to copy: ', err); + flashCopyMessage(copyBtn, 'Failed :\'(', 'copy'); + }); + }); + + containerEl.appendChild(copyBtn); + containerEl.style.position = 'relative'; + + containerEl.addEventListener('mouseenter', function () { + copyBtn.style.display = "block"; + }); + containerEl.addEventListener('mouseleave', function () { + copyBtn.style.display = "none"; + }); + } + + // 添加复制按钮到所有代码块 + var codeBlocks = document.querySelectorAll('pre'); + Array.prototype.forEach.call(codeBlocks, addCopyButton); +})(); +``` + +写 CSS: + +```css +.highlight-copy-btn { + position: absolute; + top: 7px; + right: 7px; + border: 0; + border-radius: 4px; + padding: 5px; + font-size: 0.8em; + line-height: 1; + background-color: transparent; + /* 移除背景色 */ + color: inherit; + /* 继承父元素的颜色 */ + cursor: pointer; + opacity: 0.6; + transition: opacity 0.3s; +} + +.highlight-copy-btn:hover { + opacity: 1; +} + +.copy-icon { + display: inline-flex; + /* 使用 flex 布局以更好地控制图标 */ + align-items: center; + justify-content: center; + width: 20px; + height: 20px; +} + +.copy-icon svg { + width: 16px; + height: 16px; + fill: currentColor; + /* 使用当前文本颜色填充SVG */ +} + +.copy-msg { + margin-left: 5px; + font-size: 12px; +} +``` + +然后引入就完事了。不过这个功能有时候需要刷新才能启动。 + +以及复制之后的按钮和文本有点偏移,但是我没力气调了。 diff --git a/content/posts/百草园/Markdown图片管理实践.md b/content/posts/百草园/Markdown图片管理实践.md new file mode 100755 index 0000000..f83892f --- /dev/null +++ b/content/posts/百草园/Markdown图片管理实践.md @@ -0,0 +1,603 @@ +--- +title: Markdown 图片管理实践 +date: 2024-03-14T11:01:25+08:00 +categories: ["百草园"] +tags: + - 博客 + - 折腾 +slug: markdown-pic-management +showTableOfContents: true +summary: 很长的一篇废话,各位慢慢看 +description: 本文介绍了Markdown图片管理的实用技巧,包括在本地Markdown编辑器中使用图片的方法、图床的选择与配置,以及如何通过工具如PicList进行高效管理。作者比较了本地存储与在线图床的优劣,推荐了Obsidian插件和Squoosh等工具,并分享了对各大图床服务的评测,为Markdown用户提供了全面的图片管理解决方案。 +--- + +各位老友们好,我是 Chlorine。 + +本期想谈一谈我心目中,本地 Markdown 编辑器/笔记软件(Obsidian/Typora/思源笔记/……)的图片管理实践。本文超长且杂乱,请备好茶和早餐饼干,慢慢看。 + +更新:本文在粘贴的时候发生了大量格式错误,我已经尽可能修正。 + +## 前言:Markdown 中的图片是什么样的? + +> Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者 HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。 +> +> ——Wikipedia + +如各位所见,Markdown 的本质是纯文本文件,只是因为有 Markdown 渲染器才有了我们看到的斜体、粗体等效果。 + +那 Markdown 的图片是怎么显示的呢?事实上,Markdown 的图片是依靠链接的形式显示的,其格式为 `![<替代文本>](<图片链接> <图片标题(optional>)` 。其中的感叹号代表需要显示其内容。 + +在 Obsidian 中,我们也可以使用 wiki 双链 `![[<图片链接>|<图片宽度(optional)>]]` 进行图片引用,不过这并不是 Markdown 的标准语法。[^1]Obsidian 提供了使用 Markdown 标准链接的选项(尽管使用起来不如 wiki 链接方便),也有插件可以将 wiki 链接和标准链接互转。 + +图片可以放在本地,使用文件路径(可以是最短路径,相对路径和绝对路径)进行引用,也可以放在图床上,使用图床链接进行引用。图床(Image Hosting Service,IHS)就是一个能存储图片的服务器。与一般的服务器不同, 它允许将图片以 URL 链接的形式插入文章并展示图片内容。 + +## 郑重声明 + +1. 由于 Markdown 图片管理是个经久不衰的问题,因此网上的教程也极为丰富。所以,一些已经有详细教程的实践,例如阿里云 OSS/腾讯云 COS/GitHub 图床/SMMS/……的注册以及密钥获取、PicGo/PicList 等的配置我会一笔带过,大家可以自行搜索相关教程。例如,你可以搜索“PicGo+OSS“等。 +2. 以下内容较(ji)为(hu)简(mei)略(you):其他在线图床的配置;MinIO 等本地图床的配置;自建服务器图床…… +3. 本文含有大量项目,对于未经测试的项目,我已经明确标出;对于经过测试的项目,我会给出成功时的测试环境。无论测试与否,本人不对文中提到的任何项目的任何特性负责。 +4. 本文含有大量链接,如无特殊说明,链接均摘自作者获取的第一级信息,但作者不对链接的内容和安全性负责。 +5. 本文为作者原创,若您认为本文含有侵犯您权益的内容,请立即联系我。 + +## 省流 + +- 上手容易程度:本地 `file` 协议 > 本地附件文件夹 ≈ 在线图床 >> 本地 `http` 协议图床 > 服务器自建图床 +- 隐私保护程度:本地 `file` 协议 = 本地附件文件夹 > 本地 `http` 协议图床 = 服务器自建图床 >> 在线图床 +- 多平台同步/分享便捷程度:在线图床 ≥ 服务器自建图床 ≥ 本地 `http` 协议图床 >> 本地 `file` 协议 = 本地附件文件夹 + +最推荐的方案: + +- 本地附件文件夹:Attachment Management + Image Converter +- 本地图床:Image Auto Upload + PicList + File 协议 +- 在线图床:Image Auto Upload + PicList + 缤纷云/CloudFlare R2/大厂对象存储 +- 局域网图床/自建服务器图床:前面的区域,以后再来探索吧! + +## 推荐工具 + +### PicList + +图床管理工具有很多,例如著名的 PicGo,再比如 uPic,iPic 和 PicList 等,这里我们选择 PicList。 + +PicList 是基于著名图床管理工具 PicGo 的二次开发版本,兼容 PicGo 的特性,同时加入了 AWS S3,兰空图床,本地图床,WebDAV 和 Telegraph 等多种新的内置图床类型以及多种功能,支持在 Windows,macOS 和 Linux 上运行,是一款非常优秀的开源图床管理工具。 + +上面的介绍……好官方啊(笑)。 + +[这里](https://piclist.cn/)是 PicList 的官方网站。可以在 GitHub release 或者官方的直链中下载。 + +对于大部分图床,PicList 的配置方法和 PicGo 基本上是一样的。 + +### Typora 配置 + +在 Typora 的设置中,找到 `图像-插入图片时…`,选择“上传图片”;上传服务设定选择自己的图床管理软件即可。选择之后可以进行验证(左下角按钮)。 + +目前支持 PicGo(app/命令行),PicList,Picsee,iPic,uPic 和自定义命令。 + +*PS:如果配置完成显示验证失败,可以直接贴张图上去,很可能已经能成功上传了。* + +### Obsidian 相应插件 + +对于访问 GitHub 有困难的老友,可以前往 PKMer 进行下载: https://pkmer.cn/products/plugin/pluginMarket/ + +#### Image Auto Upload + +GitHub 仓库地址: https://github.com/renmu123/obsidian-image-auto-upload-plugin + +在 Obsidian 图片管理界德隆望尊的插件,可以配合 PicGo 实现粘贴图片自动上传。 + +#### Image Upload Toolkit + +GitHub 仓库地址: https://github.com/addozhang/obsidian-image-upload-toolkit + +来自大佬 [Addo Zhang](https://atbug.com/) 的作品,可以一键将图片上传到图床,然后将上传后到全文复制到剪贴板,但是不改变原本的文章,对于希望在本地附件文件夹中存储图片,但是又有时不时的上传需求(例如:写博客)的老友来说可谓是福音。 + +大佬在[博客](https://atbug.com/obsidian-plugin-image-upload-toolkit/)中给出了详细的教程。我曾经在使用的时候发现几个 bug,在文章下面留言后,大佬很快就把问题修复了,不得不敬佩大佬的技术力和责任心。 + +遗憾的是目前仅仅支持 Imgur,阿里云 OSS 和 ImageKit(ImageKit 也是一家不错的对象存储服务,我在做霞鹜文楷 Lite 字体分包的时候曾经用过,可以配合 LightCDN 等免费服务使用,可以参考[这里](https://chinese-font.netlify.app/post/deploy_to_cdn/))。 + +#### Attachment Uploader + +GitHub 仓库地址: https://github.com/zhuxining/obsidian-attachment-uploader + +这个插件和 Image Auto Upload 很接近,但是调用的是 uPic/Picsee。我没有正式测试过。 + +#### Image Converter + +GitHub 仓库地址: https://github.com/xRyul/obsidian-image-converter + +图片转换器,支持将图片转换为多种格式(同时也可以进行压缩),同时支持拖拽图片边缘进行大小调节(但是结果似乎无法保留)。 + +#### Paste Image Rename + +GitHub 仓库地址: https://github.com/reorx/obsidian-paste-image-rename + +粘贴图片重命名,支持自定义命名规则。如果你使用图床,可以在 PicList 上配置命名规则,省一个插件。 + +#### Attachment Management + +GitHub 仓库地址: https://github.com/trganda/obsidian-attachment-management + +附件管理器,可以在指定的附件文件夹下建立与原本的文件层级完全相同的附件文件夹结构,有利于对某个文章图片的集中管理。支持全库图片转移。 + +#### Attachment Manager + +GitHub 仓库地址: https://github.com/chenfeicqq/obsidian-attachment-manager + +同样是附件管理器,但是其会在每个文章的同级建立隐藏文件夹,不过这个插件和 Image Converter 似乎有冲突。 + +#### 其他 + +包括一键下载的 Local Images Plus,提升图像交互体验的 Image Toolkit,支持滚动调节图片大小的 Mousewheel Image Zoom 等。 + +### Squoosh + +官网: https://squoosh.app/ + +GitHub 仓库地址: https://github.com/GoogleChromeLabs/squoosh + +来自 Google 的开源神作,在图片压缩领域冠绝群雄。 + +国内可用,完全免费,压缩极快,支持多种输出格式,支持参数调节。唯一的缺点是不能批量压缩,不过可以下载 Squoosh CLI 进行批量处理(请自行搜索教程)。此外有大神用 Electron 写了 GUI 版本,[参考这里](https://www.imoolee.com/electron-da-bao-squoosh-lib/)。我没有测试过,无法评价。 + +## 这是一个过渡 + +> 图乌片,启一动! + +## 附件文件夹存储 + +这应该是最简单的方法之一了。优点是省心,而且文件都在本地,离线可用,绝对安全;缺点也非常明显,迁移性极差。Obsidian 的文件,扔到 Typora 就用不了了,多设备同步和分享更是白扯,除非你能在另一个设备建立一模一样的文件结构。 + +以下是一些推荐的实践。 + +### 图片压缩和 `.webp` 格式 + +对于大部分人来说,图片的清晰度其实没必要很高。比如我的图片大部分是代码的运行时截图,这种图片只要不糊成马赛克就能接受,既然如此,为什么不省点地方呢? + +常见的图片压缩网站包括 TinyPNG 等,当然我最推荐的还是上面说的 Squoosh。此外可以在 Image Converter 插件中设置压缩,尽管不如 Squoosh 压得那么出色,但是也及格,而且更方便,可以像以前一样直接粘贴无感压缩。 + +此外,对于像我这样的 ~~强迫症~~ 追求图片大小和性能的人,传统的 `.jpg`和 `.png`已经无法满足需求了,我们需要使用 `.webp`格式。 + + 搬运 Wiki: + +> WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式。 +> …… +> WebP 的设计目标是在减少文件大小的同时,达到和 JPG、PNG、GIF 格式相同的图片质量,并希望借此能够减少图片档在网络上的发送时间。 + +关于 `.webp` 图片的具体原理我们不需要知道 ~~(实际上是我不知道)~~,只需要知道 `.webp` 的图片比较小而且在网站上加载起来比较快就好了。 + +Squoosh 和 Image Converter 都支持输出 `.webp`格式。 + +### 图片管理 + +图片管理可以使用上面提到的 Attachment Management 和 Attachment Manager,看你习惯哪种方式了。如果你在使用 Obsidian 的同时使用 Typora,那么我建议使用 Attachment Manager,同时将图片存储位置改为与 Typora 风格一致的 `./${filename}.assets`。 + +如果你的图片实在是太复杂,也可以使用 Billfish 和 Eagle 这类专业的媒体资源管理器。 + +### 图片重命名 + +Paste Image Rename 支持复杂的重命名规则,同时 Attachment Management 和 Image Converter 都支持一些方式的重命名。下面是一些推荐的命名方式: + +- 时间戳 +- MD5 Hash 值 +- 文档名 + 时间戳 +- 文档名 + 序号 +- ImageNameKey + 序号(ImageNameKey 是 Paste Image Rename 的一个选项,在文章的 YAML Front Matter——也就是 Obsidian 的属性中使用。可以配合 Quickadd 的模板功能实现时间戳等 ImageNameKey) + +### 相对路径 + +大部分 Markdown 编辑器对于相对路径等支持都比较良好,因此推荐在 Obsidian 和 Typora 中将相对路径打开,方便多软件打开和迁移。 + +## 在线图床 + +在线图床,就是将图片上传到提供图床服务等厂家处,在本地保留返回的链接。优点是不用费劲管理图片,省地方,而且同步和分享非常方便;缺点是离线不可用(Obsidian 似乎会有一份本地缓存),依赖于第三方服务(有跑路风险,有的要收费,有的速度不行,而且都可以说毫无隐私可言)。 + +我在我的博客中曾经简单提到过图床的搭建流程,这里仅仅是补充一些 ~~废话~~。 + +### 图床推荐 + +为了看起来方便,我就不列表格了。 + +#### 大厂对象存储(阿里云 OSS、腾讯云 COS、华为云 OBS 等) + +- 官网 + - 阿里云: https://www.aliyun.com/product/oss + - 腾讯云: https://cloud.tencent.com/product/cos + - 华为云: https://www.huaweicloud.com/intl/zh-cn/product/obs.html + - 百度云: https://cloud.baidu.com/product/bos.html +- 价格:没有(通常意义上的)免费额度,但是一般有试用包;计费规则极其复杂,包括存储费用、外网流入、外网流出、CDN 回流等。一般来说,存储的费用极低,但是流量(主要是流出流量)较贵,具体可以参考官方文档。 +- 稳定性:估计你敲不动代码了它们还是活得好好的。 +- 速度:国内速度良好,国外如果套 CDN 应该可以,没试过。 +- 优点 + - 稳定性好 + - 国内访问快 +- 缺点 + - 计费规则极其复杂 + - 要收费,不能 100%白嫖 +- 推荐指数:4.5 + +2024-03-18 更新:目前又发现了网易数帆 NOS,似乎也有很高的免费额度,大家可以自行了解,我就不折腾了(逃)。 + +#### 缤纷云对象存储 + +- 官网: https://www.bitiful.com/ +- 价格 + - 免费额度(账户需实名认证,下面一堆直接摘自官方文档) + - 前 50 GiB 存储 + - 每月前 30 GB HTTP/HTTPS 流量(每日每项限 5 GB) + - S4 出口流量 10GB/月 + - 内置 CDN 回源 S4 流量 10GB/月 + - 内置 CDN 出口流量 10GB/月 + - 每月前 30 万次请求(每日每项限 1 万次) + - S4 请求数 10 万次/月 + - 内置 CDN 回源 S4 请求数 10 万次/月 + - 内置 CDN 请求数 10 万次/月 + - 收费部分:费用不高,[请自行查阅官方文档](https://www.bitiful.com/docs/categories/%E8%AE%A1%E8%B4%B9%E8%AF%B4%E6%98%8E-1/)。 +- 稳定性:应该不错。 +- 速度:国内只有北京节点,个人测试的速度良好(如果有备案域名还可以免费套 CDN),国外未知。 +- 优点 + - 免费额度比较充足 + - 国内访问快 + - 除了实名认证不需要额外条件 +- 缺点 + - 知名度不如大厂高 + - CDN 和自定义域名要备案 +- 推荐指数:4.5 + +#### 七牛云 + +- 官网: https://qiniu.com/ +- 价格 + - 免费额度 + - 标准存储每月免费空间 10G + - 标准存储每月免费 CDN 回源流量 10G + - 标准存储每月免费写请求 PUT/DELETE 10 万次 + - 标准存储每月免费读请求 GET 100 万次 + - 收费部分:我打累了,自己看吧。[价格 | 对象存储 - 七牛云 (qiniu.com)](https://www.qiniu.com/prices/kodo) +- 稳定性:也算是个知名厂商,应该不错。 +- 速度:国内速度良好。 +- 优点 + - 可靠性较高 + - 有一定免费额度 +- 缺点 + - 测试域名一个月就会过期,需要绑定已备案的域名。 +- 推荐指数:3.5 + +#### 又拍云 + +- 官网: https://upyun.com/ +- 价格 + - 免费额度 + - 新用户注册会赠送相当数额的代金劵,但是和七牛云一样,测试域名是有期限的。 + - 加入又拍云联盟:每年会发放代金券,相当于每月 10G 空间 + 15G 流量(由于是按年发放的,因此可以用一个月剩下的抵另一个月不足的)。 + - 收费部分:[这是又拍云的价格计算器](https://www.upyun.com/pricing),不过我不太能说清楚,因为这主要是针对网站而非单纯的图床的。总体上价格和套路云、腾讯云等相差不大。 +- 稳定性:又拍云的对象存储和 CDN 在站长圈里相当有名,还是可以相信的。 +- 速度:国内速度良好。 +- 优点:和七牛云差不多。 +- 缺点 + - 需要加入又拍云联盟(在网站底端放上又拍云的 Logo),需要备案域名和网站。 +- 推荐指数:3.5 + +#### CloudFlare R2 + +- 官网: https://developers.cloudflare.com/r2/ +- 价格 +- 免费额度 + - 每月 10G 存储 + - 每月 1M 次 A 请求(写入) + - 每月 10M 次 B 请求(读取) + - 无限流量(是的,CloudFlare R2 没有流量费用,毕竟人家 CloudFlare 的节点遍布蓝星🤣) + - 收费部分 + - 存储$0.015 / GB·月 + - A 请求$4.50 / 百万次 + - B 请求$0.36 / 百万次 +- 稳定性:估计你敲不动代码了它还是活得好好的。 +- 速度:国外没得说,国内出乎意料地还不错。 +- 优点 + - 免费额度充足 + - 无流量费 + - 支持免备案自定义域名 + - 付费部分价格低廉 +- 缺点 + - 需要绑定外币信用卡/PayPal(推荐注册一个 PayPal,极其简单) + - 国内访问速度比国内对象存储稍逊一筹 +- 推荐指数:4.5 + +--- + +总体而言,只要你的站点流量不是极大,图床的成本都不高,甚至可以使用免费额度实现零成本图床。综合来看,我个人最推荐的还是缤纷云和 CloudFlare R2。当然,如果你想用其他的我也不反对,见仁见智的问题。 + +我并不推荐那些公共免费图床,即使是已经运行多年的也一般不推荐(如果你执意要用的话,那我推荐 [SM.MS](https://smms.app/));同时我也不推荐使用 GitHub 仓库作为图床(虽然 GitHub 本身稳定性很好,但是有了 Gitee 图床的前车之鉴,谁知道以后会出什么事;此外 GitHub 图床的国内速度属实是一言难尽,就算是开了 jsDelivr 也是如此);更不推荐用各种奇奇怪怪的方式薅大厂的产品(比如京东,微博,B 站)当图床。 + +此外,缤纷云和 CloudFlare R2 本质上还是兼容 Amazon S3 协议的对象存储,因此可以拿来干很多事,比如当网盘分享文件,作为 Obsidian remotely save 和思源 S3 同步的免费提供方等。 + +### 配置指南 + +#### SMMS + +诶,不是说好不推荐免费公共图床了吗? + +emmm,SMMS 的确是个很稳的公共图床,速度也还可以。估计有很多老友会想用,所以还是放一下吧 ~~(才不会告诉你们其实是想对我远古时期的文章进行废物利用)~~ 。 + +##### 注册 SM.MS 账号 + +登录 SM. MS [官网](https://sm.ms)或[备用域名](https://smms.app),用邮箱进行注册即可。 + +##### 获取 SM.MS 的 token + +首先我们在主页点击 user,选中 dashboard。 + +![](https://s2.loli.net/2023/10/04/bSp12tG3X9w8OZC.png) + +~~这甚至都还是远古时期我用 SMMS 图床的图片~~ + +在 dashboard 中选择 API token,点击 generate token,生成一个专属的 token,复制好备用。 + +![](https://s2.loli.net/2023/10/04/1QbgvZu7fpnceqH.png) + +##### 下载安装 PicList + +这个没啥可说的。 + +##### 为 PicList 配置 SM. MS 的 token + +在 PicList 页面里选择图床设置,进入 SM. MS 的配置。 + +![](https://s2.loli.net/2023/10/04/ySMNxhCzatG3wFs.png) + +~~这不是远古时期 PicGo 的图片吗~~ + +##### 设置 PicList server + +在 PicList 设置中选择 server,将配置改成这个样子: + +##### 配置 Image Auto Upload + +先把插件下载好,启用,然后把配置改成这个样子就可以了。 + +![](https://s2.loli.net/2023/10/04/EcONhMRKz8IJvgZ.png) + +~~你就看这复古的 Obsidianite 主题就知道小氯这家伙就是在废文利用~~ + +#### 缤纷云 + +可以参考我的博客文章。 + +#### CloudFlare R2 + +##### 注册 PayPal 账户 + +想薅 CloudFlare 的羊毛,你首先需要有一个 PayPal 账户。当然,你有 Visa 卡一类的更好。 + +[这里](https://www.paypal.com/)是 PayPal 的官网,直接进去注册就完事,不需要双币卡。关于其中的注意事项,可以参考我的老友[嗣檙](https://sicheng.taoooist.org)的文章[浪花_注册paypal账号并正常付款使用](https://taoyifan.cn/#%E6%B5%AA%E8%8A%B1_%E6%B3%A8%E5%86%8Cpaypal%E8%B4%A6%E5%8F%B7%E5%B9%B6%E6%AD%A3%E5%B8%B8%E4%BB%98%E6%AC%BE%E4%BD%BF%E7%94%A8)。 + +*PS:不必担心,只要你的用量不超过免费额度,即使是绑定了账户也是不会扣费的。* + +##### 注册 CloudFlare 账户 + +略,我相信大家都有。 + +##### 创建存储桶 + +在 CloudFlare 的 [dashboard](https://dash.cloudflare.com) 中选择 R2,进行 PayPal 账户绑定。 + +然后点击右上角的创建存储桶。 + +##### 公开访问,自定义域名和 CORS + +简单来说,开启公开访问可以让你在 CloudFlare 之外的地址(包括本机)访问图片,自定义域名可以让你有一个自己的图床域名,CORS 策略可以让其他网站访问此处的资源。 + +##### Token 设置 + +在概览界面的右上角,点击“管理 R2 API 令牌”即可。权限选读写,限定在你创建的桶就好。各个平台 Token 的设置都是大同小异。 + +##### PicList 配置 + +CloudFlare R2 兼容 AWS S3 协议,就按下面的来就好。 + +##### 缓存策略(Optional) + +这个对于博客图床比较有用,不过需要你配置自定义域名。 + +## 本地图床 + +这是我最近折腾出来的新玩意。简单来说,将一个本地文件夹作为图床,并且将文件夹使用某种协议向外暴露,使得 Markdown 编辑器能够进行读取。优点是既保留了本地的隐私性,又满足了不同 Markdown 编辑器之间的同步需求;缺点是只能本机访问,需要进行一定的配置才能转化为局域网可访问,要想转化为公开图床则需要很复杂的配置。 + +> 瘟锌锑逝 +> +> 此处讨论的不是局域网图床。下面的配置仅限在本机使用,局域网图床的配置可以参考[这里](https://zhuanlan.zhihu.com/p/349707695)。 +> +> 对于拥有 NAS 或者长时间开机的设备,并且有同步需求的老友来说,局域网图床是一个好选择。 + +### 使用 `file`协议 + +首先我们讲讲 file 协议。 + +我们在输入一个网站的完整地址的时候,总会加上一个 `http`或者 `https`。所谓的 http,其实是超文本传输协议(HyperText Transfer Protocol)的简写,其允许客户端(一般是浏览器)向服务器请求资源,是整个万维网传输信息的基础。而 https 就是 http secure,代表使用了 SSL/TLS 加密协议的 http,更为安全。 + +而 file 也是一种协议,不过它不是用于访问网络资源的,而是访问本地文件。例如,你用 Edge 或者 Chrome 打开一个 PDF,仔细看上面地址栏的路径,就是 file 协议下的绝对路径。 + +目前支持 file 协议的包括 Obsidian,思源笔记和 Typora 等编辑器/笔记软件。[^2] + +配置 file 协议简单得惊人,整个配置可以在几分钟内搞定。 + +1. 找一个你喜欢的地方建个文件夹,例如我的是 `/Users/chlorine/Pictures/picbed`。 +2. 打开 PicList,找到“本地上传”,配置如下。 + +测试一下,完事了。 + +这个方案实在是太简单了,简单到折腾了一天的本理性人都开始痛惜我的沉没成本。 + +> 瘟锌锑逝 +> +> 1. Windows 上的默认文件路径分隔符是反斜杠,如果路径不对劲,可以同时试一下斜杠、反斜杠、双反斜杠。 +> 2. 本方案无法局域网化。 + +### 使用 http 图床 + +除了使用 file 协议,我们还可以使用 http 协议,也就是把本机的一个端口暴露出来作为上传服务。 + +下面是几种方案,我没有一一尝试过,仅供参考。 + +#### 使用 My-Easy-Pic-Bed + +[My-Easy-Pic-Bed](https://github.com/fslongjin/My-Easy-Pic-Bed) 是一个使用 Python 开发的轻量级图床程序,应该是下面这几个方案里面最轻量的了。 + +关于 Windows 上的使用可以参考[这篇教程](https://zhuanlan.zhihu.com/p/349707695),我只讲 macOS 的几个注意事项。 + +##### 启动服务 + +在终端(推荐用 VS Code 打开项目文件夹,在内置终端中运行或者使用 Code Runner)中执行: + +```bash +python -u app. py +``` + +然后就可以在 `http://127.0.0.1:<端口,在下面配置>`找到你的服务了,图片的路径是 `http://127.0.0.1/upload/<图片名>`。 + +##### 修改默认端口 + +由于原本的程序使用的是 80 端口,所以直接运行会被 Permission Denied。解决方案有两个: + +1. 使用管理员权限(在命令前面加个 `sudo`),然后输入密码即可,输入过程不会显示,不必慌张。 +2. 修改默认端口。 + +我们着重讲第二种。打开项目的 `config.ini`,将其中的 `port`参数修改为一个闲置的 **1024 以后的** 端口,例如我使用的是 8567。 + +##### 配置 PicList + +PicList 内置了对本地图床的支持,配置和上面的 file 协议很像,把自定义域名改为 ` http://127.0.0.1/upload`就可以了 。 + +##### 添加支持格式 + +在 `app.py`的 13 行那个列表中添加扩展名即可。 + +```py +allowed_extensions = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} # 添加自己需要的格式 +``` + +##### 修改命名规则 + +命名的代码位于 `app.py`的 35 行: + +```py +if file and allowed_file (file. filename): + filename = str (int (time.time ())) + str (random.randint (1, 99999)) + secure_filename (str (random.randint (1, 7887)) + file. filename) +``` + +提供几种命名的替代方案,如果需要其他的,可以自行搜索/询问 AI。 + +时间戳: + +```py +# 需要包含一个模块 +from datetime import datetime +# …… +if file and allowed_file (file. filename): + filename = datetime.now (). strftime ('%Y%m%d %H%M%S') + os.path.splitext (file. filename)[1] +``` + +MD5(来自 GitHub Copilot): + +```py +import hashlib +# …… +if file and allowed_file (file. filename): + file_bytes = file.read () + file_hash = hashlib.md5 (file_bytes). hexdigest () + extension = os.path.splitext (file. filename)[1] + filename = file_hash + extension +``` + +不重命名(推荐,可以在 PicList 中配置命名规则): + +```python +if file and allowed_file (file. filename): + filename = file. filename +``` + +##### 后台运行 + +可以在运行命令的时候加一个 `nohup`前缀。 + +##### 开机自启 + +这个需要配置 launchd,极其复杂,可以参考 [Mac OS 利用launchctl开机运行python程序 | Voezy](https://blog.voezy.com/cyber/MacOS-Launchctl-Scripts.html)。我自己没成功。 + +##### 私有域名 + +如果你不喜欢 `127.0.0.1` 这种方式,那么你可以稍做一点手脚,自娱自乐一个好看的域名。 + +简单来说,我们需要修改 `hosts` 文件——这是一个将主机名(域名)映射到 IP 地址的文件。`hosts` 文件在所有解析中具有最高效力,这样,我们就可以绕过 DNS 解析来进行 IP 和域名的对应。 + +为了避免使用烦人的 Vim 或者 Nano,我们使用 VS Code 进行编辑。 + +在 `/etc` 文件夹(位于 macOS 的根目录 Macintosh HD 中,使用 `command+shift+.` 以显示隐藏文件夹)中找到 `hosts` 文件,右键打开方式选择 VS Code。 + +打开之后你应该看到类似这样的内容: + +```txt +## +# Host Database +# +# localhost is used to configure the loopback interface +# when the system is booting. Do not change this entry. +## +127.0.0.1 localhost +255.255.255.255 broadcasthost +:: 1 localhost +``` + +在底端添加一行: + +```txt +127.0.0.1 <你想要的域名> +``` + +注意,此处的域名可以是任何字符串,因为这个“域名”只会在本机进行解析,所以不符合规范也没问题。**但是,为了不出现奇奇怪怪的问题,最好不要使用现实世界中存在的域名。** + +解释一下,我们前面说过,`hosts` 文件在所有解析中具有最高效力,如果我们将一个存在的域名映射到本机了,那你再访问这个域名,原本的 DNS 可就不作数了。举个例子,如果你将 ` www.baidu.com` 映射到本机,那你再在浏览器地址栏输入 ` www.baidu.com` ,访问的就是本机,不是百度了。所以说,最好使用一些不存在的域名,例如不存在的后缀,特别奇怪的前缀等。比如,可以使用 `chlorinechan.chem`(`小氯酱.化学`),因为 chem 这个后缀是不存在的。 + +这样,你就可以使用 `http://<你的私有域名>/upload/<图片名>` 进行访问啦~ + +##### 域名防火墙 + +如果你的局域网是较为开放的局域网(比如小氯所在的校园网)或者不可信任的局域网,那么推荐你打开域名防火墙。否则,局域网内的其他人只要知道你的 IP 地址就可以访问你的图床,这是非常危险的。 + +域名防火墙配置可以参考[这里](https://zhuanlan.zhihu.com/p/351973632)。 + +#### 使用兰空图床 + +[兰空图床](https://www.lsky.pro/)是一个著名的开源云端相册管理项目。你不仅可以将其作为单独的图床使用,还可以将多种图床整理进去,变成真正意义上的云端相册。具体内容可以参考其[官方文档](https://docs.lsky.pro/docs/free/v2/)。 + +但是:**兰空图床基于 PHP 和数据库,操作较为复杂,因此并不方便在本机部署。** + +#### 使用 MinIO + +[MinIO](https://min.io/) 是一个开源的对象存储服务,没错,就是对象存储。 + +[这里](https://min.io/docs/minio/kubernetes/upstream/index.html)是 MinIO 的官方文档,不过是全英的,比较难读。可以自行搜索一些教程。 + +我曾经测试过,在我的 MacBook 上,一个简单的 MinIO server 占的内存近 1G。而且其文件是以 `.meta`格式存储的。所以我没用这个。不过 MinIO 的界面真的很赞,有专业的对象存储的味道。 + +PicList 需要安装 MinIO 插件,其配置内容和一般的对象存储很像。 + +#### 其他方案 + +包括但不限于 http-server,EasyWebSvr 等,自己探索吧。 + +## 局域网图床和自建服务器图床 + +这个方案相当于将本地图床向外开放,可以在局域网范围内使用,也可以向公网开放,作为真正意义上的图床。 + +需要有服务器或者 NAS 一类的设备,其方案和上面的 http 本地图床基本相同。由于有专业的环境,部署兰空、MinIO 等项目会方便很多。当然,会有亿点折腾。 + +## 结语 + +花了好几天,终于把文章写完了。 + +本文长且杂乱,相比前人丰富的文章,似乎也没太多新的东西。不过这篇文章应该会持续更新或者打补丁,介绍我新的折腾结果。 + +**写到这里,我都快忘记,我为什么要写这篇文章了。** + +[^1]: 这个说法是不严谨的,因为 **Markdown 并没有事实上的标准语法** 。目前比较通行的 Markdown 语法包括 GitHub-favored Markdown(GFM)和 CommonMark 等。 + +[^2]: 我目前使用的 Markdown 编辑器都是这三个,其他编辑器我大都没有亲身测试。目前已知 VS Code 明确不允许引用工作区之外的资源,RemNote 允许使用 file 协议(信息来源:[RemNote威廉笔记教学016之PDF批注建立知识树超越Marginnote(一)导入与卸载PDF - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/351229230))。 diff --git a/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:0-前言.md b/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:0-前言.md new file mode 100755 index 0000000..a72b3e9 --- /dev/null +++ b/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:0-前言.md @@ -0,0 +1,114 @@ +--- +title: Obsidian+Hugo建站教程:0-前言 +date: 2024-02-16T18:49:34 +categories: ["百草园"] +tags: + - 博客 + - 教程 + - Obsidian +featuredImage: https://img.viento.cc/cover/how-to-build-a-blog-0-cover.webp +slug: how-to-build-a-blog-0 +series: Obsidian+Hugo建站教程(已鸽) +summary: Obsidian + Hugo 建站教程前言 +description: 本文是作者关于从 NotionNext 迁移到 Hugo 博客系统的系列文章的开端。文章首先解释了静态博客和独立博客的概念,强调了独立博客的自主性、自由度以及与读者互动的紧密性,同时也指出了其成本、技术要求等缺点。接着,作者提出了独立博客写作的最佳实践,并列出了进行博客写作和管理所需的基本技能和工具。文章最后以一个博物馆的比喻预告了后续将详细讲解博客搭建的各个步骤,旨在为读者提供一个全面的指南。 +--- +声明: + +细心如你,应该已经发现了,本期的链接,build 变成了 bulid…… + +其实我已经发现了,但是我又发现,Twikoo 这货,文章 slug 改了之后,居然评论就没了…… + +$$ +\begin{cases} +x = \sin t, \\ +y = \frac{t \cos t}{2} +\end{cases} +\quad 0 \leq t \leq 2 \pi +$$ + +更新:在修改 MongoDB 数据库之后,链接正常了( + +--- + +嗨,大家好,我是 Chlorine。 + +折腾了一天多,终于完成了从 NotionNext 到 Hugo 的迁移。这个系列的目的就是记录我搭建博客的历程,同时我会尽可能写得详细一点,为同样零基础的老友们提供一点帮助。 + +本来想给这个系列起一个炫酷的名字,但是想了想,还是使用两个主要工具进行命名吧,也方便想找解决方案的老友们。 + +本系列的封面图作者为 Unsplash 的 [Luke Stackpoole](https://unsplash.com/@withluke)。 + +## 独立博客简介 + +### What? + +什么是静态博客呢? + +要说静态博客,首先要说独立博客。 + +说到博客——或者类似的服务,大家可能会想到新浪微博、知乎、CSDN、博客园等。这样的平台只要注册一个账号,开始写就完事。 + +例如,我们打开一个博主的知乎首页,我们访问的域名(地址栏里那串字符)一般是这样的: https://www.zhihu.com/people/xxxxx ;而你现在访问我的博客首页,链接是这样的: https://yoghurtlee.com 。 + +看出区别了吗?直观上来看,知乎首页的域名是依托于知乎的域名的,而我的博客的域名是我自有的。 + +独立博客指的是不依赖于社交媒体平台或内容聚合网站、拥有自己的域名和托管服务的博客。这样的博客通常由博主自己或者一个小团队进行运营,具有更高的自定义程度,允许博主完全控制网站的设计、内容和功能。这种类型的博客可以是个人兴趣、专业领域分享、商业推广或任何其他目的。 + +### Why? + +关于为什么写静态博客而不是在大型博客平台上进行写作,我概括了以下几点原因: + +- 独立的域名和服务——网站的全自有性 + - 数据掌握在自己手中 + - 站点权重和搜索引擎优化(SEO,简单来讲就是你的网站在搜索引擎的位次)我命由我 +- 高度自由化——独立博客一般都基于开源框架,客制性极高 +- 不受平台审核规则的限制——内容(合法范围内的)自由 +- 与读者更好的互动——这是我的个人感觉,一个订阅人数不过百的小站,比一个几万粉丝的平台号与读者的关系紧密许多 +- 盈利性 + - 独立网站可以成为高价值的虚拟财产 + - 在流量足够且你愿意的情况下,你可以通过广告或推广营收 + +当然,独立博客也有缺点: + +- 成本——零成本建站当然是完全可行的,但是如果你想拥有自己的顶级域名(TLD)和服务器,那还是需要一点成本的 +- 小众性——博客本身就是一个小众的爱好,我们的站点(目前)又是属于再小不过的站点。 +- 技术要求——即使是门槛最低的建站,也比注册一个账号开始写复杂很多。当然,看着教程建站还是相当简单的~ +- 低流量性——上一条的直接结果 +- 孤独性——这点很复杂和无奈,大家先从直观上想象一下吧 + +## Best Practice + +下面是我认为的,独立博客写作的最佳实践。 + +- 稳定的域名和 DNS 解析服务。 +- 在本地快速创建带有相应属性值的博客文章。 +- 使用标准的 Markdown(准确来说,此处指的是 GFM)语法进行书写。 +- 使用图床进行图片的管理。 +- 写作完成后一键上传到 Git 仓库。 +- 站点部署工具自动嗅探仓库变动进行部署。 +- 更新完成。 + +以下我们的所有文章,都围绕着这个 Best Practice 展开。 + +## 你必须会的东西 + +下面的东西是必须会的,如果这些都不会,我就真没辙了。 + +- GitHub/Gitee 账号的注册,仓库的 fork +- Markdown 语法。如果你不习惯 md,那你可能是走错地方了。 +- Git 提交(后面会简单讲如何在 VS Code 中可视化提交) + +## 我们需要的东西 + +- 域名:我们以 Dynadot 为例 +- DNS 解析服务(Opt.):我们以 CloudFlare 为例 +- 博客框架:我们以 Hugo 为例 +- Git 仓库:我们以 GitHub 为例 +- 部署服务:我们以 Vercel 为例 +- Markdown 编辑器:我们以 Obsidian 为例 +- 图床(Opt.):我们以缤纷云对象存储为例 +- 评论系统(Opt.):我们以 Twikoo 为例 + +下面我会使用“数字博物馆”这个比喻,将搭建博客的每一步都尽可能讲清楚,希望能够给大家带来一些帮助。 + +> 独立博客,启动! diff --git a/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:1-Markdown,Obsidian与图床.md b/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:1-Markdown,Obsidian与图床.md new file mode 100755 index 0000000..da6e0b1 --- /dev/null +++ b/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:1-Markdown,Obsidian与图床.md @@ -0,0 +1,130 @@ +--- +title: Obsidian+Hugo建站教程:1-Markdown,Obsidian与图床 +date: 2024-02-16 20:28:25 +tags: + - 博客 + - Obsidian + - 教程 +featuredImage: https://img.viento.cc/cover/how-to-build-a-blog-1-cover.webp +slug: how-to-build-a-blog-1 +categories: ["百草园"] +series: Obsidian+Hugo建站教程(已鸽) +summary: Obsidian + Hugo 建站教程第一期 +description: Obsidian + Hugo 建站教程——Markdown 语法介绍,Obsidian 配置,使用缤纷云对象存储搭建图床。 +--- +各位老友好啊,我是 Chlorine。本期开始,我们进入独立博客建站之旅。 + +## Markdown 与 Obsidian + +我在 [上一期](/Obsidian+Hugo建站教程:0-前言.md) 中曾经说过,搭建博客就像是搭建一座数字博物馆。博物馆中最重要的东西,自然就是展品了。对于我们的博客,展品就是我们的文章。 + +关于博客文章怎么写、写什么的问题,不是三言两语就能说清楚的,每一位独立博客的博主也都有各自见仁见智的想法。这里我们只讨论一个问题:**用什么写**。 + +能找到这里的朋友,应该至少都对 Markdown(简称 md)有一定的了解(大概率已经能熟练使用 Markdown 了)。不过为了完整,我们还是简单介绍一下 Markdown。 + +搬运 [Wiki](https://zh.wikipedia.org/wiki/Markdown): + +> Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者 HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。 + +说白了,Markdown 就是一种使用特殊记号对文本进行样式标记(给文本赋予特定的样式,例如斜体、粗体等)的语言。 + +下面的优点由 Kimi AI 进行概括总结: + +1. **易读性**:Markdown 的语法简单直观,即使没有编程背景的用户也能快速理解和使用。它的设计哲学是“所见即所得”,即最终的输出格式在编辑时就能直观地看到。 +2. **易写性**:Markdown 的语法规则很少,这使得编写文档变得快速且不繁琐。它避免了传统 HTML 的复杂标签,使得内容创作者可以专注于内容本身,而不是格式。 +3. **跨平台兼容性**:Markdown 文件可以在多种平台和应用程序中使用,包括 GitHub、Reddit、Stack Overflow 等,这使得内容可以在不同的环境中保持一致性。 +4. **可扩展性**:虽然 Markdown 本身是固定的,但它可以通过扩展插件或工具链来增加额外的功能,如表格、脚注、数学公式等。 +5. **版本控制友好**:Markdown 文件通常是纯文本格式,这使得它们非常适合版本控制系统(如 Git),可以轻松地追踪文档的变更历史。 +6. **转换灵活性**:Markdown 文件可以轻松转换为 HTML、PDF、Word 等其他格式,这为内容的发布和分享提供了便利。 +7. **社区支持**:由于 Markdown 的流行,有许多工具和编辑器支持 Markdown,如 Typora、Mark Text、Visual Studio Code 等,这些工具提供了丰富的功能和良好的用户体验。 +8. **适合快速草稿和笔记**:Markdown 的简洁性使得它成为快速记录想法和草稿的理想选择,尤其是在需要快速整理思路时。 +9. **减少视觉干扰**:Markdown 的编辑器通常提供简洁的界面,减少了视觉干扰,有助于提高写作效率。 +10. **易于维护**:由于 Markdown 文件是纯文本,它们不需要特定的软件来打开,也不需要担心文件格式的兼容性问题。 + +后面我们会讲到,我们的博客文章需要借助博客框架转换为可展示的 HTML 页面,借助 Git 进行版本控制和提交。那很明显,用 Markdown 再合适不过了。 + +如果你想快速入门 Markdown,可以参考以下资料: + +1. [Markdown 官方教程](https://markdown.com.cn/) +2. [Markdown 教程 | 菜鸟教程 (runoob.com)](https://www.runoob.com/markdown/md-tutorial.html) +3. [基本撰写和格式语法 - GitHub 文档](https://docs.github.com/zh/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) +4. [MarkDown超级教程 by 成雙醬 - Obsidian中文教程 - Obsidian Publish](https://publish.obsidian.md/chinesehelp/01+2021%E6%96%B0%E6%95%99%E7%A8%8B/MarkDown%E8%B6%85%E7%BA%A7%E6%95%99%E7%A8%8B+by+%E6%88%90%E9%9B%99%E9%86%AC) + +注意,由于我们后续要使用 Hugo 作为框架,我强烈推荐在写作时严格遵循 GitHub- favored Markdown(GFM)格式标准。 + +言归正传。既然要用 Markdown 写文章,那就需要一个称手的编辑器。市面上的 md 编辑器极多,代表如 Obsidian、Typora、VS Code(是的,你用来写代码的 VSC 可以当做 Markdown 编辑器,毕竟人家是 code editor 而不是 IDE)等。这里我们重点讲 Obsidian。 + +[Obsidian](https://obsidian.md),中文名为“黑曜石”,是一款免费的跨平台笔记软件,以其完善的 Markdown 支持、双链、关系图谱、本地化存储、强大的可扩展性、良好的社区生态和多样的主题等受到广泛好评。Obsidian 完善的语法支持和丰富的插件会给我们后续的写作带来极大的便利。 + + +能找到这篇文章,相信多少也对 Obsidian 有了解。如果不是,那我强烈推荐你尝试一下这款笔记神器。以下是一些教程: + +1. [清单控沙牛的个人空间-清单控沙牛个人主页-哔哩哔哩视频 (bilibili.com)](https://space.bilibili.com/443605967?spm_id_from=333.337.0.0) +2. [由此开始 - Obsidian 中文帮助 - Obsidian Publish](https://publish.obsidian.md/help-zh/%E7%94%B1%E6%AD%A4%E5%BC%80%E5%A7%8B) +3. [Ob新手入门必读——常见Q&A(持续建设ing...请勿在此回复及提问) - 疑问解答 - Obsidian 中文论坛](https://forum-zh.obsidian.md/t/topic/3222) +4. [想一小时上手obsidian?这一篇就够了。【玩转Obsidian的保姆级教程】 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/428519519) + +## 图床的搭建 + +OK,现在我们似乎已经可以开始进行愉快的创作了,但是让我们先行思考一个问题。 + +我们知道 Markdown 是纯文本语言,那我们怎么插入图片呢? + +事实上,Markdown 的图片是通过链接引用的形式插入的,典型的链接格式为 `![图片注释](图片链接,本地或者网络)`。Obsidian 还支持在方括号内的注释后面添加 `|图片大小` 来调整宽度。 + +那看来我们只需要将图片放在适当的位置进行引用就好了。问题是:**放在哪呢?** + +如果你的图片不多,你可以将其放置于静态资源文件夹下(后面会讲)。但是我更推荐另一种方式:使用图床。 + +简单点说,图床(Image Hosting Service,IHS)就是一个能存储图片的服务器。与一般的服务器不同, 它允许将图片以 URL 链接的形式插入文章并展示图片内容。使用图床管理文件可以节省仓库空间,并避免乱七八糟的文件堆积,同时使 Markdown 仓库完全文本化,便于导出和迁移;当然也有缺点,例如隐私性较低,可能跑路(因此要做好备份)等。 + +图床有很多种,免费的包括 SMMS,路过图床,聚合图床,Imgur 和新浪微博图床(已经无法使用)等,甚至 GitHub 和 Gitee 的仓库也可以当图床(Gitee 已经无法使用,GitHub 需要借助特殊手段);付费图床主要是各大厂商的对象存储,例如阿里云 OSS,腾讯云 COS 等,一般都很便宜。 + +这里推荐一些个人觉得比较靠谱的方案: + +- [SMMS](https://smms.app/):老牌免费图床,免费用户有 5G 的空间,够用很久了。至于速度嘛,只能说中规中矩。 +- GitHub+jsDelivr:jsDelivr 专门帮 GitHub 仓库做 CDN,大陆速度比较稳。不过每次都得创建一个 release,怪麻烦的。 +- [又拍云](https://www.upyun.com/):加入又拍云联盟(在网站底下放他们的 logo)可以薅不少的免费额度,用来当图床和全站 CDN 都挺好,可惜需要 ICP 备案。 +- [七牛云](https://www.qiniu.com/):不少大佬的推荐,免费额度较充足,可惜也需要备案。 +- 对象存储:现在的大厂基本都有,价格和质量都差不多,随便挑一个就可以。 +- 不用:没错,不用图床。如果你的图片不多且体积不大,那放在 `static` 文件夹里面完全没毛病,后续会有讲解。 + +我曾经先后使用 SMMS 和套路云 OSS,目前使用的方案是缤纷云对象存储,有 50G 免费存储,每个月前 30G 流量免费(S4 出口流量、内置 CDN 回源、内置 CDN 出口流量各 10GB/月),不出意外够我用了。下面以这个图床为例讲解图床的搭建。 + +### 缤纷云对象存储创建 + +首先进入[缤纷云官网](https://bitiful.com),完成注册和实名认证,这个略过。 + +然后进入控制台,点击新建存储桶: + +![|600](https://img.viento.cc/IMG-20240216202825-1.webp) + +新建存储桶后,在左侧选择 accesskey,添加一个子用户并获取对应的 accesskey 和 secretkey,这个很重要,找个地方保存好。权限就选择我们刚才的桶就可以。 + +然后我们就可以上传图片了。 + +### PicList 的配置 + +可以上传图片还不够,总不能每次都进去传一遍,太不优雅了。 + +我们可以使用一些工具,使得我们在 Obsidian 中写作时就直接可以上传图片。 + +PicList 是一个图床管理工具,基于著名的 PicGo 进行二次开发而成,有更加强大的功能。 + +[这里](https://piclist.cn/)是 PicList 的官网,大家可以进去选择对应版本进行安装。 + +安装后打开主窗口,在右边栏中选择 AWS S3,在设置中配置并保存。两个 key 写刚才保存的那一串,bucket 写桶的名字,自定义节点填 `https://<你的桶名>.s3.bitiful.net`。 + +![|600](https://img.viento.cc/IMG-20240216202825-2.webp) + +### image auto upload 插件配置 + +进入 Obsidian 插件市场,搜索 image auto upload 并安装。访问 GitHub 不顺畅的老友可以自行百度搜索 PKMer 插件进行辅助。 + +安装后启用,进行如下配置: + +![|600](https://img.viento.cc/IMG-20240216202825-3.webp) + +然后就可以做到粘贴图片自动上传了。 + +此外还有一些进阶的用法,这个我们留到后面讲。 diff --git a/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:2-博客系统,域名,托管服务,DNS解析.md b/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:2-博客系统,域名,托管服务,DNS解析.md new file mode 100755 index 0000000..0d8490d --- /dev/null +++ b/content/posts/百草园/Obsidian+Hugo建站教程(已鸽)/Obsidian+Hugo建站教程:2-博客系统,域名,托管服务,DNS解析.md @@ -0,0 +1,306 @@ +--- +title: Obsidian+Hugo建站教程:2-博客系统,域名,托管服务,DNS解析 +date: 2024-02-18T15:30:14 +categories: ["百草园"] +tags: + - 博客 + - 教程 + - Obsidian +feature: https://img.viento.cc/cover/how-to-build-a-blog-2-cover.webp +slug: how-to-build-a-blog-2 +summary: Obsidian + Hugo 建站教程第二期 +series: Obsidian+Hugo建站教程(已鸽) +description: Obsidian + Hugo 建站教程——各种静态及动态博客系统简介,域名简介以及建议,Vercel 和 Netlify 等托管服务简介,DNS 解析介绍。 +--- +各位老友们好,我是 Chlorine。本期继续我们的数字博物馆搭建之旅。 + +> 本期的内容技术性比较强,大家可以不必完全理解,会用即可。我本身对这些概念也不算熟悉。 + +## 博客系统 + +随着我们的展品准备完成,我们需要博物馆的 staff 了——有人向来宾们讲解展品的意义,有人负责装潢收拾博物馆的外观和卫生,有人负责与博物馆场地进行对接,等等。 + +而在我们的独立博客中,负责这些活计的就是独立博客系统。 + +独立博客系统是一种项目框架,它可以将我们的博客文章转化为可以在浏览器上展示的 HTML 网页,同时将网站渲染为我们想要的效果。 + +### 静态博客和动态博客 + +独立博客框架主要可以分为两种:静态博客和动态博客。简单来说,静态博客会在服务器端根据我们当前的内容生成相应的 HTML 文件,用户需要访问时直接将现成的 HTML 发送到用户端;而动态博客通常基于数据库和服务器端脚本处理用户请求,然后在服务器动态生成网页内容。 + +这么说比较绕,我用我做过的一个上机报告举个例子吧。 + +我们做过一个上机作业,大致内容是写一个 C++ 程序,根据用户输入的年份(在一定范围内)生成一份日历并输出。 + +当时我就想到了两种方案: + +1. 先写一个生成程序,把这个范围内的所有日历都生成好并储存,等用户输入时直接把对应的日历输出。 +2. 直接接受用户输入,根据输入的参数现场生成日历并输出。 + +不十分严谨地说,第一种方案类似于静态博客,第二种类似于动态博客。 + +静态博客和动态博客各有优缺点,我们简单列一下吧。 + +静态博客的优点: + +- 文章均以 Markdown 文件存储,对于习惯 Markdown 的博主来说迁移成本几乎为 0。 +- 可以免费托管在静态网站托管服务上,节省了服务器成本。 +- 文章不多的时候性能较好。 + +静态博客的缺点: + +- 交互性比较差,评论等功能配置起来麻烦。 +- 需要学习一些 Git 等命令,每次更新内容都需要重新生成静态文件并部署到服务器。 + +动态博客的优点: + +- 一般具有极其丰富的插件和主题,可定制性一般较强。 +- 一般有后端(管理面板),操作方便。 +- 交互性好,评论、登录等配置起来难度较低。 + +动态博客的缺点: + +- 文章存储在数据库中,迁移不方便。 +- 需要服务器,成本较高,且服务器可能成为制约性能的瓶颈(一般不至于)。 + +### 框架推荐——静态博客 + +#### Hexo + +官方网站: https://hexo.io/ + +GitHub 仓库地址: https://github.com/hexojs/hexo/ + +一个基于 Node. js 的快速、简洁且高效的静态博客框架,在静态博客爱好者中很受欢迎。不过我个人对其了解不多,不敢多言。 + +#### Hugo + +官方网站: https://gohugo.io/ + +GitHub 仓库地址: https://github.com/gohugoio/hugo/ + +一个基于 Go 语言的静态博客框架,以速度快著称。主题很多,同时支持使用 shortcode(简码)进行高度个人化的定制。也是我们下面系列的主角。 + +#### NotionNext + +官方网站: https://tangly1024.com + +GitHub 仓库地址: https://github.com/tangly1024/notionnext/ + +一个基于 Notion 的建站服务,来自大佬 [tangly](https://blog.tangly1024.com),也是我之前使用的系统。 + +拥有极为美观的界面、多种主题和丰富的插件,同时由于 Notion 的强大,可定制性也比较高,而且[说明文档](https://docs.tangly1024.com/)详细到令人落泪,极度 beginner-friendly。 + +对于喜欢用 Notion 的老友们,这绝对是个福音。 + +#### Gridea + +官方网站: https://open.gridea.dev/ + +GitHub 仓库地址: https://github.com/getgridea/gridea/ + +这是我最初使用的框架。一个小而美的静态博客系统,有一个 user- friendly 的客户端。不过很久不更新了。 + +#### Valaxy + +官方网站: https://valaxy.site/ + +GitHub 仓库地址: https://github.com/YunYouJun/valaxy + +大神[云游君](https://yunyoujun.cn)的作品,基于 Vite 和 Vue 构建,看着颜值相当高,Markdown 支持也很完善。同时支持热重载,本地开发的时候很美好。 + +这是我很感兴趣的框架之一,将来可能搞个镜像站。 + +#### Vanblog + +官方网站: https://vanblog.mereith.com/ + +GitHub 仓库地址: https://github.com/Mereithhh/vanblog + +大神 Mereith 的作品,响应速度快,功能极其完善,甚至连图床和站点统计都给你准备好了。 + +说实话,我感觉 Vanblog 更像是一个动态博客:它有后端,有账号系统,部署也必须要服务器。 + +#### 其他 + +下面的框架也都有不小的名声,但是我没有详细了解过。 + +- [Jekyll](https://www.jekyll.com.cn/) +- [VuePress](https://vuepress.vuejs.org/) +- [Pelican](https://getpelican.com/) +- [VitePress](https://vitepress.dev/) +- [Docsify](https://docsify.js.org/) +- …… + +### 框架推荐——动态博客 + +动态博客我了解的属实不多,因此只介绍两个有名的吧。 + +#### Wordpress + +中文名“文派”,官方网站: https://wordpress.com (商业), https://wordpress.org (自托管) + +WP 在动态博客界德隆望尊,被誉为“宇宙第一独立博客系统”,拥有极为完善的社区生态、丰富的插件和主题。 + +#### Ghost + +官方网站: https://ghost.org/ + +一款基于 Node. js 和 MySql 数据库的个人博客系统,非常简洁好看。 + +在下面的教程中,我会使用 Hugo 作为示例。至于为什么是 Hugo?嗯,这个以后再说。 + +## 网页托管服务 + +好的,展品有了,staff 齐了,那是不是应该有个场地了? + +对于动态博客,我们需要使用服务器(server)。服务器是一个很复杂的东西,你可以理解为:**服务器就是一台能接受外来访问的机器**。从这个角度来看,任何电子产品(有形的或者无形的)都可以作为服务器。 + +那就有朋友要问了:那我直接拿自己的电脑/手机/……当服务器不就行了?为什么还要专门去买服务器? + +仔细想一想,服务器要有哪些必备的素质? + +- 7\*24 运行的能力:毕竟你这博物馆是要全天候开放的。 +- 处理大量访问请求的能力。 +- 独立的公网 IP: 这点比较复杂,一会再讲。 + +而我们自己的设备大部分没有这样的能力,就算有也需要非常复杂的折腾,其机会成本极高。考虑到本文的受众,这种方法显然是不合适的。所以如果需要,还是推荐买个服务器,特别是云服务器。和实体服务器相比,云服务器优点还是蛮多的: + +- 成本相对较低:现在云服务器的价格已经很喜人了,腾讯云的学生机一年也就 100 多(由此引申出了我计量货币的一种方式,1 年服务器 = 112r)。By contrast,孙哥自己搭的实体服务器,在发挥图吧的各种省钱小妙招之后依然花费上千,更别提各种折腾。所以还是那句话:如果只是想建站,自己搭实在不值。 +- 有独立的公网 IP:这一点留到后面 IP 的部分讲。你只需要知道,我们自己的局域网 (内网)的设备在外网访问是很费劲的。 +- 稳定可靠:这点听上去有点离奇,不过仔细想想:目前的大厂,像国外的 Microsoft Azure,Amazon,国内的套路云、凉心云、华为云之类的,提供的云计算服务的稳定性其实比大部分个人搭建的服务器更高。 + +有点跑题了,毕竟我们讲的是静态博客。静态博客当然可以部署在服务器上,但是属实是鸭子睁眼——duck 不必(闭)(通辽歇后语 1/1)。因为我们早就有更方便而且免费的服务了,那就是静态网页托管。 + +下面列出了一些常见的静态网页托管服务: + +| 名称 | pros | cons | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| Vercel(原名 ZEIT) | - 最广为使用、最受好评的静态网页托管平台(小样本统计)`
`- 服务功能齐全,内置网页模板、自动更新部署、自定义域名、SSL 证书等一样不少 | - 全英文界面,有一定阅读门槛 `
`- 在国内访问有时候会被墙,需要绑定自定义域名加快速度 | +| Netlify | - 和 Vercel 功能相似,具有较为充足的免费额度 `
`- 在国内速度比 Vercel 稳定 | 似乎会抽风,当然可能是当初我没用对(见[记Netlify DNS抽风的处理](/netlify-not-working)) | +| GitHub Pages | - 和 GitHub 高度集成 `
`- 自带一个 `<你的用户名>.github.io` 域名 | - 只能部署一个项目 `
`- 国内访问慢 | +| Gitee Pages | - 和 GitHub Page 很相似 `
`- 国内平台,中文友好,国内速度快 | - 仓库容量限制较紧 `
`- 国际化上可能有一点困难(我猜的) | + +此外还有 Zeabur,腾讯 Coding Pages,CloudFlare Pages 等,不做介绍了。 + +我们下面会以 Vercel 为例进行讲解。 + +> 如果你想使用 GitHub pages 或者 Gitee pages 来省一个域名的话,那么后续的 Twikoo 评论等推荐使用 Netlify 进行部署。 + +### Vercel 部署项目流程 + +我们先来简单科普一下,怎么在 Vercel 上部署项目。 + +#### 注册账号 + +[这里](https://www.vercel.com)是 Vercel 的官网,我们先注册一个账号,选择用 GitHub 登录,计划选择免费计划(hobby)即可。后面可能会将 Vercel 的 application 整合到你的 GitHub 里面。访问权限推荐使用限制访问需要部署的仓库。后续需要访问其他仓库的时候,只需要在部署选择仓库时,随便打几个字母进行搜索,然后点击详情页的配置 GitHub 即可。 + +![](https://img.viento.cc/IMG-20240218153014.webp) + +#### 部署新的项目 + +注册完成以后,我们会进入你的项目列表,点击右上角的 add new,下拉菜单选择 project。 + +进入后,选择需要导入的 GitHub 库,如果没有其他部署要求,直接点击 deploy 即可。 + +然后耐心等待,出现 Congratulations 页面就算成功了。 + +#### 环境变量 + +环境变量这个事说起来很复杂,就理解为给项目提供的配置信息就可以了。环境变量的添加在 Environment Variables 下拉栏中,直接填进需要的名称和值就好。 + +对于已经部署的项目,可以在 Settings-Environment Variables 中添加新的环境变量,然后在 Deployments 中选择最新一次部署右侧的三个点,进行 redeploy(重部署)即可生效。 + +![](https://img.viento.cc/IMG-20240218153014.png) + +## IP 地址,域名和 DNS 解析 + +### IP 地址 + +OK,场地有了,大家上哪里去找你呢? + +在现实世界中,每一个地方都有地址;在网络世界中,地方被服务器、设备等代替,而与之相关的概念就是 IP 地址。 + +关于 IP 地址大家不需要了解很多,只科普一个问题:公网 IP 和内网 IP。公网 IP 指的是可以在网络任何位置访问的 IP,是公开的;而内网 IP 只能在内网 (比如局域网)中访问。举个栗子:如果我的网站的 IP 在我家的局域网里,如果我在外面想访问这个 IP,那可就难喽,还得搞内网穿透云云。这就好比你的房子外面有一圈围墙,别人进不了。这墙不是你建造的,是地产开发商 (网络服务商,比如联通和移动)建造的。当然,你可以去找服务商,让他们帮你开个门 (给你分配一个公网 IP), 这个我没试过,不过据说也挺麻烦。这也是上面我建议,买服务器最好还是用大厂的云服务器。 + +此外还有一个概念叫“端口”,代表服务器、设备分发信息的出口,可以理解为一个街区的不同建筑或者一座楼的不同层这种具体地址。 + +### 域名 + +其实有了 IP 之后,理论上我们就可以通过 IP + 端口,在导航(浏览器的地址栏)中直接输入这串地址进行访问了。 + +那域名又是什么鬼?为什么我们平时很少直接输入 IP + 端口访问网站? + +好,想象你想去一个地方,你接收到的地址是:39.987036276383016, 116.30598118567697。 + +![|500](https://img.viento.cc/emoji/EMJ-confused.webp "黑人问号.webp") + +但假设你接到的是: + +中国北京市海淀区颐和园路 5 号 北京大学 + +这是不是就好多了 ~~(虽然给了这个往往还是找不到)~~?而且也更便于记忆。 + +IP 和域名的关系就类似于这样. IP 一般都是: `xxx.xx.xxx.xx` 这一串数字,而域名一般是一串自然语言的字符,比如 。这样不仅易于记忆,而且更有标识性。 + +域名是有层级的,顶级域名(TLD)是指具有“网站名称+顶级域名”后缀形式的域名,而二级域名 (SLD)就是具有 "网站名称+顶级域名+顶级域名后缀"形式的域名,比如 `xxx.github.io`,再比如复旦大学的官方网站 。[^1] + +#### 域名后缀推荐 + +综合来看,我还是推荐 `.com` 域名,其次是 `.org` 和 `.me`。 + +购买域名可以在国内的域名注册商处购买,例如阿里云、腾讯云、华为云等;也可以在国外的 Dynadot、Namesilo、GoDaddy 购买。如果你有能支付 USD 的账户,可以用[哪煮米](https://nazhumi.com/)等比价网站找一个最合算的网站。 + +我个人用的是 Dynadot,支持中文和支付宝,价格还算比较合理,WHOIS protection(防止他人查到你购买时的隐私信息)等服务也都有。 + +[这里](https://www.dynadot.com/zh)是 Dynadot 的中文官网,买域名的过程我就不赘述了。 + +此外 + +顺便放一个查域名时的逆天彩蛋: + +![](https://img.viento.cc/IMG-20240218153014-1.webp "都够买套房了()") + +#### 备案 + +我们常常听到备案这个词。备案是个很广泛的概念,主要包括网站备案,域名备案,ICP 备案等。我们通常说的都是 ICP 备案。 + +ICP 备案是个很复杂的问题,但是如果使用我推荐的配置,那我们就可以省去备案的麻烦了,因为 Vercel,Netlify,CloudFlare 这些都是国外的企业。 + +## DNS 解析服务 + +在现实生活中,经纬度和自然语言地址的绑定依赖于约定俗成的规则,而在互联网中则依赖于一种特殊的互联网服务——DNS(Domain Name System,域名系统)解析服务。 + +关于 DNS 的具体知识我们不多介绍,大家知道这玩意必须得有就完事了。 + +大部分域名注册商都会提供免费的 DNS 解析服务,但是我更推荐大家使用一个第三方服务—— [CloudFlare](https://www.cloudflare.com)。 + +Cloudflare 是一家提供全球性网络安全和性能优化服务的科技公司,在互联网服务等领域处于世界领先地位。CloudFlare 提供的 DNS 解析服务非常优秀,更可贵的是这项服务有免费计划,对个人博客来说足足够用。此外,CloudFlare 还为站长和开发者们提供了大量的免费服务,堪称互联网超级大善人。 + +注册账号之后,进入 CloudFlare 的仪表板(dashboard)界面,在左侧选择网站,点击右侧的添加站点,输入你的域名。 + +然后会出现一个“更改名称服务器”的提示,把那两串字符复制下来,回到你的域名注册商(我还是以 Dynadot 为例),在账户界面点击我的域名-管理域名,在需要更改的域名那一栏中点击 DNS 设置。 + +![](https://img.viento.cc/IMG-20240218153014-2.webp) + +然后在“服务器”下拉选项中,去掉 Dynadot 默认的域名解析服务器(我记得是有的),选择输入新的名称服务器,将你复制的那两个地址填进去,保存。 + +然后等一段时间,当 CloudFlare 的仪表板中显示“有效”的时候,就说明域名已经成功被托管到 cf 上了。 + +![](https://img.viento.cc/IMG-20240218153014-3.webp) + +> 一定一定要把所有 CloudFlare DNS 的那个 CDN(橙色云朵)关掉! + +### A 记录和 CNAME 记录 + +这是两种 DNS 记录。简单来说 A 记录就是把域名指向 IP 地址,而 CNAME 记录主要是把一个域名指向另一个域名。 + +在我们的建站过程中 A 记录一般只需要添加一个(指向 Vercel),CNAME 则一般是用于分发二级域名的。 + +关于这两种记录的设置可以参考 [Vercel绑定自定义域名 | NotionNext文档 (tangly1024.com)](https://docs.tangly1024.com/article/vercel-domain)。尽管说和我们的项目不同,但是方法基本一样(打字真的太累了 QAQ)。 + +终于写完了,手都要敲麻了 QAQ。 + +下一期(主体步骤)可能要鸽不短的时间了,因为我想给大家做个开箱即用的库,可能得等到新电脑到了才方便点。 + +[^1]: www 是一个特殊的二级域名 ,代表万维网(world wide web)标准网页。由于互联网发展史上的一些习惯,`www.example.com` 和 `example.com` 通常被视为紧密关联的一对域名。例如,`google.com` 会自动跳转到 `www.google.com`,而 `www.github.com` 被设置为跳转到 `github.com`。因此,这里给出的域名严格来说是一个**三级域名**。此外,开头的 `https://` 并不是域名的一部分,它代表网站使用了 SSL/TLS 加密协议,which we will discuss later。 diff --git a/content/posts/百草园/Twikoo更新惊魂.md b/content/posts/百草园/Twikoo更新惊魂.md new file mode 100644 index 0000000..78836d9 --- /dev/null +++ b/content/posts/百草园/Twikoo更新惊魂.md @@ -0,0 +1,89 @@ +--- +slug: twikoo-update-shock + +summary: 抽象的 Twikoo 更新 +tags: + - Twikoo + +title: Twikoo更新惊魂 +date: 2024-07-11 +description: 本文介绍了Twikoo评论系统更新导致评论丢失,作者尝试重新部署并成功恢复评论,但未备份数据。作者决定重新创建数据库并导入新的评论,并增加多数据库备份。 +categories: ["百草园"] +featuredImage: https://img.viento.cc/cover/twikoo-update-shock-cover.webp +draft: false +--- +各位老友们好,我是 Chlorine。 + +今天讲一个挺抽象的事,就是关于 Twikoo 评论的更新。请做好血压飙升的准备。 + +## 前言 + +Twikoo 这个评论系统我从建站开始就开始用,美观,功能强大,(大部分时候)省心,而且开发者 [iMaeGoo 大佬](https://www.imaegoo.com/)也一直在尽心尽力地维护。这大半年下来,也攒了一百多条评论了,也是我这个小破站的珍贵回忆呐。 + +我的 Twikoo 有两个云函数,一个在 Vercel 上,一个在 Netlify 上。本来用的是前一个,后来秉持着服务都堆到副域名的原则换成了后一个。反正数据库都是那一个,换个域名有什么大不了的。 + +*记住这句话(咬牙切齿)* + +## 左思 + +*注:这个标题是谐音* + +今天看到 Twikoo 更新了,于是打算更新一下。只不过 Twikoo Netlify 的更新实在是有点抽象,不管是把 `package.json` 的版本号改成 `latest` 还是 `1.6.38` 都不好使。我甚至顺手去提了个 issue。 + +然后,我就想到了一个让我想打自己的主意:那我重新部署不就行了? + +火速删除项目,导入仓库重新部署…… + +我记得 Twikoo 得有个环境变量 `MONGODB_URI` 来着?应该填多少呢? + +坏了,我不知道。刚才删除得太着急,忘记复制了。我记得 Vercel 的那个似乎和这个不是一个数据库?应该存的是旧版的数据,没有用。 + +这应该不是什么大逝,去 MongoDB 重新创建一个 user 就完事。期间顺带着喜提几个 function crash,经过检测是 MongoDB 的 Network Access 没配置泛播可见。 + +然后 redeploy,云函数运行正常,美滋滋。 + +喜滋滋地去网站上看一圈……这怎么需要注册?重设密码了? + +行吧,重设就重设。点进去…… + +**不是,我评论呢?怎么全没了?!** + +![震惊.webp](https://img.viento.cc/emoji/EMJ-pom_shocked.webp) + +## 抢救 + +这属实是吓了我一跳。这怎么换个字符串啥也没有了? + +注:后来看到了 Twikoo 官网的备注: + +> 连接字符串包含了连接到 MongoDB 数据库的所有信息,一旦泄露会导致评论被任何人添加、修改、删除,并有可能获取你的 SMTP、图床 token 等信息。请妥善记录这一字符串,之后需要填入到 Twikoo 的部署平台里。 + +好像有点合理,但是又不合理…… + +事不宜迟,赶紧想招。我没有 `twikoo_comment.json` 的备份,唯一可能的方式就是通过 MongoDB 直接导出。我有导出 MongoDB 数据的经验,但是现在 Windows 备用机不在手中,只能硬着头皮用 MacBook 导出。 + +看一下 MongoDB 的数据量,看起来很正常,一百多兆呢(我真傻,真的。Twikoo 的数据基本都是文本,怎么可能有这么大的数据量?后来我看了新的 MongoDB 后端面板,我这些评论加在一起只有 156kb,那也就是说我需要十几万条评论才可能达到这个量……这都是后话了)。这也使我成功地忽略了侧边栏显示的那一堆奇怪的 collection。 + +然后,自然是没有然后啊。MongoDB Compass 啥也导不出来,MongoDB Atlas CLI 倒是一次成功了,但是导出的是空的(我真傻,真的,我早该想到的,前端面板都看不见,MongoDB 怎么可能有有效数据?)。 + +> 事已至此,先吃席吧。——我的微积分助教 PWK 学长 + +然后我就摆烂了。算了,丢了就丢了吧。大不了从头再来,还可以趁机换个评论系统(此处容我吐槽一下,Twikoo 的加载慢得不像人)。 + +然后我又回到了我忠诚的本地环境。想着反正都丢了,不如试着把 envID 换成原本那个域名,里面还留着一些评论,还能损失最小化。反正情况也不可能再糟糕了。 + +`make` 构建,在浏览器里面预览……然后,奇迹发生了:**我的评论全回来了**。 + +原来,事实上,我的两个云函数共享着同一份数据库。言语已经不能形容我此刻的心情了。 + +> 多中心备份配享太庙! + +## 后续 + +其实到这里故事已经可以结束了,我只需要把 Vercel 云函数的环境变量扒下来就完事。但是我打算再走一步。 + +我重新开了一个 project,创建了一个新的数据库。这次的字符串我拷贝了下来,存到了我的 `tokens.csv` 里面。然后部署 Netlify 云函数(顺带着又喜提几个 function crash)。然后打开前端面板,导入我新下载的 JSON。 + +这一方面算是多数据库备份,另一方面,我希望调几个数据,而 Twikoo 的前端导入功能有时候不太好使,不能覆盖。所以干脆导入一个白板里面。 + +由于 Twikoo 的面板配置存在连接字符串里面,因此我需要再配一遍。这倒不是麻烦事。期间我还注册了新的机器人邮箱,以后大家就可以接到这个小助手的邮件通知啦(我本来想用 outlook,奈何实在是不给力,一直 SMTP error,一点招没有)。 diff --git a/content/posts/百草园/咦,我的按钮呢?.md b/content/posts/百草园/咦,我的按钮呢?.md new file mode 100644 index 0000000..60d9670 --- /dev/null +++ b/content/posts/百草园/咦,我的按钮呢?.md @@ -0,0 +1,103 @@ +--- +slug: eh-where-is-my-button + +summary: 好有趣的一个意外呢 +tags: + - 博客 + - 折腾 + +title: 咦,我的按钮呢? +date: 2024-10-09 +description: 本文讲述了作者在维护博客时发现返回顶部按钮消失的趣事。最初怀疑是 Swup 插件的问题,但经过本地测试和调试后,发现按钮实际上存在于 HTML 中,只是被 CSS 隐藏了。进一步检查后,发现是广告屏蔽插件 uBlock Origin 误将按钮的类名当成广告或恶意链接的一部分隐藏了。最后,作者通过更改按钮的类名和 ID 解决了问题,并为此取了一个更具趣味性的名字,以避免未来被误识别。 +categories: ["百草园"] +featuredImage: https://img.viento.cc/cover/eh-where-is-my-button-cover.webp +draft: false +--- + +各位老友们好,我是 Chlorine。 + +今天讲一件维护博客时遇到的趣事。本来想着周末更周报一起更了,但是想了想还是想水篇文章,~~拦不住的小氯酱呢~~。 + +园子的首页有一个 back-to-top 的按钮,继承自恐咖兵糖大佬的 Landscape 主题,一个蛮人性化的组件。由于这个组件实在是太简单了,因此我一直没多管。 + +不过,今天我在园子闲逛时,突然发现按钮不见了。 + +![|500](https://img.viento.cc/emoji/EMJ-confused.webp "黑人问号.webp") + +原本以为又是 Swup 的锅(~~Swup:能不能别什么事情都怪到我身上~~),结果刷新了几次都没有反应。 + +嗯? + +赶紧回到本地跑构建,结果发现按钮是正常的。 + +这就很奇怪了。`⌘ + ⌥ + I` 打开控制台,调试启动。 + +首先扔一串 JavaScript,看下这个元素还在不在。 + +```js +const element = document.getElementById('back-to-top-btn'); +if (element) { + console.log('Element with id "back-to-top-btn" exists:', element); +} else { + console.log('Element with id "back-to-top-btn" does not exist.'); +} +``` + +结果是在的,这至少说明 HTML 没问题。 + +定位到查看器……为什么这个 HTML 是灰色的? + +再看一会儿旁边的样式表……我的 `lg-block` 怎么被覆盖了? + +赶紧去翻找,结果发现了一个神秘规则: + +```css +.w-full > .banner.el-carousel, .grid > .container > #aside-promotion, .flex-row > #propagandaLeft, .flex-row > #propagandaRight, .link > .image[src*=".qhimg.com/"], .back-to-top-wrapper, #back-to-top-btn, .back-to-top-btn { + display: none !important; +} +``` + +嗯?这都是一堆什么?我不记得我有这个 CSS 规则啊? + +再一看文件名,好家伙,这家伙直接把文件内容当成名字了。 + +去样式编辑器看看,不看不知道,一看吓一跳,这里面有一大堆 CSS,而且含有大量的链接。虽然不知道那是什么,但是一看其中的某些链接就不是什么好早餐饼干,具体是什么我就不说了,免得园子被请去喝茶。 + +小氯瞬间不淡定了。这该不会是什么注入攻击吧? + +赶紧去排查 JavaScript,但是刚刚排查了几个文件,小氯突然想到了一个关键的问题:**这一大堆东西,好像都被设置了 `display: none;` 啊?** + +让我仔细看看。那个 CSS 极长,里面有一大堆的东西,像什么 `a[href="/e/member/register/index.php?tobind=0&groupid=1"]`,什么 `a[onclick$="'clicked', 'ad');"]`,一堆不可描述的网站,还有一些~~牢朋友~~老朋友,比如说 Google 和 Facebook。 + +> Suddenly, at that very instant, I had an epiphany. + +既然这个 CSS 费这么大劲把这些东西设置成了不可见,而且这些看起来似乎是广告和恶意链接,那这**会不会是我的广告屏蔽插件?** + +赶紧把 uBlock Origin 关掉,结果按钮显示出来了。 + +破案了,就是因为这个按钮的类名字起得不太好,所以被 uBlock Origin 误杀了。 + +那接下来的事情就好办了,回去改个类和 ID 名即可。这里小氯也搞了点小小的趣味: + +```html +
+
+ +
+
+ +{{ with resources.Get "css/addon/b2t.css" }} + +{{ end }} + +{{ with resources.Get "js/b2t.js" }} + +{{ end }} +``` + +起一个比较萌的名字,一般就不会被误伤了呢 ヾ(≧∇≦*)ゝ + +~~Grok 甚至建议我起名为 `rasengan-btn`~~ diff --git a/content/posts/百草园/园子装修日志.md b/content/posts/百草园/园子装修日志.md new file mode 100644 index 0000000..065e8b3 --- /dev/null +++ b/content/posts/百草园/园子装修日志.md @@ -0,0 +1,231 @@ +--- +slug: yuanzi-decorating + +summary: 不知新装修的效果,各位老友是否满意呢?OωO +tags: + - 博客 + - 邮箱 + - 折腾 + - Info酱 + +title: 园子装修日志 +date: 2024-08-05 +description: 本文讲述了作者对博客进行的一系列创意改进,包括友链页面的重塑、设计有趣的入住须知、配置域名邮箱、创建名为Info酱的评论通知小助手等。作者以轻松幽默的口吻分享了装修过程中的思考和经验,展现了对博客优化的热情,同时也为读者提供了一些有关博客个性化的实用建议和灵感。 +categories: ["百草园"] +featuredImage: https://img.viento.cc/yuanzi-decorating.webp +draft: false +--- + +各位老友们好,我是 Chlorine。Hello from ShenZhen. + +本期唠唠闲磕,讲讲最近给园子装修的事情。 + +## 友链页面重写 + +起因是我看到了[广树大佬](https://www.wikimoe.com)和[小智大佬](https://www.chitudexiaozhi.com/)的友链页面,感觉很有意思。这个友链页面叫作「女子寮」(中文:女生宿舍)。 + +> 更正:事实上应该是从广树大佬的友链一路看过去的,感谢广树大佬的更正 OωO + +嗯,友链嘛,不就是赛博邻居吗?很合理啊(只是我很好奇,这样男生还能申请友链吗?)。 + +下面这张图是[北熙大佬](https://blog.beixibaobao.com/page/link)的友链页面申请须知的一部分,我看完觉得更有意思了。 + +![|578](https://img.viento.cc/IMG-20240804230255.avif "还有房间类型") + +正好我这几天对于独博有了一些别的不成熟的感触(见[我的上一期周报]({{< relref "Ephemeralis-Weekly(4):缝隙之间.md" >}})),于是我动了借(chāo)鉴(xí)的念头。 + +## 装修友链页面 + +我打算直接照抄大佬们的创意。当然不能叫女子寮,小氯喜欢起一些比较莫名其妙的名字,于是随手看着自己算出的题目结果,起了一个「Residencia 0x001B」。 + +我在高铁上花了一点时间,写了一个新的友链界面须知。大家可以在公寓的公示板([这里](/links))查看完整的公示内容,另外,也欢迎老友们入住 OωO + +### 房间号 + +公寓的所有房间都是相同的,因此不存在房间种类的问题。不过房间号倒是可以搞一个。 + +目前列出来的老友们的房间号大都是随机写的,如果有老友希望换房间,请尽管留言。 + +此外我在想,等将来友链多了,是不是可以做一个页面,展示为一个楼层示意图,在每一个「房间」真的放上老友们的头像?我觉得是个不错的主意,但是目前友链还太少了。 + +### 申请 + +目前友链的申请依赖于 Twikoo 评论区(叫 Twikoo 娘也不是不行 OωO)或者直接发邮件。我在想能否做一个在线表单?直接填写即可,每收到一个就给我发邮件。 + +理论上完全可行,用 CloudFlare 一把梭(Pages+Workers+D1+R2+KV+Turnstile)应该不需要费很大力气。很不幸,我不会 JavaScript,也不熟悉前端。 + +~~那你还在这不需要费很大力气~~ + +## 配置域名邮箱 + +其实我一直对域名邮箱没什么大兴趣。主要原因是即使是域名邮箱,大部分都也是依靠免费的企业邮箱服务的,本质上除了彰显个性之外似乎也没什么好的地方。至于自建邮件服务器,我目前还没那个资源。 + +~~才不会告诉你们是因为我不知道前缀用哪个~~ + +事情的转机完全是因为一个毫不相干的事情:Twikoo 邮件通知模板。洪哥([张洪Heo大佬](https://zhheo.com))分享了一个 Twikoo 评论的模板(看[这里](https://blog.zhheo.com/p/169a1abb.html)),于是我也动了 DIY 的念头。在 ChatGPT 的帮助下,我写了一个还算好看的模板。 + +写完模板之后我的思路开始活跃:那通知的口吻是不是也可以改一改?不用那么冰冷的口气? + +于是在一顿 brainstorm 后,园子的提醒小助手——可爱的 Info 酱(Infochan)诞生了。目前 Info 酱还没有一个准确完整的人设,欢迎各位喜欢 ACGN 的老友们提出您的高见(拜托了 qaq)。 + +顺便放一下我的代码,大家自行取用,想看详细 DIY 信息的可以去看洪哥的博文。 + +```html + + + + + + Info!「${SITE_NAME}」 评论通知 + + + +
+
+ Site Logo +

「${SITE_NAME}」 评论通知

+
+
+

Hi there!

+

这里是 「${SITE_NAME}」 的小助手 Info 酱。您在园子里的评论收到了新的回复!下面是一些细节:

+
+

${PARENT_NICK} 说:

+

${PARENT_COMMENT}

+
+

${NICK} 回复:

+

${COMMENT}

+
+ 查看评论 +
+ +
+ + +``` + +效果大概是: + +![|425](https://img.viento.cc/IMG-20240804234219.avif) + +然后我就想:那是不是应该给可爱的 Info 酱一个有标识性的邮箱?(`无止境的折腾.avif`) + +行。我觉得,`infochan` 这个前缀应该不会很抢手,我只需要又双叒叕注册一个邮箱就可以了。 + +但是我不想了。我觉得,是时候给这个园子一个真正的域名邮箱了。 + +我首先相中的是 Lark(飞书国际版)。没有发现成员数目限制(也有说是 50 人的,反正是肯定够了),每天邮件上限 450 封/人,成员共享 200G 的邮箱空间。最重要的,我对这个~~破~~软件的印象还可以。 + +注册过程还算顺利,注意配置全局网络就可以。然后按部就班地加 DNS 记录就可以了。不过邮箱设置需要下载飞书客户端,有点难绷,毕竟一个软件就有 1.2G(macOS)。 + +然后这个故事就不出意外地出意外了。我的 Twikoo 邮件通知始终无法配置,一直显示 535,非常难绷。 + +然后我只能放弃。毕竟我现在还在深圳实地调研,也没时间和这个东西硬刚。 + +后来我又试了下套路云的免费企业邮箱,支持 50 个用户,每个用户 5G 空间。~~没想到套路云还有这种羊毛可以薅~~。这次的体验倒是很好,没有出任何岔子。只需要注意一点:在配置 Twikoo 评论的时候,「用户名」一定要把后缀也带上,不然又会报错。(不知道之前飞书的报错能不能用这个方法解决) + +现在我用套路云的企业邮箱注册了我的个人邮箱(me)、Info 酱的邮箱(infochan)和一个 Git 提交邮箱(git),由于服务器在国内,速度非常可观。cons 可能就是需要绑定手机号,以及国内大厂对于用户隐私的良好尊重了。 + +反正目前我用着还行,这个羊毛能薅一天是一天,实在不行转战飞书+Mailgun 或者 Mail Ru,天下这么大,总会有白嫖怪的容身之地的(bushi)。 + +## 结语 + +兜兜转转也算是简单把园子装修了一下。以后再继续慢慢装,反正我离敲不动键盘还剩好多年呢。 diff --git a/content/posts/百草园/园子装修日志(2).md b/content/posts/百草园/园子装修日志(2).md new file mode 100644 index 0000000..b18fddb --- /dev/null +++ b/content/posts/百草园/园子装修日志(2).md @@ -0,0 +1,327 @@ +--- +title: 园子装修日志(2) +slug: yuanzi-decorating-2 +date: 2024-08-21 + +summary: 今天食堂又做(酸菜)鱼了呢,小氯刚刚摸的。 +description: 本文记录了作者最近优化 Hugo 博客的过程,包括优化 GitHub 卡片、重构 CSS 和侧边栏等。优化包括样式、API 逻辑、错误处理等,重构 CSS 采用 SCSS 方法,导入特定页面样式。侧边栏优化了公告、目录、移动端显示和图标,使得代码结构更加整洁。 +categories: ["百草园"] +tags: + - 博客 + - 折腾 + +featuredImage: https://img.viento.cc/cover/yuanzi-decorating-2-cover.webp +--- +各位老友们好,我是 Chlorine。继续水文,讲讲这几天摸鱼的经历。 + +准确来说应该是我能记得的经历,因为我记性一向不好,而且这几天的 Git commit 也异常多: + +![630](https://img.viento.cc/IMG-20240821195307.avif "还没算我写文章的时候没提交的") + +## 优化 GitHub 卡片 + +这几乎是我的每日任务了。由于 GitHub/GitLab/Codeberg 的卡片基本上是一样的,所以说一优化可以优化三次,三倍业绩,三倍快乐,~~改 bug 也是三倍快乐~~。 + +这次的优化很多,包括但是不限于: + +- 样式打磨,我的目标就是 Vercel/iOS18 的风格~ +- API 逻辑改写,更多地使用 Hugo 模板 +- 错误处理完善 +- 使用 license 映射来改进显示 +- 自动截断过长的描述 +- 图标更改,采用 Simple Icons 的 GitLab/Codeberg 图标 +- 去掉父元素的 `` 标签,改良整体样式和点击容错性 + +此外,我在之前的老朋友 Blowfish 主题那里闲逛的时候发现他们加了 Gitea 短代码,无论谁在写 Hugo shortcode,我小氯都要帮帮场子。直接加上。Gitea 和 Codeberg 的逻辑基本上一样,毕竟 Codeberg 就是基于 Gitea 的。 + +顺便说一句,我发现我犯了个非常执杖的错误,就是我已经用 `resources.GetRemote` 获取 API 的数据了,我居然用 JavaScript 又获取了一次。 + +## refactor CSS + +闲着没事去主题原型 Hugo landscape 的仓库看了看,发现恐咖兵糖大佬把 CSS 重构了一下。正好我也一直被无法正确导入 CSS 困扰,于是就动手开始 refactor 了。 + +我原本的文件结构大概是: + +```txt +. +├── css +│ ├── addon.css +│ ├── algolia(almost of no use) +│ │ ├── algolia_dark.css +│ │ └── algolia_light.css +│ ├── base.css +│ ├── normalize.css +│ ├── tailwind.css +│ └── whisper.css +├── js ... +├── json ... +└── style.css +``` + +其中 `style.css` 是 UnoCSS 自动构建生成的,而我的几乎所有魔改 CSS 都堆在 `addon.css` 中,看着很难受,维护起来也不方便。 + +重构代码时我选择了恐咖兵糖大佬使用的 SCSS 方法:在文件夹中创建 SCSS 索引文件,然后在 `css.html` 中直接用 Hugo 来解构 SCSS 得到 CSS 导入。一顿拆分重组后得到了: + +```txt +. +├── addon +│   ├── algolia.css +│   ├── fonts.css +│   ├── friend.css +│   ├── index.scss +│   ├── others.css +│   ├── twikoo.css +│   └── whisper.css +├── base +│   ├── base.css +│   ├── index.scss +│   ├── normalize.css +│   └── tailwind.css +├── main.scss +├── test.txt +└── uno.css +``` + +此外,对于一些只在特定页面生效的 CSS 文件(例如 `whisper.css` 只在《碎语》页面生效),我们直接在页面进行导入,避免不必要的开销。 + +```html +{{ with resources.Get "css/addon/whisper.css" }} + +{{ end }} +``` + +## 侧边栏优化 + +在我看来,侧边栏是个相当重要的页面元素。我在侧边栏堆了公告(Announcement)、目录(TOC)、分类(Categories)和标签(Tags)。在移动端,它们会显示在主体卡片的下方。 + +### 目录 + +这个目录改得我几乎红温。我原本是直接采用 Hugo 的 `{{ .Page.TableOfContents }}` 模板,但是其样式令人一言难尽。而且可能是因为 Swup 的原因,目录是没办法随着文章同步更新的。于是,在深思熟虑后,我决定暂时将其去掉。 + +> 《fix bug by removing the feature》 + +### 公告 + +公告组件是我比较看重的东西。我采用的是在 Hugo 配置文件相应选项开启的情况下,直接读取 `content` 下的 `announcement.md` 进行展示。其功能比较完善,但是样式看起来并不好看。 + +我去查了些资料,找到了一个名为 prose 的布局,经过实验看起来还不错。所以就改成了这样: + +```html +
+ {{ $announcement := .Site.GetPage "announcement" }} + {{ with $announcement }} +
+
+ {{ .Content | markdownify }} +
+
+ {{ end }} +
+``` + +### 移动端隐藏组件 + +我感觉,移动端很少有人会去专门翻最下面的 categories 和 tags,所以我干脆直接把它们 `hidden md:block` 了。这样最下面就是 profile 和 announcement 了。 + +### 图标 + +从页面的元素选择上,各位老友应该可以看出,我非常喜欢 UnoCSS 的矢量图标,尤其是 IBM 的 Carbon Icons 系列。 + +所以我打算给侧边栏的组件加图标。这个不算难,一个 `flex` 布局,再把图标和标题套在一起就可以了。 + +```html +
+ + Categories +
+``` + +加个边距看上去好看。 + +我用的图标分别是: + +```html + + + +``` + +### partial 化 + +我原本的组件样式大部分是写在 `sidebar.html` 那里的。但是这样让 `sidebar.html` 看起来很不整洁,所以我把大部分的代码都移动到了相应的部分代码(partial)中。 + +```html +{{/* sidebar.html */}} + + +``` + +可以看到基本上是一个模子刻出来的,形成可复用打法了属于。 + +### 折叠展开 + +此外还写了个折叠展开的代码。但是感觉现在的 tags 和 categories 都不是很长,因此就没真正加上。 + +## Hello,109chan + +> 《hello 宇宙最新力作》 + +### 前言 + +熟悉博客圈的老友应该知道一个著名的工具:[TianliGPT](https://postsummary.zhheo.com/)。这个工具来自洪哥([张洪 Heo](https://blog.zhheo.com/))和 Tianli,是个自动生成博客文章 AI 摘要的工具。对于希望在听故事之前简单了解其脉络的老友来说是个很好的补益。 + +问题是:这个工具收费。虽然不贵,但是以小氯的节俭程度,还是不太舍得花这个钱的。 + +~~那你买域名的时候怎么一点也不节俭啊喂!~~ + +于是我就开始想替代方法。很巧,在之前写 Java 大作业的时候,我们有一个 feature request 就是 AI summary(用大模型的 API 生成新闻摘要)。虽然小氯没用过 API,但这个部分的思路大概还是很清晰的。最后实现得非常好,除了学校给的 API SDK 居然不能用,必须 HTTP,害得我和热心的答疑大佬调了半个下午。 + +于是我想按照这个思路做一个 AI 摘要。不过,我不太熟悉怎么在 Hugo 里面用数据库,而且我的 API 只有几千万 token 的额度,我比较担心用完(~~你确定你能写这么多?~~)。 + +于是我又想到了薅 CloudFlare 的羊毛。用 Workers 做 JavaScript 运行时,D1 做数据持久化,Workers AI 做摘要。这个免费额度是绝对够的,唯一的问题是我不会。 + +穷途末路之下,我想到了我的好伙伴:Quail。 + +各位老友应该都知道,我的 newsletter 是通过 [Quail](https://quail.ink) 实现的,而 Quail 为每位创作者都免费提供 AI 摘要生成功能。这个摘要直接写在 Markdown 源文件的 YAML front matter 里面,是完全静态的,既不怕丢,也不用执行复杂的 API 请求和数据库调用。 + +那么,就是你了。 + +### 设计 + +由于只有 `content/posts` 中的页面需要加摘要,所以我们直接改动相应的 `single.html` 即可。位置我选择在封面图和正文之间。 + +先用 AI 搓个形: + +```html +
+
+ AI 摘要 + + + +
+ +
+``` + +然后我简单修了下,大概就是这样了: + +```html +
+
+
+ + AI 摘要 +
+
+ 109酱 + + + +
+
+
+ +
+``` + +移动端的点击放大我关掉了,因为看起来不太舒服。高斯模糊的手艺是跟 GPT 学的,本来想用 `var(--primary)` (就是我的博客那个一直在变化的主题色),但是不知道为什么没成功。 + +使用 `description` 字段可以保证其尽量都是 AI 摘要,`summary` 字段我比较喜欢用来扯淡。难绷的是 Quail 的标准 AI 摘要键是 `summary`,造成我需要手动改一下。已经和作者[歌词经理](https://quail.ink/lyric)反馈了,作者说会想办法优化一下。 + +嗯,你问为什么叫 109 酱啊?就不告诉你 (/ω\) + +## 更新依赖 + +npm 有 `package-lock.json`,pnpm 有 `pnpm-lock.yaml`,yarn 有 `yarn.lock`, Bun 有 `bun.lockb`,这充分说明了对于 JavaScript 包,锁定版本有多么重要。我曾经试着直接对 `theme/efimero` 的依赖进行更新,结果自然是必遭严惩,样式全都乱了。 + +最近闲着没事去 UnoCSS 的[官网](https://unocss.dev)的官网看了下,发现已经到 `0.62` 了,而我的依赖还是 `0.60` 左右。由于我非常喜欢 UnoCSS,并且确信自己会一直使用,于是我想着更新一下。 + +直接删除 `node_modules` 和 `bun.lockb`,然后把 `package.json` 的版本全改成 `latest`,直接一手 `bun i` 更新。 + +然后构建,不出意料出了很多错误: + +```txt +Failed to load custom icon "copy" in "carbon": TypeError [ERR_IMPORT_ATTRIBUTE_MISSING]: Module "file:///Users/chlorine/Dev/Hugo/themes/efimero/node_modules/@iconify-json/carbon/icons.json" needs an import attribute of "type: json" + at validateAttributes (node:internal/modules/esm/assert:88:15) + at defaultLoad (node:internal/modules/esm/load:133:3) + at async nextLoad (node:internal/modules/esm/hooks:746:22) + at async nextLoad (node:internal/modules/esm/hooks:746:22) + at async nextLoad (node:internal/modules/esm/hooks:746:22) + at async Hooks.load (node:internal/modules/esm/hooks:383:20) + at async handleMessage (node:internal/modules/esm/worker:199:18) { + code: 'ERR_IMPORT_ATTRIBUTE_MISSING' +} +``` + +看来是缺少一个导入类型。在询问 GPT 后,得知改动 `uno.config.ts` 中的导入部分为动态导入即可: + +```ts +import { defineConfig } from "unocss"; +import { presetUno } from "unocss"; +import { presetIcons } from "unocss"; +import { presetAttributify, presetTypography } from "unocss"; +import presetLegacyCompat from '@unocss/preset-legacy-compat'; + +import carbonIcons from '@iconify-json/carbon/icons.json'; +import mdiIcons from '@iconify-json/mdi/icons.json'; + +export default defineConfig({ + presets: [ + presetAttributify(), + presetUno(), + presetTypography(), + presetIcons({ + collections: { + carbon: () => carbonIcons, + mdi: () => mdiIcons, + }, + scale: 1.2, + warn: true, + }), + presetLegacyCompat({ + commaStyleColorFunction: true, + }) + ], + // ... +}); +``` + +## 结语 + +除此之外还有一堆优化,我们就不展开说了,像什么优化 Algolia Docsearch 样式之类的。静态博主都是装修爱好者,折腾就完了,把园子装修得漂漂亮亮的。 + +明天我考~~磕墓三~~科目三,考完之后我就要着手二次备案了。 \ No newline at end of file diff --git a/content/posts/百草园/在Hugo博客中正确渲染多行数学公式.md b/content/posts/百草园/在Hugo博客中正确渲染多行数学公式.md new file mode 100755 index 0000000..52bee6d --- /dev/null +++ b/content/posts/百草园/在Hugo博客中正确渲染多行数学公式.md @@ -0,0 +1,140 @@ +--- +title: 在Hugo博客中正确渲染多行数学公式 +date: 2024-02-20 15:10:45 +categories: ["百草园"] +tags: + - 折腾 + - Hugo + - KaTeX + - 博客 +summary: LaTeX,没了你我可怎么活啊 LaTeX +description: 本文介绍了为 Hugo 博客增加基于 KaTeX 的多行数学公式渲染的步骤,包括引入 JavaScript 和修改 Hugo 配置文件等步骤。作者指出,MathJax 能够原生渲染物理和化学公式,而 KaTeX 需要引入扩展包。 +slug: hugo-math-rendering +math: true +wikilinks: true +--- + +> [!IMPORTANT] +> 本文所述的方法已经过时,小氯推荐使用 Hugo 原生的 `render-passthrough.html` 处理公式。 + +--- + +各位老友们好,我是 Chlorine。本期可以说是建站教程的一个小番外,也是我迄今为止用时最短的一次折腾。 + +## 前言 + +作为学了一点点数学的学生,我对于在博客中插入数学公式还是有一定需求的,不仅是技术博客的刚需,有时候对于整活也是必要的。比如: + +$$ +\begin{cases} +x = \sin t, \\ +y = \frac{t \cos t}{2} +\end{cases} +\quad 0 \leq t \leq 2 \pi +$$ + +至于这个参数方程是什么含义,大家可以找个绘图工具,比如 Desmos 或者 Geogebra 试一下(doge)。 + +但是,就在我昨天发布第一条数学笔记的时候,我发现我的 KaTeX 迟迟无法正确渲染一些公式,例如 `\left\{`。刚开始我没太在意,随便试了几种方法,改正了就完事了。 + +但是今天,在我打出上面那串参数方程的时候,我突然发现,换行符 `\\` 没生效。 + +![|500](https://img.viento.cc/emoji/EMJ-confused.webp "黑人问号.webp") + +我不信邪,刚刚试了一下这个矩阵式的公式块: + +$$ +\mathbf{V}_1 \times \mathbf{V}_2 = +\begin{vmatrix} + \mathbf{i}& \mathbf{j}& \mathbf{k} \\[0.4em] + \frac{\partial X}{\partial u}& \frac{\partial Y}{\partial u}& 0 \\[0.4em] + \frac{\partial X}{\partial v}& \frac{\partial Y}{\partial v}& 0 \\[0.4em] +\end{vmatrix} +$$ + +发现也没正确渲染。 + +这可麻烦了,毕竟这学期的高代,上学期还没填的微积分和线代可都靠着多行公式环境活呢。 + +问了 GitHub Copilot 和 ChatGPT,都没得到什么有用的信息,遂一头问号大如斗,问号随风满地走。 + +再回去看那串没被渲染的公式,突然发现了奇怪的东西: + +**这换行符咋就剩下一个反斜杠了?** + +众所周知,反斜杠在 Markdown 中是转义符,双反斜杠在单纯的 Markdown 环境里会被解读成单反斜杠。会不会 KaTeX 和 Hugo 内置的 goldmark 渲染器冲突了?毕竟,我的 KaTeX 是自己加的,与原本的工程冲突也很正常。 + +于是前往收集信息,最终找到了解决方案。 + +## 引入 KaTeX + +如果你已经引入了 KaTeX,请跳过这一部分。 + +众所周知,Markdown 中输入数学公式靠的是 LaTeX,而 [KaTeX](https://katex.org/) 是一个轻量化的 LaTeX 公式渲染器。KaTeX 的本质就是一堆 js 和 CSS 文件,因此用 CDN 引入就好了。 + +在 `themes/<你的主题>/layouts/partials/head.html` 中加入这段代码即可: + +```html +{{/* KaTeX */}} + + + +``` + +这里的 CDN 可以替换,例如 jsDelivr 主站、Gcore jsDelivr 等。 + +## 设置 passthrough 插件 + +goldmark 有一个叫 passthrough 的插件,可以识别数学公式的定界符,使得多行公式的双斜杠免遭毒手。 + +在 `config.toml` 文件的 `markup` 下添加这段代码: + +```toml +[markup.goldmark.extensions.passthrough] + enable = true + delimiters.block = [ + ["\\[", "\\]"], + ["$$", "$$"] + ] + delimiters.inline = [ + ["\\(", "\\)"], + ["$", "$"] + ] +``` + +如果你使用的是 `config.yaml`,那么就添加: + +```yaml +markup: + goldmark: + extensions: + passthrough: + delimiters: + block: + - - \[ + - \] + - - $$ + - $$ + inline: + - - \( + - \) + - - $ + - $ + enable: true + +``` + +然后就可以正确进行渲染了~ + +## PS + +1. Hugo 官方推荐的方案与这里有所不同,如果你希望能使用 front matter 来控制渲染与否,可以参考[这里](https://gohugo.io/content-management/mathematics/)。 +2. 如果你有渲染物理/化学公式的需求,MathJax 会更好。KaTeX 需要再引入一些扩展包,我没那个需求,就不整了。 +3. 参考资料:[Hugo 数学公式支持 | Finley's Blog (f1nley.xyz)](https://blog.f1nley.xyz/post/hugo-math-support/) diff --git a/content/posts/百草园/如何为NotionNext Hexo主题添加文章封面图.md b/content/posts/百草园/如何为NotionNext Hexo主题添加文章封面图.md new file mode 100755 index 0000000..02b3f3b --- /dev/null +++ b/content/posts/百草园/如何为NotionNext Hexo主题添加文章封面图.md @@ -0,0 +1,135 @@ +--- +title: 如何为NotionNext Hexo主题添加文章封面图 +date: 2024-02-09 12:00:00 +categories: ["百草园"] +tags: + - 教程 + - 博客 + - Javascript + - NotionNext +summary: 为 NotionNext 的 Hexo 主题添加头图。 +description: 本文记录了作者为 Hexo 主题 NotionNext 添加文章详情页封面图的过程。受 Matery 主题启发,作者通过修改 PostHeader.js 文件,成功实现了封面图的显示,并调整了背景透明度和样式。为优化性能,作者还关闭了 Live2D 看板功能。最终,作者通过多次尝试解决了封面图加载问题,实现了美观的文章详情页设计。 +slug: how-to-add-header-img-to-notionnext-hexo +--- + +嗨,大家好,我是 Chlorine. + +先行给大家拜个年 🎉 晚上我会发完整的拜年公告的~ + +本期依然是寄术力不高的瞎折腾,内容是为 NotionNext 的 Hexo 主题文章详情页添加封面图。如果您是精通 JS 的大佬,请略过. + +在刚开始使用 NotionNext 的时候,我最喜欢的是 Matery 主题,有着很漂亮的 Hero 图和文章卡片。但是随着时间的推移,能显示作者介绍,整合类 Algolia 搜索的 Hexo 主题开始渐渐更得我心,更别提 Matery 每次进入文章页面文章内容还会灵性地左移一下,于是我把主题换成了 Hexo. + +但是我很快发现了一个问题:**Hexo 主题没有文章封面图**. + +容我解释一下: 文章卡片两个主题都是有的,但是在文章详情页,二者的表现有所不同: + +![](https://img.viento.cc/IMG-20240209120000-1.webp) + +![](https://img.viento.cc/IMG-20240209120000-2.webp) + +显然是有封面图显示更漂亮. + +而加封面图这种小事也不好意思去麻烦人家开发大大,于是我决定自力更生. + +我们进入 Github, 找到 `themes/hexo` 文件夹,这里就是 Hexo 主题的配置文件夹. + +我一向不喜欢 Hexo 显示 categories 的功能,因此在一顿试探之后,我发现了控制这个功能的代码,位于 `config.js` 中: + +```js +HEXO_HOME_NAV_BUTTONS: true, // 首页是否显示分类大图标按钮// 已知未修复bug, 在移动端开启true后会加载不出图片; 暂时建议设置为false。 +HEXO_HOME_NAV_BACKGROUND_IMG_FIXED: false, // 首页背景图滚动时是否固定,true 则滚动时图片不懂动; false则随鼠标滚动 ; +// 是否显示开始阅读按钮 +HEXO_SHOW_START_READING: true, +``` + +好好好,更有理由改成 false 了 🤣 + +我猜测,加入头图之后很可能加重加载负担,因此我把 live2D 的看板关了. + +在我们的中心配置文件 `blog.config.js` 中第 205 行左右的位置找到: + +```js +// 悬浮挂件 +WIDGET_PET: process.env.NEXT_PUBLIC_WIDGET_PET || true, // 是否显示宠物挂件 +WIDGET_PET_LINK: + process.env.NEXT_PUBLIC_WIDGET_PET_LINK || + 'https://cdn.jsdelivr.net/npm/live2d-widget-model-wanko@1.0.5/assets/wanko.model.json', // 挂件模型地址 @see https://github.com/xiazeyu/live2d-widget-models +WIDGET_PET_SWITCH_THEME: process.env.NEXT_PUBLIC_WIDGET_PET_SWITCH_THEME || true, // 点击宠物挂件切换博客主题 +``` + +把 `WIDGET_PET: process.env.NEXT_PUBLIC_WIDGET_PET` 那行改成 false 即可. + +下面正式进入魔改环节。作为不会 JavaScript 的小杂鱼,我采取的依然是魔改 Typora 主题时的方法: 瞪眼法. + +我仔细观察了整个 hexo 文件夹的结构,最后从名字上猜测 `components/PostHeader.js` 很可能与这件事有关. + +点进去,发现 21 行左右这块很可能和头图有关: + +```js +const headerImage = post?.pageCover ? post.pageCover : siteInfo?.pageCover + + return ( +