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.Cleane ...
让自定义注解支持配置属性注入
背景在写代码的过程中需要用到一些自定义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 && containsB ...
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.open ...
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" ...
基于语法树对文章中的章节数据进行匹配
背景之前有尝试过使用正则提取一篇文章中的标题信息,并还原其中的层级,碰到以下几个问题:
正则规则复杂,调试不方便
正则对于匹配到标题中的编号信息需要在代码中进行二次处理,处理的步骤也很麻烦,需要考虑多种边界条件
当正则变动时,对应的代码也需要进行变动
突发奇想是否可以使用ANTLR4通过构建语法树的方式来解决这几个问题
构建语法树标题识别的思路常见标题样式可分为以下两种:
(左侧分隔符) 编号 右侧分隔符 正文,比如:
第一章
第一节
1:
2:
左侧分隔符不一定存在,但是右侧分隔符会存在
编号.编号.编号 右侧分隔符 正文,比如:
1
1.1
1.1.1
对于列举式,像带有如下列所述等字眼,通过a 、b、c等序号一条一条列举出来的暂时不在文本考虑范围内。
开始构建语法树123456789101112131415161718192021222324252627282930313233343536373839grammar TitleDetect;//代表整个段落,有3个部分expr:title_begin ? num_seg splite;//代表段落第一部分 ...
hexo将图片发布为网站静态资源
问题目前部分博客页面所引用的图片存储在图床,存在以下几个问题:
每个图片需要单独上传,流程复杂,并且本地和图床的图片需要单独管理
当使用github作为图床时,存在隐私问题,如不小心上传敏感图片时,需要通过push --force等方式覆盖所有提交
当使用阿里云等对象存储需要付费
想要实现的目标
将图片,如png等和html发布为网站内静态资源,从而摆脱图床的限制
与typora编辑器无缝配合
将hexo仓库放在github private项目管理,将编译后的结果放在github.io进行展示
步骤(2027-08-09)今天发现不需要设置typora-root-url,有一个插件可以解决这个问题https://github.com/cocowool/hexo-image-link
步骤开启hexo自带的文章资源文件夹功能
https://hexo.io/zh-cn/docs/asset-folders.html#%E6%96%87%E7%AB%A0%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E5%A4%B9
当开启这个功能之后,使用 hexo n ...
RabbitMQ通过Docker建立集群
https://github.com/rabbitmq/rabbitmq-cli/pull/445
目前RABBITMQ_ERLANG_COOKIE环境变量已经被弃用,现在有两种方法设置erlang cookie
在容器启动时直接覆盖$HOME/.erlang.cookie文件
使用--erlang-cookie显式覆盖erlang cookie
直接覆盖$HOME/.erlang.cookie文件在容器启动时直接挂载一个$HOME/.erlang.cookie文件到容器中去
创建一个自定义的erlang.cookie文件,注意修改文件的权限
也可以用docker secret
12345# 自定义erlang.cookie文件内容echo '123456' > erlang.cookie# 修改文件所有者为容器内的rabbitmq用户,并且修改读写权限为0600chmod 0400 erlang.cookiechown 999:999 erlang.cookie
创建网桥和容器,并把文件挂载到容器内部去
1234567# 创 ...
如何设置Java应用的时区
最近研究时区问题的时候发现Linux上的Java时区设置简单中带着一些不简单,翻了翻jvm的源码把这部分的逻辑理清楚了
JVM如何获取获取当前时区1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 public static TimeZone getDefault() { return (TimeZone) getDefaultRef().clone();}/*** Returns the reference to the default TimeZone object. This* method doesn't create a clone.*/static TimeZone getDefaultRef() { TimeZone defaultZone = defaultTimeZone; if (defaultZone == null ...