对于银河麒麟桌面版4.0.2,可使用系统已集成的 vino-server 进行远程桌面访问。具体步骤如下:
- 打开终端,输入vino-preferences,配置vnc连接密码
- 使用vncviewer,输入银河麒麟桌面版4.0.2的ip地址,输入vnc连接密码,即可远程访问银河麒麟。
参考链接
- 银河麒麟桌面操作系统:手把手教你开启VNC远程桌面并修改默认端口,by 码农拿铁.
对于银河麒麟桌面版4.0.2,可使用系统已集成的 vino-server 进行远程桌面访问。具体步骤如下:
最近接触到 DDS 中间件,学习一下。
针对实时系统的数据分发服务( DDS )是对象管理组织(OMG)的机器对机器(有时称为中间件或连接框架)标准,旨在通过发布-订阅模式实现可靠、高性能、可互操作、实时、可扩展的 数据交换。
DDS 满足航空航天、国防、空中交通管制、自动驾驶车辆、医疗设备、机器人、发电、仿真和测试、智能电网管理、交通运输系统等 应用领域的实时数据交换需求。
下面从源代码编译安装 Fast-DDS。
使用 vcpkg 安装 Fast-DDS 所需依赖库。
1 | vcpkg install openssl asio tinyxml2 fastcdr foonathan-memory --triplet x64-windows |
在Windows平台编译安装使用 Visual Studio 2019.
FastDDS 依赖 Foonathan Memory(内存管理库),通过源代码编译安装:
1 | cd i:\project\Fast-DDS\ |
FastDDS 依赖 FastCDR(序列化库),通过源代码编译安装:
1 | cd i:\project\Fast-DDS\ |
当所有依赖库都安装后,开始安装eProsima Fast DDS,打开 VS2019的X64本地命令提示符,按如下步骤输入命令:
1 | cd i:\project\Fast-DDS\ |
当执行 cmake -DCMAKE_INSTALL_PREFIX=i:/install/fastdds .. 可能会报找不到 ASIO 的错误,可以编辑 CMakeLists.txt,注释如下代码,再重新运行。
1 | eprosima_find_thirdparty(Asio asio VERSION 1.13.0) |
当执行 cmake –build . –config Release –target install 可能会报如下错误:
1 | 警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 |
请参考以下链接进行处理,主要是配置C++编译选项 /utf-8:
fastddsgen 是 FastDDS 官方提供的 IDL(Interface Definition Language)编译器,用于将 IDL 定义的数据类型转换为 FastDDS 兼容的代码(支持 C++、Python 等语言),自动生成数据序列化 / 反序列化逻辑、类型注册代码等,是 FastDDS 开发的基础工具。
具体安装步骤请参考:
Fast-DDS的简单示例请参考:
阅读书籍《图解大模型:生成式AI原理与实战》,做些笔记。
当使用隐式链接的方法调用 DLL 中的导出函数时,需要代码的头文件、导入库lib和动态链接库。如何缺失导入库lib,将无法使用隐式链接的方式调用 DLL中的函数。幸运的是,通过一些手段可以从DLL中直接生成导入库lib。
步骤如下:
1 | include '..\implib.inc' |
生成DLL导入库lib的方案有很多,最便利的方法是使用 ImpLib SDK 工具。具体教程如下:
1 | \bin\dll2def c:\windows\system32\kernel32.dll kernel32.def |
1 | \bin\fasm kernel32.def kernel32.lib |
最近需要使用C++的多线程编写一个处理程序,因此学习记录一下C++多线程的编程知识。
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
传统的C++(C++11标准之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h> 。
C++11提供了语言层面上的多线程,包含在头文件
中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C++11 新标准中引入了5个头文件来支持多线程编程。
这5个头文件分别是:
创建线程的基本方法如下所示:
1 | # 示例1 |
主线程与子线程的处理方法:
可以使用joinable判断是join模式还是detach模式。
1 | if (myThread.joinable()) foo.join(); |
1 | #include <iostream> // std::cout |
因为程序边运行边创建线程是比较耗时的,所以我们通过池化的思想:在程序开始运行前创建多个线程,这样,程序在运行时,只需要从线程池中拿来用就可以了.大大提高了程序运行效率.一般线程池都会有以下几个部分构成:
1 | #include <iostream> |
最近找了一个 NTP 时间同步工具,使用 GO 语言编写,能够跨平台在 Windows 、 Linux 、 Mac 上运行,挺实用的,但是需要配置 GO 语言环境,于是记录一下过程。
GO 语言环境的安装请参考:
下载 GO 语言相关模块时可能被墙,需要设置代理加速下载,方法如下:
1 | # 执行下面的指令 |
使用 IDEA 集成开发环境运行 Sprint Boot 应用程序时,控制台中文乱码,参考文章1分钟解决IntelliJ IDEA 控制台中文乱码,统一设置 utf-8,再也不会乱码了中第一种方法解决了中午乱码问题。
消息队列是一种常用的软件架构,有必要了解和学习它。
消息队列(Message Queue,简称MQ)是一种在计算机系统中用于在不同应用程序或服务之间进行异步通信的中间件技术,它通过一个存储消息的队列作为中间人,允许发送者(生产者)将消息放入队列,接收者(消费者)则在准备好时从队列中取出并处理,从而实现系统解耦、异步处理和流量削峰等目标。消息队列的出现解决了分布式系统中数据丢失、服务故障、处理能力不足以及业务系统间强耦合等问题。
消息队列使用点对点消息传递模式,在该模式中,一个应用程序(称为“发送者”)向队列提交消息,另一个应用程序(称为“接收者”)则从队列中获取并使用消息。发送者和使用者之间存在紧密耦合的一对一关系,并且每条消息只能使用一次。
如果您的应用程序需要将消息分发给多方,则可以组合多个消息队列,或者使用发布/订阅 (pub/sub) 消息传递模型。
在发布/订阅消息传递中,生成消息的应用程序称为发布者,而使用该消息的应用程序称为订阅者。每条消息都会发布到一个主题,订阅该主题的每个应用程序都会获得发布到它的所有消息的副本。
大多数消息传递中间件解决方案都支持消息队列(点对点)和发布/订阅消息模型。
消息总线是一种企业服务总线 (ESB),它允许服务随处访问数据,同时确保它们在分布式系统架构中保持解耦和独立运行。当使用消息总线时,所有服务或应用程序必须共用通用数据类型、通用命令集和通用通信协议(尽管它们可能用不同的语言编写)。使用者可以决定如何使用信息。
如果解耦的应用程序要通过消息总线进行通信,则必须转换消息以使其归属于同一类型。相反,消息队列可传输各类消息,无论其类型是否相同。
最近单位有一台计算机,只有一个网卡,但是需要通三个网段通信,为了避免各个网段之间的组播通信流量占用带宽,拟采用Vlan技术,使用三次交换机进行逻辑隔离。具体过程记录如下。
使用 VLAN 接口。
核心思想是:在计算机的网络接口上创建多个虚拟接口,并将每个虚拟接口关联到不同的VLAN。
这种方法适用于支持802.1Q VLAN标记的交换机和操作系统。它在单个物理网卡上创建多个逻辑接口。
物理连接:服务器通过一根网线连接到支持802.1Q的交换机端口。该交换机端口需要被配置为Trunk模式,允许携带多个VLAN的流量。
服务器端配置:在服务器的操作系统上,你需要创建VLAN虚拟接口。
1 | 例如: |
对于Realtek网卡,可使用realtek diagnostic utility工具,创建多个vlan网口。具体请参考 realtek adapter的vlan设定。
1 | eth0.10 -> 192.168.10.100/24 (VLAN 10的网关可能是 192.168.10.1) |
工作原理: 当服务器要发送一个数据包到VLAN 10的网络时,它会通过 eth0.10 发出,操作系统会自动给这个数据包打上VLAN 10的标签。交换机的Trunk端口收到后,会根据标签将数据包转发到VLAN 10。反之,当交换机发送一个带有VLAN 20标签的数据包给服务器时,只有服务器的 eth0.20 接口能接收到它。
对于分布式系统的运转而言,各个分布式的实体基于同一时间标准是必要条件,如果各个分布式实体的时间标准不统一,整个系统必然分崩离析。下面介绍在不同操作系统平台设置 NTP 客户端的方法。
1 | 打开日期和时间设置 |
1 | 打开注册表编辑器(regedit)。 |
注意: SpecialPollInterval 值的设置必须在位于 MinPollInterval 和 MaxPollInterval 之间,否则 NTP 客户端不会按 SpecialPollInterval 预期同步。具体请参考:京准电钟课堂:NTP时钟同步时客户端未按预期同步 。
chrony 既可作时间服务器服务端,也可作客户端。性能比 ntp 好,且配置管理方便。chrony 由两个程序组成,分别是 chronyd 和 chronyc。chronyd 是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。chronyc 提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在 chronyd 实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。
以 NTP 工具 Chrony 为例,具体步骤如下:
1 | # 查看 chrony 依赖的包 |
1 | # 注释默认的 NTP 服务器pool,配置上级时间服务器 |
1 | # 获取 chronyd 的PID |
1 | # 确保你的chrony服务器自身已经成功与上层服务器同步。可以通过 chronyc sources 命令检查,服务端需要先成功同步时间,才能为客户端提供同步服务, NTP服务器前设置 ^* 表示已与该服务区时钟同步。 |
1 | sudo chronyc -a makestep |