Browsed by
Category: 计算机技术

QSystemTrayIcon 不响应双击事件

QSystemTrayIcon 不响应双击事件

QSystemTrayIcon 产生的图标显示在 Linux XFCE4 系统的顶部状态条上,但是双击没有反应。检查程序没有发现问题,判断了 QSystemTrayIcon::DoubleClick 事件。在以前的 Linux 系统中没有这个问题,不知道是新 Linux 导致的,还是 XFCE4 导致的。

调试发现无论是双击还是单击,QSystemTrayIcon 捕获的事件总是 QSystemTrayIcon::Trigger,也就是说实际上无法区分单击还是双击。修改方法也简单,同时检查QSystemTrayIcon::Trigger 以及 QSystemTrayIcon::DoubleClick 事件即可。

在调试过程中遇到了另一个问题。手贱,update & upgrade 系统,结果 XFCE4 桌面变成黑色、应用程序窗体没有边框、顶部状态栏没了…… 搜索了一些信息,大概是 window 管理进程异常,简单重启系统无法解决。需要重启桌面:

xfwm4 --replace

另外,点击菜单“所有应用程序 – 设置 – 设置管理器 – 会话和启动”,再点击“当前会话”,选择 xfwm4 然后点击按钮“保存会话”即可。

Error: “此流的格式错误。”

Error: “此流的格式错误。”

最近在移植 miniSIPPhone 到 Linux 系统时,遇到一个奇怪的错误:播放 wav 语音文件时提示“此流的格式错误”,无论是采用 QSound 还是 QMediaPlayer 播放 wav 文件都出现了这个错误。按照我们一贯以来的要求,miniSIPServer 和 miniSIPPhone 的语音文件都采用了同样的格式:

CCITT A-Law, 8KHZ, 8Bit, 7KB/sec, 单通道

换用 VLC 播放没有任何问题,在 Windows 系统上播放也没有任何问题。考虑到 Qt 在 Linux 系统上实际是调用 GStreamer 的 plugins 来解码和播放各种语音格式,而我们的录制格式是如此的普通和平平无奇,实在想不通为什么会出现格式错误。

遍历了各种可能原因后忽然想到,或许 GStreamer 默认不支持 A-Law?这个格式在通信领域用得比较多,而一般语音播放、音乐等软件可能不太会关注这种格式。将语音文件格式转换成以下格式:

CCITT PCM, 8KHZ, 8Bit, 7KB/sec, 单通道

然后果然成功了,miniSIPPhone 在 Linux 平台也可以正常播放各种提示音。

Firefox 的奇怪逻辑

Firefox 的奇怪逻辑

在 Firefox 的设置中,关于硬件加速的配置有点奇怪,如下图所示:

如果勾选了“Use recommended performance settings”,就会隐藏其下面的“Use hardware acceleration when available”选项。按常理推断,此时 Firefox 应自动判断 GPU 的情况决定是否采用硬件加速。我的电脑 CPU 是 AMD Ryzen 5 Pro,内置 GPU,这是款比较旧的 APU,理论上来说 Firefox 应该可以识别并用于加速,但实际上并没有采用 GPU 进行加速。

相反,去掉“Use recommended performance settings”选项,直接勾选“Use hardware acceleration when available”(正如截图所示)并重启 Firefox 后,能正常使用 GPU 加速,Firefox 变得更加流畅,尤其是打开图像、视频比较多的网页或者网站时,效果非常明显。

感觉“Use recommended performance settings”默认还是采用 CPU 进行处理,并没有引入 GPU 进行综合的判断。

Debian 系统中安装 Rust

Debian 系统中安装 Rust

可以按照 Rust 官网的介绍,下载 rustup 进行安装。也可以直接使用 apt 安装,一条命令足以:

sudo apt install rust-all

该命令会将 cargo、rustc 等全装好。

could not find a Qt installation of ”

could not find a Qt installation of ”

最近重新搭建了一套 Debian 系统的开发环境,使用 qmake 编译 pro 文件时,提示了标题中的错误。检查qmake 文件,发现以下信息:

 /usr/bin/qmake -> qtchooser

这是因为系统提供了两套 Qt 开发环境,比如 Qt6 和 Qt5 等,因此需要指定默认采用哪一套。网络上的解决方案大多数比较粗暴,手工修改 /usr/bin/qmake 的文件链接,链接到真实的 qmake 文件即可。

但实际上系统提供了更简单的方式,比如我们默认采用 Qt5 的开发环境,则使用以下命令:

sudo apt install qt5-default
curl

curl

最近在开发和测试对 TLSv1.3 的支持,过程颇为困扰,主要有两个问题:(1)测试服务器采用自签名证书,某些终端程序无法跳过对服务器证书的验证步骤,因此实际无法在实验环境进行测试;(2)开发过程中,我们希望了解协议交互的每个步骤的细节,而绝大部分工具默认并不提供足够详细的输出信息,增加了开发过程中的困难。

直到我们使用了 curl,这个工具实在太棒了!

如果需要输出详细信息,则使用“-v”参数。

如果需要跳过证书验证,则使用“-k”参数。

比如,我们测试 HTTPd(IP地址为 192.168.3.2),直接使用以下命令即可:

curl -v -k "https://192.168.3.2"
Postfix 采用 TLS 传输

Postfix 采用 TLS 传输

采用 postfix 发送邮件,默认没有采用 TLS 加密传输,对方的服务器有可能会提示告警(例如 gmail)。另外,邮件传输采用明文,如果不加密,也存在被人窥视的风险。因此建议修改 postfix 的配置,默认采用 TLS 加密。当然,这需要对方的服务器也支持加密,目前绝大多数邮件服务器都支持 TLS 传输。

修改 /etc/postfix/main.cf 文件,增加以下一行配置即可:

smtp_tls_security_level = may

修改了配置文件,使用命令重启 postfix:

sudo systemctl restart postfix
树莓派(Raspberry Pi OS)搭建 samba 服务

树莓派(Raspberry Pi OS)搭建 samba 服务

最近重新搭建了一套树莓派的系统(Bullseye,arm64),将老系统的移动硬盘挂载在新系统,然后启用 samba 服务作为一个简易的 NAS 使用 。过程非常简单,不过与以前老系统搭建时有一点差别,简要记录一下以备以后查阅。

Pi 挂载了移动硬盘两个分区:(1)/media/pi/uwork;以及(2)/media/pi/udoc,将分别对应在 samba 中配置的两个访问目录:(1)/raspberrypi/hdd_work,以及(2)/raspberrypi/hdd_docs。

安装 samba

直接 apt 安装即可:

sudo apt install samba

配置

默认用户是 pi,系统虽然已经有这个用户了,但是 samba 中还是需要单独创建一个 pi 用户:

sudo smbpasswd -a pi

建议访问密码设置成和系统登录密码一样即可。然后修改 /etc/samba/smb.conf 文件,增加以下片段:

[hdd_work]
comment = work directory
path = /media/pi/uwork
browseable = yes
writable = yes
create mask = 0777
directory mask = 0777
valid users = pi

[hdd_docs]
comment = document directory
path = /media/pi/udoc
browseable = yes
writable = yes
create mask = 0777
direcory mask = 0777
valid users = pi

启动(重启) samba 服务

sudo systemctl restart smbd

查询 samba 的状态:

sudo systemctl status smbd
parseInt

parseInt

云通信系统的用户偶尔向我们反馈,分机的状态显示总是离线状态。我们从后台检查状态是正确的,检查其他用户的分机状态也都很正常,但是这位用户查询的结果确实总是离线状态。这事颇有些蹊跷,引起了我很大的兴趣去研究发生了什么。

检查之后的结果也很简单。后台返回的状态数据是字符串形式,而前端 javascript 脚本是按照整数进行判断,自然无法正常显示状态。但是为什么有些又能正确显示呢?

进一步检查后发现这与 MySQL 数据库的版本有关。我们的云系统有很多服务器,都是采用 Debian 的系统,同时也是采用 Debian 默认自带的数据库。旧 Debian 系统中的 MySQL 数据库版本比较陈旧,返回查询结果时都是采用字符串格式,哪怕字段是整数类型,返回的结果也是转换成字符串。而新的 Debian 系统已经将默认的数据库替换成 MariaDB,返回结果时严格遵循字段的类型,不会进行这类转换。

用户的虚拟通信系统部署在不同的 Debian 节点上,返回查询结果时就存在上述转换方面的差异。

解决方式自然也不复杂。可以从服务器端解决,也可以从前端解决。服务器端升级 Debian 系统就会同时将数据库升级到 MariaDB,自然就能返回整数类型的结果。当然也可以从 PHP (包括 pdo层)解决,由 PHP 对查询结果强制进行转换,将字符串又转换成整数即可。但是出于稳定性方面的考虑,我们一般不太愿意直接升级服务器系统(包括 PHP 等中间层),各节点的升级总是按年制定计划,不太可能为了这样一个小问题兴师动众地升级系统。

因此最后的解决方案就是对前端 JavaScript 脚本做一点修改。JS 提供了 parseInt 函数进行转换(如果是浮点数就是 parseFloat),无论服务器返回的是字符串还是整数,经转换后都可以按照整数进行判断。

此事反映出(1)我们对web、数据库等方面的技术技能比较欠缺,缺乏足够理解;(2)测试范围不够广泛,没有涵盖所有的用户类型;(3)系统配置不够一致,存在新旧并存的现象。我个人觉得后续工作要着力解决第(3)点的情况,尽量做到(包括开发、测试、线上)只有一个版本、只有一种系统。

Windows 10 启动慢

Windows 10 启动慢

小孩用一台 ThinkPad 笔记本上网课,最近发现启动很慢,启动阶段往往耗时将近 3 分钟。这台笔记本是我以前开发工作的笔记本,已经升级了 SSD 硬盘、加装了 16G 内存,似乎不应该这么慢。

孩子反映以前也很快,只是最近才变慢,因此怀疑是某次 windows 升级后(当然也不排除小孩误操作)改动了设置。在网络上搜索了一下,检查启动配置后发现被设置为“正常启动”,修改为“有选择地启动”后,启动时间缩短到十几秒。

修改方式很简单,如下:(1)按键 Win+R 后,输入 msconfig,启动管理界面。(2)设置为“有选择的启动”。

配置“有选择的启动”
有选择的启动