当前位置: 首页 > article >正文

linux oracle 19c 静默安装

oracle数据库有个比较很抓瞎的事情,不同的版本搭建的大致流程是一样的,但是在实操细节上会有不同,比如操作的脚本位置和配置项等等,这些会变,所以需要时常积累不同版本的文档

这里有一点要说明,之所以使用静默安装,除了它的安装成功率高之外,还有一个最根本的原因是图形化以及命令行非静默安装时需要你的服务器和系统支持11X图像协议,这个东西很麻烦!很麻烦!没有的话oracle不会报错,但是会自己终止按照进程,并提示你DISPLAY not set. Please set the DISPLAY and try again

本次安装的需要的环境如下

CentOS 7 X86 64位
LINUX.X64_193000_db_home.zip (19c的安装包下载好就叫这个名字)
配置好静态ip
关闭防火墙
关闭SELinux

下载链接:https://pan.baidu.com/s/1R3auWmGDfuNvvBGzgf1D8Q?pwd=vwwg 或者去官网下载

第一步:配置合适的yum源,一般用阿里源就行,随后安装需要的yum环境

yum install -y unzip bc binutils compat-libcap1 compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel fontconfig-devel glibc glibc-devel ksh libaio libaio-devel libX11 libXau libXi libXtst libXrender libXrender-devel libgcc libstdc++ libstdc++-devel libxcb make smartmontools sysstat net-tools gcc gcc-c++ gcc-info gcc-locale gcc48 gcc48-info gcc48-locale gcc48-c++ libXp

第二步:准备oracle用户和组

groupadd oracle
groupadd dba
useradd -g oracle -G dba oraclepasswd oracle
设置密码

第三步:修改内核参数

vi /etc/sysctl.conf追加:
#系统异步I/O (AIO) 请求的最大数量
fs.aio-max-nr = 1048576
#整个linux系统全局最大可使用文件句柄数
fs.file-max = 6815744
#共享内存最大总页数,页(Page) 为单位,通常一页大小为 4KB
kernel.shmall = 2097152
#单个共享内存段的最大大小
#kernel.shmmax 一般设置成服务器内存的一半,单位为字节
kernel.shmmax = 1073741824
#共享内存段的最大数量
kernel.shmmni = 4096
#配置信号量参数(格式:SEMMSL SEMMNS SEMOPM SEMMNI)。防止数据库因信号量不足导致进程阻塞
#SEMMSL:每个信号量集合的最大信号量数(250)。
#SEMMNS:系统总信号量数(32000)。
#SEMOPM:单次操作可处理的信号量数(100)。
#SEMMNI:信号量集合的最大数量(128)。
kernel.sem = 250 32000 100 128
#本地TCP/UDP端口的可用范围
net.ipv4.ip_local_port_range = 9000 65500
#接收套接字缓冲区的默认和最大值(字节)
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
#发送套接字缓冲区的默认和最大值(字节)
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# 执行生效
sysctl -p

第四步:修改用户限制

vi /etc/security/limits.conf追加
#用户操作的线程数到达多少后给警告
oracle soft nproc 2047
#用户操作的线程数到达多少后不在允许新增线程
oracle hard nproc 16384
#下面两个是可操作的文件句柄个数限制
oracle soft nofile 1024
oracle hard nofile 65536
#栈空间软限制10M
oracle soft stack 10240
#下面两个是允许生成的核心转储文件大小,unlimited是不限制
#oracle soft core unlimited
#oracle hard core unlimited
#允许最多占用多少物理内存,单位:KB
oracle soft memlock 50000000
oracle hard memlock 50000000

第五步:修改用户登录认证

vi /etc/pam.d/login追加:
session required /lib64/security/pam_limits.so
session required pam_limits.so

系统环境变量中加入下面内容

vi /etc/profile追加:
if [ $USER = "oracle" ]; thenif [ $SHELL = "/bin/ksh" ]; thenulimit -p 16384ulimit -n 65536elseulimit -u 16384 -n 65536fi
fi 生效环境变量
source /etc/profile

第六步:创建安装目录,把它赋予oracle,并切换oracle用户操作后续的步骤,这里要注意19c的安装路径,也就是ORACLE_HOME,就是安装包解压的那个路径,不要改变,所以这里建的啥,你后面就解压到哪里就行。在我之前的11g安装方法里,之所以我只动了响应文件而安装包放在另外一个地方也能安装,是因为使用命令忽略了检查信息,但是一般情况安装完之后,安装包解压路径下的东西一般没有人删除,除非是确定真的没有用了,释放资源才会删掉,而且放在一个统一的路径下,也方便好找需要的资源,当然如果你有释放资源的需求你可以去参考我发的11g安装怎么用的命令

mkdir -p /opt/oracleData/oracle19cmkdir /opt/oracleData/inventorychown -R oracle:oracle /opt/oracleDatachmod -R 775 /opt/oracleDatasu oracle

第七步:更改oracle用户的环境变量文件

vi .bash_profile追加:
ORACLE_BASE=/opt/oracleDataORACLE_HOME=$ORACLE_BASE/oracle19cORACLE_SID=orclLD_LIBRARY_PATH=$ORACLE_HOME/libPATH=$PATH:$ORACLE_HOME/binexport ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH PATH
source .bash_profile

第八步:将19c的安装包上传到/opt/oracleData目录,并确保安装包的所有权是oracle用户,一定要确保所有权,在11g版本的时候只需要单独操作响应文件就行,但是19c整个包不在一起会出现问题

通过lrzsz 或者 scp都行,上传方式自己决定解压:
unzip LINUX.zip -d /opt/oracleData/oracle19c

第九步:19c的静默安装需要的文件在解压路径/install下,进入其中修改对应的配置文件

cd /opt/oracleData/oracle19c/install/responsevi db_install.rsp

按照你准备的路径和用户,更改如下内容

oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oracle
INVENTORY_LOCATION=/opt/oracleData/inventory
ORACLE_HOME=/opt/oracleData/oracle19c
ORACLE_BASE=/opt/oracleData
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=dba
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.SID=orcl

第十步:回到解压目录下,运行静默安装

cd /opt/oracleData/oracle19c./runInstaller -silent -responseFile /opt/oracleData/oracle19c/install/response/db_install.rsp -ignorePrereq

出现如下输出则服务安装成功
在这里插入图片描述
第十一步:按照上面的提示,切换到root用户,执行上面的两个脚本
在这里插入图片描述
第十二步:同样使用静默方式,配置监听

在root用户下安装nc

yum install -y nc

切换回oracle用户,从新生效一下环境变量,因为前面配置的时候还没有安装,有些东西可能会加载不上

source .bash_profile

oracle19c的监听,有个很无奈的事情,就是初始化监听用到的响应文件,并没有直接在response目录下提供,而是在$ORACLE_HOME/network/install/netca_clt.rsp,而且文件中只有最基本的一些配置项,初始化后不会像11g那样自动启动,需要手动启监听

/opt/oracleData/oracle19c/bin/netca /silent /responseFile /opt/oracleData/oracle19c/network/install/netca_clt.rsp

上面的初始化完成之后,手动启动的命令在ORACLE_HOME/bin/lsnrctl

/opt/oracleData/oracle19c/bin/lsnrctl start LISTENER

然后就可以用nc工具查看到监听进程了

[oracle@node3 samples]$ netstat -tnulp | grep 1521
(Not all processes could be identified, non-owned process infowill not be shown, you would have to be root to see it all.)
tcp6       0      0 :::1521                 :::*                    LISTEN      8408/tnslsnr 

第十三步:初始化数据库实例

和监听用的响应文件一样,19c并没有和11g那样在安装包中给你预留好初始化数据库实例用的响应文件,因此需要自己搞一个。注意从12c开始oracle引进了基于容器的多租户可插拔数据库(CBD),可以通俗的理解为在一个基础数据库架构(CBD)上运行多租户模式的容器数据库(PDB),我们个人自己使用不需要用这个,因为它的运维很复杂,个人使用也用不到,如果未来你要使用21以上的就必须考虑CDB的搭建方式了,因为可能会在未来仅支持容器化的数据库

自己在一个目录下建一个dbca.rsp文件,注意文件名别改,并写入如下内容

gdbName=orcl.test
sid=orcl
createAsContainerDatabase=false
templateName=General_Purpose.dbc
sysPassword=123456
systemPassword=123456
characterSet=AL32UTF8
totalmemory=1680

然后用这个响应文件去初始化数据库

/opt/oracleData/oracle19c/bin/dbca -silent  -createDatabase -responseFile /opt/oracleData/oracle19c/install/response/dbca.rsp

初始化进程结束后,查询一下已有的实例进程

[oracle@node3 response]$ ps -ef | grep ora_ | grep -v grep
oracle     7721      1  0 22:55 ?        00:00:00 ora_pmon_orcl
oracle     7723      1  0 22:55 ?        00:00:00 ora_clmn_orcl
oracle     7725      1  0 22:55 ?        00:00:00 ora_psp0_orcl
oracle     7728      1  0 22:55 ?        00:00:04 ora_vktm_orcl
oracle     7732      1  0 22:55 ?        00:00:00 ora_gen0_orcl
oracle     7734      1  0 22:55 ?        00:00:00 ora_mman_orcl
oracle     7738      1  0 22:55 ?        00:00:00 ora_gen1_orcl
oracle     7741      1  0 22:55 ?        00:00:00 ora_diag_orcl
oracle     7743      1  0 22:55 ?        00:00:00 ora_ofsd_orcl
oracle     7746      1  0 22:55 ?        00:00:00 ora_dbrm_orcl
oracle     7748      1  0 22:55 ?        00:00:00 ora_vkrm_orcl
oracle     7750      1  0 22:55 ?        00:00:00 ora_svcb_orcl
oracle     7752      1  0 22:55 ?        00:00:00 ora_pman_orcl
oracle     7754      1  0 22:55 ?        00:00:00 ora_dia0_orcl
oracle     7756      1  0 22:55 ?        00:00:00 ora_dbw0_orcl
oracle     7758      1  0 22:55 ?        00:00:00 ora_lgwr_orcl
oracle     7760      1  0 22:55 ?        00:00:00 ora_ckpt_orcl
oracle     7762      1  0 22:55 ?        00:00:00 ora_lg00_orcl
oracle     7764      1  0 22:55 ?        00:00:00 ora_smon_orcl
oracle     7766      1  0 22:55 ?        00:00:00 ora_lg01_orcl
oracle     7768      1  0 22:55 ?        00:00:00 ora_smco_orcl
oracle     7770      1  0 22:55 ?        00:00:00 ora_reco_orcl
oracle     7772      1  0 22:55 ?        00:00:00 ora_w000_orcl
oracle     7774      1  0 22:55 ?        00:00:00 ora_lreg_orcl
oracle     7776      1  0 22:55 ?        00:00:00 ora_w001_orcl
oracle     7778      1  0 22:55 ?        00:00:00 ora_pxmn_orcl
oracle     7782      1  0 22:55 ?        00:00:00 ora_mmon_orcl
oracle     7784      1  0 22:55 ?        00:00:00 ora_mmnl_orcl
oracle     7786      1  0 22:55 ?        00:00:00 ora_d000_orcl
oracle     7788      1  0 22:55 ?        00:00:00 ora_s000_orcl
oracle     7790      1  0 22:55 ?        00:00:00 ora_tmon_orcl
oracle     7796      1  0 22:55 ?        00:00:00 ora_m000_orcl
oracle     7798      1  0 22:55 ?        00:00:00 ora_m001_orcl
oracle     7804      1  0 22:55 ?        00:00:00 ora_tt00_orcl
oracle     7806      1  0 22:55 ?        00:00:00 ora_tt01_orcl
oracle     7808      1  0 22:55 ?        00:00:00 ora_tt02_orcl
oracle     7810      1  0 22:55 ?        00:00:00 ora_aqpc_orcl
oracle     7812      1  0 22:55 ?        00:00:00 ora_cjq0_orcl
oracle     7819      1  0 22:55 ?        00:00:00 ora_p000_orcl
oracle     7821      1  0 22:55 ?        00:00:00 ora_p001_orcl
oracle     7823      1  0 22:55 ?        00:00:00 ora_p002_orcl
oracle     7825      1  0 22:55 ?        00:00:00 ora_p003_orcl
oracle     7827      1  0 22:55 ?        00:00:00 ora_p004_orcl
oracle     7829      1  0 22:55 ?        00:00:00 ora_p005_orcl
oracle     7831      1  0 22:55 ?        00:00:00 ora_p006_orcl
oracle     7833      1  0 22:55 ?        00:00:00 ora_p007_orcl
oracle     7835      1  0 22:55 ?        00:00:00 ora_p008_orcl
oracle     7837      1  0 22:55 ?        00:00:00 ora_p009_orcl
oracle     7839      1  0 22:55 ?        00:00:00 ora_p00a_orcl
oracle     7841      1  0 22:55 ?        00:00:00 ora_p00b_orcl
oracle     8021      1  0 22:55 ?        00:00:00 ora_w002_orcl
oracle     8023      1  0 22:55 ?        00:00:00 ora_m002_orcl
oracle     8069      1  0 22:55 ?        00:00:00 ora_w003_orcl
oracle     8075      1  0 22:55 ?        00:00:00 ora_w004_orcl
oracle     8079      1  0 22:55 ?        00:00:00 ora_qm02_orcl
oracle     8083      1  0 22:55 ?        00:00:00 ora_q002_orcl
oracle     8085      1  0 22:55 ?        00:00:00 ora_q003_orcl
oracle     8127      1  0 22:56 ?        00:00:00 ora_m003_orcl

再检查一下监听状态

[oracle@node3 response]$ /opt/oracleData/oracle19c/bin/lsnrctl status

最后进入oracle,执行一条sql,正常输出结果,而不是提示oracle未初始化就搭建成功了

[oracle@node3 response]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Sat Apr 19 23:09:55 2025
Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle.  All rights reserved.Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0SQL> select status from v$instance;STATUS
------------
OPENSQL> 

对于19c,在这里要重点说一下,实例化用到的响应文件能自己写是因为templateName=General_Purpose.dbc指定了一个oracle自带的模板,只需要指定其他必须修改的东西就行,比如密码和字符集。所以不要自己上手去直接写监听的响应文件,当然你可以尝试对比11g的,或者网上自己找找研究一下监听能改哪些东西

至于oracle启动和关闭,已经一些需要知道的基本常识,见我之前写的11g搭建文档-》oracle 11g 搭建文档

相关文章:

linux oracle 19c 静默安装

oracle数据库有个比较很抓瞎的事情,不同的版本搭建的大致流程是一样的,但是在实操细节上会有不同,比如操作的脚本位置和配置项等等,这些会变,所以需要时常积累不同版本的文档 这里有一点要说明,之所以使用…...

C++ 的 输入输出流(I/O Streams)

什么是输入输出流 C 的输入输出操作是通过 流(stream) 机制实现的。 流——就是数据的流动通道,比如: 输入流:从设备(如键盘、文件)读取数据 → 程序 输出流:程序将数据写入设备&…...

mybatis-plus开发orm

1、mybatis 使用mybatis-generator自动生成代码 这个也是有系统在使用 2、mybatis-plus开发orm--有的系统在使用 MybatisPlus超详细讲解_mybatis-plus-CSDN博客...

使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片

使用PythonOpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片 import os import cv2 import time# 存放视频文件的多层嵌套文件夹路径 videoPath D:\\videos\\ # 保存抽帧的图片的文件夹路径 savePath D:\\images\\if not os.path.exists(savePath):os.mkdir(savePath) vide…...

电子电器架构 --- DFMEA设计失效模式和后果分析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

C#抽象类和虚方法的作用是什么?

抽象类 (abstract class): 不能直接实例化,只能被继承。 用来定义一套基础框架和规范,强制子类必须实现某些方法(抽象方法)。 可用来封装一些共通的逻辑,减少代码重复。 虚方法 (virtual): …...

C#获取当前方法的命名空间、类名称、方法名称以及方法的参数信息

C#获取当前方法的命名空间、类名称、方法名称以及方法的参数信息 输出示例模块示例 输出示例 获取信息:WindowsFormsApp1.Form1.button1_Click(System.Object sender,System.EventArgs e) 引发的异常:“System.IndexOutOfRangeException”(位于 WindowsFormsApp1.ex…...

Apache SeaTunnel:新一代开源、高性能数据集成工具

Apache SeaTunnel 是一款开源、分布式、高性能的数据集成工具,可以通过配置快速搭建数据管道,支持实时海量数据同步。 Apache SeaTunnel 专注于数据集成和数据同步,主要旨在解决数据集成领域的常见问题: 数据源多样性&#xff1a…...

python+selenium+pytest自动化测试chrome driver版本下载

chrome浏览器chromedriver版本下载地址 https://googlechromelabs.github.io/chrome-for-testing/#stable...

3.1 WPF使用MaterialDesign的介绍1

MaterialDesignInXAML Toolkit 是一个流行的开源 C# WPF 控件库,它实现了 Google 的 Material Design 规范,让开发者可以轻松创建现代化的 WPF 应用程序界面 Material Design 是一个流行的设计语言,由 Google 开发,旨在帮助开发者构建美观且一致的 UI 界面。对于使用 C# 的…...

从 0 到 1 打通 AI 工作流:Dify+Zapier 实现工具自动化调用实战

一、引言:当 AI 遇到工具孤岛 在企业数字化转型的浪潮中,AI 工具的应用早已从单一的对话交互进阶到复杂的业务流程自动化。但开发者常常面临这样的困境:本地开发的 MCP 工具(如 ERP 数据清洗脚本、CRM 工单系统 API)如…...

【算法笔记】如何优雅的进行字符串操作

最近的CCCC天梯赛又出了非常恶心的字符串题~ 在编程竞赛(特别是CCCC天梯赛)中,字符串操作类题目往往看似简单却暗藏陷阱。本文将以Python、Java、C 三剑客为例,总结高频字符串操作的优雅实现方案,助你快速攻克字符串类…...

docker转移镜像

1、场景 有网络环境向无网络环境转移镜像。无法拉取的镜像(外网无法访问)下载镜像转移到服务器上。 2、docker转移 2.1 镜像服务器 保存镜像 列出项目使用的所有镜像 docker images 保存所有镜像为 tar 文件 保存docker镜像 docker save -o my_…...

【Rust 精进之路之第12篇-生命周期·入门】为何需要与显式标注 (`‘a`):让编译器读懂引用的“有效期”

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:悬垂引用的“幽灵”与编译器的“侦探” 在前面的章节中,我们深入学习了 Rust 的所有权系统,以及如何通过引用 (& 和 &mut) 进行借用,从而在不转移所有权的情况下安…...

Vue.js 之 `v-for` 命令详解

Vue.js 之 v-for 命令详解 在 Vue.js 中,v-for 是一个非常强大的指令,用于遍历数组或对象中的数据,并渲染相应的 DOM 元素。无论是在列表展示、表单生成还是动态组件加载中,v-for 都发挥着重要作用。本文将详细介绍 v-for 的用法…...

Spring Boot中`logging.config`配置项的详解及使用说明

以下是Spring Boot中logging.config配置项的详解及使用说明: 1. logging.config 作用 功能:指定自定义日志配置文件的路径,覆盖Spring Boot默认的日志配置。适用场景:当需要深度定制日志行为(如输出格式、文件路径、…...

相机模型--CMOS和CCD的区别

1--CMOS和CCD的工作原理 CCD(Charge Coupled Device,电荷耦合器件): 1. 图像通过光电效应在感光单元中转化为电荷; 2. 每个像素上的电荷被依次“耦合”并传输到芯片的角落,通过一个或几个模拟输出放大器输…...

el-date-picker时间范围 赋值报错问题

问题: 点击时间范围组件右边清除图标,点击近6小时会把设置好的时间赋值给时间范围组件 但是出现报错 原因: 尝试对null值进行属性设置操作:修改一个数组的元素,但此时这个数组是null,而不是预期的数组类型…...

为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号

低速MCU(如8位或16位单片机)单板在辐射测试中出现 200MHz~1GHz的高频辐射信号,看似不合理,但实际上是由多种因素共同导致的。以下是详细原因分析及解决方案: 1.根本原因分析: (1) 时钟谐波与开关噪声 低速MCU的时钟谐…...

【音视频】FFmpeg解封装

解封装 复用器,比如MP4/FLV 解复用器,MP4/FLV 封装格式相关函数 avformat_alloc_context(); 负责申请一个AVFormatContext结构的内存,并进行简单初始化avformat_free_context(); 释放该结构里的所有东西以及该结构本身avformat_close_input();关闭解复…...

使用VHDL语言实现TXT文件的读写操作

使用FPGA进行图像处理时,通常需要将TXT文件中的图像数据读出到TestBench中,并将仿真的结果写入到TXT文件中,用于确认图像处理的结果是否正确。 VHDL中TXT文件的读写操作如下所示, --------------------------------------------…...

OpenLDAP 管理 ELK 用户

文章目录 一、新建 ELK 相关用户组二、配置 Elasticsearch2.1 修改 elasticsearch.yml 配置2.2 使用 API 接口建立角色和用户映射 三、Kibana 验证用户登录 一、新建 ELK 相关用户组 由于后续要将 LDAP 的用户与 ELK 的角色进行映射,所以需先创建几个以 ELK 的角色…...

第十七届“华中杯”大学生数学建模挑战赛题目A题 晶硅片产销策略优化 完整成品 代码 模型 思路 分享

近年来,高纯度晶硅片需求的增长引发了更激烈的市场竞争。晶硅片企业需要在成本控制、利润优化和供需管理之间取得平衡,以提高经营效率和市场竞争力。晶硅片的生产是一个高能耗、高成本的过程,企业效益会受到原材料价格波动、市场需求变化以及…...

iOS 中的虚拟内存 (理解为什么需要虚拟内存)

什么叫“虚拟地址空间”? 一句话:它是 CPU 看得见、App 以为自己独享,但实际上会被内核和硬件(MMU)动态翻译到真实 物理内存 的一整块“虚拟地图”。 1. 背景:为什么要“虚拟”? 需求虚拟地址空…...

网络层理解

网络层理解 网络层是 OSI 模型的第三层,主要负责 跨网络的数据传输,核心任务是 路由选择 和 分组转发。 网络层核心功能 网络层关键协议 协议作用示例IP (IPv4/IPv6)数据包路由和寻址192.168.1.1ICMP网络状态检测和错误报告ping、tracerouteOSPF/BGP动…...

代码随想录训练营38天 || 322. 零钱兑换 279. 完全平方数 139. 单词拆分

322. 零钱兑换 思路: 动规5部曲: 1.确定dp数组以及下标的含义: dp数组表示能凑出零钱的最少硬币数,下标表示要兑换的零钱 2.确定递推公式: j为背包容量,i为物品的下标 dp[ j ] min(dp[ j -coins[ i…...

从Archery到NineData:积加科技驱动数据库研发效能与数据安全双升级

积加科技作为国内领先的企业级数字化解决方案服务商,依托自研的 A4X 数字化平台(https://a4x.io/),专注于为全球范围内的视觉物联网(IoT)设备提供 PaaS/SaaS 服务。致力于运用 AI 技术赋能物联网世界的各类…...

C#委托介绍

委托可以将方法作为参数传递,同时委托也可以自己作为参数传递 委托可分为自定义委托delegate 无返回值的Action 与有返回值的Func委托 也有匿名委托与Lamada 委托支持多播是事件的基础 用处如在分线程调用主线程的UI invoke public delegate string Say(stri…...

解决splice改变原数组的BUG(拷贝数据)

项目场景: 项目中难免遇到需要删除改变数组的方法,去重,删除不要的数据等 问题描述: 但是splice方法会删除掉数据改变原数组,返回的是改变之后的数组,即使你是赋值的还是会影响到原数组的数据 GoodsInfo…...

齐次坐标系下的变换矩阵

理解齐次坐标系下的变换矩阵 文章目录 理解齐次坐标系下的变换矩阵1 引言2 齐次坐标系的简要介绍2.1 齐次坐标系的定义2.2 为什么需要齐次坐标系?2.3 齐次坐标系的特殊性质2.3.1 点和向量的区分2.3.2 投影变换 3 齐次坐标系下的变换矩阵3.1 二维变换矩阵平移变换缩放…...