
From 3084e4f012aa553f455ece5622d77b419365e608 Mon Sep 17 00:00:00 2001
From: biss Bi's Blog
关于
八月 2025
八月 2025
九月 2025
十月 2025
2025
2025
一月 2026
二月 2026
2026
存档
存档
存档
值此二〇二六年蛇年来临之际,为贯彻落实“快乐至上”的核心价值观,进一步提升全体人员的幸福指数,现将有关事项通知如下:
一、各单位要切实做好“吃好喝好”保障工作,严禁在假期期间进行任何形式的emo。
二、请各有关人员在收到本通知后,务必在下方留言区留下你的新年愿望,由后台系统统一收集并祝愿其实现。
三、祝大家在新的一年里,身体健康,万事如意,所得皆所愿,所行化坦途!
]]> + + + + + + +预计做好后是这种效果:

首先,修改\themes\butterfly\layout\includes\header\nav.pug:
1 | nav#nav |
在合适的目录下新建nav.css(例如\themes\butterfly\source\css\nav.css),这份css是磨砂玻璃的样式:
1 | #nav-right{ |
然后在_config.butterfly.yml里面引用该css
1 | - <link rel="stylesheet" href="/css/nav.css"> |
然后重新构建应该就可以看到效果了。
]]>git remote add origin就行,但是action文件就有些变更。1 | name: 自动部署 |
仅供参考吧,最后面是webhook,可以自己改改。
]]>这里用二进制文件安装
1 | wget -O gitea https://dl.gitea.com/gitea/1.25.4/gitea-1.25.4-linux-amd64 |
这一步不是必须的,但是推荐这样,用root用户很容易出问题。
1 | # On Ubuntu/Debian: |
1 | mkdir -p /var/lib/gitea/{custom,data,log} |
直接把github上面的挪过来就可以
然后注册服务并启动
1 | sudo systemctl enable gitea |
可以用MySQL数据库或者PostgreSQL,创建一个数据库在web页面填写进去就行。
反向代理略过,和普通网站的反向代理配置没有什么区别。
这个runner也不是必须的,是为了实现github的action功能;在2C2G服务器上我看运行的还可以,当然,只是这个hexo博客的自动构建,占用资源也少;
使用doker,这也是官方建议。以下是compose文件:
1 |
|
token在管理后台 工作流-运行器-新建运行器获取
config文件需要这样生成
1 | docker run --entrypoint="" --rm -it docker.io/gitea/act_runner:latest act_runner generate-config > config.yaml |
在后台工作流运行器可以看见就没问题了。
]]>ghost cms,在构建搜索时发现了typesense,所以把他移植到这个博客上。直接用docker-compose:
1 |
|
然后就是反向代理之类的,不过多写了。
1 | # 先安装库 |
然后在config.yml配置(就是把文章生成json):
1 | search: |
创建一个数据同步脚本sync_typesense.js:
1 | const Typesense = require('typesense'); |
然后运行node sync_typesense.js
把下面代码存储成js,node运行就行。
1 | const http = require('https'); |
在config.yamlinject bottom添加:
1 | - <script src="https://cdn.jsdmirror.com/npm/instantsearch.js@4.56.0"></script> |
为了方便,我直接修改了\themes\butterfly\source\js\search\local_search.js
1 | (function () { |
indexName: “blogs” 和 collectionName: ‘posts’ 要一致!!!
首先在网上查找自己喜欢的字体,这里有一个网站
找到一个自己喜欢的,如果有woff或者woff2格式下载下载保存。没有也没关系,转换网站:
利用这个网站把下载的ttf字体文件转换成woff2格式。
新建一个css文件
1 | @font-face { |
其中 font.woff2改成自己的文件名。
其他字体格式参考
1 | @font-face { |
在主题文件的font配置区域修改字体:
1 | font: |

1 | document.addEventListener("DOMContentLoaded", () => { |
在主题文件 source/css/新建 calendar.css。
1 | /* 浅色主题变量覆盖 -------------------------------- */ |
新增+号后面内容
1 | inject: |
在 blogroot/source/_data 文件夹下创建 widget.yml 文件,并添加以下内容:
1 | bottom: |


Openwrt系统,并且也配置了OpenClash和AdguardHome,两者的原理简单看都是劫持DNS,所以两者要同时运行,必须经过一定的配置。
左边的方式更简单一些,只需要修改AdguardHome的上游DNS服务器为127.0.0.1:7874 即可;
右边的方式需要将OpenClash里的DNS指向AdguardHome,但是可能有拦截失败的情况(好像没有遇到过)。
Adguardhome是用于拦截广告的工具,搭配好的规则,拦截效果才会更好,下面来分享一些规则:

AdguardHome是一款广告拦截软件,有了一台小软路由后就开始折腾了。首先要下载软件包,但是经过尝试,软件源里面的luci-app-adguardhome不太好用(也可能是我不会用) ,所以我用的下面的包:
虽然好几年没更新了,但还是能用。下载之后上传到路由器,使用opkg install命令安装,或者可以直接通过网页安装:

如下图所示进行操作,如果更新核心版本失败,考虑更换升级用的下载链接,使用镜像源,或者科学上网,错号框内的非必要不修改;

最后点击“保存并应用”,然后点击AdGuardHome Web:3000,进行安装,建议关闭路由器自带DNS/DHCP服务器,AdguardHome直接替代


然后,设置AdguardHome的DHCP服务器,注意要先检查配置,再启用

因为一直想要实现从软路由上进行代理,所以买到了一个Cudy Tr3000刷系统折腾。用这篇文章记录一下安装的过程。
可以通过web管理页面安装,搜索openclash。

当然也可以在终端中执行命令:
1 | opkg update |
首先需要下载内核,推荐启用Smart内核。

然后导入配置:

然后就可以开心使用啦!
感觉zashboard简洁好看一些,看自己感觉啦

Cudy-TR3000路由器,用来进行科学上网(小猫咪),先记录一下刷写Openwrt系统的过程。Cudy官方网站上下载
访问192.168.10.1先刷入中间固件

然后访问192.168.1.1,刷入Openwrt插件

然后访问10.0.0.1,就可以看到openwrt登录页面了,默认密码是root。

因为正好有云存储的需求,恰好又有服务器,所以决定自建一个Owncloud网盘服务,集成一个Onlyoffice。
在官网下载最新的安装包
因为使用1panel,所以搭网站很简单,选择php7.3运行环境,添加必要的php扩展,新建一个Mysql数据库,按照正常步骤安装就行了。
1 | 'filelocking.enabled' => true, |
Cron。php7.3的容器,用户必须为www-data,时间为每15分钟。1 | php sites/cloud.biss.click/index/occ system:cron |
在1panel应用商店直接安装Onlyoffice,并反向代理到自己的域名
在Owncloud中搜索Onlyoffice插件,然后填写自己的域名、密钥(在参数中可以查到)
因为喜欢wordpress之类动态博客的在线编辑功能,但是又不想抛弃hexo,特别是这个花里胡哨的模板,所以想着给博客添加一个cms系统,在搜索一番后发现这种CMS系统叫无头CMS,然后找到一个很好的系统:sveltia-cms
在博客根目录下运行npm i @sveltia/cms
然后在博客source目录下创建admin目录
并在其下新建index.html
1 |
|
新建config.yml
1 | # https://decapcms.org/docs/configuration-options/ |
需要自己修改一些配置;
一般到这一步就可以了,但是因为我使用自己的服务器,没办法用官方的auth系统,所以还要进一步配置。
比较简单,直接Cloudflare一键部署就可以
然后要在github新建一个oauth应用,就不写了,可以自己查找。
然后在cloudflare新建环境变量:GITHUB_CLIENT_ID:GITHUB_CLIENT_SECRET:
然后在config.yml添加
1 | backend: |
访问博客的admin就可以了
]]>1 | git clone -b dev https://<your-github-username>/appstore |
1 | cd appstore |
1 | ├──halo // 以 halo 的 key 命名 ,下面解释什么是 key |
data.yml本文件主要用于声明应用的一些信息
1 | additionalProperties: #固定参数 |
| key | name |
|---|---|
| WebSite | 建站 |
| Server | Web 服务器 |
| Runtime | 运行环境 |
| Database | 数据库 |
| Tool | 工具 |
| CI/CD | CI/CD |
| Local | 本地 |
| type | 说明 |
|---|---|
| website | website 类型在 1Panel 中支持在网站中一键部署,wordpress halo 都是此 type |
| runtime | mysql openresty redis 等类型的应用 |
| tool | phpMyAdmin redis-commander jenkins 等类型的应用 |
(注意区分于应用主目录下面的 data.yaml)
本文件主要用于生成安装时要填写的 form 表单,在应用版本文件夹下面 可以无表单,但是需要有这个 data.yml文件,并且包含 formFields 字段
以安装 halo 时的 form 表单 为例
如果要生成上面的表单,需要这么填写 data.yml
1 | additionalProperties: #固定参数 |
PANEL_APP_PORT_HTTP 有 web 访问端口的优先使用此 envKeyenvKey 中包含 PANEL_APP_PORT 前缀会被认定为端口类型,并且用于安装前的端口占用校验。注意:端口需要是外部端口
| type | 说明 |
|---|---|
| service | type: service 如果该应用需要依赖其他组件,如 mysql redis 等,可以通过 key: mysql 定义依赖的名称,在创建应用时会要求先创建依赖的应用。 |
| password | type: password 敏感信息,如密码相关的字段会默认不显示明文。 |
| text | type: text 一般内容,比如数据库名称,默认明文显示。 |
| number | type: number 一般用在端口相关的配置上,只允许输入数字。 |
简单的例子
1 | # type: service,定义一个 mysql 的 service 依赖。 |
rule 字段目前支持的几种校验
| rule | 规则 |
|---|---|
| paramPort | 用于限制端口范围为 1-65535 |
| paramExtUrl | 格式为 http(s)://(域名/ip):(端口) |
| paramCommon | 英文、数字、.-和_,长度2-30 |
| paramComplexity | 支持英文、数字、.%@$!&~_-,长度6-30,特殊字符不能在首尾 |
应用 docker-compose.yml 文件
${PANEL_APP_PORT_HTTP} 类型的参数,都在 data.yml 中有声明
1 | version: "3" |
1Panel 在 安装之前、升级之前、卸载之后支持执行 .sh 脚本
分别对应 init.sh upgrade.sh uninstall.sh
存放目录(以halo为例) : halo/2.2.0/scripts
将应用目录上传到 1Panel 的 /opt/1panel/resource/apps/local 文件夹下
注意:/opt 为 1Panel 默认安装目录,请根据自己的实际情况修改
上传完成后,目录结构如下
1 | ├──halo |
在 1Panel 应用商店中,点击更新应用列表按钮同步本地应用
v1.2 版本及之前版本的本地应用,请参考这个文档修改
1 | git add . |
在你的仓库点击 Pull requests 菜单
点击 New pull request ,填写标题和描述
选择由你的分支提交到 1Panel-dev/appstore
因为服务器部署在香港,可以直连GitHub,国内可以使用gitee或者GitHub镜像加速。
在本地安装git
打开git bash配置用户名和邮箱
1 | git config --global user.name "yourname" |
可以使用 git config –list查看当前所有的配置
在github上创建自己的账号(在自己的电脑和服务器上)
创建SSH Key
a:打开Git Bash,输入pwd查看当前路径
b.输入ssh-keygen -t rsa –C “youremail@example.com”
(输入完毕后程序同时要求输入一个密语字符串(passphrase),空表示没有密语。接着会让输入2次口令(password),空表示没有口令。3次回车即可完成当前步骤)
在GitHub上传自己的公钥

新建一个私有仓库
在自己hexo根目录下使用powershell,输入git init,然后git push到之前自己新建的仓库。
1 | name: 自动部署 |
此次添加变量较多,有:SERVER_IP,USERNAME,PASSPHRASE,KEY,PORT五个变量,如下:
SERVER_IP:服务器IPUSERNAME:SSH链接用户名,一般为rootPASSPHRASE:密钥密码,用来提升强度用KEY:密钥(私钥)PORT:SSH登录端口,一般为22
运行一下这个Action无报错即可。
]]>C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。
例如,以 Rectangle(矩形)对象为例。它具有 length 和 width 属性。根据设计,它可能需要接受这些属性值、计算面积和显示细节。
实例
1 | using System; |
尝试一下 »
当上面的代码被编译和执行时,它会产生下列结果:
1 | Length: 4.5 |
在任何 C# 程序中的第一条语句都是:
using System;
using 关键字用于在程序中包含命名空间。一个程序可以包含多个 using 语句。
class 关键字用于声明一个类。
注释是用于解释代码。编译器会忽略注释的条目。在 C# 程序中,多行注释以 /* 开始,并以字符 */ 终止,如下所示:
1 | /* 这个程序演示 |
单行注释是用 // 符号表示。例如:
1 | // 这一行是注释 |
变量是类的属性或数据成员,用于存储数据。在上面的程序中,Rectangle 类有两个成员变量,名为 length 和 width。
成员函数
函数是一系列执行指定任务的语句。类的成员函数是在类内声明的。我们举例的类 Rectangle 包含了三个成员函数: AcceptDetails、GetArea 和 Display。
实例化一个类
在上面的程序中,类 ExecuteRectangle 是一个包含 Main() 方法和实例化 Rectangle 类的类。
标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则:
关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但是,如果您想使用这些关键字作为标识符,可以在关键字前面加上 @ 字符作为前缀。
在 C# 中,有些关键字在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)。
在 C# 9.0 版本中,引入了顶级语句(Top-Level Statements)的概念,这是一种新的编程范式,允许开发者在文件的顶层直接编写语句,而不需要将它们封装在方法或类中。
无需类或方法:顶级语句允许你直接在文件的顶层编写代码,无需定义类或方法。
文件作为入口点:包含顶级语句的文件被视为程序的入口点,类似于 C# 之前的 Main 方法。
自动 Main 方法:编译器会自动生成一个 Main 方法,并将顶级语句作为 Main 方法的主体。
支持局部函数:尽管不需要定义类,但顶级语句的文件中仍然可以定义局部函数。
更好的可读性:对于简单的脚本或工具,顶级语句提供了更好的可读性和简洁性。
适用于小型项目:顶级语句非常适合小型项目或脚本,可以快速编写和运行代码。
与现有代码兼容:顶级语句可以与现有的 C# 代码库一起使用,不会影响现有代码。
传统 C# 代码 - 在使用顶级语句之前,你必须像这样编写一个 C# 程序:
实例
1 | using System; |
使用顶级语句的 C# 代码 - 使用顶级语句,可以简化为:
实例
1 | using System; |
顶级语句支持所有常见的 C# 语法,包括声明变量、定义方法、处理异常等。
实例
1 | using System; |
下载Visual Studio,社区版就可以
下载的是安装器选择.Net桌面开发,注意修改安装位置

1 | using System; |
这也是一个默认的格式
]]>修改有风险,注意备份
1 | /*https://codepen.io/poojanahelia/pen/Exabvdy*/ |
打开主题配置文件 _config.butterfly.yml,写入以下内容(以目前我的页脚为例,具体内容请自行修改):
1 | # Footer Settings |
M7Y;`^wj-1lAx&KqE+ mT}lL^1ngX|>Z!
zar1ue+v^NUVsmI%7oE6ZXY`zrkfZU#{30`9?7)=S{28}!?SBDVZif}G*0~gA!E84(
z1- JqM8Ox
zywmNX;2xv?^4cr)KWn5G_1-kFuWRW$t*^-ztc!k`WyE9}L)`OgUQDX|X7fcSbBnvw
zMG#=kN#?n@TvE-QDrm`IF3qT^jr9o32CFX993%Li@wXBL P+hOxw!e{xw^C_2RN97ycz?jPozb;9RM7^sdLz7m9Mq4|$D57-v~bEjyHj
zruIynabwll{7gL(b$+sxQ%4clg| |A>
z^OZem#u7(lEyg{M`>g$;HTBK4nD490Yt{FMwpx~n|D2cbN__t&W~Si%#^UF{|1;e<
z|KaIgJ6F|U@cB5-7mob==dsnY=+oNU!Y9|SsvdrG`1Zzn1J@^N*(dJpigzINwoGO;
z>WtEn3H_9umyruP#RbDzwOA{0TTO$#4;TLZQ$Ag)$=bY!SOz(0fyD)cL9#3fbc~j)
z)zi~e!QB?t8a6Vp5UhQHN`NhnhDF8sQsCV5k~Gx)@LsAaBV&R`fK+cFCQ}8s_A0R_
zRQSkH#dt`_2~;SNC7^r#xy0X_ULojI;ZQakHE0FQ;>`6Gtf=G69((`>VxNUU45`?I
z*40&!qKv{8*@S#?BAb$<%tMNTEJiBvsbY-2IF2lY5r=Ldt+Ut;+zQGaw+wNi$dbq|
zQcNRcceHT)6f>;)(uB}14{=gX4;gJ$!Zb63!*U=MEnxbK=p}iN5GL`Yx#`rBAwX*K
zfc<7Bv9WWv!{i@VbbLQNGQXkm#CY@So4Ykj0@1>&TVbgk=P;kQg1zl774Ofk>Wds4
zEHk#d`tXbUcby-v$8O|K*e#D9=BA$MF@7O>e!b4?@8u@Zb7QZwe;w7Cd|KymyDCC2
zx?MAgtZTkU9dA&1$
pcM|sg15B7(#H3fbvl%ZE32^OpAGGHR6@R62HV2A#&3wQ8mq4j8VvP-b__Bs`
z(9Ygk!>Q@SMfX=0{hpOJf@_>u@qj{)%bpupS^Rp96%n7{b0;?D^B09Wo5~P*uPeb{
z$ZnHCU!NC@R#f-Gbsx{S-
zLLFC!RXul`zT>mwGmU$whK#~ihWSRb=&UcZ4xzhy^@S1L+P^UC&Cq;(Jd#Qsq83f&
zMi5#UJwE35`xi-{7MHW1{@%K+9G)j0k;)I@%6PfwD3epFo4w0R5+Z>PX@;HPn=?lt
zjeD{hcyHvIhRv?nI%^gFmC)i#agzBp`DS}#
bn_oXYIyIiKd_zzp2XMj`n)R8N?c6HnL>xc=;NxQxb+8BnUyL
z0%@3l+VTOsI)R|nbv*Z)vggdveD_QAt9c_L=aLoqgYA|q`Gsb{L`Eu_mnTHPTEFw6
zUank$P}!O5d{nU#w-V}f|8#bWl75Z7WRWpSFG@m^?5F-hyYum)&qe{?`n_ZTn2DIQ
zwy$
aHjMO04^5C=8mLMc%x>(DrOoYzmSiVa^%GeeQZ-ny{&R(PrGu&S(XO!{x)mHT
z6EQ7j2&@o>Wy>sf?>rfW4N|g3V3?9`9n^~pZ3rVBdCp2Lcg^nn5rJAj)}!zI
)&%%wcMZJS8Hbh{;
zC|W93jIw8@2yIecEPFzgXHO7Ei-#Ie6&SvGB?ts~-WUTwT0p$Gk@%VX{;oyD5BH2I
zch2
=7{(E;t`~N$1E4NuNHCTMTScc=>kzseg*AdqNas~u(Ap`(}|L;rTsr((~Gfp=Y
z0HcIP?d`+xt*D0(O%rJlL5pe%b7KRRHVkc#+!0RiNFOdUyO^QqA=7f(1O-kkg<}TD
zWO8kdl!SVU3o#DnNL{=^eJ_KC@pjpSV}Lm*p`3$30&YtQAe!8k%r2#wf41ZkudN})ML(j~
N88B7DP9P!vb4s!Nq}Y^IozfM~06!F;%JB
z-Qf$(i9`9Fba*A~rDp!lpnSs%z&f&r!DI&HlJwqZ4CTB$XjWyxxAk~e%3JTa=JWrc
zqP4{aSK~kTJ>M_CfBpYcbl%Zy_Wv7?Srm_2Rim{MBd8HHirOSX?M>B=S-Z46s9HtM
zAjFIiv-T)jtyu(#QEId`B2=|P`|yn4@BW^Xznv53&gXuAuJ?7lE{Z4)>-Ab~XP(L|s11kBxAM3P?984Ig%vn`sbfF;*ELh_g8i4|G0oqt(*`g65WI%Z~CF
z`D_EQco^tF1mSJe3d%PFwGFM(B6g@-6(yAeRE2eYsJ@(pS%}X758!xVs0W4{W@R2(
z31Jo%qat=^X+eyMLJrqBhz(NQt+&VjC1;$A5kLrMP65;c9yX$NsJ|Lo!cAdAomX)|
zloS-u%h3f5Rcj&}pzsFqp9W|X;q!>>w<}9mT`b*O)ww`fEQpd-oywn+r(4(q|7a>vYk==3$FPmzfOtSg{g#FaC(-OesLZFX)3M
zvB~Q-f|E9yWwEjaSh;KZERgzCaXsuxQVk?I!!u1ruTc+^YW6=qpXWlh1rNu%@z62m
ze>6u%38pJvSV0kUn}S7d*OqnHd^w3LQg#5*cpT2|ZlM
DKkM