自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 C语言开发:Onvif(一)

摘要: ONVIF是一个开放的安防行业标准组织,旨在通过Web Service接口实现IP安防设备的互操作性。本文介绍了使用C语言与ONVIF摄像机交互的方法: 工具链:采用gsoap工具包自动生成Web Service接口代码; 实现步骤: 安装gsoap开发包; 从ONVIF官网获取设备的XSD/WSDL定义文件; 使用wsdl2h生成头文件,soapcpp2生成C语言实现代码

2025-06-27 20:30:00 573

原创 Rust使用tokio(二)HTTPS相关

本文介绍了Rust中HTTPS客户端和服务端开发的相关技术。在客户端方面,主要讲解了reqwest库的使用,包括如何配置TLS证书、处理证书验证以及实现GET/POST请求。服务端部分则涵盖了hyper框架的基础使用,以及通过hyper-rustls实现HTTPS服务的方法。文章还详细说明了使用OpenSSL工具生成测试证书的步骤,并展示了Rust中解析P12证书文件的代码示例。这些内容为开发安全的HTTP通信提供了完整的技术方案。

2025-06-20 21:15:00 401

原创 Emacs定制:文件管理dired

本文介绍了Emacs中dired模式的优化配置。主要使用了dired-rainbow、dired-efap、dired-filter和dired-async等扩展包,实现了以下功能:1) 文件分类显示不同颜色;2) 便捷的文件名编辑;3) 文件过滤和异步操作;4) 音视频文件快速播放(支持mplayer和vlc播放器);5) 图片预览功能;6) 目录清理操作。配置还包括优化dired的显示格式、设置递归删除选项等,通过快捷键绑定提供流畅的文件管理体验。

2025-06-13 20:30:00 335

原创 Emacs定制:编译

摘要:本文介绍如何从零开始精简Emacs配置文件,重点整理编译代码相关的配置项。内容包括自定义编译命令窗口调整、复用编译窗口、ansi-color颜色显示、编译结果通知、错误跳转等功能实现,以及CMake模式关联和快捷键绑定。作者强调只保留必要功能,去除冗余配置,以优化Emacs使用体验。配置主要参考purcell等网友方案,并加入少量自定义内容。(150字)

2025-06-06 21:30:00 473

原创 C语言操作Kafka

本文介绍了如何快速搭建Kafka测试环境及使用C语言库librdkafka操作Kafka服务。首先通过下载Kafka二进制包,创建集群并启动服务,演示了主题创建、消息生产和消费的基本操作。随后重点讲解了librdkafka库的使用,包括核心结构体rd_kafka_t和rd_kafka_conf_t的创建与配置,证书设置方法,以及关键消息结构rd_kafka_message_t的处理。文章还提供了生产者APIrd_kafka_produce的使用说明,强调了消息处理回调函数中错误检查的重要性。

2025-05-30 20:30:00 543 1

原创 Python邮件处理:POP与SMTP

poplib是Python 3中用于收取邮件的官方库,遵循POP3协议(RFC1939)。使用poplib的基本步骤包括创建POP3或POP3_SSL实例、设置认证、获取邮件列表、收取邮件以及可选地删除邮件。调试时可通过set_debuglevel方法查看报文交互。

2025-05-23 21:30:00 898

原创 C语言编程中的时间处理

在C语言编程中,处理时间的函数各有特点。time函数是最简单的,返回自1970年1月1日以来的秒数,但其精度较低,只能到秒。gettimeofday和settimeofday提供了更高的精度,能够处理到微秒级别,但timezone结构已经过时,建议将tz设为NULL。在Windows环境中,GetLocalTime和SetLocalTime函数用于获取和设置本地时间,返回的时间结构包含年、月、日、时、分、秒和毫秒信息

2025-05-16 21:31:55 889

原创 Rust中记录日志:fast_log

在Rust程序中记录日志,可以使用`fast_log`。根据[fast_log](https://github.com/rbatis/fast_log) 的介绍,这是一个性能非常高的日志实现,还支持文件追加模式、压缩、切分与回滚等操作。而且,这个库记录日志是异步的,即不会因为日志而影响程序的运行。只有当必要的时候,才需要应用层手动调用`log::logger().flush()`刷到文件。

2025-05-09 20:15:00 991

原创 Linux的多进程开发与信号处理

其中,prepare是fork之前执行的回调函数,parent是fork之后父进程执行的函数,child是fork之后子进程执行的函数。比如以下代码,实现了在fork之前屏蔽掉信号处理,fork之后再恢复,避免在fork过程中因为信号处理而出现异常。但是,如果我们希望父进程退出的时候,子进程也一并退出,可以使用prctl函数,注册一个父进程中止时的信号。在Linux系统中,使用fork创建子进程,是简单方便地进行多进程开发的方法。返回值为子进程的pid。,可以在创建子进程的之前、之后,执行自定义的函数。

2025-04-25 20:45:00 609

原创 sqlite3的API以及命令行

sqlite是目前最流行的嵌入式数据库。所谓嵌入式,就是足够简单,可以嵌入到我们自己开发的应用程序之中。在Linux系统中,sqlite的使用只需要使用它的API,连接它的动态连接库,甚至都不用连接,sqlite的实现只使用一个C语言源程序,直接编译进自己的应用里面就好。现在sqlite的最新版本是3,所以我们后面会以这个版本为例。

2025-04-18 20:30:00 1311

原创 libnfs的nfs_read、nfs_write的API兼容性

既然知道了高版本的libnfs的API和低版本的不同,那么就简单了,看一下libnfs从什么版本开始的这个变化,之后在代码里面,进行条件编译就行了。最后,在项目的CMakeLists.txt里面,判断一下libnfs的版本,如果大于等于6,就定义一个变量。于是,只好采用另外一个办法,看看上面提到的README的变更历史,能不能顺藤摸瓜,找到一些信息。首先,libnfs.h文件里,并没有相应的宏或者注释,说明了这个变化的详细信息。没有办法,我们只好从libnfs的源码中,检出它的所有版本。

2025-04-14 15:33:24 393

原创 Django的定制以及admin

Django是一个全面的Python Web开发框架,具有丰富的功能,和众多开箱即用的接口。

2025-04-11 20:15:00 806 1

原创 Django里面的AppConfig的ready()为什么被执行两次

为了在Django应用中,执行一些初始化,我们有时候会重载AppConfig的ready()方法。这是因为,方法中,会依次调用每个应用的ready()方法。但是,如果我们使用来执行的时候,却会发现我们的ready()方法,会被执行两次。使用其它方法执行,比如在wsgi中,却没有这种现象。这是什么原因呢?我们先看一下的实现,之后看一下的执行流程,就明白了。

2025-04-03 20:45:00 476

原创 使用git-lfs管理大文件

当我们使用git管理文件版本的时候,经常会有一些比较大的文件,比如一些模型文件,或者备份的文档资料等,这些文件属于如果太大,就会给git的管理带来困难。所以,对于这种大文件,一般我们就会采用lfs工具,来单独管理这种文件。

2025-03-28 20:45:00 821

原创 前端开发:Vue以及Vue的路由

作为一个底层老程序员,比如经常写驱动或者内核的,再不济也像我这样整天跟Epoll、Socket打交道的老家伙,可能对Vue的那一大套东西,有点儿陌生。甚至,可能会有点儿疑惑,有Java、PHP、Python、go、Rust等一大票后端语言,有HTTP协议交换数据,有HTML负责显示,有CSS渲染参数,还有JavaScript在浏览器里动态执行,还要Vue这种东西干什么呢?按照我的理解就是,虽然以上这些技术已经足够完成Web开发了,但是对于纯前端来说,工程化的程度并不够。

2025-03-21 20:15:00 956

原创 Qt开发:QtWebEngine中操作选择文本

QWebEngine并没有直接的方法,来取得一段文本的位置,但是QWebEnginePage有一个runJavaScript()方法,所以我们可以通过执行一些JavaScript,来间接地取得这些信息。能够通过选择取得位置,反过来就可以通过位置,进行选择。选中的方法,是新建一个DocumentFragment,把不需要选择的文本,与选择的文本作为子节点加入,之后替换原来的节点为新建的DocumetFragment。选择的时候,需要根据上一步的全局偏移量,对整个页面的DOM进行遍历,找到相应的节点偏移量。

2025-03-14 22:27:15 1078

原创 Qt开发:QWebEnginePage执行自定义JavaScript

在QWebEnginePage中,每次调用runJavaScript都是在一个独立的上下文中执行的,函数定义不会持久化到全局的作用域中。即,当我们调用了runJavaScript以后,当前的JavaScript脚本只是被执行去了,后续的代码继续执行,当JavaScript执行完成以后,回调函数里的代码再被执行。比如如下代码,我们需要使用JavaScript获取选择的偏移量,进而进行后续的处理,就会发现每次记录begin和end的值都是-1。

2025-03-08 09:15:45 401

原创 几行代码,用本地大模型,随心所欲地生成照片

我们经常看见,生成出来了,唰一下,没看清,又返回生成失败了。但是,对于提示词,以及生成的内容,这些平台却无一例外地都加了很多很多层的限制。

2025-03-01 17:17:54 564

原创 Rust使用tokio(一)

tokio中的task,是tokio核心调度的基本单位,位于操作系统线程之上,所以又被称为绿色线程,类似于Go语言中的goroutines、Kotline里面的coroutines或者Erlang里的processes。task是轻量的,非阻塞的,当遇到系统IO等阻塞事件时,tokio会切换到其它的task执行。

2025-01-24 19:45:00 471

原创 Rust的ORM框架:rbatis

如果要进行自定义,可以使用宏的参数。比如,UserInfo的数据库表不是user_info,而是hello_user_info,则可以使用把数据库表绑定到了宏的参数。

2025-01-17 20:30:00 1245 2

原创 Mybatis的简单使用

当我们需要把数据库记录,映射为Java对象的时候,mybatis是一个很方便的工具。之后,就可以在项目中灵活地使用mybatis映射出来的对象了。

2025-01-10 22:00:00 2775

原创 Java基本数据类型与字节数组的相互转换

比如,我们如果要把基本类型转成byte[],可以先按照每种类型的大小,创建一个ByteBuffer,然后设置值之后,返回它的arrry,即byte[]。虽然,比较新的Java有unsafe实现,但是unsafe也只能对对象的属性,进行偏移量级别的读写,仍然没法对底层的数据进行操作。ByteBuffer是方便做io的缓冲区读写的,我们可以使用它的读写基本类型的接口,来完成byte[]的操作。上面两种转换方法,都引入了中间对象,有了对象创建与释放的开销,如果追求高性能,还是直接转化比较简单直接。

2025-01-03 20:15:00 484

原创 使用cmark解析Markdown文档

如果在C或者C++项目中解析Markdown,可以使用库cmark。

2024-12-27 18:45:00 1172

原创 音视频开发:分析一个Gstreamer的插件的Segment Fault

最近的项目中,使用了Gstreamer的rtmpsink来推送RTMP到流媒体服务器,但是总是遇到奇怪的段错误,读了一下rtmpsink的源码。发现虽然有问题,但是可能会有编码上的问题,但是还不至于有段错误。于是,觉得有可能是rtmpsink使用的librtmp库的问题。

2024-12-20 19:30:00 458

原创 Debedium如何忽略Oracle的purge命令

如果我们确保这个指令我们不需要解析的话,可以不可以直接忽略,而不是停止呢?即把选项schema.history.internal.skip.unparseable.ddl,默认值为false,开启就为true就可以了。

2024-12-13 21:00:00 594

原创 Oracle数据库小白备忘

Oracle的权限角色很多,其中CONNECT和RESOURCE是对数据库进行增删改查的角色,SELECT_CATALOG_ROLE可以查询一些数据库的配置信息。如果使用Debezium获取数据库的变更,用户除了要有CONNECT、RESOURCE角色以外,还需要有对数据库配置信息以及logminer相关的一些角色。

2024-12-06 20:15:00 797

原创 使用Debezium的API实时获取Oracle的变更

现在最新的DebeziumEngine叫做AsyncDebeziumEngine,相比过去的老Engine,它多了很多功能,比如可以支持并发处理。其中,notifying就是注册的回调函数,这里示例用了一个匿名函数,还可以写一个handleBatch的,同样是使用notifying构建进去。

2024-11-29 19:45:00 1792

原创 如何使用tesseract的C++接口做字符识别

要从图片中识别字符,可以使用tesseract库。如果使用Python,可以直接使用安装之后,就可以在Python中来使用了。如果我们在C++的开发中,要使用tesseract,其实也非常简单。

2024-11-22 19:45:00 1176

原创 如何在Debian系统里使用Redhat(CentOS)的方式配置网络

对于习惯了 Redhat 族系统的用户来说,使用/etc/sysconfig/network-scripts 已经非常习惯,猛然切换到 Debian 会有些不适应。如何才能在Debian族系统中,使用Redhat中的方法配置网络呢?

2024-11-15 20:30:00 726

原创 转化古老的Eclipse项目为使用gradle构建

flatDir {很多老的Java项目,直接把Jar放入了WebRoot/WEB-INF/lib中,这里也支持了这种jar的寻找。接下来,就可以按照.classpath,把使用的jar依赖加入build.gradle。……上面使用了两种jar。第一种是从前面定义的库里下载。第二种是直接指定了文件路径,可以解决需要的库名+版本与文件名不一致的问题。

2024-11-08 17:24:14 1062

原创 C++的filesystem的时间与Qt的QDateTime时间为什么相差204年?

最近,在一个使用了Qt6的C++项目中,发现了一个奇怪的现象。

2024-11-01 18:30:00 688

原创 cargo编译时Rust时如何自定义输出目录

我们使用cargo构建Rust程序时,默认会在源代码根目录的target目录里,生成输出文件,以及编译依赖的包。有时候,我们需要把源代码与输出分开存放。可不可以把target定位在源代码目录外面呢?当然可以。

2024-10-25 16:51:52 983

原创 Rust命令行参数解析:使用clap

如果使用的是比较新的clap,如4.5.20,则会发现已没有clap::App这个结构,取而代之的是clap::Command,而且clap::Arg的构造方法也有了变化。

2024-10-18 18:30:00 1754

原创 如何在C++代码中兼容不同的API

如果我们的目的是在CMake配置过程中检测某个函数是否支持特定的参数(比如,检测库版本或编译选项导致的API差异),可以编写一个小的测试程序,然后在CMake中使用check_c_source_compiles等命令来编译并运行这个测试程序,从而间接推断出函数参数的合法性。

2024-10-11 19:45:00 635

原创 使用pipenv来管理Python项目的依赖

一个Python项目,依赖的模块甚至Python解释器版本,总是存在依赖关系。虽然有virtualenv或者venv模块来创建虚拟的Python环境,但是不同的项目要创建不同的环境,仍然不是很方便。还好,requests的作者,写了pipenv这个“更人性化”的工具。使用pipenv来管理项目的虚拟环境,非常简单。

2024-10-03 15:15:00 338

原创 如何在C++中使用Poppler库读取PDF文件(二)

在Poppler里面,链接的类是Poppler::Link,是一个基类,它派生了LinkGoto、LinkExecute、LinkBrowse、LinkAction、LinkSound、LinkMovie等各种具体的子类。

2024-09-27 19:45:00 1405 2

原创 如何在C++中使用Poppler库读取PDF文件(一)

如果只是读取、渲染pdf文件,除了mupdf以外,在Linux系统中还可以使用Poppler库。Poppler的历史非常古老,X窗口系统中的pdf查看工具xpdf,使用的就是poppler。Poppler在Linux各发行版,以及BSD族系统之中,都有现成的二进制安装包。

2024-09-20 19:45:00 1847 3

原创 如何在C++中使用mupdf操作pdf文件(一)

如,在C语言中使用mupdf的时候,需要先初始化一个fz_context,大量的函数都以这个fz_context为参数。而在C++中,这个上下文不是必须的,mupdf的C++绑定自动初始化了这个变量。如,在C语言中使用mupdf的时候,大量的变量都是以fz_开头的,而C++使用了命名空间mupdf。

2024-09-13 19:45:00 2170 9

原创 音视频开发(二)FFmpeg调用avio_open返回Protocol not found的追踪

通过函数名称,我们大胆猜测,这应该是一个根据文件名来创建URL结构的函数,而URL中有一个关键字段就是协议,即Protocol,所以这个函数非常可能跟“Protocol not found”有关。这个函数的开头,先把传入的filename根据:截取出来,做为协议名,之后就用ffurl_get_protocols取得的数组依次对比,如果没有相等的,就会返回NULL。前面的过程都一切正常,但是到了上面倒数第二步,即avio_open的时候,怎是失败,错误信息是:Protocol not found。

2024-09-06 20:00:00 2032 2

原创 音视频开发(一)RTSP模拟环境搭建

要进行音视频相关的开发,除了需要掌握音视频相关的协议、格式、工具、语言、库以外,模拟环境也是非常重要的条件。有了模拟环境,我们才能随时测试、更改自己写的音视频代码。比如,我们要进行RTSP播放器开发,就需要模拟RTSP媒体源;要进行RTSP客户端开发,就需要模拟的RTSP服务器;要进行RTSP服务器开发,就需要模拟的推流、拉流。

2024-08-30 14:38:11 1278

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除