自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

陈戏猿

没有bug的程序就像不加糖的奶茶,是没有灵魂的。

  • 博客(231)
  • 资源 (8)
  • 收藏
  • 关注

原创 【Janet】元组

Janet语言中的元组是不可变的顺序数据结构,支持方括号和圆括号两种形式。摘要:1)元组可通过[]字面量或tuple函数创建;2)可作为表的键使用;3)支持按元素顺序进行比较和排序;4)方括号元组在宏和延迟求值时特别有用;5)与普通元组在打印和相等性比较上存在差异,但功能基本相同。元组提供了与数组类似的操作函数。

2025-11-22 15:44:26 129

原创 【Janet】结构体

摘要:结构体是Lisp中不可变的键值对数据结构,类似表但不可变。可通过字面量或struct函数创建,内容相同的结构体视为相等。支持通过get或函数调用方式取值,但不能修改。表可通过table/to-struct转换为结构体。由于结构体基于内容判等,可用作表键,如表示坐标点并关联值。示例展示了创建结构体、取值及作为键使用的场景。

2025-11-21 19:29:51 144

原创 【Janet】Table

摘要:Janet中的表是一种灵活高效的关联数组数据结构,支持任意类型键值(除nil和math/nan外)。可通过字面量或table函数创建表,使用get/put/set函数操作值。表支持原型机制实现继承,并提供了丰富的操作函数如keys/values/merge等。表调用时可直接作为查找函数使用,插入nil值会删除对应键。

2025-11-20 21:48:59 205

原创 【Janet】Buffer

Janet语言中的缓冲区是一种可变字节序列数据结构,功能类似字符串但支持修改操作。摘要要点:1)缓冲区以@符号开头创建;2)支持通过get/put操作读写字节;3)可使用slice获取子缓冲区;4)提供多种push方法添加数据,如push-byte、push-string等。缓冲区适用于处理二进制数据、字符串拼接等场景,具有自动扩容特性,是Janet中处理字节序列的核心数据类型。

2025-11-18 21:11:51 275

原创 python xmlrpc踩坑记录

摘要:作者在Windows平台使用Python标准库的xmlrpc模块时,遇到RPC调用延迟2秒的问题。通过日志排查发现,从客户端发起请求到服务端接收竟耗时2秒多,而实际处理仅需几毫秒。最终发现是使用"localhost"地址导致的性能问题,将其改为"127.0.0.1"后立即恢复正常。文章详细记录了问题排查过程,排除了异步调度、RPC服务端代码、DNS解析等其他可能性,揭示了Windows平台下"localhost"地址的特殊性能问题。

2025-11-17 17:42:33 396

原创 【Janet】数组

摘要:Janet中的数组是可变的序列数据类型,支持高效操作。数组通过字面量或array/new创建,支持随机访问(使用in、get)和修改(put、set)。数组可作为栈使用(array/push/pop/peek),还提供slice、map等实用函数。下标从0开始,length获取元素数量,超出范围访问会返回nil或默认值。

2025-11-16 16:24:08 400

原创 【Janet】数据结构

Janet语言提供了6种核心数据结构:表(table)、结构体(struct)、数组(array)、元组(tuple)、字符串(string)和缓冲区(buffer),分为可变和不可变类型。这些数据结构在访问、插入/追加和删除操作上大多具有O(1)的时间复杂度。数组、表、缓冲区是可变类型,支持修改操作;而元组、结构体、字符串是不可变类型。所有数据结构都支持get/in函数进行值访问,可变类型还支持put函数进行修改。length函数可获取所有数据结构的元素数量。该设计提供了高效的数据操作能力,同时区分了可变

2025-11-15 17:32:31 339

原创 【Janet】宏

本文介绍了Janet语言中的宏机制。宏是接受代码输入并输出转换后代码的程序,能够扩展语言本身的语法。文章详细讲解了如何编写宏,包括使用可变参数处理多个函数体表达式、添加文档注释、运用quasiquote优化代码可读性。同时指出了宏编写中的常见问题,如意外绑定捕获(hygiene问题),并提供了解决方案:通过gensym函数和with-syms宏生成唯一符号。文章强调尽管宏功能强大,但容易产生bug,建议优先使用函数,仅在必要时使用宏。

2025-11-14 19:10:04 694

原创 【Janet】循环

Janet语言提供了多种循环方式来处理常见编程任务。基础while循环可用于迭代,但更推荐使用高级宏如for和loop来实现数字范围遍历。loop宏支持:range、:in等动词和:when修饰符,比基础循环更灵活。对于数组遍历,可用each宏或map函数;对于字典遍历,可用loop配合:pairs或:keys,或使用eachk/eachp宏。Janet的next函数是核心迭代机制,支持所有可迭代类型。这些特性使Janet能简洁地处理各种迭代场景。

2025-11-13 18:55:22 252

原创 【Phoenix】插件(Plug)

Phoenix框架的HTTP层核心是插件系统,其基本思想是统一"连接"概念,分为函数插件和模块插件两种形式。函数插件只需接收连接和选项参数并返回连接,模块插件则需实现init/1和call/2函数。插件可灵活插入Endpoint、路由器和控制器等不同层级,实现请求处理、参数解析、会话管理等功能。通过组合多个插件,可以构建模块化的请求处理管道,实现条件检查、重定向等复杂逻辑,体现Phoenix的可拔插设计理念。

2025-11-12 20:34:02 1000

原创 【Janet】字符串,关键字,符号

摘要:Janet语言支持关键字、符号和字符串三种标签类型,均可用作表和结构体的键。关键字以冒号开头,符号需要引号引用,而字符串用于文本和字节序列存储。文章详细介绍了字符串操作,包括子串提取、查找替换、分割拼接以及大小写转换等功能。所有类型都是不可变的,关键字和符号针对相等比较做了优化,是表的键的首选。字符串处理兼容ASCII和UTF-8编码,提供丰富的操作函数但不支持正则表达式。

2025-11-12 19:11:29 234

原创 【Janet】函数

Janet是一种函数式编程语言,支持多种函数定义方式。通过defn可以定义具名函数,fn创建匿名函数,|宏提供简洁的匿名函数语法。函数支持可选参数(&opt)、可变参数(&)和关键字参数(&keys)。作为一等公民,函数可像普通值一样传递和操作,支持嵌套调用和参数默认值设置(default)。该语言还提供了参数解构和多种调用风格转换功能,使代码更简洁灵活。

2025-11-11 18:44:38 730

原创 Elixir websocket客户端

本文介绍了Elixir生态中两个WebSocket客户端库:WebSockex和Fresh。WebSockex采用类似GenServer的方式工作,提供连接管理、消息处理等回调,支持重连机制。Fresh基于Mint生态,同样遵循GenServer模式,但对协议和命名有更严格要求。两个库都提供了完整的WebSocket功能实现,包括连接管理、消息收发、错误处理等核心功能,适合不同场景下的WebSocket客户端开发需求。

2025-11-10 21:29:59 1269

原创 【Janet】控制流

Janet语言提供两种基本控制流原语:if表达式用于条件分支,接受2-3个参数(条件、真分支和可选的假分支);while循环用于重复执行,当条件为真时循环执行后续表达式。此外还提供了更高级的控制结构宏,如cond、case、when用于条件判断,以及loop、seq、generate等循环宏,这些宏能简化代码编写,提供类似Python和Clojure中的列表推导功能。

2025-11-10 20:34:16 208

原创 【Janet】绑定(def和var)

摘要:Janet语言使用def创建不可变词法作用域绑定,var创建可变绑定,set修改可变值。作用域可通过do表达式和fn闭包创建,let宏可便捷实现多绑定。def和var支持:private选项实现私有化,并可通过字符串添加文档说明。绑定的作用域规则有效组织程序结构,防止命名冲突。

2025-11-09 19:48:33 172

原创 【Janet】比较运算符

Janet语言提供两类比较运算符:原始比较(=, <, <=, >, >=)和多态比较(compare=, compare<等)。原始比较基于内部类型码排序,支持多参数链式比较,但对不同类型可能产生意外结果。多态比较通过compare函数实现类型感知的比较逻辑,更符合语义但性能较低。此外,deep=用于深度比较可变数据结构内容,而原始=仅判断对象同一性。开发者可根据需求选择适合的比较方式,自定义类型可通过实现:compare方法来支持多态比较。

2025-11-08 13:22:48 427

原创 【Janet】数字与算术运算

Janet语言支持基本算术运算和丰富的数字表示方式。算术运算采用前缀表达式,支持加减乘除、取余等操作,所有数字均为IEEE 754双精度浮点数。数字字面量可采用十进制、自定义进制(2-36进制)和科学计数法表示,支持使用下划线分隔和不同进制前缀(如0x表示十六进制)。此外,Janet还提供从C标准库借鉴的数学函数(如三角函数、对数等)和位运算功能(如bor、band等),位运算仅适用于整数处理。该语言灵活支持多种数字格式,但最终都会转换为双精度浮点数。

2025-11-07 19:06:47 223

原创 【Janet】特殊表达式

Janet 核心语法摘要 Janet 语言包含 13 种核心特殊语法,构成其基础功能。def 创建不可变绑定,支持解构赋值;var 创建可变绑定。函数定义使用 fn,可递归调用。do 创建代码块和词法作用域。quote 实现字面引用,if 提供条件分支。splice 解构数据结构,相当于取消引用。while 和 break 实现循环控制,后者可用于提前退出函数或循环。这些语法共同构成了 Janet 的核心功能,其中部分语法支持元数据和文档字符串。特殊语法既不是函数也不是宏,而是编译器直接处理的底层结构。

2025-11-06 20:15:12 945

原创 【Janet】语法与解析器

Janet 程序的生命周期始于 UTF-8/ASCII 编码的源文件,其语法类似 Lisp,采用同构设计,代码可直接表示为数据结构。核心语法包括:nil/true/false 字面量、符号(支持 Unicode)、关键字(以冒号开头)、多种数字表示法、字符串(支持转义)和长字符串(使用反引号)。数据结构支持元组、数组、结构体和表(table),分别使用圆括号/方括号、@符号和大括号表示。注释以#开头,并提供了quote/splice等语法糖。Janet解析器严格区分解析和执行阶段,通过宏而非读取器宏来扩展语

2025-11-05 19:29:16 729

原创 【Janet】介绍

摘要 本文档详细介绍了Janet编程语言的安装和基础使用指南。主要内容包括: 安装方式: Windows推荐下载预编译安装包 macOS可使用Homebrew安装 Linux系统需从源码编译 源码编译: 提供Unix-like系统、FreeBSD和Windows的详细编译步骤 支持Meson和最小化构建选项 入门示例: 展示了经典的"Hello World"程序 介绍了带命令行参数处理的进阶示例 解释了Janet的函数调用语法和REPL使用 核心功能: 内置300+函数和宏 提供doc宏

2025-11-04 21:12:42 1269

原创 async与await

Python中的async和await是用于异步编程的关键字,async定义异步函数,await等待协程执行。asyncio.create_task实现真正的异步执行,而asyncio.run是同步执行方式。通过asyncio.gather可以并发多个协程。文章还对比了Go语言的并发实现,帮助理解异步编程概念。Python的异步机制通过协程切换实现并发,在I/O密集型任务中能提高效率。

2025-10-28 13:04:33 396

原创 机器学习之优化器

摘要:优化器是用于更新模型参数的函数,核心算法是随机梯度下降(SGD),通过调整学习率和梯度来优化收敛速度和稳定性。常见优化器包括Momentum(平滑梯度)、RMSProp(调整学习率)、Adam(结合Momentum和RMSProp)等。Axon库中实际使用的是Polaris库提供的多种优化器,如adabelief、adamw、lamb等,它们在不同场景下对梯度或学习率进行改进,以提高训练效果。优化器的选择需根据具体任务需求,关注收敛速度和稳定性。

2025-09-29 21:44:42 649

原创 机器学习之损失函数

在训练过程中,神经网络模型可以简化为上图中的4部分,今天的主角是损失函数。损失函数的作用是量化模型预测值与真实值之间的差别,也就是负责告诉优化器模型错没错,错的有多离谱。优化器再根据损失函数的结果调整模型参数,模型训练的过程很像是一个负反馈网络。严格来说,优化器利用的不是损失函数的结果,而是它的导数,也就是梯度。因此损失函数不一定具有零点,但是一定要有最低点(最小值),也就是它的梯度一定要有零点。其次是它必须可导,这样才能求梯度。我们学到的第一个二次函数yx2就是这样的函数。YYi​iyy。

2025-09-24 21:17:27 923

原创 网格纹理采样算法

本文介绍了一种将二维纹理数组渲染到屏幕的方法。由于无法直接将相机渲染结果存入纹理数组,作者采用将多张纹理拼接成网格纹理的方案,并配合索引纹理存储每个像素对应的纹理下标。文章重点阐述了在Shader中如何通过索引纹理定位到网格纹理的具体子图:先将归一化索引乘以行数分离出行列信息,再结合原始UV坐标计算出最终采样位置。该方法通过优化计算步骤,仅用一行代码即可完成行列坐标转换,显著提升了渲染效率。文中提供了完整的Shader代码实现,展示了如何从网格纹理中正确采样RGB通道对应的像素值。

2025-08-31 00:11:16 1001

原创 Unity自定义Inspector面板之使用多选框模拟单选框

摘要:Unity中可通过继承Editor类自定义Inspector面板,但缺少原生单选框支持。文章介绍了使用Toggle模拟单选框的方法:先用bool变量实现双选一(需处理点击已选项的问题),后用int变量扩展至多选一(更稳定)。核心思路是让多个Toggle共享状态变量,点击时更新变量值。最终方案能实现真正的单选效果,且支持任意数量选项。(149字)

2025-08-27 10:26:35 423

原创 贝叶斯定理 vs 条件概率

贝叶斯定理是概率论中的重要概念,它描述了条件概率之间的关系。基础公式为P(A∩B)=P(A)×P(B|A),即联合概率等于单独概率乘以条件概率。贝叶斯公式变形为P(B|A)=[P(B)×P(A|B)]/P(A),揭示了先验概率(P(B))、似然度(P(A|B))和后验概率(P(B|A))之间的关系。该定理可用于证据更新,如通过天气观测调整是否带伞的决策(示例中乌云出现使下雨概率从50%升至75%)。贝叶斯定理在分类、预测等实际问题中有广泛应用,体现了通过新信息不断修正概率估计的思想。

2025-08-08 16:59:32 888

原创 概率密度 vs 正态分布

本文探讨了概率密度与概率的区别与联系。作者通过高尔顿板实验类比正态分布,指出概率密度本质上是样本数量的增长率而非概率本身。文章强调,正态分布的函数值代表的是样本分布规律,其积分能表示概率是归一化带来的数值巧合。通过离散到连续的转化过程,作者解释了概率密度作为样本数量增长率的数学定义,并说明其函数值需乘以微小区间宽度才能得到实际样本数量或概率增量。最终指出概率密度函数表示的是概率增长率,而非直接的概率值。

2025-08-08 16:15:22 642

原创 Elixir 协议与行为

Elixir中的协议(protocol)和行为(behaviour)是实现多态的两种机制。协议基于数据类型实现多态,通过defprotocol定义接口,用defimpl为特定类型提供实现。行为则针对模块,使用@behaviour和@callback定义模块接口,确保实现模块符合规范。两者的关键区别在于:协议作用于数据类型,行为作用于模块。协议允许扩展内置类型,而行为更适用于模块间的接口约定。 (150字)

2025-08-01 17:54:19 901

原创 Unity相机控制

本文探讨了如何实现相机视角控制,重点解决锁定Z轴旋转时出现的镜头歪斜问题。作者首先分析常规旋转控制方法存在的缺陷,包括欧拉角解算导致的视角异常,然后尝试使用世界坐标系旋转,但发现仍无法完全解决问题。最终提出通过记录初始欧拉角并手动更新旋转的方案,同时引入Y轴方向校验机制,确保相机在任何角度下都能保持"镜头朝上"的效果。文章通过代码示例和GIF动图直观展示了不同方案的优缺点,为开发者提供了实用的相机控制实现思路。

2025-08-01 17:45:52 1249 2

原创 WindowsTerminal美化

本文介绍了Windows终端美化配置方法。主要内容包括:1)下载安装Fira Code字体并设置为终端字体;2)通过安装包或官网教程安装OhMyPosh工具;3)创建PowerShell配置文件并设置主题,可更换多种官方主题样式;4)最后修改执行权限完成配置。整个流程简洁明了,适合想要美化终端界面的用户。

2025-06-28 16:43:57 581

原创 Ubuntu20.04离线安装Realtek b852无线网卡驱动

在Ubuntu 20.04安装过程中遇到无线网卡驱动问题,需手动安装Realtek RTL8852BE驱动。首先通过lshw和lspci命令确认网卡型号,从GitHub下载源码并编译安装。安装前需解决gcc、make等依赖问题,并关闭BIOS安全启动。安装完成后需修复因离线安装导致的库版本问题。此外还提供了有线网卡驱动安装方法。整个过程涉及硬件识别、驱动编译、依赖管理和系统修复,展现了Linux环境下硬件适配的典型挑战和解决方案。

2025-06-28 16:42:05 2228 3

原创 Mix工程的运行方式

这篇文章总结了Elixir工程管理工具Mix的运行方式,主要包括: 创建方式:mix new创建库,mix new --sup创建带监督树的应用 运行方式: iex -S mix: 开发调试时在交互式Shell中运行 mix run: 运行应用,默认启动入口是Application行为中的start函数 自定义Mix任务:将代码放在lib/mix/tasks/目录下,通过mix命令调用 打包发布方式: Escript:打包为命令行程序,需要escript执行 Release:构建自包含的发布包,包含Erla

2025-06-27 12:06:34 1395

原创 Go和Elixir极简HTTP服务对比

摘要:本文对比了Go和Elixir两种语言实现原生HTTP服务的过程。在Go中,标准库提供了简洁的网络服务实现,只需几行代码即可完成;而Elixir则需要依赖Plug库,使用Mix工具创建项目并添加相关依赖。两者在处理HTTP请求的方式上有明显差异:Go使用接口实现处理器,Elixir通过Plug行为定义处理逻辑。最新Go 1.22版本增强了路由功能,支持方法匹配和路径参数,而Elixir则通过Plug.Router提供路由功能。两种语言在设计理念和实现方式上各有特色,体现出不同的编程范式。

2025-06-27 12:04:24 1184

原创 编译UltraleapTrackingWebSocket

示例代码看起来很简单,但是要实际运行起来还需要一些条件。在示例代码中,我们看到它连接的是6437端口,这其实是一种比较老的 Leap Motion 使用方式了,6437实际上是一个 websocket 端口,Leap Motion 驱动会通过这个端口将数据帧发送给连接的客户端,这一功能是给LeapJs库使用的,让网页端也能使用 Leap Motion,但是自从5.0版本以后,这一功能就从 Leap Motion SDK 中删除了。LeapJs。

2025-06-26 16:59:53 1037 3

原创 Qt 5.15.2编译安卓QGC指南

编译安卓版QGC的血泪史:作者多次尝试在不同Qt版本(6.8.2/5.12.9/5.15.2)下编译均告失败,最终通过Qt 5.15.2成功。过程曲折包括:Qt版本兼容问题、安卓环境配置困难、磁盘空间不足等。关键解决步骤:使用阿里云镜像安装Qt 5.15.2、配置JDK 11、正确设置Android SDK路径。文章详细记录了开发环境配置的坑与解决方案,为安卓版QGC编译提供了宝贵经验。

2025-06-26 13:48:17 2597 19

原创 APM 仿真遥控指南

地面站开发了一段时间了,由于没有硬件,所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析,显示无人机状态,给无人机发送消息,实现一键起飞,飞往指定地点,降落,返航等功能,本期我们来看看如何在模拟器中实现对无人机的遥控。

2025-03-22 23:11:59 1692

原创 PostgREST 权限篇

PostgREST 本身并没有权限管理的功能,而是将权限验证下放到了数据库层,通过数据库的角色来控制用户访问数据的权限,而 PostgREST 唯一要做的事就是获取每个请求发起者的角色,然后切换到这个角色再去执行 SQL,成败就看这个角色所具备的权限了。为了安全的获取用户的角色,PostgREST 使用了 JWT 来传递角色信息。但是 PostREST 只能解析 JWT token,用户登录以及如何生成 jwt token 需要我们自己实现。在中,我们创建了todos。

2025-03-19 15:00:38 1160

原创 PostgREST 入门篇

PostgREST 是一个为 PostgreSQL 数据库提供 REST API 的后端服务, 是用 Haskell 开发的开源软件,源代码非常值得学习。有了 PostgREST,搭配 PostgreSQL,只要建好表,加上一个简单的配置,就可以拥有一个 REST API 后端,简直不要太爽。

2025-03-14 13:04:47 1187

原创 使用easytier远程内网电脑

最近换了个工作地,需要用自己的笔记本去远程另一台内网主机,因为我的笔记本和要远程的主机在不同的局域网内,无法直连,所以前一段时间一直用的向日葵远程桌面进行远程。用了一段时间实在受不了了,要强制登录,还到处弹广告,右下角浮窗也关不掉,加上最近连接也不是很稳定,加上工作的问题,搞得心情实在是很糟糕,一怒之下我决定自己搭建一个vpn连接,用Windows原生的远程桌面。顺便一提,之前写的这篇说的就是向*葵。搭建VPN需要一台公网电脑做为跳板,我没有可以公网访问的电脑。于是我找到了。

2025-03-12 10:45:07 4574 2

原创 Go加spy++隐藏窗口

除了使用 spy++ 去获取句柄,还可以直接在 Go 中调用 Windows 的相关 API 获取窗口句柄,比如获取活动窗口句柄,获取当前鼠标下的窗口句柄等。更进一步,窗口句柄可能会变,这里的方法其实是一次性的。但是窗口的类名一般不会变,我们可以记录下要隐藏窗口的类名,然后定期检查,只要窗口出现就给它隐藏掉。思路很简单,用 spy++ 找到要隐藏的窗口的句柄,然后调用 Windows 的。最近发现有些软件的窗口就像狗皮膏药一样,关也关不掉,一点就要登录,属实是有点不爽了。啊,世界终于清净了。

2025-03-06 18:12:14 486

MinGW-W64-builds-4.2.0

win64版mingw编译器。

2025-09-01

UltraleapTrackingWebSocket

leapmotion websocket服务,通过websocket获取leapmotion手势数据,适用于高版本leap motion sdk使用LeapJS,或者其他从ws获取leapmotion数据用于交互的库。

2025-08-28

Unity相机控制脚本

Unity相机控制脚本: 1. 支持相机自由旋转,锁定Z轴旋转。 2. 支持相机移动,持续移动加速。 3. 支持左键点选目标后环绕目标移动。 4. 支持右键点击目标后让相机前往目录点。

2025-08-01

LeapMotion的LeapSDK

编译UltraleapTrackingWebSocket时需要用到的LeapSDK依赖。

2025-04-25

adb(免安装).zip

adb命令免安装版本,解压即可使用。

2023-08-09

WindowsTerminal配置文档.pdf

WindowsTerminal官方配置文档,安装方式:microsoft Store搜索WindowsTerminal即可下载

2020-11-17

为Windows的右键->新建菜单添加新建Markdown文件选项

在Windows的右键->新建菜单项中添加【新建Markdown文件选项】,前提是已安装Typora编辑器。

2019-12-05

Geany美化配置文件

Geany配置文件,用于美化你的Geany。解压后替换掉你电脑上C:\Users\用户名\AppData\Roaming下的geany文件夹,重启Geany生效。

2019-11-09

Geany暗黑主题文件

Geany暗黑主题文件,下载后放到Geany安装目录\share\themes\MS-Windows\gtk-2.0\下替换掉原来的gtkrc文件,建议备份原来的文件。

2019-11-09

graSSHopper Setup 1.1.6.exe

一款免费的SSH工具,界面美观,功能丰富。

2021-03-28

redis-gui-Setup-1.1.2.exe

一个免费的,有界面的redis客户端

2021-03-28

Beekeeper-Studio-Setup-1.10.2.exe

一款不错的开源SQL客户端,支持常用数据库和各大平台,界面美观。

2021-03-28

ColorBlack.css

ColoeBlack是一个非常漂亮的Typra黑色主题,由NightYuxl经过了一点自定义,比如不同颜色的标题,行内代码高亮,漂亮的字体等。整个主题只有一个css文件,非常简单,你也可以再进行个性化的修改,不满足于Typora官方主题的可以试试。

2020-05-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除