深度学习入门(Python)学习笔记1
第1章 Python入门
1.1python是什么
Python是一个简单、易读、易记的编程语言,而且是开源的,可以免费地自由使用。
使用Python不仅可以写出可读性高的代码,还可以写出性能高(处理速度快)的代码。
再者,在科学领域,特别是在机器学习、数据科学领域,Python也被大量使用。Python除了高性能之外,凭借着NumPy、SciPy等优秀的数值计算、统计分析库,在数据科学领域占有不可动摇的地位。深度学习的框架中也有很多使用Python的场景,比如Caffe、TensorFlow、Chainer、Theano等著名的深度学习框架都提供了Python接口。
1.2 python的安装
1.2.1 Python版本
Python有Python 2.x和Python 3.x两个版本。如果我们调查一下目前Python的使用情况,会发现除了最新的版本3.x以外,旧的版本2.x仍在被大量使用。因此,在安装Python时,需要慎重选择安装Python的哪个版本。这是因为两个版本之间没有兼容性(严格地讲,是没有“向后兼容性”),也就是说,会发生用Python 3.x写的代码不能被Python 2.x执行的情况。本次使用Python 3.x ,只安装了Python 2.x的读者建议另外安装一下Python 3.x。
1.2.2 使用的外部库
本书的目标是从零开始实现深度学习。因此,除了NumPy库和Matplotlib库之外,我们极力避免使用外部库。之所以使用这两个库,是因为它们可以有效地促进深度学习的实现。
NumPy是用于数值计算的库,提供了很多高级的数学算法和便利的数组(矩阵)操作方法。本书中将使用这些便利的方法来有效地促进深度学习的实现。
Matplotlib是用来画图的库。使用Matplotlib能将实验结果可视化,并在视觉上确认深度学习运行期间的数据。
1.2.3 Anaconda发行版
Python的安装方法有很多种,本书推荐使用Anaconda这个发行版。发行版集成了必要的库,使用户可以一次性完成安装。
Anaconda是一个侧重于数据分析的发行版,前面说的NumPy、Matplotlib等有助于数据分析的库都包含在其中。如前所述,本书将使用Python 3.x版本,因此Anaconda发行版也要安装3.x的版本。请读者从官方网站下载与自己的操作系统相应的发行版,然后安装。
1.3 Python解释器
完成Python的安装后,要先确认一下Python的版本。打开终端(Windows中的命令行窗口),输入python --version命令,该命令会输出已经安装的Python的版本信息。
如上所示,显示了Python 3.4.1(根据实际安装的版本,版本号可能不同),说明已正确安装了Python 3.x。接着输入python,启动Python解释器。
Python解释器也被称为“对话模式”,用户能够以和Python对话的方式进行编程。
1.3.1 算术计算
加法或乘法等算术计算,可按如下方式进行。
*表示乘法,/表示除法,**表示乘方(3**2是3的2次方)。
另外,在Python 2.x中,整数除以整数的结果是整数,比如,7 ÷ 5的结果是1。
但在Python 3.x中,整数除以整数的结果是小数(浮点数)。
1.3.2 数据类型
编程中有数据类型(data type)这一概念。数据类型表示数据的性质,有整数、小数、字符串等类型。Python中的type()函数可以用来查看数据类型。
根据上面的结果可知,10是int类型(整型),2.718是float类型(浮点型),"hello"是str(字符串)类型。另外,“类型”和“类”这两个词有时用作相同的意思。这里,对于输出结果<class 'int'>,可以将其解释成“10是int类(类型)”。
1.3.3 变量
可以使用x或y等字母定义变量(variable)。此外,可以使用变量进行计算,也可以对变量赋值。
Python是属于“动态类型语言”的编程语言,所谓动态,是指变量的类型是根据情况自动决定的。在上面的例子中,用户并没有明确指出“x的类型是int(整型)”,是Python根据x被初始化为10,从而判断出x的类型为int的。此外,我们也可以看到,整数和小数相乘的结果是小数(数据类型的自动转换)。另外,“#”是注释的意思,它后面的文字会被Python忽略。
1.3.4 列表
除了单一的数值,还可以用列表(数组)汇总数据。
元素的访问是通过a[0]这样的方式进行的。[]中的数字称为索引(下标),索引从0开始(索引0对应第一个元素)。此外,Python的列表提供了切片(slicing)这一便捷的标记法。使用切片不仅可以访问某个值,还可以访问列表的子列表(部分列表)。
进行列表的切片时,需要写成a[0:2]这样的形式。a[0:2]用于取出从索引为0的元素到索引为2的元素的前一个元素之间的元素。另外,索引-1对应最后一个元素,-2对应最后一个元素的前一个元素。
1.3.5 字典
列表根据索引,按照0, 1, 2, ...的顺序存储值,而字典则以键值对的形式存储数据。字典就像《新华字典》那样,将单词和它的含义对应着存储起来。
1.3.6 布尔型
Python中有bool型。bool型取True或False中的一个值。针对bool型的运算符包括and、or和not(针对数值的运算符有+、-、*、/等,根据不同的数据类型使用不同的运算符)。
1.3.7 if语句
根据不同的条件选择不同的处理分支时可以使用if/else语句。
Python中的空白字符具有重要的意义。上面的if语句中,if hungry:下面的语句开头有4个空白字符。它是缩进的意思,表示当前面的条件(if hungry)成立时,此处的代码会被执行。这个缩进也可以用tab表示,Python中推荐使用空白字符。
python使用空白字符表示缩进。一般而言,每缩进一次,使用4个空白字符。
1.3.8 for语句
进行循环处理时可以使用for语句。
这是输出列表[1, 2, 3]中的元素的例子。
使用for … in … :语句结构,可以按顺序访问列表等数据集合中的各个元素。
1.3.9 函数
可以将一连串的处理定义成函数(function)。
此外,函数可以取参数。
另外,字符串的拼接可以使用+。
1.4 Python脚本文件
将Python程序保存为文件,然后(集中地)运行这个文件。
1.4.1 保存为文件
打开文本编辑器,新建一个hungry.py的文件。hungry.py只包含下面一行语句。
接着,打开终端(Windows中的命令行窗口),移至hungry.py所在的位置。然后,将hungry.py文件名作为参数,运行python命令。这里假设hungry.py在~/deep-learning-from-scratch/ch01目录下(在本书提供的源代码中,hungry.py文件位于ch01目录下)。
使用python hungry.py命令就可以执行这个Python程序了。
1.4.2 类
int、str等数据类型是“内置”的数据类型,是Python中一开始就有的数据类型。现在,我们来定义新的类。如果用户自己定义类的话,就可以自己创建数据类型。此外,也可以定义原创的方法(类的函数)和属性。Python中使用class关键字来定义类,类要遵循下述格式(模板)。
这里有一个特殊的init方法,这是进行初始化的方法,也称为构造函数(constructor),只在生成类的实例时被调用一次。此外,在方法的第一个参数中明确地写入表示自身(自身的实例)的self是Python的一个特点。
从终端运行man.py。
这里我们定义了一个新类Man。
上面的例子中,类Man生成了实例(对象)m。类Man的构造函数(初始化方法)会接收参数name,然后用这个参数初始化实例变量self.name。
实例变量是存储在各个实例中的变量。Python中可以像self.name这样,通过在self后面添加属性名来生成或访问实例变量。
1.5 NumPy
1.5.1 导入NumPy
NumPy是外部库。这里所说的“外部”是指不包含在标准版Python中。因此,我们首先要导入NumPy库。
>>> import numpy as np
Python中使用import语句来导入库。通过写成这样的形式,之后NumPy相关的方法均可通过np来调用。
1.5.2 生成NumPy数组
要生成NumPy数组,需要使用np.array()方法。np.array()接收Python列表作为参数,生成NumPy数组(numpy.ndarray)。
1.5.3 NumPy的算术运算
下面是NumPy数组的算术运算的例子。
这里需要注意的是,数组x和数组y的元素个数是相同的(两者均是元素个数为3的一维数组)。当x和y的元素个数相同时,可以对各个元素进行算术运算。如果元素个数不同,程序就会报错,所以元素个数保持一致非常重要。另外,“对应元素的”的英文是element-wise,比如“对应元素的乘法”就是element-wise product。
NumPy数组不仅可以进行element-wise运算,也可以和单一的数值(标量)组合起来进行运算。此时,需要在NumPy数组的各个元素和标量之间进行运算。
1.5.4 NumPy的N维数组
NumPy不仅可以生成一维数组(排成一列的数组),也可以生成多维数组。比如,可以生成如下的二维数组(矩阵)。
这里生成了一个2 × 2的矩阵A。另外,矩阵A的形状可以通过shape查看,矩阵元素的数据类型可以通过dtype查看。
插入小知识:Python中int32和int64的区别
引言
在Python中,整数类型可以表示不同大小的整数值。其中,int64和int32分别表示64位和32位的整数类型。它们之间的区别在于能够表示的整数范围以及所占用的内存空间大小。
步骤 | 描述 |
---|---|
步骤1 | 确认Python版本 |
步骤2 | 导入相应的库 |
步骤3 | 创建int64和int32整数 |
步骤4 | 比较int64和int32整数范围 |
步骤1:确认Python版本
首先确认使用的python版本。
import sys
print(sys.version)
这段代码将打印出你当前使用的python版本。
步骤2:导入相应的库
在python中,需要导入numpy库来创建int64和int32整数。使用以下代码导入该库:
import numpy as np
步骤3:创建int64和int32整数
接下里使用numpy库来创建int64和int32整数,以下代码展示了如何创建这两种类型的整数:
int64_num = np.int64(100)
int32_num = np.int32(100)
在上述代码中,使用了np.int64()和np.int32()函数来创建int64和int32整数,并将它们赋值给相应的变量。
步骤4:比较int64和int32整数范围
最后,可以使用以下代码比较int64和int32整数的范围:
int64_range = np.iinfo(np.int64)
int32_range = np.iinfo(np.int32)print("int64范围:",int64_range.min,"到",int64_range.max)
print("int32范围:",int32_range.min,"到",int32_range.max)
使用np.iinfo()函数来获取int64和int32整数的范围,并将其分别赋值给相应的变量。然后,我们使用print()函数来打印出这两种类型整数的范围。
矩阵的算术运算
B = np.array([[3,0],[0,6]])
print(A + B)
print(A * B)
和数组的算术运算一样,矩阵的算术运算也可以在相同形状的矩阵间以对应元素的方式进行。并且,也可以通过标量(单一数值)对矩阵进行算术运算。这也是基于广播的功能。
.
NumPy数组(np.array)可以生成N维数组,即可以生成一维数组、二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量,将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统称为张量(tensor)。本书基本上将二维数组称为“矩阵”,将三维数组及三维以上的数组称为“张量”或“多维数组”。
1.5.5 广播
NumPy中,形状不同的数组之间也可以进行运算。之前的例子中,在2×2的矩阵A和标量10之间进行了乘法运算。在这个过程中,如图1-1所示,标量10被扩展成了2 × 2的形状,然后再与矩阵A进行乘法运算。这个巧妙的功能称为广播(broadcast)。
通过下面这个运算再来看一个广播的例子。
在这个运算中,如图1-2所示,一维数组B被“巧妙地”变成了和二位数组A相同的形状,然后再以对应元素的方式进行运算。
综上,因为NumPy有广播功能,所以不同形状的数组之间也可以顺利地进行运算。
1.5.6 访问元素
元素的索引从0开始。对各个元素的访问可按如下方式进行。
import numpy as np
X = np.array([[51,55],[14,19],[0,4]])
print(X)
print(X[0])
print(X[0][1])#(0,1)的元素#也可以使用for语句访问各个元素。
for row in X:print(row)#Numpy还可以使用数组访问各个元素
X = X.flatten()#将X转换为一维数组
print(X)
print(X[np.array([0,2,4])])#获取索引为0、2 、4的元素#运用标记法,可以获取满足一定条件的元素。例如,要从x中抽出大于15的元素,可以写成如下形式。
print(X > 15)
print(X[X > 15])
#对NumPy数组使用不等号运算符等(上例中是X > 15),结果会得到一个布尔型的数组。
#上例中就是使用这个布尔型数组取出了数组的各个元素(取出True对应的元素)。
运行结果:
Python等动态类型语言一般比C和C++等静态类型语言(编译型语言)运算速度慢。实际上,如果是运算量大的处理对象,用C/C++写程序更好。为此,当Python中追求性能时,人们会用C/C++来实现处理的内容。Python则承担“中间人”的角色,负责调用那些用C/ C++写的程序。NumPy中,主要的处理也都是通过C或C++实现的。因此,我们可以在不损失性能的情况下,使用Python便利的语法。
1.6 Matplotlib
Matplotlib是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。
1.6.1 绘制简单图形
可以使用matplotlib的pyplot模块绘制图形。如下,绘制sin函数曲线的例子。
import numpy as np
import matplotlib.pyplot as plt#生成数据
x = np.arange(0,6,0.1) # 以0.1为单位,生成0到6的数据
y = np.sin(x)#绘制图形
plt.plot(x,y)
plt.show()
这里使用NumPy的arange方法生成了[0,0.1,0.2,...,5.8,5.9]的数据,将其设为x。对x的各个元素,应用NumPy的sin函数np.sin(),将x、y的数据传给plt.plot方法,然后绘制图形。最后,通过plt.show()显示图形。
1.6.2 pyplot的功能
import numpy as np
import matplotlib.pyplot as plt#生成数据
x = np.arange(0,6,0.1) # 以0.1为单位,生成0到6的数据
y1 = np.sin(x)
y2 = np.cos(x)#绘制图形
plt.plot(x,y1, label="sin")
plt.plot(x,y2, linestyle = "--", label="cos")#用虚线绘制
plt.xlabel("x")#x轴标签
plt.ylabel("y")#y轴标签
plt.title('sin & cos')#标题
plt.legend()
plt.show()
1.6.3 显示图像
pyplot中还提供了用于显示图像的方法imshow()。另外,可以使用matplotlob.image模块的imread()方法读入图像。
import matplotlib.pyplot as plt
from matplotlib.image import imreadimg = imread('https://img2.baidu.com/it/u=244615067,2117237985&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500')#读入图像(设定合适的路径!
plt.imshow(img)plt.show()
运行之后出现错误:
ValueError Traceback (most recent call last)
Cell In[11], line 41 import matplotlib.pyplot as plt2 from matplotlib.image import imread
----> 4 img = imread('https://img2.baidu.com/it/u=244615067,2117237985&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500')#读入图像(设定合适的路径!5 plt.imshow(img)7 plt.show()File C:\ProgramData\anaconda3\Lib\site-packages\matplotlib\image.py:1558, in imread(fname, format)1554 img_open = (1555 PIL.PngImagePlugin.PngImageFile if ext == 'png' else PIL.Image.open)1556 if isinstance(fname, str) and len(parse.urlparse(fname).scheme) > 1:1557 # Pillow doesn't handle URLs directly.
-> 1558 raise ValueError(1559 "Please open the URL for reading and pass the "1560 "result to Pillow, e.g. with "1561 "``np.array(PIL.Image.open(urllib.request.urlopen(url)))``."1562 )1563 with img_open(fname) as image:1564 return (_pil_png_to_float_array(image)1565 if isinstance(image, PIL.PngImagePlugin.PngImageFile) else1566 pil_to_array(image))ValueError: Please open the URL for reading and pass the result to Pillow, e.g. with ``np.array(PIL.Image.open(urllib.request.urlopen(url)))``.
这段代码出现错误的原因是‘imread’函数无法直接从URL中读取图像。根据错误提示,需要先使用'PIL.Image.open(urllib.request.urlopen(url))'来读取URl中的图像,然后将其转换为NumPy数组。
修正后的代码实例:
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import urllib.requesturl = 'https://img2.baidu.com/it/u=244615067,2117237985&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500'
response = urllib.request.urlopen(url)
img = Image.open(response)
img_array = np.array(img)plt.imshow(img_array)
plt.show()
在这里,我导入了‘PIL’库中的‘Image’模块,并使用‘urllib.request.urlopen()’来打开URL,并将其传递给‘Image.open()’来获取图像。然后,将图像转换为NumPy数组,以便能够在Matplotlib中显示,最后,使用‘plt.imshow()’和‘plt.show()’来显示图像。
本章所学的内容
- python是一种简单易记的编程语言。
- python是开源的,开源自由使用。
- python有“解释器”和“脚本文件”两种运行模式。
- python能够将一系列处理集成为函数或类等模块。
- NumPy中有很多用于操作多维数组的便捷方法。
相关文章:

深度学习入门(Python)学习笔记1
第1章 Python入门 1.1python是什么 Python是一个简单、易读、易记的编程语言,而且是开源的,可以免费地自由使用。 使用Python不仅可以写出可读性高的代码,还可以写出性能高(处理速度快)的代码。 再者,在…...

苏州想要获得融资融券低利率账户的方法?怎么开融资融券账户?
想要获得融资融券低利率账户,可以通过以下几种方式: 选择低费率的券商:不同券商的费率不同,一些券商会提供低利率的融资融券账户,可以通过咨询券商或者比较不同券商的费率来找到最佳账户。 提升自身信用:获…...
【LeetCode周赛】LeetCode第359场周赛
LeetCode第359场周赛 判别首字母缩略词k-avoiding 数组的最小总和销售利润最大化找出最长等值子数组 判别首字母缩略词 给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符…...

vue3+ts+tinynce在富文本编辑器菜单栏实现下拉框选择
实现效果 代码: <script lang"ts" setup> import Editor from tinymce/tinymce-vue import tinymce from tinymce; import { getIndicator } from /api/data-assets/data-dictoryimport {computed, ref} from "vue"; const props defin…...
前端UI组件库深度解析:构建现代化的用户体验
引言 在当今的前端开发中,UI组件库已经成为了我们工具箱中不可或缺的一部分。这些库可以极大地提高我们的工作效率,同时也使我们能够专注于实现真正的业务逻辑,而不是重复地编写UI代码。本篇博客将详细地探讨UI组件库的核心概念,…...

leetcode 1326. Minimum Number of Taps to Open to Water a Garden
x轴上的花园范围为[0,n], 0~n这个n1个离散点上有水龙头,第 i 个水龙头能浇水的范围为[i-ranges[i], iranges[i]]. 求能浇整个花园的最小水龙头个数。 思路: 方法一: greedy 先把每个水龙头能浇的区间准备好, 用一个数组保存所有…...
C++日期类的基本实现
前言 对于许多出初学C的同学来说首先接触的第一个完整的类便是日期类,这个类能有效的帮助我们理解C中有关类的初始化以及重载的相关知识,帮助我们轻松上手体验C的魅力。 文章目录 前言一、日期类整体初概二、构造2.1 判断日期是否合法2.2 构造函数 三、…...

第六章:数据结构与算法-part3:数据结构算法提升
文章目录 一、排序算法1.1 插入排序1、直接插入排序2、折半插入排序3、希尔排序 1.2、交换排序法1、起泡排序2、快速排序 1.3 选择类排序1、简单选择排序 二、业务逻辑算法设计2.1 基本概念和术语2.2 静态查找表2.3、有序表的查找 一、排序算法 排序是数据处理过程中经常使用的…...

keras深度学习框架通过卷积神经网络cnn实现手写数字识别
昨天通过keras构建简单神经网络实现手写数字识别,结果在最后进行我们自己的手写数字识别的时候,准确率堪忧,只有60%。今天通过卷积神经网络来实现手写数字识别。 构建卷积神经网络和简单神经网络思路类似,只不过这里加入了卷积、池…...

Springboot启动异常 Command line is too long
Springboot启动异常 Command line is too long Springboot启动时直接报异常 Command line is too long. Shorten command line for xxxxxApplication or also for Spring Boot default解决方案: 修改 SystemApplication 的 Shorten command line,选择 JAR manife…...

PXE 装机(五十)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、PXE是什么 二、PXE的组件 三、配置vsftpd 四、配置tftp 五、准备pxelinx.0文件、引导文件、内核文件 六、配置dhcp 七、创建default文件 八、配置pxe无人值守…...
C++ 虚函数与纯虚函数
目录 1. 虚函数 2. 纯虚函数 C 中的虚函数和纯虚函数都是实现多态的重要机制。多态可以让不同的对象以相同的方式进行操作,从而简化代码的编写和维护。 1. 虚函数 虚函数是一种在基类中声明的函数,可以在派生类中进行重写。在运行时,根据对…...

警告:Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30
1. 警告 SpringBoot 的 validation 依赖包含有易受攻击的依赖 snakeyaml。 警告信息如下: Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30 意思是:提供了可传递的易受攻击依赖 maven:org.yaml:snakeyaml:1.30 2. 警告示例 …...

中文命名实体识别
本文通过people_daily_ner数据集,介绍两段式训练过程,第一阶段是训练下游任务模型,第二阶段是联合训练下游任务模型和预训练模型,来实现中文命名实体识别任务。 一.任务和数据集介绍 1.命名实体识别任务 NER(Named En…...

WPF CommunityToolkit.Mvvm Messenger通讯
文章目录 环境WeakReferenceMessenger方法介绍无回调订阅发送Token区分有回调订阅发送 环境 CommunityToolkit.Mvvm Messenger 十月的寒流: 如何使用 CommunityToolkit.Mvvm 中的 Messenger 来进行 ViewModel 之间的通信 WeakReferenceMessenger 我这里只讲简单的弱Messenger…...

【杂言】写在研究生开学季
这两天搬进了深研院的宿舍,比中南的本科宿舍好很多,所以个人还算满意。受台风 “苏拉” 的影响,原本的迎新计划全部打乱,导致我现在都还没报道。刚开学的半个月将被各类讲座、体检以及入学教育等活动占满,之后又是比较…...
渗透测试漏洞原理之---【任意文件读取漏洞】
文章目录 1、概述1.1、漏洞成因1.2、漏洞危害1.3、漏洞分类1.4、任意文件读取1.4.1、文件读取函数1.4.2、任意文件读取 1.5、任意文件下载1.5.1、一般情况1.5.2、PHP实现1.5.3、任意文件下载 2、任意文件读取攻防2.1、路径过滤2.1.1、过滤../ 2.2、简单绕过2.2.1、双写绕过2.2.…...

合宙Air724UG LuatOS-Air LVGL API控件-图片 (Image)
图片 (Image) 图片IMG是用于显示图像的基本对象类型,图像来源可以是文件,或者定义的符号。 示例代码 -- 创建图片控件 img lvgl.img_create(lvgl.scr_act(), nil) -- 设置图片显示的图像 lvgl.img_set_src(img, "/lua/luatos.png") -- 图片…...

仿京东 项目笔记2(注册登录)
这里写目录标题 1. 注册页面1.1 注册/登录页面——接口请求1.2 Vue开发中Element UI的样式穿透1.2.1 ::v-deep的使用1.2.2 elementUI Dialog内容区域显示滚动条 1.3 注册页面——步骤条和表单联动 stepsform1.4 注册页面——滑动拼图验证1.5 注册页面——element-ui组件Popover…...
Spark与Flink的区别
分析&回答 (1)设计理念 1、Spark的技术理念是使用微批来模拟流的计算,基于Micro-batch,数据流以时间为单位被切分为一个个批次,通过分布式数据集RDD进行批量处理,是一种伪实时。 2、Flink是基于事件驱动的,是面向流的处理框架, Flink基于…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...