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

一文学会lua脚本

文章目录

  • 0.前言
    • 背景
    • 应用
  • 1. 学习大纲
    • 1. 学习基本语法:
    • 2. 理解函数和模块:
    • 3. 深入数据结构:
    • 4. 高级特性和技巧:
    • 5. 实践项目:
  • 2. Lua脚本
    • 2.1 学习基本语法
    • 2.2 理解函数和模块
    • 2.3 深入数据结构
    • 2.4 高级特性和技巧
  • 3. 高级特性
    • 3.1. 同时支持面向过程编程和函数式编程:
    • 3.2. 自动内存管理:
    • 3.3. 通用类型的表(table)用于实现数组、哈希表、集合和对象:
    • 3.4. 语言内置模式匹配:
    • 3.5. 闭包:
    • 3.6. 函数作为值:
    • 3.7. 多线程(协同进程)支持:
  • 4. Lua项目实践用途
    • 4.1. 项目应用
    • 4.2. 开源项目:
    • 4.3. 简单示例
  • 5. 参考资料

Lua是一门简洁、高效的脚本语言,用于嵌入应用程序和扩展。我整理了一篇学习入门指南。希望对大家有所帮助。
在这里插入图片描述

0.前言

背景

Lua是一种小巧而强大的脚本语言,最初由巴西里约热内卢天主教大学的研究小组于1993年开发而成。Lua的设计目标是为应用程序提供灵活的扩展和定制功能。它由标准C编写而成,可以在几乎所有操作系统和平台上编译和运行。Lua的定位决定了它不提供强大的库,因此不适用于开发独立应用程序。Lua的嵌入性使得它在应用程序中广泛应用,既可以作为扩展脚本,也可以替代XML、ini等文件格式作为配置文件使用。Lua脚本可以轻松地被C/C++代码调用,也可以反过来调用C/C++函数,这增加了它在应用程序中的灵活性和应用范围。

应用

由于其优雅简洁、可扩展性和高性能,Lua被广泛应用于许多领域,包括游戏开发、嵌入式系统和配置脚本等。它的嵌入性和灵活性使得Lua成为许多应用程序和游戏的首选嵌入式脚本语言。
欢迎开始学习Lua脚本编程!Lua是一种轻量级、高效和可嵌入的脚本语言,广泛应用于游戏开发、嵌入式系统、服务器端编程以及各种应用程序的脚本扩展等领域。Lua的简洁语法和强大功能使其成为学习和使用的理想选择。
我们最常见的中间件 Redis MySQL ProxyMySQL WorkBench都是可以通过lua脚本进行扩展功能

  1. Nginx:通过使用ngx_lua模块,可以将Lua脚本嵌入到Nginx配置中,实现自定义的请求处理、访问控制、缓存管理等功能。

  2. Apache:通过使用mod_lua模块,可以将Lua脚本嵌入到Apache配置中,实现类似Nginx中的自定义功能。

  3. Redis:通过使用Redis的Lua脚本功能,可以在服务器端执行Lua脚本来实现复杂的数据处理和业务逻辑。

  4. OpenResty:一个基于Nginx和Lua的全功能Web应用服务器,它将Nginx与Lua扩展集成在一起,提供了更高级的Web开发功能,如动态路由、API代理、访问控制等

  5. HAProxy:一款负载均衡和代理服务器,通过使用Lua脚本可以扩展其功能,实现自定义的负载均衡策略、请求处理和访问控制等。

  6. Kong:一个可扩展的API网关和微服务管理平台,它使用Lua作为其插件和扩展的脚本语言,可以通过编写Lua插件来实现自定义的API管理和访问控制逻辑。

这只是一小部分支持Lua扩展的中间件和框架示例,实际上还有许多其他中间件和框架也提供了对Lua的扩展支持。通过将Lua嵌入到这些中间件中,你可以编写自定义的逻辑和功能,以满足具体的需求,并与其他语言和技术进行交互。

包括我们玩的很多游戏。

  1. 最著名的魔兽世界它的插件用的也是lua
  2. 仙剑奇侠传五解压游戏到资源目录可以看到游戏到脚本全部是使用Lua语言编写的。
  3. Garry's Mod这个游戏的所有创意工坊插件都是由LUA脚本编写的。
    Don't Starve(饥荒)Klei 开发的一款动作冒险类求生游戏,于2013年4月23日在PC上发行。游戏及所有创意工坊插件都是由LUA脚本编写的。
  4. Roblox美国的一个游戏平台,每个游戏中的行为都是用Lua配合Roblox的API编写的
  5. X-Plane使用Lua语言编写的第三方插件可以通过第三方脚本加载器插件FlyWithLua加载,让插件开发者可以轻松地编写功能强大的插件用以增强X-Plane的模拟效果。
    所以我列举了这么多lua的应用,在实际项目开发过程中最常用的。
    Lua具有良好的嵌入性和扩展性,因此可以与许多中间件和框架集成,以实现自定义功能和脚本扩展。以下是一些常见的中间件和框架,它们支持Lua扩展功能:

1. 学习大纲

1. 学习基本语法:

  • 了解Lua的基本数据类型,如字符串、数字、布尔值等。
  • 学习变量的声明和赋值,了解作用域和变量的生命周期。
  • 掌握Lua的运算符和表达式,包括算术运算、逻辑运算和比较运算符。
  • 学习Lua的控制结构,如条件语句和循环语句。

2. 理解函数和模块:

  • 学习如何定义和调用函数,了解函数参数和返回值的使用。
  • 掌握Lua的标准库函数,如字符串处理、表操作和文件操作等。
  • 学习如何创建和使用Lua模块,以便组织和重用代码。

3. 深入数据结构:

  • 学习Lua的表(table),理解它是Lua中的主要数据结构,并掌握表的创建、访问和操作方法。
  • 了解Lua的其他数据结构,如数组和集合。
  • 学习Lua的元表(metatable)和元方法(metamethod),了解如何实现自定义类型和操作符重载。

4. 高级特性和技巧:

  • 学习闭包(closure)的概念和用法,了解它们在Lua中的重要性和实际应用。
  • 掌握协程(coroutine),了解它们的工作原理和在异步编程中的应用。
  • 学习元编程(metaprogramming)技术,如动态代码生成和运行时代码修改。

5. 实践项目:

  • 参与实际Lua项目的开发,如游戏开发、嵌入式系统和脚本扩展等。
  • 阅读和理解开源Lua项目的源代码,学习其他开发者的实践经验和最佳实践。

2. Lua脚本

2.1 学习基本语法

  1. 基本数据类型:

    • 字符串(String):用一对单引号或双引号括起来的字符序列,例如:“Hello, Lua!”。
    • 数字(Number):表示整数或浮点数,例如:42、3.14。
    • 布尔值(Boolean):表示真(true)或假(false)。
    • 空值(Nil):表示空或无效值。
  2. 变量的声明和赋值:

    • 变量使用字母、数字和下划线组合而成,不能以数字开头。
    • 变量声明不需要指定类型,可以直接赋值。
    • 赋值操作使用等号(=)进行,例如:x = 42
  3. 运算符和表达式:

    • 算术运算符:加法(+)、减法(-)、乘法(*)、除法(/)、取余(%)等。
    • 逻辑运算符:与(and)、或(or)、非(not)等。
    • 比较运算符:等于(==)、不等于(~=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。
  4. 控制结构:

    • 条件语句:使用关键字ifelseifelse来执行不同的代码块,根据条件决定代码的执行路径。
    • 循环语句:使用关键字whileforrepeat来重复执行一段代码。

基本语法和控制结构的用法:

-- 基本数据类型
local str = "Hello, Lua!"
local num = 42
local bool = true
local nilValue = nil-- 变量赋值
local x = 10
x = x + 5-- 条件语句
if x > 10 thenprint("x is greater than 10")
elseif x < 10 thenprint("x is less than 10")
elseprint("x is equal to 10")
end-- 循环语句
for i = 1, 5 doprint("Count: " .. i)
endlocal i = 1
while i <= 5 doprint("Count: " .. i)i = i + 1
endrepeatprint("Count: " .. i)i = i - 1
until i == 0

2.2 理解函数和模块

  1. 定义和调用函数:

    • 使用关键字function定义函数,并在函数体中编写代码块。
    • 函数可以有参数,参数可以是任意类型的值。
    • 函数可以返回一个或多个值,使用关键字return
    • 调用函数时,将参数传递给函数,函数执行相应的操作并返回结果。

定义和调用函数:

-- 定义函数
function add(a, b)return a + b
end-- 调用函数
local result = add(3, 4)
print(result)  -- 输出: 7
  1. 标准库函数:

    • Lua提供了一组丰富的标准库函数,用于处理字符串、表、文件等常见操作。
    • 例如,可以使用string库中的函数进行字符串拼接、查找和替换。
    • 使用table库可对表进行操作,如插入、删除和遍历元素。
    • 使用io库可以进行文件的读写操作。

标准库函数的示例:

local str = "Hello, Lua!"-- 字符串处理
local uppercase = string.upper(str)
print(uppercase)  -- 输出: HELLO, LUA!-- 表操作
local table1 = {1, 2, 3}
table.insert(table1, 4)
print(table.concat(table1, ", "))  -- 输出: 1, 2, 3, 4-- 文件操作
local file = io.open("data.txt", "r")
local content = file:read("*a")
file:close()
print(content)

注意:除了标准库函数,Lua还支持加载和使用自定义的模块。

  1. 创建和使用模块:

    • 模块是一组相关的函数、变量和表,通过模块可以组织和重用代码。
    • 使用关键字modulereturn将函数和数据封装在一个模块中。
    • 使用require函数加载模块,并使用模块中的函数和数据。

模块示例:

-- 创建模块
local mymodule = {}function mymodule.add(a, b)return a + b
endfunction mymodule.subtract(a, b)return a - b
endreturn mymodule

可以通过以下方式使用模块中的函数:

-- 加载模块
local mymodule = require("mymodule")-- 使用模块中的函数
local result = mymodule.add(3, 4)
print(result)  -- 输出: 7

通过理解函数和模块的概念,你可以编写更加模块化和可重用的Lua代码,并使用标准库函数处理字符串、表和文件等常见操作。这将有助于提高代码的组织性和可维护性。

2.3 深入数据结构

深入了解Lua的数据结构是提高编程能力和灵活性的关键。以下是关于Lua的表(table)、数组、集合以及元表(metatable)和元方法(metamethod)的概述:

  1. 表(table):

    • 表是Lua中的主要数据结构,可以看作是关联数组,可以存储任意类型的值。
    • 表的创建使用花括号({}),并可以指定键值对来初始化表。
    • 表的元素可以通过索引访问,索引可以是任意类型的值。
    • 表可以用于实现数组、字典和对象等不同的数据结构。

基本操作示例:

-- 创建表
local myTable = {key1 = "value1", key2 = "value2"}-- 访问表的元素
print(myTable.key1)  -- 输出: value1-- 修改表的元素
myTable.key2 = "new value"
print(myTable.key2)  -- 输出: new value
  1. 数组:

    • 数组是一种特殊的表,其中的键是连续的整数索引(从1开始)。
    • 数组元素可以通过索引访问和修改。
    • 可以使用表的构造器和长度操作符(#)创建和操作数组。

数组的示例:

-- 创建数组
local myArray = {"apple", "banana", "orange"}-- 访问数组元素
print(myArray[1])  -- 输出: apple-- 修改数组元素
myArray[2] = "grape"
print(myArray[2])  -- 输出: grape
  1. 集合:

    • 集合是一种无序且没有重复元素的数据结构。
    • 可以使用表来实现集合,使用元素作为表的键来表示集合的成员。

表实现集合的示例:

-- 创建集合
local mySet = {apple = true, banana = true, orange = true}-- 检查集合成员
print(mySet.apple)  -- 输出: true-- 添加集合成员
mySet.grape = true
print(mySet.grape)  -- 输出: true
  1. 元表(metatable)和元方法(metamethod):

    • 元表是Lua中的一个特殊表,用于定义自定义类型的行为和操作。
    • 元方法是元表中的特殊键,用于指定对象的操作行为,例如相加、相减等。
    • 可以使用元表和元方法来实现对象的操作符重载和自定义类型的行为。

使用元表和元方法的示例:

-- 创建元表
local myMetatable = {}-- 定义元方法
myMetatable.__add = function (a, b)return a + b
end-- 创建对象
local obj1 = 10
local obj2 = 20-- 设置元表
setmetatable(obj1, myMetatable)-- 调用元方法
local result = obj1 + obj2
print(result)  -- 输出: 30

2.4 高级特性和技巧

学习高级特性和技巧可以帮助你更好地利用Lua的强大功能。以下是关于闭包、协程和元编程:

  1. 闭包(closure):

    • 闭包是指一个函数以及与其相关的引用环境的组合。
    • 在Lua中,闭包可以捕获并访问其创建时的变量和状态。
    • 闭包在实际应用中常用于实现回调函数、函数工厂和状态管理等功能。

以下是一个闭包的示例:

-- 创建闭包
function makeCounter()local count = 0return function()count = count + 1return countend
end-- 使用闭包
local counter = makeCounter()
print(counter())  -- 输出: 1
print(counter())  -- 输出: 2

闭包可以在函数内部创建并返回,从而保留了函数创建时的上下文信息和状态。

  1. 协程(coroutine):

    • 协程是一种轻量级的线程,可以在代码中实现协作式的多任务处理。
    • 在Lua中,可以使用coroutine.create创建协程,使用coroutine.resume来启动和恢复协程的执行。
    • 协程可以通过yield来暂停自己的执行,并通过resume从暂停的位置继续执行。

协程的示例:

-- 创建协程
local co = coroutine.create(function()print("Coroutine started")coroutine.yield()print("Coroutine resumed")
end)-- 启动协程
coroutine.resume(co)  -- 输出: Coroutine started-- 恢复协程的执行
coroutine.resume(co)  -- 输出: Coroutine resumed

协程在异步编程和状态机实现中非常有用,可以简化复杂的控制流程和任务调度。

  1. 元编程(metaprogramming):

    • 元编程是指编写能够操作和生成代码的代码。
    • 在Lua中,可以使用加载和执行字符串、动态创建函数和修改函数等技术实现元编程。
    • 元编程在动态配置、代码生成和运行时扩展等领域具有广泛的应用。

元编程的示例,使用动态代码生成:

-- 动态创建函数
local funcString = "return function(a, b) return a + b end"
local dynamicFunc = load(funcString)()-- 调用动态创建的函数
local result = dynamicFunc(3, 4)
print(result)  -- 输出: 7

元编程技术可以通过在运行时生成和修改代码来实现动态和灵活的行为,为应用程序提供更大的自定义能力。

3. 高级特性

3.1. 同时支持面向过程编程和函数式编程:

面向过程编程示例:

-- 定义一个过程来计算斐波那契数列的第n项
function fibonacci(n)local a, b = 0, 1for i = 1, n doa, b = b, a + bendreturn a
end-- 调用过程计算斐波那契数列的第10项
local result = fibonacci(10)
print(result) -- 输出: 55

函数式编程示例:

-- 定义一个函数来计算阶乘
local function factorial(n)if n == 0 thenreturn 1elsereturn n * factorial(n - 1)end
end-- 使用函数式编程计算阶乘
local result = factorial(5)
print(result) -- 输出: 120

3.2. 自动内存管理:

Lua使用垃圾回收机制自动管理内存。开发者无需手动分配和释放内存,垃圾回收器会定期检测不再使用的对象并自动回收其内存。

3.3. 通用类型的表(table)用于实现数组、哈希表、集合和对象:

Lua的表(table)是一种通用的数据结构,可以用来实现数组、哈希表、集合和对象等。下面是使用表实现数组和哈希表的示例:

数组示例:

-- 创建一个数组
local array = {10, 20, 30, 40}-- 访问数组元素
print(array[2]) -- 输出: 20-- 修改数组元素
array[3] = 50-- 遍历数组
for i, value in ipairs(array) doprint(value)
end

哈希表示例:

-- 创建一个哈希表
local hashtable = {name = "John", age = 25, city = "New York"}-- 访问哈希表元素
print(hashtable.name) -- 输出: John-- 修改哈希表元素
hashtable.age = 30-- 遍历哈希表
for key, value in pairs(hashtable) doprint(key, value)
end

3.4. 语言内置模式匹配:

Lua提供了模式匹配功能,可以用于字符串的匹配和替换等操作。以下是一个简单的模式匹配示例:

-- 匹配字符串中的数字部分
local str = "Hello123World"
local pattern = "%d+"
local matched = string.match(str, pattern)
print(matched) -- 输出: 123

3.5. 闭包:

闭包是指可以访问其自身作用域外部变量的函数。以下是一个闭包示例:

-- 创建一个闭包函数
function createCounter()local count = 0return function()count = count + 1return countend
end-- 使用闭包函数创建计数器
local counter = createCounter()-- 调用闭包函数来进行计数
print(counter()) -- 输出: 1
print(counter()) -- 输出: 2

3.6. 函数作为值:

在Lua中,函数可以像其他值一样被赋值给变量、作为参数传递和作为返回值返回。以下是一个函数作为值的示例:

-- 定义一个函数
local function add(a, b)return a + b
end-- 将函数赋值给变量
local operation = add-- 调用函数
local result = operation(5, 3)
print(result) -- 输出: 8

3.7. 多线程(协同进程)支持:

Lua提供了协程(coroutine)作为一种轻量级的多线程解决方案。下面是一个简单的多线程示例:

-- 创建一个协程
local co = coroutine.create(function()for i = 1, 3 doprint("Coroutine", i)coroutine.yield()end
-- 恢复协程的执行
coroutine.resume(co)
-- 输出: Coroutine 1coroutine.resume(co)
-- 输出: Coroutine 2coroutine.resume(co)
-- 输出: Coroutine 3
  1. 支持面向对象编程的关键机制:

通过闭包和表的结合,可以方便地实现面向对象编程的关键机制,如数据抽象、虚函数、继承和重载等。以下是一个简单的面向对象编程示例:

-- 创建一个对象
local person = {name = "John",age = 25,greet = function(self)print("Hello, my name is " .. self.name .. " and I'm " .. self.age .. " years old.")end
}-- 调用对象的方法
person:greet() -- 输出: Hello, my name is John and I'm 25 years old.

可以看出Lua具备了支持面向过程和函数式编程、自动内存管理、通用类型的表、语言内置模式匹配、闭包、函数作为值、多线程支持和通过闭包和表实现面向对象编程的关键机制等特性。这些特性使得Lua成为一种灵活而强大的编程语言。

4. Lua项目实践用途

4.1. 项目应用

  • 游戏开发:Lua在游戏开发中被广泛应用,尤其是作为脚本语言。尝试参与游戏项目,编写游戏逻辑、AI脚本或用户界面等方面的Lua代码。

  • 嵌入式系统:Lua也被用于嵌入式系统中,例如物联网设备和嵌入式控制器。探索嵌入式系统开发,使用Lua编写硬件驱动、控制逻辑或交互接口等。

  • 脚本扩展:许多应用程序和工具提供了Lua作为扩展和脚本语言的功能。尝试将Lua集成到你的项目中,编写脚本来增强应用程序的功能和可定制性。

4.2. 开源项目:

  • 一些知名的开源Lua项目,如LuaJIT、LÖVE、Redis等,阅读它们的源代码。尝试理解项目的架构、设计模式和实现细节。

4.3. 简单示例

演示一个简单的任务管理器,但你可以根据自己的需求进行扩展和定制。你可以添加更多的功能,例如任务优先级、任务状态跟踪等。这个项目可以帮助你理解Lua中的函数、表和方法的使用,以及如何组织和管理简单的任务系统。
我们创建一个任务管理器(createTaskManager),它允许我们添加任务(addTask)并执行这些任务(runTasks)。我们可以定义不同的任务(task1task2),并将它们添加到任务管理器中。最后,我们调用runTasks方法来执行所有的任务

-- 任务管理器-- 创建任务管理器
function createTaskManager()local tasks = {}-- 添加任务function tasks:addTask(task)table.insert(self, task)end-- 执行任务function tasks:runTasks()for _, task in ipairs(self) dotask()endendreturn tasks
end-- 创建任务
local taskManager = createTaskManager()local task1 = function()print("Task 1 executed")
endlocal task2 = function()print("Task 2 executed")
end-- 添加任务到任务管理器
taskManager:addTask(task1)
taskManager:addTask(task2)-- 执行任务
taskManager:runTasks()

运行上述代码以下输出:

Task 1 executed
Task 2 executed

5. 参考资料

  1. Lua官方网站提供了详细的Lua语言参考手册、教程和文档,包括语法、标准库、C API等内容。 可以在官方网站上找到最新版本的文档:https://www.lua.org/docs.html

  2. Nginx官方文档:Nginx官方网站提供了关于ngx_lua模块的文档和示例, 如何在Nginx中嵌入Lua脚本并扩展其功能:https://nginx.org/en/docs/

  3. Apache官方网站提供了有关mod_lua模块的文档和示例, 如何在Apache中使用Lua扩展功能:https://httpd.apache.org/docs/

  4. 如何在Redis中使用Lua来处理数据和实现业务逻辑:https://redis.io/commands/eval

  5. OpenResty官方网站提供了关于在OpenResty中使用Lua的详细文档和示例, 如何使用OpenResty构建高性能的Web应用程序:https://openresty.org/

  6. 如何扩展HAProxy的功能和实现自定义逻辑:https://www.haproxy.com/documentation/

  7. Kong官方文档:Kong官方网站提供了关于在Kong中使用Lua插件的文档和示例,你可以了解如何扩展Kong API网关的功能和实现自定义业务逻辑:https://docs.konghq.com/

相关文章:

一文学会lua脚本

文章目录 0.前言背景应用 1. 学习大纲1. 学习基本语法&#xff1a;2. 理解函数和模块&#xff1a;3. 深入数据结构&#xff1a;4. 高级特性和技巧&#xff1a;5. 实践项目&#xff1a; 2. Lua脚本2.1 学习基本语法2.2 理解函数和模块2.3 深入数据结构2.4 高级特性和技巧 3. 高级…...

学习JAVA打卡第四十二天

正则表达式及字符串的替换与分解 ⑴正则表达式 正则表达式是string对象的字符序列&#xff0c;该字符序列中含有具有特殊意义的字符&#xff0c;这些特殊字符称作正则表达式的元字符。 注&#xff1a;由于“ ”代表任何一个字符&#xff0c;所以在正则表达式中如果想使用普…...

2023-8-25食物链

题目链接&#xff1a;食物链 #include <iostream>using namespace std;const int N 50010;int n, m; int p[N], d[N];int find(int x) {if(p[x] ! x){int t find(p[x]);d[x] d[p[x]];p[x] t;}return p[x]; }int main() {cin >> n >> m;for(int i 1; i…...

为什么要使用IP地址进行定位

IP地址定位是一种以互联网协议地址&#xff08;IP地址&#xff09;为基础的技术&#xff0c;它能够准确地确定一个设备在互联网上的位置。这种技术的应用范围非常广泛&#xff0c;从个人用户到企业机构甚至是国家安全和网络安全等领域都需要使用IP地址定位。 首先&#xff0c;I…...

CSS概念

1、CSS与HTML结合方式 1.1 第一种方式 内联/行内样式 就是在我们的HTML标签上通过style属性来引用CSS代码。 优点:简单方便 &#xff1b; 缺点:只能对一个标签进行修饰。 1.2 第二种方式 内部样式 我们通过<style>标签来声明我们的CSS. 通常<style>标签我们推荐写在…...

淘宝API技术解析,实现关键词搜索淘宝商品(商品详情接口等)

淘宝提供了开放平台接口&#xff08;API&#xff09;来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现&#xff1a; 获取开放平台的访问权限&#xff1a;首先&#xff0c;您需要在淘宝开放平台创建一个应用&#xff0c;获取访问淘宝API的权限。具体的申请步骤和要求可以…...

Redis 7 教程 数据类型 基础篇

🌹 引导 Commands | Redishttps://redis.io/commands/Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)Redis命令大全,显示全部已知的redis命令,redis集群相关命令,近期也会翻译过来,Redis命令参考,也可以直接输入命令进行命令检索。...

-bash: tree: command not found 的解决方法

在学习git操作时发现使用命令tree .git时显示错误 在网上查阅资料后&#xff0c;发现可能是没有安装生成tree的应用&#xff0c;所以我们使用命令安装应用即可 sudo yum install -y tree像这样就是安装成功了 我们再来试试 问题解决了&#xff0c;成功显示出树形结构...

SPI总线协议

简述 SPI协议是一种芯片与芯片之间的通讯&#xff0c;全称是Serial Peripheral Interface SPI通讯采用一主多从模式&#xff0c;产生时钟的一侧称为主机&#xff0c;另一侧称为从机。只有一个主机&#xff08;一般来说可以是微控制器/MCU&#xff09;&#xff0c;但是可以有一…...

Ubuntu20.04配置mysql配置主从复制

ubuntu20.04&#xff1a;mysql主库 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 修改完毕重启 sudo service mysql stop sudo service mysql start主库mysqld.cnf配置 [mysqld] ... # bind-address>->--- 127.0.0.1 # 注释掉&#xff0c;允许外部连接 # mysqlx-b…...

HTTP 服务器(基于go实现)

编写一个 HTTP 服务器&#xff0c;接收客户端 request&#xff0c;并将 request 中带的 header 写入 response header 解析HTTP请求头 import ("fmt""net/http" )func headers(w http.ResponseWriter, r *http.Request) {// 将request中的信息写入到 w中…...

【整数二分】

数的范围 #include<iostream> using namespace std; const int N 100000 11;int n; int q; int a[N];int key;int main(){cin>>n>>q;for(int i0;i<n;i)cin>>a[i];while(q--){cin>>key;//先去找左&#xff08;大于等于&#xff09;再去找右…...

开发一款AR导览导航小程序多少钱?ar地图微信小程序 ar导航 源码

随着科技的不断发展&#xff0c;增强现实&#xff08;AR&#xff09;技术在不同领域展现出了巨大的潜力。AR导览小程序作为其中的一种应用形式&#xff0c;为用户提供了全新的观赏和学习体验。然而&#xff0c;开发一款高质量的AR导览小程序需要投入大量的时间、人力和技术资源…...

Shell 编程快速入门 之 函数基础知识

目录 shell函数基础知识 函数定义 函数名 函数体 参数 返回值 return返回值的含义 return与echo返回值的区别 可变参数函数 自定义库函数 定义库函数 调用库函数 执行结果 递归函数 阶乘函数 斐波那契函数 shell函数基础知识 函数定义 函数名 Shell函数用…...

Flink流批一体计算(18):PyFlink DataStream API之计算和Sink

目录 1. 在上节数据流上执行转换操作&#xff0c;或者使用 sink 将数据写入外部系统。 2. File Sink File Sink Format Types Row-encoded Formats Bulk-encoded Formats 桶分配 滚动策略 3. 如何输出结果 Print 集合数据到客户端&#xff0c;execute_and_collect…...

03.sqlite3学习——数据类型

目录 sqlite3学习——数据类型 SQL语句的功能 SQL语法 SQL命令 SQL数据类型 数字类型 整型 浮点型 定点型decimal 浮点型 VS decimal 日期类型 字符串类型 CHAR和VARCHAR BLOB和TEXT SQLite 数据类型 SQLite 存储类 SQLite 亲和类型(Affinity)及类型名称 Boo…...

LLM-chatgpt训练过程

流程简介 主要包含模型预训练和指令微调两个阶段 模型预训练&#xff1a;搜集海量的文本数据&#xff0c;无监督的训练自回归decoder&#xff1b; O T P ( O t < T ) O_TP(O_{t<T}) OT​P(Ot<T​)&#xff0c;损失函数CE loss指令微调&#xff1a;在输入文本中加入…...

【学习笔记】[ABC274Ex] XOR Sum of Arrays

有点难&#x1f605; 真的是 A B C ABC ABC的难度吗&#x1f605; 非常精妙的哈希题目。 定义矩阵乘法&#xff1a; c i , j ⊕ ( a i , k & b k , j ) c_{i,j}\oplus (a_{i,k}\& b_{k,j}) ci,j​⊕(ai,k​&bk,j​) 之所以可以矩阵乘法是因为满足 ( a ⊕ b )…...

抖音web频道爬虫

抖音web频道爬虫代码&#xff1a; <?php header(Content-Type:application/json; charsetutf-8);//抖音频道爬虫class DouyinChannel{private $app_id 1;private $spider_code 1;private $channels [["channel_name" > "热点","url"…...

sql中的替换函数replace()总结

1&#xff0c;表达式 --replace&#xff08;&#xff09;--语法: REPLACE ( string_expression , string_pattern , string_replacement )--参数&#xff1a;string_expression&#xff1a;字符串表达式string_pattern&#xff1a;想要查找的子字符串string_replacement&#…...

vue3 vite使用 monaco-editor 报错

报错&#xff1a;Unexpected usage at EditorSimpleWorker.loadForeignModule 修改配置&#xff1a; "monaco-editor-webpack-plugin": "^4.2.0",删除不用 版本&#xff1a; "monaco-editor": "^0.28.1", 修改如下&#xff1a; opti…...

微信小程序获取蓝牙权限

要获取微信小程序中的蓝牙权限&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 在 app.json 文件中添加以下代码&#xff1a; "permissions": { "scope.userLocation": { "desc": "需要获取您的地理位置授权以搜索…...

GE 8920-PS-DC安全模块

安全控制&#xff1a; 这个安全模块通常用于实现工业自动化系统中的安全控制功能。它可以监测各种安全参数&#xff0c;如机器运动、温度、压力等&#xff0c;以确保系统在安全范围内运行。 PLC兼容性&#xff1a; 通常&#xff0c;这种安全模块可以与可编程逻辑控制器&#x…...

UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用工具”->“用户默认设置”->“用户界面”->“操作记录”->“…...

W5500-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试&#xff0c;那么本章我们进行UDP组播数据回环测试。 什么是UDP组播&#xff1f; 组播是主机间一对多的通讯模式&#xff0c; 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…...

24 WEB漏洞-文件上传之WAF绕过及安全修复

目录 WAF绕过上传参数名解析:明确哪些东西能修改?常见绕过方法&#xff1a;符号变异-防匹配( " ;)数据截断-防匹配(%00 ; 换行)重复数据-防匹配(参数多次)搜索引擎搜索fuzz web字典文件上传安全修复方案 WAF绕过 safedog BT(宝塔) XXX云盾 宝塔过滤的比安全狗厉害一些&a…...

Python科研绘图--Task03

目录 图类型 关系类型图 散点图的例子 数据分布型图 rugplot例子 分类数据型图 ​编辑回归模型分析型图 多子图网格型图 FacetGrid() 函数 PairGrid() 函数 绘图风格、颜色主题和绘图元素缩放比例 绘图风格 颜色主题 绘图元素缩放比列 图类型 关系类型图 数据集变量…...

ssm端游游戏账号销售管理系统源码和论文

ssm端游游戏账号销售管理系统源码和论文069 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面…...

ssm+vue农家乐信息平台源码和论文

ssmvue农家乐信息平台源码和论文066 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1、研究现状 国外&#xff0c;农家乐都被作为潜在的发展农村经济&#xff0c;增加农民收入的重要手段&#xff0c;让农户广…...

安装启动yolo5教程

目录 一、下载yolo5项目 二、安装miniconda&#xff08;建议不要安装在C盘&#xff09; 三、安装CUDA 四、安装pytorch 五、修改配置参数 六、修改电脑参数 七、启动项目 博主硬件&#xff1a; Windows 10 家庭中文版 一、下载yolo5项目 GitHub - ultralytics/yolov5:…...

封装redis 分布式锁 RedisCallback

RedisCallback 是redis 一个回调接口&#xff0c;在 Redis 连接后执行单个命令&#xff0c;返回执行命令后的结果。 如果在使用 RedisCallback 时&#xff0c;需要自动获取 Redis 连接资源&#xff0c;使用完毕后并释放连接资源。 RedisTemplate 类提供了一个 execute 方法&am…...

代码随想录算法训练营第17期第32天 | 122. 买卖股票的最佳时机 II、455.分发饼干、376. 摆动序列、53. 最大子序和

122. 买卖股票的最佳时机 II 我好像记得这道题是怎么写的&#xff0c;也不知道是福是祸 1. 收集每天的正利润就可以&#xff0c;收集正利润的区间&#xff0c;就是股票买卖的区间&#xff0c;而我们只需要关注最终利润&#xff0c;不需要记录区间 2.局部最优&#xff1a;收集…...

iOS HealthKit 介绍

文章目录 一、简介二、权限配置1. 在开发者账号中勾选HealthKit2. 在targets的capabilities中添加HealthKit。3. infoPlist需要配置权限 三、创建健康数据管理类1. 引入头文件2. 健康数据读写权限3. 检查权限4. 读取步数数据5. 写入健康数据 四、运行获取权限页面 一、简介 He…...

Windows平台Unity下播放RTSP或RTMP如何开启硬解码?

我们在做Windows平台Unity播放RTMP或RTSP的时候&#xff0c;遇到这样的问题&#xff0c;比如展会、安防监控等场景下&#xff0c;需要同时播放多路RTMP或RTSP流&#xff0c;这样对设备性能&#xff0c;提出来更高的要求。 虽然我们软解码&#xff0c;已经做的资源占有非常低了…...

模板方法模式在JDBCTemplate中的应用

上一篇中系统总结了模板模式的原理和使用&#xff0c;提到了模板方法和回调接口。回调接口和模板方法类之间的关系可以看作服务与被服务的关系&#xff0c;模板方法类想要回调接口做事&#xff0c;就要提供相应的资源&#xff0c;接口用提供的资源做事&#xff0c;完事后&#…...

如何在Debian中同步系统时间?Debian 系统时间配置(NTP服务)

A. 更新源,并安装ntpdate apt-get update apt-get install ntpdate ntpdate ntp1.aliyun.com 修改时区 修改设置Linux服务器时区 方法 A 命令 : “tzselect” 方法 B 仅限于RedHat Linux 和 CentOS 命令 : “timeconfig” 方法 C 适用于Debian 命令 : “dpkg-reconfigur…...

模板方法模式(十六)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了代理模式(十五), 如果没有看过, 请观看上一章 一. 模板模式 引用 菜鸟教程里面的 模板模式介绍: https://www.runoob.com/design-pattern/template-pattern.html 在模板模式&#xff08;Template Pattern&#xff09;…...

机器学习笔记之优化算法(十九)牛顿法与正则化

机器学习笔记之优化算法——再回首:牛顿法与正则化 引言回顾&#xff1a;经典牛顿法及其弊端牛顿法&#xff1a;算法步骤迭代过程中可能出现的问题正则化 Hessian Matrix \text{Hessian Matrix} Hessian Matrix与相应问题 引言 本节我们介绍经典牛顿法在训练神经网络过程中的迭…...

Java面试之单例模式的六种实现方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为什么要用单例模式二、单例模式的六种实现2.1 饿汉式2.1.1 饿汉式代码实现2.1.2 饿汉式代码实现要点解析2.1.3 饿汉式代码实现优点2.1.4 饿汉式代码实现缺…...

re正则入门

&#x1f338;re正则入门 正则表达式 (Regular Expression) 又称 RegEx, 是用来匹配字符的一种工具. 在一大串字符中寻找你需要的内容. 它常被用在很多方面, 比如网页爬虫, 文稿整理, 数据筛选等等 简单的匹配 正则表达式无非就是在做这么一回事. 在文字中找到特定的内容, 比如…...

C++ Day5

目录 一、静态成员 1.1 概念 1.2 格式 1.3 银行账户实例 二、类的继承 2.1 目的 2.2 概念 2.3 格式 2.4 继承方式 2.5 继承中的特殊成员函数 2.5.1 构造函数 2.5.2析构函数 2.5.3 拷贝构造函数 2.5.4拷贝赋值函数 总结&#xff1a; 三、多继承 3.1 概念 3.2 格…...

el-element:自定义参数

希望在下拉框、输入框、多选框中添加自定义参数&#xff0c;这在项目中是非常常见的 1、 Select选择器中remote-method方法带自定义参数 :remote-method"(query)>{remoteMethod(query,自定义参数)}" remoteMethod(query, pid){ } 2、 el多选框方法追加参数&…...

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释&#xff1a; 分布式&#xff1a;把一个囊肿的系统分成无数个单独可运行的功能模块 集群&#xff1a; 把相同的项目复制进行多次部署&#xff08;可以是一台服务器多次部署&#xff0c;例如使用8080部署一个&#xff0c;8081部署一个&#xff0c…...

C++day5(静态成员、类的继承、多继承)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.静态数据成员静态成员函数&#xff08;银行账户实例&#xff09; #include <iostream>using namespace std;class BankAccount { private:double balance; //余额static double interest_rate; //利率 p…...

2023MySQL+MyBatis知识点整理

文章目录 主键 外键 的区别&#xff1f;什么是范式&#xff1f;什么是反范式&#xff1f;什么是事务&#xff1f;MySQL事务隔离级别&#xff1f;MySQL事务默认提交模式&#xff1f;MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗&#xff1f;MySQL支持哪几种时间类型&a…...

【随笔】如何使用阿里云的OSS保存基础的服务器环境

使用阿里云OSS创建一个存储仓库&#xff1a;bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行&#xff0c;是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中&#xff0c;需要使用解压工具…...

汽车电子笔记之:AUTOSA架构下的多核OS操作系统

目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小…...

解决华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP协…...

数据结构入门 — 链表详解_双向链表

前言 数据结构入门 — 双向链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表…...

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09; 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09;预测效果基本介绍模型介绍程序设计参…...