Chisel基础之Scala

2023-11-08

前言

Scala is yet another programming language which supports common programming paradigms. We chose to use it for several reasons:

Scala是一种支持常见编程范例的编程语言。我们选择使用它有几个原因:

  • 它能更好的嵌入领域专用语言(DSL)。
  • 它拥有强大而优雅的库,包含各种数据集合。
  • 它具有严格的类型系统,有助于在开发周期的早期(编译时)捕获大量错误。
  • 它具有强大的函数式编程方式。
  • Chisel更好发音。

之后我们讨论Chisel时,以上这些要点都会慢慢显现出来。不过现在,我们将专注于阅读和编写基本的Scala代码。

 变量和常量 - var 和 val

 创建变量和常量的语句前面分别带有关键字varval。通常的做法是尽可能使用val。这是为了防止之后给变量错误地重新赋值,从而使代码难以阅读。

var numberOfKittens = 6
val kittensPerHouse = 101
val alphabet = "abcdefghijklmnopqrstuvwxyz"
var done = false

numberOfKittens: Int = 6
kittensPerHouse: Int = 101
alphabet: String = "abcdefghijklmnopqrstuvwxyz"
done: Boolean = false

首先要注意的是,与Java和C不同,Scala语句结尾通常不需要分号。当有换行符时,Scala会自动判断是否语句结束。例如,当行上的最后一个符号是操作符的话,Scala通常可以判断单个语句是否分布在多行中。需要分号的唯一情况是您希望将多个语句放在一行上的时候。

上面的常量和变量很清楚。两个变量var可以被重新赋值,而两个常量val在被创建之后就是不可变的。

numberOfKittens += 1

// kittensPerHouse = kittensPerHouse * 2 // 这一句会出错; 常量kittensPerHouse不可更改

println(alphabet)
done = true


abcdefghijklmnopqrstuvwxyz

条件语句

Scala中的条件语句与其他编程语言类似。

// 一个简单的条件语句 (这是注释)
if (numberOfKittens > kittensPerHouse) { 
    println("Too many kittens!!!") 
}
// 如果只有一行语句的话大括号不是必须的。但是,Scala代码规范
// 希望只有在"else"部分出现的时候才省略大括号。
// (最好不要像下面这样...)
if (numberOfKittens > kittensPerHouse) 
    println("Too many kittens!!!")

// 下面的if语句包含else部分,所以可以在这里省略大括号
if (done) 
    println("we are done")
else 
    numberOfKittens += 1

// 下面是“else if”部分
// 代码规范上,因为代码块超过一行,所以都使用了大括号
if (done) {
    println("we are done")
}
else if (numberOfKittens < kittensPerHouse) {
    println("more kittens!")
    numberOfKittens += 1
}
else {
    done = true
}




we are done
we are done

但在Scala中,“if”语句会返回值。它的值由所选分支的最后一行语句决定。这非常强大,特别是在函数中或类中初始化值的时候。类似下面这样:

val likelyCharactersSet = if (alphabet.length == 26)
    "english"
else 
    "not english"

println(likelyCharactersSet)




english
likelyCharactersSet: String = "english"

我们创建了常量likelyCharactersSet,并且它的值是在运行时才被确定。

方法(Methods),函数(Functions)

方法使用关键字def定义。在这里,我们不予区分将它们也称为函数。函数的参数由逗号分隔,包含参数的名称,类型以及默认值(可选)。为清楚起见,应指定返回类型。

没有任何参数的Scala函数定义后面不需要空括号。这使得类的成员变量要改成函数,并来自于计算结果的情况下更加容易。按照惯例,不改变任何东西的无参数的函数(调用它们不会改变任何东西,它们只是返回一个值)不使用括号;而会给这个类带来改变的函数(也许它们会改变类里面的变量或打印出来东西)要使用括号。

简单的声明(Declarations)

// 简单的乘以一个系数, 例如,times2(3) 返回 6
// 代码块只有一行,所以省略了大括号
def times2(x: Int): Int = 2 * x

// 更复杂的函数
def distance(x: Int, y: Int, returnPositive: Boolean): Int = {
    val xy = x * y
    if (returnPositive) xy.abs else -xy.abs
}





defined function times2
defined function distance

函数的重载

重载意味着可以使用相同的函数名称,而参数及其类型不同,这时候编译器会自动确定应该调用哪个版本的函数。但是应该尽量避免重载函数。

//In
// 函数重载
def times2(x: Int): Int = 2 * x
def times2(x: String): Int = 2 * x.toInt

times2(5)
times2("7")




//Out
defined function times2
defined function times2
res5_2: Int = 10
res5_3: Int = 14

递归和嵌套函数调用

大括号定义代码的范围。在一个函数的范围内可以存在递归或嵌套调用。在某个范围内定义的函数只能在该范围内访问。

//In
/** 打印一个由“X”组成的三角形
  * (这是另一种注释的方式)
  */
def asciiTriangle(rows: Int) {
    
    // 这里很有趣:将字符串"X"乘以一个整数会得到由许多重复"X"构成的字符串
    def printRow(columns: Int): Unit = println("X" * columns)
    
    if(rows > 0) {
        printRow(rows)
        asciiTriangle(rows - 1) // 这里是递归
    }
}

// printRow(1) // 这样调用会出错,因为printRow不是定义在当前作用域中
asciiTriangle(6)
XXXXXX
XXXXX
XXXX
XXX
XX
X


//Out
defined function asciiTriangle

列表(Lists)

Scala实现了各种聚合或序列对象。列表list与数组array非常类似,但支持更多访问或追加元素的操作。

//In
val x = 7
val y = 14
val list1 = List(1, 2, 3)
val list2 = x :: y :: y :: Nil       // 另一种列表的构造方法

val list3 = list1 ++ list2           // 连接两个列表
val m = list2.length
val s = list2.size

val headOfList = list1.head          // 取列表的第一个元素
val restOfList = list1.tail          // 得到去掉第一个元素的新的列表 

val third = list1(2)                 // 列表的第三个元素(下标从0开始)

//Out
x: Int = 7
y: Int = 14
list1: List[Int] = List(1, 2, 3)
list2: List[Int] = List(7, 14, 14)
list3: List[Int] = List(1, 2, 3, 7, 14, 14)
m: Int = 3
s: Int = 3
headOfList: Int = 1
restOfList: List[Int] = List(2, 3)
third: Int = 3

for 语句

Scala有for语句,完全类似于别的语言,可以用来进行遍历。

for (i <- 0 to 7) { print(i + " ") }
println()



0 1 2 3 4 5 6 7 

如果上面用的是until而不是to的话,遍历就是从0到6(不包含7)。

for (i <- 0 until 7) { print(i + " ") }
println()



0 1 2 3 4 5 6 

for语句加入by表示步长。下面的代码会打印出从0到10之间的偶数。

for(i <- 0 to 10 by 2) { print(i + " ") }
println()



0 2 4 6 8 10 

如果你有一个集合并想要访问所有元素,你可以使用for来作为迭代器(iterator),类似于Java或者Python中一样。下面的代码里,我们列出4个随机整数,然后对它们求和。

val randomList = List(scala.util.Random.nextInt(), scala.util.Random.nextInt(), scala.util.Random.nextInt(), scala.util.Random.nextInt())
var listSum = 0
for (value <- randomList) {
  listSum += value
}
println("sum is " + listSum)



sum is -381288124
randomList: List[Int] = List(-348678184, 2118016949, 2118650181, 25690226)
listSum: Int = -381288124

Scala中的for可以非常直观地用于遍历。但是还有一类称为comprehensions的函数,在许多场合下使用起来更为方便,例如可以更容易地对数组元素求和。这些将在后面的章节中予以介绍。

怎样读Scala代码

能够阅读Scala代码并理解常见的命名约定,设计模式和最佳实践是成为有效的Chisel程序员重要的一步。代码的重用是Chisel的优势之一,但这需要阅读并理解别人的代码。有效地解析别人的代码也可以更容易地寻求帮助,例如利用StackOverflow等资源。

接下来这一节会展示一些常见的代码模式。


包(Packages)和导入(Imports)

package mytools
class Tool1 { ... }

上面定义了一个包(Packages,当需要在别的代码中导入的时候,如下:

import mytools.Tool1

注意:包的名字必须和路径的层级一致。这不是强制的要求,但如果不遵守的话,可能会产生一些难以诊断的问题。按照约定,包的名称应该是小写的,不包含下划线之类的分隔符。这样的名称有时会变得阅读很困难,一种方法是添加另一层层次结构,例如package good.tools。尽你所能遵循这些约定吧,但是Chisel本身也存在一些不符合这些规则的情况。

如上所示,import语句用来告诉编译器您需要使用其他的库。在Chisel编程时常见导入如下面所示:

import chisel3._
import chisel3.iotesters.{ChiselFlatSpec, Driver, PeekPokeTester}

第一行导入的是chisel3包中的所有类和方法;下划线在这里用作通配符。第二行表示从chisel3.iotesters包中导入指定的类。


Scala是一个面向对象的编程语言

Scala是一个面向对象的编程语言,了解这一点很重要,这也是Scala和Chisel的一个很大的优势。

  1. 变量是对象。
  2. 运用val声明的常量也是对象。
  3. 甚至literal也是对象(例如,1,2,3,字符串等)。
  4. 函数本身也是对象。这之后会详细说明。
  5. 对象(Object)是类(class)的实例。
    1. 事实上,面向对象中的对象(object) 在Scala中被称为实例。
  6. 在定义一个类的时候,需要指定:
    1. 类中的数据(valvar
    2. 类的操作,称为方法(method)或者函数(function)。这些方法可以通过该类的实例来调用。
  7. 类可以从其他类继承。
    1. 被继承的类叫做父类,继承的类叫做子类。
    2. 在这种情况下,子类继承父类的所有数据成员和方法。
    3. 子类也可以扩展或重载从父类继承的这些方法。
  8. 类也可以继承自特征(traits)。Traits可以被看作是轻量级的类,它可以允许多继承。
  9. (Singleton)Object对象在Scala中是一个特殊的类。
    1. 它们不是上面所说的对象,上面那些我们称之为实例。

我们接下来会看怎么创建对象:


类的例子

下面是一个创建Scala类的例子:

// WrapCounter从0开始计数,一直到最大值然后归零
class WrapCounter(counterBits: Int) {

  val max: Long = (1 << counterBits) - 1
  var counter = 0L
    
  def inc(): Long = {
    counter = counter + 1
    if (counter > max) {
        counter = 0
    }
    counter
  }
  println(s"counter created with max value $max")
}



defined class WrapCounter

在上面的代码中:

  • class WrapCounter --这是类WrapCounter的定义.
  • (counterBits: Int) -- 创建一个WrapCounter实例需要一个整数类型的参数,名称为counterBits
  • 大括号 ({}) 里面是这个类的代码块。大部分的类在这里面定义变量,常量和方法。
  • val max: Long = -- 这个类包含一个叫max的成员常量, 类型是Long,并且在创建类的实例时被初始化。
  • (1 << counterBits) - 1 计算counterBits这么多比特所能表示的最大值。max在这里由val创建,所以它是常量,之后不能被改变。
  • 变量 counter 在这里被创建出来,并且赋初值为 0L , “L” 在这里表示0是一个长整型,所以编译器也会推定 counter 为长整型。
  • max 和 counter通常被称为该类的 成员变量(或常量)
  • 该类定义了一个叫inc的方法,该方法不需要参数并且返回一个长整型 Long 的值。
  • 方法 inc 包含如下代码:
    • counter = counter + 1 递增 counter.
    • if (counter > max) { counter = 0 } 检查counter是否大于最大值max,如果大于的话,重置成0。
    • counter -- 最后这一行很重要
      • 一个代码块的最后一行被认为是该代码块的返回值,调用者可以使用或忽略该返回值。
      • 这是一个通用的办法;例如,在ifelse语句中,真假分支都可以是代码块,所以if...else语句也可以返回值:例如val result = if (10 * 10 > 90) 'greater' else 'lesser'的返回值就是'greater'。
    • 所以在这里,方法inc的返回值就是counter
  • println(s'counter created with max value $max') 在标准输出stdout中打印出一个字符串。由于println直接位于定义类的代码块中,所以它会在每一次创建该类的实例时都会被运行。
  • 这里打印的字符串是一个被解析(interpolated)的 字符串。
    • 在引号前面的 s 表示这是一个被解析的字符串。
    • 被解析的字符串会在运行的时候才被处理。
    • 字符串中的 $max 会被变量max的值所替换。
    • 如果$ 后面跟的是任意Scala代码块的话,这个代码块可以包含任何Scala语句。
      • 例如,println(s'doubled max is ${max + max}').
      • 这个代码块的返回值将会替换掉字符串中的 ${...}
      • 如果返回值不是字符串,则会被转换为1;理论上scala中几乎每个类型都可以隐式地转换为字符串)。
    • 除非您正在调试,否则应该避免类似这样每次创建类的实例时都要打印的内容,以避免标准输出显示了太多东西。

创建类的实例

让我们使用上面的例子来创建一个类的实例。 Scala实例是通过关键字new来创建的。

val x = new WrapCounter(2)



counter created with max value 3


x: WrapCounter = ammonite.$sess.cmd12$Helper$WrapCounter@8833366

您可能也会看到不使用关键字new来创建的实例,例如val y = WrapCounter(6)

这样的情况经常发生,特别值得注意,但需要使用companion对象,稍后会对此进行详细说明。

下面的代码会使用刚刚创建出来的实例(试试运行两次下面的代码)。

x.inc() // 递增计数器

// 实例x的成员变量对外部可见(除非它们被声明为私有成员)
if(x.counter == x.max) {              
    println("counter is about to wrap")
}

x inc() // Scala允许函数调用的时候省略“.”。这对于嵌入的领域专用语言(DSL)很有用处



res14_0: Long = 1L
res14_2: Long = 2L

代码块

代码块由大括号分隔,可以包含零行或多行Scala代码。代码块的最后一行就是该代码块的返回值(返回值可以被调用者忽略)。没有任何代码的代码块会返回一个类似于null的特殊对象,名为Unit。Scala中有非常多的代码块:例如类的定义,函数和方法的定义,也可以是if语句的子句,或者构成for语句主体,等等。

参数化的代码块

代码块也可以带参数。在定义类或者方法的时候,这些参数看起来与其他传统编程语言类似。在下面的例子中,cs是代码块的参数:

// 只包含一条语句的代码块不需要大括号
def add1(c: Int): Int = c + 1

class RepeatString(s: String) {
  val repeatedString = s + s
}



defined function add1
defined class RepeatString

重要:还有另一种方法可以参数化代码块。下面是例子:

val intList = List(1, 2, 3)
val stringList = intList.map { i =>
  i.toString
}



intList: List[Int] = List(1, 2, 3)
stringList: List[String] = List("1", "2", "3")

代码块被传递给List类的map方法。map方法需要一个代码块的参数,从而为列表的每个成员调用该代码块。这里传入的代码块的意思是将元素转换为字符串表示。Scala在许多地方都可以用类似的语法,您可能在不同的地方以不同的方式看到它。这种类型的代码块被称为匿名函数,稍后的章节中会介绍有关匿名函数更详细的信息。

这里的目标是帮助您在遇到时能够识别它们。随着更多地使用Scala,这样的代码会看起来更加舒适和熟悉。作者更倾向于使用特定的风格,这里也有个人喜好的问题。使用一行表示的代码(One-liner)会使代码看起来更紧凑,而使用复杂的代码块通常看起来更容易懂。为了使沟通和协作更容易,可以阅读。


用参数名进行调用,以及默认参数

看下面的方法定义:

def myMethod(count: Int, wrap: Boolean, wrapValue: Int = 24): Unit = { ... }

调用方法时,可以同时使用参数名和参数值:

myMethod(count = 10, wrap = false, wrapValue = 23)

使用参数名传递参数的话可以在调用时不在乎参数的顺序:

myMethod(wrapValue = 23, wrap = false, count = 10)

对于经常调用的方法,参数的顺序可能很明显。但是对于不太常用的方法,特别是布尔参数,调用时使用参数名可以使您的代码更具可读性。如果方法需要传递的参数许多都是相同的类型,使用参数名也可以减少出错的可能性。类的参数也一样(通常只是类的构造函数的参数)。

当特定的参数有默认值的时候, 调用者只需要(通过参数名)传入那些没有默认值的参数即可。例如在上面,参数wrapValue的默认值是24。 所以下面的代码:

myMethod(wrap = false, count = 10)

会认为wrapValue参数已经传入了24.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chisel基础之Scala 的相关文章

  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • Scala:类型参数中的问号

    我试图理解以下代码 来自 Scalaz 库 def kleisliIdApplicative R Applicative Kleisli Id R 我假设一种形式T P0 是一个带有参数的类型构造函数 但是我无法找到解释类型参数中问号用法的
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的
  • 如何通过删除 Scala 中的一个元素来从列表中获取所有可能的子列表?

    我有一个清单List 1 2 3 4 并希望通过删除一个元素来获得所有子列表 List 2 3 4 List 1 3 4 List 1 2 4 List 1 2 3 做到这一点最简单的方法是什么 如果你的意思是 离开每个position在列
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 在没有匹配器的情况下如何跳过specs2中的测试?

    我正在尝试使用 scala 中的 specs2 测试一些与数据库相关的内容 目标是测试 db running 然后执行测试 我发现如果数据库关闭 我可以使用 Matcher 类中的 orSkip 问题是 我正在获取一个匹配条件的输出 作为
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • InvalidRequestException(为什么:empid 如果包含 Equal,则不能被多个关系限制)

    这是关于我从 Apache Spark 查询 Cassandra 时遇到的问题 Spark 的正常查询工作正常 没有任何问题 但是当我使用关键条件进行查询时 出现以下错误 最初 我尝试查询复合键列族 它也给出了与下面相同的问题 由以下原因引
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org

随机推荐

  • 使用命令行打开vscode

    vscode 最新版的vscode不需要配置 打开命令行工具 cmdr git 进入项目目录 输入下面命令 code 创建test js文件 code test js 旧版本需要配置一下 手动打开vscode ctrl shift p 打开
  • 总结了大佬的学习方法 #CSDN博文精选# #学习方法# #高效系统化学习#

    大家好 我是小C 全名是CSDN高校俱乐部 我的职责之一是担任 文章过滤器 精选大咖干货 助力学习之路 你是否曾面对海量信息而无从下手 你是否曾苦恼学习效果不佳 事倍功半 你是否曾感叹知识零碎而无法发挥用途 针对这些问题 小C将开启一个全新
  • vue使用mock模拟后台接口返回数据

    一 项目引入mock依赖 npm install mockjs save 或 cnpm install mockjs save 二 准备数据文件和模拟接口的文件 1 src 文件夹下新建 mock 文件夹 2 在 mock 文件夹下新建 m
  • spring源码阅读一:spring初始化容器时扫描package的过程

    注 spring version 4 2 0 RELEASE 首先 spring 管理注解bean容器主要是 AnnotationConfigApplicationContext org springframework context an
  • 解析Qt的ui_*.h文件

    mainwindow h常见的几行 namespace Ui class MainWindow private Ui MainWindow ui mainwindow cpp常见的几行 include ui mainwindow h Mai
  • MQTT协议实现Eclipse Paho学习总结一

    http blog csdn net yangzl2008 article details 8861069 一 概述 遥测传输 MQTT 是轻量级基于代理的发布 订阅的消息传输协议 设计思想是开放 简单 轻量 易于实现 这些特点使它适用于受
  • C++继承,语法+案例,超详细!!

    类的继承 继承是代码重用的一种方法 通过继承创建的新类称为 派生类 或 子类 被继承的类称为 基类 或 父类 继承即子类无需重新编写父类成员代码的情况下继承父类所有的成员 子类只需书写新增成员的代码 语法 class 子类名 继承方式 父类
  • echo打印颜色

    Linux echo命令打印带有颜色的字 一 命令格式如下 echo e 033 字背景颜色 文字颜色m字符串 033 0m 例如 echo e 033 47 30m I love Android 033 0m 其中47的位置代表背景色 3
  • 仓库管理系统GreaterWMS的安装

    本文是应网友 ubuntu 和 Nathan 要求写的 因为看起来 Nathan 比较着急 就突击了一下 因为时间仓促 错误在所难免 敬请谅解 什么是 GreaterWMS GreaterWMS是完全开源的仓库管理系统 该库存管理系统是目前
  • 云平台学习笔记(三)-MobaXterm使用

    内网 外网的IP都可以 这个界面方面可视化管理
  • MATLAB数据关联性(相关性)分析

    分析某个因素与其它因素之间的关联强弱 举个例子X0 X1 X2 X3 X4 X5分别代表热效率 煤气流量 空气流量 热值 蒸汽流量 给水流量 这里分析X1 X2 X3 X4 X5与X0的关联度 定义如下 图片摘自知乎 X0 xlsread
  • qgis导入在线地图网址

    https webst01 is autonavi com appmaptile style 3D6 26x 3D 7Bx 7D 26y 3D 7By 7D 26z 3D 7Bz 7D zmax 18 zmin 0 type xyz url
  • TortoiseGit 入门指南14:比较差异

    版本控制系统最常见的应用是查看发生了哪些变化 Git 通过比较两个 文件 或者两个 提交 的 差异 differences 来实现这个功能 对于文本文件 TortoiseGit 提供了名为 TortoiseGitMerge 的内置工具来查看
  • 图像梯度(微分)及其MATLAB求解

    1 一阶梯度 MATLAB中的gradient 函数 实现的是中心梯度 2 二阶梯度 h fspecial laplacian 获得的模板是 h 0 1667 0 6667 0 1667 0 6667 3 3333 0 6667 0 166
  • java压缩文本内容

    java压缩文本内容工具类如下 package com my util import java io ByteArrayInputStream import java io ByteArrayOutputStream import java
  • 【压测系】1.apifox 自动化压测示例

    作为后端程序员 之前使用过的接口调试工具postMan restclient等 近期看到csdn右边的小广告弹窗 我这边无意之间点击打开下载之后 被它的很多功能一下子 吸引住了 比如有压测工具的功能 自动化测试 团队协作 重要的是不收费 为
  • mysql基础,快来复习一波!

    mysql基础 快来复习一波 一 数据库服务的启动与登录 1 1 通过服务的方式启动 1 2 手动启动的方式 1 3 控制台连接数据库 1 3 1 登录格式1 u和p后面没有空格 1 3 2登录格式2 1 3 3 登录格式3 1 3 4退出
  • 49天精通Java,第12天,Java接口的作用和意义

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于Java基础教程 入门篇 包含面向对象 基本数据类型 数
  • vue 自定义函数

    vue 自定义函数 存储localStorage export const setStore name content gt if name return if typeof content string content JSON stri
  • Chisel基础之Scala

    前言 Scala is yet another programming language which supports common programming paradigms We chose to use it for several