软硬件使用

各种应用软件、硬件的使用技法记录,以备不时之需

3年多的樱桃Cherry MX2.0S RGB键盘灯效故障修复记录

博主的这把樱桃键盘是22年4月京东Cherry搞秒杀活动时抢到的一个红轴RGB键盘,一直放在公司使用至今。在这个国产机械键盘狂卷的时代,MX2.0S感觉除了“樱桃Cherry”之名外,也没有什么特别之处了,不过,我用了这么多年感觉还是挺不错的,尤其喜欢的是这个键盘的配列,右上角的几个快捷键,计算器,媒体播放,上一曲下一曲非常的实用,相对的家里的杜伽K310 RGB的配列就没这么方便了(杜伽是先于樱桃买的)。

然而,最近偶然发现键盘的PAUSE、PAGE UP、C这三个键的背光灯一直亮着红色,一开始以为是误操作了什么灯效配置,于是又是装驱动(没错,这么多年我一直没装Cherry的驱动),又是FN+PAUSE重置的,搞来搞去还是没能恢复,于是我意识到可能是硬件故障了(下面这张拍的时候抖了下模糊了,勉强可以看到常红的三键😂)!

趁着10.1放假时间,把键盘带回家中拆开研究了一番(顺带做了下卫生,这个ABS的键帽3年多下来常用的几个键已经打油了,而且内部也布满了这些年留存下来的“宝藏”😂)。

Continue reading…

记录一个Altium Designer的Health Check问题修正问题

如上图所示,最近在学习AD画板的时候,发现除了DRC检查之外,AD还有一个Health Check功能(写文时用的版本是25.8.1),其中有几个警告级别的问题:Self-Intersecting Regions、Micro-Segments (Board)、Micro-Segments (Copper),这次记录的主要是第一和第三个问题修复过程中发现的一个奇怪问题。

首先通过点击Issues里列出的问题点:

可以定位到检测出问题的PCB位置,例如我这次的板子是定位到这里:

Continue reading…

Altium Designer 24的PCB DRC阻焊桥Solder Mask Sliver约束检测浮点数精度问题

最近在学习AD24的过程中,发现一个问题:

如截图所示,AD的DRC检查,报告了一个“[Minimum Solder Mask Sliver Constraint Violation] IP2369_EVM.PcbDoc Advanced PCB Minimum Solder Mask Sliver Constraint: (0.0998mm (3.929mil) < 0.1mm (3.937mil)) Between Pad U1-21(52.014mm,25.561mm) on Top Layer And Pad U1-22(52.014mm,25.961mm) on Top Layer [Top Solder] Mask Sliver [0.1mm]”的错误。

排查了一番,又手工计算了一下焊盘大小、阻焊扩展大小以及焊盘间距:

Continue reading…

PHP7.4升级8.3后wordpress博客遇到的问题

博主的wordpress一直都跟随官方推送的更新,一般只要提示了就会点更新,这么多年也从来没有出现更挂了的情况,但是最近更新后,管理后台赫然弹出了PHP7.4已过期的,最低满足要求版本为PHP8.3的警告提示,于是强迫症发作,升级了一波,果然升级后访问页面直接出现了PHP崩溃的情况,特此记录下一些处理方法。

首先,既然官方提示了升级警告,那自然表明wordpress本身代码是都可以兼容8.3版本的PHP的,问题基本都出在各种常年没人维护的插件上,首先第一个:

[Fri Jul 11 16:20:57.973316 2025] [proxy_fcgi:error] [pid 19955:tid 20046] [client 85.208.96.204:23228] AH01071: Got error 'PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function create_function() in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php:189\nStack trace:\n#0 /var/www/vhosts/blog.k-res.net/wp-settings.php(545): include_once()\n#1 /var/www/vhosts/blog.k-res.net/wp-config.php(73): require_once('...')\n#2 /var/www/vhosts/blog.k-res.net/wp-load.php(50): require_once('...')\n#3 /var/www/vhosts/blog.k-res.net/wp-blog-header.php(13): require_once('...')\n#4 /var/www/vhosts/blog.k-res.net/index.php(17): require('...')\n#5 {main}\n  thrown in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php on line 189'
[Fri Jul 11 16:21:22.922529 2025] [proxy_fcgi:error] [pid 19956:tid 20045] [client 66.249.68.38:61524] AH01071: Got error 'PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function create_function() in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php:189\nStack trace:\n#0 /var/www/vhosts/blog.k-res.net/wp-settings.php(545): include_once()\n#1 /var/www/vhosts/blog.k-res.net/wp-config.php(73): require_once('...')\n#2 /var/www/vhosts/blog.k-res.net/wp-load.php(50): require_once('...')\n#3 /var/www/vhosts/blog.k-res.net/wp-blog-header.php(13): require_once('...')\n#4 /var/www/vhosts/blog.k-res.net/index.php(17): require('...')\n#5 {main}\n  thrown in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php on line 189'
[Fri Jul 11 16:21:52.750113 2025] [proxy_fcgi:error] [pid 19955:tid 20013] [client 49.232.55.15:43176] AH01071: Got error 'PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function create_function() in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php:189\nStack trace:\n#0 /var/www/vhosts/blog.k-res.net/wp-settings.php(545): include_once()\n#1 /var/www/vhosts/blog.k-res.net/wp-config.php(73): require_once('...')\n#2 /var/www/vhosts/blog.k-res.net/wp-load.php(50): require_once('...')\n#3 /var/www/vhosts/blog.k-res.net/wp-blog-header.php(13): require_once('...')\n#4 /var/www/vhosts/blog.k-res.net/index.php(17): require('...')\n#5 {main}\n  thrown in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php on line 189'
[Fri Jul 11 16:21:52.750983 2025] [proxy_fcgi:error] [pid 19956:tid 20010] [client 49.232.55.15:43192] AH01071: Got error 'PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function create_function() in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php:189\nStack trace:\n#0 /var/www/vhosts/blog.k-res.net/wp-settings.php(545): include_once()\n#1 /var/www/vhosts/blog.k-res.net/wp-config.php(73): require_once('...')\n#2 /var/www/vhosts/blog.k-res.net/wp-load.php(50): require_once('...')\n#3 /var/www/vhosts/blog.k-res.net/wp-blog-header.php(13): require_once('...')\n#4 /var/www/vhosts/blog.k-res.net/index.php(17): require('...')\n#5 {main}\n  thrown in /var/www/vhosts/blog.k-res.net/wp-content/plugins/custom-iframe-widget/custom-iframe-widget.php on line 189'

简单看了下调用栈,发现果然是某个“古早”插件:“custom-iframe-widget”的问题,查了下报错异常“Call to undefined function create_function()”,就是8.3中废弃的函数,要换成匿名函数实现,于是小改了一下:

181 function custom_parse_iframe_widget($text)
182 {
183         return preg_replace_callback("@(?:<p>\s*)?\[ShaktiIFrame\s*(.*?)\](?:\s*</p>)?@", 'shakti_iframe_replace', $text);
184 }
185 
186 add_filter('the_content', 'custom_parse_iframe_widget');
187 add_filter('the_excerpt', 'custom_parse_iframe_widget');
188  $new_func = function() {register_widget("Custom_IFrame_Widget");};
189 //add_action( 'widgets_init', create_function( '', 'register_widget("Custom_IFrame_Widget");' ) );
190 add_action( 'widgets_init', $new_func );
191 ?>

结果,又报了新的错误:

Continue reading…

记录下最近更换泰坦军团P275MV PLUS显示器后的G-SYNC,Win11 DRR,DSC折腾情况

最近趁着国补+以旧换新优惠,更新了下显示器,换掉了用了8年的傻多戴U2518DR(现在看当年真的是傻多了,2500的价格,只为一个2k,没有高刷,所谓的HDR还是个假的) ,改投了国产泰坦军团的高性价比型号P275MV PLUS。4K 160HZ,1080 320HZ双模切换,Mini LED 1152分区HDR1000,还带TYPE-C PD 65W快充和USB集线器,光感自动亮度,内置音箱等功能,可以看到这8年显示器技术有了多大的提升,可以说是鸟枪换了炮。其实这款型号当初刚上的时候就关注到了,那时本来想买败家之眼XG27UCG,但刚需PD快充一直没下手,同时泰坦这款上市后价位和UCG差不多,对于国产品牌来说感觉还是有点贵。但这不最近国补一上,性价比就出来了,以旧换新出了Dell后也就1000出头,没啥好说的,果断换了!

这次记录的是换后折腾高刷,Windows 11 DRR动态刷新率),DSC(Display Stream Compression),G-Sync(VRR,对应到这款显示器的是Adaptive Sync技术)的一些总结:

Continue reading…

docker image pull时频繁出现unauthorized: authentication required问题的一种解决方法

问题现象如下:

[root@ci1 ~]# docker image pull wzkres/centos-ci-gcc:centos-7-cross-arm64
centos-7-cross-arm64: Pulling from wzkres/centos-ci-gcc
2d473b07cdd5: Already exists 
9d26d6802cad: Pull complete 
90f6d29b7c1a: Pull complete 
7bfff1b24796: Pull complete 
80b3d4546432: Pull complete 
c3a37398e8b3: Pull complete 
3ba42b3a770d: Pull complete 
85b3405c69c4: Downloading 
2ad9c2d42a3d: Waiting 
5f1b06925eb4: Waiting 
4f4fb700ef54: Waiting 
57c257cf6173: Waiting 
787f48d693d2: Waiting 
9f1677804e77: Waiting 
c13fd6dc43b4: Waiting 
80bd40938514: Waiting 
56ba96a89fa8: Waiting 
unauthorized: authentication required

在从hub.docker.com拉取公开镜像时,频繁出现标题中提到的错误而失败,出现时间随机,且出现频率非常高,导致稍大些的镜像几乎无法顺利完成下载。一开始以为是网络问题,各种更换“科学”,使用镜像代理均没什么效果,看提示的是“authentication”,还以为是docker hub登录信息的问题,于是也试过docker login -u xxxx,无果…

Continue reading…

基于STM32F1系列MCU实现USB HID鼠标时的开机概率无反应问题

最近在研究基于STM32F103CBT6单片机的USB HID鼠标设备实现,电路部分主要抄自各开源实现,今天要记录的主要是单片机软件方面的问题:测试阶段发现如果在开机前先插好USB鼠标,再开机,有一定概率出现鼠标操作没反应的情况!并且这个现象在我的笔记本(联想thinkbook 14+,支持关机USB充电)上要比台式机(技嘉X570+5700x,前置USB)上出现几率高不少,基本上开3次就能有1次出现这种情况。

先说明下,MCU软件部分主要基于ST的“STM32F10x, STM32L1xx and STM32F3xx USB full speed device library (UM0424)” https://www.st.com/en/embedded-software/stsw-stm32121.html USB库实现,里面有HID实现的例子,基本都是照抄的,改了下Joystick例子的USB描述符,报文相关参数(3按键+1滚轮+XY移动,1ms轮询)。电路部分,一开始实验的时候用的是合宙的AIR32F103,对比STM32F103,支持USB DP的内部1.5k上拉,自己画板制作的时候由于STM32F103没有内部DP上拉,于是简单做了个固定1.5k到3.3v的上拉,做这个设计的过程中已经查到过有些资料参考ST-LINK的设计,应该使用一个GPIO口,通过加NPN开关三极管方式驱动这个1.5k上拉,用于遵守USB 2.0规范约定的设备可枚举信号,同时也根据这个wiki的描述:https://stm32world.com/wiki/STM32_USB_Device_Renumeration ,实测这种通过将DP端口改为PP输出,并拉低50ms左右的非标准做法,也可以实现控制枚举、软件重枚举的功能。于是就没做类似ST-LINK的设计,所以一开始发现标题问题时,以为是这种非标准的USB枚举初始化导致,但是后来通过观察出现问题时的串口日志发现USB初始化枚举都正常,只是在等待轮询取上报数据时出现了问题!

研究了一番后,找到了一个简单的解决方法,加了个超时重置标识变量的方法,如下:

Continue reading…

CentOS 7交叉编译调用libsamplerate库程序ARM64(aarch64)版的libm wrong format问题

还是先说下环境,系统是CentOS 7.9(怕玩坏了,用的docker,官方镜像centos:centos7.9.2009),配合ARM官方的linux工具链gcc-arm-8.3-2019.03-x86_64-aarch64_be-linux-gnu.tar.xz(这里: https://developer.arm.com/downloads/-/gnu-a),解压到了 /usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu,使用环境变量:

export AR="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-ar"
export AS="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-as"
export CC="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc"
export CXX="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++"
export RANLIB="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-ranlib"
export STRIP="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-strip"
export PATH="/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin:$PATH"

来指定交叉编译工具链,依赖的libsamplerate库版本是:0.2.2,报错信息如下:

/usr/local/ARM-toolchain/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/8.3.0/../../../../aarch64-linux-gnu/bin/ld: /usr/lib64/libm.so: error adding symbols: file in wrong format

Continue reading…