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

Scala 入门指南

Scala 入门指南

目录

  • 简介
  • 环境搭建
  • 基础语法
  • 面向对象编程
  • 函数式编程
  • 集合
  • 模式匹配
  • 特质
  • 隐式转换
  • 并发编程
  • 与 Java 互操作
  • 最佳实践
  • 常见问题

简介

Scala 是一种多范式编程语言,结合了面向对象编程和函数式编程的特性。它运行在 JVM 上,与 Java 完全兼容,并且可以调用 Java 库。

Scala 的主要特性

  • 面向对象和函数式编程的结合
  • 静态类型系统
  • 类型推断
  • 模式匹配
  • 高阶函数
  • 不可变数据结构
  • 并发编程支持
  • 与 Java 互操作

环境搭建

1. 安装 JDK

Scala 需要 JDK 环境,推荐使用 JDK 8 或更高版本。

# 检查 Java 版本
java -version

2. 安装 Scala

方法一:使用 SDKMAN(推荐)
# 安装 SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"# 安装 Scala
sdk install scala
方法二:直接下载安装

从 Scala 官网 下载安装包并安装。

3. 安装 IDE

推荐使用 IntelliJ IDEA 或 VS Code 配合 Scala 插件。

IntelliJ IDEA
  1. 下载并安装 IntelliJ IDEA
  2. 安装 Scala 插件:File → Settings → Plugins → 搜索 “Scala” → 安装
  3. 重启 IDE
VS Code
  1. 安装 VS Code
  2. 安装 “Scala (Metals)” 插件
  3. 安装 “Scala Syntax (official)” 插件

4. 验证安装

# 检查 Scala 版本
scala -version# 启动 Scala REPL
scala

基础语法

1. 变量和常量

// 变量(可变)
var x = 10
x = 20  // 可以修改// 常量(不可变)
val y = 30
// y = 40  // 编译错误,不能修改// 类型声明(可选)
val name: String = "Scala"
var age: Int = 25

2. 基本数据类型

// 数值类型
val byte: Byte = 127
val short: Short = 32767
val int: Int = 2147483647
val long: Long = 9223372036854775807L
val float: Float = 3.14f
val double: Double = 3.141592653589793// 字符
val char: Char = 'A'// 布尔值
val boolean: Boolean = true// 字符串
val string: String = "Hello, Scala!"

3. 字符串操作

val name = "Scala"
val version = 3.0// 字符串插值
val message = s"$name version $version"
val message2 = s"${name.toUpperCase} version ${version + 0.1}"// 多行字符串
val multiline = """|This is a|multiline|string|""".stripMargin

4. 运算符

// 算术运算符
val a = 10
val b = 3
val sum = a + b
val diff = a - b
val product = a * b
val quotient = a / b
val remainder = a % b// 比较运算符
val isEqual = a == b
val isNotEqual = a != b
val isGreater = a > b
val isLess = a < b
val isGreaterOrEqual = a >= b
val isLessOrEqual = a <= b// 逻辑运算符
val p = true
val q = false
val and = p && q
val or = p || q
val not = !p

5. 条件语句

// if-else 语句
val age = 20
val status = if (age >= 18) "成年" else "未成年"// 多分支 if-else
val grade = 85
val level = if (grade >= 90) "A"else if (grade >= 80) "B"else if (grade >= 70) "C"else if (grade >= 60) "D"else "F"

6. 循环

// for 循环
for (i <- 1 to 5) {println(i)
}// 带过滤器的 for 循环
for (i <- 1 to 10 if i % 2 == 0) {println(i)
}// for 推导式
val squares = for (i <- 1 to 5) yield i * i// while 循环
var i = 1
while (i <= 5) {println(i)i += 1
}// do-while 循环
var j = 1
do {println(j)j += 1
} while (j <= 5)

面向对象编程

1. 类定义

// 简单类
class Person {var name: String = ""var age: Int = 0def sayHello(): Unit = {println(s"Hello, my name is $name and I am $age years old.")}
}// 主构造函数
class Person(val name: String, var age: Int) {def sayHello(): Unit = {println(s"Hello, my name is $name and I am $age years old.")}
}// 辅助构造函数
class Person {var name: String = ""var age: Int = 0def this(name: String) {this()this.name = name}def this(name: String, age: Int) {this(name)this.age = age}
}

2. 对象(单例)

// 单例对象
object Singleton {def sayHello(): Unit = {println("Hello from singleton!")}
}// 伴生对象
class Person(val name: String) {def sayHello(): Unit = {println(s"Hello, my name is $name")}
}object Person {def apply(name: String): Person = new Person(name)def unapply(person: Person): Option[String] = Some(person.name)
}

3. 继承

// 基类
class Animal(val name: String) {def makeSound(): Unit = {println("Some sound")}
}// 子类
class Dog(name: String) extends Animal(name) {override def makeSound(): Unit = {println("Woof!")}
}// 抽象类
abstract class Shape {def area(): Doubledef perimeter(): Double
}class Circle(radius: Double) extends Shape {def area(): Double = Math.PI * radius * radiusdef perimeter(): Double = 2 * Math.PI * radius
}

4. 封装

class BankAccount {private var balance = 0.0def deposit(amount: Double): Unit = {if (amount > 0) {balance += amount}}def withdraw(amount: Double): Boolean = {if (amount > 0 && amount <= balance) {balance -= amounttrue} else {false}}def getBalance: Double = balance
}

函数式编程

1. 函数定义

// 基本函数
def add(x: Int, y: Int): Int = x + y// 无参数函数
def getCurrentTime(): Long = System.currentTimeMillis()// 默认参数
def greet(name: String, greeting: String = "Hello"): String = {s"$greeting, $name!"
}// 命名参数
def createPerson(name: String, age: Int, city: String): String = {s"$name is $age years old and lives in $city"
}val person = createPerson(name = "Alice", age = 30, city = "New York")

2. 高阶函数

// 函数作为参数
def applyOperation(x: Int, f: Int => Int): Int = f(x)val double = (x: Int) => x * 2
val square = (x: Int) => x * xval result1 = applyOperation(5, double)  // 10
val result2 = applyOperation(5, square)  // 25// 函数作为返回值
def multiplier(factor: Int): Int => Int = {(x: Int) => x * factor
}val multiplyByTwo = multiplier(2)
val result3 = multiplyByTwo(5)  // 10

3. 匿名函数

// 基本匿名函数
val add = (x: Int, y: Int) => x + y// 简写形式
val numbers = List(1, 2, 3, 4, 5)
val doubled = numbers.map(x => x * 2)
val evenNumbers = numbers.filter(_ % 2 == 0)// 部分应用函数
val sum = (a: Int, b: Int, c: Int) => a + b + c
val addOneAndTwo = sum(1, 2, _)
val result = addOneAndTwo(3)  // 6

4. 柯里化

// 柯里化函数
def add(x: Int)(y: Int): Int = x + yval addOne = add(1)_
val result = addOne(5)  // 6// 非柯里化转柯里化
def nonCurriedAdd(x: Int, y: Int): Int = x + y
def curriedAdd = (nonCurriedAdd _).curried

集合

1. 不可变集合

// List
val list = List(1, 2, 3, 4, 5)
val first = list.head
val rest = list.tail
val newList = 0 :: list  // 在头部添加元素
val concatenated = list ++ List(6, 7)  // 连接列表// Set
val set = Set(1, 2, 3, 3, 4, 4, 5)  // 结果为 Set(1, 2, 3, 4, 5)
val contains = set.contains(3)  // true
val newSet = set + 6  // 添加元素// Map
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
val value = map("a")  // 1
val valueOrDefault = map.getOrElse("d", 0)  // 0
val newMap = map + ("d" -> 4)  // 添加键值对

2. 可变集合

import scala.collection.mutable// 可变 ListBuffer
val buffer = mutable.ListBuffer(1, 2, 3)
buffer += 4  // 添加元素
buffer -= 2  // 移除元素// 可变 Set
val mutableSet = mutable.Set(1, 2, 3)
mutableSet += 4  // 添加元素
mutableSet -= 2  // 移除元素// 可变 Map
val mutableMap = mutable.Map("a" -> 1, "b" -> 2)
mutableMap("c") = 3  // 添加或更新键值对
mutableMap -= "a"  // 移除键值对

3. 集合操作

val numbers = List(1, 2, 3, 4, 5)// 映射
val doubled = numbers.map(_ * 2)  // List(2, 4, 6, 8, 10)// 过滤
val evenNumbers = numbers.filter(_ % 2 == 0)  // List(2, 4)// 扁平化
val nestedList = List(List(1, 2), List(3, 4), List(5))
val flattened = nestedList.flatten  // List(1, 2, 3, 4, 5)// 扁平映射
val flatMapped = nestedList.flatMap(identity)  // List(1, 2, 3, 4, 5)// 折叠
val sum = numbers.foldLeft(0)(_ + _)  // 15
val product = numbers.foldRight(1)(_ * _)  // 120// 归约
val max = numbers.reduce((a, b) => if (a > b) a else b)  // 5

模式匹配

1. 基本模式匹配

def matchNumber(x: Int): String = x match {case 0 => "zero"case 1 => "one"case 2 => "two"case _ => "many"
}// 匹配多个值
def matchMultiple(x: Int): String = x match {case 0 | 1 | 2 => "small"case 3 | 4 | 5 => "medium"case _ => "large"
}

2. 类型模式匹配

def matchType(x: Any): String = x match {case s: String => s"String: $s"case i: Int => s"Integer: $i"case d: Double => s"Double: $d"case _ => "Unknown type"
}

3. 序列模式匹配

def matchList(list: List[Int]): String = list match {case Nil => "Empty list"case List(x) => s"Single element: $x"case List(x, y) => s"Two elements: $x and $y"case x :: rest => s"First element: $x, rest: $rest"
}

4. 样例类模式匹配

// 定义样例类
case class Person(name: String, age: Int)
case class Dog(name: String, breed: String)// 模式匹配
def matchPerson(person: Any): String = person match {case Person(name, age) => s"Person: $name, $age years old"case Dog(name, breed) => s"Dog: $name, breed: $breed"case _ => "Unknown"
}

特质

1. 基本特质

// 定义特质
trait Speaker {def speak(): String
}// 实现特质
class Dog extends Speaker {def speak(): String = "Woof!"
}class Cat extends Speaker {def speak(): String = "Meow!"
}

2. 带实现的特质

trait Animal {def name: Stringdef makeSound(): Stringdef description(): String = s"$name says ${makeSound()}"
}class Dog(val name: String) extends Animal {def makeSound(): String = "Woof!"
}class Cat(val name: String) extends Animal {def makeSound(): String = "Meow!"
}

3. 特质叠加

trait Logging {def log(msg: String): Unit = println(s"Log: $msg")
}trait TimestampLogging extends Logging {override def log(msg: String): Unit = {val timestamp = java.time.Instant.now()super.log(s"[$timestamp] $msg")}
}trait ShortLogging extends Logging {override def log(msg: String): Unit = {if (msg.length > 20) {super.log(msg.substring(0, 20) + "...")} else {super.log(msg)}}
}// 特质叠加顺序从右到左
class MyClass extends ShortLogging with TimestampLogging {def doSomething(): Unit = {log("This is a very long message that should be shortened")}
}

隐式转换

1. 基本隐式转换

// 定义隐式转换
implicit def intToString(x: Int): String = x.toString// 使用隐式转换
val str: String = 42  // 自动转换为 "42"

2. 隐式参数

// 定义带有隐式参数的函数
def greet(name: String)(implicit greeting: String): String = {s"$greeting, $name!"
}// 定义隐式值
implicit val defaultGreeting: String = "Hello"// 使用隐式参数
val message = greet("Alice")  // "Hello, Alice!"// 显式提供参数
val customMessage = greet("Bob")("Hi")  // "Hi, Bob!"

3. 类型类

// 定义类型类
trait Show[A] {def show(a: A): String
}// 为 Int 实现类型类
implicit val intShow: Show[Int] = new Show[Int] {def show(a: Int): String = a.toString
}// 为 String 实现类型类
implicit val stringShow: Show[String] = new Show[String] {def show(a: String): String = a
}// 使用类型类
def printValue[A](a: A)(implicit show: Show[A]): Unit = {println(show.show(a))
}printValue(42)  // 打印 "42"
printValue("Hello")  // 打印 "Hello"

并发编程

1. Future

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global// 创建 Future
val future = Future {Thread.sleep(1000)42
}// 处理 Future 结果
future.onComplete {case scala.util.Success(value) => println(s"Result: $value")case scala.util.Failure(exception) => println(s"Error: ${exception.getMessage}")
}// 使用 map 和 flatMap
val futureResult = future.map(_ * 2).map(_.toString)// 使用 for 推导式
val combinedFuture = for {a <- Future { 10 }b <- Future { 20 }
} yield a + b

2. Actor 模型(Akka)

import akka.actor.{Actor, ActorSystem, Props}// 定义 Actor
class Greeter extends Actor {def receive = {case "hello" => println("Hello, world!")case msg: String => println(s"Received: $msg")case _ => println("Unknown message")}
}// 创建 Actor 系统
val system = ActorSystem("MySystem")
val greeter = system.actorOf(Props[Greeter], "greeter")// 发送消息
greeter ! "hello"
greeter ! "How are you?"// 关闭系统
system.terminate()

与 Java 互操作

1. 调用 Java 代码

// 导入 Java 类
import java.util.Date// 创建 Java 对象
val date = new Date()
println(date)// 调用 Java 方法
val list = new java.util.ArrayList[String]()
list.add("Scala")
list.add("Java")
println(list)

2. Java 调用 Scala 代码

// Scala 类
class ScalaClass(val name: String) {def greet(): String = s"Hello from $name"
}// 伴生对象
object ScalaClass {def create(name: String): ScalaClass = new ScalaClass(name)
}
// Java 代码
ScalaClass scala = ScalaClass.create("Scala");
String greeting = scala.greet();
System.out.println(greeting);

最佳实践

1. 代码风格

  • 使用驼峰命名法
  • 类名首字母大写
  • 方法名首字母小写
  • 使用有意义的变量名
  • 适当添加注释

2. 函数式编程原则

  • 优先使用不可变数据
  • 使用纯函数
  • 避免副作用
  • 使用高阶函数和组合

3. 错误处理

// 使用 Option
def divide(a: Int, b: Int): Option[Int] = {if (b != 0) Some(a / b) else None
}// 使用 Try
import scala.util.Trydef safeDivide(a: Int, b: Int): Try[Int] = Try(a / b)// 使用 Either
def parseNumber(s: String): Either[String, Int] = {try {Right(s.toInt)} catch {case _: NumberFormatException => Left(s"Invalid number: $s")}
}

常见问题

1. 编译错误

  • 类型不匹配
  • 缺少分号
  • 括号不匹配
  • 导入错误

2. 运行时错误

  • 空指针异常
  • 类型转换错误
  • 并发问题

3. 性能问题

  • 内存泄漏
  • 过度使用递归
  • 集合操作效率

4. 调试技巧

  • 使用 println 调试
  • 使用 IDE 调试器
  • 使用日志框架
  • 单元测试

学习资源

  • Scala 官方文档
  • Scala School
  • Scala 编程(书籍)
  • Scala 函数式编程(书籍)
  • Coursera Scala 课程

相关文章:

Scala 入门指南

Scala 入门指南 目录 简介环境搭建基础语法面向对象编程函数式编程集合模式匹配特质隐式转换并发编程与 Java 互操作最佳实践常见问题 简介 Scala 是一种多范式编程语言&#xff0c;结合了面向对象编程和函数式编程的特性。它运行在 JVM 上&#xff0c;与 Java 完全兼容&am…...

GESP2025年3月认证C++八级( 第一部分选择题(11-15))

杨辉三角形&#xff1a; #include <iostream> using namespace std;#define N 35 // 最多支持输出 35 行 int a[N]; // 一维数组&#xff0c;用于存储当前行的杨辉三角数int main() {int n;cin >> n; // 输入要输出的行数for (int i 0; i < n; i) {a[i] …...

Dynamics 365 Business Central Master Data Managerment Setup 主数据管理

#Dynamics 365 BC ERP# #Navision# 引言 在BC中除了之前有一个章节提到的用Code 同步资料&#xff0c; 也可以用内置主数据管理功能来同步资料。 Master Data Management Setup 设置Source Company 为 主要管理主数据的公司 Synchronization Tables 设置需要同步的Table 这…...

深入理解 requestIdleCallback 与大数据加载优化

使用 requestIdleCallback 优化大批量 DOM 操作 —— 以加载 100 万条数据为例 在前端开发中&#xff0c;如果你尝试在短时间内往 DOM 中添加大量元素&#xff0c;比如一次性插入 100 万条数据&#xff0c;页面极有可能卡顿甚至直接崩溃。为了解决这一性能问题&#xff0c;我们…...

【MySQL】索引运算与NULL值问题详解:索引字段应尽量 NOT NULL ,NULL值不能参与部分索引运算

索引运算与NULL值问题详解 不能参与的"部分索引运算"指什么&#xff1f; 这里的"部分索引运算"指的是索引列在某些特定操作或条件下无法被MySQL优化器有效利用的情况&#xff0c;特别是当字段包含NULL值时。主要包括以下几种情况&#xff1a; 1. 比较运…...

STM32 F103 标准库CH452A 4线 数码管驱动芯片显示数码管

公司生产测试需要统一去检查这版CH452A的好坏&#xff0c;网上找了一下没有现成可以用的4线CH452A的驱动程序&#xff0c;所以直接就肝了移植官方的51程序到stm32上面去&#xff0c;亲测可以使用&#xff01;&#xff01; 文末有代码 测试图片&#xff1a; 如你所见我测了一堆…...

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 组件生命周期 父子组件生命周期顺序&#xff1a; 创建时&#xff1a; 父 beforeCreate → 父 created → 父 beforeMount → 子组件生命周期 → 父 mounted 更新时&#xff1a; 父 beforeUpdate → 子组件更新 → 父 updated。 销毁时&#xff1a; 父 beforeDestroy…...

期货数据API对接实战指南

一、期货数据接口概述 StockTV提供全球主要期货市场的实时行情与历史数据接口&#xff0c;覆盖以下品种&#xff1a; 商品期货&#xff1a;原油、黄金、白银、铜、天然气、农产品等金融期货&#xff1a;股指期货、国债期货特色品种&#xff1a;马棕油、铁矿石等区域特色期货 …...

Flask(2): 在windows系统上部署项目2

4 创建并激活虚拟环境 虚拟环境非常有用&#xff0c;可以将多个项目隔离开来。根据我看的教程&#xff0c;貌似以前有多种创建方式&#xff0c;后来官方自带了。目前我就用官方的方式。 4.1 创建虚拟环境 创建部署文件夹(假如目录为d:\project01)&#xff0c;在命令提示…...

Java 中 Synchronized如何保证可见性

在 Java 多线程编程中&#xff0c;可见性问题是指一个线程对共享变量的修改&#xff0c;其他线程能够立即看到。如果没有适当的同步机制&#xff0c;可能会出现线程 A 修改了共享变量的值&#xff0c;但线程 B 仍然使用的是修改前的值&#xff0c;导致程序出现错误。synchroniz…...

33、Python单元测试与pytest框架从入门到精通

Python单元测试与pytest框架从入门到精通 引言 在软件开发领域&#xff0c;完善的测试体系是保证代码质量的生命线。本文将深入探讨Python单元测试的核心技术&#xff0c;从标准库unittest到功能强大的pytest框架&#xff0c;通过20个代码示例展示测试驱动开发&#xff08;TD…...

mvccc

. MVCC (多版本并发控制) 概念&#xff1a; MVCC 是一种并发控制技术&#xff0c;用于在数据库中实现并发事务的读写操作&#xff0c;同时保证事务的隔离性。MVCC 的核心思想是&#xff0c;在数据库中维护数据的多个版本&#xff0c;每个事务在读取数据时&#xff0c;读取的是…...

ONLYOFFICE深度解锁系列.2-Excel 跨文件数据整合实战指南-可道云的另一个严重bug

一、为什么需要跨文件数据整合&#xff1f; 在企业办公和团队协作中&#xff0c;数据往往分散在不同文件中。传统复制粘贴方式存在三大痛点&#xff1a; 版本混乱&#xff1a;源数据更新后需反复同步 错误风险&#xff1a;手动操作易造成数据偏差 效率低下&#xff1a;多文件…...

如何对Flutter应用程序进行单元测试

Flutter单元测试完全指南&#xff1a;从基础到高级实践 面试求职资源 面试试题小程序&#xff1a;涵盖测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、计算机网络知识、Jmeter、HR面试等内…...

多模态大语言模型arxiv论文略读(二十四)

VCoder: Versatile Vision Encoders for Multimodal Large Language Models ➡️ 论文标题&#xff1a;VCoder: Versatile Vision Encoders for Multimodal Large Language Models ➡️ 论文作者&#xff1a;Jitesh Jain, Jianwei Yang, Humphrey Shi ➡️ 研究机构: SHI Labs…...

前端根据后端返回的excel二进制文件流进行导出下载

需求 在vue2中&#xff0c;后端接口返回一个文件流&#xff0c;前端实现excel文件流导出下载功能。 解决方案 利用axios请求后端接口&#xff0c;把后端返回的blob文件流转为一个临时在线url&#xff0c;然后利用a标签实现导出下载功能。 具体实现步骤 1、封装axios请求拦…...

代码随想录刷题|Day20(组合总数,组合总数2、分割回文串)

回溯算法 Part02 组合总数 力扣题目链接 代码随想录链接 视频讲解 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你…...

【NLP 64、基于LLM的垂直领域【特定领域】问答方案】

找不到生活的答案&#xff0c;就先找自己 —— 25.4.17 一、垂直领域问答 1.特点 ① 问答内容通常不存在于通用语料 ② 回答内容对准确性要求较高&#xff0c;召回要求较低&#xff08;可以转人工处理&#xff09; ③ 拓展性和可控性&#xff08;可以根据需求&#xff0c;增、…...

pytest自动化中关于使用fixture是否影响用例的独立性

第一个问题&#xff1a;难道使用fixture 会不会影响用例独立 ✅ 简单回答&#xff1a; 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的&#xff0c;那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&#xff1f;…...

嵌入式物联网开发(二)如何创建N32G45的Keil工程并实现串口打印

如何创建N32G45的Keil工程并实现串口打印 打开Keil IDE, 点击菜单栏Project按钮&#xff0c;选择Create New Project&#xff0c;并在弹出的对话框中选择工程目录&#xff0c;并取一个名字&#xff0c;这里取名bootloader:在弹出的对话框中选择我们的对应的芯片型号: N32G452R…...

基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南

前期知识背景 binlog 什么是binlog 它记录了所有的DDL和DML(除 了数据查询语句)语句&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗。 binlog分类 MySQL Bi…...

Unity入门笔记(缘更)

内容来源SiKi学院的Luna’s Fantasy 文章目录 一、基础知识1.准备2.基础知识1.层级(Layer)2.轴心点3.预制体(Prefab)4.刚体组件(Rigidbody)5.碰撞器组件(BoxCollider) 二、代码1.移动 一、基础知识 1.准备 Unity安装&#xff1a; https://unity.cn 2.基础知识 1.层级(Layer…...

SpringAI+DeepSeek大模型应用开发——2 大模型应用开发架构

目录 2.大模型开发 2.1 模型部署 2.1.1 云服务-开放大模型API 2.1.2 本地部署 搜索模型 运行大模型 2.2 调用大模型 接口说明 提示词角色 ​编辑 会话记忆问题 2.3 大模型应用开发架构 2.3.1 技术架构 纯Prompt模式 FunctionCalling RAG检索增强 Fine-tuning …...

Prometheus thanos架构

Thanos 是一个用于扩展 Prometheus 的高可用性和长期存储的解决方案。它通过整合多个 Prometheus 实例&#xff0c;提供了全局查询、长期存储、以及高可用性的能力。Thanos 的架构主要由以下几个核心组件组成&#xff1a; 1. Sidecar 功能&#xff1a; Sidecar 是与每个 Prom…...

嵌入式软件--stm32 DAY 1

一、STM32概述 1.ARM内核 ARM是一家英国公司。后被日本软银收购。 RISC&#xff08;精简指令集计算机&#xff09; 产品&#xff1a;ARM架构处理器&#xff0c;相关外围组件的电路设计方案。 怎么卖 :知识产权授权 只卖方案不卖具体产品 买了如何用 拿到ARM的方案 设计产…...

【家政平台开发(53)】解锁家政平台高可用秘籍:负载均衡与架构部署

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

Kotlin整数相除精度损失roundToInt

Kotlin整数相除精度损失roundToInt import kotlin.math.roundToIntfun main() {val a 0.0fval delta 0.1ffor (i in 0..10) {val r a i * deltaprintln("float${r} toInt${r.toInt()} (0.5 toInt)${(r 0.5).toInt()} round${Math.round(r)} roundToInt${r.roundToInt…...

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext----RPC源代码分析

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext 第一部分&#xff1a; 1: kd> kc # 00 RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION 01 RPCRT4!OSF_CASSOCIATION::AllocateCCall 02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall 03 RPCRT4!OSF…...

visual studio 2022更改项目名称,灾难性故障(异常来自HRESULT)

系列文章目录 文章目录 系列文章目录前言一、具体步骤二、遇到的问题 前言 在visual studio 2022中&#xff0c;有时候遇到一个很大的工程&#xff0c;我们只是想改写工程名称&#xff0c;而又不想重建项目&#xff0c;如何实现呢&#xff1f; 比如将 Visual Studio 中的 Qt 工…...

用 Deepseek 写的uniapp油耗计算器

下面是一个基于 Uniapp 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…...

【KWDB创作者计划】_KwDB2.2.0深度实践:从存储引擎到物联网场景的多模数据库实战

简介 本文基于KwDB2.2.0最新版本&#xff0c;通过存储引擎原理、跨模计算实战和物联网场景落地三个维度&#xff0c;结合代码示例与实操案例&#xff0c;系统解析KwDB的分布式多模能力。从零搭建物联网数据平台&#xff0c;探索多模数据融合的创新价值&#xff0c;助你掌握新一…...

linux 学习 2.vim学习指南

vim vim是一款功能及其强大的编辑器&#xff0c;我们需要掌握其基本的操作才能数量的使用他 如果你想要功能更加丰富的vim获得代码补全之类的复杂功能&#xff0c;强烈建议你安装一下vimplus&#xff0c;可以参考这里vimplus 官方教程 建议学习的时候直接跟着教程一步步操作…...

深度学习在自动驾驶车辆车道检测中的应用

引言 自动驾驶技术是人工智能领域的一个前沿方向&#xff0c;而车道检测是实现自动驾驶的关键技术之一。通过识别和跟踪车道线&#xff0c;自动驾驶车辆能够保持在车道内行驶&#xff0c;提高行车安全。本文将详细介绍如何使用深度学习技术进行车道检测&#xff0c;并提供一个…...

深度学习-Torch框架-2

八、自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。 1. 基础概念 张量 Torch中一切皆…...

FlinkCDC初始化时报错“IllegalArgumentException: Unexpected input: “异常定位与原理分析

本篇是纯技术文章,是排查线上问题的真实记录。这个异常我在网上没搜到相同案例,所以特此记录下,方便后期回顾。 一、背景 利用FlinkCDC3.0动态监听数据库Schema变更的能力开发了一个生产数据库DDL语句变更审计告警的服务,这两天突然发现服务一直报错,经过4个小时的排查,…...

从代码学习深度学习 - Transformer PyTorch 版

文章目录 前言1. 位置编码(Positional Encoding)2. 多头注意力机制(Multi-Head Attention)3. 前馈网络与残差连接(Position-Wise FFN & AddNorm)3.1 基于位置的前馈网络(PositionWiseFFN)3.2 残差连接和层规范化(AddNorm)4. 编码器(Encoder)4.1 编码器块(Enco…...

多模态大语言模型arxiv论文略读(二十五)

ManipLLM: Embodied Multimodal Large Language Model for Object-Centric Robotic Manipulation ➡️ 论文标题&#xff1a;ManipLLM: Embodied Multimodal Large Language Model for Object-Centric Robotic Manipulation ➡️ 论文作者&#xff1a;Xiaoqi Li, Mingxu Zhang…...

LVS+Keepalived+dns高可用项目架构

一、搭建DNS服务 配置主服务器 1.修改核心配置文件 [rootDNS-master ~]# vim /etc/named.conf options { listen-on port 53 { 192.168.111.107;192.168.111.100; }; directory "/var/named"; }; zone "haha.com" IN { ty…...

C#日志辅助类(Log4Net)实现

一、Log4Net类库安装 在解决方案中项目上右键单击,选择“管理NuGet程序包”,在浏览窗口的搜索框输入log4net进行搜索,安装搜索出的第一项,如下图。 二、辅助类实现(Log4NetHelper) using log4net.Appender; using log4net.Config; using log4net.Layout; using log4net…...

【FFmpeg从入门到精通】第二章-FFmpeg工具使用基础

1 ffmpeg常用命令 ffmpeg在做音视频编解码时非常方便&#xff0c;所以在很多场景下转码使用的是ffmpeg&#xff0c;通过 ffmpeg --help可以看到 ffmpeg 常见的命令大概分为6个部分&#xff0c;具体如下。 ffmpeg信息查询部分公共操作参数部分文件主要操作参数部分视频操作参数…...

论文阅读:2022 ACL TruthfulQA: Measuring How Models Mimic Human Falsehoods

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 TruthfulQA: Measuring How Models Mimic Human Falsehoods https://arxiv.org/pdf/2109.07958 https://www.doubao.com/chat/3130551217163266 https://github.com/sylin…...

基于C++(MFC)实现的文件管理系统

基于 MFC 的文件管理系统 第一章 题目解读与要求分析 1 实习题目 实现一个文件系统。 2 功能要求 界面上显示树形目录结构 a&#xff09;根节点是“我的电脑” b&#xff09;“我的电脑”下有几个盘符&#xff08;C、D、E 等&#xff09;就有几个子节点&#xff0c;递归…...

selenium 实现模拟登录中的滑块验证功能

用python在做数据采集过程中&#xff0c;经常需要用到模拟登录&#xff0c;经常遇到各种图片、文字甚至短信等验证&#xff0c;如果能通过脚本的方便实现验证&#xff0c;就可以自动帮我更高效地收集数据。Selenium 是一个开源的 Web 自动化测试工具&#xff0c;最初是为网站自…...

Oracle 19c部署之数据库软件安装(二)

在完成了Oracle Linux 9的初始化配置之后&#xff0c;我们准备安装Oracle 19c数据库软件。 Oracle数据库支持两种主要的安装方式&#xff1a;图形化安装和静默安装。这两种方法各有优缺点&#xff0c;选择哪种取决于你的具体需求、环境配置以及个人偏好。 图形化安装 图形化安…...

Paramiko 使用教程

目录 简介安装 Paramiko连接到远程服务器执行远程命令文件传输示例 简介 Paramiko 是一个基于 Python 的 SSH 客户端库&#xff0c;它提供了在网络上安全传输文件和执行远程命令的功能。本教程将介绍 Paramiko 的基本用法&#xff0c;包括连接到远程服务器、执行命令、文件传输…...

从EOF到REOF:如何用旋转经验正交函数提升时空数据分析精度?

目录 1. 基本概念与原理2. 应用场景3. 与传统EOF的区别4. 技术实现5. 其他领域中的“REOF”参考资料 REOF 的输入是多个地区在不同时间的气候数据&#xff08;如温度或降雨量&#xff09;&#xff0c;它的作用是通过旋转计算找出这些数据中最主要的变化规律&#xff0c;输出则是…...

VS-Code创建Vue3项目

1 创建工程文件 创建一个做工程项目的文件夹 如&#xff1a;h5vue 2 cmd 进入文件 h5vue 3 输入如下命令 npm create vuelatest 也可以输入 npm create vitelatest 4 输入项目名称 项目名称&#xff1a;自已输入 回车 可以按键盘 a (全选) 回车&#xff1a; Playwright…...

JESD204B接收器核心实现和系统级关键细节

目录 1.通道偏移 2.弹性缓冲器的实现 3.接受延迟 4.RX端到端延迟 5.计算端到端延迟 6.实现可重复的延迟 1.通道偏移 JESD204B接收器核心已经过验证,其功能具有高达8个字节的通道到通道偏斜。 2.弹性缓冲器的实现 在JESD204B设备中,接收通道对齐弹性缓冲区是在分布式…...

NLP高频面试题(四十七)——探讨Transformer中的注意力机制:MHA、MQA与GQA

MHA、MQA和GQA基本概念与区别 1. 多头注意力(MHA) 多头注意力(Multi-Head Attention,MHA)通过多个独立的注意力头同时处理信息,每个头有各自的键(Key)、查询(Query)和值(Value)。这种机制允许模型并行关注不同的子空间上下文信息,捕捉复杂的交互关系。然而,MHA…...

k230学习笔记-疑难点(1)

1.出现boot failed with exit code 19: 需要将k230开发板的btoot0拨到ON 2.出现boot failed with exit code 13: 说明k230开发板的固件烧录已经丢失&#xff0c;需要重新烧录 *** 注意重新烧录时需要将btoot0重新拨到OFF&#xff0c;才会弹出加载固件需要的通用串行总线&…...