1 | // 读取图像 |
需要用到三维向量数组Vect3b,这里需要注意的是,Opencv是BGR而不是我们常用的RGB。
1 | // 读取像素 |
1 | // 修改像素 |
1 |
|
1 | // 图像通道分离与合并 |
不知道为什么我们专业看起来与计算机八竿子打不着,竟然要学opencv,那就来记录一下吧!
Ubuntu因为有完善的包管理体系,所以配环境相对简单。
先安装vscode,当然也可以不安装,只是个编辑器;
到这里下载deb格式的软件包,然后dpkg安装即可。可以安装这些扩展:
)
接下来安装编译器
1 | # 先更新软件包 |
然后就可以了。
Windows 下需要安装Visual Studio,比较简单,官网下载安装就行。选择使用C++桌面开发就行。
下载opencv,在下边网站下载Windows安装包,
下载后是一个自解压包,解压路径设置成自己想要的路径,
把安装路径添加到系统环境变量中,例如D:\Opencv\opencv\build\x64\vc16\bin
然后应该就没问题了。
不知道为什么我们专业看起来与计算机八竿子打不着,竟然要学opencv,那就来记录一下吧!
之前一直使用浏览器自带的密码管理器,跨平台不太好用,所以自建一个Bitwarden服务器。
但是我们一般用Vaultwarden,占用更小,有一些Bitwarden的商业功能。
1 | services: |
然后使用nignx进行反向代理,然后就可以尽情享用了。
]]>gitea,所以把renovatebot也自建一下,毕竟renovatebot可以自动更新依赖,但是它不对自建git提供服务。docker compose文件:1 | services: |
可以新建一个renovate用户来专门管理,然后登录这个账户创建一个登录token。然后再需要使用这个的仓库添加这个用户为协作者就可以了。
这个docker容器在运行后会自动退出,这是正常的。
可以在系统crontab新建一个定时任务,这样就可以自动运行更新。
1 | cd /www/compose/renovatebot && docker compose run --rm renovate |
gitea,所以把renovatebot也自建一下,毕竟renovatebot可以自动更新依赖,但是它不对自建git提供服务。docke]]>
值此二〇二六年蛇年来临之际,为贯彻落实“快乐至上”的核心价值观,进一步提升全体人员的幸福指数,现将有关事项通知如下:
一、各单位要切实做好“吃好喝好”保障工作,严禁在假期期间进行任何形式的emo。
二、请各有关人员在收到本通知后,务必在下方留言区留下你的新年愿望,由后台系统统一收集并祝愿其实现。
三、祝大家在新的一年里,身体健康,万事如意,所得皆所愿,所行化坦途!
]]>值此二〇二六年蛇年来临之际,为贯彻落实“快乐至上”的核心价值观,进一步提升全体人员的幸福指数,现将有关事项通知如下:
一、各单位要切实做好“吃好喝好”保障工作,严禁在假期期间进行任何形式的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,可以自己改改。
]]>git remote add origin就行,但是action文件就有些变更。这里用二进制文件安装
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’ 要一致!!!
ghost cms,在构建搜索时发现了typesense,所以把他移植到这个博客上。
首先在网上查找自己喜欢的字体,这里有一个网站
找到一个自己喜欢的,如果有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,但是可能有拦截失败的情况(好像没有遇到过)。
Openwrt系统,并且也配置了OpenClash和AdguardHome,两者的原理简单看都是劫持DNS,所以两者要同时运行,必须经过一定的配置。Adguardhome是用于拦截广告的工具,搭配好的规则,拦截效果才会更好,下面来分享一些规则:

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

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

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


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

AdguardHome是一款广告拦截软件,有了一台小软路由后就开始折腾了。
因为一直想要实现从软路由上进行代理,所以买到了一个Cudy Tr3000刷系统折腾。用这篇文章记录一下安装的过程。
可以通过web管理页面安装,搜索openclash。

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

然后导入配置:

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

因为一直想要实现从软路由上进行代理,所以买到了一个Cudy Tr3000刷系统折腾。用这篇文章记录一下安装的过程。
Cudy-TR3000路由器,用来进行科学上网(小猫咪),先记录一下刷写Openwrt系统的过程。Cudy官方网站上下载
访问192.168.10.1先刷入中间固件

然后访问192.168.1.1,刷入Openwrt插件

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

Cudy-TR3000路由器,用来进行科学上网(小猫咪),先记录一下刷写Openwrt系统的过程。
因为正好有云存储的需求,恰好又有服务器,所以决定自建一个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插件,然后填写自己的域名、密钥(在参数中可以查到)
因为正好有云存储的需求,恰好又有服务器,所以决定自建一个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