Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

合同管理知识学习笔记

发表于 2024-08-23 | 更新于 2025-04-23

项目采购管理过程围绕合同进行,采购管理过程所涉及的各种活动过程了合同生命周期。

合同类型

按项目范围分:

  • 项目总承包合同
  • 项目单项承包合同
  • 项目分包合同

按项目付款方式划分:

  • 总价合同
  • 成本补偿合同
  • 工料合同

合同管理过程

合同的签订管理

合同的履行管理

工程验收的基本流程通常包括预验收、初步验收和最终验收三个阶段。在预验收阶段,施工单位需要自查自纠,确保工程各项指标符合设计要求和施工规范。初步验收则是在预验收的基础上,由建设单位组织设计、监理等相关部门共同参与,对工程质量进行全面检查。最终验收是在初步验收合格后,经过一段时间的试运行,确认工程无重大问题后进行的正式验收。

有幸作为专家参加一个合同的最终验收,记录一下最终验收的具体流程:

  • 建设方项目介绍
  • 承建方和监理方介绍预验收或初步验收之后存在的问题和整改情况
  • 专家组现场查看项目建设成果
  • 专家组评审项目材料,查漏补缺(因评审时间有限,重点对评审材料的完备性和科学性进行审查)
  • 专家组出具评审意见

合同的变更管理

合同的档案管理

合同违约索赔管理

参考链接

  1. 信息系统项目管理师教程(第4版),by douban.

人工智能领域术语学习笔记

发表于 2024-07-31 | 更新于 2024-12-22

记录学习一些人工智能领域的专业名词含义,方便理解。

人工智能

1956年夏天,计算机科学家约翰·麦卡锡(John McCarthy)首次提出”人工智能”(AI)这个概念。

人工智能指的是,通过软件和硬件,来完成通常需要人类智能才能完成的任务。它的研究对象,就是在机器上模拟人类智能。

机器学习

早期,人工智能研究分成两个阵营。

第一个阵营是规则式(rule-based)方法,又称专家系统(expert systems),指的是人类写好一系列逻辑规则,来教导计算机如何思考。

可想而知,对于复杂的、大规模的现实问题,很难写出完备的、明确的规则。所以,这种方法的进展一直很有限。

第二个阵营就是机器学习(machine learning),指的是没有预置的规则,只是把材料提供给计算机,让机器通过自我学习,自己发现规则,给出结果。

神经网络

神经网络(neural network)是机器学习的一种主要形式。

神经网络就是在机器上模拟人脑的结构,构建类似生物神经元的计算网络来处理信息。

一个计算节点就是一个神经元,大量的计算节点组成网络,进行协同计算。

神经网络需要极大的算力,以及海量的训练材料。以前,这是难以做到的,所以20世纪70年代开始,就陷入了停滞,长期没有进展。

深度学习

深度学习是神经网络的一种实现方法,在20世纪80年代由杰弗里·辛顿提出。它让神经网络研究重新复活。

深度学习是一种让多层神经元可以进行有效计算的方法,大大提高了神经网络的性能。”深度学习”这个名字,就是比喻多层神经元的自主学习过程。

多层神经元包括一个输入层和一个输出层,它们之间有很多中间层(又称隐藏层)。以前,计算机算力有限,只能支撑一两个中间层,深度学习使得我们可以构建成千上万个中间层的网络,具有极大的”深度”。

Transformer

早些年,深度学习用到的方法是卷积神经网络(CNN)和循环神经网络(RNN)。

2017年,谷歌的研究人员发明了一种新的深度学习处理方法,叫做 Transformer(转换器)。

Transformer 不同于以前的方法,不再一个个处理输入的单词,而是一次性处理整个输入,对每个词分配不同的权重。

这种方法直接导致了2022年 ChatGPT 和后来无数生成式 AI 模型的诞生,是神经网络和深度学习目前的主流方法。

由于基于 Transformer 的模型需要一次性处理整个输入,所以都有”上下文大小”这个指标,指的是一次可以处理的最大输入。

比如,GPT-4 Turbo 的上下文是 128k 个 Token,相当于一次性读取超过300页的文本。上下文越大,模型能够考虑的信息就越多,生成的回答也就越相关和连贯,相应地,所需要的算力也就越多。

Token 词元

Token,也称为标记或词元,是语言处理中的一个基本单元。它通常代表一个单词、标点符号或一个特定的符号序列。Token是文本的基本组成单元,用于表示文本中的有意义的语言元素。例如,“Hello, world!”这个句子可以被划分为多个Token:“Hello”、“,”、“world”和“!”。

深度学习成为当今显学的原因

深度学习成为当今显学的主要原因是性能优越。实际上深度学习的基础技术几十年前就已经提出来了,那为什么最近十多年深度学习才开始火热?这主要是制约深度学习的两大因素:大数据集和高性能硬件在十多年前才达到深度学习的门槛。大数据集使深度学习能够充分的进行训练,而高性能硬件如CPU和GPU使深度学习的训练速度以指数级提升。

参考链接

  1. 自然语言处理中的文本token和tokenization详解,by KAKAKA.
  2. 深度学习基础介绍,by Yunhui1998.
  3. It all started with a Perceptron,by Vincent.
  4. 科技爱好者周刊(第 330 期):李开复梳理人工智能,by 阮一峰.

CPlusPlus反射机制研究

发表于 2024-07-21

反射是指在程序运行时,动态获取类或对象的所有属性和方法。这种语言的反射机制可以提高程序设计的通用性和便利性。但遗憾的是,当前C++标准不支持反射机制。

参考链接

  1. C++ 反射机制(实例讲解),by 那年聪聪.
  2. C++ 实现反射机制,by –Allen–.
  3. [C++11札记]: type traits简介,by 云水木石.
  4. 重大变更(一):关于C++26的十大猜想,by 极客时间APP.
  5. C++ type traits的学习,by 燃脂二师兄.

CPlusPlus数据访问层设计

发表于 2024-07-14 | 更新于 2024-07-18

三层架构是软件架构中常用的架构,它从上往下分为表示层、业务逻辑层、数据访问层。下面重点介绍 C++ 程序的数据访问层设计。

什么是 DAO

在计算机软件中,数据访问对象(data access object,DAO)是为某种类型的数据库或其他持久性机制提供一个抽象接口的对象。通过映射应用程序对持久层的调用,DAO 提供一些特定的数据操作,而无需暴露数据库细节。这种隔离支持单一功能原则。

数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。

数据访问对象模式的参与者主要有:

  • 数据访问对象接口(Data Access Object Interface) - 该接口定义了在一个模型对象上要执行的标准操作。
  • 数据访问对象实体类(Data Access Object concrete class) - 该类实现了上述的接口。该类负责从数据源获取数据,数据源可以是数据库,也可以是 xml,或者是其他的存储机制。
  • 模型对象/数值对象(Model Object/Value Object, VO) - 该对象是简单的 POJO,包含了 get/set 方法来存储通过使用 DAO 类检索到的数据。

主流的 ORM 框架

C++ 中主流的 ORM 框架有以下几个:

  • LiteSQL:https://sourceforge.net/projects/litesql/
  • ODB:https://www.codesynthesis.com/products/odb/
  • QxOrm:https://www.qxorm.com/qxorm_en/home.html
  • Wt::Dbo:https://www.webtoolkit.eu/wt/doc/tutorial/dbo.html

其中,LiteSQL 和 ODB 不依赖于特定的框架,而 QxOrm 依赖于 Qt,Wt::Dbo 依赖于 Wt。由于使用QT进行开发,最终决定使用QxOrm。本想使用QDB,但是在QT上开发太麻烦。

参考链接

  1. C++实现的DAO(数据访问对象模式),by Jinkai.
  2. QxOrm使用教程(ORM for C++ 对象关系映射),by ljjyy.
  3. 浅谈C++三层架构,by eric0803.
  4. C++架构之美:设计卓越应用,by qt.video.
  5. Dao层设计,by c++天下第一.
  6. 如何设计一个简单的 C++ ORM,by bot-man-jl.
  7. C++ ORM ODB入门,by aliyun.
  8. TinyORM:一个简单的C++ ORM框架,by davidpp.
  9. C++版本 ORM 访问数据库之ODB 的Window环境编译(一),by Software_hul.
  10. Windows下Qt5.5.1中使用ODB,by 严慈善.
  11. 【一】ODB - C++ 访问数据库的利器–Hello World On Windows(Version-24),by C++程序员Carea.
  12. error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public 解决办法,by 鸡啄米的时光机.
  13. qxBlog project - blog management in C++,by QxOrm.
  14. Qt三层架构应用程序设计及开发,by wyh20171105.
  15. Qt项目架构经验总结,by cps666.
  16. Qt SQL的使用 MySQL,by 一杯清酒邀明月.

Java注解学习笔记

发表于 2024-06-29

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。

注解作用

主要的作用有以下四方面:

  • 生成文档,通过代码里标识的元数据生成javadoc文档。

  • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。

  • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。

  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。

注解分类

注解的常见分类:

  • Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。

  • 元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented,@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。

  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

参考链接

  1. Java 基础 - 注解机制详解,by pdai.
  2. Java注解,by 何学长在奔跑.

IDEA创建SpringBoot项目并启动的方法

发表于 2024-06-28

IntelliJ IDEA是一种商业化销售的Java集成开发环境(Integrated Development Environment,IDE)工具软件,由JetBrains软件公司(前称为IntelliJ)开发,提供Apache 2.0开放式授权的社区版本以及专有软件的商业版本,开发者可选择其所需来下载使用。

创建Spring Boot项目的方法

请参考:

  • 使用idea创建第一个springboot项目 及 如何启动springboot项目 及 如何指点端口和上下文

启动Spring Boot项目的方法

请参考:

  • 使用idea创建第一个springboot项目 及 如何启动springboot项目 及 如何指点端口和上下文

参考链接

  1. IntelliJ IDEA,by wikipedia.
  2. 使用idea创建第一个springboot项目 及 如何启动springboot项目 及 如何指点端口和上下文,by wudinaniya.

Maven的配置文件pom.xml学习

发表于 2024-06-25 | 更新于 2025-09-26

项目对象模型 (POM) 是 Maven 中的基本工作单元。它是一个 XML 文件,包含有关项目的信息以及 Maven 用于构建项目的配置详细信息。它包含大多数项目的默认值。例如,构建目录为target;源目录为src/main/java;测试源目录为src/test/java;等等。执行任务或目标时,Maven 在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

POM.xml最简示例

1
2
3
4
5
6
7
<project>
<modelVersion>4.0.0</modelVersion>

<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>

POM.xml结构

项目基本信息

必填项标签:

  • groupId:项目的组名,通常为反转的域名,例如:com.example
  • artifactId: 项目的唯一标识,通常为项目名称
  • version:项目版本号
  • packaging:项目打包方式,通常是 jar、war 或 pom, 如果没有指定packaging,则默认是 jar

其他重要标签:

  • modules

modules 标签用于声明当前 Maven 项目包含的模块子项目,每个子项目都是一个独立的 Maven 项目,具有自己的 pom.xml 文件,可以进行独立构建和测试。在父项目的 pom.xml 文件中,使用 标签来列出所有子项目的名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<project>
<modelVersion>4.0.0</modelVersion>

<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.8.7</version>

<modules>
<module>ruoyi-admin</module>
<module>ruoyi-framework</module>
<module>ruoyi-system</module>
<module>ruoyi-quartz</module>
<module>ruoyi-generator</module>
<module>ruoyi-common</module>
</modules>
</project>
  • parent

parent 标签用于声明当前 Maven 项目的父项目,它可以将若干个 Maven 项目组织成一个整体,指定版本号,插件版本号等,便于管理和维护,在一个 Maven 项目中,使用标签来引用父项目。

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<project>
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>ruoyi-framework</artifactId>
</project>
  • properties

properties 严格来说,并不一定是项目本身的信息,而是人为设置的属性或者说宏,这个标签用来定义和管理项目中所需要的属性,其作用有以下几个:

(1) 统一管理项目中的常用属性,比如版本号、路径、插件版本等,方便统一修改和管理。

(2) 可以在配置过程中使用 ${…}占位符引用这些属性,使得配置更加灵活和便捷。

(3) 避免硬编码,提高代码的可维护性和可读性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<project>
<properties>
<ruoyi.version>3.8.7</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-framework.version>5.3.33</spring-framework.version>
<druid.version>1.2.20</druid.version>
<bitwalker.version>1.21</bitwalker.version>
<swagger.version>3.0.0</swagger.version>
<kaptcha.version>2.3.3</kaptcha.version>
<pagehelper.boot.version>1.4.7</pagehelper.boot.version>
<fastjson.version>2.0.43</fastjson.version>
<oshi.version>6.5.0</oshi.version>
<commons.io.version>2.13.0</commons.io.version>
<poi.version>4.1.2</poi.version>
<velocity.version>2.3</velocity.version>
<jwt.version>0.9.1</jwt.version>
</properties>
</project>

项目的依赖列表

dependency

与项目的依赖列表相关的标签最外层由 dependencies 来囊括,内部包含了各种具体的依赖 dependency,该标签用于指定一个依赖项,它包含以下几个子标签:

  • groupId:指定依赖项的groupId,项目的组名
  • artifactId:指定依赖项的artifactId,项目的唯一标识符
  • version:指定依赖项的版本号。
  • scope:指定依赖项在项目中的使用范围。

其中的 一般包含以下几种范围:常用的有compile、test、provided 和 runtime。

repository

我们还能在pom文件中支持指定Maven仓库,即使用 repositories 和 repository 标签,repository 用于指定一个Maven仓库。

项目的构建配置

项目的构建配置信息,包括编译器版本、插件列表、源代码目录等。

具体请参考:

  • 全面详解Maven的配置文件pom.xml(含常用plugin)

参考链接

  1. 全面详解Maven的配置文件pom.xml(含常用plugin),by Slow菜鸟.
  2. Introduction to the POM,by apache.
  3. Maven的三种项目打包方式——pom,jar,war的区别,by Mr.史.
  4. 基于Springboot的maven父子工程pom文件打包配置,by Sherlock先生.
  5. Maven 仓库,by runoob.
  6. maven配置阿里云镜像源,by aliyun.

不同桌面操作系统间文件传输方法

发表于 2024-06-23 | 更新于 2024-06-24

最近经常在不同操作系统之间传输数据,因此简单记录一下所使用的方法。

获取远程 Windows 系统中数据

从本地操作系统获取远程 Windows 系统中的数据,优先可使用 Windows 自带的 FTP 服务,这样不仅可以获取数据,也可以向远程 Windows 系统写入数据。具体方法请参考:

  • windows搭建一个FTP服务器超详细

如果本地和远程都是 Windows 系统,也可以使用自带的远程桌面应用读写数。开启远程桌面访问后,在命令行提示符中输入 mstsc ,远程登陆即可。

获取远程 Linux 系统中数据

本地 Linux 系统

如果本地也是 Linux 系统,可以使用 SCP 命令。具体方法为:

  • 复制文件
1
2
3
4
5
$scp local_file remote_username@remote_ip:remote_folder
$scp local_file remote_username@remote_ip:remote_file

$scp remote_username@remote_ip:remote_file local_folder
$scp remote_username@remote_ip:remote_file local_file

指定了用户名,命令执行后需要输入用户密码;如果不指定用户名,命令执行后需要输入用户名和密码;

  • 复制目录
1
2
3
4
$scp -r local_folder remote_username@remote_ip:remote_folder
$scp -r local_folder remote_ip:remote_folder

$scp -r remote_username@remote_ip:remote_folder local_folder

本地 Windows 系统

如果本地是 Windows 系统,可使用 FTP 服务,让远程 Linux 系统将数据直接写入到本地 Windows 系统的 FTP 服务目录。

参考链接

  1. windows搭建一个FTP服务器超详细, by 程序猿——小白菜.
  2. 18. scp 跨机远程拷贝,by Linux Tools Quick Tutorial.
  3. win10隐藏正在运行的程序怎么操作_win10怎么隐藏正在运行的软件,by Rsun04551.

虚拟DOM技术学习

发表于 2024-06-23

文档对象模型(DOM)通过将文档的结构(例如表示网页的 HTML)以对象的形式存储在内存中,将网页与脚本或编程语言连接起来。 虚拟 DOM 是声明式 Web 框架(如 React、Vue.js 和 Elm)中使用的文档对象模型 (DOM) 的轻量级 JavaScript 表示形式。

为什么需要虚拟 DOM

虚拟 DOM 本质上是在 DOM 基础上的更高级别的抽象,使用虚拟 DOM 将带来如下好处:

  • 虚拟 DOM 比 DOM 更新渲染的速度更快。这就是虚拟 DOM 的魅力,正常来说增加一层抽象,可以减少编程复杂度,但会影响运行效率,但是虚拟 DOM 却两者兼备。
  • 减少编程复杂度,更有利于前端组件式开发。

关键思想

  • 如何创建 DOM 的虚拟表示
  • 如何比较不同虚拟 DOM 节点之间的差异
  • 应用虚拟 DOM 节点差异到真实的 HTML 元素

具体原理

请参考:

  • A virtual DOM in 200 lines of JavaScript

参考链接

  1. A virtual DOM in 200 lines of JavaScript,by Marcelo Lazaroni.
  2. 文档对象模型(DOM),by mozilla.
  3. Virtual DOM,by wikipedia.

Linux桌面版安装过程笔记

发表于 2024-06-13 | 更新于 2024-06-14

最近需要在一台比较老的机器上安装银河麒麟4.0.2,遇到一些问题,记录一下。

光盘启动后,显示器黑屏

解决方案:光盘启动后,选择 install kylin 启动选项,按键盘 e 进入编辑状态,找到 quiet splash ,在后面添加 nomodeset ,然后按 crtl+x 启动。

具体原理:

  • nomodeset

这是一个新型的显示模式,即内核在启动阶段调用更先进的图形显示技术,以达到更好的显示效果。副作用就是兼容性低。

可以设置nomodeset 或者modeset=0关闭这项功能,至少保证进入字符界面。

更进阶一点的写法是:i915.modeset=0,其中i915是intel的显示驱动,该命令可以单独关闭该驱动的KMS。

  • quiet

quiet参数的作用:启动系统的过程中,如果没有quiet,那么内核就会输出很多内核消息,这些内核消息就包括的了系统启动过程中运行了哪些程序,如果系统运行正常,就没必要看到这些消息。

  • splash

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进入图形界面

参考链接

  1. 银河麒麟v4.0.2安装,by 阿瓦隆勒菲.
  2. linux中grub,nomodest,quiet等参数的含义,进入启动项之后黑屏的可能原因,by dair6.
  3. linux内核启动参数,by deepin.
  4. Linux系统安装网卡驱动,by luhuaxiang.
  5. 【亲测有效】Linux系统安装NVIDIA显卡驱动,by 自动驾驶simulation.
  6. AMD显卡驱动安装,by skyao.
  7. Linux中获得AMD显卡的状态信息,by 香风家的火柴盒.
  8. ubuntu环境配置AMD显卡驱动,by WocheDonner.
上一页1…456…53下一页

Jack Huang

528 日志
68 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse