跳转到主要内容

短文

分享一些小技巧。

  • 健身房等待时间模拟

    发布于 短文 620 字 2 分钟

    七月中旬去了趟医院,在医生的建议下开始定期运动了。综合考虑工作日的时间安排和自己的身体状态后,暂且决定每天中午去健身房运动一会。目前每日运动就是中午去健身房踩20多分钟的椭圆机(顺带看一集番),消耗热量约320卡。然而虽然健身房里的椭圆机数量并不少,足足有10台,但是偶尔还是会发生去了没有位置,需要等人结束的情况,但是因为不知道到底要等多久,还是略微有些焦虑。于是在想,有没有办法量化等待时间,例如模拟计算下概率分布函数,所以有了这篇文章。 代码(基本是 GPT3.5 写的,有手动调整 …

    七月中旬去了趟医院,在医生的建议下开始定期运动了。综合考虑工作日的时间安排和自己的身体状态后,暂且决定每天中午去健身房运动一会。目前每日运动就是中午去健身房踩20多分钟的椭圆机(顺带看一集番),消耗热量约320卡。然而虽然健身房里的椭圆机数量并不少,足足有10台,但是偶尔还是会发生去了没有位置,需要等人结束的情况,但是因为不知道到底要等多久,还是略微有些焦虑。于是在想,有没有办法量化等待时间,例如模拟计算下概率分布函数,所以有了这篇文章。 代码(基本是 GPT3.5 写的,有手动调整 …

  • 评论系统从 Disqus 迁移到 Giscus

    发布于 短文 598 字 2 分钟

    之前一直用的是 disqus,但是一来国内访问有时会有问题,二来新用户需要重新注册。考虑到大部分阅读本站的读者应该也是 Github 用户,迁移到 Giscus(一个基于 Github Dicsussion)的评论系统看起来更合适一些。切换评论系统本身并不难,参考这篇教程修改 hugo 的模板和配置即可。迁移数据也不算麻烦,毕竟没什么人评论,所以其实只有两条评论,手动迁移也就花不了多少时间(虽然也尝试了自动的方案但似乎有些问题,迁移过去的评论不显示…)。稍微有些烦人的反倒是 Giscus 明亮/ …

    之前一直用的是 disqus,但是一来国内访问有时会有问题,二来新用户需要重新注册。考虑到大部分阅读本站的读者应该也是 Github 用户,迁移到 Giscus(一个基于 Github Dicsussion)的评论系统看起来更合适一些。切换评论系统本身并不难,参考这篇教程修改 hugo 的模板和配置即可。迁移数据也不算麻烦,毕竟没什么人评论,所以其实只有两条评论,手动迁移也就花不了多少时间(虽然也尝试了自动的方案但似乎有些问题,迁移过去的评论不显示…)。稍微有些烦人的反倒是 Giscus 明亮/ …

  • 随机分享(230910):Typescript 中 Any 关闭类型检查 & Linux 中的内存占用

    发布于 短文 1735 字 4 分钟

    RandomTypescriptFrontend

    (没有干货,全是湿货…不过至少写一些总比完全没有写强?) 本周遇到的 Bug 遇到了两个前端相关的 bug,排查了很久,不过最后发现都是人的问题而非代码的问题… CI 坏了还能跑? 现象:某前端项目,其他人参加开发的时候发现 master 分支无法 npm install,但之前这个 repo 一直在正常更新版本,看 CI 日志也一切正常 原因:发现问题是上游某依赖方对已发布的包重新发布,导致文件 hash 变化,npm install 时实际文件 hash 和 lock 中 hash 不一致, …

    (没有干货,全是湿货…不过至少写一些总比完全没有写强?) 本周遇到的 Bug 遇到了两个前端相关的 bug,排查了很久,不过最后发现都是人的问题而非代码的问题… CI 坏了还能跑? 现象:某前端项目,其他人参加开发的时候发现 master 分支无法 npm install,但之前这个 repo 一直在正常更新版本,看 CI 日志也一切正常 原因:发现问题是上游某依赖方对已发布的包重新发布,导致文件 hash 变化,npm install 时实际文件 hash 和 lock 中 hash 不一致, …

  • 播放 Lofi Girl 的小脚本

    发布于 短文 187 字 1 分钟

    自测 Lofi 对集中注意力有些帮助,然而如果长时间用 Chrome / Firefox 来播放似乎会导致奇怪的内存溢出问题,原因可能和 Youtube 的播放器默认会缓存已播放的片段有关。换用 MPV 似乎可以解决此问题。于是顺手写了个小脚本,结合 yt-dlp 和 mpv,一键播放 Lofi Girls。使用前请先自行下载 yt-dlp 和 mpv。 ::set HTTP_PROXY=http://localhost:[some_port] cd …

    自测 Lofi 对集中注意力有些帮助,然而如果长时间用 Chrome / Firefox 来播放似乎会导致奇怪的内存溢出问题,原因可能和 Youtube 的播放器默认会缓存已播放的片段有关。换用 MPV 似乎可以解决此问题。于是顺手写了个小脚本,结合 yt-dlp 和 mpv,一键播放 Lofi Girls。使用前请先自行下载 yt-dlp 和 mpv。 ::set HTTP_PROXY=http://localhost:[some_port] cd …

  • 在 devtool 控制台里爬网站

    发布于 短文 410 字 1 分钟

    前端

    最近需要从某个不提供 API 接口的网站爬数据。F12 切换到网络标签页,然后重载页面,可以轻松的观察到其实其实后台是有提供给前端的 API 的。(形如 POST /api/entity/:id)。用 Edge 浏览器自带的 “编辑并重新发送” 功能测试,手动也可以调通。(这是 Edge 浏览器一个超棒的功能,对于偶尔的小调试可以替代 Postman)。理论上到了这一步就可以写点 Python 把数据遍历 ID 把数据爬下来了,不过可能还要处理一些 cookie 之类的麻烦事。与其再写个外部脚本 …

    最近需要从某个不提供 API 接口的网站爬数据。F12 切换到网络标签页,然后重载页面,可以轻松的观察到其实其实后台是有提供给前端的 API 的。(形如 POST /api/entity/:id)。用 Edge 浏览器自带的 “编辑并重新发送” 功能测试,手动也可以调通。(这是 Edge 浏览器一个超棒的功能,对于偶尔的小调试可以替代 Postman)。理论上到了这一步就可以写点 Python 把数据遍历 ID 把数据爬下来了,不过可能还要处理一些 cookie 之类的麻烦事。与其再写个外部脚本 …

  • 用 CSS Filter 反色实现简易黑暗模式

    发布于 短文 619 字 2 分钟

    前端

    本博客使用的 Manis 主题 并没有提供原生的黑暗模式支持,于是考虑着自己加一个。一开始的想法是定制 CSS 加上 media query,然而这样改动面似乎会比较大。随手搜索了一下,发现已经有前人提出了使用 CSS Filter 实现简易黑暗模式的想法,甚至有代码可以直接应用于 Hugo 博客。相较于 media query,直接使用 CSS Filter 不仅操作上更简单,也允许用户直接切换明亮/黑暗模式,而不需要调整系统/浏览器的全局设定。 具体 CSS 实现中,先使用 …

    本博客使用的 Manis 主题 并没有提供原生的黑暗模式支持,于是考虑着自己加一个。一开始的想法是定制 CSS 加上 media query,然而这样改动面似乎会比较大。随手搜索了一下,发现已经有前人提出了使用 CSS Filter 实现简易黑暗模式的想法,甚至有代码可以直接应用于 Hugo 博客。相较于 media query,直接使用 CSS Filter 不仅操作上更简单,也允许用户直接切换明亮/黑暗模式,而不需要调整系统/浏览器的全局设定。 具体 CSS 实现中,先使用 …

  • 构造能匹配所有 emoji 的正则表达式

    发布于 短文 588 字 2 分钟

    Hack

    在研究一个 CSS 定制 Emoji 字体问题的时候,看到了一个 RegEx,可以匹配所有的 Emoji(至 2018 年版本),也给出了相应的测试例子,见此:Regex to match all emoji - Regex Tester/Debugger (\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]) 看完之后我半信半疑,因为这个 RegEx 太简 …

    在研究一个 CSS 定制 Emoji 字体问题的时候,看到了一个 RegEx,可以匹配所有的 Emoji(至 2018 年版本),也给出了相应的测试例子,见此:Regex to match all emoji - Regex Tester/Debugger (\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]) 看完之后我半信半疑,因为这个 RegEx 太简 …

  • VNC 连接到物理屏幕

    发布于 短文 488 字 1 分钟

    坑

    如果搜索 Linux 远程桌面,大部分教程基本上都是 xrdp + xfce4 的组合。一般情况下这样的组合的确不错,不过有一些诡异的特殊需求的时候就没那么好用了。在我的使用场景中,有的时候在实验室的 Linux 工作站上开启了一个比较长时间的任务,回到宿舍后可能需要检查下运行过程是否正常。如果是一般的 CLI 程序,用 screen 或者 tmux 之类的 terminal multiplexer (终端多路复用器)就绰绰有余了,可惜我用的是一个 GUI 程序。因此试着搜索了一番,发现是可以实 …

    如果搜索 Linux 远程桌面,大部分教程基本上都是 xrdp + xfce4 的组合。一般情况下这样的组合的确不错,不过有一些诡异的特殊需求的时候就没那么好用了。在我的使用场景中,有的时候在实验室的 Linux 工作站上开启了一个比较长时间的任务,回到宿舍后可能需要检查下运行过程是否正常。如果是一般的 CLI 程序,用 screen 或者 tmux 之类的 terminal multiplexer (终端多路复用器)就绰绰有余了,可惜我用的是一个 GUI 程序。因此试着搜索了一番,发现是可以实 …

  • Go 监控协程数量

    发布于 短文 304 字 1 分钟

    Go

    继续补全之前写 Raft 的 debug 过程。在解决了 Timer 问题之后,发现如果多次重复测试(用 --count 10),依然会存在 CPU 占用率不断上升的情况,虽然上升幅度有所减小,但多次循环之后依然很严重。初步怀疑是角色转换的时候,可能协程没处理好导致出现了 goroutine 泄露,于是找了找 Stack Overflow,魔改了一个能间隔一定时间打印出当前 Go Runtime 中协程数量的代码。最后发现的确是随着测试进行,协程数不断上升;修复泄露问题后(加了各种判断 …

    继续补全之前写 Raft 的 debug 过程。在解决了 Timer 问题之后,发现如果多次重复测试(用 --count 10),依然会存在 CPU 占用率不断上升的情况,虽然上升幅度有所减小,但多次循环之后依然很严重。初步怀疑是角色转换的时候,可能协程没处理好导致出现了 goroutine 泄露,于是找了找 Stack Overflow,魔改了一个能间隔一定时间打印出当前 Go Runtime 中协程数量的代码。最后发现的确是随着测试进行,协程数不断上升;修复泄露问题后(加了各种判断 …

  • Go Timer 的使用姿势

    发布于 短文 657 字 2 分钟

    Go

    之前写 Raft 的时候,用 Timer 来处理定时事件,但是之后在测试的时候遇到了一些诡异的问题,具体表现是随着测试重复进行,CPU 占用率越来越高。上 pprof 检查了一下,发现存在 Timer 泄露,根源是自己 Timer 的使用有些问题。下文记录正确的 Go 中 Timer 的使用姿势。 使用场景: 如果有 channel 里有数据(发生了事件),从 channel 里取出,并重置 heartbeat 如果没有事件,维持 heartbeat 例子: heartbeat interval …

    之前写 Raft 的时候,用 Timer 来处理定时事件,但是之后在测试的时候遇到了一些诡异的问题,具体表现是随着测试重复进行,CPU 占用率越来越高。上 pprof 检查了一下,发现存在 Timer 泄露,根源是自己 Timer 的使用有些问题。下文记录正确的 Go 中 Timer 的使用姿势。 使用场景: 如果有 channel 里有数据(发生了事件),从 channel 里取出,并重置 heartbeat 如果没有事件,维持 heartbeat 例子: heartbeat interval …

  • MS RDP 无法连接到在使用了 802.1x 认证的无线网络中的电脑

    发布于 短文 479 字 1 分钟

    坑

    昨天遇到了一个诡异的 bug,笔记本电脑放在 lab,连上了学校的 WiFi,但是回宿舍后却无法用 RDP 连接上。具体表现是一开始可以 ping 通,使用 RDP 连接时卡几分钟,随后超时断开,最后远端(笔记本电脑)就再也 ping 不通了。 以「RDP wifi disconnect」为关键词进行搜索,找到了微软知识库里的一篇文章:Remote laptop disconnects from wireless network | Microsoft Docs,描述的症状和我体验的很相似。文章 …

    昨天遇到了一个诡异的 bug,笔记本电脑放在 lab,连上了学校的 WiFi,但是回宿舍后却无法用 RDP 连接上。具体表现是一开始可以 ping 通,使用 RDP 连接时卡几分钟,随后超时断开,最后远端(笔记本电脑)就再也 ping 不通了。 以「RDP wifi disconnect」为关键词进行搜索,找到了微软知识库里的一篇文章:Remote laptop disconnects from wireless network | Microsoft Docs,描述的症状和我体验的很相似。文章 …

  • Markdown 表格内的代码块

    发布于 短文 300 字 1 分钟

    坑Python

    Markdown 自带表格支持,不过表格内只支持基本的文本格式(加粗、斜体、inline code 等),而不支持更复杂的文本格式(如代码块、水平线)。如果需要在表格中加上复杂格式支持,如果使用的是 Github Flavored Markdown,一种做法是用 HTML 定义表格框架,再在内部 inline Markdown 文本,示例如下。 需要注意之处: 对应的 table cell 的 <td>, </td> 标签需要在新行的行首(前面不能有缩进) table cell 内的 …

    Markdown 自带表格支持,不过表格内只支持基本的文本格式(加粗、斜体、inline code 等),而不支持更复杂的文本格式(如代码块、水平线)。如果需要在表格中加上复杂格式支持,如果使用的是 Github Flavored Markdown,一种做法是用 HTML 定义表格框架,再在内部 inline Markdown 文本,示例如下。 需要注意之处: 对应的 table cell 的 <td>, </td> 标签需要在新行的行首(前面不能有缩进) table cell 内的 …

  • Python __hash__ 继承

    发布于 短文 509 字 2 分钟

    坑Python

    最近写作业的时候踩上了一个 Python 的坑: 如果父类实现了 __hash__ 方法,而子类重写了 __eq__ 方法,为了保证 hash 和 eq 的语义一致,子类不会隐式继承父类的 __hash__ 方法。如果需要子类的 __hash__ 方法调用父类的实现,则需要手动声明。 这个之所以是一个坑,因为在代码中的行为看起来很正常: Pycharm 的方法跳转可以定位到父类 __hash__ 方法 inspect.getmro 的父类列表正常 dir(object) 得到的方法列表中的确含有 …

    最近写作业的时候踩上了一个 Python 的坑: 如果父类实现了 __hash__ 方法,而子类重写了 __eq__ 方法,为了保证 hash 和 eq 的语义一致,子类不会隐式继承父类的 __hash__ 方法。如果需要子类的 __hash__ 方法调用父类的实现,则需要手动声明。 这个之所以是一个坑,因为在代码中的行为看起来很正常: Pycharm 的方法跳转可以定位到父类 __hash__ 方法 inspect.getmro 的父类列表正常 dir(object) 得到的方法列表中的确含有 …

  • mdBook 代码折行(wrap)

    发布于 短文 210 字 1 分钟

    mdBook 是一个基于 Rust 的文档网站生成工具。虽然 mdBook 中有代码高亮,可编辑代码等特性,但是默认情况下不支持代码折行的设定。在代码行或注释较长的时候,用户需要手动左右移动,体验不佳。 查阅文档可知,mdBook 使用的是 Ace Editor。再查询 Ace Editor 的文档,可以发现通过 editor.getSession().setUseWrapMode(true); 启用折行。 在 mdBook 生成的 book 文件夹中,可以找到 book.js 文件,在 …

    mdBook 是一个基于 Rust 的文档网站生成工具。虽然 mdBook 中有代码高亮,可编辑代码等特性,但是默认情况下不支持代码折行的设定。在代码行或注释较长的时候,用户需要手动左右移动,体验不佳。 查阅文档可知,mdBook 使用的是 Ace Editor。再查询 Ace Editor 的文档,可以发现通过 editor.getSession().setUseWrapMode(true); 启用折行。 在 mdBook 生成的 book 文件夹中,可以找到 book.js 文件,在 …

  • Hugo 的 Disqus 整合

    发布于 短文 359 字 1 分钟

    坑

    Hugo 是内置了 Disqus 支持的,理论上只需要在站点的 config.toml 的顶层设定 disqusShortname 属性即可,不过实际用起来稍微有些坑。具体步骤如下。 在 Disqus 官网注册自己的账户 在 Disqus 官网登陆后,选择右上角 Settings - 左侧 Moderation,然后在这里新建一个站点,站点名字 ({site_name}.disqus.com)就是 disqusShortname 应该用的值 站点创建完成后,Billing 页选择 Free …

    Hugo 是内置了 Disqus 支持的,理论上只需要在站点的 config.toml 的顶层设定 disqusShortname 属性即可,不过实际用起来稍微有些坑。具体步骤如下。 在 Disqus 官网注册自己的账户 在 Disqus 官网登陆后,选择右上角 Settings - 左侧 Moderation,然后在这里新建一个站点,站点名字 ({site_name}.disqus.com)就是 disqusShortname 应该用的值 站点创建完成后,Billing 页选择 Free …

  • 用 Slides 标题栏颜色区分重要性

    发布于 短文 145 字 1 分钟

    展示

    Slides 标题栏除了展示标题之外,也可以用于表明本页的重要性。 例子: 「红色/橙色」代表本页十分重要,就算忘记了其他内容也应该记得本页。 「蓝色/幻灯片主题色」代表本页一般重要,即一般的正文层级 「绿色」代表本页内容为延伸、扩展或详细说明 「灰色」代表本页内容为参考文献、资料总览 来源:Google TechTalk - Haskell 101

    Slides 标题栏除了展示标题之外,也可以用于表明本页的重要性。 例子: 「红色/橙色」代表本页十分重要,就算忘记了其他内容也应该记得本页。 「蓝色/幻灯片主题色」代表本页一般重要,即一般的正文层级 「绿色」代表本页内容为延伸、扩展或详细说明 「灰色」代表本页内容为参考文献、资料总览 来源:Google TechTalk - Haskell 101

  • JavaFX 打包并设定 UTF-8

    发布于 短文 153 字 1 分钟

    Java编码

    IDEA 可以自动为 JavaFX 打包,会带上依赖 jar 和 Java Runtime,具体方法见视频。 然而这样打包生成的文件,在没有加 VM 参数时默认使用系统编码,在中文 Windows 环境下即使用 GBK,代码中若含有中文会造成乱码。 解决此问题的方法也很简单,只需要在打包后找到 {artifact_name}/app/{artifact_name}.cfg 文件,找到 [JVMOptions] 一行,在其后追加 -Dfile.encoding=utf-8 即可。然而需要每次打包后 …

    IDEA 可以自动为 JavaFX 打包,会带上依赖 jar 和 Java Runtime,具体方法见视频。 然而这样打包生成的文件,在没有加 VM 参数时默认使用系统编码,在中文 Windows 环境下即使用 GBK,代码中若含有中文会造成乱码。 解决此问题的方法也很简单,只需要在打包后找到 {artifact_name}/app/{artifact_name}.cfg 文件,找到 [JVMOptions] 一行,在其后追加 -Dfile.encoding=utf-8 即可。然而需要每次打包后 …

  • WSL2, Docker, Virtualbox

    发布于 短文 487 字 1 分钟

    WSLDockerVM

    2021/4/9 更新: VMWare Player 16+ 无须配置,在检测到 Hyper-V 启动后自动调用 Hyper-V 后端了。 Docker 在 Windows 上运行,实际上都是靠一个 Linux 虚拟机。早期 Docker 官方出了一个叫做 Docker Toolbox 的工具,其实就是 VirtualBox 加上一个精简过的只能运行 Docker 的 VM。后来 Docker 放弃了 Virtualbox 路线,转而使用 Windows 内置的 Hyper-V 作为底层 …

    2021/4/9 更新: VMWare Player 16+ 无须配置,在检测到 Hyper-V 启动后自动调用 Hyper-V 后端了。 Docker 在 Windows 上运行,实际上都是靠一个 Linux 虚拟机。早期 Docker 官方出了一个叫做 Docker Toolbox 的工具,其实就是 VirtualBox 加上一个精简过的只能运行 Docker 的 VM。后来 Docker 放弃了 Virtualbox 路线,转而使用 Windows 内置的 Hyper-V 作为底层 …