最新文章
尝试用Vim充当kitty的scrollback pager
工具终端Vim这篇文章介绍了如何将kitty终端模拟器与Vim结合使用,以实现更强大的搜索、跳转和复制功能,并提供了解决相关问题的方法。
在NextJS14中集成twikoo评论系统
NextJSTypeScript本文介绍了在NextJS中集成Twikoo的方法。此外,提到NextJS在使用notFound API时可能存在的bug及解决方案。
在NextJS中为rehype代码块添加复制按钮
ReactTypeScript本文介绍了作者在博客中使用rehype-pretty-code和shiki来美化代码块时,如何通过React Server Components和自定义MDX组件,解决在NextJS中使用带复制按钮的代码块时遇到的问题,并在不同的格式(MDX和Org-mode)下实现了功能的具体方法。
开发docube问题记录
OrgTypeScript本文介绍了作者将博客内容格式从MDX迁移到Org-mode的过程中,开发了一个名为Docube的JavaScript/TypeScript库,并在文中详细描述了库的设计理念、实现细节以及在发布npm包时遇到的问题和解决方法。
Android开发拾遗:DataStore与JSON结合
AndroidKotlin本文探讨了如何在Android应用中使用JSON格式的DataStore存储配置数据,并提供了详细的代码示例和步骤来实现这一点。
Android开发拾遗:如何使用Proto DataStore
AndroidKotlin本文介绍了如何在Android中使用Proto DataStore来持久化复杂的用户数据,包括schema定义、Gradle配置和代码实现。
Android开发拾遗:对onTerminate的误解
AndroidKotlin在Android应用中,通过继承Timber的Tree类实现日志记录功能,在Application的onCreate方法中启动日志记录,尽管onTerminate在真机上不会被调用,可以使用Activity的onSaveInstanceState方法保存和恢复临时数据。
Android开发拾遗:如何减少重组
AndroidKotlin在Android代码中,常见到一些数据类标有@Stable或@Immutable注解,这些注解与Jetpack Compose的性能优化相关,本文探讨了它们的作用和可能的解决方案。
Android开发拾遗:MVVM与MVI
AndroidKotlin本文介绍了复杂项目中代码拆分的重要性,以 ASP.NET 的 MVC 模式为例,探讨如何解耦 UI 和业务逻辑。重点讨论了 Android 开发中的 MVVM 和 MVI 模式,通过对比说明它们在状态管理和 UI 交互上的不同,阐明了各自的优缺点及适用场景。
Android开发拾遗:异步与协程
AndroidKotlin这篇文章主要介绍了Kotlin协程的基本用法,包括语法、结构化并发、异步流、生命周期管理等方面。
给tauri做条件编译实现真全平台
前端JavaScript本文讲述了作者使用 unplugin-preprocessor-directives 插件解决了 Tauri 应用在特定硬件上无法启动以及跨平台打包问题。
软件开发之道——聊聊UNIX哲学
UNIX哲学软件工程本文从多个角度探讨了UNIX哲学在现代软件开发中的适用性。首先,文章分析了三条UNIX哲学的核心原则,并结合实例阐述了它们的具体应用。其次,文章探讨了在现代软件开发中,如何理解和应用这些原则。最后,文章分析了时代因素对UNIX哲学适用性的影响,并提出了一些建议。
通过Org做公众号排版
Org本文介绍了一个将Org格式文本转换为微信公众号富文本格式的工具。该工具可以帮助用户在编辑Org格式文本后,一键复制到公众号后台发布。
使用Rust实现Wayland输入法协议
IMEWayland本文介绍了如何使用Rust语言实现Wayland输入法协议,包括输入法基础、Wayland协议、Rust实现等内容。该示例可帮助开发者理解Wayland输入法机制并推动相关生态发展。
全键盘工作流新利器——kitty
终端工具kitty是一个高度可定制的终端模拟器。它支持多字体显示不同语言,窗口水平/垂直分屏,标签页切换,SSH连接复用等功能。kitty最大的特点是其插件系统“kittens”,可以扩展更多功能,如显示图像、快速打开文件等。相比其他现代终端模拟器,kitty配置灵活,扩展性强。总体来说,这是一款强大且可定制的终端工具。
Emacs配置tree-sitter
Emacs工具这篇文章介绍了如何使用 tree-sitter 为 Emacs 提供对多种编程语言的语法高亮和结构化编辑支持。tree-sitter 是一个解析器生成工具和增量解析库,它可以生成特定编程语言的解析器,并实时分析代码文件,构建一个详细的语法树。该文章提供了详细的配置步骤,包括添加语法库的源码仓库地址、修改语言模式映射等,并介绍了如何安装 grammar 动态库。
自制输入法:拼音输入法与HMM
IMEHMM文章主要介绍了如何使用隐马尔可夫模型(HMM)来实现一个简单的中文拼音输入法。1. 首先需要收集汉字字库和中文语料库,并对语料库进行预处理,如将句子分割成单词、给每个字标注拼音等。2. 然后,使用语料库训练HMM模型,训练过程包括计算初始概率、转移概率和输出概率。3. 最后,在输入拼音序列时,使用HMM模型进行解码,输出最可能对应的汉字序列。文章还讨论了在实践中使用HMM模型时遇到的问题,如语料处理问题、真实世界的输入、与时俱进、计算问题等,并提出了解决这些问题的方案。
使用Nix Flake构建可重现系统
Nix工具这篇文章讨论了 NixOS 的可复现性问题。NixOS 虽然标榜自己是可复现的,但实际上却受到 `nix channel` 的影响,使得相同的配置在不同的环境下可能会产生不同的结果。为了解决这个问题,Nix 引入了 flakes 机制,允许用户显式声明依赖的版本,从而保证可复现性。文章还介绍了如何将 NixOS 配置转换为 flake 版本,以及如何在 flake 中定义多个系统配置。最后,文章还讨论了如何使用 flake 来创建可复现的开发环境。
优雅地使用Git
Git工具这篇文章内容与Git的使用相关,包括了提交信息的规范,如何保持清晰的提交历史和修复不规范的提交。文章还介绍了用于协助管理Git的工具和技术,如Git hooks、Git子命令、Git别名、EditorConfig等。最后,文章还提供了日志查询、跟踪空文件夹、处理大文件和克隆仓库等方面的技巧。
关于TypeScript结合React开发的一些技巧
ReactTypeScript这篇文章介绍了作者在前端项目中使用 TypeScript 与 React 的一些经验。文章首先推荐使用 TypeScript 的自动推断功能,这样可以减少一些类型标注的工作。然后介绍了一些 TypeScript 的工具类型,如 Omit 和 Pick,这些工具类型可以帮助我们重用类型定义,避免重复工作。接着,文章讨论了在 TypeScript 中引入不明确性的问题,并推荐使用 declare 全局声明和声明合并来解决这个问题。此外,文章还介绍了 useRef 的类型,以及如何使用类型收窄和条件渲染来实现更简洁的代码。最后,文章给出了如何解决项目中大量的条件渲染问题的一些建议,例如使用组件工厂或组合。
Nix入坑笔记
工具这篇文章介绍了一套解决软件包管理和环境配置问题的工具: Nix 。Nix是一系列工具的合集,通过一种纯函数式的方式来管理软件包。Nix提供了一个函数式语言来描述软件包,每一个软件包就是Nix语言中的一个表达式。Nix工具集中,`nix-env`命令用于安装、升级或删除包,它和其他Linux发行版的包管理工具或Mac上的homebrew作用类似。NixOS是一个基于Nix的Linux发行版,整个NixOS就是一个声明式的系统,只要备份好configuration,就可以随时恢复原样,拷贝配置文件就可以在新设备生成一个一样的系统。
Django+React全栈开发:文章详情
RESTDjango这篇文章讨论了构建一个博客应用时遇到的身份验证问题和组件交互的解决方案。它首先介绍了修改一个组件以从后端获取文章正文导致的身份验证问题,并提供了解决方法。接下来,文章介绍了 React Hooks 的概念,以及如何使用 Hooks 实现类似于类组件生命周期的功能。它还讨论了使用 Hooks 时的一些注意事项,例如 Hooks 只能出现在函数式组件或自定义 Hook 中,并且必须在最顶层。最后,文章给出了一个练习,让读者尝试在页面上呈现文章标题、创建日期等其他信息。
百宝箱:数字人生
工具本文探讨了一个数字化人生的框架,囊括了笔记记录、知识管理、时间管理等方面。作者使用 TiddlyWiki 搭建了个人公开 wiki,满足随时可用、多终端同步、方便地 Review 等需求。而 Logseq 作为私人笔记工具,实现了双向链接和知识图谱。在知识管理上,作者结合 OKR 和 PARA 两个方法,将长期目标与关键结果转化为具体项目,并通过 Logseq 的查询功能以及自定义 CSS 实现 GTD 四象限面板。时间管理方面,作者利用 Logseq 的 Schedule 和 Deadline 特性来安排每日待办事项。文章结尾强调了构建“第二大脑”需要“第一大脑”的帮助,回归思考与检索,将碎片知识转化为有用的信息。
Django+React全栈开发:JWT
RESTDjango这篇教程为如何在 Django 后端实现 JWT 认证提供了一个示例。它讨论了 HTTP 无状态的含义以及 JWT 是什么。然后,它解释了如何创建新的 Django 应用程序并设置用于身份验证的视图。接下来,它描述了如何使用 `python-jose` 库来生成和验证 JWT 令牌。它还解释了如何将 JWTAuthentication 类用作自定义认证类,以便在需要认证的视图中使用它。最后,它展示了发送 HTTP 请求的示例,以使用有效的 JWT 令牌验证用户。总的来说,这篇教程提供了有关如何在 Django 后端中实现 JWT 认证的全面概述,包括所有必要的步骤和代码示例。
Dive into Rust: Object Oriented
RustOOP文章探讨了什么是面向对象编程,以及如何在Rust中实现面向对象编程。文章认为,面向对象编程不等于封装、继承、多态,继承和多态甚至不能算并列的概念。Rust没有继承,但可以通过trait来抽象共享行为,实现多态。文章还讨论了鸭子类型,以及如何以Rust的方式实现鸭子类型。文章最后总结了Rust中泛型与trait的详细用法,读者可以参考官方文档或其他资料。
Dive into Rust: Ownership, Borrowing, Lifetime
Rust文章介绍了内存安全问题,以及Rust通过所有权、借用和生存期三个机制来保证内存安全的做法。文章还从Python程序员的视角,对Rust的内存安全机制进行了分析和理解。文章认为,Rust的内存安全机制是一种独特的机制,对于熟悉Python这类语言的程序员初次接触会感到比较陌生。
TypeScript实现互斥参数
ReactTypeScript作者想通过 typeScript 的类型定义来限制一个函数的两个参数只能取其一。但是按照 TypeScript 的类型系统,直接将参数定义为两个 interface 的联合类型是没有用的,因为联合类型允许同时存在两个类型的值。而 `never` 类型可以表示一个只会抛出异常或者内部死循环的函数的返回值,并且任何其他类型的值都不能赋值给这个类型的变量,作者利用这个性质来限制了参数的取值范围,从而保证用户只会使用两个互斥属性中的一个。
探究Python类型注解
Python这篇文章介绍了作者在 Python 中造轮子的经历,以及过程中遇到的问题和解决办法。作者尝试使用 Prisma 作为灵感,在 Python 中创建了一个 ORM 库。接着讨论了 Python 中的类型注解,以及使用 dataclass 和 TypedDict 来定义类型。最后,作者提到了一种尝试使用模式匹配来限定可变参数类型的方法,但由于该方法目前在 Python 中还没有实现,因此无法使用。
Django+React全栈开发:关联用户
RESTDjango这篇文章介绍了如何在Django REST Framework中设置用户权限。首先,它解释了如何将用户与文章关联,并创建了一个自定义的权限类`IsAdminOrReadOnly`,该类允许管理员创建、删除和修改文章,而其他用户只能读取文章。然后,它展示了如何将该权限类添加到视图类中,并解释了如何使用`perform_create`方法和`read_only_fields`属性来确保只有管理员才能创建文章,并且作者字段是只读的。最后,它演示了如何使用HTTPie工具测试API的正确性。
Django+React全栈开发:自定义验证与授权
RESTDjango这篇文章主要讲了如何自定义 Django 的用户模型、序列化器、验证、权限和限流。1. 自定义用户模型:可以使用继承**AbstractUser**或**AbstractBaseUser**来扩展原生**User**模型,并添加额外的字段和方法。2. 序列化器:定义了如何将模型数据转换成可用于 API 请求和响应的格式。3. 验证:可以使用**TokenAuthentication**或**BasicAuthentication**进行验证,并设置 Token 过期时间。4. 权限:可以使用**AdministratorLevel**这样的自定义权限类来限制不同用户对 API 的访问。5. 限流:可以使用**UserRateThrottle**来限制用户请求的频率。
Django+React全栈开发:路由
RESTDjango这篇文章主要介绍了如何使用`react-router-dom`来搭建一个简单的单页应用(SPA)。首先介绍了`react-router-dom`的基本概念和用法,然后通过一个例子演示了如何使用`react-router-dom`来构建一个包含首页、详情页和关于页的SPA。最后还提供了一个练习题,让读者尝试重写文章详情组件以显示真正的文章详情。
Django+React全栈开发:界面优化
RESTDjango这篇文章主要讲解了前端开发中的一些操作,包括时间处理、条件渲染、样式添加等内容。具体包括:使用`dayjs`库处理时间,实现显示文章创建时间和更新时间;使用条件渲染,在加载数据完成前显示“加载中”字样;使用CSS文件和内联样式为组件添加样式;使用原子化CSS和TailwindCSS框架来美化页面。这些操作对于前端开发人员来说是非常重要的,可以帮助他们快速构建出美观且实用的用户界面。
Django+React全栈开发:视图
RESTDjango这篇文章介绍了如何使用Django REST framework来构建一个API。文章首先介绍了基本视图的写法,然后介绍了API view和类视图的写法,最后介绍了viewsets的写法。文章还介绍了如何使用官方提供的路由系统routers与viewsets搭配使用。
Django+React全栈开发:前置知识
RESTDjango这篇文章介绍了在互联网时代中常见的程序类型,如C/S和B/S架构,以及Web服务器和Web框架的概念。还介绍了MVC模式,Django的MTV模式,以及前端与后端的概念。文章强调了学习时多造轮子的重要性,但在实际生产生活中则尽量应用成熟的已有的应用。
Django+React全栈开发:序列化器
RESTDjango文章介绍了 REST framework 的使用方法,首先是安装 REST framework 并将其添加到 Django 项目的设置中。然后介绍了如何扩展模型,包括创建 Article 模型以及在其中定义字段。之后,文章介绍了如何创建序列化器来对模型进行序列化和反序列化,包括手动创建序列化器和使用 ModelSerializer。最后,文章介绍了如何在交互模式下使用序列化器。
Django+React全栈开发:MTV初试
Django这篇文章讲解了如何在 Django 中创建一个简单的博客应用程序。它首先介绍了环境配置,包括操作系统、Python 版本、Django 版本、Node 版本和编辑器。然后,它指导读者下载 Django 并创建项目和第一个 Django app。接着,它介绍了如何编写模型、视图和模板,并演示了如何使用 Django 的后台管理功能来管理文章。最后,它提供了练习建议,鼓励读者去官网跟着官方给的小教程敲一遍代码。
Django+React全栈开发:前言
ReactRESTDjango这篇文章主要介绍了如何使用Django和React进行开发。它首先列出了开发环境,包括后端的后端Django、DRF,前端的React、NextJS、TailwindCSS,以及操作系统Manjaro Linux。然后,它介绍了阅读本系列文章需要具备的前置基础,例如Python和JavaScript语法基础,以及一台可用的电脑。最后,它介绍了该系列文章的许可协议和问题交流方式。
近期关于哲学的一些感想
哲学这篇文章探讨了哲学的本质及其与现实生活的关系。作者认为,哲学是对人生的系统性反思,并不是远离现实生活的空谈。哲学家对名、实关系、矛盾双方相互转化的思考,都反映了他们对现实世界的深刻洞察。虽然哲学本身并不创造任何东西,但它能给我们一种看待世界的新视角,帮助我们换一种角度思考,从而在现实生活中获得积极有用的启示。
通过WebAssembly实现插件机制
Rust这篇文章分为三个部分,分别介绍了插件、WebAssembly以及总结。在第一部分,作者介绍了插件的原理和实现方法,并讨论了在Rust中动态加载插件的可能性。在第二部分,作者介绍了WebAssembly的概念、原理和实现方法,并演示了如何在Rust中调用WebAssembly编写的函数。在第三部分,作者总结了WebAssembly的前景。
谈谈目的与手段
随想这篇文章探讨了人们在选择工具时容易陷入“工具至上”的误区,忘记了工具是用来辅助人完成工作的。作者以程序员圈子中对最佳语言、最佳编辑器的争论为例,指出人们往往把追求工具的目的(提高生产力、简洁性等)当成了目的本身。作者还提到,自己在下围棋时也曾陷入类似的误区,原本下棋只是为了享受计算中纯粹的乐趣,最后却常常因为输棋而陷入苦恼,想要提高棋力,又强迫自己下下去,最终却丢失了想要的乐趣。作者认为,我们需要多多思考,辨别手段与目的,避免在追求工具的路上迷失自己。
百宝箱:Vim进阶之路
Vim工具这篇文章描述了作者学习 Vim 编辑器的经历,总结了三个阶段的使用经验。第一阶段,作者习惯了 Vim 的编辑方式,但仍然有鼠标思维,导致效率不高。第二阶段,作者开始记忆更多的快捷键和技巧,提高了对 Vim 的熟练程度,减少了鼠标思维。第三阶段,作者意识到高效使用 Vim 需要思维方式的转变,需要思考如何更少的按键。文章还举了一些例子来说明如何通过思考来提高编辑效率。最后,作者总结说,虽然 Vim 是一个强大的编辑器,但并不推荐编程新手使用,因为新手需要一个功能齐全的 IDE 来提高效率。
再见,2020
总结文章记录了作者2020年的工作、学习和生活经历。在技术领域,作者学习了React、C#、TypeScript和Rust等编程语言,还参与了开源项目的贡献。在生活方面,作者去了郑州旅游,与对象见面。文章最后列出了2021年的目标,包括与爱的人一起度过2021、用ASP.NET core建一个问答论坛、深入了解Azure Function与Blazor、用Rust实现一个基于中间件的异步HTTP服务端框架、练听力,学好英语、看完两本厚书:CSAPP、SICP等。
论博客的进化与前端发展史
ReactDjango这篇文章描述了作者使用NextJS重新构建个人博客的技术栈变更历程。作者一开始使用Django和MySQL搭建了博客,但随着对前端技术的学习,他逐渐将博客的后端部分提取出来,使用RESTful风格的API和Docker来部署。为了解决SPA单页应用的SEO问题,作者使用了NextJS框架,它采用约定式路由和服务端渲染的方式来实现更好的搜索引擎优化。NextJS还提供了Link组件和Shallow Routing等功能,可以在不重新加载整个页面的时候更新部分内容,从而提高页面的切换速度。作者还使用了GraphQL和Serverless技术来进一步优化博客的性能和部署方式。最后,作者表达了对未来使用Blazor框架来构建SPA后台的计划。
刷题笔记0x07:不同路径
算法动态规划这篇文章讨论了一个机器人从网格左上角移动到右下角的不同路径数问题。它首先介绍了问题的描述,然后提出了一个递归公式 `f(x, y) = f(x-1, y) + f(x, y-1)` 来计算从起点到坐标点 `(x, y)` 的路径数。接着,文章解释了如何使用二维数组来避免数组索引出现负数,并提供了代码实现。最后,文章还提到了可以用排列组合的方法来解决这个问题。
给个人博客添加后台管理友链与全站公告功能
DjangoPython这篇文章介绍了如何在个人博客网站上添加友情链接和全站公告通知功能。首先,作者创建了一个名为“extras”的 Django 应用,并添加了一个 FriendLink 模型来存储友情链接数据。然后,作者创建了一个 Django 模板标签,以便在需要显示友情链接的地方使用。接着,作者创建了另一个模型 SiteMessage 来存储全站公告数据,并同样创建了一个模板标签来显示全站公告。最后,作者还对网页结构进行了一些调整,使之更加协调。
刷题笔记0x06:双指针问题
算法Python文章讨论了leetcode上双指针问题的解决方法和思路。对于三数之和问题,它首先介绍了暴力穷举和用哈希表换时间的方法,然后介绍了利用排序和双指针降低时间复杂度的方法以及一些需要注意的细节。接着,文章介绍了删除链表倒数第N个节点问题的解决方法,它首先介绍了两个指针跑的过程,然后介绍了注意链表长度为n,要求删除倒数第n的情况。最后,文章还提到了两个相似的题目:最接近的三数之和与四数之和。
刷题笔记0x08:石子游戏
动态规划这篇文章给出了一个动态规划算法来求解游戏“Nim”的必胜策略,这个问题的条件是:有两堆石子,两人轮流任意取走一堆中任意数量的石子,最后不能取走石子的人输掉游戏。文章旨在回答谁能够赢下游戏,即谁能够让对手不能取走石子。该算法使用了一个三维数组 `dp[i][j][2]` 来存储游戏状态,其中 `i` 表示先手能取石子的位置的最小值,`j` 表示先手能取石子的位置的最大值,`2` 表示先手和后手两种情况。算法通过递推的方式来计算 `dp` 数组,最终得出先手能否赢下游戏的结论。
Django+React全栈开发:代码组织
React这篇文章讨论了在 JavaScript 中使用 ES6 模块组织代码的方法,包括导入和导出模块、模块的命名和别名、以及如何将代码组织成不同的模块。文章还介绍了在 React 中如何将组件拆分成不同的模块,以及如何使用默认导出的文件。
Ant Design Pro页面内切换组件问题
React这篇文章主要讨论了在`Ant Design Pro`中使用`Tab`组件切换不同详情内容的实现方法。作者首先介绍了遇到的问题,然后提出了几种可能的解决方案,最终采用结合`React`的`Suspense`和`React.lazy`实现动态引入子组件的方法。文章还讨论了在工程实践中权衡项目进度与代码优化的重要性。
Serverless学习笔记0x00
PythonServerlessFastAPI本文介绍了 AWS Lambda、触发器、SAM、共享依赖、Fastapi 等内容。AWS Lambda 是一种无服务器计算服务,无需预置或管理服务器即可运行代码。触发器负责根据不同方式调用函数,如 API Gateway、CloudWatch Events 等。SAM(AWS Serverless Application Model)是一种脚手架工具,可以帮助快速构建所需的 Serverless 应用。共享依赖功能允许多个函数共享相同的第三方库或通用代码,无需在每个函数中重复上传依赖。Fastapi 是一个 Python Web 框架,可以用来构建 RESTful API。文章描述了如何将一个本地 Fastapi 项目快速迁移到 Serverless 架构中。最后,文章列出了一些需要进一步了解的问题,如基于 Lambda 的身份验证、Websocket API、持续集成等。
简单探索Rust Web开发
Rust这篇文章评测了 `Rust` 的 web 开发相关框架,并与微软的 `Blazor` 在 `WebAssembly` 部分做了简单的对比。作者对 `Actix` 和 `Rocket` 这两个 `Rust` 中最知名的 web 框架进行了介绍,并讲述了如何使用它们来构建简单 web 应用。然后,作者介绍了 `Rust` 中使用 `serde` 进行数据序列化的过程,并展示了如何使用 `Actix` 处理 JSON 请求和返回 JSON 响应。接着,作者简要介绍了 `Rust` 的 `trait` 机制,并展示了如何使用 `trait` 来实现自定义类型。最后,作者对 `Yew` 和 `Blazor` 这两个 `Rust` 和 `dotNET` 的前端框架进行了对比,并对 `Rust` 和 `dotNET` 在 Web 开发领域的未来发展进行了展望。
刷题笔记0x09:单词拆分
动态规划算法这篇文章介绍了如何使用动态规划解决一个字符串分割问题,即判断一个给定的字符串能否被空格拆分为一个或多个在字典中出现的单词。文章从分析题意、设计状态转移方程到代码实现,最后还探讨了代码优化方案。文章思路清晰,代码简洁,是一篇优秀的算法题解。