K-Res

不为追求完美,只为平衡得失!

OpenWRT误删uhttpd服务配置导致LuCI管理页面无法访问问题

自己编译的OpenWRT固件带了uHTTPd的LuCI设置UI,在研究服务器映射时点了右上角的删除,并且应用了:

结果发现LuCI界面无法访问了,才意识到原来刚才删除的配置就是通过uhttpd支撑的LuCI管理页面的web服务器,重启了几次后发现路由器功能还是正常的,只是无法访问web管理,dropbear的ssh还是能正常连上的,本来都做好了重新刷机的准备了,后来查了下,发现下面论坛里说的方法:

https://forum.openwrt.org/t/cannot-access-luci-after-messing-with-settings/147903

通过执行下面的命令:

cp /rom/etc/config/uhttpd /etc/config/uhttpd

即可将默认uhttpd配置文件还原回来,然后重启uhttp服务:service uhttpd restart,或者直接重启路由器即可恢复管理页面,不需要刷机,快速救回LuCI管理页面。

Win下搭建CLion配合远程Linux的联盛德W801开发环境(csky-elfabiv2-tools)

之前9块钱促销买了块海凌科(Hi-Link)的W801开发板HLK-W801-KIT-V1.1:

到手后看了各种资料用CDK IDE搭起了开发环境,简单试了试灯,还踩了个Upgrade Tools上传程序的坑:W801开发板Upgrade Tools上传程序失败问题,那之后这块板就吃灰了😂,最近因为发现网口WOL网络唤醒在电脑完全断电恢复后无法使用的问题(试了自己和朋友的几台电脑,华硕的x370主板、技嘉的x570主板、公司的技嘉z390主板都不行,网上看有人说自己的电脑可以掉电后WOL,介绍的各种设置方法也基本都试了个遍,无果), 打算研究个IoT远程开机功能,嘉立创的开源平台上一搜能搜到很多,但大都基于ESP的MCU,于是又想起了这块W801…不过用惯了VS、Xcode、CLion的我对之前使用CDK的体验着实不怎么样,在联盛德的官方论坛上也看到有人基于VSCode搭建了开发环境,有win下配msys的,也有走远程linux编译的,由于本人实在是对cgywin,mingw这类windows下移植linux环境的工具不感兴趣,所以这回打算尝试下远程linux编译的方式再次搭建下W801的开发环境,同时使用最近经常用的CLion IDE(我用的Nova版,写此文的时候还处于EAP状态,已经进入RC状态了,下载2024.1 RC版(设置中高级里启用ReSharper 引擎,重启后就是Nova办了),但实际测试并没发现什么严重问题,理论上稳定版对远程linux开发支持应该也是一样的),另外,多说一句,虽然说的是remote linux,其实WSL,或者本地虚拟机也都是一个道理,那下面我就记录下这样搭环境的主要步骤。

Continue reading…

给退役的路由器联想y1s硬改升级64M闪存

自从去年10月换了红米AX6000后,服役快10年的y1s终于迎来了退役的日子,此后便一直待在盒子里吃灰…

直到前段时间逛恩山论坛时无意间看到了 1421890054 大佬的这篇帖子:【2022-1-22】折腾一下OpenWrt-Lenovo-newifi-y1s-R22.1.1-mt7620a-USB,意识到原来y1s是可以支持更大容量的闪存的(原配winbond 25Q128 16M,装完op后基本就装不了什么软件了…),于是又翻出了退休的y1s,准备也试着硬改升级下闪存玩玩。

Continue reading…

Systemd – Failed to reload daemon: Refusing to reload, not enough space available on /run/systemd

最近在配置一台128M内存运行debian 11系统的虚拟机时,遇到了修改systemd服务配置后reload时报错的情况,提示信息如标题所写,排查后发现debian系统安装后默认配置的/run空间大小是和系统内存数成比例的,而默认分配的16M空间,在执行“systemctl daemon-reload”时就会提示上面的错误信息,还会说明类似如下信息:

Currently, XX.XM are free, but a safety buffer of 16.0M is enforced.

解决的方法就是想办法加大这个/run就可以了,修改/etc/fstab,追加如下内容:

none /run tmpfs defaults,size=64M 0 0

这里指定了64M空间用于/run,按网上的说法这样应该可以应付绝大部分情况,之后执行:

mount -o remount /run

重新挂载/run,完成后可以用“df -hT”确认下当前/run的大小,增大后再次daemon-reload即可正常操作了。

VS 2022构建boost 1.57.0时的missing argument global-setup问题

最近要用到一个库,依赖boost,于是久违的下载了需求的最低版本1.57的boost拿来build一把,结果已开具就遇到了坑…

目前用的编译器是VS 2022的toolchain,于是打开x64 Native Tools命令行,进到boost源码路径,简单看了下说明,敲了“bootstrap.bat”,提示:

Building Boost.Build engine
cl: 命令行 warning D9035 :“GZ”选项已否决,并将在将来的版本中移除
cl: 命令行 warning D9036 :使用“RTC1”而不使用“GZ”
cl: 命令行 warning D9002 :忽略未知选项“/MLd”

Bootstrapping is done. To build, run:

    .\b2

To adjust configuration, edit 'project-config.jam'.
Further information:

    - Command line help:
    .\b2 --help

    - Getting started guide:
    http://boost.org/more/getting_started/windows.html

    - Boost.Build documentation:
    http://www.boost.org/boost-build2/doc/html/index.html
Continue reading…

关于spring框架使用websocket + stomp协议时的发消息顺序问题

还是继续上一篇stomp的问题,这次是在实际使用中又有了新发现,那就是java后端向前端发送stomp消息时,存在底层异步操作造成的消息顺序不确定性问题,如下:

    @Autowired
    SimpMessageSendingOperations messagingTemplate;

    @MessageMapping("/create")
    @SendToUser("/queue/reply")
    public ReplyDTO create(@Payload CreateDTO msg, SimpMessageHeaderAccessor accessor) throws Exception {
        String userId = getUserId(accessor);
        if (userId.isEmpty())
            return buildNotLoggedInReply(accessor);
        int createId = myService.create(userId, msg.getTypeName());
        CreateInfo ci = myService.info(createId);
        String infoStr = new ObjectMapper().writeValueAsString(ci);

        messagingTemplate.convertAndSendToUser(
                Objects.requireNonNull(accessor.getSessionId()),
                "/queue/response",
                buildOkResp(accessor),
                createHeaders(accessor.getSessionId())
        );

        return buildReply(accessor, infoStr);
    }
Continue reading…

cannot deserialize from Object value (no delegate- or property-based Creator)

最近研究springstomp协议框架,上到消息订阅、发送时一开始用的普通String,没有任何问题,都可以跑通,后来上DTO数据对象时,遇到了标题上的问题,查了下发现是框架层在调用jackson自动反序列化json为DTO对象时报的错,很久没用java,都忘记了,参考下面链接的说明

https://blog.csdn.net/weixin_39827145/article/details/89314433

意识到jackson反序列化时默认的行为是需要class的无参构造,之后再处理各个属性对应到json key的value,而出问题是的DTO class上用的lombok标记是“@AllArgsConstructor”,只生成了全成员变量参数构造,因此导致了此问题,把接收stomp请求,用于对应@Payload的class换成@NoArgsConstructor(当然,一般还要带上@Getter,用于成员变量的访问)后,问题解决,接收到stomp请求后,成功传递到了controller的对应处理方法中。小问题连带了一个小知识点,记录一下。

也记一篇关于strncpy和snprintf中n的不同之处

关于这俩c库函数的使用方法,百度上一搜能搜到很多,但是实际上用了这么多年的我有时候还是会犯迷糊,分不清哪个是处理0结尾的,哪个是没有的,因此今天趁着放假有时间,再整理记录一下。

#include <cstring>

int main(int argc, char *argv[])
{
    char sz_test1[10] = {};
    char sz_test2[10] = {};

    char sz_source[10] = "123456789";

    strncpy(sz_test1, sz_source, 10);
    snprintf(sz_test2, 10, "%s", sz_source);

    return 0;
}

上面是一段很简单的写在cpp里的c代码,纯c也差不多,主要说的是这俩c函数的区别,可以看到sz_source有9个字符,带1个结尾0凑成10字节的字符串,上面还有两个同样是10字节的char缓冲区用于测试,可以看到strncpysnprintf的n都给10的时候,sz_test1和sz_test2都是和sz_source一样的结果,包括结尾0。

接下来把两个函数的n都换成9,这时候可以看到如下结果:

Continue reading…

关于x265编码使用CBR流控码率不达标问题的处理

之前在使用x264编码时所谓的CBR流控其实是通过abr流控+vbv码率、缓冲参数设置的(vbv-maxrate,vbv-bufsize,也可以是ffmpeg的minrate,maxrate,如“ffmpeg -re -stream_loop -1 -i test.mp4 -c:v libx264 -x264-params “nal-hrd=cbr:force-cfr=1” -b:v 4M -minrate 4M -maxrate 4M -bufsize 1M -f flv rtmp://127.0.0.1/live/test,即控制了波动范围的vbr,而到了x265编码时,发现如法炮制的参数并不好使了,码率还是会有较大范围的波动,最后搜索研究了很久后发现,原来x265有这么个参数:

–[no-]strict-cbr Enable stricter conditions and tolerance for bitrate deviations in CBR mode. Default %s\n”, OPT(param->rc.bStrictCbr));

实测加上这个参数后,编码输出码率几乎就是目标码率很小范围内波动了,ffmpeg命令如下:

ffmpeg -re -stream_loop -1 -i <input> -c:v libx265 -b:v 25M -muxrate 30M -x265-params strict-cbr=1:vbv-bufsize=25000:vbv-maxrate=25000 -c:a aac -ac 2 -b:a 128k -f mpegts udp://239.3.3.3:5000

[转]将立创EDA中PCB元件封装转换为KiCad格式方法

最近在学习EDA,使用的是开源的KiCad,基本操作还是挺简单的,但是众多的电子元件符号、封装相比起来还是不如立创EDA这种web版生态完善的来的方便,好在网上找到了将立创EDAPCB元件封装导入KiCad的方法(拿来主义,哈哈),原文在这里:http://www.taodudu.cc/news/show-5505674.html?action=onClick,转过来记录一下:

在使用KiCad软件的时候,有些元器件的封装没用合适的,需要自己画。但是自己画起来比较麻烦,这时候就可以直接去立创EDA软件中下载。
  首先登陆立创网页版的EDA,网址:https://pro.lceda.cn/ 进入标准版。

Continue reading…