0%

Wireshark 很强大,比你想象中的还要厉害。

强烈推荐《Wireshark网络分析就这么简单》和《Wireshark网络分析的艺术》,作者林沛满。

以下内容并非读书笔记。书是两年前读的了。

抓包过滤字节

tcpdump 和 Wireshark 过滤字节的语法存在差异:

1
2
3
4
5
# capture filter / 含 8 字节头部 
tcpdump udp[36:2]=0xb301
# Wireshark display filter
udp.payload[28:2]== b301
#udp.payload[28:2]== 0xb301 # error

多思考一步,这个差异从哪来的?

  • 命令行使用 tcpdump 是在抓取报文时过滤的;
  • 图形界面使用 Wireshark 存在“捕获过滤器”和“显示过滤器”,
  • 使用 Wireshark 查看已捕获的报文时只用到后者;

两者捕获报文时的过滤语法其实一致: man pcap-filter

Wireshark “显示过滤器”的语法: man wireshark-filter

阅读全文 »

PostGIS 是一个开源程序,它为对象-关系型数据库 PostgreSQL 提供了存储空间地理数据的支持,

使 PostgreSQL 成为了一个空间数据库,能够进行空间数据管理、数量测量与几何拓扑分析。

下载 PostgreSQL ,选择 历史版本 15.13

安装过程中密码使用 123456 ,端口使用默认端口 5432

如果有互联网可以在安装结束时使用 Stack Builder 安装 PostGIS3.5 ;

如果是在没有互联网的环境可以下载 单独的安装包 自行安装。

前者下载的文件和独立下载的 postgis-bundle-pg15x64-setup-3.5.3-2.exe 为同一文件,MD5 检验码相同。

使用

安装完毕后,根据 使用手册 我们需要在数据库中执行 CREATE EXTENSION postgis; 启用插件。

使用 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.
阅读全文 »