0%

使用 http 协议上传文件的协议细节和实现。

使用 curl 上传

调试 Swagger API 时一般会使用 postman 工具,但可以有更加短平快的手段、工具满足我们轻量的调试需求。

curl ,linux 平台下常用,或者 windows 平台下 git bash 中也带有 curl 命令。

1
2
3
4
5
6
7
 -X, --request <method>      Specify request method to use 
-d, --data <data> HTTP POST data
-H, --header <header/@file> Pass custom header(s) to server
-v, --verbose Make the operation more talkative
-F, --form <name=content> Specify multipart MIME data
To force the 'content' part to be a file, prefix the filename with an @ sign.
@ makes a file get attached in the post as a file upload, ...

使用上述参数,实际演练一下:使用 -d-F 参数时,curl 能够自行推断出要使用 POST 方法

阅读全文 »

LLM

如何更新 Ollama 呢?

How can I specify the context window size?

其中的“上下文窗口”是什么概念?上下文是什么概念?

prompt 提示词又会带来什么?

Ollama 会动态地加载(或卸载)其中的大语言模型,DeepSeek 等大模型并非一直在运行的。

AnythingLLM

参考其 github 的 README 文件

这个单库由三个主要部分组成:frontend / server / collector

通过 yarn 分别启动三个服务时,端口占用 3000 / 3001 / 8888 ,可以通过 nmap 扫描到这三个端口。

阅读全文 »

不建议从源码构建!除非你没 其他办法

构建费事费力,需要踩过很多坑才能得到一个勉强能用的版本。

必要性

如果要在不联网的设备上使用新版本 Qt ,还是需要掌握如何编译 Qt 源码!

断点调试:之前想断点进 Qt 源码调试一直没成功,借这次机会一并实现。

Qt 4.8.7

Qt4.8.7 安装包,自带源码和 pdb 调试文件,结合 MSVC2010 断点调试理解源码。

比查看、学习 Qt5.x 的源码方便很多:但这个版本终究是太老了,

  1. Qt5.15.x 没有离线安装包
  2. Qt5.12.x 虽然有离线安装包,但没有 pdb 调试文件
  3. 单独下载 pdb 文件后与源码版本不一致,断点位置偏移

使用 Qt Creator 默认的模板创建项目,调试时提示“调试器未设置”,所以使用 MSVC2010 。

安装 qt-vs-addin-1.2.5.exe

构建过程

参考 Building from Source ,需要 Perl / Python / MSVC ,其他章节跳过不用看。

参考 Qt for Windows - Building from Source ,5 个步骤,按部就班做就可以:

Step1 不需要商业许可

Step2 使用 qt-everywhere-src-5.15.x

阅读全文 »

QUdpSocket

使用上存在几个注意事项,当其结果不符合预期时看看这里有没有记录。

QUdpSocket::readyRead()

记录一个关于 信号的 bug ,有数据到达但此信号不再 emit :官方相似 bug 描述

其内部实现依赖 hasPendingData 标志位判断是否发出信号(并调用关联的槽函数) ,但此标志位容易出错, Qt 将此标志位的复位操作交给了用户:

Note: An incoming datagram should be read when you receive the readyRead() signal, otherwise this signal will not be emitted for the next datagram.

阅读全文 »

开发 Qt 软件过程中发现折线图(Qt Charts 二维折线图)显示不全、圆环刻度值(QPainter 自绘)显示异常。

上述问题和程序运行时使用的 Qt 版本有关,但和编译时使用的 Qt 版本无关:

  • 项目源码是在 Qt 5.13.2 下构建开发的,未针对 5.12.12 做适配
  • 但使用 Qt 5.12.12 也能够编译成功;
  • 运行时必须使用 Qt 5.13.2 ,如果运行时使用 5.12.12 就会出现上述现象。

使用 Qt 5.13.2 构建的可执行文件,运行时库如果使用 5.12.12 会启动失败,报错:
undefined symbol: qt_resourceFeatureZlib, version Qt_5

在 Qt Creator 中运行、调试项目时,使用的 Qt 版本一般和编译期的版本一致,但我们可以打破这种一致性:

  • 编译时,关闭 QT.global.enabled_features = rpath 特性:此特性在 5.12.12 中默认关闭;在 5.13.2 中默认开启。
  • 运行时,修改 LD_LIBRARY_PATH 使找到的 Qt 运行时库和编译时的库版本不一致

在设备上部署软件后,如何约束运行时使用的 Qt 版本(以及第三方库):

  • 通过 -rpath 特性约束,要求设备上存在对应的目录
  • 通过 LD_LIBRARY_PATH 环境变量约束

可以使用 readelf -d a.out 查看可执行文件是否指定了运行时库的查找路径。

阅读全文 »

搭建 Qt 开发环境的几种方式:

  • Qt 官方下载页面 支持 ≤5.12.12 、x86 架构的离线安装包(Windows/Linux/Mac );
  • 比 5.12.12 更新只有在线安装包;Qt 目前已经支持 ARM 架构,但只有在线安装包;
  • Qt 从源码构建安装,费时费力还容易出错。我还没掌握
  • Qt 在 Linux 还可以通过各系统的软件仓库安装,版本陈旧,也需要联网

使用在线安装工具,默认只展示最新的三个 Qt 版本供用户安装。右侧筛选项,勾选 Archive 后筛选就会列出旧版本的 Qt 。

阅读全文 »

在 Qt 中虽然存在 QTimeZone 类型,但其官方手册中多次强调了用户不应直接使用 QTimeZone ,而是结合 Qt::TimeSpec 枚举值使用 QDateTime

This class is primarily designed for use in QDateTime; most applications will not need to access this class directly and should instead use QDateTime with a Qt::TimeSpec of Qt::TimeZone.

If you require a QDateTime that uses the current system time zone at any given moment then you should use a Qt::TimeSpec of Qt::LocalTime.

Time Zone Offsets 时差

The total offset is comprised of two component parts, the standard time offset and the daylight-saving time offset. 夏时制

阅读全文 »

在 Qt Creator 如何运行终端程序呢?

在项目的 Build & Run 配置中,勾选 Run in terminal 即可。

选中 Run in terminal 之前,应用程序 Run in 哪里呢?

通过 Windows 任务管理器查看,勾选后作为 qtcreator_process_stub.exe (和 Qt Creator 进程同级别)的子进程运行,没有勾选的话作为 Qt Creator 的子进程运行。

Qt 的日志框架

最常用的函数: qDebug(const char *message, ...)

Calls the message handler with the debug message message.

  • If no message handler has been installed, the message is printed to stderr.
  • Under Windows the message is sent to the console, if it is a console application; otherwise, it is sent to the debugger.
  • On QNX, the message is sent to slogger2.
  • This function does nothing if QT_NO_DEBUG_OUTPUT was defined during compilation.
阅读全文 »

我们在谈到“串口”的时候,往往还会提到 RS-232 、RS-485 等等,它们之间的关系是什么?

串行端口 的概念,是和 并行端口 相对的。串口一次只传输 1bit ,但并行端口会同时传输多个 bit 。

通信,传输字符/字节。

历史上字节长度曾基于硬件为 1-48 bit不等,最初通常使用6 bit 或9 bit 为一字节。今日标准以 8 bit 作为一字节。

虽然以太网、FireWire 和 USB 等接口也以串行流的形式发送数据,但术语 串行端口 通常表示符合 RS-232 或相关标准(如 RS-485 或 RS-422)的硬件。

我们可能会用到 232 串口线、或者 422 串口线连接两个设备,但使用 Qt serial port 模块写软件不用考虑使用了哪种串口线,只需要关注收发两端的波特率、校验位、停止位等一致。

The most well-known options are

  • speed,
  • number of data bits per character,
  • parity, and
  • number of stop bits per character.

UART

UART(通用异步收发传输器,Universal Asynchronous Receiver/Transmitter)是一种常见的串行、异步、全双工通信协议。它通过 TX(发送)和 RX(接收)两根信号线,在设备间以一位接一位(bit-by-bit)的方式传输数据,广泛应用于嵌入式系统和计算机串口通信。

硬件

RS-232 是美国电子工业联盟制定的串行数据通信的接口标准,它广泛用于计算机串行接口外设连接。

它规定连接电缆和机械、电气特性、信号功能及发送过程。其他常用电气标准还有 RS-422-A、RS-423A、RS-485。

出于节省资金和空间的考虑,25 个管脚的 DB-25 连接器已经不常见,9 个管脚的 DB-9(技术名称 DE-9) 型连接器被广泛使用。RS-232 中 DB-9 型连接器的信号和管脚分配:2-收,3-发,5-接地。

阅读全文 »

从桌面开发突然进入 VxWorks 嵌入式开发,有几个认知上的调整:

  1. 桌面开发的时候,驱动、操作系统和 IDE 之后,我们才开始新建项目、编写代码;
  2. 嵌入式开发,从板级支持包、系统镜像就需要新建对应的项目了。
  3. 理解嵌入式系统可裁剪,镜像大概率并不支持那些在桌面操作系统上常见的指令、服务和开发所需的库,需要有针对性的一个一个配置相应的驱动、组件。

Das U-Boot

加载桌面操作系统之前的引导阶段,按下任意键进入 BIOS。与之类似,我们在板子引导程序读秒期间(使用串口调试工具)发送任意键能够进入 uboot,使用 printenv 等命令查看状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看版本
version
# 获取帮助
help
?
# 打印环境变量
printenv
# 查询 FAT 格式设备的目录和文件信息
fatls scsi 0:8
fatls scsi 0:1
# bootcmd 自动启动时执行命令
setenv bootcmd "fatload scsi 0:1 0x90100000 Ft2004.elf; bootvx32 0x90100000;"
saveenv
# 查看日期时间
date
# 查看帮助
help date

# 更多
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
阅读全文 »