反射是指在程序运行时,动态获取类或对象的所有属性和方法。这种语言的反射机制可以提高程序设计的通用性和便利性。但遗憾的是,当前C++标准不支持反射机制。
参考链接
- C++ 反射机制(实例讲解),by 那年聪聪.
- C++ 实现反射机制,by –Allen–.
- [C++11札记]: type traits简介,by 云水木石.
- 重大变更(一):关于C++26的十大猜想,by 极客时间APP.
- C++ type traits的学习,by 燃脂二师兄.
反射是指在程序运行时,动态获取类或对象的所有属性和方法。这种语言的反射机制可以提高程序设计的通用性和便利性。但遗憾的是,当前C++标准不支持反射机制。
三层架构是软件架构中常用的架构,它从上往下分为表示层、业务逻辑层、数据访问层。下面重点介绍 C++ 程序的数据访问层设计。
在计算机软件中,数据访问对象(data access object,DAO)是为某种类型的数据库或其他持久性机制提供一个抽象接口的对象。通过映射应用程序对持久层的调用,DAO 提供一些特定的数据操作,而无需暴露数据库细节。这种隔离支持单一功能原则。
数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。
数据访问对象模式的参与者主要有:
C++ 中主流的 ORM 框架有以下几个:
其中,LiteSQL 和 ODB 不依赖于特定的框架,而 QxOrm 依赖于 Qt,Wt::Dbo 依赖于 Wt。由于使用QT进行开发,最终决定使用QxOrm。本想使用QDB,但是在QT上开发太麻烦。
注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。
主要的作用有以下四方面:
生成文档,通过代码里标识的元数据生成javadoc文档。
编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
注解的常见分类:
Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented,@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。
自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。
IntelliJ IDEA是一种商业化销售的Java集成开发环境(Integrated Development Environment,IDE)工具软件,由JetBrains软件公司(前称为IntelliJ)开发,提供Apache 2.0开放式授权的社区版本以及专有软件的商业版本,开发者可选择其所需来下载使用。
请参考:
请参考:
项目对象模型 (POM) 是 Maven 中的基本工作单元。它是一个 XML 文件,包含有关项目的信息以及 Maven 用于构建项目的配置详细信息。它包含大多数项目的默认值。例如,构建目录为target;源目录为src/main/java;测试源目录为src/test/java;等等。执行任务或目标时,Maven 在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
1 | <project> |
必填项标签:
其他重要标签:
modules 标签用于声明当前 Maven 项目包含的模块子项目,每个子项目都是一个独立的 Maven 项目,具有自己的 pom.xml 文件,可以进行独立构建和测试。在父项目的 pom.xml 文件中,使用 标签来列出所有子项目的名称。
1 | <project> |
parent 标签用于声明当前 Maven 项目的父项目,它可以将若干个 Maven 项目组织成一个整体,指定版本号,插件版本号等,便于管理和维护,在一个 Maven 项目中,使用标签来引用父项目。
1 | <?xml version="1.0" encoding="UTF-8"?> |
properties 严格来说,并不一定是项目本身的信息,而是人为设置的属性或者说宏,这个标签用来定义和管理项目中所需要的属性,其作用有以下几个:
(1) 统一管理项目中的常用属性,比如版本号、路径、插件版本等,方便统一修改和管理。
(2) 可以在配置过程中使用 ${…}占位符引用这些属性,使得配置更加灵活和便捷。
(3) 避免硬编码,提高代码的可维护性和可读性
1 | <project> |
与项目的依赖列表相关的标签最外层由 dependencies 来囊括,内部包含了各种具体的依赖 dependency,该标签用于指定一个依赖项,它包含以下几个子标签:
其中的
我们还能在pom文件中支持指定Maven仓库,即使用 repositories 和 repository 标签,repository 用于指定一个Maven仓库。
项目的构建配置信息,包括编译器版本、插件列表、源代码目录等。
具体请参考:
最近经常在不同操作系统之间传输数据,因此简单记录一下所使用的方法。
从本地操作系统获取远程 Windows 系统中的数据,优先可使用 Windows 自带的 FTP 服务,这样不仅可以获取数据,也可以向远程 Windows 系统写入数据。具体方法请参考:
如果本地和远程都是 Windows 系统,也可以使用自带的远程桌面应用读写数。开启远程桌面访问后,在命令行提示符中输入 mstsc ,远程登陆即可。
如果本地也是 Linux 系统,可以使用 SCP 命令。具体方法为:
1 | $scp local_file remote_username@remote_ip:remote_folder |
指定了用户名,命令执行后需要输入用户密码;如果不指定用户名,命令执行后需要输入用户名和密码;
1 | $scp -r local_folder remote_username@remote_ip:remote_folder |
如果本地是 Windows 系统,可使用 FTP 服务,让远程 Linux 系统将数据直接写入到本地 Windows 系统的 FTP 服务目录。
文档对象模型(DOM)通过将文档的结构(例如表示网页的 HTML)以对象的形式存储在内存中,将网页与脚本或编程语言连接起来。 虚拟 DOM 是声明式 Web 框架(如 React、Vue.js 和 Elm)中使用的文档对象模型 (DOM) 的轻量级 JavaScript 表示形式。
虚拟 DOM 本质上是在 DOM 基础上的更高级别的抽象,使用虚拟 DOM 将带来如下好处:
请参考:
最近需要在一台比较老的机器上安装银河麒麟4.0.2,遇到一些问题,记录一下。
解决方案:光盘启动后,选择 install kylin 启动选项,按键盘 e 进入编辑状态,找到 quiet splash ,在后面添加 nomodeset ,然后按 crtl+x 启动。
具体原理:
这是一个新型的显示模式,即内核在启动阶段调用更先进的图形显示技术,以达到更好的显示效果。副作用就是兼容性低。
可以设置nomodeset 或者modeset=0关闭这项功能,至少保证进入字符界面。
更进阶一点的写法是:i915.modeset=0,其中i915是intel的显示驱动,该命令可以单独关闭该驱动的KMS。
quiet参数的作用:启动系统的过程中,如果没有quiet,那么内核就会输出很多内核消息,这些内核消息就包括的了系统启动过程中运行了哪些程序,如果系统运行正常,就没必要看到这些消息。
splash是一个不可或缺的参数,系统很多核心程序,都需要这个参数,且这个参数与可视化界面有关,没有就可能导致屏幕一片空白。
进入Linux系统桌面后,执行如下步骤:
查未安装驱动的网口
ifconfig 和 ifconfig -a对比,查看哪些网口没有加载,即为没有驱动的网口
查网卡驱动型号
ethtool -i 网口,输出的driver:XXX就是驱动名
下载网卡
去intel官网下载对应驱动的源码
卸载旧驱动
rmmod XXX
编译
进入源码的makefile同级目录,执行make install
加载新驱动
depmod -a
modprobe XXX
查看
lsmod | grep XXX
重启网络服务
service networking restart
进入Linux系统桌面后,执行如下步骤:
禁用原驱动nouveau
vim /etc/modprobe.d/blacklist.conf
追加blacklist nouveu
备份启动项
mv /boot/initram….img /boot/initram…img.bak
重新生成启动项
dracut -v /boot/initram…img,名称要和原来的一样
重启,并ctrl alt f1(或者f2-f6)进去tty界面
登录root用户,关闭lightdm
service lightdm stop
找到nvidia显卡驱动并执行,都选yes或者ok,重新生成initram,并添加带X服务
安装好后启动lightdm
service lightdm start
按ctrl alt f7进入图形界面
查看QT源码,会发现很多类会有一个同样名字、但是以Private结尾的孪生类,这是QT用于封装私有操作的一种设计模式。这种设计模式可以有如下优点:
myclass.h
1 | // myclass.h |
myclass.cpp
1 | // myclass.cpp |
最近需要从Oracle数据库中提取一些数据,并使用文档模板生成文档,鉴于Python环境部署的方便性,编程的简便性,于是采用Python开发该程序。方法记录如下:
核心是 docxtpl 和 oracledb 两个库。
1 | mkdir wordtpl_generate |
创建envConfig.bat批处理文件,一键执行离线环境配置。
1 | python -m venv env |
1 | import getpass |