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

安卓开发学习---kotlin版---笔记(一)

Hello word

前言:上次学习安卓,学了Java开发,简单的搭了几个安卓界面。这次要学习Kotlin语言,然后开发安卓,趁着还年轻,学点新东西,坚持~
未来的你会感谢现在努力的你~

在这里插入图片描述

主要学习资料:

  • 《第一行代码Android 第三版》
  • 菜鸟教程
  • android官网-kotlin
  • Kotlin 官方文档 中文版
  • 2018年黑马安卓开发视频教程
  • 幕课网课件

那么,开始吧~

开始-Kotlin语言-安卓开发学习

首先是搭建环境,在一通操作过后,在android studio上成功安装行了kotlin
经典的:hello word

在这里插入图片描述

eclipse环境搭建结果:在这里插入图片描述


参数

又是一个绕不开的话题
kotlin中
使用val修饰的变量,是不可变的(value)
使用var修饰的变量,是可变的(variable 可变的)

  • tips: 优先使用val来声明一个变量,而当val没有办法满足你的需求时再使用var

小数类型的,默认是Double
var a = 3.1415f/3.1415F表示Float类型
小数点6位以内,用Float类型
小数点大于6位,用Double类型

for循环

  • kotlin也有swift中的开区间、闭区间的概念
    四种类型:[],(),[),(]

注意,所谓 “全开区间” 或者是 “左开右闭” 的区间,可以用其他两种方式代替

	var nums = 1..10for (num in nums){print("$num, ")}println()var nums2 = 1 until 10for (num in nums2){print("$num, ")}

运行结果:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 3, 4, 5, 6, 7, 8, 9,

  • step n隔几个,打印1个
    for (num in 1..20 step 2){print("$num, ")}

运行结果:1, 3, 5, 7, 9, 11, 13, 15, 17, 19,

  • reversed()翻转打印
    var nums2 = 1 until 10for (num in nums2.reversed()){print("$num, ")}

运行结果:9, 8, 7, 6, 5, 4, 3, 2, 1,

数据容器

容器是用于存放数据的载体。容器分为数组、集合

  • 使用arrayOf创建数组
var array: Array<Any> = arrayOf("1", "2", 2, 3.11)

kotlin中的Any类型,等价于其他开发语言中的object类型

  • 使用arrayOfNulls创建数组
    创建一个指定大小的、所有元素都为空的数组,但必须指定集合中的元素类型
    var array2 = arrayOfNulls<String>(5)
	var array2 = arrayOfNulls<String>(2)array2[0] = "333"for (temp in array2){println(temp)}

运行结果:
333
null

  • 动态创建数组
    用接受数组大小,以及一个方法参数的Array构造方法,用作参数的方法能够返回给定索引的每个元素初始值
    //数组的大小:4//遍历数组,i。取出每一个i,做i*i的操作,结果放入数组var array3 = Array(4){i -> (i*i)}array3.forEach { println(it) }
根据不同类型,创建特定类型的数组
  • 指定类型
	//指定个数var array4 = IntArray(2)array4[0] = 1array4[1] = 99array4.forEach { println(it) }
  • 指定类型,指定个数,且每个元素一样
    //创建一个长度为5的数组,里面每个元素都是100var array5 = IntArray(5){100}array5.forEach { println(it) }
  • 指定类型,指定个数,且每个元素可按规则自定义
    var array6 = IntArray(5){it*2}array6.forEach { println(it) }
数组的几种for-in循环遍历
    var array6 = IntArray(5){it*2}//最简单的for (item in array6){println(item)}//使用indices,取indexfor(index in array6.indices){println("array6[${index}] = ${array6[index]}")}//使用withIndex,取出index和itemfor((index, item) in array6.withIndex()){println("array6[${index}] = ${item}")}
  • 数组创建的时候,需要指定个数,而且创建完成后,不能更改数字个数(不能添加、删除元素),只能查询、更改元素值

这明显是个不可变数组,难度没有可变数组吗?还是说可变数组使用集合表示?

Kotlin集合

可变集合的大小可以动态改变

  • List:是一个有序集合,元素可重复
  • Set:是一组无重复元素的集合(无序)
  • Map:是一组键值对(字典)
可变集合、不可变集合

在这里插入图片描述

在可变的列表中,有两个方法,推荐使用带mutable的,字如其意

例子:创建一个可变集合,做增、删操作
    var array = mutableListOf<String>()//增加元素array.add("123")array.add("333")//在index的位置,增加元素array.add(1, "2")var array2 = mutableListOf<String>()array2.add("1")array2.add("3")//增加一个数组里面的内容array.addAll(array2)array.forEach { println(it) }//根据下标index移除元素array.removeAt(0)//根据value移除元素array.remove("333")array.forEach { println(it) }

listOf()创建集合的时候,必须指定元素类型、必须指定初始化数据

例子:创建一个不可变集合,做增、删操作

使用listOf创建一个list
使用witIndex()获取index的值,然后使用(x, y)两个参数接收

	fun main(args: Array<String>){var array = listOf<String>("1", "2", "4", "9")for ((index, item) in array.withIndex()){println("$index "+"$item")}

运行结果:
0 1
1 2
2 4
3 9

例子:创建一个map
//导入TreeMap包
import java.util.TreeMapfun main(args: Array<String>){//创建一个mapvar map2 = TreeMap<String, String>()//赋值map2["good"] = "好"map2["bad"] = "坏"map2["study"] = "学习"println(map2["bad"])
}

readLine()

readLine():获取键盘输入的字,获取后是String?类型的


函数

函数的格式:

kotlin:

func 函数名(参数名: 参数类型): 返回值类型{函数体
}

oc:

- (返回值类型)函数名(参数类型: 参数名) {函数体
}

只是组合方式不一样
函数的四要素:函数名、参数、返回值类型、函数体都有

函数的简略写法:

fun sum(a: Int, b: Int): Int{return a+b
}
//如果函数体里面只有一条语句,而且该语句有返回值,则可以去掉{},并省略return,直接使用=:
fun sum2(a: Int, b: Int): Int = a+b

在kotlin中,函数和参数(变量)一样,都是一等公民
那个,也可以将函数表达式赋值给一个变量:

	///等号右边,称为:函数表达式var i = {a: Int, b: Int -> a+b}println(i(3, 8))

还有另外一种写法:

	//var j:后面,表面是一种类型,j是一个函数类型,两个入参,一个出参//=后面,是一个函数表达式var j:(Int, Int)->Int = {x, y -> x+y }println(j(1, 8))

也就是,函数也可以充当函数里面的参数,或者返回值

函数的分类

函数通过声明位置的不同,分为:

  • 普通类的方法(对象方法)
  • 静态类的方法(类方法)
  • companion object伴生类的方法

companion:同伴,伴侣

普通方法:
class Person {fun test(){println("普通方法")}
}

调用的时候,先创建对象,才能调用
Person().test()

静态类方法

使用objec创建的类,称为静态类
不需要构建对象,可以通过类名,直接访问静态方法

object NumUtil {fun test(){println("这是一个静态方法")}
}

调用:NumUtil.test()

伴生类方法

如何在一个普通类里面,直接通过类调用方法呢?
可以将方法放在companion object{}里面即可

class Person {companion object{fun test2(){println("这是一个伴生类方法")}}
}

调用Person.test2()

方法的参数

  • 默认参数
  • 具名参数
  • 可变数量的参数
默认参数

方法参数可以有默认值,当省略相应的参数时使用默认值

fun main(args: Array<String>){read(1,2)read(start = 2)
}fun read(offset: Int = 0, start: Int){println("offset=${offset}, start=${start}")
}

运行结果:
offset=1, start=2
offset=0, start=2

offset: Int = 0就是默认值0
当不写默认值的时候,要指定后面的参数start
而这种在调用函数的时候,指定参数名的方法,就是具名参数

具名参数,指定具体名称的参数

举个例子:默认参数与具名参数
val PI = 3.14ffun main(args: Array<String>){//要写3.14f,3.0f,而不是3.14,3var temp = circleArea(3.14f, 3.0f)//调用的时候,明确写出radius=的方式,就是具名参数var temp2 = circleArea(radius = 3.0f)println(temp)println(temp2)
}//圆的面积
//默认Pi的值是PI
//通过在类型的后面添加 = 符号来设置参数的默认值。
fun circleArea(Pi: Float = PI, radius: Float): Float{return Pi*radius*2
}
  • 如果最后一个参数是方法,那么,它既可以作为具名参数在括号内传入,也可以在括号外传入
举个例子
fun main(args: Array<String>){//作为具名参数,在括号内read1(1,2, action = {//最后一句可以省略return"123"})//放在括号外read1(start = 3){"321"}
}//最后一个参数是方法
//action:参数名
//()->String:没有参数,有返回值(String)的函数类型
fun read1(offset: Int = 0, start: Int, action: ()->String){//函数(),代表执行函数var temp = action()println("offset=${offset}, start=${start}, action=${temp}")
}
可变数量的参数Vararg

vararg:可变参数

方法的参数(通常是最后一个),可以使用vararg修饰标记:

fun main(args: Array<String>){varargFun(1, 100)varargFun(1, 3, 3,4,8)
}//使用vararg修饰
fun varargFun(a: Int, vararg v:Int){//v参数是一个数组println(v.forEach { println(it) })
}
  • 一个函数,最多只能有一个可变参数
  • 如果可变参数不是最后一个,那么可变参数后面的所有参数,都要用具名参数传值

Lambda表达式

Lambda表达式理解为一种语法糖
Lambda表达式里面有一个it

it不是关键字
在高阶方法中,如果Lambda表达式只有一个参数,那么可以使用it来使用此参数

异常捕获try-catch

举个🌰:计算器

fun main(args: Array<String>){println("请输入第一个数字:")var a = readLine()while (a == null || a?.count() == 0){println("不能输入空值,请重新输入数字:")a = readLine()}println("请输入第二个数字:")var b = readLine()while (b == null || b?.count()==0){println("不能输入空值,请重新输入数字:")b = readLine()}try {var num1 = a!!.toInt()var num2 = b!!.toInt()var result = sum(num1, num2)println("$num1 + $num2 = $result")}catch (error: java.lang.Exception){println(error)}
}fun sum(a: Int, b: Int):Int{return a+b
}

递归

举个例子:计算n的阶层

5的阶层 = 5 * 4 * 3 * 2 * 1 = 120

fun main(args: Array<String>){println(jieCeng(5))
}fun jieCeng(a: Int):Int{//结束条件if (a == 1) return 1//递归计算return a * jieCeng(a-1)
}
尾递归计算
fun main(args: Array<String>){var result = 0println(add(100, result))
}tailrec fun add(a: Int, result: Int):Int{println("计算机第${a}次计算, result=${result}")//结束条件if (a == 0) return 1//递归计算return add(a-1, result + a)
}

继承

  • 如果想继承某个父类,则父类class前需要加open,允许被继承
  • 如果想重写父类的某个方法,则子类在同名方法前加overrid,且父类在方法前加open,允许被重写

接口和抽象类

  • 接口是事物的能力,接口用的时候:接口名即可
  • 抽象类是事物的本质,抽象类用的时候:抽象类+()

使abstract定义的类,被称为抽象类,里面的方法不需要实现

代理和委托

A委托B去做某事情
B代理A去做某事情

使用by 类名A(),就可以实现类名A里面的方法

	open class Father: IWashBowl by Son(){/**override fun wash() {println("我是爸爸,洗完一次10元")}* */}//或者这样调用
open class Father: IWashBowl by Son(){override fun wash() {println("我是爸爸,我收了妈妈的10元")Son().wash()println("我是爸爸,我不洗碗,但是赚了9元")}
}

单例

创建类的时候,不使用class修饰,而且使用object修饰,则只有一份

印章类sealed

sealed:封闭的、密封的

  • sealed class更在意类型
  • 枚举更在意数据
//跟enum类似,只有指定有限的类
sealed class Son {//记得加()class XXL(): Son()class XXM(): Son()fun sayHello(){println("hello")}
}fun main(args: Array<String>){//记得加(),才是对象var son1:Son = Son.XXL()var son2:Son = Son.XXM()var son3:Son = Son.XXM()var house = listOf<Son>(son1, son2, son3)for (v in house){if(v is Son.XXM){v.sayHello()}}
}

函数式编程

fun main(args: Array<String>){var names = listOf<String>("tom", "locy", "jack")//forEach函数names.forEach(action = haha)//闭包,匿名函数names.forEach{a -> println(a)}//闭包names.forEach{//默认参数itprintln(it)}
}//函数作为参数,前面使用var 参数名 =
//后面的函数名去掉
var haha = fun (name: String):Unit{println(name)
}

Kotlin高阶函数

一个函数,被用作参数或者返回值,则称为高阶函数

maxBy/minBy

找出数组array,里面age最大的item
array.maxBy{a.age}
找出数组array,里面height最小的item
array.minBy{a.height}

返回的是item对象

var item: Object = array.maxBy{it.age}

filter

  • 过滤找到特定条件的对象集合
    好几个条件并列执行:
var newArray = array.filter{(it.age>18) and (it.height>168) and (it.age<25)
}

map

  • 把原数组某个属性,映射成新的集合
    比如:把人群中的名字列出来,放入新的集合中
var newArray = oldArray.map{"${it.name} : ${it.age}"
}

结果:{name1: 18, name2: 30, name3: 19}

any

  • 是否有满足某个条件的对象
    返回的是一个boolean值
var temp: Boolean = array.any{it.age == 18
}

count

  • 统计符合满足条件对象的个数
var count: Int = array.count{it.age<18
}

find

  • 查找符合条件的对象,并返回第一个
var item: Object = array.finc{it.address=="北京"
}

groupBy

  • 按照特征,把对象分为不同的组
var result: Array = array.groupBy{it.address
}

按照地址,把原来的数组,分别组成新的数组

DSL 领域特定语言

  • 扩展函数
  • 中缀表达式
    函数使用infix修饰后,.的操作,可以换成空格的操作

泛型

在java中,常见的泛型有:泛型类、泛型接口、泛型方法、泛型属性
在kotlin中,常见的泛型有:泛型接口/类、泛型字段、泛型方法、泛型约束、泛型中的out与in

泛型接口/类

举个例子:使用泛型定义一个接口
fun main(args: Array<String>){DrinkApple().drink("喝苹果汁")
}//接口,<T>泛型
interface Drink<T>{//不需要函数体fun drink(t: T)
}//定义一个类DrinkApple,实现Drink接口
class DrinkApple: Drink<String>{//使用override重写override fun drink(t: String) {println(t)}
}
泛型类

fun main(args: Array<String>){BlueColor("蓝色").printColor()BlueColor("红色").printColor2()
}//使用abstract修饰一个类,类名为Color
abstract class Color<T>(var t: T){//如果不实现函数,则也加abstractabstract fun printColor()//或者不加abstract,直接实现函数fun printColor2(){println("printColor2")}
}class BlueColor(var color: String): Color<String>(color){override fun printColor() {println("${color}")}
}
泛型参数
fun main(args: Array<String>){var box1 = Box<String>("123")println("${box1.value}")
}///(Box<T>)是一个整体,且不能省略<T>(省略的话,后面的T不识别)
class Box<T>(t: T){var value = t
}

泛型方法

这个。。。。,方法也是泛型?

类型参数要放在方法名的前面

fun main(args: Array<String>){//Kotlin中双冒号操作符:表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。fromJson("{}", String::class.java)
}//在函数名前加<T>
fun <T> fromJson(json: String, tClass: Class<T>): T?{var t: T? = tClass.newInstance()return t
}
泛型约束

就是,对泛型进行约束,约束泛型是哪种类型的子类

//规定,泛型必须是JSONObject类型,或者其子类类型
fun <T: JSONObject> fromJson(json: String, tClass: Class<T>): T?{var t: T? = tClass.newInstance()return t
}

当泛型前后不一致的时候,需要借助out/in


扩展Extensions

扩展的好处:提高编码效率,减少代码量

扩展某个类一个新的功能,而无需继承该类

扩展一个方法:

fun main(args: Array<String>){Jump().test()Jump().test2()
}//正常创建一个类
class Jump{fun test(){println("test")}
}//扩展一个类的方法,只需要在类后面加.即可
fun Jump.test2(){println("test2")
}

Jump类,里面多了一个test2()方法

使用场景:当引用的第三方框架,想增加新的方法,就可以使用扩展

扩展属性
fun main(args: Array<String>){var android = "android"println("${android.lastChar}")
}//普通定义变量 var a: Char
//get() = this.get(length - 1)左边是get放,右边是实现
val String.lastChar:Char get() = this.get(length - 1)

Kotlin中常用的扩展

提供的扩展函数:

  • let
  • run
  • apply
let

let: 作用域区域、避免判空

fun main(args: Array<String>){testLet("sss")testLet(null)
}//String?代表可能为空
fun testLet(str: String?){//当str为空的话,不执行后面的函数str?.let {var str2 = "android"println(str2 + it)}//let函数外面,不能访问str2
//    str2
}
run

run函数,只接收一个lambda函数参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式
在run函数中,可以直接访问实例的公有属性和方法

fun main(args: Array<String>){//调用函数,入参是Jump()var temp = testRun(Jump())println(temp)
}//创建一个类
class Jump{var a: Int = 10fun test(){}
}//函数
fun testRun(jump: Jump): String{jump.run {jump.test()//直接访问方法test()println(jump.a)//直接访问属性println(a)//最后一行,被作为返回值return "1111"}
}
apply

调用某个对象的apply函数,在函数范围内,可以调用该对象的任意方法,并返回该对象

作业:做一个计算器

package com.example.learnKotlinfun main(args: Array<String>){while (true){println("====请输入你的表达式====")var inputString: String? = readln()try {inputString?.let {calculate(inputString)println("====是否还继续?(y/n)====")var inputString2: String? = readln()inputString2?.let {if (it.equals("n")){System.exit(-1)}}}}catch (ex: java.lang.Exception){ex.printStackTrace()}}
}fun calculate(inputString: String){if(inputString.contains("+")){//trim()去掉空格//split()分割var nums = inputString.trim().split("+")var result = nums[0].toFloat() + nums[1].toFloat()println("${nums[0]}+${nums[1]}=${result}")}else if(inputString.contains("-")){var nums = inputString.trim().split("-")var result = nums[0].toFloat() - nums[1].toFloat()println("${nums[0]}-${nums[1]}=${result}")}else if(inputString.contains("*")){var nums = inputString.trim().split("*")var result = nums[0].toFloat() * nums[1].toFloat()println("${nums[0]}*${nums[1]}=${result}")}else if(inputString.contains("/")){var nums = inputString.trim().split("/")var result = nums[0].toFloat() / nums[1].toFloat()println("${nums[0]}/${nums[1]}=${result}")}else{println("输入错误")}
}

测试数据:

请输入你的表达式
8=0
输入错误
是否还继续?(y/n)
y
请输入你的表达式
8 * 8
8 * 8=64.0
是否还继续?(y/n)
请输入你的表达式
9-000
9-000=9.0

相关文章:

安卓开发学习---kotlin版---笔记(一)

Hello word 前言&#xff1a;上次学习安卓&#xff0c;学了Java开发&#xff0c;简单的搭了几个安卓界面。这次要学习Kotlin语言&#xff0c;然后开发安卓&#xff0c;趁着还年轻&#xff0c;学点新东西&#xff0c;坚持~ 未来的你会感谢现在努力的你~ 主要学习资料&#xff1a…...

挑选在线客服系统的七大注意事项

越来越多的企业开始注重客户服务&#xff0c;所以在线客服系统也逐渐成为了电商企业不可或缺的一部分。然而在挑选在线客服系统的过程中&#xff0c;蛮多企业会遇到各种各样的问题&#xff0c;这就导致了最终选择的系统并不适合自己企业的需求。接下来我将提醒大家挑选在线客服…...

剧本杀小程序搭建:打造线上剧本杀新体验

剧本杀是一款以角色扮演为主的游戏&#xff0c;一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下&#xff0c;剧本杀规模也迅速上升。今年第一季度&#xff0c;剧本杀市场规模环比增长47%&#xff0c;市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展&#xff…...

机器学习实战:预测波士顿房价

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下机器学习中一个非常经典的案例&#xff1a;预测波士顿房价&#xff0c;在此过程中也会补充很多重要的知识点&#xff0c;欢迎大家一起前来探讨学习~ 一、导入数据 在这个项目中&#xff0c;我们利用马萨诸…...

基于个微机器人的开发

简要描述&#xff1a; 下载消息中的动图 请求URL&#xff1a; http://域名/getMsgEmoji 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…...

程序员学习方法

https://www.zhihu.com/question/24187324 https://www.zhihu.com/question/505750740 windows系统&#xff1a; 如何业余开展 Windows 系统的学习&#xff1f; - 知乎 wifi工作原理&#xff1a; WiFi的工作原理是什么&#xff1f; - 知乎 发...

VUE+THREE.JS 点击模型相机缓入查看模型相关信息

点击模型相机缓入查看模型相关信息 1.引入2.初始化CSS3DRenderer3.animate 加入一直执行渲染4.点击事件4.1 初始化renderer时加入监听事件4.2 触发点击事件 5. 关键代码分析5.1 移除模型5.2 创建模型上方的弹框5.3 相机缓入动画5.4 动画执行 1.引入 引入模型所要呈现的3DSprite…...

cpu 300% 爆满 内存占用不高 排查

top查询 cpu最高的PID ps -ef | grep PID 查看具体哪一个jar服务 jstack -l PID > ./jstack.log 下载/打印进程的线程栈信息 可以加信息简单分析 或进一步 查看堆内存使用情况 jmap -heap Java进程id jstack.log 信息示例 Full thread dump Java HotSpot(TM) 64-Bit Se…...

Halcon 简单的ORC 字体识别

文章目录 仿射变化识别 仿射变化 将图片进行矫正处理 dev_close_window() read_image(Image,C:/Users/Augustine/Desktop/halcon/image.png) *获取图片的大小 get_image_size(Image, Width, Height) *仿射运算获取图片的角度对图片进行矫正 *选中图片的区域 gen_rectangle1 (Re…...

12月7日作业

使用QT模仿一个登陆界面&#xff08;模仿育碧Ubisoft登录界面&#xff09; #include "myqq.h"MyQQ::MyQQ(QWidget *parent): QMainWindow(parent) {this->resize(880,550); //设置窗口大小this->setFixedSize(880,550); //固定窗口大小this->setStyleShee…...

【腾讯云HAI域探密】- AIGC应用助力企业降本增效之路

一、前言&#xff1a; 近年来&#xff0c;随着深度学习、大数据、人工智能、AI等技术领域的不断发展&#xff0c;机器学习是目前最火热的人工智能分支之一&#xff0c;是使用大量数据训练计算机程序&#xff0c;以实现智能决策、语音识别、图像处理等任务。 作者也是经过了以上…...

云原生之深入解析如何限制Kubernetes集群中文件描述符与线程数量

一、背景 linux 中为了防止进程恶意使用资源&#xff0c;系统使用 ulimit 来限制进程的资源使用情况&#xff08;包括文件描述符&#xff0c;线程数&#xff0c;内存大小等&#xff09;。同样地在容器化场景中&#xff0c;需要限制其系统资源的使用量。ulimit: docker 默认支持…...

Django的Auth模块

Auth模块 我们在创建好一个Django项目后执行数据库迁移命令会自动生成很多表 其中有auth_user等表 Django在启动之后就可以直接访问admin路由&#xff0c;需要输入用户名和密码&#xff0c;数据参考的就是auth_user表&#xff0c;并且必须是管理员才能进入 依赖于a…...

敏捷开发方法

理解&#xff1a; 极限编程&#xff08;XP&#xff09;&#xff1a;敏捷开发的典型方法之一&#xff0c;是一种轻量级&#xff08;敏捷&#xff09;、高效&#xff0c;低风险、柔性、可预测的、科学的软件开发方法&#xff0c;它由价值观、原则、实践和行为4个部分组成。其中4大…...

vue 前端实现login页登陆 验证码

实现效果 // template <el-form :model"loginForm" :rules"fieldRules" ref"loginForm" label-position"left" label-width"0px" class"login-container"><span class"tool-bar"></sp…...

python 涉及opencv mediapipe知识,眨眼计数 供初学者参考

基本思路 我们知道正面侦测到人脸时&#xff0c;任意一只眼睛水平方向上的两个特征点构成水平距离&#xff0c;上下两个特征点构成垂直距离 当头像靠近或者远离摄像头时&#xff0c;垂直距离与水平距离的比值基本恒定 根据这一思路 当闭眼时 垂直距离变小 比值固定小于某一个…...

HTTP 和 HTTPS的区别

一、HTTP 1.明文传输&#xff0c;不安全 2.默认端口号&#xff1a;80 3.TCP三次握手即可 二、HTTPS 1.加密传输&#xff0c;更安全(在HTTP层与TCP层之间加上了SSL/TTL安全协议) SSL和TTL是在不同时期的两种叫法&#xff0c;含义相同。 2.默认端口号&#xff1a;443 3.TCP三…...

从零开始训练一个ChatGPT大模型(低资源,1B3)

macrogpt-prertrain 大模型全量预训练(1b3), 多卡deepspeed/单卡adafactor 源码地址&#xff1a;https://github.com/yongzhuo/MacroGPT-Pretrain.git 踩坑 1. 数据类型fp16不太行, 很容易就Nan了, 最好是fp32, tf32, 2. 单卡如果显存不够, 可以用优化器adafactor, 3. 如果…...

从文字到使用,一文读懂Kafka服务使用

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…...

什么是https加密协议?

前言&#xff1a; HTTPS&#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure&#xff09; 是一个安全通信通道&#xff0c;它基于HTTP开发用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换&#xff0c;简单来说它是HTTP的安全版&…...

0012Java程序设计-ssm医院预约挂号及排队叫号系统

文章目录 **摘** **要**目 录系统实现5.2后端功能模块5.2.1管理员功能模块5.2.2医生功能模块 开发环境 摘 要 网络的广泛应用给生活带来了十分的便利。所以把医院预约挂号及排队叫号管理与现在网络相结合&#xff0c;利用java技术建设医院预约挂号及排队叫号系统&#xff0c;实…...

PaddleClas学习3——使用PPLCNet模型对车辆朝向进行识别(c++)

使用PPLCNet模型对车辆朝向进行识别 1 准备环境2 准备模型2.1 模型导出2.2 修改配置文件3 编译3.1 使用CMake生成项目文件3.2 编译3.3 执行3.4 添加后处理程序3.4.1 postprocess.h3.4.2 postprocess.cpp3.4.3 在cls.h中添加函数声明3.4.4 在cls.cpp中添加函数定义3.4.5 在main.…...

学习记录---kubernetes中备份和恢复etcd

一、简介 ETCD是kubernetes的重要组成部分&#xff0c;它主要用于存储kubernetes的所有元数据&#xff0c;我们在kubernetes中的所有资源(node、pod、deployment、service等)&#xff0c;如果该组件出现问题&#xff0c;则可能会导致kubernetes无法使用、资源丢失等情况。因此…...

使用单例模式+观察者模式实现参数配置实时更新

使用vector存储观察者列表 #include <iostream> #include <vector> #include <functional> #include <algorithm>// 配置参数结构体 struct MyConfigStruct {int parameter1;std::string parameter2; };class Config { public:using Observer std::f…...

区块链实验室(28) - 拜占庭节点劫持区块链仿真

在以前的FISCO环境中仿真拜占庭节点攻击区块链网络。该环境共有100个节点&#xff0c;采用PBFT作为共识机制&#xff0c;节点编号分别为&#xff1a;Node0&#xff0c;Node&#xff0c;… &#xff0c;Node99。这100个节点的前2010区块完全相同&#xff0c;自区块2011开始分叉。…...

聊聊AsyncHttpClient的ChannelPool

序 本文主要研究一下AsyncHttpClient的ChannelPool ChannelPool org/asynchttpclient/channel/ChannelPool.java public interface ChannelPool {/*** Add a channel to the pool** param channel an I/O channel* param partitionKey a key used to retrieve the cac…...

[MySQL] MySQL复合查询(多表查询、子查询)

前面我们学习了MySQL简单的单表查询。但是我们发现&#xff0c;在很多情况下单表查询并不能很好的满足我们的查询需求。本篇文章会重点讲解MySQL中的多表查询、子查询和一些复杂查询。希望本篇文章会对你有所帮助。 文章目录 一、基本查询回顾 二、多表查询 2、1 笛卡尔积 2、2…...

[架构之路-256]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件系统不同层次的复用与软件系统向越来越复杂的方向聚合

目录 前言&#xff1a; 一、CPU寄存器级的复用&#xff1a;CPU寄存器 二、指令级复用&#xff1a;二进制指令 三、过程级复用&#xff1a;汇编语言 四、函数级复用&#xff1a;C语言 五、对象级复用&#xff1a;C, Java, Python 六、组件级复用 七、服务级复用 八、微…...

C++初学教程三

目录 一、运算符 一、自增自减运算符 二、位运算符 三、关系运算符...

雷达点云数据.pcd格式转.bin格式

雷达点云数据.pcd格式转.bin格式 注意&#xff0c;方法1原则上可行&#xff0c;但是本人没整好pypcd的环境 方法2是绝对可以的。 方法1 1 源码如下&#xff1a; def pcb2bin1(): # save as bin formatimport os# import pypcdfrom pypcd import pypcdimport numpy as np…...

Fiddler抓包测试

模拟弱网测试 操作&#xff1a;一、Rules - Customize Rules &#xff08;快捷键CtrlR&#xff09;弹出编辑器 二、接着CtrlF查找m_SimulateModem标志位 三、默认上传300ms&#xff0c;下载150ms 四、更改后&#xff0c;继续Rules - Performances - Simulate Modem Speeds勾上 …...

视频处理关键知识

1 引言 视频技术发展到现在已经有100多年的历史&#xff0c;虽然比照相技术历史时间短&#xff0c;但在过去很长一段时间之内都是最重要的媒体。由于互联网在新世纪的崛起&#xff0c;使得传统的媒体技术有了更好的发展平台&#xff0c;应运而生了新的多媒体技术。而多媒体技术…...

LeetCode435. Non-overlapping Intervals

文章目录 一、题目二、题解 一、题目 Given an array of intervals intervals where intervals[i] [starti, endi], return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping. Example 1: Input: intervals [[1,2]…...

ffmpeg 实现多视频轨录制到同一个文件

引言 在视频录制中&#xff0c;有时会碰到这样一个需求&#xff0c;将不同摄像头的画面写入到一个视频文件&#xff0c;这个叫法很多&#xff0c;有的厂家叫合流模式&#xff0c;有的叫多画面多流模式。无论如何&#xff0c;它们的实质都是在一个视频文件上实现多路不同分辨率视…...

vue3中子组件调用父组件的方法

<script lang"ts" setup>前提 父组件&#xff1a; 子组件&#xff1a; const emit defineEmits([closeson]) 在子组件的方法中使用&#xff1a; emit(closeson)...

使用OkHttp上传本地图片及参数

下面以一个例子来讲解在项目中如何使用OKHttp来对本地图片做个最简单的上传功能&#xff0c;基本上无封装&#xff0c;只需要简单调用便可&#xff08;对于OKHttp的引入不再单独做介绍&#xff09;。 1&#xff1a;构建上传图片附带的参数&#xff08;params&#xff09; Map…...

无公网IP环境如何SSH远程连接Deepin操作系统

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…...

不会代码(零基础)学语音开发(语音控制板载双继电器)

继电器的用途可广了&#xff0c;这个语音控制用处也特别广。继电器&#xff0c;它实际上是一种“自动开关”&#xff0c;用小电流去控制大电流运作&#xff0c;在电路中起着自动调节、安全保护、转换电路等作用。 在日常生活中&#xff0c;你插入汽车钥匙&#xff0c;车辆可以…...

在imx6ull中加入ov5640模块

本来觉得是一件很简单的事情但是走了很多的弯路&#xff0c;记录一下调试过程。 先使用正点原子提供的出厂内核把摄像头影像调试出来&#xff0c;然后cat /dev/video1&#xff0c;看一下video1牵扯到哪些模块&#xff0c;可以看到需要ov5640_camera.ko和 mx6s_capture.ko这两个…...

Kafka中的auto-offset-reset配置

Kafka这个服务在启动时会依赖于Zookeeper&#xff0c;Kafka相关的部分数据也会存储在Zookeeper中。如果kafka或者Zookeeper中存在脏数据的话&#xff08;即错误数据&#xff09;&#xff0c;这个时候虽然生产者可以正常生产消息&#xff0c;但是消费者会出现无法正常消费消息的…...

TCP/IP_整理起因

先分享一个初级的问题&#xff1b;有个客户现场&#xff0c;终端设备使用客户网络更新很慢&#xff0c;使用手机热点更新速度符合预期&#xff1b;网络部署情况如下&#xff1a; 前期花费了很大的精力进行问题排查对比&#xff0c;怀疑是客户网络问题&#xff08;其他的客户现…...

CG-0A 电子水尺水导电测量原理应用于道路积水监测

CG-0A 电子水尺水导电测量原理应用于道路积水监测产品概述 本产品是一种采用微处理器芯片为控制器&#xff0c;内置通讯电路的数字式水位传感器&#xff0c;具备高的可靠性及抗干扰性能。适用于江、河、湖、水库及蓄水池、水渠等处的水位测量使用。 本产品采用了生产工艺技术…...

openEuler JDK21 部署 Zookeeper 集群

zookeeper-jdk21 操作系统&#xff1a;openEuler JDK&#xff1a;21 主机名IP地址spark01192.168.171.101spark02192.168.171.102spark03192.168.171.103 安装 1. 升级内核和软件 yum -y update2. 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make \zl…...

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…...

JVM 执行引擎篇

机器码、指令、汇编语言 机器码 各种用二进制编码方式表示的指令&#xff0c;叫做机器指令码。开始&#xff0c;人们就用它采编写程序&#xff0c;这就是机器语言。机器语言虽然能够被计算机理解和接受&#xff0c;但和人们的语言差别太大&#xff0c;不易被人们理解和记忆&a…...

js中数组对象去重的方法

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 最近工作中需要用到数组对象去重的方法&#xff0c;我是怎么想也没想出来&#xff0c;今天稍微研究了一下&#xff0c;总算找到了2种方法。分享一下&…...

【送书活动四期】被GitHub 要求强制开启 2FA 双重身份验证,我该怎么办?

记得是因为fork了OpenZeppelin/openzeppelin-contracts的项目&#xff0c;之后就被GitHub 要求强制开启 2FA 双重身份验证了&#xff0c;一拖再拖&#xff0c;再过几天帐户操作将受到限制了&#xff0c;只能去搞一下了 目录 2FA是什么为什么要开启 2FA 验证GitHub 欲在整个平台…...

GO设计模式——13、享元模式(结构型)

目录 享元模式&#xff08;Flyweight Pattern&#xff09; 享元模式的核心角色&#xff1a; 优缺点 使用场景 注意事项 代码实现 享元模式&#xff08;Flyweight Pattern&#xff09; 享元模式&#xff08;Flyweight Pattern&#xff09;它通过共享对象来减少内存使用和提…...

Linux 网络协议

1 网络基础 1.1 网络概念 网络是一组计算机或者网络设备通过有形的线缆或者无形的媒介如无线&#xff0c;连接起来&#xff0c;按照一定的规则&#xff0c;进行通讯的集合( 缺一不可 )。 5G的来临以及IPv6的不断普及&#xff0c;能够进行联网的设备将会是越来越多&#xff08…...

【C语言】7-32 刮刮彩票 分数 20

7-32 刮刮彩票 分数 20 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xf…...