-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
31 lines (31 loc) · 22.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!doctype html><html lang=en dir=auto><head><meta name=generator content="Hugo 0.126.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>Kerolt's Blog</title>
<meta name=keywords content="Blog,Portfolio,PaperMod"><meta name=description content="ExampleSite description"><meta name=author content="Kerolt"><link rel=canonical href=https://kerolt.github.io/><meta name=google-site-verification content="XYZabc"><meta name=yandex-verification content="XYZabc"><meta name=msvalidate.01 content="XYZabc"><link crossorigin=anonymous href=/assets/css/stylesheet.2edfeca9d34e078680759fb7c19051e3f3bb07499f767238641a77451139a235.css integrity="sha256-Lt/sqdNOB4aAdZ+3wZBR4/O7B0mfdnI4ZBp3RRE5ojU=" rel="preload stylesheet" as=style><link rel=icon href=https://kerolt.github.io/%3Clink%20/%20abs%20url%3E><link rel=icon type=image/png sizes=16x16 href=https://kerolt.github.io/%3Clink%20/%20abs%20url%3E><link rel=icon type=image/png sizes=32x32 href=https://kerolt.github.io/%3Clink%20/%20abs%20url%3E><link rel=apple-touch-icon href=https://kerolt.github.io/%3Clink%20/%20abs%20url%3E><link rel=mask-icon href=https://kerolt.github.io/%3Clink%20/%20abs%20url%3E><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link rel=alternate type=application/rss+xml href=https://kerolt.github.io/index.xml><link rel=alternate type=application/json href=https://kerolt.github.io/index.json><link rel=alternate hreflang=en href=https://kerolt.github.io/><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><meta property="og:url" content="https://kerolt.github.io/"><meta property="og:site_name" content="Kerolt's Blog"><meta property="og:title" content="Kerolt's Blog"><meta property="og:description" content="ExampleSite description"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta property="og:image" content="https://kerolt.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E"><meta name=twitter:card content="summary_large_image"><meta name=twitter:image content="https://kerolt.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E"><meta name=twitter:title content="Kerolt's Blog"><meta name=twitter:description content="ExampleSite description"><script type=application/ld+json>{"@context":"https://schema.org","@type":"Organization","name":"Kerolt's Blog","url":"https://kerolt.github.io/","description":"ExampleSite description","logo":"https://kerolt.github.io/%3Clink%20/%20abs%20url%3E","sameAs":["https://github.com/kerolt","https://zhihu.com/people/kerolt","mailto:[email protected]"]}</script></head><body class=list id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><header class=header><nav class=nav><div class=logo><a href=https://kerolt.github.io/ accesskey=h title="Kerolt's Blog (Alt + H)"><img src=https://kerolt.github.io/apple-touch-icon.png alt aria-label=logo height=35>Kerolt's Blog</a><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)"><svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=https://kerolt.github.io/categories/ title=分类><span>分类</span></a></li><li><a href=https://kerolt.github.io/tags/ title=标签><span>标签</span></a></li><li><a href=https://kerolt.github.io/archives/ title=归档><span>归档</span></a></li><li><a href=https://kerolt.github.io/about/ title=关于我><span>关于我</span></a></li><li><a href=https://kerolt.github.io/search/ title="🔍 (Alt + /)" accesskey=/><span>🔍</span></a></li></ul></nav></header><main class=main><article class="first-entry home-info"><header class=entry-header><h1>Welcome to my blog! 👋</h1></header><div class=entry-content><ul><li>“再见是为了再次相见” —《EVA》</li><li>Hi,这里是我记录笔记的地方,如果你感兴趣,可以通过下面的方式找到我一起交流学习!</li></ul></div><footer class=entry-footer><div class=social-icons><a href=https://github.com/kerolt target=_blank rel="noopener noreferrer me" title=Github><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37.0 00-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44.0 0020 4.77 5.07 5.07.0 0019.91 1S18.73.65 16 2.48a13.38 13.38.0 00-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07.0 005 4.77 5.44 5.44.0 003.5 8.55c0 5.42 3.3 6.61 6.44 7A3.37 3.37.0 009 18.13V22"/></svg>
</a><a href=https://zhihu.com/people/kerolt target=_blank rel="noopener noreferrer me" title=Zhihu><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor" stroke="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m13.3334 3.60098v17.1471h1.79582l.75424 2.13703 3.18459-2.13703h3.93584V3.60098h-9.6705zm7.41375 14.87538h-1.79283l-2.24777 1.50849-.53276-1.50849h-.53875V5.94153h5.10911v12.53483h.00299zm-8.56906-7.18927H8.20334c.06285-1.34387.1287-3.12174.19754-5.17496h3.91788l-.00299-.24244c0-.01796-.00599-.43998-.06884-.87097-.06285-.44896-.19754-1.04457-.62854-1.04457h-6.5727c.13169-.61657.46991-2.08615.87995-2.80747l.19155-.33522-.3861-.02095c-.02394.0-.58663-.02694-1.23912.31726-1.06851.56868-1.5474 1.68807-1.75691 2.52612-.55072 2.18791-1.33489 3.70837-1.66712 4.35786-.09877.19155-.15863.30529-.18557.38311-.05387.14666-.02394.29332.0838.38909.31427.28434 1.14334-.0868 1.15232-.08979.01796-.00898.03891-.01796.06585-.02993.41603-.18856 1.64916-.74826 2.08914-2.52911h1.69705c.02095.96376.09278 4.14236.0868 5.17496H1.83715l-.06285.0449c-.69139.50582-.91288 1.8916-.92185 1.95146l-.0419.27536h4.99837c-.36814 2.34355-.79315 3.3941-1.01763 3.81313-.11074.20951-.21849.41902-.32025.62255-.63752 1.26306-1.29898 2.56802-3.7802 4.5973-.10775.0838-.20951.23944-.14367.41005.07183.18856.27835.27237.73629.27237.16162.0.35318-.00898.58065-.02993 1.49352-.13169 3.01698-.53875 4.04359-2.6219.50882-1.05056.94879-2.14601 1.31394-3.25941l4.08549 4.78886.14965-.35916c.02394-.05687.56868-1.38578.15264-2.87032l-.01497-.05387-3.23547-3.68143-.65847.49684c.19155-.78118.31726-1.49352.37413-2.12805h4.74995v-.23944c0-1.20021-.55371-1.91255-.57466-1.94248l-.07183-.08979z"/></svg>
</a><a href=mailto:[email protected] target=_blank rel="noopener noreferrer me" title=Email><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 21" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1.0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1.0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg></a></div></footer></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>C++何时会阻止默认的特殊成员函数的生成</h2></header><div class=entry-content><p>在C++中,编译器会根据类的定义情况自动决定是否生成默认的特殊成员函数(如构造函数、拷贝/移动操作、析构函数)。
1. 用户显式声明相关成员函数 显式声明或删除某个函数:
如果用户显式声明(即使使用 =default 或 =delete)某个特殊成员函数,编译器将不再生成默认版本。例如:
class Example { public: Example() = default; // 允许生成默认构造函数 Example(const Example&) {} // 用户定义的拷贝构造函数 // 编译器不再生成默认的移动构造函数和移动赋值运算符 }; 2. 用户定义析构函数、拷贝/移动操作的影响 定义析构函数:
如果用户定义了析构函数(即使为空),编译器会删除默认的移动操作(移动构造函数和移动赋值运算符),但拷贝操作仍可能生成(除非其他条件阻止)。
class Example { public: ~Example() {} // 用户定义的析构函数 // 移动操作被隐式删除,拷贝操作可能生成(若无其他限制) }; 定义拷贝操作:
如果用户定义了拷贝构造函数或拷贝赋值运算符,编译器会删除默认的移动操作。
class Example { public: Example(const Example&) {} // 用户定义的拷贝构造函数 // 移动操作被隐式删除 }; 定义移动操作:
如果用户定义了移动构造函数或移动赋值运算符,编译器会删除默认的拷贝操作。
#include <utility> #include <string> #include <iostream> struct Example { std::string str; Example() = default; Example(const std::string& s): str(s) { std::cout << "Example()\n"; } Example(Example&& other) { str = std::move(other....</p></div><footer class=entry-footer><span title='2025-03-13 00:00:00 +0000 UTC'>2025-03-13</span> · 1 min · 157 words · Kerolt</footer><a class=entry-link aria-label="post link to C++何时会阻止默认的特殊成员函数的生成" href=https://kerolt.github.io/posts/c++/c++%E4%BD%95%E6%97%B6%E4%BC%9A%E9%98%BB%E6%AD%A2%E9%BB%98%E8%AE%A4%E7%9A%84%E7%89%B9%E6%AE%8A%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0%E7%9A%84%E7%94%9F%E6%88%90/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>【CMU15-445 Fall2023】Project3 Query Execution 小结</h2></header><div class=entry-content><p>该系列博客只是为了记录自己在写Lab时的思路,按照课程要求不会在Github和博客中公开源代码。欢迎与我一起讨论交流!
这个project和之前就不一样了,开始深入数据库内核的实现了。需要理清楚一条sql语句是如何被执行的,方才能写出代码。
前置奶酪 一条SQL语句的执行 这里需要去看看一条sql语句传入bustub内部之后的代码:src/common/bustub_instance.cpp:ExecuteSqlTxn:
auto BustubInstance::ExecuteSqlTxn(const std::string &sql, ResultWriter &writer, Transaction *txn, std::shared_ptr<CheckOptions> check_options) -> bool { if (!sql.empty() && sql[0] == '\\') { // 处理元命令 ... } // binder,但是在其中会使用libpg_query来解析sql语句 bustub::Binder binder(*catalog_); binder.ParseAndSave(sql); // 经过上一步后,binder中的statement_nodes_存储着所有的语句解析节点 for (auto *stmt : binder.statement_nodes_) { // 将stmt转换成BoundStatement对象,方便后面处理数据 auto statement = binder.BindStatement(stmt); // 只有不需要构建plan树、不需要进行优化的sql语句才会在switch之后继续执行 switch (statement->type_) { ... } // 生成初步的执行计划 bustub::Planner planner(*catalog_); planner.PlanQuery(*statement); // 优化刚刚的执行计划 bustub::Optimizer optimizer(*catalog_, IsForceStarterRule()); auto optimized_plan = optimizer.Optimize(planner.plan_); ....</p></div><footer class=entry-footer><span title='2025-03-11 00:00:00 +0000 UTC'>2025-03-11</span> · 10 min · 1995 words · Kerolt</footer><a class=entry-link aria-label="post link to 【CMU15-445 Fall2023】Project3 Query Execution 小结" href=https://kerolt.github.io/posts/%E6%95%B0%E6%8D%AE%E5%BA%93/cmu15-445-fall2023project3-query-execution-%E5%B0%8F%E7%BB%93/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Hugo配置Github Actions</h2></header><div class=entry-content><p>最近把博客的构建工具从Hexo换成了Hugo,感觉Hugo配置和使用起来更简洁方便。
由于我的博客总体来说有两个仓库,一个私有仓库是放置建站工具的目录,其中包含博客 Markdown 内容、一些配置还有主题;另一个就是通过 GitHub Pages 来访问公共仓库。为了方便,之前在使用 Hexo 的使用使用了 Github Actions 来一键部署博客,换成 Hugo 后这个 actions 需要修改一下。
.github/workflows/hugo.yml:
name: GitHub Pages on: push: branches: - master # 监听 master 分支的推送事件 pull_request: jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: true # 拉取 Hugo 主题子模块 fetch-depth: 0 # 获取完整提交历史 - name: Setup Hugo uses: peaceiris/actions-hugo@v2 with: hugo-version: '0.126.2' extended: true - name: Build run: hugo --minify # 启用压缩优化 - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: personal_token: ${{ secrets....</p></div><footer class=entry-footer><span title='2025-02-07 00:00:00 +0000 UTC'>2025-02-07</span> · 1 min · 132 words · Kerolt</footer><a class=entry-link aria-label="post link to Hugo配置Github Actions" href=https://kerolt.github.io/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/hugo%E9%85%8D%E7%BD%AEgithub-actions/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Linux下微信无法使用中文输入法问题解决</h2></header><div class=entry-content><p>微信在不久前终于有了Linux原生版本,我的电脑是Fedora41,之前安装的是flatpak打包的微信,现在在官网下载rpm包后运行发现无法使用fcitx的中文输入法,找了一下是环境遍历的问题。
...</p></div><footer class=entry-footer><span title='2024-12-31 00:00:00 +0000 UTC'>2024-12-31</span> · 1 min · 28 words · Kerolt</footer><a class=entry-link aria-label="post link to Linux下微信无法使用中文输入法问题解决" href=https://kerolt.github.io/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/linux%E4%B8%8B%E5%BE%AE%E4%BF%A1%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5%E6%B3%95%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>在VSCode中配置LLDB</h2></header><div class=entry-content><p>为了 CMake Tool 能调试代码,先装好 codelldb 插件,然后还需要一个 launch.json 文件,以下内容可以一键配置好调试:
{ "version": "0.2.0", "configurations": [ { "name": "LLDB", "type": "lldb", "request": "launch", "program": "${command:cmake.launchTargetPath}", "args": [], "cwd": "${workspaceFolder}", } ] }</p></div><footer class=entry-footer><span title='2024-12-31 00:00:00 +0000 UTC'>2024-12-31</span> · 1 min · 29 words · Kerolt</footer><a class=entry-link aria-label="post link to 在VSCode中配置LLDB" href=https://kerolt.github.io/posts/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E5%9C%A8vscode%E4%B8%AD%E9%85%8D%E7%BD%AElldb/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>【MIT6.S081】Lab10 mmap</h2></header><div class=entry-content><p>什么是mmap? mmap 是一种用于将文件或设备与进程的地址空间关联起来的内存映射技术。通过 mmap,可以将文件的内容直接映射到进程的虚拟内存地址空间,使得文件的内容可以像操作普通内存一样进行读取和写入。
...</p></div><footer class=entry-footer><span title='2024-11-22 00:00:00 +0000 UTC'>2024-11-22</span> · 5 min · 1017 words · Kerolt</footer><a class=entry-link aria-label="post link to 【MIT6.S081】Lab10 mmap" href=https://kerolt.github.io/posts/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/mit6.s081lab10-mmap/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>【MIT6.S081】Lab9 file system</h2></header><div class=entry-content><p>Intro 在这个实验中,我们需要让xv6支持更大的文件和软链接。实验总体不是特别难,不过需要我们理解好文件系统是如何工作的。Lab8 lock中的Buffer Cache也是文件系统的一部分,不过它位于文件系统的下层,这里我们需要处理的更多在上层,偏应用层。
...</p></div><footer class=entry-footer><span title='2024-11-19 00:00:00 +0000 UTC'>2024-11-19</span> · 4 min · 784 words · Kerolt</footer><a class=entry-link aria-label="post link to 【MIT6.S081】Lab9 file system" href=https://kerolt.github.io/posts/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/mit6.s081lab9-file-system/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>【MIT6.S081】Lab8 lock</h2></header><div class=entry-content><p>Intro 这个实验个人感觉挺难的,需要我们重新设计数据结构,还要考虑在并发(并行)情况下对于锁的操作,以减少多核情况下对于锁的竞争。其中主要涉及内存分配和IO缓冲块分配,在这个lab之前,xv6对于这两个分配都是使用的全局对象,并只有一把全局锁进行操作,这样的话在并行情况下锁的竞争是很激烈的,我们的任务就是重新设计这两个分配器,它们的重构思路并不完全一致,需要具体问题具体分析。
...</p></div><footer class=entry-footer><span title='2024-11-17 00:00:00 +0000 UTC'>2024-11-17</span> · 5 min · 859 words · Kerolt</footer><a class=entry-link aria-label="post link to 【MIT6.S081】Lab8 lock" href=https://kerolt.github.io/posts/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/mit6.s081lab8-lock/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>【MIT6.S081】xv6进程调度分析</h2></header><div class=entry-content><p>在做thread lab的时候,阅读xv6的源码后对于进程调度的实现有了大致的了解,但是其中锁的获取与释放顺序让我困惑了好久:在yield函数中,不是先获取了进程p的锁吗,那么之后在调度器中又获取p的锁,那不是会死锁吗?在调度器内使用swtch发生进程切换后,又会跳转到哪里?
而在我观摩大佬的一些博客和视频后,发现我之前的想法有很大的问题,归根结底是没有弄明白xv6何时发生了切换,切换后应该从哪里开始运行。这篇笔记就是对于分析xv6进程调度的总结。
...</p></div><footer class=entry-footer><span title='2024-11-16 00:00:00 +0000 UTC'>2024-11-16</span> · 2 min · 326 words · Kerolt</footer><a class=entry-link aria-label="post link to 【MIT6.S081】xv6进程调度分析" href=https://kerolt.github.io/posts/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/mit6.s081xv6%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%E5%88%86%E6%9E%90/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>【MIT6.S081】Lab6 multithreading</h2></header><div class=entry-content><p>本次的实验总体都不是很难,第一个练习让我们在用户态模拟了线程的切换,这里重要的就是进程/线程上下文的保存与恢复;第二三个练习则是让我们跳出了xv6,去熟悉pthread库和线程的同步互斥。
...</p></div><footer class=entry-footer><span title='2024-11-15 00:00:00 +0000 UTC'>2024-11-15</span> · 4 min · 669 words · Kerolt</footer><a class=entry-link aria-label="post link to 【MIT6.S081】Lab6 multithreading" href=https://kerolt.github.io/posts/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/mit6.s081lab6-multithreading/></a></article><footer class=page-footer><nav class=pagination><a class=next href=https://kerolt.github.io/page/2/>Next »</a></nav></footer></main><footer class=footer><span>© 2025 <a href=https://kerolt.github.io/>Kerolt's Blog</a></span> ·
<span>Powered by
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
<a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg>
</a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script></body></html>