余弦相似度的推导以及不影响相似度计算的向量维度拓展方法
背景
以前在存储EMBEDDING模型输出向量的时候,由于不同模型输出的向量维度不同,而向量数据库同一个表只能存储同一维度长度的向量,当时使用的方案是直接在向量后面补0来拓展。
最近在思考这样做为什么不会影响相似度的计算,同时研究了一下余弦相似度计算公式的推导过程。
向量长度
一维向量的长度
对于向量 x=(x)x = (x)x=(x)
它的长度是 ∥x∥=∣x∣\|x\| = |x|∥x∥=∣x∣
二维向量的长度
对于向量 x=(x1,x2)x = (x_1, x_2)x=(x1,x2)
123456789(x1, x2) * |\ | \x2 | \ ||x|| | \ |____\ x1
它的长度是 ∥x∥=x12+x22\|x\| = \sqrt{x_1^2 + x_2^2}∥x∥=x12+x22
三维向量的长度
对于向量 x=(x1,x2,x3)x = (x_1, x_2, x_3)x=(x1,x2,x3)
它的长度是 ∥x∥=x12+x22+x32\|x\| = \sqrt{x_1^2 + x_2^2 + x_3^2} ...
开发工具数据迁移
背景
最近发现一个问题,我的C盘满了,我用SpaceSniffer检查了一下,发现WSL的数据吃了我将近100G,各种开发环境的包也吃了不少空间,所以打算把这些数据迁移到其他盘,然后通过符号链接的方式来解决这个问题。
迁移WSL
wsl的迁移现在已经很简单了,现在可以直接使用move命令来迁移wsl的存储位置
首先看看当前有哪些wsl,记录下要迁移的wsl的名字
1wsl --list
适用于 Linux 的 Windows 子系统分发:
Arch (默认值)
rancher-desktop-data
rancher-desktop
然后开始迁移
12345wsl --manage Arch --move F:\wsl\Archwsl --manage rancher-desktop-data --move F:\wsl\rancher-desktop-datawsl --manage rancher-desktop --move F:\wsl\rancher-desktop
迁移完成后,重新打开wsl,检查数据是否完整
迁移其他开发工具下载的依赖包
比如maven、pip、npm ...
使用Antlr4来解析P社游戏群星[stellaris]的科技树
背景
群星更新了4.0,然后新版本的科技树不知道长什么样,科技树mod也坏了,就打算自己修一下,顺便学习一下Antlr4
方案
1. 解析游戏的配置文件
科技树的配置文件在common/technology/目录下
本地化文件在localization/目录下,这次只考虑中文
变量在common/scripted_variables目录下
还有个scripted_trigger在common/scripted_triggers目录下,这次没有用到
每个配置文件的配置项都可以看做是一个对象,对象中有赋值语句和条件计算语句,计划是在grammar中定义整个结构,这样可以在Visitor中读取到每个Property的数据
如
1234567891011121314151617181920212223242526272829303132333435363738394041424344technology_body : technology_body_start ( area | tier | category | icon | modifier | ...
在磁盘上安装LiveCD
安装教程
因为目前切换到了Windows,先简要备注一下大概的步骤,后续有机会再补充详细的步骤
准备一个UEFI启动的分区,格式化为FAT32格式,具体大小看想放多少个镜像,我这边是分了10G,假设分区名称为sda1
将EFI分区挂载到/mnt,然后安装grub,注意需要用removable的方式,这样会把grub所需的模块全部安装到EFI分区
https://wiki.archlinux.org/title/GRUB/Tips_and_tricks#Alternative_installation_methods
12mount /dev/sda1 /mntgrub-install --target=x86_64-efi --bootloader-id=LIVECD --efi-directory=/mnt --boot-directory=/mnt --removable
这样会得到结构的EFI分区
123456789EFI BOOT BOOTX64.EFIgrub fonts locale themes x86_64-efi grubenv
安装完之后 ...
Steam的P2P联机优化
背景
最近在玩群星,但是多人联机效果非常差,然后网上调研了一下发现可以用组网工具加速提升联机效果。
使用了一段时间之后发现有时候有效果有时候没有效果,所以研究了一下。
P2P实现的原理
Steam 数据报中继
https://partner.steamgames.com/doc/features/multiplayer/steamdatagramrelay?l=schinese
https://partner.steamgames.com/doc/api/ISteamNetworkingSockets#CreateListenSocketP2P
https://partner.steamgames.com/doc/api/ISteamNetworkingSockets#ConnectP2P
Steam的SDK中提供了可以直接用于P2P的接口,游戏只需要实现接口就实现P2P连接
Steam中的对等网络及共享IP 地址
https://help.steampowered.com/zh/faqs/view/1433-AD20-F11D-B71E
参考这篇文章介绍
使用中继进行对等连接
在建 ...
实现一个能够自动删除的临时文件
背景
前段时间在弄关于文档转图片然后进行处理的工作,其中由于图片内容会多次读取,所以将其持久化在本地。
但是由于图片是临时文件,所以需要在使用完之后删除。
最初的实现是使用try-with-resource,但是随着流程变得复杂,图片的生命周期变得不可控,所以需要一个更好的解决方案。
思路
利用Cleaner的特性,在文件被GC回收时,进行删除操作。需要注意不要在cleaner中应用this对象,否则会导致内存泄漏。
利用MDC保存当前线程的MDC信息,这样cleaner执行时,用于跟踪上下文的MDC可以保留,使得traceId等信息不会丢失。
实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556package com.haizhi.metis.document.parse.common;import java.io.File;import java.io.IOException;import java.lang.ref.C ...
让自定义注解支持配置属性注入
背景
在写代码的过程中需要用到一些自定义annotation,但是annotation中的String类型的value需要字符串常量,于是想是否可以将@Value所支持的表达式移植到自定义注解中。
实现
Spring中的具体实现
org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency
123456789101112131415161718Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);if (value != null) { if (value instanceof String) { String strVal = resolveEmbeddedValue((String) value); BeanDefinition bd = (beanName != null && contain ...
SpringCloudFeign中的超时时间配置
背景
最近在排查一个关于超时时间的bug,跟踪代码发现了一个以前没注意到的点
https://github.com/spring-cloud/spring-cloud-openfeign/issues/324
问题
12345# org.springframework.cloud.openfeign.FeignClientFactoryBean#configureUsingPropertiesif (config.getConnectTimeout() != null && config.getReadTimeout() != null) { builder.options(new Request.Options(config.getConnectTimeout(), config.getReadTimeout()));}
在使用配置文件设置feign-client的时候,只有readTimeout和connectTimeout配置同时设置才会起效,具体的判断逻辑在org.springframework.cloud.ope ...
windows上游戏加速器与WSL共存
现象
发现在使用加速器之后,WSL相关的应用会出现无法启动的情况,需要重置网络。
参考Github上的解决方案https://github.com/microsoft/WSL/issues/4177#issuecomment-597736482,按照以下步骤即可。
下载NOLSP.exe
www.proxifier.com/tmp/Test20200228/NoLsp.exe
以管理员权限执行以下命令
12345NoLsp.exe "C:\Program Files\WSL\wsl.exe"NoLsp.exe "C:\Program Files\WSL\wslservice.exe"NoLsp.exe "C:\Program Files\WSL\wslhost.exe"NoLsp.exe "C:\Program Files\WSL\wslrelay.exe"taskkill -IM "wslservice.exe" /F
conda环境中共享库找不到问题原因及解决方案
背景
今天使用micromamba新建了一个环境来试试latex-ocr+paddle ocr的效果
1micromamba create -n latex-ocr python=3.8 cudatoolkit=10.2 cudnn
环境创建完成之后切换环境并安装依赖
12micromamba activate latex-ocrpip install -r requirements.txt
然后开始跑代码
1python main.py
发现问题
在跑代码的时候发现报了一个库没有找到的问题
123456789101112131415161718192021222324252627Error: Can not import paddle core while this file exists: /root/micromamba/envs/latex-ocr/lib/python3.8/site-packages/paddle/fluid/libpaddle.soTraceback (most recent call last): File "main.py", ...
