我为什么换到了 Tab 缩进

曾经,我是 Space 的忠实粉丝,写 JavaScript 时,我用 2-space 缩进;写 Python/Rust 时,我用 4-space 缩进;写 Go 时,我用…… 好吧,它只能用 Tab。 直到去年,看到 Jake Archibald 推文,我又开始重新思考缩进的本质,并从 Space 过渡到了 Tab: Tab 本身就是专门缩进的字符…

Neovim 异步格式化探索

很长时间以来,我都在以同步的方式格式化代码,而这么做的唯一原因就是实现简单,我只需要在文件保存前的 BufWritePre 事件中以阻塞的方式调用 vim.lsp.buf.format() 即可轻松完成,就像这样: vim.api.nvim_create_autocmd("BufWritePre", { group = group, buffer = bufnr, callback = function() vim.lsp.buf.format { bufnr = bufnr } end }) 但它有个致命问…

绕过 Cloudflare 指纹护盾

最近才知道,除了 TLS 指纹,竟然还有 HTTP/2 指纹,这两种 Cloudflare 都有采用,这篇博客介绍如何绕过它们。 起因 最近发现之前写的搜图 Bot 坏掉了,这个 Bot 接入了 3 个搜索后端,出问题的是 ascii2d.net。由于它最近套上了 Clo…

我的 macOS 配置

这篇文章记录下,一个新的 macOS 需要做的配置,和安装的软件。 键盘布局 使用 Colemak 键盘布局,它比传统 QWERTY 更高效、合理。 在 System Settings - Keyboard - Input Sources - Edit… 中添加 Colemak 以替换 ABC,重新登入系统布局生效。 系统设置 # Auto hide the menubar defaults write -g _HIHideMenuBar…

图解 Functor、Applicative、Monad

序言 这篇文章是对原文 Functors, Applicatives, And Monads In Pictures 的翻译,由 Aditya Bhargava 撰写,翻译时已取得作者授权。 它是了解函数式编程非常棒的一篇文章,但它的两篇中文译文已不再可用(404、全部图片丢失),另外仅剩的一篇却是以 Kotlin 为导向的,因此…

从零实现 AES 加密算法

介绍 AES(Advanced Encryption Standard)是由 NIST(National Institute of Standards and Technology,美国国家标准局)于 2001 年制定的“对称加密算法”,目的是为了取代当时已不安全的 DES 算法。它是 Rijndael 算法…

让 Hugo 用上 React

最近把博客主题又双叒叕重写了一遍,嘛,生命不息,折腾不止。依然基于 Hugo,但这次把 React 缝合进去了,使用 Vite 构建前端,Tailwind CSS 编写样式,这篇博客记录下整个折腾过程。 新主题在这 https://github.com/sxyazi/hugo-theme-lavias 数据源 由于 Hugo 是一个…

Golang 并发缓存实践

并发缓存,顾名思义就是让缓存可以在多个并发的 goroutine 中共享、交错使用,这在爬虫程序中尤其常见,每个新的爬虫任务都希望能够“实时地”复用之前,或正在进行中的任务结果,从而避免重复的网络请求开销。 这篇文章,以 yande.re…

React Hooks 编码模式的变化

前言 在 React 16.8 中,引入了 Hooks 的概念,它旨在更好的复用“状态逻辑”。React Hooks 的核心思想就是“状态+行为”,其中行为指的是“控制状态的逻辑”。 像人们所熟知的那样,模板代码可以通过组件化的形式复用,而在 Hooks 出现…

C++ 引用与 const

基本概念 引用的本质就是指针,下面两行代码的底层逻辑是一致的 int *p = &a int &ref = a 如果添加 const 限制词,表示不能通过 *p 或 ref 间接修改 a 的值 const int *p = &a const int &ref = a // 等价于 int const *p = &a int const &ref = a 一般常用于参数声明,如 void foo(const int…

Next Page