编程我只用CPP 发布的文章

一、问题

在vercel部署nextjs项目时,报错A commit author is required,如图所示:

github的部署也报错:No GitHub account was found matching the commit author email address

二、原因

提交commit时候的邮箱未绑定到github中去。

三、解决方案

解决方案有两种:

  1. 修改commit的邮箱为已经绑定到github的邮箱
  2. 在github上绑定commit的邮箱

受限通过git log命令查看当前commit的邮箱:

Author列会展示当前提交的用户及邮箱,将邮箱登记到githb中去(位于Settings - Emails - Add email address):

或者通过命令修改git的用户和邮箱,邮箱要和github中绑定的一致:

git config --global user.name "username"
git config --global user.email "username@email.com"

然后就可以正常部署了:

四、参考

Adding an email address to your GitHub account

问题:使用element-plusElMessage插件,触发消息事件页面没有显示。

通过F12发现消息其实是有触发出来的,可以看到消息的element被插入了,并且z-index也正常:

<div id="message_10" class="el-message el-message--error" role="alert" style="top: 16px; z-index: 2012;">
    <p class="el-message__content">消息内容</p>
</div>

问题原因

没有引入element-plus的样式文件导致。样式内容缺失,因此看不到弹窗。

解决方案

在入口处引入样式文件:

import 'element-plus/dist/index.css'

一、防抖技术

防抖是一种编程技术,用于限制某个函数在短时间内被频繁调用的次数。具体来说,当一个函数被触发时,防抖会确保该函数在指定的延迟时间内只执行一次。如果在延迟时间内再次触发该函数,计时器会被重置,重新开始计算延迟时间。

这在处理高频率事件(如窗口调整大小、输入框输入、拖动操作等)时非常有用,可以避免因频繁触发事件而导致的性能问题。

Lodash

Lodash 是一个流行的 JavaScript 工具库,提供了许多实用的函数,包括 debounce。以下是如何使用 Lodash 的 debounce 来优化你的前端代码。

二、使用Lodash

2.1 安装 Lodash

如果你的项目中还没有安装 Lodash,可以使用 npm 或 yarn 进行安装:

npm install lodash
pnpm install lodash

或者

yarn add lodash

2.2 引入debounce

在需要使用防抖功能的组件中引入 debounce

import { debounce } from 'lodash';

2.3 创建防抖函数

使用 debounce 包装你需要限制执行频率的函数。例如,在你的 CanvasComponent 中:

const saveGraphicsData = debounce((data) => {
  // 这里执行保存图形数据的逻辑
  console.log('Saving graphics data:', data);
  // 例如:调用API保存数据
}, 200); // 200毫秒的延迟

解释

  • saveGraphicsData 是经过防抖处理的函数。
  • 当 saveGraphicsData 被调用时,它不会立即执行,而是等待 200 毫秒。
  • 如果在这 200 毫秒内再次调用 saveGraphicsData,计时器会被重置,重新开始等待 200 毫秒。
  • 只有当 200 毫秒内没有新的调用时,saveGraphicsData 才会真正执行。

2.4 绑定事件处理

在你的事件处理函数中调用防抖函数:

const handleChange = (event) => {
  const data = event.target.value; // 根据实际情况获取数据
  saveGraphicsData(data);
};

解释

  • 每当 onChange 事件被触发时,handleChange 函数会被调用。
  • handleChange 调用 saveGraphicsData,但由于 saveGraphicsData 是防抖函数,实际的保存操作会被延迟执行。

2.5 清理防抖函数

为了避免内存泄漏,需要在组件卸载时取消防抖函数的计时器:

useEffect(() => {
  return () => {
    saveGraphicsData.cancel();
  };
}, []);

解释

  • useEffect 的返回函数会在组件卸载时执行。
  • saveGraphicsData.cancel() 会取消任何未执行的防抖计时器,确保不会有残留的回调函数在组件卸载后执行。

2.6 完整示例

import { useEffect, useRef } from 'react';
import { debounce } from 'lodash';

const CanvasComponent = () => {
  const canvasRef = useRef(null);
  const saveGraphicsData = useRef(null);

  // 创建防抖函数
  saveGraphicsData.current = debounce((data) => {
    console.log('Saving graphics data:', data);
    // 实际保存数据的逻辑
  }, 200);

  const handleChange = (event) => {
    const data = event.target.value; // 根据实际情况获取数据
    saveGraphicsData.current(data);
  };

  useEffect(() => {
    return () => {
      // 清理防抖函数
      saveGraphicsData.current.cancel();
    };
  }, []);

  return (
    <canvas ref={canvasRef} onChange={handleChange}>
      {/* Canvas 内容 */}
    </canvas>
  );
};

export default CanvasComponent;

三、ES语法问题

Lodash是一个比较古早的开源库,当时的代码规范和当前已经有所不同,因此在使用了es的项目中引入lodash会报错。

解决方案:使用lodash-es

pnpm install lodash-es @types/lodash-es

安装

脚本一键安装

境外的服务器可以使用脚本一键安装:

curl -L https://coder.com/install.sh | sh

手动安装

官方的安装脚本下载太慢了,直接手动下载rpm安装:

wget https://file.outman.icu/software/code-server-4.22.1-amd64.rpm  --no-check-certificate
sudo rpm -ivh code-server-4.22.1-amd64.rpm

启动服务

启动服务:

sudo systemctl enable --now code-server@$USER

启动后默认监听localhost:8080,初始密码以及配置默认放在cat ~/.config/code-server/config.yaml

bind-addr: 127.0.0.1:8080
auth: password
password: *********************
cert: false

配置

nginx反向代理

反响代理的配置需要注意添加web socket转发以及host头部的转发:

proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

登录页隐藏配置文件路径

在默认的登录页,会把密码所在的配置文件打印出来:

存在安全风险,需要去掉。修改/usr/lib/code-server/src/browser/pages/login.html文件,找到:

<div class="sub">{{I18N_LOGIN_BELOW}} {{PASSWORD_MSG}}</div>

删除其中的{{PASSWORD_MSG}}

GVM(Go Version Manager)是一款用于管理和切换不同Go语言版本的工具。它允许用户在同一台计算机上轻松安装、使用和管理多个Go版本,同时还能确保项目之间的依赖关系井然有序。GVM的主要功能包括:

  1. 安装和卸载Go版本:GVM允许用户快速安装和卸载Go语言的不同版本,以便在不同项目中使用。
  2. 切换Go版本:GVM可以轻松切换当前正在使用的Go版本,这对于在不同项目中使用不同Go版本的开发者来说非常有用。
  3. 设置默认Go版本:GVM允许用户设置一个默认的Go版本,以便在新的终端会话中自动使用。
  4. 管理Go的环境变量:GVM可以自动管理Go的环境变量,如GOROOTGOPATH,以确保每个Go版本的正确配置。
  5. 支持离线安装:GVM支持通过本地二进制包进行Go语言的安装,这对于无法访问Go官方网站的用户来说非常有帮助。

通过GVM,开发者可以更方便地在不同版本的Go语言之间进行切换,从而提高开发效率和降低潜在的兼容性问题。

如何安装gvm

首先将gvm安装脚本内容拷贝到本地:

wget https://file.maqian.xin/scripts/gvm-installer.sh

然后执行以下命令安装:

yum install bison
# 设置安装的代码源仓库,默认是github,在国内大概率拉不下来,因此需要拉到国内
export SRC_REPO=git@git.code.tencent.com:3part/gvm.git
# 安装
sh gvm_installer.sh

用法:

# 查看所有版本
gvm list
# 使用指定版本
gvm use go1.18
# 设置默认的版本
gvm use go1.18 --default

如何基于本地包安装go

gvm默认使用golang官网来下载二进制,但是国内无法访问golang官网,所以是无法安装成功。gvm提供了通过离线二进制包安装的能力,可以在国内golang网站下载好二进制包,放到~/.gvm/archive/目录下,然后执行命令安装:

gvm install go1.21.5 --binary

这样就解决了网络不通的问题。

注意:版本号必须要匹配

一、VueTorrent简介

VueTorrent是一个基于Web的BitTorrent客户端,它提供了一个干净、直观的用户界面,让您可以轻松地管理和下载torrent文件。VueTorrent利用了现代Web技术(如Vue.js、Node.js和WebTorrent)的强大功能,使得在浏览器中下载和分享大型文件变得轻松便捷。

VueTorrent的特点

  • 简洁的用户界面:VueTorrent的设计简约直观,用户可以快速上手并找到所需的功能。
  • 跨平台支持:由于是基于Web的技术,VueTorrent可以在任何操作系统和设备上运行,只要有现代浏览器。
  • 实时进度跟踪:VueTorrent会实时显示种子和下载任务的进度,方便您随时了解当前状态。
  • 种子创建功能:除了下载,VueTorrent还支持创建和分享自己的种子文件。
  • 多种下载选项:VueTorrent允许您自定义下载设置,例如选择要下载的文件、设定全局下载速度限制等。
  • 可扩展性:VueTorrent支持插件系统,您可以添加新功能以适应您的需求。
  • 支持日间/夜间模式:老外开发的系统,非常人性化,支持夜间模式

- 阅读剩余部分 -

安装

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

sh Miniconda3-latest-Linux-x86_64.sh

一路yes即可安装完成,完成后source ~/.zshrc或者source ~/.bashrc生效。

# shell自动加载
conda config --set auto_activate_base false
# 回滚
conda init --reverse $SHELL

初始化环境

创建环境

conda create --name myenv python=3.11

创建后不是默认生效的,需要执行conda activate myenv生效,如果需要默认生效则需要加入到~/.zshrc中:

echo "conda activate myenv" >>~/.zshrc

删除环境

conda remove --name myenv --all

安装包

conda install package_name

更新包

conda update package_name

查看已安装的package

conda list

更新conda

conda update conda

【保姆级教程】CentOS7宝塔面板部署兰空图床

前言:之前一直用的chevereto做图床,用了五六年了,但是最近不知道怎么回事,首页连图片都展示不出来了。搞了很久没有搞定,于是转向了是用另外一款兰空图床,记录一下部署教程。

兰空图床

一、环境要求

兰空图床要求PHP版本大于等于PHP >= 8.0.2,而数据库要求为Mysql 5.7+/PostgreSQL 9.6+/SQLite 3.8.8+/SQL Server 2017+中的一种。

建议的版本是PHP 8.1 + MySQL 5.7,如果使用的是PHP 8.2,在安装的时候会报错“服务器错误”:

需要参考文章安装兰空图床时出现500服务器错误的解决方案来解决。

在安装前,先到官网下载源码文件放到网站上,下载地址:lsky releases

二、安装PHP扩展

图床依赖fileinfo/imagemagick/exif三个扩展,在php的控制面板中可以一键安装:

三、允许使用不安全的函数

部分函数因为安全问题在安装时默认被禁止使用,但图床要使用,需要在禁用列表中删除。

用到的函数列表:readlink/symlink/putenv/getenv/exec/shell_exec/chmod/chown

PHP的配置文件中移除对这些函数的删除即可:

禁用函数

四、关闭防跨站攻击

“网站 - 网站目录”的配置中,关闭“防跨站攻击”,同时将运行目录设置为/public

五、设置伪静态

在网站的面板中,填入以下代码到伪静态配置中:

location / {
  try_files $uri $uri/ /index.php?$query_string;
}

六、开始安装

用浏览器打开网站,会自动进入安装页面并检查环境是否满足,如果不满足则会报错,根据错误信息检查上面的环境都弄好了:

安装好后点击“下一步”就可以进入安装引导页面了:

填写数据库和管理员信息:

完成安装:

七、安装完成后的配置

7.1 禁止访客注册和上传

在控制面板的系统设置中,可以关闭注册功能和游客上传功能,如果只是给自己用,建议全部关闭:

7.2 修改存储空间大小

在系统设置中修改图床的容量,默认是500M,可根据需要调整大小:

7.3 修改存储位置

兰空图床支持本地存储以及多类远程存储,比如腾讯云的COS以及阿里云的OSS等。在存储策略中可以新建策略来设置图片的存储位置:

一、问题情况

部署兰空图床时,提示“服务器错误”,错误码500:

兰空图床500服务器错误

问题原因

我的部署环境为PHP8.2,官方建议的是8.1,版本不对有些代码不兼容

二、解决方案

2.1 修改代码兼容

修改vendor/nesbot/carbon/src/Carbon/Traits/Creator.php的第928行,将

private static function setLastErrors(array $lastErrors)

修改为:

private static function setLastErrors($lastErrors)

参考:Laravel Carbon\Carbon::setLastErrors()

几个月前,沉寂了多年的typecho终于又更新版本了,先是更新到了1.20,然后没多久又更新到了1.2.1。

当时发现更新后立马就把博客给更新了,结果使用过程中发现配置的复选框一直无法保存。最后查看了github的issue,才找到了问题原因。

在typecho/var/Widget/Themes/Config.php的第74行:

$form->getInput($key)->value($this->options->{$key}); 

这行代码中,从options中拿值,但是因为测试复选框新加入的,options中并没有对应的值,导致给了一个空的值给测试复选框 $this->getInput('testBlock')

当主题选项保存的时候,is_array 中的数据是从 $this->getInput('testBlock') 拿 value,但前面程序已经设置为空值,所以在收集提交选项数据时候,以下代码判断不通过,返回 null ,最终导致保存勾选无效.

解决方案

修改上面的代码为:

if (isset($this->options->{$key})) {
    $form->getInput($key)->value($this->options->{$key});
}

参考

主题启用后,添加复选框选项无效

fix: adding checkbox options after theme initialization cannot be saved.