Compare commits

...
3 Commits
Author SHA1 Message Date
li-chx e4c08e4b0a 添加新文章 CGroup 实验记录 记录一次有趣的工作流 2025-08-30 22:45:37 +08:00
li-chx 565aff4a59 完成从旧站的搬运 2025-08-27 11:19:39 +08:00
li-chx f667c37701 从旧站搬运一批文章 2025-08-26 01:34:11 +08:00
32 changed files with 1343 additions and 38 deletions
@@ -0,0 +1,43 @@
---
{
title: "ChronoCat使用遇到亿点困难 3.28开发小记",
description: "作者在Docker中配置ChronoCat QQ框架时遇到困难,包括版本兼容、VNC显示问题及冻号风险。部分API测试成功,基于Satori协议调用方便。后续计划提供JSON格式的API供其他容器使用,示例包含来源、目标和信息内容。环境问题尚未解决。",
draft: false,
type: "article",
created_at: "2024-03-28T09:26:00+08:00",
published_at: "2024-03-28T09:34:00+08:00",
updated_at: [ "2024-03-28T09:34:00+08:00"],
category: 'Uni',
tags: [ "QQBot" ],
tech_stack: [ "ChronoCat" ],
tech_stack_percent: [ 100 ],
tech_stack_icon_names: [ "mdi:cat" ],
tech_stack_theme_colors: [ "#bc446f" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
## ChronoCat 配置小结
最近一直在弄qq框架 ChronoCat
首先这东西一定得弄在Docker里,我没有精力在原系统做一个vnc,然后再装一个QQ,想想就感觉太地狱了。
但是Docker好像没有足够新的版本,倒是找到了能用的Compose文件,但是好多Api都搞不通,我怀疑是版本问题。
另一方面,有一些消息表明使用早期版本的QQ会导致冻号,虽然我的号还没出问题。
问题落在了完成一份新的Dockerfile上。
但是我没能成功,目前仍然卡在这一步。根据错误消息,我怀疑是vnc和QQ不对付,vnc可以启动,但是看不到QQ的画面。
感觉只要涉及到Linux图形化,最后都会变成一场噩梦。
不过也有好消息,从已经成功测试的部分Api来看,调用Api并不困难,基于Satori协议,还是比较方便的。
可以假设我将在一段时间后解决上述配环境的问题,现在考虑一下后端框架。
首先,我需要提供一批Api,供其他Container使用。
以一个报错信息为例子
需要以下信息:(来自谁,发送到谁(人/组/多组),信息内容(string))
```json
{
"from": "string?",
"to": ["people","groupA","groupB"],
"info": "string?"
}
```
还有很多要考虑的事 要下课了
+133
View File
@@ -0,0 +1,133 @@
---
{
title: "补档 Uni运维小记",
description: "作者在Docker中配置ChronoCat QQ框架时遇到困难,包括版本兼容、VNC显示问题及冻号风险。部分API测试成功,基于Satori协议调用方便。后续计划提供JSON格式的API供其他容器使用,示例包含来源、目标和信息内容。环境问题尚未解决。",
draft: false,
type: "article",
created_at: "2024-03-29T10:30:00+08:00",
published_at: "2024-03-29T11:18:00+08:00",
updated_at: [ "2024-03-29T11:18:00+08:00"],
category: 'Uni',
tags: [ "运维" ],
tech_stack: [ "Docker", "Nginx", "MariaDB", "Azure Devops" ],
tech_stack_percent: [ 40,30,20,50 ],
tech_stack_icon_names: [ "mdi:docker","simple-icons:nginx", "simple-icons:mariadb", "simple-icons:azuredevops" ],
tech_stack_theme_colors: [ "#1c90ed","#109748","#c0765a","#2b99e2" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
#运维
运维的主要任务有:部署代码,配置和维护服务器上的nginx,Docker和mariaDB服务。~~还有背锅~~
运维技术路线:
##Docker
学习[Docker](https://docker-practice.github.io/zh-cn/)会是你的第一课。几乎全部的后端代码都运行在Docker中,Docker提供了服务管理,自动化部署和端口映射功能你需要学习的有关知识有:
Image、Container的概念及相关操作
从Image构建Container,端口映射相关配置
导出Container Log, 进入运行的Container进行检查
从 DOCKERFILE 文件构建Container
从 DockerCompose 构建Container
##nginx
nginx维护的关键是:看懂学长留下的配置文件。然后在其基础上堆上自己的文件,同时保持nginx不崩
目前笔者nginx技术有限。不过多赘述
##mariaDB
mariaDB和Mysql语法略有区别。但大部分都是一致的。作为运维,你需要为后端代码建立所需的数据库。建立数据库,配置用户并不困难。去bing或者谷歌花点时间就能做好。
但是关键是,把带有帐号,密码,地址的字符串传递给后端代码。我将在后续提到。
##Azure
你有很大概率在Azure中看到这份指导文件,但你大概率还不会使用Azure进行代码管理和部署配置。
这里不会讲Commit PR 或是 Branch相关的概念。如果你不了解,你需要去学习Git相关知识。在很大程度上,Azure和Github类似,只是这里不会从搜索引擎中搜到。接下来,我会假设你了解相关概念。
这里主要讲Azure Pipelines的配置
在左侧,你能找到Pipelines。你可以右键,在新窗口中打开。这样就可以不退出本指导。
你可以看到很多Pipeline在其中。排在前面的可能是IWutApi,或是其他什么东西。它们在进行**自动化部署**的工作。每个Pipeline都在持续监测某个仓库的的某个分支,如果发生改变,它会把代码传到制定的服务器,构建,运行。这样,后端开发者就能在第一时间对最新的代码进行测试,并且把最新的代码上线,供用户使用。
这一近乎神奇的操作的关键,是仓库中的一个yml文件,它通常被命名为 ***-pipeline.yml
关于yml文件的配置,我的建议是:抄
```yml
trigger:
- main
resources:
- repo: self
variables:
projectName: iwut-api-prod
stages:
- stage: Deploy
displayName: 部署到服务器
jobs:
- deployment: VMDeploy
displayName: 部署到Uni服务器
environment:
name: JP-tencent
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
- checkout: self
fetchDepth: 1
displayName: 切换到目标仓库分支
- bash: |-
docker compose -p $(projectName) -f docker-compose.yml up --build -d
env:
DeployPort: 5003
ConnectionStrings__App: $(ConnectionStrings__App)
displayName: 运行 docker compose 命令
```
这是目前正在运行的一份pipeline文件。我们来简单分析一下,如果要改在其他工程上,需要改什么。
trigger:规定正在监测的分支名字是什么
projectName:项目名字,改成对应的
stages里,第一个可能要改的是environment,你要部署到哪个服务器。在Pipeline-Environments中,可以看到现在可用的服务器。这个大概率会有人告诉你。但以防万一,这里简单叙述目前的情况。
如果你要部署的是一个需要Debug,后端还在开发的代码,放在uni-tencent上,并且只部署dev分支。
如果你要上线一个供用户使用的新功能,那么JP-tencent是更好的选择,只部署main(或master?)分支
下一个要改的是steps中的bash 这是一行从Docker-Compose启动docker container指令,关于Docker Container创建和端口转发,在Docker-Compose文件中。
然后是env, DeployPort和ConnectionStrings__App
env是环境变量,这里创建了两条环境变量,部署端口和连接字符串。
这里容我粘贴DockerCompose.yml(也能在仓库找到)文件,插入的讲解一下
```yml
version: '3.8'
services:
iwut-api: #目标Contaienr 名字
image: iwut-api:prod #镜像名字
build:
context: .
dockerfile: IWutApi/Dockerfile #DockerFile文件位置,需要修改
args:
BuildConfig: Release #发行环境
environment:
TZ: Asia/Shanghai
ASPNETCORE_ENVIRONMENT: Production #发行环境
ConnectionStrings__App: ${ConnectionStrings__App:?} #数据库连接串
ports:
- ${DeployPort}:80 #端口
extra_hosts:
- "host.docker.internal:host-gateway"
```
这个文件中,发行环境可能会改成Debug或Development,这个看后端需求。
你可以看到 数据库连接串和端口使用了${something} 的形式,这里就是在读取环境变量。
回到之前的Pipeline文件,端口没什么说的了,现在聊聊ConnectionStrings_App
该环境变量 在构建Pipeline过程中加入,如图。![Screenshot_2024-03-25-15-29-23-111_com.realvnc.viewer.android.jpg][1]
右侧添加名字和值,由于该字符串包括密码,所以需要**勾上Keep this value secret**
问题出现了,你 ~~,一个刚准备接锅的运维,~~ 怎么知道这个值怎么填,因为过往的Pipeline这里都是****
两个办法:
如果是新的项目,直接问后端,直接问他怎么填,要个示例。
如果是老项目
还记得之前Docker要求你学习怎么进入容器内部吗?
``` Bash
docker exec -it (DockerID) bash
echo $ConnectionStrings__App
```
当然还有第三个办法,反正代码就在这,不如发挥主观能动性,学习后端。
祝你好运
[1]: https://typecho.lichx.top/usr/uploads/2024/03/1075500197.jpg
@@ -0,0 +1,58 @@
---
{
title: "转向Lagrange.Core 解决Sign服务问题",
description: "作者放弃ChronoCat转向Lagrange.Core,但在发送消息时遇到阻塞。发现未配置Sign服务器导致登录异常。通过阅读源码,自定义SignProvider并硬编码URL后解决问题,成功实现消息发送。",
draft: false,
type: "article",
created_at: "2024-03-29T09:50:00+08:00",
published_at: "2024-03-29T10:19:00+08:00",
updated_at: [ "2024-03-29T10:19:00+08:00"],
category: 'Uni',
tags: [ "QQBot" ],
tech_stack: [ "LagrangeCore","C#" ],
tech_stack_percent: [ 50, 50 ],
tech_stack_icon_names: [ "mynaui:letter-l","mdi:language-csharp" ],
tech_stack_theme_colors: [ "#8f71b0","#a179dc" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
## 事件记录
在群U的劝说下,放弃了ChronoCat,转向了**Lagrange.Core**
初步了解后,我发现这东西竟然有Nuget开发包,我直呼还有这好事,直接对着Api文档开写。
写到发送单对单信息后,开始测试,发现发不出去,就阻塞了,卡在那了,没报错,没异常。
在反复对照,调试了30min后,向Rosemoe求助。
他一开始也觉得没问题,突然问我,**你配Sign了吗?**
我一下子就不懂了
然后他丢给我一个sign的链接 这里就不丢出来了,需要的去telegram找
我就愣住了,然后就开始看文档,看ReadMe 我就发现只有一个地方提到了sign的事 Lagrange.OneBot Appsettings.json里面有一个,要求用户填入。
然后我就把链接填到Docker Contianer里的Appsettings.json 重启 但是没用
更不会了,突然想起来Docker也有log 我决定对比一下我的请求和Docker log 看看有没有什么报错信息。
然后我就发现一个奇怪的事,好像我的请求,和log没什么关系?
而且log里也有用于登录的二维码? ~~这不扫一下~~
然后我发现我的电脑qq被顶下去了,我立刻意识到,它成功登录了,而我的Api调用登录是不成功的。
这时我才意识到Lagrange.Core 和 Lagrange.OneBot是两个东西,关于Lagrange.Core的sign服务配置,只在ReadMe.md有提到
> 暂不提供签名 API,您可能需要在某个地方找到它并在 BotConfig 继承 SignProvider 类的CustomSignProviderBotConfig
之前ChronoCat使用vnc直接显示qq界面,登了就顶,符合直觉。
在调用Lagrange.Core时,如果没有正确配置sign服务器,登录时手机会显示有其他设备登录,但是电脑上不顶号。获取到了BotContext,甚至有uin字段,但是实际是没有登录成功的。
这也解释了为什么Online事件没有正常触发。
#正题 Lagrange.Core sign配置
没办法了,只能试着看源代码了
在这个过程中,Rosemoe给了我OneBot sign 服务实现的代码,位置是
> Lagrange.OneBot.Utility.OneBotSigner
大致的读了一下代码,关键在于:从AppSettings获取了Sign链接,然后配合其他的变量,发送了一条请求,最后返回了一个byte[]
Core下也有类似的代码:
> Lagrange.Core.Utility.Sign.LinuxSigner //这里只考虑Linux
但是该文件中 Url是空的,并且没有函数给它赋值,LinuxSigner继承自SignProvider
SignProvider是BotConfig的一个属性 而BotConfig是Create一个Bot时需要的变量。
看到这,你可能已经明了了
LinuxSigner只有在BotConfig的SignProvider为null时才会被构建,所以需要写一个自己的Signer,然后把里面的url填上。
由于LinuxSigner的url是 private const 我不太确定继承能不能使用新的url,我这里直接继承SignProvider为Sign,然后 copy LinuxSigner,修改url,后面可能改成从AppSettings读取。这里先直接硬写了。
然后使用新的SignProvider初始化BotConfig,重新测试,没有问题。
+16
View File
@@ -0,0 +1,16 @@
---
{
title: "2024.4.10 开发小记",
draft: false,
type: "rambling",
created_at: "2024-04-10T23:35:00+08:00",
published_at: "2024-04-10T23:40:00+08:00",
updated_at: [ "2024-04-10T23:40:00+08:00"],
}
---
做了一晚上实验,又写了一坨屎
在写WinForm程序,因为加载时间过长,决定做个动画。
好消息:动画做出来了 虽然很糙
坏消息:动画播完Form才开始加载
想法:搞个Panel,把Form分到Panel里,然后在新层播动画,处理好两个层的前后关系。让新的Form发完成信号。
+15
View File
@@ -0,0 +1,15 @@
---
{
title: "2024.4.12 开发小记",
draft: false,
type: "rambling",
created_at: "2024-04-12T00:00:00+08:00",
published_at: "2024-04-12T00:11:00+08:00",
updated_at: [ "2024-04-12T00:11:00+08:00"],
}
---
写了一下午实验,屎山代码延申了。部署了新的Pipeline,因为代码的问题卡了一会儿。
今天1999和舟都有新活动 但是完全没有时间打。 ~~虽说下午确实摸了会儿鱼~~
伞的魔术贴终于是掉了,简单学习缝线后,缝了一下。完全谈不上美观,但是足够结实。
突然想起来Leetcode没写,只能之后补上了。
明天又要验收实验,得快点了
+62
View File
@@ -0,0 +1,62 @@
---
{
title: "C#命名规范 for Uni",
description: "C#命名规范:标识符以字母或下划线开头,可含Unicode字符。接口以\"I\"开头(如`IMyInterface`),类、方法、常量用PascalCase,私有字段以\"_\"加camelCase,局部变量和参数用camelCase。特性以\"Attribute\"结尾。清晰命名优先于简洁。",
draft: false,
type: "article",
created_at: "2024-04-08T23:00:00+08:00",
published_at: "2024-04-08T23:29:00+08:00",
updated_at: [ "2024-04-08T23:29:00+08:00"],
category: 'Uni',
tags: [ "C#" ],
tech_stack: [ "C#" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "mdi:language-csharp" ],
tech_stack_theme_colors: [ "#a179dc" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
# C#命名规范
该文是作者对[微软文档](https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/coding-style/identifier-names)的见解,更多详细信息请参照原文档
## 标识符 (变量)
· 标识符必须以字母或下划线(_)开头
· 标识符可以包含 Unicode 字母字符、十进制数字字符、Unicode 连接字符、Unicode 组合字符或 Unicode 格式字符。
· 你可以在关键字前加'@',声明一个与关键字相同的变量,例如:@if 是变量 if。我个人不太建议这么做。
## 命名约定
在介绍命名约定之前,我将先介绍Pascal Case 和 Camel Case
### Pascle Case
形如 DataChecker, ValueCoordinate 之类的命名。将单词间空格删去,所有首字母大写,即是Pascle Case
### Camel Case
Camel Case,又称驼峰法,与Pascal Case及其类似,只是第一个字母不在大写,例如dataChecker, valueCoordinate
### True 命名约定
``` C#
public interface IMyInterface //接口使用I作为开头,其余部分使用Pascle命名法
{
public void MyMethod(); //方法使用Pascle命名法
}
public class MyAttribute : Attribute { } //特性使用Attribute结尾,其余部分使用Pascle命名法
public class MyClass : IMyInterface
{
private readonly int _myVal = 256; //私有变量以_开头,其余部分使用Camel命名法
public void MyMethod()
{
const int MyVal = 1024; //常量使用Pascle命名法
int localVar = MyVal + _myVal; //局部变量使用Camel命名法
}
public int AnotherMethod(int firstParameter) => firstParameter + _myVal; //方法参数使用Camel命名法
}
```
在充分理解以上约定的基础上,清晰胜于简洁
@@ -0,0 +1,108 @@
---
{
title: "KiCAD手动编译安装 on Aarch64/arm64 for 小米平板5 Pro with Ubuntu22.04 installed by tmoe",
description: "作者分享了手动编译KiCAD的详细过程。因版本冲突问题选择从源码编译,处理了OpenGL、CURL、cairo、libgit2、boost等依赖,升级了GCC和Clang版本,并编译安装OpenCascade和wxPython。遇到wxWidgets版本检测错误时修改了CMake脚本。最后使用Ninja进行编译,总耗时较长。",
draft: false,
type: "article",
created_at: "2024-04-10T00:00:00+08:00",
published_at: "2024-04-11T17:34:00+08:00",
updated_at: [ "2024-04-11T17:34:00+08:00"],
category: '个人',
tags: [ "Linux" ],
tech_stack: [ "Linux" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "simple-icons:linux" ],
tech_stack_theme_colors: [ "#263238" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
如果你只是想安装KiCAD,以应该安装官方PPA源然后下载预构建版本
如果你像我一样,遇到了主程序为6.0 其他为8.0 的问题,或者因为什么其他原因决心手动编译。那么,欢迎,祝你好运。
——————————————————————————————————————————————————————————————————————————————————————————
## 依赖处理
源代码下载,我直接使用[github](https://github.com/KiCad/kicad-source-mirror),不小,如果gitee有镜像也可以考虑
[官方构建文档](https://dev-docs.kicad.org/zh-cn/build/linux/) 不长,最好先看一下
首先是处理依赖问题,命令 cmake会检查所有依赖 我这里使用的是:
`cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo ../../`
openGL
'''
sudo apt-get install build-essential
sudo apt-get install build-essential libgl1-mesa-dev
sudo apt-get install libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev
sudo apt-get install libglfw3-dev libglfw3
sudo apt-get install freeglut3-dev
'''
CURL:
`sudo apt-get install libcurl4-openssl-dev`
cairo:
`sudo apt-get install libcairo2-dev`
libgit2:
`sudo apt install libgit2-dev`
boost:
`sudo apt-get install libboost-all-dev`
harfbuzz:
`sudo apt install libharfbuzz-dev`
提升Clang版本至Clang-15
提升Gcc版本(必要性存疑)至gcc-12
`sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12`
理论上来说,KiCAD由gcc编译,但是提升Clang版本才让我实际解决了问题
安装OpenCascade
[过程见此文章](https://blog.csdn.net/smart_jackli/article/details/128132773)
编译约耗时1h45min
wxpython:
`sudo apt install -y libgtk-3-dev`
`pip install wxpython`
编译约耗时50min
`pip install wxWidgets`
我是在Cmake过程中,不断检查依赖,完成的这篇文章。当进行到这里时,我出现了一个问题:
'''
CMake Error at CMakeLists.txt:992 (message):
wxWidgets 3.2.0 or greater is required
'''
但是,我已经安装了wxWidgets 3.2.2
检查相关的Cmake脚本,定位到这一段:
/cmake/FindwxPython.cmake
'''
set( _py_cmd "import wx;print(wx.wxWidgets_version.split(' ')[1])")
execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "${_py_dll}${_py_site_path}${_py_cmd}"
RESULT_VARIABLE WXPYTHON_WXVERSION_RESULT
OUTPUT_VARIABLE WXPYTHON_WXVERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if( NOT WXPYTHON_WXVERSION_RESULT EQUAL 0 )
set( WXPYTHON_WXVERSION "3.0.2" )
message( WARNING "Could not determine wxWidgets version used by Phoenix, "
"requesting ${WXPYTHON_WXVERSION}" )
endif()
'''
你可以像这段代码一样运行一下:
`import wx;print(wx.wxWidgets_version.split(' ')[1])`
我的结果是3.2.2.1
这里我直接修改脚本 把 3.0.2 修改为 3.2.1
如果你没遇到这个问题,那是最好的。如果遇到了,可以先这么改。
你可能会有疑问 为什么是3.2.1 这是因为之前apt安装的wxWidgets 就是3.2.1 如果这里不匹配有会报错
unixodbc
`sudo apt-get install unixodbc-dev -y`
`sudo apt-get install libsecret-1-dev -y`
libsecret-1-dev 可能不必要 我本来使用的是iodbc 但是报错了,libsecret可能不被unixodbc需要
Ok,兄弟们,搞到这,依赖应该差不多了。下一步Build
## Build
`Ninja`
Ninja会快一点(存疑)
目前编译时间:1:36+2:38+1:47+1:00
+11
View File
@@ -0,0 +1,11 @@
---
{
title: "小记",
draft: false,
type: "rambling",
created_at: "2024-04-02T00:10:00+08:00",
published_at: "2024-04-02T00:11:00+08:00",
updated_at: [ "2024-04-02T00:11:00+08:00"],
}
---
于我而言,**思考**与**遗忘**竟如此形影不离。
@@ -0,0 +1,17 @@
---
{
title: "记录一下突然想到的一个点子",
draft: false,
type: "rambling",
created_at: "2024-04-07T00:35:00+08:00",
published_at: "2024-04-07T00:35:00+08:00",
updated_at: [ "2024-04-07T00:35:00+08:00", "2025-08-26T00:30:55+08:00"],
}
---
udp打洞 这个技术有一段历史了 但是它有一些基本问题
最大的问题就是丢包
我在想一个基础协议,封装整个udp打洞过程 最后做成一个局域网 把打洞目标放进去
这件事远远超过我的能力 此处仅是记录 待来日有能力实现
搬运时补充:
直到现在,我还是没有实现这个技术,同时我很确定已经有人干过类似的了
+32
View File
@@ -0,0 +1,32 @@
---
{
title: "2024.5.5 小记",
draft: false,
type: "rambling",
created_at: "2024-05-05T23:40:00+08:00",
published_at: "2024-05-05T23:46:00+08:00",
updated_at: [ "2024-05-05T23:46:00+08:00", "2025-08-26T00:56:46+08:00"],
}
---
五一假期要结束力
虽然早有预感,但还是觉得结束的好快。
还有好多事没做
最近又想起来错过党课的事,果然得写一下。
简单讲,没注意信息+注意到后没理解导致错过了党课。一年没上,下学期应该需要重新推优。
这次错过让我离入党远了一步,也让我再次询问自己一个问题,我是不是真的想入党?
有这样的想法,主要还是对党的不了解与对自身的不了解导致的。
我相信党是一个服务人民,造福人民的组织机构。但是理解不够细致,如果我成为党员,我担心自己不够格。
第二件事,Uni全会要召开了,感觉,应该不远了。但是我是社恐,有点不太确定该说啥。
说实话,这个负责人当的太怪了。虽然能理解全貌,理解为什么会推选我,但是实际在这个位置时,还是感到有些无助。
当然,最根本原因还是专业能力不够,不管是social还是tech。
第三件事,科目补习需要加速了。虽然和Uni全会还有HackDay碰撞,但还是需要优先一下 机组、编译原理、人工智能概论 对这些科目不同程度的落后让我担心。
第四件事,Ros,学长的代码浅看了一下,还是需要很多工作,预计要消耗不少时间,我大概有一个月的事件准备。
第五件事,六级,也尽快吧,尽早开始,不能像四级一样混了,感觉混不过去。
总体来说,事不少,就看能不能/30去做,这是关键中的关键。
搬运时记录:当时六级果然没过,424
+18
View File
@@ -0,0 +1,18 @@
---
{
title: "Hackathon 活动后记",
draft: false,
type: "rambling",
created_at: "2024-05-28T14:20:00+08:00",
published_at: "2024-05-28T14:24:00+08:00",
updated_at: [ "2024-05-28T14:24:00+08:00"],
}
---
上周六到周日(2024.5.25-2024.5.26) Uni和木犀联合举办了一年一度的HackDay活动。
理论上,这个活动是武汉高校联盟都能来的,而且原计划和冰岩联合,在华科举办,但因为未知原因,在街道口附近自习室举办。
先说结论,Hackathon绝对是一次特别的经历。
首先是从未有过的团队协作的经验,这方面主要有三点,你必须不断的帮小组成员解决困难和让小组成员解决你的困难,必须多次讨论确定最终作品的结果(这其中有时间和技术的取舍,也包括对剩余san值的取舍),必须不断面对git pull失败和merge冲突相关问题。实际上,想法和代码迭代速度之快,导致几乎每一次提交代码都需要处理冲突问题,平常很难有这样的机会。
与小组成员的讨论变得相当关键,在理智近乎消失的同时,必须尽早,尽量详细的确定未来作品的方向。这个过程实际上是一个Social的过程。实际上,我感觉这次活动中起到协调的作用,找到了整个项目在设计的创意和技术的能力的中间点,(同时劝住了执着的设计和鼓舞了想摆的技术,我好NB)避免大部分无效沟通。
技术是比赛中的限制,但不会是瓶颈。简单的技术与有趣的创意能搭配出足够出色的结果。实际上,写代码的四个人中,有三个人没有事先学过自己需要的技术栈(指pygame)(还有一个一直想在代码C的设计,只可惜能力不够(并无谴责意思,只是表达事实))现在想来,我写的很多代码最终也被替换,只有制谱器和一些代码的算法被保留下来。
足够特殊的经历,推荐每个产品/设计/技术亲自参加一次。
一个必须要说的事是,通宵写代码真的有点难,建议中途小睡一觉,或者可以和小组成员接力一下。开空调有点冷,记得带好御寒的衣服或毯子。
@@ -0,0 +1,21 @@
---
{
title: "关于人工智能当前问题的一点想法",
draft: false,
type: "rambling",
created_at: "2024-05-17T00:00:00+08:00",
published_at: "2024-05-17T00:04:00+08:00",
updated_at: [ "2024-05-17T00:04:00+08:00", "2025-08-26T01:00:26+08:00"],
}
---
现在人工智能的两个典型问题是:1.智能程度差 2.信息输入不够简单
先谈谈第二个问题:目前常见的人工智能IO是文字输入和语音输入,文字输出和多媒体输出。但是不能直接输入图片或视频。而是先做图片识别和视频处理,再将文字转发。好处是专人干专事和节省带宽,降低开销,坏处是信息损失。我是喜欢x86不喜欢arm的人(You know what I mean. 说实话力大砖飞是我的期望。
再看第一个问题:一个广泛接受的理论是智力同模型大小成正比。而更大的模型和显卡显存直接相关,不可避免的导致cost++。
我有时候在想,低参数的模型能不能和幼年的儿童做类比(期望上)它们的一些结果不合或部分合逻辑。chatGPT3.5就像一个没意识到自己错误的小孩。一心觉得自己逻辑正确。更进一步的,这些差错,是否是想象力的一种可能,甚至是创新的源泉。
我认为这并不是不可能。我们总是对各种东西持怀疑态度,推动了人类科学进步。但是,循规蹈矩会让我们对大部分自然现象熟视无睹。想象一颗往天上掉的苹果可能是很多孩童梦中的情景。这种对想象和现实的差错的仔细研究是怀疑和探究的关键。
当然,想要利用这种“差错”,首先需要想办法让其“大量”起来。然后需要一个能判断正误的东西(GPT-4?)和一个能做探究的东西(大概只有人了(悲,我果然是牛马))
注意,这只是对GPT3.5的外特性的一些遐想和延申。我知道其内部就是一个做接龙的鹦鹉,不过,我还是希望多保留一种想法。
搬运时记录:
这段看起来写的莫名其妙的,有点癫了
搬了,是折磨读者,所以搬了
+41
View File
@@ -0,0 +1,41 @@
---
{
title: "Hyprland",
description: "作者开始尝试Hyprland平铺式桌面,重装Ubuntu 24.04并配置了Clash、Timeshift和Fcitx5。Hyprland通过文件配置多显示器,修改即时生效。遇到swww壁纸问题未解决。",
draft: false,
type: "article",
created_at: "2024-06-30T09:40:00+08:00",
published_at: "2024-06-30T09:56:00+08:00",
updated_at: [ "2024-06-30T09:56:00+08:00"],
category: '个人',
tags: [ "Linux" ],
tech_stack: [ "Hyprland","Linux" ],
tech_stack_percent: [ 6,4 ],
tech_stack_icon_names: [ "simple-icons:hyprland","simple-icons:linux" ],
tech_stack_theme_colors: [ "#10dbd7", "#263238" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
今天开搞一个一直想搞的桌面: hyprland
hyprland是一个平铺式桌面,理论上,在熟悉快捷键后,应该能有一个很高的效率。此外,我希望这能成为一个新的开始,关于linux新的,有趣的技术的开始。
今天做的事:
备份原来linux中的少部分关键个人文件
设置Ubuntu镜像,准备安装。
安装Ubuntu24.04
![安装界面](https://typecho.lichx.top/usr/uploads/2024/06/2182989347.png)
这个安装竟然自动使用清华镜像源 好耶!
设置Clash
安装hyprland
安装Ubuntu24.04
设置Clash
安装并设置timeshift
安装hyprland 取消了sddm的安装
配置hyprland,这东西设置多显示器的分辨率和方向是通过文件设置的。但是在修改文件后立刻就能更改。这一点感觉有点特别。
配置fcitx5
swww运行不正确,看不到壁纸,给原作者发很烂的issue。希望作者别打我。
今天就做到这么多,有时间再试试解决壁纸问题。(遇到困难睡大觉说是)
推荐一个很好听的歌:幽世桔梗
+28
View File
@@ -0,0 +1,28 @@
---
{
title: "Hyprland 新进展",
description: "此前博客中提到的swww问题,经提交issue后得知是因重构引发,开发者已将main分支回退至稳定版本,问题得以解决。同时,也找到了解决Fcitx5在Electron中无法使用的有效方案,并意外发现一个MC服务器社群。接下来的计划是配置JetBrains系列软件的Fcitx5输入法,并安装Office等生产力工具,继续探索。",
draft: false,
type: "article",
created_at: "2024-07-02T10:00:00+08:00",
published_at: "2024-07-02T10:09:00+08:00",
updated_at: [ "2024-07-02T10:09:00+08:00"],
category: '个人',
tags: [ "Linux" ],
tech_stack: [ "Hyprland","Linux" ],
tech_stack_percent: [ 9, 1 ],
tech_stack_icon_names: [ "simple-icons:hyprland","simple-icons:linux" ],
tech_stack_theme_colors: [ "#10dbd7", "#263238" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
上次blog有提到swww的相关问题,在提交[issue](https://github.com/LGFae/swww/issues/337)后,开发者说是当前正在重构导致的不稳定。并且把main分支回退到了一个更稳定的版本
然后就能用了捏quq
![图片.png](https://typecho.lichx.top/usr/uploads/2024/07/2726087925.png)
好看!
另外一件事是fcitx5在electron中无法使用的问题。翻遍各种网站后,还真让我找到了正确的[解决方案](https://my.toho.red/posts/solve-electron-wayland-input-problem)(屎里淘金说是)
另外顺着这个网站找到了一个不大的mc服务器群quq
下一步是jetbrain系软件(继续搞fcitx5)安装和生产力软件(word、excel、powerpoint、...)还有各种折腾
+55
View File
@@ -0,0 +1,55 @@
---
{
title: "LagrangeCoreApi 开发小记",
description: "本文介绍了C#中ControllerBase的扩展方法,通过重载设计解决响应中数据与消息参数组合的问题。同时提到Lagrange.Core现已提供官方签名API,无需自建签名服务。最后分享了使用VS的Git功能时,建议以命令行为主、界面为辅的操作经验。",
draft: false,
type: "article",
created_at: "2024-07-07T21:00:00+08:00",
published_at: "2024-07-07T21:09:00+08:00",
updated_at: [ "2024-07-07T21:09:00+08:00"],
category: 'Uni',
tags: [ "C#" ],
tech_stack: [ "C#" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "mdi:language-csharp" ],
tech_stack_theme_colors: [ "#a179dc" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
```C#
public static class ControllerBaseExtension
{
public static IActionResult Success(this ControllerBase controller) =>
new ApiResponse<int>(200);
public static IActionResult Success(this ControllerBase controller, string msg) =>
new ApiResponse<int>(200, msg);
public static IActionResult Success<T>(this ControllerBase controller, T data) =>
new ApiResponse<T>(200, "", data);
public static IActionResult Success<T>(
this ControllerBase controller,
string msg,
T? data
) => new ApiResponse<T>(200, msg, data);
public static IActionResult Fail(this ControllerBase controller) =>
new ApiResponse<int>(500);
public static IActionResult Fail(this ControllerBase controller, string msg) =>
new ApiResponse<int>(500, msg);
}
```
之前写这段代码时遇到一个问题,如果想要使用一个参数,发送string类型的data,但msg留空。在全用范型方法的情况下是做不到的。当时把这个问题暂时搁置了。但后续使用方法时,由于忘记填写范型类型导致报错,让我想出了如上的方法。如果有范型则最后一个参数为data。否则没有data数据。后续可能会用object和null代替。
第二,Lagrange.Core现在有官方的Api地址,可以不用自己设置sign服务了
https://sign.lagrangecore.org/api/sign
Thanks for 外国热心网友 for Provision of Azure Servlet
** Built-in SignServer is now provided, Enjoy! **
第三,VS的git真的难用。点了半天后上网搜了git命令直接解决了。建议只把VS的git作为一个可视化工具。
@@ -0,0 +1,76 @@
---
{
title: "Xorg 红蓝两色通道异常 默认分辨率和色深设置",
description: "Xorg显示颜色异常(如红色显蓝),因色深设置错误,将8bit改为16bit后修复。需在配置中指定amdgpu驱动并设DefaultDepth为16,原modesetting驱动不支持16bit下1920x1080分辨率。调整配置后问题解决。",
draft: false,
type: "article",
created_at: "2024-07-15T02:35:00+08:00",
published_at: "2024-07-15T02:45:00+08:00",
updated_at: [ "2024-07-15T02:45:00+08:00"],
category: '个人',
tags: [ "Linux" ],
tech_stack: [ "Linux" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "simple-icons:linux" ],
tech_stack_theme_colors: [ "#263238" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
现象:红色显示蓝色,蓝色显示黄色
原因:Xorg色深设置错误,从8bit提升至16bit后显示正确
相关conf
```
Section "Device"
Identifier "AMD"
Driver "amdgpu"
EndSection
Section "Screen"
Identifier "Default Screen"
Device "amdgpu"
Monitor "Default Monitor"
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "1920x1080"
EndSubSection
EndSection
### Valid values for rotation are "normal", "left", "right"
Section "Monitor"
Identifier "Default Monitor"
# Option "Rotate" "normal"
# 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSection
```
正点原子RK3568的默认配置中,Device使用的驱动是modesetting,该驱动在16bit色深下不能提升分辨率至1920x1080
你可以通过执行 `sudo X :1 -configure` (:1 可以是其它非0数字,不要是已激活的屏幕就行)
```
X.Org X Server 1.21.1.7
X Protocol Version 11, Revision 0
Current Operating System: Linux atompi-ca1 5.10.160 #1 SMP Tue Jan 30 11:01:02 CST 2024 aarch64
Kernel command line: earlycon=uart8250,mmio32,0xfe660000 root=/dev/mmcblk0p3 earlyprintk console=ttyFIQ0 rootwait rw
xorg-server 2:21.1.7-3+deb12u7 (https://www.debian.org/support)
Current version of pixman: 0.42.2
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.1.log", Time: Sun Jul 14 18:42:15 2024
List of video drivers:
amdgpu
ati
nouveau
radeon
modesetting
fbdev
vesa
No devices to configure. Configuration failed.
(EE) Server terminated with error (2). Closing log file.
```
@@ -0,0 +1,50 @@
---
{
title: "sysv-rc-conf 升级失败 依赖冲突 AtomPi 正点原子RK3568 Debian升级小记",
description: "文章记录了Debian 11升级12的过程,重点警告:使用systemd时切勿升级或应卸载sysv-rc-conf,否则会引发冲突甚至删除systemd。升级前务必用timeshift备份,并注意处理dbgsym包及依赖问题。",
draft: false,
type: "article",
created_at: "2024-07-12T21:15:00+08:00",
published_at: "2024-07-12T21:28:00+08:00",
updated_at: [ "2024-07-12T21:28:00+08:00"],
category: '个人',
tags: [ "Linux" ],
tech_stack: [ "Linux" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "simple-icons:linux" ],
tech_stack_theme_colors: [ "#263238" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
故事略长,但是先讲重点
如果你使用systemd作为init程序,那么不要升级sysv-rc-conf,甚至可以直接卸载
正文:AtomPi 正点原子RK3568 Debian升级小记
新拿到手的RK3568,自带的是Debian11 说实话,能用,如果不像我一样对新系统偏执完全不用升级
升级系统步骤如下:
设置timeshift系统备份,很重要,不要莽,去搜,简单易用有效!!
删除所有dbgsym
`dpkg -l | grep dbgsym | awk '{print $2}' | xargs sudo dpkg --purge `
这个命令说实话有点危险,它本意是删除所有带dbgsym的软件包,后续升级时,这些软件包会造成依赖问题
修改`/etc/apt/sources.list` 我这里是Debian11升12,所以把bullseye改为bookworm
`sudo apt update $$ sudo apt upgrade`
升级后你会发现一些软件包没有被升级,我的处理方式挺麻烦的,当然你选择不升级也不会有任何影响。
我这边大概有80多个未升级的软件包,很多软件包能看出来是一类的,当你使用
'''
sudo apt upgrade
sudo apt dist-upgrade
'''
都不能升级,但`sudo apt upgrade [特定软件包名]`又可以升级时,可以试试这样(例如gstreamer):
`dpkg -l | grep gstreamer | awk '{print $2}' | xargs sudo apt dist-upgrade -y --allow-change-held-packages `
好,其实以上这些都不是我想讲的
我想说的是其中一个软件包sysv-rc-conf
在尝试单独升级这个包时,会出现systemd相关的依赖冲突问题。但是奇怪的是其他软件包的依赖问题都是这样子的:
升级A时
A依赖B B版本不对
B依赖A A的新版本不能被B接受
但是sysv-rc-conf却没有出现在依赖问题中。
然后我试着删掉包重装。然后发现重装时要求删掉我的systemd
这下我知道为什么我第一次升级把systemd升没了。上一次我的处理方法是,记录所有包,删掉所有包,重装所有包。
sysv init和systemd init是冲突的。用systemd就好了。
@@ -0,0 +1,161 @@
---
{
title: "从debian装模拟器打Arknights到RK3568内核重编译",
description: "文章记录了Debian 11升级12的过程,重点警告:使用systemd时切勿升级或应卸载sysv-rc-conf,否则会引发冲突甚至删除systemd。升级前务必用timeshift备份,并注意处理dbgsym包及依赖问题。",
draft: false,
type: "article",
created_at: "2024-07-28T02:00:00+08:00",
published_at: "2024-07-28T02:47:00+08:00",
updated_at: [ "2024-07-28T02:47:00+08:00"],
category: '个人',
tags: [ "Linux" ],
tech_stack: [ "Docker", "Linux" ],
tech_stack_percent: [ 4,6 ],
tech_stack_icon_names: [ "mdi:docker", "simple-icons:linux" ],
tech_stack_theme_colors: [ "#1c90ed","#263238" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
## 前言
写这篇文章的起因是想在RK3568上运行Arknights+MAA,但是模拟器需要的编译参数没有打开。故重编译内核。考虑到后续需要OpenWRT,故同时启用KVM支持。
在编译过程中,遇到了非常多的问题,在此记录一下。
### 前言就是用来写废话的!!(暴论)
这次编译内核就目前为止失败了三次。两次是因为磁盘空间不足,一次是因为内存空间不足。我会在之后成功时计算内存和存储的用量。(是的我是边做边写的,如果我做完再写就写不出这些废话了)
用到的RK3568是正点原子的,它们提供了一个Linux SDK包,并且给了一份指导书,可惜有一些缺漏。SDK包会有一些传统内核编译没有的东西(build.sh)(大概)所以这个教程并不一定能完全适用所有RK3568。请自行判断。
原子科技的内核编译使用的是VMware。我能理解,但我这里用的是WSL+Docker,因为我希望能最多的利用性能。
wsl的内存一定要拉大,还有SWAP,一定要拉大,我后续会出一份内存使用情况-时间图。(大概)
指导手册和源码指北:
[我是链接](http://www.openedv.com/docs/boards/arm-linux/RK3568Linux.html)
手册在A盘->10、用户手册.zip->10、用户手册->03、辅助文档->24【正点原子】ATK-DLRK3568_Linux5.10_SDK编译说明V1.0.pdf
源码在B盘->02、ATK-DLRK3568开发板SDK->05、linux5.10_sdk
## 正文
### Docker迁移
Windows的Docker Desktop wsl虚拟机默认装载C盘。你可能装在了别的盘,请确认该盘至少有91G容量。(粗略计算,建议多准备一些)(如果过程中内存不足,是会把整个wsl带崩的,到时候就只能`wsl --shutdown`重启wsl了)
Docker迁移非常简单Docker Desktop - Settings - Resources 然后直接改location就行。如果说你的Docker用过一段时间了,那么可能会很耗时。你可以通过任务管理器的磁盘占用与速率推断出Docker迁移是否完成。不要以Docker Engine是否重新启动作为参照。
我不建议你用wsl的导出和导入迁移Docker。虽然迁移后能用,但这会导致Docker内部显示的路径还是之前的路径,可能有影响?反正不太好。
### Ubuntu Container的启动与SDK全编译
在Docker中启动一个最小Ubuntu镜像。笔者使用的是22.04,但现在最新的应该是24.04了,所以注意一下latest tag对应的版本问题。这一步pull image即可。
镜像启动容器,这里我先用Docker Desktop创建一个有公共空间的镜像,然后再点击三个点 Copy Docker Run 把复制出来的命令中,加上-t --privileged。然后删掉容器,在powershell中重新运行即可。
这里给出我自己的Run命令:
```
docker run --hostname=4417a56bb7d1 --mac-address=02:42:ac:11:00:02 --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --volume=C:\Users\{替换成你的用户名}\Desktop\dockerShare:/data:rw --restart=no --label='org.opencontainers.image.ref.name=ubuntu' --label='org.opencontainers.image.version=22.04' --runtime=runc -t -d --privileged ubuntu:latest
```
该命令把桌面上的dockerShare文件夹映射到Ubuntu内部的/data文件夹,你也可以改改。
Ubuntu镜像换源
tip:有bash,不要用sh折磨自己
这里给出我自己在用的源(阿里云),但是不能保证你用的时候源还能用:
因为没有vi,没有vim,没有nano,所以直接重定向即可。
```
echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse" >/etc/apt/sources.list
```
更新&安装依赖
`apt update && apt upgrade`
代码更新需要python2.7(因为要装python2.7,我才不用自己的实体Ubuntu(原因一))
`apt install python2.7`
指导手册给的依赖 (好多我自己用不到的,我才不用自己的实体Ubuntu(原因二))
```
apt install git ssh make gcc libssl-dev liblz4-tool expect expect-dev g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib unzip device-tree-compiler ncurses-dev bzip2 expat gpgv2 cpp-aarch64-linux-gnu libgmp-dev libmpc-dev bc
```
因为使用了最小Ubuntu,所以需要额外装一些软件(vim是我个人的习惯,应该可以换nano?):
`apt install time file rsync bsdmainutils xz-utils vim`
为python2.7做一个到python的链接
`ln -s $(which python2.7) /usr/bin/python`
把显示转换为中文UTF-8,不换可能导致某些带中文的文件在vim中显示不正确
`echo 'LANG="zh_CN.UTF-8"' >> /etc/environment`
首先解压05、linux5.10_sdk.zip和其嵌套的文件夹,假设该zip已经在Ubuntu:/data文件夹下:
我不记得unzip是不是自带的了,我估计不是,如果没有就装一下
`unzip 05、linux5.10_sdk.zip` //此处建议敲个05,敲个tab
//把解压出来的两个tgz文件复制一份到主目录,如果缺空间,data下解压出来的tgz文件就可以删了。
```
mkdir ~/rk3568_linux5.10_sdk
tar -xzf ~/atk-rk3568_linux5.10_release_v1.1_20240705.tgz -C ~/rk3568_linux5.10_sdk
cd ~/rk3568_linux5.10_sdk
.repo/repo/repo sync -l -j10 //这一步用到了python (python2.7)
tar -xf ~/dl.tgz -C ./buildroot/
./build.sh alientek_rk3568_defconfig
```
准备工作都做完了,如果你只想编译内核,请跳转到下一节,如果你想全编译SDK就继续。
全编译:
`./build.sh all`
### 内核编译选项设置
由于后续使用Docker Desktop的terminal看不清选项菜单中的*,故使用其他terminal操作
` docker exec -it {docker id} /bin/sh`
进入内核文件夹
`cd kernel`
首先需要选择合适的defconfig 观察build.sh 编译kernel时的log
```
==========================================
Start building kernel
==========================================
+ make -C /root/rk3568_linux5.10_sdk/kernel/ -j21 CROSS_COMPILE=/root/rk3568_linux5.10_sdk/prebuilts/gcc/
linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
ARCH=arm64 rockchip_linux_defconfig
```
可见defconfig名字为rockchip_linux_defconfig
删除之前生成的.config
`rm .config`
设置内核选项:
`make menuconfig KCONFIG_CONFIG=arch/arm64/configs/rockchip_linux_defconfig ARCH=arm64`
需要设置的内核编译选项有KVM和CONFIG_KPROBE_EVENTS
KVM比较简单
主页 Virtualization 按y勾选,然后回车进入,按y勾选KVM即可
CONFIG_KPROBE_EVENTS相对复杂一点,先搜索该选项。
![image.png](https://typecho.lichx.top/usr/uploads/2024/07/903557681.png)
Location代表该选项位置,Depends on代表依赖。需要先满足依赖,该选项才会出现。(DFS启动!)
可见KPROBES为n,再次搜索KPROBES
![image.png](https://typecho.lichx.top/usr/uploads/2024/07/1048796659.png)
可见其Location为General architecture-dependent options 但是找不到这个位置
在经过我一顿尝试后,发现把KGDB打开就行
KGDB位置:Kernel hacking > Generic Kernel Debugging Instruments
之后CONFIG_KPROBE_EVENTS也自动开启了
选择save,之后退出
需要小小的修改一下源码,当然你也可以试试直接编译,但应该会遇到如下问题:
error: implicit declaration of function 'sve_cond_update_zcr_vq' [-Werror=implicit-function-declaration]
修改这个 kernel文件夹下
`vim arch/arm64/include/asm/fpsimd.h`
在170行添加这句话
tips `:set nu`显示行号 `:170`转到170行
```
168 static inline void sve_user_disable(void) { BUILD_BUG(); }
169 static inline void sve_user_enable(void) { BUILD_BUG(); }
170 + #define sve_cond_update_zcr_vq(val, reg)
171 static inline void sve_init_vq_map(void) { }
172 static inline void sve_update_vq_map(void) { }
```
如果你需要启用KPROBE_ON_FTRACE,那你需要这个[链接](https://patchwork.kernel.org/project/linux-arm-kernel/patch/20191218140622.57bbaca5@xhacker.debian/#23074137)
此外,如果你需要启用DOCKER,那么我建议你同时启用NF_TABLE、BRIDGE、MASQUERADE、addrtype相关选项
重编译内核,打包镜像:
```
cd ..
./build.sh kernel
//updateimg不是必要的,其作用是更新update.img,如果你只烧录内核,那你可以在output/firmware/找到它
./build.sh updateimg
```
kernel位置:
boot.img: output/update/Image/ 同output/firmware/
update.img: output/update/
### 引用:
[Kprobes介绍](https://www.kernel.org/doc/html/latest/trace/kprobes.html)
[sve_cond_update_zcr_vq 相关错误与解决方案](https://mailweb.openeuler.org/hyperkitty/list/linuxarm@openeuler.org/thread/3D6J3RU6ZDFIINBJG7T4OETLERMXMWOB/#:~:text=The%20root%20cause%20is%20that%20sve_cond_update_zcr_vq%20is%20not,it%20by%20adding%20an%20empty%20definition%20when%20CONFIG_ARM64_SVE%3Dn.)
[ARM64启用KPROBE_ON_FTRACE的PATCH](https://patchwork.kernel.org/project/linux-arm-kernel/patch/20191218140622.57bbaca5@xhacker.debian/#23074137)
### 待补充内存图
内存图鸽了,我不想再折磨一次电脑,目测RAM占用上过10G,我用的16G内存加16GSWAP,在用户文件夹下的.wslconfig调整
+12
View File
@@ -0,0 +1,12 @@
---
{
title: "2024.8.9 开发小记",
draft: false,
type: "rambling",
created_at: "2024-08-09T02:00:00+08:00",
published_at: "2024-08-09T02:11:00+08:00",
updated_at: [ "2024-08-09T02:11:00+08:00"],
}
---
今天打开LagrangeCoreApi的代码,花了点时间看懂之前的代码,然后进行了小修小补。结果最后发现昨晚能运行的功能今天坏掉了。一路Debug无果,最后发现git设置还有问题。干脆删掉了代码,从昨天的版本再来。
闹麻了..
+11
View File
@@ -0,0 +1,11 @@
---
{
title: "RK3568从入门到放弃",
draft: false,
type: "rambling",
created_at: "2024-08-16T20:00:00+08:00",
published_at: "2024-08-16T20:28:00+08:00",
updated_at: [ "2024-08-16T20:28:00+08:00"],
}
---
我用一个暑假的时间证明,以我目前的能力,在RK3568中运行android模拟器是一件做不到的事
@@ -0,0 +1,59 @@
---
{
title: "ApiFox / Postman 使用WebSocket连接SignalR需要注意的小问题",
description: "使用ApiFox测试SignalR时发现消息发送无响应,原因为未在消息末尾添加结束符0x1e。正确格式为消息体后加0x1e字符,如`{\"protocol\":\"json\",\"version\":1}`。调用方法需按指定JSON结构,并注意不同类型消息的含义。",
draft: false,
type: "article",
created_at: "2024-09-11T15:00:00+08:00",
published_at: "2024-09-11T15:08:00+08:00",
updated_at: [ "2024-09-11T15:08:00+08:00"],
category: '个人',
tags: [ "WebSocket" ],
tech_stack: [ "WebSocket" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "simple-icons:socketdotio" ],
tech_stack_theme_colors: [ "#fdfdfd" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
省流:忘加0x1e
最近刚接触SignalR,发现用ApiFox怎么都没法测试,可以正常连接,但是发消息没有任何反应。我一度怀疑是自己的环境出了问题。
![image.png](https://typecho.lichx.top/usr/uploads/2024/09/1251616581.png)
后来直接使用大佬的代码(带前端)进行测试,发现是正常的。说明这只是操作上的问题。又去搜postman调试SignalR。才找到了这个简单的隐蔽的问题。
SignalR的交流以0x1e作为结束符。之前没有注意到这一点,走了一些弯路。
`{"protocol":"json","version":1}`
这段代码末尾加了个0x1e。可以直接整段复制用于SignalR连接。
![image.png](https://typecho.lichx.top/usr/uploads/2024/09/2409001684.png)
TakeAway message:
如果想要上传消息,格式是:
{
"type": 1,
"target": "方法名",
"arguments": ["方法参数1", "方法参数2..."]
}
SignalR type 数字含义:(From Copilot
1. Invocation (1)
• 表示客户端或服务器调用一个方法。
• 例如,客户端调用服务器上的一个Hub方法。
2. StreamItem (2)
• 表示流中的一项数据。
• 用于流式传输数据时,每个数据项都会使用这个消息类型。
3. Completion (3)
• 表示一个调用或流的完成。
• 包含调用的结果或错误信息。
4. StreamInvocation (4)
• 表示客户端请求从服务器流式传输数据。
• 服务器会返回多个StreamItem消息。
5. CancelInvocation (5)
• 表示取消一个流式传输的请求。
• 客户端可以发送这个消息来取消一个正在进行的流。
6. Ping (6)
• 表示一个心跳消息,用于保持连接活跃。
• 没有负载,只是为了确保连接没有超时。
7. Close (7)
• 表示连接关闭。
• 包含可选的错误信息。
@@ -0,0 +1,60 @@
---
{
title: "Docker内部网络连接错误的一种检查手段 nmap container",
description: "文章讲述了排查容器内应用连接问题的方法。作者创建了一个nmap容器来检查`host.docker.internal`,发现该域名已不可用,实际应使用IP`172.17.0.1`。同时分享了在服务器无法拉取镜像时,通过`docker save`和`docker load`迁移本地镜像的解决方案。最后提到可直接在容器内启动Ubuntu并exec进入操作。",
draft: false,
type: "article",
created_at: "2024-09-23T20:50:00+08:00",
published_at: "2024-09-23T21:01:00+08:00",
updated_at: [ "2024-09-23T21:01:00+08:00"],
category: '个人',
tags: [ "Docker" ],
tech_stack: [ "Docker" ],
tech_stack_percent: [ 1 ],
tech_stack_icon_names: [ "mdi:docker" ],
tech_stack_theme_colors: [ "#1c90ed" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
最近被一个容器无法内应用无法连接的问题折磨住了,我想看看内部的host.docker.internal到底怎么回事,于是想到建立一个nmap container进去检查
Dockerfile:
```
# 使用官方的 Ubuntu 镜像作为基础镜像
FROM ubuntu:latest
# 更新包列表并安装 nmap
RUN apt-get update && apt-get install -y nmap
# 创建一个目录来存储 nmap 结果
RUN mkdir /nmap_results
# 运行 nmap 并将结果保存到文件中,同时打印到控制台
CMD ["sh", "-c", "nmap host.docker.internal > /nmap_results/nmap_results.log && cat /nmap_results/nmap_results.log"]
```
docker-compose.yml:
```
version: '3.4'
services:
nmap_service:
image: nmap_image:latest
build:
context: .
dockerfile: Dockerfile
volumes:
- ./nmap_results:/nmap_results
```
nmap结果发现不存在host.docker.internal,可能是docker更新的原因。之前是可用的,但现在变成了 `172.17.0.1`
另附服务器无法pull image时,使用其他机器本地image的方法
```
# 机器一
docker save [imgID] > imagefile
#机器二
docker load < imagefile
docker tag [new_imgID] [随便什么名字]:[随便什么版本]
```
最后改掉Dockerfile中的FROM就好了
写文章时我才想起来,可以直接docker内起ubuntu虚拟机,exec进去操作,忘了。
@@ -0,0 +1,106 @@
---
{
title: "CGroup 实验记录 记录一次有趣的工作流",
description: "本文介绍了基于CGroup技术实现内存管理的开发过程。作者使用Vue3和.NET Core构建前后端,并通过C++封装libcgroup库操作CGroup。开发中采用WSL编译动态库并部署到Docker容器,使用CLion调试C++代码。解决了glibc版本兼容和FILENAME_MAX跨系统差异等问题,形成了一套容器化跨平台调试工作流。",
draft: false,
type: "article",
created_at: "2025-08-30T16:48:57+08:00",
published_at: "2025-08-30T22:41:18+08:00",
updated_at: [ "2025-08-30T22:41:18+08:00" ],
category: '实验',
tags: [ "后端", "Docker" ],
tech_stack: [ "Docker","C#", "C++" ],
tech_stack_percent: [ 70, 60, 40],
tech_stack_icon_names: [ "mdi:docker","mdi:language-csharp", "simple-icons:cplusplus" ],
tech_stack_theme_colors: [ "#1c90ed", "#a179dc", "#00599c" ],
}
---
## 前言
> 本来没想水博客的,但是与一位朋友交流后,他觉得这个工作流有点意思,建议我记录一下。
> 我不能保证这个工作流是最优的,但是在当时,它完美解决了我的问题
## 计算机系统实训题目描述
### 基于CGroup技术的内存管理
#### CGroup介绍
CGroup是Control Groups的缩写,是OpenEuler内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物力资源(如cpu、memory、i/o等)的机制。CGroups是LXC为实现虚拟化所使用的资源管理手段。
#### CGroup功能及组成
CGroup是将任意进程进行分组化管理的OpenEuler内核功能。CGroup提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能通过这个功能实现。这些具体的资源管理功能称为CGroup子系统或控制器。CGroup子系统有控制内存的Memory控制器、控制进程调度的CPU控制器等。运行中的内核可以使用的Cgroup子系统由/proc/cgroup来确认。
CGroup提供了一个CGroup虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用CGroup,必须挂载CGroup文件系统。这时通过挂载选项指定使用哪个子系统。Cgroups提供了以下功能:
1. 限制进程组可以使用的资源数量(Resource limiting)。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会发出OOM(out of memory)。
2. 进程组的优先级控制(Prioritization)。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
3. 记录进程组使用的资源数量(Accounting)。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
4. 进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
5. 进程组控制(Control)。比如:使用freezer子系统将进程组挂起和恢复。
#### 需要实现如下具体功能:
1. CGroup内存管理的创建;
2. CGroup设置内存资源限额;
3. CGroup触发控制。
## 技术栈
由于技术不限,为了获得相对较好的成绩,同时兼顾开发速度体验,我选择了以下技术栈:
- 前端:Vue3 + TypeScript + Vite + Pinia + TDesign 没太多难点 后续文章不提
- 后端:.Net Core API
- 自构建链接库:C++ Dynamic Link Library —— CGroupEncapsulation
- 中间件:Docker
- 虚拟机:WSL
## 工作流
### 想法与问题
#### CGroup 调用
CGroup 的调用不是大问题。
退一步,可以使用纯粹文件操作 + exec运行命令行工具,但这样显然是不够优雅的。
我选择的方案是:使用 libcgroup 这个 C 语言库,使用syscall而非调用系统命令行工具或直接进行文件操作,这样做的好处是能够获得更完善的错误处理机制。
通过C#的P/Invoke,可以较为方便的调用C/C++动态链接库,但是也没那么方便,所以我又添加了一个中间层,封装一次libcgroup。
#### Docker 与调试问题
CGroup是Linux特有的,我要么直接使用wsl,要么使用Docker。
而CGroup也算比较关键的系统功能,直接在wsl中运行可能会出现问题,所以选择使用Docker。
使用Docker也会引入问题,关键是动态链接库的构建和调试。我的选择是:在wsl中构建动态链接库,然后将动态链接库复制到Container中使用。
在该方法下,是无法通过VS进行跨语言调试的,我的解决方案是使用Clion连接到Docker Container,编译CGroupEncapsulation项目,然后使用main函数进行调试。
综上,对于CGroupEncapsulation这个项目,需要两种项目文件。对于VS,将读取它的 `CGroupEncapsulation.vcxproj` 项目文件,对于Clion,将读取 `CMakeLists.txt` 项目文件。
这个工作流唯一的问题是,重启VS会造成Container销毁,Clion需要重联,除此之外没有什么问题。
### 具体工作流
对于后端,当VS启动调试时
```mermaid
stateDiagram-v2
[*] --> WSL
[*] --> BAC
state WSL {
state "CGroupEncapsulation Compile" as CC
[*] --> CC
CC --> [*]
}
state "Backend API Compile" as BAC
WSL --> Docker : Copy dynamic link library
BAC --> Docker : Copy backend API DLL
state Docker {
state ".Net Core API Debug" as API
[*] --> API
API --> [*]
}
Docker --> [*]
```
如果想要调试CGroupEncapsulation这个动态链接库,则需要在Clion中连接到Docker Container 但是使用main文件运行 而不是附加到DLL
```mermaid
stateDiagram-v2
[*] --> Docker
state Docker {
state "CGroupEncapsulation Debug" as CCD
state "CGroupEncapsulation Compile as Runnable" as CCR
[*] --> CCR
CCR --> CCD : Run main
CCD --> [*]
}
Docker --> [*]
```
如果能够在VS中附加到Docker的DLL,同时能断点就更好了,但是目前还没找到方法。我相信是有方法的,但当时时间比较紧,平衡好时间和技术也是编程的关键。
## 遇到的问题
### WSL编译后的DLL执行时报错
结果是Docker的glibc版本过低,调整编译选项,降低到C++17后正常
### controller_data 下 FILENAME_MAX 宏在不同系统中定义不同
`FILENAME_MAX` 在Windows中的值为260,而在Linux中为4096,之前在用VS查阅源代码时,看到的值是260,因此使用C# P/Invoke调用时,传入的数组长度为260,结果出现报错。报错信息并不显然,这个问题卡了我一会儿的。
+100
View File
@@ -0,0 +1,100 @@
---
{
title: "建站小记",
description: "作者选择自行搭建博客以挑战技术能力,追求完全控制权。项目使用Nuxt(Content + SSG)、TypeScript、Tailwind CSS等技术栈,开发中遇到Nuxt ColorMode切换动画问题、Content的Schema类型难题以及响应式布局与动画冲突等挑战。目前进度不理想,管理端尚未完成,能否完工取决于后续时间。",
draft: false,
type: "article",
created_at: "2025-08-25T02:54:33+08:00",
published_at: "2025-08-25T04:17:34+08:00",
updated_at: [ "2025-08-25T04:17:34+08:00" ],
category: '记录',
tags: [ "前端", "文档" ],
tech_stack: [ "Vue.js","Nuxt","TypeScript" ],
tech_stack_percent: [ 60,70,40 ],
tech_stack_icon_names: [ "mdi:vuejs","lineicons:nuxt", "lineicons:typescript" ],
tech_stack_theme_colors: [ "#41b883", "#a179dc", "#054e63" ],
}
---
## 为什么我要自行建设博客?
> We choose to go to the moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.
> —— John F. Kennedy, 1962
> 我们选择在这个十年内登上月球并完成其他任务,不是因为它们容易,而是因为它们困难;因为这个目标将有助于组织和衡量我们最好的精力和技能,因为这是一个我们愿意接受的挑战,一个我们不愿推迟的挑战,一个我们打算赢得的挑战,当然也包括其他挑战。
> —— 约翰·F·肯尼迪,1962年
从某种程度上来说,我自行搭建博客的原因与以上发言类似 ~~(有点大言不惭了)~~ ,我需要一个测试自己的机会。我已经构建了几十个项目,我对它们尽心尽力,但是它们中大多数生命周期很短,往往是为了实验、比赛等短期目标。这些代码往往不需要过高的可扩展性和稳定性。同时,我注意到我的能力似乎已经足以支撑我去构建一个更加大型的长期项目。思来想去,博客是一个不错的选择,并且我可以通过它来记录我的学习和生活。
构建博客的原因之二是,市面上现有的博客也许能满足我的需求,但是我感觉研究它们的配置没有我自己重写一个有趣。而且,我希望能够完全控制我的博客内容和样式,而不是被平台所限制。
## 进展如何?
当我实际开始写之后,我注意到这件事远比我设想的复杂。有很多技术我只是想当然的认为可行,虽然结果也确实能行,但是有大量的细节需要注意。不得不说,首次编写本博客的现在已是暑假之末,但是项目进度很不理想。先不考虑管理端,博客部分有两个页面没创建,一个页面有bug,已有页面中有一个组件还没开始写。
而管理端前后端呢?更是不见踪影,与博客配对的相关配置,也处于残缺状态。
考虑到后续的比赛、保研以及可能的实习。我只能说,这项目能不能写完纯看缘分。
## 博客技术
聊点不那么现实的
这次博客使用了Nuxt来编写,Nuxt构建后的产物的加载速度给我留下了颇为深刻的印象。在与ChatGPT、Claude 聊了一段时间后,确定了用Nuxt Content + SSG作为博客核心。
就目前的开发体验来说,Nuxt的启动和加载确实不够快,但是其代码确实足够优雅,我很喜欢。虽然从一定角度来讲,为了所谓的优雅,牺牲了太多开发效率,消耗了太多时间在查文档和debug上。 但是我觉得这是值得的。从某种程度而言,我学计算机就是想来干这个的。
对于其他的技术栈,目前博客使用了
```Text
TypeScript
Pinia
Tailwind CSS
Nuxt UI
HighCharts
MdEditor V3
```
那些大家都在用的就不放了
这里面 TypeScript Tailwind CSS 能明显提升前端体验,我说实话,我已经不太确定自己能不能写纯CSS项目了,TS更不用多说,JS看了半小时我就开始用TS了。好用爱用。
在用Nuxt时,顺便被安利了Nuxt UI 就目前来讲,还可以,用的没有TDesign熟练,有些组件即便有还是选择了手搓,主要还是控制上差了一点。这次没用TDesign主要是和博客想要的风格不符,TDesign有点太正式了。ElementPlus也不考虑,有点丑,我用的也少。
Nuxt的Pinia集成也是一个难点,曾几何时,Nuxt的Pinia集成搞了我一下午的时间。Vuex还没学过,我估计这个项目也不需要,Pinia够了。
HighCharts是个意外,我本来想用ECharts的,但是ECharts不支持坐标轴中放HTML代码,只支持纯文字。而HighCharts虽然也不是能接受任意HTML,但至少支持svg。配合[icons](https://icones.js.org/)这个强大的网站,够用了。
HighCharts开源但商用收费,拿来建个人博客还是没问题的。
PSHighCharts的介绍页面图表又多又好看,期待后续有新想法继续使用。
MdEditor V3 这是我第一个使用的前端Markdown编辑/渲染器。之前做实验就用过,但是这次我没有首选它,而是选了MilkDown,不好用。
从 MilkDown core 和 MilkDown creep 中可以看到这个项目的潜力。但是实在有点难配了,文档真看不懂,感觉写的有点屎,当然我觉得还是自己能力不足。只能说为了WYSIWYG实在不值得,双屏写MD我是没什么障碍的,例如我现在就在WebStorm里写MD,然后同步渲染到dev网页里。因此索性放弃了MilkDown。
后来又试了 Markdown-it。如果我没记错,放弃它的原因是因为滚动不是连贯的。
试来试去,发现最初遇到的就是最好的,果断复合了。
PS:正在写这篇文章的时候,发现上面的代码段竟然在我Navbar的上面,一看z-index是10000,绝了。改成5了,我看看会出什么问题。
## 遇到的各种难点
### Nuxt ColorMode
这个插件真的很神奇。如果我没记错,这个插件的问题是在切换主题时,有些设置了过渡动画的DOM没有播放动画,而是一步到位。我真的卡了很久,但最后没办法,自己实现了一个ColorMode切换器,丝滑无比。而且我认为原理上和Nuxt-ColorMode应该是一致的,都是在顶级中添加dark class。但是用这插件就是会出现问题,最终含泪放弃。
### Nuxt Content
Nuxt Content 的文档确实需要仔细翻才能找到某些功能。从某种程度上也是吃了英语不好的亏。但总体来说,这个手册质量还是在线的。
但是我也确实有没能解决的问题。
Content Config 中有一个 Schema 的属性,它会利用zod,自动生成一个ContentCollectionItem属性。Schema作用是定义文章元数据,如果定义了rawbody,那么将得到文章原文。
问题出在 queryCollection 后的 select 方法上,select方法接受一组键,这些键都是Schema中定义的数据结构,但是问题在于,我只是不想要其中的rawbody,因为在列表加载原文可能会浪费很多性能。
在这种情况下,我希望将 Schema 提取出来,然后将所有非rawbody的键写入到select中。这么做虽然没问题,但是TS不高兴。虽然我们通过 Schema 定义了 文章属性,但是它与自动生成 ContentCollectionItem 毫无关联。对于ts来说,我们在试图将string赋值给keyof ContentCollectionItem,这显然是不行的。
而ContentCollectionItem也没有export出来,无法直接使用。
目前的解决方案是,先连同rawbody一起加载,出问题再说。理论上,只有生成时会慢,运行时不会受影响。
### 粘性布局、响应式更新与动画冲突
这三个东西随便缺一个都不会有我接下来要讲的神奇问题
在浏览其他人的博客时,我注意到大部分博客信息流旁会有一个随滚动而滚动的侧边栏,这个侧边栏通常是粘性布局实现的。
但我在具体实现上犯了难。
观察别人的博客HTML后,确定应当将sticky的父设置为table,然后把sticky DOM设置为float left,主DOM设置为 float right。这样,粘性布局就搞定了。
在其基础上,设置断点对应的宽度,实现响应式布局,也没问题。
再加上动画设置,结果问题出现了。
由于使用了浮动,而两个DOM都是块。当两者宽度大于父DOM宽度时,两个DOM会从左右布局变为上下布局。在动画开始时是正确的,动画结束时是正确的,但是动画进行时,外部的DOM宽度减小速度过快,内部的宽度减小速度较慢,导致内部两DOM变为上下布局。
解决方法是:把原先会响应式更新的侧边栏的宽度改为固定值,然后让右侧DOM根据父组件计算自己的宽度。这样就不会出现上述问题了。
## 未完待续
最近保研真是焦虑quq
+15
View File
@@ -0,0 +1,15 @@
---
{
title: "构建中",
draft: false,
type: "announcement",
isPinned: true,
created_at: "2025-08-25T00:00:00+08:00",
published_at: "2025-08-25T00:00:00+08:00",
updated_at: [ "2025-08-25T00:00:00+08:00"],
}
---
!!! warning
本站正在积极建设中。如需要,你可以浏览[旧站](https://typecho.lichx.top)。
文章正在搬运中quq
!!!
+11 -5
View File
@@ -1,13 +1,14 @@
---
{
title: "Feature",
title: "博客开发TODO List",
description: "服务器需要支持的Feature",
created_at: "2025-08-22T08:00:00+08:00",
published_at: "2024-08-22T00:00:00+08:00",
updated_at: [ "2024-08-22T08:00:00+08:00"],
published_at: "2025-08-22T00:00:00+08:00",
updated_at: [ "2025-08-22T08:00:00+08:00"],
category: '规划',
tags: [ "规划", "文档!" ],
draft: false,
pinned: true,
tech_stack: [ "Vue.js","ASP.Net Core" ],
tech_stack_percent: [ 12,60,15 ],
tech_stack_icon_names: [ "mdi:vuejs","mdi:language-csharp"],
@@ -18,10 +19,15 @@
- [ ] 主页
- [ ] 网站标题
- [ ] 文章列表(时间排序)
- [x] 文章列表(时间排序)
- [x] 文章标题
- [x] 文章摘要
- [x] 文章标签
- [x] 置顶
- [x] 公告
- [x] 絮语
- [ ] 分页
- [ ] LOGO
- [ ] 个人信息展示
- [ ] RSS 订阅
- [ ] 登录管理页面
@@ -38,7 +44,7 @@
- [ ] 上一篇/下一篇文章链接
- [ ] 归档页/archive
- [ ] 按时间归档
- [ ]标签归档
- [ ]类别归档
- [ ] 搜索
- [ ] 友链/friend
- [ ] 关于
-16
View File
@@ -1,16 +0,0 @@
---
{
title: "标题003Date",
description: "这是一个日期测试文档",
created_at: "2024-10-01T08:00:00+08:00",
published_at: "2024-10-02T00:00:00+08:00",
updated_at: [ "2024-10-03T08:00:00+08:00","2023-10-04T08:00:00+08:00" ],
category: '测试',
tags: [ "测试", "文档!" ],
draft: false,
tech_stack: [ "Vue.js","ASP.Net Core" ],
tech_stack_percent: [ 12,60,15 ],
tech_stack_icon_names: [ "mdi:vuejs","mdi:language-csharp"],
tech_stack_theme_colors: [ "#41b883", "#a179dc" ],
}
---
+5
View File
@@ -1 +1,6 @@
---
{
draft: true
}
---
Lichx Blog Articles
-13
View File
@@ -1,13 +0,0 @@
---
{
title: "标题001",
description: "这是一个测试文档",
created_at: "2023-10-01",
published_at: "2023-10-02",
updated_at: [ "2023-10-03","2023-10-04" ],
tags: [ "测试", "文档" ],
draft: false
}
---
# 测试文档
这是一个测试文档的内容。
+15
View File
@@ -0,0 +1,15 @@
---
{
title: "announcement_test",
draft: true,
type: "announcement",
isPinned: true,
created_at: "2025-08-25T00:00:00+08:00",
published_at: "2025-08-25T00:00:00+08:00",
updated_at: [ "2025-08-25T00:00:00+08:00"],
}
---
!!! warning
这是公告
!!!
isPinned 是置顶 不限类型 默认false
+2 -2
View File
@@ -1,8 +1,8 @@
---
{
title: "标题002",
title: "文章测试",
description: "这是一个测试文档",
draft: false,
draft: true,
type: "article",
created_at: "2023-10-01T08:00:00+08:00",
published_at: "2023-10-02T00:00:00+08:00",
+2 -2
View File
@@ -1,7 +1,7 @@
---
{
title: "Rambling",
draft: false,
title: "絮语测试",
draft: true,
type: "rambling",
created_at: "2025-10-01T08:00:00+08:00",
published_at: "2025-10-02T00:00:00+08:00",