Write the Code. Change the World.

5月 13

在 git 版本工具中,同一个公钥只允许配置一个。假如你有多个电脑,多个账号,多个项目需要进行代码上传下载。这个时候就处理不好。

有这样一个场景:
在 A 电脑,有一个 a 项目,上传到 a 账号的 github 上。
继续,在 A 电脑,有一个 b 项目,上传到 b 账号的 github 上。

如果想使用 ssh-key 的授权方式来上传代码。同一个 ssh-key 只能配置在一个账号里。也就是对于同一个 git 平台,同一个 ssh-key 只能有一份。于是,你就只能再去创建一个新的 ssh-key,然后配置另外一个账号里。

这样的确是可以配置进去了。但是,当你上传代码的时候,会提示授权不过。因为,git 没指定 ssk-key 的时候,会使用默认的公私钥,就是 id_rsa。这个时候,就需要在特定项目,指定也定的 ssh-key 就实现了。

生成 ssh-key

ssh-keygen -t rsa -C xxx@xx.com -f xxx-github

指定 ssh-key

方式一(到当前目录下):

git config core.sshCommand "ssh -i ~/.ssh/xxx-github"

方式二

# 添加
ssh-add ~/.ssh/xxx-github

# 删除
ssh-add -d ~/.ssh/xxx-github

# 查看
ssh-add -l

推荐使用方式一,这样每个项目都会对应好自己的 ssh-key,不会影响其他的项目。

历史

https://blog.vini123.com/1070

https://blog.vini123.com/1134

阅读全文 >>

5月 08

Laravel 11Laravel Reverb 现已发布。Reverb 是 Laravel 生态系统的最新成员,是第一方、可扩展的 WebSocket 服务器,旨在为用户的应用程序提供强大的实时功能。

Laravel 11 引入了:极简应用结构、默认使用 SQLite、实现 health routing、提供每秒速率限制、支持优雅的加密密钥轮换、改进队列测试、引入新的 Artisan 命令、添加 Resend 邮件传输、集成 Prompt validator、新的 Artisan commands、Model Casts 改进、The once function、改进了使用内存数据库进行测试时的性能、改进了对 MariaDB 的支持等等,

Laravel 11 使用的 PHP 版本最低要求是 PHP 8.2。

阅读全文 >>

5月 04

vite 支持自动处理 scss,less 等文件,但需要下载对应的包 https://cn.vitejs.dev/guide/features#css-pre-processors。 如果,你想单独写 scss 这些,可以在 vite.confit.ts 中进行配置

常规操作

1、先创建一个 vue3 项目

# 创建 vue 项目
pnpm add vue

pnpm format

pnpm dev

# 添加 git 版本控制
git init -b main
git add .

2、安装 sass

pnpm add sass

3、创建一个 scss 文件

touch ./src/assets/css/base.scss

# 填充下边内容
body {
    background-color: #f00;
}

4、在 vite.config.ts 中进行配置

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import VueDevTools from 'vite-plugin-vue-devtools'

// https://vitejs.dev/config/
export default defineConfig({
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@use "@/assets/css/base.scss";`
      }
    }
  },
  plugins: [vue(), VueDevTools()],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

这个时候,发现 base.scss 中的样式不生效。真的很郁闷,查了一些文档和资料,就是这么写的,偏偏不行。还好在 segmentfault 上找到了一个解释。就是你必须至少在 .vue 文件里边至少使用 <style lang="scss"><style>。于是,手动这样加了一下,果真样式生效了。 当下用的是最新版本的 vite(vite5),依然存在这个问题。

参考

https://segmentfault.com/a/1190000041425201

阅读全文 >>

4月 30

官方地址:https://github.com/TMElyralab/MuseV

在这里,可以看到生成的样例。这里总结下部署和安装,几乎和官网一样。

环境准备

开始

  1. 先创建一个项目目录, museVtask。将 github 代码拉下来。
    git clone --recursive https://github.com/TMElyralab/MuseV.git 这里一定要加上recursive参数,这样会将 diffusers 等子模块一起下载下来。

  2. 下载模型文件。这里不使用 git 下载,毕竟模型文件 32.3 G。使用 huggingface cli,还得要梯子。huggingface-cli download --resume-download TMElyralab/MuseV --local-dir ./MuseV/checkpoints

  3. 在下载的同时,可以将 docker-compose 配置文件搞起来。先创建 Dockerfile 文件,代码如下:

FROM anchorxia/musev:latest  

# 设置工作目录  
WORKDIR /workspace/MuseV  

# 将宿主机的 MuseV 目录复制到容器的对应目录  
COPY ./MuseV /workspace/MuseV  

# 设置 PYTHONPATH 环境变量  
ENV PYTHONPATH=/workspace/MuseV:${PYTHONPATH}  
ENV PYTHONPATH=/workspace/MuseV/MMCM:${PYTHONPATH}  
ENV PYTHONPATH=/workspace/MuseV/diffusers/src:${PYTHONPATH}  
ENV PYTHONPATH=/workspace/MuseV/controlnet_aux/src:${PYTHONPATH}  

# 这里可以设置默认的命令,但如果你想要 bash 交互式 shell,则不需要  
# CMD ["python", "your_script.py"]  

再创建 docker-compose.yaml 文件,代码如下:

services:
  musev:
    build:
      context: .
      dockerfile: Dockerfile
    image: musev
    container_name: musev-latest
    runtime: nvidia
    restart: always
    volumes:
      - ./MuseV:/workspace/MuseV
    stdin_open: true
    tty: true

如果报错 docker: Error response from daemon: unknown or invalid runtime name: nvidia,请参考 https://blog.vini123.com/1206

阅读全文 >>

4月 30

docker 容器中运行 python 项目时,报 RuntimeError: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx 错误,这个时候需要 docker 开启 nvidia engin 的支持。至少电脑是装了 nvidia 的显卡的。

docker 中启用 nvidia:
https://blog.vini123.com/1206

阅读全文 >>

4月 30

在 docker 中,docker-compose.yaml 配置了 nvida 参数时,执行 docker-compose up -d 时报docker: Error response from daemon: unknown or invalid runtime name: nvidia 错误。

如果是非 win 系统,修改 /etc/docker/daemon.json,并添加以下配置。

{
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  },
  "default-runtime": "nvidia"
}

然后重启 docker

如果是 win 系统,需要手动打开 docker 桌面应用,点击右上角的设置,进入 docker engine 项进行配置。配置内容也是和上边的一样。如下截图。

阅读全文 >>

4月 26

goframe 生成不重复的 7 位数字,并和数据库 user 表中字段不重复

func generateUniqueID() int {
    src := rand.NewSource(time.Now().UnixNano())
    min := 1000000
    max := 10000000
    return rand.New(src).Intn(max-min) + min
}

func generateUniqueViewID(ctx context.Context) (int, error) {
    for {
        viewId := generateUniqueID()
        id, err := dao.Users.Ctx(ctx).Where(do.Users{Viewid: viewId}).Fields("id").Value()
        if err != nil {
            return 0, err
        }

        if id == nil {
            return viewId, nil
        }
    }
}

阅读全文 >>

4月 26

随着 AI 聊天的兴起,流式展现数据的需求变得更常见。前端 EventSource 的使用频率也会更高。接openai,文心一言,通义千问这些接口,并以流式的方式在页面展现出来。就得自己的接口服务端也以流式的方式返回给自己的前端,自己的服务器端接它们,让它们也要以流的方式返回。这个时候服务端不仅要做接口的对接和数据的转发,还得做数据的解析和存储。

这里前端以 vue3,后端使用 laravel 的方式,来简单介绍下怎么搞。

前端 API 选择

https://developer.mozilla.org/zh-CN/docs/Web/API/EventSource

前端选择 fetch,并没有选择 EventSource。

因为 fetch 本身就可以支持 EventSource 的方式接受数据,使用方式也会像使用 axios 类似。而单纯 EventSource 的使用会收到请求方式,不能自定义Header头,连接数目等方式的限制。fetch 就像在调用接口,EventSource 就像是 websocket。

EventSource 示例:

const sse = new EventSource("/api/v1/sse");

sse.addEventListener("notice", (e) => {
  console.log(e.data);
});

sse.addEventListener("update", (e) => {
  console.log(e.data);
});

sse.addEventListener("message", (e) => {
  console.log(e.data);
});

阅读全文 >>

4月 18

docker 中运行 mysql 8.2,默认情况下,会占用 400M 左右的内存。运行两个就双倍。对于那种便宜的阿里云1核1G或2G的服务器,很容器就卡死。这个时候,就需要设置设置,降低 mysql 的内存消耗了。
其实,一个 mysql 占用 400M 内存,为什么要在一台服务器上装那么多呢。可以对 mysql 进行单独编排,然后通过同一网络的方式,让其他容器也都能访问这个 mysql 就可以了。出现前边那种局面往往是一个完整的项目会有 mysql,redis,php,python,java 等环境构成,而这些构成又放在一个 compose.yaml 中进行编排。那么多个项目后,就会出现多个重复的进程了。虽然对于磁盘空间不会多份重复,内存是在重复增长的。这个时候,设计项目组合的时候就需要考虑考虑。所以想单独剥离 mysql 出来。

可以使用 htop 命令来查看服务器的 cpu,内存使用情况。

可以使用 docker stats 来查看容器使用 cpu, 内存的情况。

优化使用 mysql 内存

新建 my.cnf 文件 ,位置是这样的 ./conf/mysql/my.cnf 。填充下边的代码。

[mysqld]
performance_schema_max_table_instances=400
# 缓存
table_definition_cache=400
# 用于监控MySQL server 在一个较低级别的运行过程中的资源消耗、资源东西
performance_schema=off
# 打开表的缓存
table_open_cache=64
# InnoDB缓冲池大小调整操作的块大小
innodb_buffer_pool_chunk_size=64M
# InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小
innodb_buffer_pool_size=64M

在 compose.yaml 中,增加 volume,配置如下。

  mysql: 
    ……
    volumes:
        ……
      - ./conf/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 3306:3306

然后重启 myslq。

docker-compose restart mysql

然后查看内存使用情况进行对比。

多个项目公用一个 mysql

可以给 mysql 进行单独编排,设置好网络。可以将该网络设置为主网络,其他容器可以通过 external 的方式公用同一个网络。这样各个容器间就方便通信了。

阅读全文 >>