Mongodb 副本集名称重命名
副本集重命名
要重命名副本集,您必须关闭副本集的所有成员,然后使用新的副本集名称配置每个成员的数据库。
此过程需要停机。
先决条件
确保您的副本集未分片。重命名过程仅适用于未分片的副本集。
在重命名副本集之前,请 对 MongoDB 部署执行完整备份。
做好备份非常重要,无论如何,请先在测试环境验证后再执行该操作
启用身份验证后,请确保您的用户角色对每个成员数据库中的集合具有 find、insert 和 remove 权限。
db.runCommand({rolesInfo: { role: "xxxxx", db: "yyyyyy" },showPrivileges: true}
)
 
授权
db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}db.createRole({role: "collectionRole",privileges: [{ resource: { db: "local", collection: "system.replset" }, actions: [ "find", "remove", "insert" ] }],roles: []}
)db.grantRolesToUser("admin",[{"role":"collectionRole","db":"admin"}])db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"},{"role" : "collectionRole","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}
 
关闭副本集成员
此步骤需要停机,因为所有副本成员都需要关闭。
当前副本集名称 “set” : “sit_rs1”
{"set" : "sit_rs1","date" : ISODate("2023-11-10T08:08:08.707Z"),"myState" : 1,......"members" : [{"_id" : 1,"name" : "192.168.88.11:27018","health" : 1,"state" : 2,"stateStr" : "SECONDARY",......},{"_id" : 3,"name" : "192.168.88.11:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY",......},{"_id" : 4,"name" : "192.168.88.11:27019","health" : 1,"state" : 2,"stateStr" : "SECONDARY",.....}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1699603684, 1),"signature" : {"hash" : BinData(0,"yDDKmbDiNNhNxzN+xh20IjGyr3o="),"keyId" : NumberLong("7236938018798436354")}},"operationTime" : Timestamp(1699603684, 1)
}
 
关闭副本集成员,三台都关闭
# shutdown 27019
su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27019/data  --port 27019  --shutdown"# shutdown 27018
su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27018/data  --port 27018  --shutdown"# shutdown 27017
su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb/data  --port 27017  --shutdown"
 
重命名副本集
对每个副本集成员执行以下步骤: ( 以其中一台 27019 为例 )
- 在 不带 --replSet 该选项 的情况下在不同端口上启动副本集成员 (如下注释掉 replication 选项。 端口改为 28019 )
 
root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf  
systemLog:destination: filepath: "/data/mongodb27019/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb27019/data"journal:enabled: truedirectoryPerDB: true
processManagement:fork: true  
net:bindIp: localhost,192.168.88.11#port: 27019port: 28019maxIncomingConnections: 65536
security:keyFile: "/data/mongodb27019/data/replsetAIK"clusterAuthMode: "keyFile"authorization: enabled
#replication:
#   replSetName: "sit_rs1"
#   enableMajorityReadConcern: true
 
启动副本集成员:
root@ubuntu-x64_01:/opt# su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --config /etc/mongod27019.conf 2>&1 >/dev/null &"
 
更新副本集名称。
如果使用配置文件,请设置 replication.replSetName 为新名称。replSetName: “sit_rs1” 变更为 replSetName: “local_rs1”
root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf 
systemLog:destination: filepath: "/data/mongodb27019/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb27019/data"journal:enabled: truedirectoryPerDB: true
processManagement:fork: true  
net:bindIp: localhost,192.168.88.11#port: 27019port: 28019maxIncomingConnections: 65536
security:keyFile: "/data/mongodb27019/data/replsetAIK"clusterAuthMode: "keyFile"authorization: enabled
replication:replSetName: "local_rs1"enableMajorityReadConcern: true
 
使用以下命令更新本地数据库中的副本集名称:
> use local 
switched to db local> db.system.replset.find().pretty()
{"_id" : "sit_rs1","version" : 20,"term" : 249,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 1,"host" : "192.168.88.11:27018","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 3,"host" : "192.168.88.11:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 4,"host" : "192.168.88.11:27019","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")}
}> var newId = 'local_rs1'> var doc = db.getSiblingDB("local").system.replset.findOne()> var oldId = doc._id> print(oldId, newId)
sit_rs1 local_rs1> doc._id = newId
local_rs1> db.getSiblingDB("local").system.replset.insertOne(doc)
{ "acknowledged" : true, "insertedId" : "local_rs1" }> db.getSiblingDB("local").system.replset.deleteOne({_id: oldId})
{ "acknowledged" : true, "deletedCount" : 1 }> db.getSiblingDB("local").system.replset.find().pretty()
{"_id" : "local_rs1","version" : 20,"term" : 249,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 1,"host" : "192.168.88.11:27018","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 3,"host" : "192.168.88.11:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 4,"host" : "192.168.88.11:27019","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")}
}
 
关闭副本集成员,在其原始端口上启动副本集成员。如果使用配置文件,请确保将其 replication.replSetName 已经设置为新的副本集名称。
replication:replSetName: "local_rs1"enableMajorityReadConcern: true
 
在其原始端口上启动副本集成员。
root@ubuntu-x64_01:/opt#  cat /etc/mongod27019.conf
systemLog:destination: filepath: "/data/mongodb27019/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb27019/data"journal:enabled: truedirectoryPerDB: true
processManagement:fork: true  
net:bindIp: localhost,192.168.88.11port: 27019maxIncomingConnections: 65536
security:keyFile: "/data/mongodb27019/data/replsetAIK"clusterAuthMode: "keyFile"authorization: enabled
replication:replSetName: "local_rs1"enableMajorityReadConcern: true
 
按上面的操作,在另外两个实例都执行一遍后, 执行修改后,整个副本集状态如下:
local_rs1:PRIMARY> rs.status()
{"set" : "local_rs1","date" : ISODate("2023-11-15T11:25:05.087Z"),"myState" : 1,"term" : NumberLong(251),"syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"votingMembersCount" : 3,"writableVotingMembersCount" : 3,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"lastCommittedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"readConcernMajorityWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"appliedOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"durableOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z")},"lastStableRecoveryTimestamp" : Timestamp(1700047503, 1),"electionCandidateMetrics" : {"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2023-11-15T11:16:43.867Z"),"electionTerm" : NumberLong(251),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1699610346, 1),"t" : NumberLong(249)},"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2023-11-15T11:16:43.877Z"),"wMajorityWriteAvailabilityDate" : ISODate("2023-11-15T11:16:44.535Z")},"members" : [{"_id" : 1,"name" : "192.168.88.11:27018","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 511,"optime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDurable" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDate" : ISODate("2023-11-15T11:25:03Z"),"optimeDurableDate" : ISODate("2023-11-15T11:25:03Z"),"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastHeartbeat" : ISODate("2023-11-15T11:25:04.468Z"),"lastHeartbeatRecv" : ISODate("2023-11-15T11:25:03.448Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "192.168.88.11:27019","syncSourceId" : 4,"infoMessage" : "","configVersion" : 20,"configTerm" : 251},{"_id" : 3,"name" : "192.168.88.11:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 26,"optime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDurable" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDate" : ISODate("2023-11-15T11:25:03Z"),"optimeDurableDate" : ISODate("2023-11-15T11:25:03Z"),"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastHeartbeat" : ISODate("2023-11-15T11:25:04.520Z"),"lastHeartbeatRecv" : ISODate("2023-11-15T11:25:04.285Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "192.168.88.11:27019","syncSourceId" : 4,"infoMessage" : "","configVersion" : 20,"configTerm" : 251},{"_id" : 4,"name" : "192.168.88.11:27019","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 16264,"optime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDate" : ISODate("2023-11-15T11:25:03Z"),"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1700047003, 1),"electionDate" : ISODate("2023-11-15T11:16:43Z"),"configVersion" : 20,"configTerm" : 251,"self" : true,"lastHeartbeatMessage" : ""}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1700047503, 1),"signature" : {"hash" : BinData(0,"FkEFPk5B3ZB364V3c3RkkEoBChI="),"keyId" : NumberLong("7236938018798436354")}},"operationTime" : Timestamp(1700047503, 1)
}
 
回收权限,由于角色是临时授权的,操作结束后,回收该集合的变更权限
local_rs1:PRIMARY> use admin 
switched to db adminlocal_rs1:PRIMARY> db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"},{"role" : "collectionRole","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}local_rs1:PRIMARY> db.revokeRolesFromUser("admin",[{"role":"collectionRole","db":"admin"}])local_rs1:PRIMARY> db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}
相关文章:
Mongodb 副本集名称重命名
副本集重命名 要重命名副本集,您必须关闭副本集的所有成员,然后使用新的副本集名称配置每个成员的数据库。 此过程需要停机。 先决条件 确保您的副本集未分片。重命名过程仅适用于未分片的副本集。 在重命名副本集之前,请 对 MongoDB 部…...
C#WPF属性触发器实例
本文讲解C#WPF属性触发器的实例 在属性触发器中,当一个属性发生更改时,它将立即或动画更改另一个属性 实例 <Windowx:Class="TriggerDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://sch…...
Kotlin 核心语法,为什么选择Kotlin ?
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性。 Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于 Android开发者&#…...
SpringCloud微服务:Nacos的集群、负载均衡、环境隔离
目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务,例如userservice 二级是集群,例如杭州或上海 …...
Selenium+Python做web端自动化测试框架实战
最近受到万点暴击,由于公司业务出现问题,工作任务没那么繁重,有时间摸索seleniumpython自动化测试,结合网上查到的资料自己编写出适合web自动化测试的框架,由于本人也是刚刚开始学习python,这套自动化框架目…...
Linux:安装MySQL服务(非docker方式)
1、下载安装包 下载MySQL安装包,需要Oracle官网的账号 下面是网友提供的账号及密码,亲测有效。 账户:3028064308qq.com 我用的这个,可以登陆 密码:OraclePassword123!Oracle Account: 602205528qq.com Oracle Pass…...
C++实现有理数类 四则运算和输入输出
面试 C 程序员,什么样的问题是好问题? - 知乎 https://www.cnblogs.com/bwjblogs/p/12982908.html...
小鸟飞呀飞
欢迎来到程序小院 小鸟飞呀飞 玩法:鼠标控制小鸟飞翔的方向,点击鼠标左键上升,不要让小鸟掉落,从管道中经过,快去飞呀飞哦^^。开始游戏https://www.ormcc.com/play/gameStart/204 html <canvas width"288&quo…...
Unity 场景烘培 ——unity Post-Processing后处理1(四)
提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、Post-Processing是什么?二、安装使用Post-Processing1.安装Post-Processing2.使用Post-Processing(1).添加Post-process Volume(…...
Burpsuite抓HTTPS证书导入问题
Burpsuite证书导出有两种方法: 第一种方法 1、开启代理后直接在浏览器中输入burp下载CA证书 2、在中间证书颁发机构中导入刚导出的证书 3、导入完成后再把这个证书选择导出,另存为cer格式的文件 4、在受信任的根证书颁发机构中导入刚保存的cer格式证书…...
python保存文件到zip压缩包中
这里我们使用zipfile这个库进行操作,保存压缩文件相对简单,只需要指定文件名即可,不需要读取那个文件: with zipfile.ZipFile("zip文件路径", mode, zipfile.ZIP_DEFLATED) as z:z.write("压缩源文件路径", …...
java发送媒体类型为multipart/form-data的请求
文章目录 public static String sendMultipartFormDataPostRequest(String urlString, String data) throws IOException {String fullUrl urlString "?" data;log.info("完整请求路径为{}", fullUrl);URL url new URL(fullUrl);HttpURLConnection co…...
自定义类使用ArrayList中的remove
Java中ArrayList对基础类型和字符串类型的删除操作,直接用remove方法即可。但是对于自定义的类来说,用remove方法删除不了,因为没有办法确定是否是要删除的对象。 ArrayList中remove源码是: public boolean remove(Object o) {if…...
前端面试考核点【更持续新中】
文章目录 HTMLcssjsVueReactTypeScript移动端&小程序编译/打包/构建npmnodejs微前端网络安全浏览器性能OKR工程化、标准化 HTML Script放在body中间会阻塞吗?defer与async的区别?https://blog.csdn.net/qq_41887214/article/details/124909219 DOM和…...
linux-docker安装
TOC 一,Docker简介 百科说:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制&…...
如何用html css js 画出曲线 或者斜线;
效果图 解题思路 将图片全部定位至中心点,然后x轴就变动translateX ,y轴同理; 这里有两个问题 浏览器: 以左上角为原点0,0 越往下y越大 数学坐标系:以中心点为原点0,0 越往下y越小࿱…...
【错误记录】Uncaught TypeError: m.nodeName.toLowerCase is not a function
描述:在控制台输出上述错误~ 原因:在页面中,使用jQuery 开发时,命名不能和jQuery一起方法属性冲突,比如这里的nodeName,这里换一个不冲突的名字,就解决问题了。...
王颖奇:ONES.ai 上线,以及我的一些思考
ONES.ai 正式上线!为你解锁更智能、更高效的新一代研发管理体验 我们上线了 ONES.ai,当然我们用了公开的 LLM(AI),目前我们最方便使用的就是公开的 LLM,其实是不是 公开的 LLM 也不重要,在未来可预见的时间内ÿ…...
将AI技术与VR元宇宙相结合的整体解决方案
当前人工智能与VR虚拟现实两大热门技术的融合,正引领着人类走向更智能、更数字化、更便捷、更快速的时代。将这两者结合,AI智能检索应用到VR教学中,将为教育带来前所未有的好处。 个性化教学体验 通过AI智能检索,VR教学可以针对每…...
IPKISS Tutorials 3------绘制矩形版图
IPKISS Tutorials 3------绘制矩形版图 方法1------使用Rectangle函数模块导入与放置层设定创建PCell可视化版图这里给大家介绍一下如何在 IPKISS 绘制一个矩形结构的版图。 方法1------使用Rectangle函数 import si_fab.all as pdk import ipkiss3.all as i3class Box(i3.PC…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
