一、变量
变量是计算机内存中的一块区域,存储规定范围内的值,值可以改变,通俗的说变量就是给数据起个名字。
1️⃣变量命名规则
变量名由字母、数字、下划线组成
数字不能开头
不可以使用关键字
简短且具有描述性
2️⃣变量的赋值
每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建;
等号(=)用来给变量赋值,等号(=)运算符左边是一个 变量名,等号(=)运算符右边是存储在变量中的值。
3️⃣多个变量赋值
Python允许同时为多个变量赋值。
二、设置颜色的方法
1️⃣pencolor()
pencolor()方法设置线条颜色:
调用pencolor方法时,需要在括号里输入颜色的值,否则返回当前画笔的线条颜色,默认的为黑色。
关于颜色的值,turtle是支持RGB颜色模式的,但我们通常使用各个颜色的英文单词来设置画笔颜色
2️⃣fillcolor()
fillcolor() 设置填充颜色:
turtle中颜色包含两个方面:线条色和填充色。填充色指的是一个封闭图形内部的颜色,正如正方形就是一个封闭图形,我们可以把它里面涂满颜色,这就是填充色。
填充颜色默认的也是黑色。通过调用fillcolor()方法来改变画笔的填充颜色,使得画面更加美观。别忘了在括号里输入颜色的值,否则也是返回当前画笔的填充颜色。
3️⃣color()
如果觉得分别用pencolor和fillcolor设置线条、填充颜色太麻烦,我们还可以使用color()方法同时设置这2个颜色。
和goto方法一样,color方法括号里接收两个参数,分别代表线条颜色和填充颜色。
4️⃣begin_fill() 和 end_fill()
begin_fill()和end_fill()没有参数,begin_fill被调用时用来记录填充颜色的起点,而end_fill被调用时用来记录填充颜色的终点。
注意:一定不要忘记begin_fill()、end_fill()需要同时出现才会有效果。
三、dot()方法
turtle绘图模块的dot()方法可以绘制一个半径为d的实心圆。
可以直接在dot()方法里面添加颜色参数
四、注释
五、延伸
思考:如果调用end_fill之前图形未封闭,会发生什么现象?
来源:http://www.6547.cn/blog/511
一、前言 今天给大家整理一些小编经常学习和访问的学习网站,供大家参考学习。
程序员一般的学习知识的来源:
官网学习网站B站视频博客网站平台课程看书 有没有其他的来源,欢迎一起交流哈!
大家有好的学习网站,欢迎补充哈,一起学习!
一下把自己珍藏多年的网站分享给大家,良心小编还不关注一下!
二、Java 全栈知识体系 网站直通车
这个是朋友推荐的,非常全面。有面试和知识体系两部分组成,在系统性复习的时候还是比较喜欢看的。网站是有广告的,但是盈利都用来买服务器了,多余的钱作者都拿来捐赠了,值得大家学习! 相信大家也知道这个网站。
作者:皮带哥
包含: Java 基础,Java 部分源码, JVM,,Spring,,Spring Boot,,Spring Cloud,数据库原理,MySQL,ElasticSearch, MongoDB,Docker,k8s,CI&CD,Linux, DevOps,分布式,中间件, 开发工具, Git, IDE,源码阅读,读书笔记,开源项目…
三、JavaGuide 网站直通车
和上面一样,也是面试和知识体系都有,一般小编看面试的会主要看这个网站,学习的花看皮带哥;有时间的话这两个还是都要看的,指南哥的有部分是需要加入星球才能看的,不能白嫖了!
作者: Guide哥
「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
把广告信息打码了哈!
四、互联网Java工程师进阶知识完全扫盲 网站直通车
这个比较适合中高级来看,快速提高自己的技术能力。看完这个你一定有所收获,拓展自己的知识面和实战能力。它们是一个系列中的一部分,大家可以详细去看看。
内容涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识。我们对这部分知识做了一个系统的整理,方便读者们学习查阅。
stars:72.9k
五、GitHub中文排行榜 网站直通车
这是一个把Github上所有的好项目整理在一起,并根据stars来排名的网站,并且一直在更新。没有个一年半载,够呛能看完,不局限于Java。
基本涵盖了大部分常用开发语言,值得一看!也有英文项目的排行榜,有余力的可以看看!
GitHub中文排行榜,各语言分设「软件 | 资料」榜单,精准定位中文好项目。各取所需,高效学习。
stars:76k
六、总结 有了学习的资料,我们开始加油学吧。活到老学到老!
整理不易,还请大家顺手点个关注。
1、接收cookie (1)接收所有cookie @RequestMapping("/request") @RestController public class RequestController { @RequestMapping("/c1") public String c1(HttpServletRequest request){ Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies){ System.out.println(cookie.getName() + ":" + cookie.getValue()); } return "获取cookie成功!"; } return "cookies为空"; } } (2)接收单个cookie @RequestMapping("/request") @RestController public class RequestController { @RequestMapping("/c2") public String c2(@CookieValue("java") String java){ return "java:" + java; } } 2、接收session 首先设置session @RequestMapping("/request") @RestController public class RequestController { @RequestMapping("/s1") public String s1(HttpServletRequest request){ HttpSession session = request.
码住了,照着再改改看一下
年薪40万,实际到手有多少?
#顺丰集团(31460)# 楼主是23应届生,java仔,不敢说多优秀,至少需求都正常交付,因为早就
『 哨哥的求职黑名单周报 』01/15 - 01/21
『 哨哥的求职黑名单周报 』01/15 - 01/21
华子发意向之后说武汉没hc了不能签约
华为2012被毁意向
后悔没有早点知道的那些实习tips(下)
华为2012被毁意向
华为2012被毁意向
华子发意向之后说武汉没hc了不能签约
百度-产品运营群面
嵌入式还是java
双非本通信9硕电子信息 目前大四 导师纯科研信号处理相关 不放实习 现在犹豫java还是嵌入式java 感觉选择面比较广 互联网大厂 银行国企央企等等 jav
华为开奖 已拒
华子东莞光,特批14a,主管很有诚意也很好,但是还是拒绝了,给兄弟们留个hc,求表扬😋
华为终端云服务,有兴趣的来撩~
岗位:1.AI工程师,包括大模型、自然语言处理/语音语义、计算机视觉、Al软件开发、机器学习、推荐搜索等方向。2.软件开发工程师,包括大数据开发工程师、数据库开
帆软 客户服务岗
有没有佬知道帆软的客户服务岗是干嘛的,不会就是我想的客服吧😥本来投的后端,给调剂到这个岗位了
机械人 offer 选择
大佬们给点建议 杭州无房无车 打算在杭州发展 父母也在杭州 工作怎么选比较靠谱 #如果可以选,你最想从事什么工作#
求助
有人了解聚时科技吗? 会卡转正或者裁员吗
offer选择
#offer应该如何选# 大佬们,目前是签了小米,接到了邮储数管部的offer,不知道该如何做选择,求求! #offer怎么选才不后悔# 个人情况:女 想留北京
华为
华为
蒟蒻求助帖
中国电信广州分行VS广州银行电信总包19,包吃,住宿前五年几百块,后面市场价。研发工程师。三方里写转正后1W。广州银行金融科技岗,总包21,包吃,住按照平米给钱
求大佬的意见 引流 华为 阿里 中兴
真诚想来求求各位牛友的意见,bg双飞本2硕,学校导师这边卡小论文比较严重,目前来看极大概率是到9月份才能毕业了,现在秋招已经签了一个三方了(但是平台不大,其实并
选女朋友还是选offer
北京美团的offer女朋友杭州读研,杭州只有一个海康的offer,工资差6k
前言 快过年了
今天分享用python实现一场烟花秀
感兴趣的小伙伴,提前收藏起来,一定要看到最后!
话不多说
1.首先制作一个绚丽的夜空
制作夜空,其实就是设置画布。大家知道,夜晚的天空月明如水,星光攒动,绚丽至极。如果把所有的夜空景象都用turtle库绘制出来确实非常的费时、费力。而且,绘制月亮、繁星这些景色本身也不是我们本篇文章的终点。因此,在夜空制作这一块,我们讨了个巧,是选用背景图片来实现的,如下图。
(星空图片)
(月亮图片)
好了,照片选用完毕后,下面开始用代码来制作夜空,具体如下。
import turtle wn=turtle.Screen() wn.colormode(255) wn.bgpic('星光back.gif') wn.setup(1920,1080) wn.register_shape('月亮.gif') wn.register_shape('星光.gif') wn.register_shape('liuxing.gif') #月亮 moon=turtle.Turtle() moon.shape('月亮.gif') moon.shapesize(0.2,0.2) moon.up() moon.goto(-400,250) 运行后,效果如下图所示。
2.接下来制作一个炮竹
大家知道,燃放烟花是从点燃炮竹开始的,当炮竹上升到一定的高度后,引擎被点燃,然后烟花会被炸裂出来。所以接下来,我们要绘制炮竹。我们的炮竹形状计划就采用长方形,这种形状正好可以采用画笔的形状‘square’。具体代码如下。
#炮竹 firecracker=turtle.Turtle() firecracker.up() firecracker.goto(0,-200) firecracker.lt(90) firecracker.speed('fastest') firecracker.color('white') firecracker.shape('square') firecracker.shapesize(0.2,0.8) 注意,最后的代码
firecracker.shapesize(0.2,0.8) 3.来制作烟花
接下来开始说重点,来介绍一下如何制作烟花。制作烟花是本文的重点。
由上图容易看出,烟花其实可以看成由一些形状相似的图形聚集在一起构成的。其原理是,首先将形状相似的同类图形聚集在一起,然后,短时间内向四周炸开。据此,我们也采用类似的方法。与以上炮竹的制作类似,我们这里也利用turtle的画笔形状作为烟花的基本形状,代码如下。
firworks=[] shape=['circle','classic','square','triangle','arrow','turtle'] for i in range(25): newfirework=turtle.Turtle() newfirework.speed('fastest') newfirework.up() newfirework.ht() newfirework.shape('circle') newfirework.shapesize(0.5,2.5) firworks.append(newfirework) 容易看出,以上代码中,将烟花在Python中被定义为一组形状相同的画笔列表firworks。
好了,炮竹与烟花都有了,接下来,我们计划让二者协同工作,即,首先让炮竹firecracker向上运行一段,当倒达一定高度后让烟花firworks聚集在一起,并短时间炸开。具体代码如下。
while True: high=200 wn.update() firecracker.fd(10) for firework in firworks: firework.fd(60) if firecracker.ycor()==high: color = (random.
背景 上一篇帖子我们使用 Flask 创建了最基本的 web 服务。使用 bootstrap 对页面进行装点,使用 JQuery Ajax 实现了在页面上实时显示 log 的功能。趁着周末,我继续开始学习更多的东西以满足这个 web 服务的需求。
模板继承 之前我们有了首页,有显示 log 的页面。之后我们还需要查看配置详情和创建新配置的页面。 那么我们会在页面中有很多重复的东西。例如我们所有的页面都有导航页,所有页面都要加载 JQuery。我们希望写页面的时候可以像写 python 一样可以使用对象的继承功能以减少重复的代码。所以我们用 Flask 的模板继承功能来写页面。现在我们创建一个 base.html。 代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 引入 Bootstrap --> <link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 Shim 和 Respond.js 用于让 IE8 支持 HTML5元素和媒体查询 --> <!-- 注意: 如果通过 file:// 引入 Respond.js 文件,则该文件无法起效果 --> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> <script type=text/javascript src="{{ url_for('static', filename='jquery.
1.信号与槽的基本概念 在PyQt中,信号是一种对象间通信的机制。当某个特定事件发生时,一个信号被发射。槽是接收信号的方法,当信号被发射时,与之连接的槽会被调用。这种机制使得不同部分的代码能够松耦合地交流。
2.PyQt中的信号与槽语法 在PyQt中,使用QObject的子类可以发射信号,而使用@pyqtSlot装饰器可以定义槽。以下是一个简单的例子:
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot class MyObject(QObject): # 定义一个信号 my_signal = pyqtSignal(str) @pyqtSlot(str) def my_slot(self, data): print(f"Received data: {data}") # 创建对象 obj = MyObject() # 连接信号与槽 obj.my_signal.connect(obj.my_slot) # 发射信号 obj.my_signal.emit("Hello, PyQt!") 3.在GUI应用程序中的应用 在实际的GUI应用程序中,信号与槽的机制特别有用。例如,当用户点击按钮时,可以发射一个信号,然后与之连接的槽可以执行相应的操作。以下是一个简单的例子:
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget class MyWidget(QWidget): def __init__(self): super().__init__() # 创建按钮和布局 self.button = QPushButton("Click me!") layout = QVBoxLayout(self) layout.addWidget(self.button) # 连接按钮的点击信号与槽 self.button.clicked.connect(self.on_button_click) def on_button_click(self): print("Button clicked!") # 创建应用程序和主窗口 app = QApplication([]) window = MyWidget() window.
声明 本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负!
如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦!
前言 目标网站:aHR0cDovL3d3dy5mYW5nZGkuY29tLmNuL25ld19ob3VzZS9uZXdfaG91c2VfZGV0YWlsLmh0bWw=
在此十分感谢十一姐与K哥爬虫两位大佬的指导。
插句个人内容:本人最近正在找工作,工作城市:广州。如果有合适的机会,希望有大佬可以内推,感激不尽。🙏
js逆向马马虎虎,app会弱一些。感兴趣的大佬可以私信本人要简历。
参数分析 对于很多的爬虫工程师来说,rs可以说是一座难以攀爬的大山了,确实是这样。不过有逆向就是这样【耐心+细心=大佬】
废话不多说正式进入主题,rs最显著的特征之一就是cookie反爬,相信很多人都已经了解过了,对于4代来说。会发送两次请求(以本网站为例),第一次会发送一个202的请求,服务器端会生成第一个cookie,然后通过客户端生成cookie并且携带第一次生成的cookie请求,然后发送第二次的请求获取数据,也就是状态码为200的请求。
打开F12后会出现两个debugger,如图:
鼠标右键 Never pause here,就可以轻松过掉了。当然也可以使用最新版的火狐浏览器。
通杀无限 debugger,目前只有 1% 的人知道!
第二个属于百度统计,不影响,可忽略。
HttpOnly就是服务器生成,反之客户端生成。
最为主要的就是FSSBBIl1UgzbN7N80T,长度为217位。
所以主要目标也就是本地复现该cookie的算法。
既然已经知道是cookie的问题,没有什么比hook cookie来的快了。
直接使用油猴脚本注入,刷新页面即可断住。
找到所需的cookie,然后回溯堆栈。
hook会断住两次,可以看到组装的过程,第一次生成了一个假的cookie,但是后面会使用到,第二次才是真正的cookie。
扣代码 一共分为两部分,假cookie的算法逻辑和真cookie的算法逻辑。
推荐使用vscode调试,pycharm实在是太卡了。
假cookie逻辑 开始之前最好把首页代码固定一下,避免意外发生,因为是动态生成的。
简单看一下202页面的内容:
content的内容随着每次请求都是变化,后面在VM中的初始化会使用;c.FxJzG50F.dfe1675.js 打开是乱码,里面包含了重要内容window.$_ts,并且会执行生成庞大的VM代码,至关重要。script的内容也会使用到部分逻辑。 通过前文的hook,向上追溯堆栈,其实就能发现函数入口。
或者直接搜索.call。
为了方便每次都能够调试,我们需要找到函数入口,在这里简单修改一下代码,在call上方加上debugger,这样就可以自动断住了。
前期的准备工作到这里就okl,那么现在要处理第一个cookie了。
_$vK 就是第一个假cookie,为了方便美观简单修改一下代码。
接下来不断的运行,会不断的报缺少各种函数和变量未定义的错误,只需要慢慢补就可以了,然后再和网页上对比生成是否一致即可。
到此第一步就完成了。
需要注意:
content在这里被使用了,需要留意使用位置。 在代码开头就已经使用,WR函数获取到了meta标签中的内容并返回。
执行后再删除removeChild。
2、代码运行参数对比发现异常时就要注意在代码开始时是否已经被调用过了。
3、留意window.$_ts被使用的地方,后续要动态变化。
经过一系列的缝缝补补就生成了第一个cookie。
和网页对比一下。
一模一样,第一步结束。
函数接着向下会判断cookie是否存在。
看一下5G函数。
给os赋值"FSSBBIl1UgzbN7N80T",这个也是为什么前文会被hook两次的原因。
Ut函数就是hook的逻辑,就是document.cookie的赋值,没什么好说的。
_$uw是localStorage,复制下来即可,不是很重要。
真cookie逻辑 剩下的就是第二层真cookie的生成了,跳进去会发现进入了无尽的if-else,顶着头皮硬刚几个小时就可以拿下来了。
在这里可以使用watch记录控制流的变化,发现大佬的文章处处是细节。
控制流的顺序如下:
这是比较大的控制流,其中还有不少小的控制流嵌套在其中。
在这里可以选择将每个控制流组成一个函数,也可以使用switch-case的方法。
本文选择的是第一种。
第一步会跳到747号,直接拿下。
此时可以这样定义函数
function _$eQ768() { var _$vK = _$eQ747(1); …… } 继续F11跳进747号,然后继续定义函数,往里面填充内容,依然是缺啥补啥。
计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题:
第一个问题
一个卷积操作,他的参数,也就是我们要训练的参数,也就是我们说的权重,有多少个? 看到一个nn.Conv()函数,就能知道有多少个,它由那些因子决定的?
参数量是由以下3个因子决定的:
卷积核大小(HxW)卷积核维度(D)卷积核有多少个 则卷积层的参数量为 卷积核大小(HxW) * 卷积核维度(D) * 卷积核有多少个
第二个问题
一个全连接操作,参数又有多少个?它由那些因子决定的?
输入大小为 N输出大小为 M 则全连接层的参数量为 N×M
计算CNN卷积层的参数量 案例1 动态演示
看上图案例1的计算,输入图像为 5x5x1, 卷积核3x3x1, 输出3x3x1;
思考3个参数:
卷积核大小(HxW) ==》3x3卷积核维度(D) ==》1卷积核有多少个 ==》1 参数量为 3x3x1x1 = 9个
案例2 看上图案例2的计算,输入图像为 H1xW1x3, 卷积核3x3x3, 输出H2xW2x1;
思考3个参数:
卷积核大小(HxW) ==》3x3卷积核维度(D) ==》3卷积核有多少个 ==》1 参数量为 3x3x3x1 = 27个
从上面的两个案例可以看出, 参数量与输入图像的HxW没有关系, 参数量与输出图像的HxW也没有关系。
案例3 VGG-16为例,conv1-1,第一层
输入224x224x3, 输出是224x224x64,卷积核3x3
12月15日,2023 英特尔新品发布会暨 AI 技术创新派对上,星环科技基于第五代英特尔®至强®可扩展处理器的Transwarp Hippo分布式向量数据库解决方案重磅发布。该方案利用第五代英特尔®至强®可扩展处理器带来的强大算力,实现了约 2 倍的代际性能提升,可有效满足大模型时代海量、高维向量的存储和计算需求,能够帮助企业更好地应对大模型时代海量、多维向量数据的高并发和实时计算等挑战。
基于不同代际英特尔®至强®可扩展处理器的 Transwarp Hippo 性能对比
以大语言模型为代表的人工智能 (AI) 应用出现爆炸式增长背景下,企业对于非结构化数据的存储与处理需求出现了快速增长,分布式向量数据库得到了普遍应用。分布式向量数据库在大模型应用中扮演着重要角色,大模型+向量数据库的架构能够让大模型保持数据的实时性,使大模型拥有 “长期记忆”,解决模型需要多次二次训练才能满足不同业务需求。同时,通过多模态信息的向量化,帮助大模型满足回答信息实时性要求。
星环科技分布式向量数据库 Transwarp Hippo 作为一款企业级云原生分布式向量数据库,基于分布式特性,可以对文档、图片、音视频等多源、海量数据转化后的多维向量进行统一存储和管理,能够通过水平扩展架构,充分发挥并行检索能力,实现毫秒级高性能数据检索,结合相似度检索等技术,帮助用户快速挖掘数据价值。
星环科技分布式向量数据库 Transwarp Hippo 产品架构
星环科技分布式向量数据库Transwarp Hippo 主要优势:
一站式:提供向量转化工具和Embedding模型,一站式完成模型上架、模型评估和模型部署,降低用户使用成本,提高数据入库效率。
高精度:多类索引支持,一库搞定向量+全文联合检索,提高大模型召回准确率;结合自研图数据库,可进一步提高大模型精度。
高性能:支持多进程架构与GPU加速,充分发挥并行检索能力,结合软硬件深度优化,充分发挥CPU多核、高内存带宽等优势,为海量、多维向量提供强劲算力。
易对接:提供标准的Python、Restful、Java API等接口,可轻松对接各类应用和模型,提高应用开发和调用的效率。
在搭配第五代英特尔®至强®可扩展处理器之后,星环科技分布式向量数据库Transwarp Hippo 能够提供强大的性能基础,在大模型等场景创造巨大价值。
支撑数据的高效处理:基于第五代英特尔®至强®可扩展处理器的 Transwarp Hippo 能够实现海量、高维度向量数据处理,并具备低时延、高精确度等优势,可以满足大模型训练等场景对于数据处理能力的苛刻要求。
降低向量数据库的总体拥有成本 (TCO):由于第五代英特尔®至强®可扩展处理器实现了代际性能的大幅提升,有助于提升 Transwarp Hippo 服务器节点的性能密度,帮助用户节省在服务器采购、部署等方面的投资。同时,第五代英特尔®至强®可扩展处理器在性能提升的同时,具备更高的每瓦性能,有助于节省单位性能的能耗支出。
具备性能进一步提升潜力:除了更多的核心数量,更快的 IPC 性能之外,第五代英特尔®至强®可扩展处理器还搭载了英特尔® In-Memory Analytics Accelerator(英特尔® IAA)等硬件加速特性,有助于进一步提升数据库等场景的性能。
基于第五代英特尔®至强®可扩展处理器的星环科技分布式向量数据库 Transwarp Hippo,提供了领先的性能表现,可以有效地解决大模型在知识时效性低、输入能力有限、准确度低等问题。通过将最新资料、专业知识、个人习惯等海量信息向量化存储在星环科技分布式向量数据库 Transwarp Hippo 中,企业可以有效拓展大模型的应用边界,让大模型保持信息实时性,并能够动态调整。
同时,星环科技能够为企业提供大模型应用开发全周期的技术和产品,通过Transwarp Hippo向量数据库和大模型统一运营管理平台Sophon LLMOps、金融大模型Transwarp Infinity“星环无涯”、大数据分析大模型Transwarp SoLar“求索”等产品组合,帮助每个企业更快、更精确地打造真正符合实际需求的专属领域大模型,促进生产力提升,加速业务创新和价值实现。
文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。
总体方差的检验 一个总体方差的检验 在生产和生活的许多领域,方差的大小是否适度是需要考虑的一个重要因素。一个方差大的产品意味着其质量或性能不稳定。相同均值的产品,方差小的自然要好些。与总体方差的区间估计类似,一个总体方差的检验也是使用 分布。此外,总体方差的检验,不论样本量n是大还是小,都要求总体服从正态分布。检验统计量为
对于设定的显著性水平 ,双侧检验的拒绝域如下图所示。对于单侧检验拒绝域在分布一侧的尾部
例题:
啤酒生产企业采用自动生产线灌装啤酒,每瓶的填装量为640ml,但由于受某些不可控因素的影响,每瓶的填装量会有差异。如果 很大,会出现填装量太多或太少的情形,这样,要么生产企业不划算,要么消费者不满意。假定生产标准规定每瓶填装量的方差不应超过16。企业质检部门抽取了10瓶啤酒进行检验,得到的样本数据如下。检验填装量的方差是否符合要求( =0.05)
638.3 642.0 640.4 641.1 637.2 643.3 643.7 640.5 639.8 644.2
sigma.test(x,sigmasq= ,alternative=" ")
load("C:/example/ch6/example6_11.RData") library(TeachingDemos) sigma.test(example6_11$填装量,sigmasq=16,alternative="greater") 两个总体方差比的检验 (数据: example6_6. RData)沿用例6-6。检验两家企业灯泡使用寿命的方差是否有显著差异( =0.05)
load("C:/example/ch6/example6_6.RData") var.test(example6_6[,1],example6_6[,2],alternative="two.sided") 非参数检验 以上介绍的参数检验(如t检验、F检验等)通常是在假定总体服从正态分布或总体分布形式已知的条件下进行的、而且要求所分析的数据是数值的。
当总体的概率分布形式未知、或者无法对总体的概率分布做出假定时,参数检验方法往往会失效,这时可采用非参数检验。非参数检验方法不仅对总体的分布要求很少,对数据类型的要求也比参数检验宽松。当数据不适合用参数检验时,非参数检验往往能得出理想的结果。本篇主要介绍总体分布的检验以及几种常用的参数检验的替代方法。
总体分布的检验 在实际问题中,除了关心总体参数外,还会关心总体的分布,比如,总体是否服从正态分布,两个总体的分布是否相同,等等。
介绍检验正态性的几种方法,它是根据样本数据检验总体是否服从正态分布,或者说样本数据是否来自正态总体,检验方法有图示法和检验法。图示法主要有Q-Q图和P-P图,检验法主要有 Shapiro-Wilk检验和 Kolmogorov- Smirnov检验(K-S检验)等。
正态性检验的图示法 判断数据是否服从正态分布的描述性方法之一,就是画出数据频数分布的直方图或茎叶图,若数据近似服从正态分布,则图形的形状与正态曲线应该相似。但实际中更常用的方法是绘制样本数据的正态概率图( normal probability plots)。正态概率图有两种画法,一种称为Q-Q图( quantile-quantile plot),一种称为P-P图( probabilit probability plot)。
Q-Q图是根据观测值的实际分位数与理论分布(如正态分布)的分位数的符合程度绘制的,有时也称为分位数-分位数图;P-P图则是根据观测数据的累积概率与理论分布(如正态分布)的累积概率的符合程度绘制的。
下图是用R模拟的几种不同分布的Q-Q图
例题:
(数据: example6_3.RData)沿用例6-3。会制Q-Q图和P-P图,检验该城市每立方米空气中的PM2.5是否服从正态分布。
# 绘制Q-Q图 qqnorm(x,xlab=" ",ylab=" ",datax=TRUE,main="正态Q-Q图") qqline(x,datax=TRUE,col="") # 绘制P-P图 f<-ecdf(x) p1<-f(x)#y<- ecdf(x);y(x);plot(x,y(x), ylab = "
Step1:打开剪辑页,点击下方【文字·贴图】
undefined
Step2:点击【花字贴图】,选择【基础文字】
undefined
Step3:输入文字内容,即可添加到视频中
undefined
Step4:添加好文字后,你可以拖动或双指缩放文字,改变文字的位置与大小
undefined
Step5:点击画面中已添加的文字,还可以:
【切换字体】:改变文字的样式
undefined
【自定义文字】:改变字色、描边,背景、阴影
undefined
【改变样式】:字号、间距、排列方式
undefined
文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中,使用最多的无疑就是各种函数、图表、代码和说明文档,这些复杂的内容不仅让使用的人头晕脑胀,也让普通的聊天工具一脸蒙圈。沟通工具不给力,就没法协同办公,可数据分析又离不开多人配合,所以Jupyter Notebook就成为大部分数据工作人员的必备工具。正如之前所说,Jupyter Notebook很适应复杂内容的沟通,因此现在也在机器学习、深度学习和教育工作中获得广泛应用。
但Jupyter Notebook也有缺陷,就是被局限在局域网范围。那有什么工具能让Jupyter Notebook在公共互联网下使用吗,答案自然是肯定的。现在我们就来看看,如何[cpolar](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)与Jupyter Notebook配合,实现在公共互联网使用数据分析工作的无缝配合。
2.Jupyter Notebook的安装 由于jupyter notebook来源于IPython,所以想要安装使用jupyter notebook,就要先安装Python环境。好在Python安装并不复杂,直接到Python官网下载合适版本安装即可。
在安装Python时需要注意的是,要记得在安装界面下方勾选Add python.exe to PATH选项,即将python加入环境变量中。
Python安装完成后,就可以进行jupyter notebook的安装。
2.1 Jupyter Notebook下载安装 要安装jupyter notebook,我们需要打开windows的命令行界面,在命令行界面输入命令
pip install jupyter 系统会自动进行安装程序
安装完成后,再输入命令
jupyter Notebook 就能启动jupyter notebook程序
程序启动后,会在最下方显示jupyter notebook的地址,只要在浏览器中贴入这个地址(或者直接输入端口地址)就能打开jupyter notebook。
2.2 Jupyter Notebook的配置 由于我们的jupyter notebook需要连入公共互联网使用,因此有必要加入一道密码防护,并允许互联网连接。
先关闭之前的命令行窗口,再新开一个命令行窗口,输入命令
jupyter notebook --generate-config 新建一个配置文件,此时程序会反馈这个配置文件的所在位置,需要记住这个位置方便之后的操作。
接着输入创建访问密码的命令
jupyter notebook password 系统会要求输入两次密码(确认密码)。输入新密码后,就会反馈密码已经加入配置文件中。
最后,依照之前显示的config文件存放位置,打开jupyter_notebook_config.json文件,将其中那一长串密文复制下来。
Echarts脚本在线地址 https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js
引入Echarts 脚本后粘贴代码 vue2 代码:
<template> <div> <div ref="col-2-row-2" class="col-2-row-2"></div> </div> </template> <script> export default { data() { return { config: { list: [ {name: "垃圾治理", id: "scene_type_2", value: 11}, {name: "生活垃圾", id: "random_clap_type_3", value: 5}, {name: "水域治理", id: "scene_type_5", value: 1}, {name: "生活污水", id: "random_clap_type_2", value: 4}, {name: "文明乡风", id: "random_clap_type_6", value: 10}, {name: "农业废弃物", id: "random_clap_type_4", value: 2}, {name: "农村厕所", id: "random_clap_type_1", value: 6}, {name: "其他问题", id: "
随着人工智能和机器学习的快速发展,深度学习已经成为了许多领域的重要工具。然而,深度学习的应用需要强大的计算能力,因此对于想要进行深度学习的用户来说,选择一台合适的电脑是必不可少的。本文将重点介绍深度学习电脑配置的要求。
处理器(CPU):深度学习需要大量的计算资源,因此一台好的处理器是必不可少的。对于深度学习而言,建议选择多核心的处理器,例如Intel Core i7或i9。同时,处理器的时钟频率也会影响深度学习的速度,因此如果预算允许,可以选择频率更高的处理器。内存(RAM):深度学习需要大量的内存来存储数据和变量。建议选择至少16GB RAM的电脑,如果进行大型深度学习项目,则需要更高的内存。显卡(GPU):GPU是深度学习中最重要的硬件之一。它比CPU更高效地执行深度学习算法,并且可以加快训练速度。建议选择NVIDIA的GPU,例如GeForce GTX 1080或Quadro P5000。存储(SSD):由于深度学习需要处理大量的数据,因此建议选择至少512GB的SSD硬盘。同时,SSD硬盘的读写速度比传统的机械硬盘更快,可以加快数据处理的速度。操作系统(OS):深度学习的操作系统建议选择Windows或Linux。Mac OS也可以用于深度学习,但是由于其硬件限制和价格较高,对于深度学习而言可能不是最佳选择。其他选项:如果需要进行更大型的深度学习项目,可以选择更高的配置,例如更多的GPU或更快的网络连接。此外,如果需要在笔记本上进行深度学习,可以选择一些轻薄本或游戏本等性能较高的笔记本。
总之,一台好的深度学习电脑应该具备强大的处理器、大内存、高性能的GPU、快速存储以及兼容的操作系统等要求。只有这样才能够满足深度学习的需求并加快训练速度和提高准确性。
除了以上提到的硬件配置外,还有一些软件配置也需要考虑:编程语言:深度学习常用的编程语言包括Python、R、Java等。建议选择Python作为主要的编程语言,因为它有更多的深度学习库和工具可供使用。深度学习框架:深度学习框架是用于构建和训练神经网络的软件库。目前最流行的深度学习框架包括TensorFlow、PyTorch、Keras等。选择一个适合自己的框架并熟练掌握其使用方法是非常重要的。数据处理工具:深度学习需要大量的数据进行训练。建议选择像NumPy、Pandas、Scikit-learn等数据处理工具来帮助进行数据清洗、预处理和增强等操作。版本控制工具:在进行深度学习开发时,版本控制工具可以帮助管理代码和模型版本,避免出现混乱或丢失代码的情况。常用的版本控制工具有Git等。Jupyter Notebook/IDE:Jupyter Notebook是一个交互式的Web应用程序,可以在其中编写和运行代码并显示结果。它也支持可视化输出和文档生成等功能,非常适合深度学习的开发和调试。其他集成开发环境(IDE)如Anaconda、Spyder等也可以用于深度学习的开发。
总之,深度学习的电脑配置需要考虑硬件和软件两方面的因素。在选择电脑时需要考虑到自己的需求和预算,并选择适合自己的配置。同时熟练掌握相关的软件工具和技术也是非常重要的。
--问题描述 [root@ecs-1cf5-0003 soft]# rpm -ivh mongodb-mongosh-2.1.1.aarch64.rpm Verifying... ################################# [100%] 准备中... ################################# [100%] package mongodb-mongosh-2.1.1-1.el8.aarch64 does not verify: Payload SHA256 digest: BAD (Expected 5ed6e23537c12144aff2f68fc80f746d57413aecaaa8bb1722dc125cb5d8c038 != 6c6ad7aabc96e01e8833671ee87a1167bf5149845b77f7e2fd113a7b414370a5) --解决办法 增加--nodeps --force参数 [root@ecs-1cf5-0003 soft]# rpm -ivh mongodb-mongosh-2.1.1.aarch64.rpm --nodeps --force Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:mongodb-mongosh-2.1.1-1.el8 ################################# [100%]
1.工程中加入静态资源 在webapp下创建static文件夹,此文件夹专门放入静态资源
2.使项目可以处理静态资源的请求 在SpringMVC配置文件中添加以下语句
1.引入命名空间
xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=“http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd“” 2.开启默认servlet处理
<mvc:default-servlet-handler/> <!----开启注解--> <mvc:annotation-driven/> 这个开启注解必须添加,否则servlet请求就会被默认servlet处理。添加之后,首先被SpringMVC的servlet处理,如果它无法处理,就会交给默认的servlet处理。
大地电磁测深法(MT)诞生于20世纪50年代,是一种以天然交变电磁场为场源,通过测量地表相互正交的电场和磁场,获得地下电性结构信息的地球物理方法。与有源的电磁勘探方法相比,天然大地电磁场频带范围宽且本身信号极其微弱,野外观测到的大地电磁信号不可避免地会受到各种噪声的污染。尤其是在矿集区,随处可见的高压电网、广播电台、通讯电缆、信号发射塔、各种金属管网以及用于矿山开采的大功率直流电机车等严重影响了实测大地电磁信号的采集,大地电磁测深数据质量极具下降,阻抗估算偏差严重及测量获得的视电阻率值过度失真等状况导致不能客观反映地下电性分布。为此,如何消除大地电磁信号中的噪声干扰、提高大地电磁测深数据质量是国内外长期瞩目并不断取得进展的研究课题。诸多现代信号处理方法,如Hilbert-Huang变换、广义S变换、方差比维纳滤波、同步时间序列依赖、数学形态滤波、子空间增强等均被应用到该领域,并在一定程度上对大地电磁测深数据质量起到了积极的改善作用,推动了MT法在与各种噪声竞争中不断成长。
提出一种基于多分辨奇异值分解和改进完备集成经验模态分解的大地电磁数据降噪方法,多分辨奇异值分解算法是受小波包算法启发,使用递归分解的形式将信号进行多层SVD分解从而实现多分辨率分析,结合改进完备集成经验模态分解算法对大地电磁数据进行降噪,取得了不错的效果。
工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家,担任《计算机科学》,《电子器件》 , 《现代制造过程》 ,《电源学报》,《船舶工程》 ,《轴承》 ,《工矿自动化》 ,《重庆理工大学学报》 ,《噪声与振动控制》 ,《机械传动》 ,《机械强度》 ,《机械科学与技术》 ,《机床与液压》,《声学技术》,《应用声学》,《石油机械》,《西安工业大学学报》等中文核心审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。
clc clear all close all %% Simulated charge discharge triangular wave x1=100*randn(1,5000); x=addsj(x1,5,8,200,4); xx=[-x(1501:3000) x(1001:1700) -x(1201:2000) x(2001:4000)]; x1=[-x1(1501:3000) x1(1001:1700) -x1(1201:2000) x1(2001:4000)]; x2=xx-x1; xx=load('OriginalSignal.dat'); xx=xx-mean(xx); fids1=fopen('OriginalSignal.dat','wt'); fprintf(fids1,'%10.0f%10.0f',xx); fclose(fids1); [S,F,T,P] = spectrogram(xx,256,250,256,150); figure(1) subplot(221); sf= surf(T,F,10*log10(P)) sf.EdgeColor = 'none'; % view(0,90); % colorbar axis tight xlabel('time (s)') ylabel('frequency(Hz)') figure(2) subplot(221) fs=150;t=(0:length(xx)-1)/fs; plot(t,xx,'r');ylabel('amplitude');legend('original signal'); %% Simulated square wave signal %% square wave x3=load('moni_fangbo.
目录 远程环境配置本地环境配置(注意看假设!!!这是很多博客里没写的)步骤1步骤2步骤2.1 配置Connection步骤2.2 配置Mappings 步骤3 配置本地项目的远程解释器技巧1 pycharm中远程终端连接技巧2 远程目录技巧3 上传代码文件技巧4 数据集和模型权重相关技巧5 运行代码技巧6 使用git管理代码 1、 仅以此篇记录整个pycharm 远程连接服务器,跑通深度学习代码的过程 2、整个过程花费了一天的时间,不过最终的结果可喜可贺 3、 整个过程非常冗长,对于 初次上手的小伙伴可能 不是很友好,不过还是希望你能够坚持着看完。 孰能生巧。 4、本篇的 重点是本地环境的配置,远程环境的配置会一笔带过 远程环境配置 首先是远程服务器端环境的配置(默认大家已经安装完minconda或者conda,且对GPU cuda的版本有所了解)
1、利用conda 开设一个新的虚拟环境
2、激活虚拟环境
3、安装相关的python库
本地环境配置(注意看假设!!!这是很多博客里没写的) 注:假设你已经在本地写完了代码或者从github上拉取了代码放在本地,接下来要把代码放到服务器上运行,并且数据集和相关的权重文件放在服务器上,那么接下来你需要做如下的配置。
步骤1 首先打开当前的项目,删除项目下的.idea文件,注意这个很关键
然后Tools——》Deployment ——》Configuration,打开配置
步骤2 步骤2.1 配置Connection 接下来我们需要配置两个东西,一个是Connection,一个是Mappings。
新建SFTP
创建一个名字,随便取,有辨识度就行
点击右边的三个点
新建SSH连接,填写相关内容
成功时会显示这个
然后点击OK
回到Connetion页面,选择刚刚配置的SSH,取消同步
步骤2.2 配置Mappings 步骤3 配置本地项目的远程解释器 接下来是最后一步,配置本地项目的远程解释器
选择existing,选择之前创建的那个connection ,再点击两次Next
接着到达如下页面:
选择Virtualenv Environment
选择Existing
python解释器选择步骤1中创建的虚拟环境中的python解释器,如果找不到,可以用conda activate 虚拟环境名 激活,然后which python 命令找到解释器
目录映射同步骤2.2的Mappings
自动同步上传取消勾选
点击create
如果能看到解释器中安装的相关包,说明环境配置成功,到这里基本就结束了,下面是一些心得体会和小技巧
技巧1 pycharm中远程终端连接 技巧2 远程目录 技巧3 上传代码文件 注:在前面的配置中,代码同步都是被我关闭的,刚开始上手的话不用开启自动同步功能,等大家熟练之后可以把自动同步上传功能开启,这样方便代码上传
文章目录 RESTFul一、基础概念二、增删改查1.查询全部用户信息 (GET)2.根据id查询用户信息3.添加用户(POST)4.修改用户 (PUT)5.删除用户 (DELETE) RESTFul 一、基础概念 二、增删改查 配置web.xml,使可以使用PUT,DELETE
<!-- 配置请求方法--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 1.查询全部用户信息 (GET) @RequestMapping(value = "/user",method = RequestMethod.GET) public String getAllUser() { System.out.println("获取全部用户信息"); return "target"; } 2.根据id查询用户信息 @RequestMapping(value = "/user/{id}",method = RequestMethod.GET) public String getUserById() { System.out.println("根据ID获取用户信息"); return "target"; } 3.添加用户(POST) @RequestMapping(value = "/user",method = RequestMethod.POST) public String addUser(String username,String password) { System.out.println(username+","+password); return "target"; } 4.修改用户 (PUT) @RequestMapping(value = "/user",method = RequestMethod.
文章目录 KNNSVM朴素贝叶斯决策树随机森林 KNN “近朱者赤,近墨者黑”可以说是 KNN 的工作原理。
整个计算过程分为三步:
计算待分类物体与其他物体之间的距离;统计距离最近的 K 个邻居;对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。 说说向量的距离。在KNN和其他机器学习算法中,常用的距离计算公式包括欧氏距离和曼哈顿距离。两个向量之间,用不同的距离计算公式得出来的结果是不一样的。
欧氏距离是欧几里得空间中两点间的“普通”(即直线)距离。在欧几里得空间中,点x=(x1, … ,xn)和点y=(y1, … ,yn)之间的欧氏距离为:
曼哈顿距离,也叫方格线距离或城市区块距离,是两个点在标准坐标系上的绝对轴距的总和。!在欧几里得空间的固定直角坐标系上,曼哈顿距离的意义为两点所形成的线段对轴产生的投影的距离总和。在平面上,点x=(xi,.,!x.)和点y=(yi,.,yn)之间的曼哈顿距离为:
下图的两个点之间,1、2与3线表示的各种曼哈顿距离长度都相同,而4线表示的则是欧氏距离。
下图中的两个特征,就形成了二维空间,图中心的问号代表一个未知类别的样本。如何归类呢,它是圆圈还是叉号?如果K=3,叉号所占比例大,问号样本将被判定为叉号类;如果K=7.则圆圈所占比例大,问号样本将被判定为圆圈类。
因此,KNN算法的结果和K的取值有关系。要注意的是,KNN要找的邻居都是已经“站好队的人”,也就是已经正确分类的对象。
SVM 用 SVM 计算的过程就是帮我们找到那个超平面的过程,这个超平面就是我们的 SVM 分类器。
主要说说超平面(hyperplane)和支持向量( support vector)这两个概念。超平面,就是用于特征空间根据数据的类别切分出来的分界平面。如下图所示的两个特征的二分类问题,我们就可以用一条线来表示超平面。如果特征再多一维,可以想象切割线会延展成一个平面,以此类推。而支持向量,就是离当前超平面最近的数据点,也就是下图中被分界线的两条平行线所切割的数据点,这些点对于超平面的进一步确定和优化最为重要。
如下图所示,在一个数据集的特征空间中,存在很多种可能的类分割超平面。比如,图中的H0实线和两条虚线,都可以把数据集成功地分成两类。
是实线分割较好,因为这样的分界线离两个类中的支持向量都比较远。SVM算法就是要在支持向量的帮助之下,通过类似于梯度下降的优化方法,找到最优的分类超平面——具体的目标就是令支持向量到超平面之间的垂直距离最宽,称为“最宽街道”。
那么目前的特征空间中有以下3条线。
H0就是目前的超平面。与之平行的H1H₂线上的特征点就是支持向量。
这3条线,由线性函数和其权重、偏置的值所确定:
然后计算支持向量到超平面的垂直距离,并通过机器学习算法调整参数w和b,将距离(也就是特征空间中的这条街道宽度)最大化。这和线性回归寻找最优函数的斜率和截距的过程很相似。 普通的SVM分类超平面只能应对线性可分的情况,对于非线性的分类,SVM要通过核方法( kernel method)解决。核方法是机器学习中的一类算法,并非专用于SVM。它的思路是,首先通过某种非线性映射(核函数)对特征粒度进行细化,将原始数据的特征嵌入合适的更高维特征空间;然后,利用通用的线性模型在这个新的空间中分析和处理模式,这样,将在二维上线性不可分的问题在多维上变得线性可分,那么SVM就可以在此基础上找到最优分割超平面。
朴素贝叶斯 朴素贝叶斯是一个通过条件概率进行分类的算法。
所谓条件概率,就是在事件A发生的概率下B发生的概率。例如,男生(事件A)是烟民(事件B)的概率为30%,女生(事件A)是烟民(事件B)的概率为5%。这些事件A就是“已发生的事件”,也就是所谓“预设”,也就是条件。
那么如何把条件概率引入机器学习呢?可以这么理解:数据集中数据样本的特征就形成了条件事件。比如:男,80岁,血压150mmHg,这3个已发生的事件,就是样本已知的特征。下面就需要进行二分类,确定患病还是未患病。此时我们拥有的信息量不多,怎么办呢?看一下训练数据集中满足这3个条件的数据有多少个,然后计算概率和计算分布。假如还有3个同样是80岁的男人,血压也是150mmHg,两个有心脏病,一个健康。此时算法就告诉我们,应该判断这个人也有心脏病的概率比较大。如果没有其他血压读数刚好是150的人呢?那就看看其他80岁的男人。如果10个人里面6个人都有心脏病,我们也只好推断此人有心脏病。
这就是朴素贝叶斯的基本原理。它会假设每个特征都是相互独立的(这就是一个很强的预设),然后计算每个类别下的各个特征的条件概率。条件概率的公式如下:
在机器学习实践中,可以将上面的公式拆分成多个具体的特征:
公式解释如下。
Ck,代表的是分类的具体类别k。
P(c|x)是条件概率,也就是所要计算的,当特征为x时,类别为c的概率。
P(x l c)叫作似然(likelihood),就是训练集中标签分类为c的情况下,特征为x的概率。
比如,在垃圾电子邮件中,文本中含有“幸运抽奖”这个词的概率为0.2,换句话说,这个“0.2” 也就是“幸运抽奖”这个词出现在垃圾电子邮件中的似然。
P©,是训练集中分类为C的先验概率。比如,全部电子邮件中,垃圾电子邮件的概率为0.1。
P(x),是特征的先验概率。
为什么图中这两个公式不大一样,第二个公式没有P(x)了。
因为在实践中,这个分母项在计算过程中会被忽略。因为这个P(x),不管它的具体值多大,具体到一个特征向量,对于所有的分类e来说,这个值其实是固定的一并不随中K值的变化而改变。因此它是否存在,并不影响一个特定数据样本的归类。机器最后要做的,只是确保所求出的所有类的后验概率之和为1。这可以通过增加一个归一化参数
实现。
基本上,朴素贝叶斯是基于现有特征的概率对输入进行分类的,它的速度相当快,当没有太多数据并且需要快速得到结果时,朴素贝叶斯算法可以说是解决分类问题的良好选择。
决策树 这个算法简单直观,很容易理解。它有点像是将一大堆的if… else 语句进行连接,直到最后得到想要的结果。算法中的各个节点是根据训练数据集中的特征形成的。大家要注意特征节点的选择不同时,可以生成很多不一样的决策树。”
“下图所示是一个相亲数据集和根据该数据集而形成的决策树。此处我们设定一个根节点,作为决策的起点,从该点出发,根据数据集中的特征和标签值给树分叉。”
为什么要选择相貌这个特征作为这棵决策树的根节点?,是因为熵。
在信息学中,熵(entropy),度量着信息的不确定性,信息的不确定性越大,熵越大。信息熵和事件发生的概率成反比。比如,“相亲者会认为这位先生很帅”这一句话的信息熵为0,因为这是事实。
这里有几个新概念,下面介绍一下。
信息熵代表随机变量的复杂度,也就是不确定性。条件熵代表在某一个条件下,随机变量的复杂度。信息增益等于信息熵减去条件熵,它代表了在某个条件下,信息复杂度(不确定性)减少的程度。 因此,如果一个特征从不确定到确定,这个过程对结果影响比较大的话,就可以认为这个特征的分类能力比较强。那么先根据这个特征进行决策之后,对于整个数据集而言,熵(不确定性)减少得最多,也就是信息增益最大。相亲的时候你们最看中什么,就先问什么,如果先问相点,说明你们觉得相貌不合格则后面其他所有问题都不用再问了,当然你们的妈妈可能一般会先问收入。
Python爬虫教程30:Selenium网页元素,定位的8种方法!
Selenium自动化教程02:浏览器options配置及常用的操作方法
Selenium自动化教程03:延时等待的3种方式
Selenium自动化教程04:鼠标+键盘网页的模拟操作
Selenium教程05:使用webdriver-manager自动下载浏览器驱动,再也不用担心driver版本的问题了
Selenium教程06:单选框+多选框+下拉框组件的示例练习
Selenium教程07:级联选择+日期框+弹框,组件的示例练习
Selenium教程08:文件的上传+下载的示例练习
Selenium教程08:iframe表单操作
Selenium教程10:教你简单好用的,5种截图方法。
1.qq空间的登入
网页元素结构
# @Author : 小红牛 # 微信公众号:WdPython from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.maximize_window() driver.get('https://i.qq.com/') # 定位标签 ifranme = driver.find_element(By.ID, 'login_frame') # 切换到标签上 driver.switch_to.frame(ifranme) # 使用账号密码登录 driver.find_element(By.ID, 'switcher_plogin').click() # 输入你的账号 driver.find_element(By.ID, 'u').send_keys('小红牛') # 输入你的密码 driver.find_element(By.ID, 'p').send_keys('微信公众号:WdPython') sleep(1) # 登入按钮 driver.find_element(By.ID, 'login_button').click() sleep(5) driver.quit() 完毕!!感谢您的收看
----------★★历史博文集合★★----------
我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具
每次我们成功搭建好WordPress网站后,都可以在后台 >> 插件 >> 已安装的插件,在插件列表中可以看到有一个“Akismet反垃圾邮件:垃圾邮件保护”的插件(个人觉得是翻译错误,应该是反垃圾评论)。具体如下图所示:
那么这个Akismet反垃圾邮件插件到底有什么用呢?我估计国外站长有很多人使用,毕竟这个插件的有效安装数量已经超过500万次,但是国内站长估计用得比较少,大多数都是第一时间就删除了这个插件,很少去启用该插件并使用。下面boke112百科就跟大家说一说这个Akismet反垃圾邮件插件的作用,以及如何使用该插件。
WordPress反垃圾评论插件Akismet有什么用? Akismet会根据我们的全球垃圾评论数据库检查您的评论和联系表单提交,以保护您和您的站点免受恶意内容的侵害。Akismet是屏蔽垃圾评论及联系表单垃圾留言的最佳反垃圾防护工具,也是最受WordPress及WooCommerce信赖的反垃圾留言解决方案。
Akismet的主要功能包括:
自动检查所有评论,并筛选出垃圾评论。每个评论都有状态记录,因此您可以轻松查看 Akismet 发现或清除哪些评论与哪些评论被主持人判断是否是垃圾评论。在评论正文中,显示URL与显示隐藏或误导性的连结。主持人可以看到每个用户的批准注释数。丢弃功能彻底阻止最恶劣的垃圾评论,节省您的磁盘空间并加快您的站点速度。 如何使用WordPress反垃圾评论插件Akismet? 这个WordPress反垃圾评论插件Akismet默认就已经安装好,我们只需要启用它即可。如果你已经删除了这个插件,那么可以在WordPress后台 >> 插件 >> 安装插件 >> 搜索“你好多莉”,点击该插件右上角的【现在安装】按钮,稍等片刻安装完毕后点击【启用】按钮启用该插件即可。如果无法在后台直接安装就前往WordPress官方插件页面Akismet中下载(或点此下载,密码:2917)。
1、启用Akismet插件后自动跳转到设置页面,点击【设置您的Akismet帐户】按钮。
2、在自动打开的页面中点击“Personal”中的【Get Personal】按钮。如果你想要购买专业版或其他更高级别就点击相应的按钮购买,我们个人站长一般使用免费版的“Personal”就足够了。
3、在出现的页面中默认显示“The average person pays US$36.00 per year(平均每人每年支付 36.00 美元)”,我们可以拖动滑块到最左侧变成0元,然后根据自己站点情况勾选是否有广告、是否出售产品/服务、是否宣传推广商家,最后点击【Continue with personal subscription】按钮。
4、在“Enter your billing information”中输入个人邮箱地址,选择国家如China,输入邮政编码,任何一个中国省份城市邮编都可以,如广西南宁为530000,然后点击【Continue to payment】按钮。
填写好支付信息后,可以看到我们这次的费用是0元,直接点击【Complete Checkout】按钮即可。
5、此时我们第4步填写的邮箱地址会收到一封激活帐号的邮件,点击邮件中的【Confirm your account】按钮激活即可;还会收到一封带有Akismet API Key的邮件,打开并复制其中的API密钥,回到WordPress后台 >> 设置 >> Akismet反垃圾评论 >> 点击“手动输入API密钥”>> 粘贴刚才复制的API密钥并点击【连接API密钥】按钮。
6、在设置中还可以看到我们的API密钥,其中“评论”、“垃圾邮件过滤”和“隐私”选项可以根据自己站点实际情况勾选,也可以直接默认,修改过的话记得点击【保存更改】按钮。
总结 WordPress的这款Akismet反垃圾评论插件,boke112百科没有体验太久,就是体验了一下设置过程,不过该插件的有效安装数量超过500万次,而且还是WordPress官方出品的插件,还是非常值得信赖的!至于对于中文垃圾评论的拦截效果如何就有待各位站长自行体验了。
不管WordPress网站是否安装并启用这款Akismet反垃圾评论插件,都应在后台 >> 设置 >> 讨论,建议在“在评论显示之前”勾选“评论必须经人工批准”或“评论者先前须有评论通过了审核”,强烈建议设置“评论审核”和“禁止使用的评论关键字”,当评论者的内容、名称、网址、电邮、IP或浏览器用户代理字串中包含以下关键词,这则评论将被设为待审或移入回收站,慢慢收集并填写相关关键词,慢慢地垃圾评论就会越来越少。
来源:WordPress反垃圾评论插件Akismet有什么用?如何使用Akismet插件? - boke112百科
这次采用亮眼的浅粉做为发色,为了贴合她小警察的身分 给了她一顶特制的警帽,上面有大福的荧光蓝叶片作为标 志,而在配件及裙子上也加入了许多科技元素的小巧思。
学校: 朝阳科技大学(台湾)
选手: 侧颜工作室
角色姓名: 大福太郎
角色性别: 女
角色物种: 人类
角色特性: 虚拟网红
角色设计理念为 :
这次采用亮眼的浅粉做为发色,为了贴合她小警察的身分 给了她一顶特制的警帽,上面有大福的荧光蓝叶片作为标 志,而在配件及裙子上也加入了许多科技元素的小巧思。
影片设计理念为 :
由于人工智能科技日渐普及,有许多人仍不太了解它的用 法和规范,因此我们的虚拟网红--大福太郎诞生了 !
一、visdom可视化工具 安装: pip install visdom
启动: 命令行直接运行visdom
打开WEB: 在浏览器使用http://localhost:8097打开visdom界面
二、使用visdom # 导入Visdom类 from visdom import Visdom # 定义一个env叫Mnist的board,如果不指定,则默认归于main viz = Visdom(env='Mnist') # 在window Accuracy中画train acc和test acc,x坐标都是epoch viz.line(Y=np.column_stack((acc, test_acc)), X=np.column_stack((epoch, epoch)), win='Accuracy', update='append', opts=dict(markers=False, legend=['Acc', 'Test Acc'])) # 在window Loss中画train loss和test loss,x坐标都是epoch viz.line(Y=np.column_stack((loss.cpu().item(), test_loss.cpu().item())), X=np.column_stack((epoch, epoch)), win='Loss', update='append', opts=dict(markers=False, legend=['Loss', 'Test Loss'])) 三、使用正则化 正则化也叫权重衰减(Weight Decay)
L1和L2正则化可以参考:https://blog.csdn.net/red_stone1/article/details/80755144
在代码中,我们只需要在优化器中使用weight_decay参数就可以启用L2正则化
# 选择一个优化器,指定需要优化的参数,学习率,以及正则化参数 optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate, weight_decay=0.01) 由于在Pytorch中没有纳入L1正则化,我们可以通过手工实现:
# 正则化超参数lambda lambd = 0.01 # 所有参数的绝对值的和 regularization_loss = 0 for param in model.
文章目录 前言一、MicroPython是什么?二、官方文档学习实验过程总结 前言 单片机嵌入式编程经历了汇编、 C 语言的发展历程,可以说是一次编程革命,其背后的原因是单片机的速度越来越快,集成度越来越高。而这一趋势并没停止,摩尔定律仍然适用。在未来,单片机上很可能直接跑机器语言。在 2014 年, MicroPython 在英国诞生了,对于电子爱好者来说无疑拉开了新时代的序幕,用 python 这个每年用户量不断增长的编程语言来开发嵌入式,加上无数开源的函数模块,让嵌入式开发变得从未如此的简单。
前几章我们介绍K210使用C语言裸机开发方法,大家对K210内部的硬件和各种加速器有了初步的了解,但是开发人工智能相关程序,使用C语言的话复杂度比较高,因此接下来我们逐步学习基于K210芯片使用python开发人工智能相关程序,我们从基础的开始介绍;
一、MicroPython是什么? 我看到MicroPython这个名字,第一感觉应该是"小Python",估计是Python的阉割版;
然后去官网看了下:“MicroPython 是 Python 3 编程语言的精简高效实现,包括 Python 标准库的一小部分,并且经过优化,可以在 Microcontrollers(微控制器)和有限的环境中运行。
MicroPython 包含许多高级功能,如交互式提示,任意精度整数,闭包,列表理解,生成器,异常处理等。然而它非常紧凑,可以在 256k 的代码空间和 16k的 RAM 内运行。MicroPyhon 旨在尽可能与普通 Python 兼容,以便您轻松地将代码从电脑传输到微控制器或者嵌入式系统。”
原来, Micropyton 是指在微控制器上使用Python 语言进行编程,学习过单片机和嵌入式开发的小伙伴应该都知道早期的
单片机使用汇编语言来编程,随着微处理器的发展,后来逐步被 C 所取代,现在的微处理器集成度越来越高了,那么我们现在可以使用 Python 语言来开发了。Python 的强大之处是封装了大量的库,开发者直接调用库函数则可以高效
地完成大量复杂的开发工作。 MicroPython 保留了这一特性,常用功能都封装到库中了,以及一些常用的传感器和组件都编写了专门的驱动,通过调用相关函数,就可以直接控制 LED、按键、伺服电机、 PWM、 AD/DA、 UART、 SPI、 IIC 以及 DS18B20温度传感器等等。以往需要花费数天编写才能实现的硬件功能代码,现在基于MicroPython 开发只要十几分钟甚至几行代码就可以解决。
二、官方文档学习 具体的语法我就不多此一举了,大家可以参考官方文档
官网文档网址:https://developer.canaan-creative.com/canmv/main/canmv/demo/index.html#multimedia
建议学习顺序:先了解MicroPython基础语法->按照例程进行实验->分析源码
实验过程 为了让大家体验下C和MicroPython开发方式的不同,这里做个简单实验吧,还记得当时我们做的点灯实验吗?AI嵌入式K210项目(3)-GPIO控制
硬件原理图:可以看到他们分别连接到了IO12-IO14上,不同的IO控制不同颜色的灯,设置IO为输出模式,当IO设置为高电平时,对应的灯熄灭,当IO设置为低电平时,对应的灯点亮;
from maix import GPIO from fpioa_manager import fm import utime #注册 IO,这里是fpioa的使用方法 fm.
面试 Vue 框架八股文十问十答第十一期 作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)Vuex 的原理 Vuex 是 Vue.js 官方提供的状态管理库,用于管理 Vue.js 应用中的状态。其原理基于以下核心概念:
State(状态): 在 Vuex 中,状态存储在一个单一的对象中,称为 state。这个状态对象是响应式的,当状态发生变化时,相关组件会自动更新。Getter(获取器): getters 允许组件直接从 store 中获取状态,而不需要将所有的状态都显式地传递给组件。这对于一些需要计算的属性或者筛选操作非常方便。Mutation(突变): mutations 是改变 state 的唯一途径。每个 mutation 都有一个字符串的事件类型和一个回调函数,该回调函数就是实际进行状态更改的地方。Action(动作): actions 类似于 mutations,但是它们是异步的,并且可以包含任意异步操作。actions 提交 mutations 来改变状态。它们可以通过 context 对象访问 commit 方法以触发 mutations。Module(模块): modules 允许将 store 分割成模块,每个模块拥有自己的 state、getters、mutations、actions,使得大型应用的状态管理更加有序。 2)Vuex中action和mutation的区别 Mutation: 是唯一能改变 state 的地方。它是同步的操作,用于同步地修改 state 的状态。mutation 中应该包含简单的逻辑,不应该处理异步操作。Action: 用于提交 mutation,可以包含异步操作。action 提交 mutation 来改变状态,但 action 可以包含异步操作,例如发起一个请求。action 中通过 context.commit 来触发 mutation。 3)Vuex 和 localStorage 的区别 Vuex: 是用于在 Vue.
IIS10服务器 SSL 证书安装部署
一、操作环境
IIS10
二、操作步骤
1、打开IIS服务器管理界面
打开命令提示符或PowerShell。输入命令`start inetmgr并按下回车键。 2、在主界面找到IIS layout区域,在区域内找到服务器证书菜单,如下图:
3、双击进入该菜单选项内(证书列表可能是空)
4、在服务器证书窗口的右侧 “操作” 栏中,单击导入。如下图所示:
5、在弹出的 “导入证书” 窗口中,选择证书文件存放路径,输入密码,单击确定。如下图所示:
在域名供应商处申请的证书如下:
6、导入证书和输入密码
7、找到个网站点击右侧的绑定按钮
8、在 “添加网站绑定” 的窗口中,将网站类型设置为 https,IP 地址设置为全部未分配,端口设置为443,主机名请填写您当前申请证书的域名,并指定对应的 SSL 证书,单击确定。如下图所示:
搜维尔科技:将Varjo XR-4集成到模拟器中,训练空军飞行员
搜维尔科技:将Varjo XR-4集成到模拟器中,训练空军飞行员!
目录
(一)文件是什么
(二)文件路径
(三)文件操作
3.1 打开文件
3.2 关闭文件
3.3 写文件
3.4 读文件
(四)关于中文的处理
(五)使用上下文管理器
(一)文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失.
要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在 文件 中保存
在 Windows "此电脑" 中, 看到的内容都是 文件 通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下:
文本文件 (txt)可执行文件 (exe, dll)图片文件 (jpg, gif)视频文件 (mp4, mov)office 文件 (.ppt, docx) 咱们今天要讲的主要研究最简单的文本文件.
(二)文件路径 一个机器上, 会存在很多文件, 为了让这些文件更方面的被组织, 往往会使用很多的 "文件夹"(也叫做目录)来整理文件.实际一个文件往往是放在一系列的目录结构之中的.为了方便确定一个文件所在的位置, 使用 文件路径 来进行描述.
例如, 我电脑中的 python.exe 这个文件, 描述这个文件的位置, 就可以使用路径
D:\Software\python 【解释说明】
D: 表示 盘符. 不区分大小写.每一个 \ 表示一级目录. 当前 python.exe 就是放在 "
前言 最近在工作中需要新建一个项目,需要处理统一返回和统一异常处理,发现挺不错,特地拿出来分享给大家。
为了有良好的演示效果,我特地重新建了一个项目,把核心代码提炼出来加上了更多注释说明,希望xdm喜欢。
案例 一、项目结构 二、引入依赖 引入pom.xml文件依赖,依赖按照项目所需按需提取。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>responseResultAndException</artifactId> <version>0.0.1-SNAPSHOT</version> <name>responseResultAndException</name> <description>responseResultAndException</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.6.13</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>compile</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.4.17</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webflux</artifactId> <version>5.3.19</version> <scope>compile</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.
来源:荒野开拓者PT
近日,一个新词“学术蝗虫”在网络上迅速走红,指的是那些跟随导师参加学术会议的大学生
他们被形容为 在会议期间,面对学术大佬时显得唯唯诺诺,而面对茶歇甜点时则重拳出击
这些“学术蝗虫”们,他们在茶歇台前品尝各种美食,享受着学术会议中的小确幸
面对小蛋糕、冰激凌和面包,一个也不放过
网友们也纷纷分享自己的经历,让我们看到了学术会议的另一面
笑喷了,画面感太强烈,啊哈哈哈哈 牛呀!下次就这样,导师以后还带你
哈哈哈哈,还有一个形容词,学术猪刚鬣
看起来真的很好吃唉 哇塞塞,好精致,好美味
哈哈哈哈,我感觉就是给年轻的大学生准备的,老学术家吃不了多少这些吧
你和你导师好可爱啊哈哈哈哈
场面一度尴尬,说到韩国想起了去年的运动会,韩国运动员偷偷拿东西会宿舍吃
突然就想考研究生了
哈哈哈哈,都太有才了
哈哈哈哈哈,笑死了,不过导师一定是在进行高深的学术讨论
哈哈哈哈,把老师都念叨的抑郁了
哈哈哈哈哈,你这形容的场面把我给整笑了
哈哈哈哈哈,感觉自己吃回本了是吧
还得是文化人会说话啊,哈哈哈
那个烤面包,我好喜欢那个 哈哈哈哈,是的呢,实锤了 有人认为,这种行为是对导师所支付的会议费用的浪费,因为这些学生可能并没有真正参与到会议的学术交流中
然而,对于这些“学术蝗虫”来说,参加学术会议的体验不仅仅是为了学习知识,更是一种探索和享受的过程
事实上,这种“学术蝗虫”现象并不是偶然的,随着学术会议的日益增多和大学生参与度的提高,越来越多的学生有机会接触到这一特殊的文化现象
当然,我们也不能否认学术会议的真正意义
在学术会议上,学者们分享最新的研究成果、交流思想、建立联系,共同推动学科的发展
总之,“学术蝗虫”现象是学术会议文化的一个有趣的现象
它揭示了大学生的多样性和活力,也提醒我们关注学术会议的真正价值和意义
同时,我们也应该鼓励大学生们更多地参与到学术交流中,分享自己的见解和收获,为学科的发展做出贡献
好了,感谢各位看官的捧场,我们评论区见!别忘了点赞关注留言哦
往期精彩回顾 适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑 交流群 欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961)
在数字化时代,企业运营中的文件传输效率是提升工作效率和客户满意度的关键。本文将分析两种主要的文件传输协议:FTP(文件传输协议)和TCP(传输控制协议),并探讨如何优化企业文件传输的效率。
FTP,作为一种专为文件传输设计的协议,拥有丰富的命令集,支持复杂的文件管理功能。然而,FTP的效率受到其设计的限制,特别是在大数据传输时,由于需要多次握手,效率可能受到影响。
TCP协议则提供了可靠的连接服务,确保数据包的顺序和完整性。尽管TCP的可靠性是其优势,但在网络不稳定时,这种机制可能会增加传输延迟。TCP的慢启动和拥塞控制机制在处理大量数据时也可能限制传输速率。
文件传输效率受多种因素影响,包括协议设计、网络状况和硬件性能。在企业级市场中,对文件传输的稳定性和速度有更高的需求。本文将探讨如何通过技术手段,特别是在FTP和TCP协议中,提高文件传输的效率。
FTP和TCP在文件传输中的优缺点对比如下:
FTP:功能丰富,但传输效率受限于设计,特别是在大数据传输时。
TCP:传输稳定,但可能在网络不稳定时牺牲速度。
镭速(私有化部署方案,也可接入公有云,企业、社会组织用户可申请免费试用)技术通过优化文件传输的多个环节来提升效率。它采用先进的数据压缩算法减少数据量,利用多线程技术并行处理文件,以及智能路由选择避免网络拥塞。镭速技术的优势在于其适应性强,能够根据网络环境和文件类型提供定制化传输方案,并实时监控网络状况以调整传输策略。
镭速技术的具体优势包括:
高速传输:采用Raysync协议,传输速度远超传统FTP/HTTP,支持大文件传输。
安全稳定:使用AES-256加密和TLS传输,支持国密标准,确保数据安全;提供断点续传和多重文件校验,保障数据完整性。
多终端支持:兼容Windows/Linux/MacOS/iOS/Android/H5,实现跨平台操作。
易于集成:提供多种集成方式,如SDK、HTTP API等,便于与现有系统集成。
镭速技术在实际应用中的案例表明,它能有效提升文件传输效率。例如,一家跨国公司使用镭速后,跨洋文件传输时间大幅缩短,即使在网络不稳定的情况下也能保持高效稳定。客户反馈显示,镭速不仅提升了工作效率,还降低了因传输延迟带来的成本。
综上所述,镭速技术为企业提供了一个高效、稳定的文件传输解决方案,通过其独特的技术优势,帮助企业在数字化时代保持竞争力。
数字孪生系统的开发流程通常包括以下关键步骤。数字孪生系统是通过数字化物理实体的虚拟模型,以实时模拟、监测和分析物理实体的状态和行为。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。
1.需求分析: 确定数字孪生系统的目标和用途。与利益相关者合作,明确系统的功能需求、性能需求、数据需求以及与现实世界的关联。
2.建模: 创建物理实体的数字化模型。这可能涉及使用计算机辅助设计(CAD)工具或其他建模软件,以在数字环境中准确呈现物理实体的结构和特征。
3.数据采集与集成: 获取现实世界中物理实体的数据,例如传感器数据、监测数据等。将这些数据集成到数字孪生系统中,确保数字模型反映物理实体的实时状态。
4.连接物理实体: 确保数字孪生系统与实际物理实体保持同步。这可能包括使用传感器、物联网设备等技术,以便在数字环境中及时反映物理实体的变化。
5.开发模拟引擎: 实现数字孪生系统的模拟引擎,该引擎负责实时模拟物理实体的行为。这可能涉及到物理模型、数学模型等的开发。
6.数据分析与算法: 集成数据分析算法,以从模拟结果中提取有价值的信息。这包括监测、预测、优化等方面的算法,以支持决策制定和性能优化。
7.用户界面开发: 开发用户界面,使利益相关者能够可视化和与数字孪生系统进行交互。这可能包括实时监控、报告生成、可视化展示等功能。
8.集成系统: 将各个组件集成到一个整体系统中,确保各个部分能够协同工作,实现数字孪生系统的完整功能。
9.测试与验证: 对数字孪生系统进行全面的测试和验证,确保其在不同场景和条件下的稳健性和可靠性。
10.部署与维护: 将数字孪生系统部署到实际运行环境中,监控系统的性能,进行必要的维护和更新。
11.持续改进: 不断收集用户反馈和系统性能数据,进行持续改进和优化,确保数字孪生系统能够满足不断变化的需求。
这些步骤可能在实际应用中有所变化,具体的数字孪生系统开发流程取决于项目的特定要求和复杂性。
在高并发的系统开发中,缓存和高效的数据存储机制对于提升应用性能至关重要。Redis,作为其中的佼佼者,以其卓越的性能和丰富的数据结构赢得了开发者的青睐。本文将深入探讨Redis的数据结构及其底层实现,带领读者走进这个高性能数据库的幕后世界。
一、Redis数据结构概览 Redis支持五种主要数据结构:字符串(Strings)、列表(Lists)、哈希表(Hashes)、集合(Sets)和有序集合(Sorted Sets)。这些数据结构为开发者提供了灵活的数据操作方式,满足了不同场景下的数据存储需求。
字符串(Strings):最基本的数据类型,可以包含任何数据,如数字、字符串、二进制数据等。在Redis中,字符串是二进制安全的,这意味着它们可以有任何长度,并且不会因为包含空字符而被截断。列表(Lists):简单的字符串列表,按照插入顺序排序。你可以添加一个元素到头部(左边)或者尾部(右边)。哈希表(Hashes):是键值对的集合,是字符串类型的字段和值的映射表。适合存储对象。集合(Sets):是字符串类型的无序集合。它是通过哈希表实现的,可以做到添加、删除、查找的时间复杂度都是O(1)。有序集合(Sorted Sets):和Sets相似,但每个字符串元素都会关联一个浮点数类型的分数。元素的分数用来排序,如果两个成员有相同的分数,那么他们的排名按照字典序计算。
二、Redis底层实现揭秘 Redis的性能优势很大程度上来自于其精巧的底层数据结构和编码方式。Redis并没有直接使用上述的高级数据结构进行存储,而是根据数据的特性和大小,选择最合适的内部编码方式。
1.字符串的底层实现:简单动态字符串(SDS) Redis的字符串类型并不是直接使用C语言中的原生字符串(以空字符\0结尾的字符数组)进行存储,而是使用了一个称为简单动态字符串(Simple Dynamic String,SDS)的数据结构。这种设计选择为Redis带来了许多优势,尤其是在性能和灵活性方面。
SDS结构
SDS的数据结构定义大致如下(可能根据Redis版本有所不同):
struct sdshdr { int len; // 记录buf数组中已使用字节的数量,等于SDS所保存字符串的长度 int free; // 记录buf数组中未使用字节的数量 char buf[]; // 字节数组,用于保存字符串。注意这里并没有指明数组的长度,这是一个柔性数组(flexible array member) }; 优势分析
预分配:SDS会为buf分配额外的未使用空间(通过free字段记录),这意味着当你向一个SDS字符串追加内容时,如果未使用空间足够,Redis就不需要重新分配内存。这减少了内存分配次数,从而提高了性能。
常数时间复杂度获取字符串长度:由于SDS结构内部维护了一个len字段来记录字符串的当前长度,获取字符串长度的操作可以在常数时间复杂度O(1)内完成,而不需要像C语言的原生字符串那样遍历整个字符串。
二进制安全:SDS可以存储任意二进制数据,包括空字符\0。C语言的原生字符串以空字符作为结束标志,这限制了它们不能包含空字符。而SDS则通过len字段来明确字符串的长度,因此不受此限制。
兼容C语言字符串函数:尽管SDS提供了自己的一套API来进行字符串操作,但它的buf字段实际上就是一个普通的C字符串(以\0结尾),这意味着在必要时,可以直接使用标准的C语言字符串处理函数来操作buf字段(尽管通常不推荐这样做,因为可能会破坏SDS结构的完整性)。
操作优化
SDS提供了一组API来进行字符串的创建、修改、拼接等操作。这些API在内部会处理内存分配、长度更新等细节,使得用户在使用时无需关心底层实现。
例如,当你使用sdscat函数向一个SDS字符串追加内容时,该函数会首先检查未使用空间是否足够,如果不够,则会重新分配更大的内存空间,并将原有数据复制到新位置,然后再追加新内容。所有这些操作对用户都是透明的。
通过使用SDS作为字符串的底层实现,Redis实现了字符串操作的高效性和灵活性,为上层提供了丰富的数据操作接口,同时保证了内部数据的一致性和稳定性。这种设计使得Redis在处理大量字符串数据时能够保持出色的性能。
2.列表的底层实现:双向链表与压缩列表 Redis的列表(Lists)数据类型是一个非常重要的数据结构,它允许用户在列表的两端推入或者弹出元素。为了实现这种高效的操作,Redis的列表在底层使用了两种数据结构:双向链表和压缩列表。选择哪种结构取决于列表的大小和元素的特性。
双向链表 当列表的元素数量较多或者元素较大时,Redis会选择使用双向链表作为底层实现。双向链表中的每个节点都保存了前一个节点和后一个节点的指针,这使得在列表的任何位置插入或删除元素都变得相对容易。
双向链表的结构大致如下:
typedef struct listNode { struct listNode *prev; // 指向前一个节点的指针 struct listNode *next; // 指向后一个节点的指针 void *value; // 节点保存的数据 } listNode; typedef struct list { listNode *head; // 指向链表头部的指针 listNode *tail; // 指向链表尾部的指针 unsigned long len; // 链表的长度 // .
在企业数据管理的现代实践中,文件传输协议(FTP)扮演着至关重要的角色。随着企业规模的扩大和业务的全球化,数据量的激增使得大文件传输成为日常工作中的常态。在这种情况下,企业迫切需要一种既高效又安全的文件传输解决方案。FTP协议因其稳定性和可靠性,成为了企业数据传输的首选工具。
为了进一步简化和自动化FTP文件传输流程,企业可以采用两种方法来实现定时任务的设置:利用Windows系统的任务计划器或第三方FTP定时任务管理软件。
利用Windows任务计划器进行定时FTP传输 Windows任务计划器是一个强大的工具,它允许用户设置定时执行的任务,包括FTP文件传输。要实现这一功能,首先需要创建一个批处理脚本,该脚本包含了FTP客户端的命令行操作。
在脚本中,用户需要填写FTP服务器的登录信息,以及要上传或下载的文件路径。然后,通过任务计划器创建新任务,设置触发条件(如特定时间或日期),并指定要运行的批处理脚本。这样,任务计划器就会在预定的时间自动执行FTP传输任务。
使用第三方FTP定时任务管理软件 除了Windows任务计划器,企业还可以选择第三方FTP定时任务管理软件,如Auto FTP Manager或FTP Scheduler。这些软件提供了更加直观的操作界面和丰富的功能,使得用户能够轻松创建和管理FTP任务。用户只需在软件中设置FTP服务器的连接参数、文件传输路径、传输模式以及任务执行的时间表。软件会自动处理文件的上传和下载,同时提供详细的任务日志和错误报告,方便用户监控和管理传输过程。
然而,随着数据量的不断增长,传统的FTP传输方式在处理大文件时面临着传输速度慢、效率低下的问题。为了解决这一挑战,镭速(私有化部署方案,也可接入公有云,企业、社会组织用户可申请免费试用)开发了一种创新的自定义协议(Raysync),旨在显著提升FTP传输的效率。
镭速自定义协议是一种专为大文件传输优化的技术,它通过智能算法和高效的数据压缩技术,实现了在保持数据完整性的同时,大幅提高了文件传输速度。这一技术的应用,使得企业能够在跨地域、跨国界的网络环境中,实现快速、稳定的大文件传输,从而有效应对网络延迟和数据包丢失的问题。
镭速在企业中的应用 镭速已经在多个行业得到了广泛应用,包括金融、教育、能源、医疗、广告和影视制作等。这些行业对数据传输的速度和安全性有着极高的要求,镭速传输的解决方案正好满足了这些需求。通过使用镭速,企业能够实现快速、可靠的大文件传输,从而提高了工作效率,降低了运营成本,同时也为业务的持续发展提供了强有力的支持。
总结来说,随着企业数据量的不断增长,传统的FTP传输方式已经难以满足现代企业的需求。镭速传输的自定义协议提供了一种高效、安全的大文件传输解决方案,它通过智能算法和并行传输技术,显著提升了传输速度,同时确保了数据的安全。结合Windows任务计划器或第三方FTP定时任务管理软件,企业可以轻松实现FTP文件传输的自动化和定时化,进一步提高工作效率,降低运营风险。
注意:Quest2设备相关内容,需要网络能访问Meta
一、注册Meta账号 https://auth.meta.com
建议使用邮箱注册账户
填完信息后完成注册
二、开通开发者权限 因为Quest2里,如果想要安装第三方应用,必须要注册成为开发者,然后我们打包出来的应用会被安装到设备里的未知来源一项。
注册地址:
https://developer.oculus.com/manage/
这里需要用visa卡完成验证,才能成为开发者
验证完成后创建一个组织
完成上述步骤即可完成开发者注册
三、安装Oculus软件 该软件主要用于和PC进行串流
软件下载地址:
https://www.oculus.com/download_app/?id=1582076955407037
双击安装到指定的盘符中即可
注意首次打开需要登录你的Meta账号以及绑定设备
很多人会卡在这个界面
网上一部分人说能修改Host文件,进去,但是这个方法不是很好用
我这里推荐一个方法:
1.使用全局
2.开加速器,加速Oculus商店
设备绑定部分可以先跳过
四、激活Quest2设备 1、需要准备一台可以专用的路由器
(可以参考:Polaris:Unity做VR全平台游戏开发(一)——准备工作)
2、手机先在GooglePlay/Appstore下载Oculus应用
下载并登录好自己的账号,由于设备激活
如果设备买回来是店家代激活的,建议重新激活(长按电源+音量-键可以重置设备)
首次启动设备会要求设备配对,此时打开手机app
进入设备页面,然后点击添加设备
输入Quest2中看到的验证码,即可完成激活
打开开发者模式
至此设备完成激活
后续直接安装一体机的应用都在这个未知来源里
五、串流 PC 串流的话分为无线和有线
首先电脑要启动前面安装的Oculus应用
无线: 基本比较流畅,但是有时候会偶尔出现延时高、画质糊的情况,相较于有线不是很稳定,但是日常很方便使用;
但是对于开发而言,无线串流在长时间不用的情况下无法一直保持和PC的连接,并且使用Unity打包安装过程较慢,不是很推荐
和PC同一网络,打开Air Link即可搜索到电脑
有线: 需要一条比较长的Link连接线:https://www.meta.com/quest/accessories/link-cable/
就是日常使用不是特别方便,但是平时开发基本都在电脑旁,有线更稳定,VR开发效率更高
推荐
六、安装Meta Quest Developer Hub https://developer.oculus.com/meta-quest-developer-hub
下载 Developer Hub
默认安装即可
该工具主要用来做性能分析、安装apk、以及Oculus应用上传,对于开发者来说挺重要的一个软件
这里可以将apk安装到设备里
性能分析
应用上传
至此,有关Oculus Quest2相关的环境设置配置完毕。
文章目录 📚聚类📚KMeans📚层次聚类🐇层次聚类概述🐇dendrogram-树状图🐇linkages-衡量两个类之间的距离🐇Lance-Williams算法🐇K-means VS 层次聚类 📚DBSCAN 📚聚类 定义:聚类是一种无监督学习,样本没有标签,将一群样本划分到一个类中,使得:最大化类间距,最小化类内
距离测量指标:
四种聚类:
基于质心的聚类,使用中心表示该簇(K-means,K-medoids)
基于链接的聚类:层次聚类-在一定阈值处切断树,从而得到几个类
基于密度的聚类,DBSCAN,OPTICS,将高密度的区域连接起来
基于分布的聚类,Mixture models
📚KMeans K-means的思想:最小化数据到中心点的方差S,算法的目标是最小化数据点与所属簇中心之间的平方距离之和。
K-means 算法步骤:
初始化:选择 k 个初始聚类中心(可以是随机选择或根据特定的策略选择),每个数据点被分配到离其最近的聚类中心所对应的簇。迭代更新:重复以下步骤直到达到停止条件(例如,聚类中心不再发生变化): 计算每个簇的新聚类中心:将每个簇内的所有数据点的坐标取平均值,得到新的聚类中心。将每个数据点重新分配到离其最近的新聚类中心所对应的簇。 输出结果:当算法终止时,得到 k 个簇,每个簇包含一组数据点,以及每个簇的聚类中心。 但是如果是一个NP-hard问题,可以使用启发式搜索:
先随机选K个中心点,然后将剩下的数据点按照距离划到相应的类中,同时更新每类的中心点,然后继续划分,划分后更新中心点,不断重复直至收敛。
保证在有限的迭代次数内收敛(有限收敛)
将数据点划分到距离最近的簇中心点所需时间为O(KN)
重新计算簇中心点的时间为O(N)
K-means的问题:
初始化的方式有可能导致划分结果完全不同,所以我们要对之进行避免
解决方法: 可以多次运行,然后选择error最小的聚类方式不使用随机的方式选择初始点,比如选择最远的点作为聚类中心(kmeans++) 首先随机选择第一个类的中心点,然后计算剩余点的距离,在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。
K-means的限制:
簇是不同大小的话,不能很好的划分
簇有密度之分的话,也不能很好的划分
簇是非球形的话,划分结果也不好
解决方法:先划分出小的簇,然后合并成大簇。使用层次聚类或者基于密度的聚类可以克服以上三个问题。
Kmeans评价
优点:
简单,适用于规则不相交的簇收敛相对较快高效性,且时间复杂度为O(tkn)t是迭代次数,k是簇的个数,n是数据点的个数 缺点:
需要事先确定k的值可能只收敛到局部最优解,需要尝试多种不同的初始中心可能对噪声点和离群点敏感有些集群的形状并不适用 📚层次聚类 🐇层次聚类概述 层次聚类定义:一种无监督学习方法,用于将数据点划分为多个不同的聚类簇。该算法通过计算数据点之间的相似性或距离来构建层次结构,并根据相似性度量逐步合并或划分聚类簇。
层次聚类思想:描述AB的相似度,A和B的相似性用最低共享内部节点的高度,相较于kmeans提供的是随机的结果,层次聚类提供的是确定性的结果,分为凝聚型层次聚类和分裂型层次聚类,主要关注自下而上或凝聚层次聚类。
层次聚类算法:开始每个点都是一类。然后确定距离最近的两个类,将之合并。重复直到只剩下一个类。
层次聚类优点:
不需要预先指定聚类数目,可以根据数据的内在结构自动进行聚类。能够捕捉到不同粒度的聚类结果,提供了更丰富的信息。 层次聚类不足:
对于大规模数据集,计算复杂度较高。对噪声和离群点较为敏感。在处理非球形聚类簇或非线性可分数据时,效果可能不理想。 🐇dendrogram-树状图 定义:树状图(dendrogram)是一种用于可视化层次聚类结果的图形表示方法。它将数据点和聚类簇按照层次结构展示,并显示它们之间的相似性或距离关系。
结构:在树状图中,每个数据点都表示为一个叶节点(leaf node),而每个聚类簇则表示为一个内部节点(internal node)。叶节点和内部节点之间通过边(branches)连接起来,形成一个树状结构。树状图的根节点(root node)表示整个数据集或最终的全局聚类簇。
特点:树状图通常以垂直方向绘制,其中纵轴表示聚类簇之间的距离或相似性度量。根据树状图上的切割点,可以选择不同层次的聚类簇。根据需要,可以通过调整切割点来获取不同粒度的聚类结果。
应用:树状图可以帮助我们直观地理解数据点之间的相似性和聚类结构。通过观察树状图,我们可以确定合适的聚类簇数目,或者选择合适的切割点来获取特定粒度的聚类结果。它在生物学、社会科学、计算机视觉等领域中被广泛使用。
🐇linkages-衡量两个类之间的距离 两类距离:
single linkage cut interpretation:对任意点xi,簇内存在一点xj,d(xi,xj)<=0.9complete linkage cut interpretation:对任意点xi,其簇内的所有点都满足d(xi,xj)<=5 各种问题:
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达 前言
现有的深度聚类算法大都由聚类损失与网络损失两部分构成,从两个视角对现有的深度聚类算法进行全面综述与总结,即聚类模型与神经网络模型。
整理丨算法进阶 作者 | 凯鲁嘎吉
链接 | http://www.cnblogs.com/kailugaji/
1. 什么是深度聚类? 经典聚类即数据通过各种表示学习技术以矢量化形式表示为特征。随着数据变得越来越复杂和复杂,浅层(传统)聚类方法已经无法处理高维数据类型。为了解决改问题,深度聚类的概念被提出,即联合优化表示学习和聚类。
2. 从两个视角看深度聚类 3. 从聚类模型看深度聚类 3.1 基于K-means的深度聚类 参考:聚类——K-means - 凯鲁嘎吉 - 博客园
3.2 基于谱聚类的深度聚类 参考:多视图子空间聚类/表示学习(Multi-view Subspace Clustering/Representation Learning) ,关于“On the eigenvectors of p-Laplacian”目标函数的优化问题 - 凯鲁嘎吉 - 博客园
3.3 基于子空间聚类(Subspace Clustering, SC)的深度聚类 参考:深度多视图子空间聚类,多视图子空间聚类/表示学习(Multi-view Subspace Clustering/Representation Learning),字典更新与K-SVD - 凯鲁嘎吉 - 博客园
3.4 基于高斯混合模型(Gaussian Mixture Model, GMM)的深度聚类 参考:聚类——GMM,基于图嵌入的高斯混合变分自编码器的深度聚类(Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding, DGG) - 凯鲁嘎吉 - 博客园
Docker应用-使用Dockerfile创建镜像 文章目录 Docker应用-使用Dockerfile创建镜像基本结构初识dockerfile新建dockerfile文件启动容器查看容器基本信息 Dockerfile制作Tomcat镜像 基本结构 Dockerfile是由一行行命令语句组成并且支持以#开头的注释行。一般而言Dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时的执行指令。比如:
# This dockerfile uses the ubuntu image #VERSION 2 - EDITION #Author:docker_user #Command format:Instruction [arguments / command] .. #第一行必须指定基于的基础镜像 FROM ubuntu # 维护者信息 MAINTAINER docker_user docker_user@email.com # 镜像操作指令 RUN echo "deb http://archive.ubuntu.com/ubuntu/raring main unniverse" >> /etc/apt/sources.list RUN apt-get update && apt-get install -y nginx RUN echo "\ndaemin off;" >> /etc/nginx/nginx.conf # 容器启动时执行指令 CMD /usr/sbin/nginx 其中,一开始必须指明所基于的镜像名称,接下来一般会说明维护者的信息。后面是镜像的操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层并提交。最后是CMD指令,来指定运行容器时的操作命令。以下是一些常用指令:
ONBUILD #当构建一个被集成的dockerfile这个时候就会运行ONBUILD出3发指令 COPY #类似add,将我们的文件拷贝到镜像中 EXPOSE # 暴露端口配置,也可以是用-p ENV # 构建的时候设置环境变量 简单来说:通过这个dockerfile脚本可以生成镜像,镜像是一层一层的,脚本的命令是一行一行的,每个命令对应的都是一层镜像。如下图:
针对上篇文章springboot通过ftl模板动态生成图片(html生成图片imgBase64)有不少小伙伴问生成的图片字体异常,或者本地正常服务器异常,我这里有一个优化,给字体文件放在项目中自己加载即可
响应的调整:
POM文件中添加排除字体文件的编译
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>**/*.ttf</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>ttf</nonFilteredFileExtension> <nonFilteredFileExtension>ttc</nonFilteredFileExtension> <nonFilteredFileExtension>woff</nonFilteredFileExtension> <nonFilteredFileExtension>woff2</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> <version>3.0.2</version> </plugin> </plugins> </build> 第二步调整上篇文章中的字体加载方法
/** * 宋体 * * @param style Font.BOLD * @param size 24 */ public static Font getSIMSUN(int style, float size) { Font font = null; //获取字体流 InputStream simsunFontFile = Thread.currentThread().getContextClassLoader().getResourceAsStream("fonts/simsun.ttc"); try { //创建字体 font = Font.
区块链技术在金融领域的应用广泛,它提供了一种分布式、去中心化、透明且安全的方式来进行交易和资产管理。以下是一些区块链技术在金融领域的主要应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。
1.数字货币和支付: 区块链技术的最著名应用就是数字货币,如比特币。这些数字货币基于区块链的去中心化和加密特性,提供了快速、安全、跨境的支付方式。此外,一些金融机构也开始使用区块链来改进传统的支付系统,提高交易效率。
2.智能合约: 区块链上的智能合约是自动执行的合约,其中的条款和条件被编程到区块链中。这使得金融交易和合同的执行变得更加透明和高效,减少了对第三方中介的需求。
3.资产管理: 区块链技术可以用于创建数字资产,如代币化的证券、债券或其他金融工具。这使得资产的发行、转让和交易更加高效和透明。
4.跨境支付和汇款: 区块链可以简化跨境支付和汇款流程,提高支付速度、降低成本,并减少对中间银行的依赖。这对于国际贸易和金融服务具有重要意义。
5.防欺诈和KYC: 区块链技术可以提供更安全的身份验证和KYC(了解您的客户)流程,减少金融犯罪和欺诈行为。用户的身份信息可以被安全地存储在区块链上,需要时进行验证,而无需向多个机构重复提交。
6.借贷和融资: 区块链可以用于创建去中心化的借贷平台,使借贷更加高效和透明。借款人和出借人可以直接进行数字化的借贷交易,而无需传统银行的参与。
7.交易结算和清算: 区块链技术可以加速金融交易的结算和清算过程,减少交易周期并提高效率。这对于股票交易、外汇交易等金融市场具有重要意义。
总体而言,区块链技术为金融领域带来了更高的透明度、安全性和效率,同时也为创新提供了更多可能性。然而,也需要考虑技术的成熟度、法规合规性等方面的挑战。
后台留言『交流』,加入 NewBee讨论组
近日,来自澳大拉西亚理工学院、梅西大学和皇家墨尔本理工大学等机构的研究人员进行了一项全面的综述,深入探讨了生成式AI不断演变的格局。
研究特别关注了混合专家模型(MoE)、多模态学习的变革性影响,以及对通用人工智能(AGI)的推测进展。
论文地址:https://arxiv.org/abs/2312.10868
- 严格审视了生成式人工智能(AI)的当前状态和未来轨迹,探索了像谷歌的Gemini和期待中的OpenAI Q*项目这样的创新是如何重塑研究优先事项和在各个领域的应用,包括对生成式AI研究分类法的影响分析。
- 评估了这些技术的计算挑战、可扩展性和现实世界的影响,同时强调了它们在推动像医疗健康、金融和教育等领域显著进展的潜力。
- 讨论了由AI主题和AI生成的预印本的扩散所带来的新兴学术挑战,检查了它们对同行评审过程和学术交流的影响。
- 强调了在AI发展中融入伦理和以人为本的方法的重要性,确保与社会规范和福祉的一致,并概述了一个未来AI研究的战略,该战略聚焦于MoE、多模态和AGI在生成式AI中的平衡和审慎使用。
人工智能(AI)的历史背景可以追溯到艾伦·图灵的「模仿游戏」、早期的计算理论,以及第一批神经网络和机器学习的发展,这为今天的高级模型奠定了基础。
这种演变,被像深度学习和强化学习的兴起这样的关键时刻突出地表现出来,对塑造当代AI的趋势至关重要,包括复杂的混合专家模型(MoE)和多模态AI系统,展示了该领域的动态和不断演进的特性。这些进展证明了AI技术的动态和不断发展的本质。
人工智能(AI)的演化在大语言模型(LLM)的出现,特别是由OpenAI开发的ChatGPT,以及最近Google的Gemini的揭幕,见证了一个关键的转折点。这项技术不仅彻底改变了行业和学术界,还重新点燃了关于AI意识及其对人类潜在威胁的关键讨论。
这样的先进AI系统的发展,包括像Anthropic的Claude和现在的Gemini这样的重要竞争者,它们展示了对比GPT-3和Google自己的LaMDA的几项进步,重塑了研究格局。
Gemini具有通过双向对话学习的能力,以及其「spike-and-slab」注意力方法,使其能够在多轮对话中专注于上下文的相关部分,代表了在开发更适合多领域对话应用的模型方面的重大飞跃。这些在LLM中的创新,包括Gemini所采用的混合专家方法,标志着向能够处理多样输入并促进多模态方法的模型的转变。
在这种背景下,OpenAI被称为Q*(Q-Star)的项目的猜测已经浮出水面,据称结合了LLM的强大能力和像Q学习和A*(A-Star算法)这样的复杂算法,进一步促进了动态的研究环境。
人工智能研究热度的变化 随着大语言模型(LLM)领域的不断发展,由Gemini和Q*等创新所体现,大量研究浮现出来,旨在描绘未来研究的道路,这些研究从识别新兴趋势到强调快速进展的领域各不相同。
已建立方法和早期采纳的二分法很明显,LLM研究中的「热门话题」正日益转向多模态能力和由对话驱动的学习,正如Gemini所展示的那样。
预印本的传播加速了知识共享,但也带来了降低学术审查的风险。Retraction Watch指出的固有偏见问题,以及关于剽窃和伪造的担忧,构成了重大障碍。
因此,学术界站在一个十字路口,需要统一努力,以根据该领域快速发展的背景来完善研究方向,这种变化似乎可以通过随时间变化的不同研究关键词的流行程度来部分追踪。
像GPT这样的生成式模型的发布和ChatGPT的广泛商业成功具有影响力。
如图1所示,某些关键词的兴衰似乎与重要的行业里程碑有关,例如2017年「Transformer」模型的发布、2018年GPT模型的发布,以及2022年12月商业化的ChatGPT-3.5。
例如,与神经网络应用的突破相一致的是对「深度学习」的搜索高峰,而随着像GPT和LLaMA这样的模型重新定义了语言理解和生成的可能性,「自然语言处理」的兴趣激增。
尽管有些波动,对AI研究中的「伦理/道德」持续关注反映了对AI道德维度的持续和根深蒂固的关切,强调道德考虑不仅仅是一种反应措施,而是AI讨论中不可分割和持久的对话。
从学术角度来看,假设这些趋势是否意味着一种因果关系,即技术进步驱动研究重点,或者蓬勃发展的研究本身推动了技术发展,这是相当有趣的。
本文还探讨了AI进步的深远社会和经济影响。作者检查了AI技术如何重塑各个行业,改变就业格局,并影响社会经济结构。这一分析突出了AI在现代世界中所提出的机遇和挑战,强调了其在推动创新和经济增长方面的作用,同时也考虑了伦理影响和对社会的潜在破坏性。
未来的研究可能会提供更明确的见解,但创新与学术好奇心之间的同步互动仍然是AI进步的标志。
与此同时,如图2所示,在arXiv上发布的计算机科学>人工智能(cs.AI)类别下的预印本数量的指数增长,似乎标志着AI社区内研究传播的范式转变。
尽管快速分发研究成果使知识交流迅速,但它也引发了对信息验证的担忧。
预印本的激增可能导致未经验证或有偏见的信息的传播,因为这些研究没有经过同行评审出版物典型的严格审查和可能的撤回。
这一趋势强调了学术界需要谨慎考虑和批判,特别是考虑到这些未经审核的研究可能被引用和它们的发现被传播的潜力。
研究目标 这篇综述的动力是Gemini的正式揭幕和围绕Q项目的推测性讨论,这促使对生成式人工智能(AI)研究的主流趋势进行及时审视。
论文具体贡献于理解混合专家模型(MoE)、多模态和人工通用智能(AGI)如何影响生成式AI模型,为这三个关键领域提供详细的分析和未来方向。
论文旨在批判性地评估现有研究主题中过时或无关紧要的可能性,同时深入探讨在快速变化的LLM格局中新兴的前景。
预期AI的进步不仅会在语言分析和知识合成方面提高能力,还将在混合专家模型(MoE)、多模态和人工通用智能(AGI)等领域开创先河,并已经宣告了传统的、以统计为驱动的自然语言处理技术在许多领域的过时。
然而,AI与人类伦理和价值观保持一致的永恒要求仍然是一个基本原则,而推测性的Q-Star计划提供了一个前所未有的机会,来引发关于这些进步如何重塑LLM研究地形的讨论。
在这种环境中,NVIDIA高级研究科学家Jim Fan对Q的见解,尤其是关于学习和搜索算法的融合,为这种努力的潜在技术构建和能力提供了宝贵的视角。
论文的研究方法涉及使用「大型语言模型」和「生成式AI」等关键词进行结构化文献搜索。
作者在IEEE Xplore、Scopus、ACM Digital Library、ScienceDirect、Web of Science和ProQuest Central等几个学术数据库中使用过滤器,以识别2017年(Transformer模型发布)到2023年(本文撰写时间)期间发表的相关文章。
本文旨在剖析Gemini和Q的技术影响,探讨它们(以及类似技术的不可避免出现)如何改变研究轨迹并在AI领域开辟新视野。
在此过程中,我们确定了三个新兴的研究领域——MoE、多模态和AGI——它们将深刻地重塑生成式AI研究格局。
本次调查采用综述式方法,系统地绘制了一幅综合并分析生成式AI当前和新兴趋势的研究路线图。
本研究的主要贡献如下:
1) 对生成式AI不断演变的格局进行了详细考察,强调了像Gemini和Q这样的技术的进步和创新及其在AI领域的广泛影响。
2) 分析了先进生成式AI系统对学术研究的转型效应,探讨了这些发展如何改变研究方法、设立新趋势,并可能导致传统方法的过时。
3) 全面评估了生成式AI在学术界整合中引起的伦理、社会和技术挑战,强调了将这些技术与伦理规范保持一致的重要性,确保数据隐私,并制定全面的治理框架。
当前生成式AI研究分类法生成式人工智能(AI)领域正在迅速发展,这需要一个全面的分类法,涵盖该领域内研究的广度和深度。
如表I所详述,这个分类法将生成式AI的主要研究和创新领域进行了分类,并作为理解该领域当前状态的基础框架,指导我们穿越不断发展的模型架构、先进训练方法、多样的应用领域、伦理含义和新兴技术前沿的复杂性。
生成式AI模型架构经历了显著的发展,其中四个关键领域尤为突出:
Transformer模型:Transformer模型在AI领域,尤其是在自然语言处理(NLP)中,因其更高的效率和可扩展性而引起了革命性的变化。它们采用先进的注意力机制来实现增强的上下文处理,使得对细微理解和交互成为可能。这些模型也在计算机视觉领域取得了显著进展,例如开发了EfficientViT和YOLOv8这样的视觉Transformer。这些创新象征了Transformer模型在如对象检测等领域的扩展能力,不仅提高了性能,还增强了计算效率。
循环神经网络(RNNs):RNNs在序列建模领域表现卓越,特别适用于处理涉及语言和时间数据的任务,因为它们的架构专门设计用于处理数据序列,如文本,使它们能有效捕捉输入的上下文和顺序。这种处理序列信息的能力使它们在需要深入理解数据时间动态的应用中不可或缺,例如自然语言任务和时间序列分析。RNNs在维持序列上连续性方面的能力是AI更广泛领域的关键资产,特别是在上下文和历史数据发挥关键作用的场景中。
混合专家模型(MoE):MoE模型通过在多个专业化专家模块上部署模型并行处理,显著提高效率,使这些模型能够利用基于Transformer的模块进行动态令牌路由,并扩展到数万亿参数,从而降低内存占用和计算成本。MoE模型因其能够在不同的专家之间分配计算负载而脱颖而出,每个专家专注于数据的不同方面,这使得更有效地处理大规模参数,导致更高效和专业化地处理复杂任务。
本文仅供学习使用
本文参考:
B站:DR_CAN
Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05 1. Recursive Algirithm 递归算法2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器3. Step by step : Deriation of Kalmen Gain 卡尔曼增益/因数 详细推导4. Priori/Posterrori error Covariance Martix 误差协方差矩阵5. An Example 2D例子6. Extended Kalman Filter扩展卡尔曼滤波器(EKF) 1. Recursive Algirithm 递归算法 2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器 3. Step by step : Deriation of Kalmen Gain 卡尔曼增益/因数 详细推导 4. Priori/Posterrori error Covariance Martix 误差协方差矩阵 5. An Example 2D例子 6.
前言 因为有些网站支持http和https两种协议访问,有些只支持一种协议访问。但根据动态域名安全策略(HSTS),只要该域名在浏览器中访问过一次https,那么浏览器将强制使http的请求变为https。
虽然这条浏览器的策略有利于提高页面访问安全性,但这种强制手段,对web应用开发者来说十分不友好,毕竟很少人希望在测试初期或设计阶段还需要时刻关注https或ssl证书。
我曾在chrome、微信、企业微信亦或者其他浏览器支持平台都遇到过这种情况,并且最后无奈选择了妥协(使用nginx给http加上了ssl证书,从而变成https),但我不希望大家也走弯路。
这里,我将给出【禁止浏览器http自动转成https】的方案,主要针对chrome浏览器。
方案 关于方案,无非是从两个方向实现的,第一个方向就是更新浏览器的单一域名限制策略,第二个方向就是清浏览器缓存。
1、更新浏览器的单一域名限制策略 Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts
在 Delete domain security policies 中输入项目的域名,并 Delete 删除即可
Firefox 浏览器(没试) 地址栏输入 about:permissions
搜索项目域名,并点击 Forget About This Site 2、清浏览器缓存 经典操作了,主要就是进设置,然后清理就行了
清理之前,请确认你是否有比较重要的内容需要提前保存
aapt dump badging your_app.apk | grep 'native-code'
el-table将多个单元格改为下拉框,导致渲染卡顿,解决方法在鼠标移动到单元格时变为下拉框,否则是普通文本
<el-table-column label="显示方向" width="150px" align="center" key="direction" prop="direction" :show-overflow-tooltip="true"> <template #default="{ row, $index }"> <el-select v-if="row.showDropdown" v-model="row.direction" placeholder="请选择"> <el-option v-for="item in directionList " :key="item.dictCode" :value="item.dictValue" :label="item.dictLabel"></el-option> </el-select> <div v-else @mouseover="handleMouseOver(row)" @mouseleave="handleMouseLeave(row)" style="min-height: 20px;"> {{ getLabelFromOptions(directionList, row.direction) }} </div> </template> </el-table-column> js代码
<script setup> const directionList = ref([{ "dictCode": 1, "dictLabel": "左", "dictValue": "left"}, { "dictCode": 2, "dictLabel": "右", "dictValue": "right"},]);//显示方向 //鼠标移入下拉框 const handleMouseOver = (row) => { row.showDropdown = true; }; //鼠标移出下拉框 const handleMouseLeave = (row) => { row.
什么是深度学习?它与传统机器学习有何不同?
答:深度学习是机器学习的一个分支,在人工神经网络的基础上构建了多层的神经网络模型,以实现对复杂数据的学习和分析。
深度学习的核心概念是深度神经网络(Deep Neural Networks,DNNs)。与传统机器学习算法相比,深度学习模型具有以下不同之处:
多层结构:深度学习使用具有多个隐藏层的神经网络,这些隐藏层通过堆叠在一起的方式构成了深层结构。这使得深度学习模型能够学习到更抽象、更复杂的特征表示。
自动特征学习:传统机器学习算法通常需要手动选择、设计和提取特征。而深度学习模型可以自动从原始数据中学习到特征表示,减少了对人工特征工程的依赖。
大规模数据:深度学习通常需要大量的数据进行训练,以充分发挥多层神经网络的表达能力。通过更大规模的训练数据,深度学习模型可以更好地捕捉和理解数据中的复杂模式。
计算资源需求:深度学习模型通常需要大量的计算资源进行训练。由于神经网络的层次结构和参数数量庞大,深度学习模型的训练过程相对较为耗时和复杂。
深度学习在各种领域都有广泛的应用,包括计算机视觉、自然语言处理、语音识别、推荐系统等。它的强大的特征学习和表示能力使得它能够应对更复杂的任务和数据,取得了许多突破性的成果。
然而,深度学习模型也有其限制。它对大量的标注数据的依赖较高,并且在某些情况下可能会出现数据过拟合的问题。此外,深度学习模型的训练和解释相对复杂,需要适当的算法和技术支持。
当然,请继续提问。
什么是区块链技术?它的原理和应用有哪些?
答:区块链技术是一种去中心化的分布式账本技术,通过使用密码学方法和去信任的共识算法,实现了对交易和数据的安全验证和存储。
区块链的核心原理包括以下几个方面:
分布式和去中心化:区块链是由多个节点组成的网络,每个节点都有完整的账本副本。数据和交易通过网络广播和互相同步,没有一个中心机构或个体掌控所有的数据。
共识机制:区块链通过共识算法来解决节点之间的数据一致性问题,使得所有节点就网络中的交易和数据达成一致意见。常见的共识算法包括工作量证明(Proof-of-Work)和权益证明(Proof-of-Stake)等。
区块链结构:区块链由一个个区块组成,每个区块包含多个交易记录和一个指向前一个区块的哈希值。这种链式结构确保了区块的不可篡改性和数据的连续性。
区块链技术具有广泛的应用领域,包括但不限于以下几个方面:
加密货币:比特币是区块链技术最早和最著名的应用之一,通过区块链实现了去中心化的电子货币交易。
智能合约:区块链可以支持基于任何可以编码的逻辑规则的智能合约,无需第三方的干预和监督。这使得可编程的区块链平台如以太坊(Ethereum)能够构建各种去中心化应用(DApp)。
供应链管理:区块链可以提供可追溯性和透明性,使得产品的来源和流通记录可信和可验证。这有助于解决供应链中的信息不对称和欺诈问题。
数字身份认证:区块链可以提供去中心化的身份认证和管理机制,将用户的身份信息安全存储,并防止身份信息被篡改或滥用。
医疗健康:区块链可以提供医疗数据的安全共享和隐私保护,促进医疗信息的互联互通,改善医疗服务的质量和效率。
多表查询
1.笛卡尔积:将两表所有的数据一一对应,生成一张大表
select * from dep,emp; #两个表拼一起 select * from dep,emp where dep.id = emp.dep_id; #找到两表之间对应的关系记录 select * from dep,emp where dep.id = emp.dep_id and dep.name='技术'; #筛选部门名称为技术的大表中的记录 select emp.name from dep,emp where dep.id = emp.dep_id and dep.name='技术'; #拿到筛选后的记录的员工姓名字段数据 连表查询
inner join 内连接
第一步:连表 select * from dep inner join emp on dep.id=emp.dep_id; 第二步: 过滤 select * from dep inner join emp on dep.id=emp.dep_id where dep.name='技术'; 第三步:找对应字段数据 select emp.name from dep inner join emp on dep.
DATE_FORMAT函数 在MySQL中,可以使用DATE_FORMAT函数对日期进行格式化。该函数可以将日期类型的数据按照指定的格式转换为字符串。
SELECT DATE_FORMAT(date_column, format) FROM table_name; 其中,date_column是要格式化的日期列的名称,format是要应用的日期格式。
下面是一些常见的日期格式化选项:
格式选项说明%Y年份(4位数)%y年份(2位数)%m月份(01-12)%c月份(1-12)%d日期(01-31)%e日期(1-31)%H小时(00-23)%h小时(01-12)%i分钟(00-59)%s秒钟(00-59)%pAM或PM%W星期的完整名称%a星期的缩写名称%M月份的完整名称%b月份的缩写名称%T时间,24小时格式(hh:mm:ss)%r时间,12小时格式(hh:mm:ss AM/PM) 下面是一个使用DATE_FORMAT函数的示例:
SELECT DATE_FORMAT('2022-02-14 18:30:00', '%Y-%m-%d %H:%i:%s') AS formatted_date; 这将返回格式为2022-02-14 18:30:00的字符串。
啊啊啊啊啊啊啊改了2个小时以为是代码的问题,结果是初始化的问题。
在VC中只要把类型初始化好就可以了。vscode中完全可以正常运行,在VS中不注意警告⚠️的内容,可以正常运行但是一读文件就会抛出异常。
引发了未经处理的异常:读取访问权限冲突。 current_content 是 0xFFFFFFFFFFFFFFC7。 0x00007FF781A423D6 处引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
引发了未经处理的异常:读取访问权限冲突。
**this** 是 0xFFFFFFFFFFFFFFE7。
Content* next = nullptr; (0xC0000005:访问冲突读取位置0xffffffffffffffffff)是c++中常见的异常,通常表明内存访问存在问题,通常由解引用空指针或无效指针引起。
如果在VScode中能正常使用大概率不是逻辑问题
区块链上链的过程涉及将数据或交易信息添加到区块链的区块中,确保其被网络中的节点验证和记录。以下是一般的区块链上链流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。
1.创建交易: 用户或系统创建一笔新的交易,这可能涉及到资产转移、信息传递或其他与区块链相关的操作。
2.交易签名: 交易需要被创建者签名,以确保交易的合法性和真实性。这通常使用私钥对交易进行数字签名的方式完成。
3.广播交易: 签名完成后,交易被广播到区块链网络中。这意味着将交易信息传播给网络上的各个节点,以便它们能够验证和记录该交易。
4.验证交易: 区块链网络中的节点收到新的交易后,会对交易进行验证。这通常包括检查数字签名的有效性、交易格式的正确性等。
5.交易池: 通过验证的交易进入交易池,等待被打包到区块中。交易池是一个暂时存储未确认交易的区域。
6.打包成区块: 一段时间后,矿工或验证节点将交易从交易池中选择出来,并将它们打包成一个新的区块。在区块中,这些交易的信息被添加到区块头和交易列表中。
7.工作量证明: 大多数区块链使用工作量证明(Proof of Work,PoW)或其他共识算法来确保只有经过努力计算的节点才能添加新的区块。这个过程通常涉及到在区块头中找到一个满足一定条件的特定值(称为nonce)。
8.广播新区块: 当新区块被成功创建并通过共识机制验证后,矿工会将新区块广播到整个网络,通知其他节点。
9.节点接收和验证: 其他节点在接收新区块后,会验证区块的有效性,包括交易的合法性和共识规则的遵守。
10.区块链更新: 如果区块被大多数节点接受和验证,它就被添加到区块链的末尾。整个区块链的状态被更新,包含新的交易信息。
这个过程循环进行,新的区块不断被添加到区块链中,形成链式结构。不同区块链可能采用不同的共识算法和验证规则,但上述步骤基本涵盖了典型的区块链上链流程。
苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产品与Find My可实现智能防丢的功能。苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。
深圳市伦茨科技有限公司(以下简称“伦茨科技”)发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家,该平台提供可通过Apple Find My认证的Apple查找(Find My)功能集成解决方案。
Apple「查找」Find My可通过庞大的“Apple Find My Network” 实现全球查找功能。无数iOS、iPadOS、macOS、watchOS激活设备与Find My 设备结合在一起,无需连接到Wi-Fi或者蜂窝网络,用户也可以给遗失的设备定位。对于任何iOS、iPadOS、macOS、watchOS设备,只要在Find My设置中打开离线寻找功能,均可通过地图查看所有设备。
“Apple Find My Network”配件计划,将庞大的全球“Apple Find My Network”开放给使用伦茨科技ST17H6x Soc平台的第三方设备制造商,以便他们设计使用这项服务的产品。这意味着利用Apple设备强大的覆盖网络,用户可在“Find My”app中定位和追踪任何一款使用伦茨科技ST17H6x Soc平台支持“Apple Find My Network”的重要个人物品。
使用伦茨科技ST17H6x芯片的设备接入Find My Network后,可添加到Find My APP新增的“项目”选项下,可适用于上千亿种使用场景,包括钱包、单车、帽子、背包等。 合作产品将会配备苹果“Work with Apple Find My”徽标,让用户知道它们与“Apple Find My Network”和「查找」(Find My)APP兼容。
正如苹果全球产品营销副总裁鲍勃·伯切斯(Bob Borchers)所说:“十多年来,我们的客户一直依靠‘Find My’来定位他们丢失或被盗的苹果设备,同时也保护了他们的隐私。”
现在,伦茨科技ST17H6x芯片使各大客户可将“Apple Find My Network”功能集成进产品,伦茨科技期待与更多的合作伙伴一起合作,让全球20亿台苹果设备成为基础设施,为用户提供精确查找位置,实现万物互联。
伦茨科技成立于2010年,是一家致力于蓝牙BLE和IoT芯片开发的科技公司,集研发、设计、解决方案、测试、预认证和技术支持为一体的高新技术企业。公司主要芯片与解决方案包含Apple Find My、Alexa直连和其他IoT领域。伦茨科技的客户遍及全球苹果MFi、新能源汽车配件、生命科学、智能硬件、工业4.0及消费电子等领域。我们提供一站式Apple Find My解决方案,加速Find My产品开发。我们的turnkey(交钥匙)服务节省时间、成本,降低风险,助力客户快速响应市场。
“我在保存数据的时候一直都是用u盘的,但是最近不知道是为什么,我u盘里的部分数据丢失了,有什么方法可以快速恢复u盘里的数据吗?” USB闪存驱动器,又称为U盘,是我们日常生活中常用的存储设备。然而,由于各种原因,如误删除、格式化、病毒攻击等,我们有时会遇到数据丢失的问题。
如何进行USB闪存驱动器数据恢复呢?下文将给大家总结几个简单有效的实用方法,如果需要使用这些方法,请继续往下看吧!
方法一:借助备份恢复USB数据 U盘闪存坏了里面的数据能恢复吗?如果u盘是出现了物理损坏,那么数据恢复会比较困难,此时如果想恢复里面的数据,比较有效的一个方法是借助备份来对数据进行恢复。
步骤1:找到备份数据所在的设备或云端;
步骤2:将重要的数据再次复制到新的USB中。
方法二:借助回收站恢复USB数据 如果是在对USB中数据进行清理时误删了一些重要的文件,借助回收站来恢复USB数据是比较有效的一个方法。被误删的数据可能会先被收入回收站中,可以这样操作。
步骤1:将USB设备与电脑连接,点击进入【回收站】中;
步骤2:在回收站中查找是否有需要恢复的文件;
步骤3:将文件【还原】。
方法三:借助专业软件恢复USB数据 如果u盘中的数据是比较重要的,想找回丢失的数据,建议用户借助专业的数据恢复软件来完成USB闪存驱动器数据恢复。比较推荐的软件是 数 据 蛙 恢 复 专 家 。这款软件拥有值得信赖的恢复系统和简单易懂的操作界面。
如果想恢复重要的数据,建议用户先尝试软件的免费扫描功能对数据进行扫描,软件的操作方法如下。
操作环境: 演示机型:联想ThinkPad E14 系统版本:Windows10 软件版本:数 据 蛙 恢 复 专 家3.2.12 步骤1:将USB闪存驱动器与电脑连接后运行软件,先点击【免费试用】;
步骤2:在选择界面,勾选上需要扫描的文件类型,并在【可移动驱动器】上勾选上USB闪存驱动器,点击【扫描】;
步骤3:等待快速扫描结束,用户可以先对部分扫描到的结果进行查看,如果没找到需要恢复的文件,点击【深度扫描】;
步骤4:深度扫描完成后,可以在【筛选器】中对文件进行快速查看,找到需要恢复的文件后,单击将其勾选上,完成所有选择后,点击【导出】。
提示:导出后的文件先不要保存在usb中,保存在电脑的任意磁盘皆可。 如何预防USB闪存驱动器数据丢失? 在日常使用USB闪存驱动器时,建议用户做到以下几点,可以减少USB闪存驱动器数据丢失的概率。
1.使用可靠的U盘:购买高质量的U盘并妥善保管。避免使用来路不明的U盘,因为它们可能含有恶意软件或病毒;
2.正确使用U盘:遵循正确的插拔U盘的方法。在Windows系统中,应先右键点击U盘图标并选择【弹出】,然后再拔出U盘;
3.使用安全软件:安装并更新防病毒软件以保护你的U盘和电脑免受恶意软件的攻击;
4.注意环境因素:避免将U盘暴露在高温或潮湿的环境中,这可能会损坏U盘内部的电子元件,导致数据丢失;
5.谨慎操作:在进行任何可能导致数据丢失的操作之前,如格式化、分区等,一定要先备份重要数据。
USB闪存驱动器的数据恢复并非易事,尤其是当数据遭受严重损坏或丢失时。因此,预防和备份是关键。遵循上述建议和措施,可以帮助你保护你的U盘数据并避免不必要的损失。同时,如果你遇到了数据丢失的问题,也不必过于担心,可以尝试使用上文分享的USB闪存驱动器数据恢复的方法来对数据进行恢复,有需要的用户现在就可以尝试啦!
往期推荐:
我的文档不见了怎么恢复?3个方法快速恢复!https://blog.csdn.net/datarecover/article/details/135765977?spm=1001.2014.3001.5501
电脑摄像头设置在哪里?这3种打开方式要记好!https://blog.csdn.net/datarecover/article/details/135764841?spm=1001.2014.3001.5501
Word表格跨页?5个方法轻松解决问题!https://blog.csdn.net/datarecover/article/details/135815300?spm=1001.2014.3001.5501
scp拷贝提示its a directory 错误 场景 使用scp的格式是
scp my_file user@ip:/home/directory 之前也一直这么用,没什么错误,莫名其妙
原因定位 去查了scp的用法,确认了不是用法的错误,然后去谷歌了,也没什么思路。
最后突然就想起来,我看一下路径吧,然后发现,路径改了!
。。。
然后仔细回想了一下,跳板机改了……可是你改就改呗,为毛还要改我的文件夹的名称
因此 可能提示你这个错误的原因是因为没有这个文件夹,GG
Problem: 146. LRU 缓存
文章目录 思路💖 Code 思路 👨🏫 参考题解
👩🏫 参考图解
💖 Code ⏰ 两操作 时间复杂度: O ( 1 ) O(1) O(1)
class LRUCache { int cap; LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>(); public LRUCache(int capacity) { this.cap = capacity;// 初始化容量 } public int get(int key) { if (!cache.containsKey(key))// 缓存不存在返回 -1 return -1; makeRecntly(key);// 更新访问时间 return cache.get(key); } // 让 key 重新入 缓存 private void makeRecntly(int key) { int val = cache.
目录
10.1 简介
10.2 安装
10.2.1 准备服务器
10.2.2 准备安装包
10.2.3 编写安装脚本
10.2.4 初始化GitLab服务
10.2.5 启动GitLab服务
10.2.6 使用浏览器访问GitLab
10.3 创建远程库
10.4 本地库推送到远程库
10.1 简介 GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。后来,一些部分用Go语言重写。截止2018年5月,该公司约有290名团队成员,以及2000多名开源贡献者。GitLab被IBM,Sony,JülichResearchCenter,NASA,Alibaba,Invincea,O’ReillyMedia,Leibniz-Rechenzentrum(LRZ),CERN,SpaceX等组织使用。
10.2 安装 官网地址:The DevSecOps Platform | GitLab
安装说明:https://about.gitlab.com/installation/
Gitlab-ee:企业旗舰版
Gitlab-ce:社区免费版
10.2.1 准备服务器 此部分需要具备虚拟机搭建的相关知识,可参考《Linux学习笔记》(见主页)。
Step1: 准备一个系统为CentOS7以上版本的服务器(此处克隆虚拟机) Step2:开启并登录虚拟机gitlab-server 注1:克隆虚拟机gitlab-server与模板虚拟机hadoop100的配置完全相同(包括账号和密码)注2:此处 登录root账号 Step3:关闭防火墙 临时关闭防火墙:systemctl stop firewalld开机启动时关闭防火墙:systemctl disable firewalld.service参考《Lin ux学习笔记》4.7 案例实操:防火墙 Step4:修改克隆机的主机名和IP地址 主机名:gitlab-server hostnamectl set-hostname gitlab-serverIP地址:192.168.171.200 cd /etc/sysconfig/network-scriptsvim ifcfg-ens33参考《Linux学习笔记》三、网络配置 Step5:重启服务器 reboot Step6:配置windows的hosts映射文件 Step6.1:进入C:\Windows\System32\drivers\etc 路径 Step6.2:拷贝hosts文件到桌面Step6.3:打开桌面hosts文件,并添加相应内容 Step6.4:将桌面hosts 文件覆盖C:\Windows\System32\drivers\etc 路径hosts 文件 参考《Linux学习笔记》3.
“我在对Excel文件进行打印时,需要将每一页的表头都打印同样的内容,应该怎么进行操作呢?希望大家教教我方法。” 在Excel中,当数据量很大,需要打印多页时,每一页都显示表头可以让报表看起来更为整洁、统一。然而,如果不进行设置,Excel默认只在第一页打印出表头。
怎么做到Excel打印每页都有表头呢?如果需要,可以参考下方操作方法尝试进行。
方法一:借助页面布局设置表头 在日常工作中,很多用户在打印表格时,可能都需要让Excel打印每页都有表头。这时,借助页面布局来设置表头是比较高效的方法。
步骤1:打开需要打印的Excel工作簿,在【页面布局】选项卡下,点击【打印标题行】或【打印标题列】;
步骤2:在弹出的对话框中,选择需要重复打印的行或列;
步骤3:点击【确定】,这样在打印预览或打印时,选择的标题行或列将会在每页都显示。
方法二:使用冻结窗格功能设置表头 如果想让Excel表格标题每页都显示,在编辑表格时,也可将每页需要固定打印的表头冻结。操作如下:
步骤1:在你需要固定表头的下方或右侧,选择一个单元格;
步骤2:在【视图】选项卡下,点击【冻结窗格】,这样在滚动查看数据时,表头会始终显示在顶部。
提示:该方法有利于用户查看表格数据,但打印时需自行确认是否每页表头都一致。 方法三:使用页面设置功能设置表头 用户需要在打印时将Excel表格固定,直接在页面设置中操作也是可以的。
步骤1:点击【文件】菜单下的【打印】;
步骤2:在右侧选择【页面设置】;
步骤3:在弹出的对话框中,选择【工作表】选项卡;
步骤4:勾选【打印标题行】复选框,并点击【确定】。
方法四:使用快捷键设置表头 对快捷键操作比较熟悉的用户,通过使用快捷键也是有机会快速完成Excel每页固定表头的。
步骤1:选中需要作为标题的行或列,按【Ctrl+C】复制;
步骤2:切换到打印预览视图按【Ctrl+P】;
步骤3:在此模式下,你可以手动将标题粘贴到每一页的顶部按【Ctrl+V】。
在使用Excel进行打印时,如果需要将表格固定,可以按照小编上方分享的方法进行尝试,Excel打印每页都有表头怎么操作?今天就先分享到这里啦,有需要的用户快来尝试一下吧!
往期推荐:
我的文档不见了怎么恢复?3个方法快速恢复!https://blog.csdn.net/datarecover/article/details/135765977?spm=1001.2014.3001.5501
回收站删除的照片怎么恢复?恢复文件,3个方法!https://blog.csdn.net/datarecover/article/details/135763939?spm=1001.2014.3001.5501
电脑文件丢失怎么恢复?这4个方法不可错过!https://blog.csdn.net/datarecover/article/details/135742990?spm=1001.2014.3001.5501
文章目录 一、前言二、Flyweight 模式1. 介绍2.应用3. 总结 三、Proxy 模式1. 介绍2.应用3. 总结 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。
二、Flyweight 模式 Flyweight 模式:共享对象,避免浪费
1. 介绍 Flyweight 即轻量级的意思,如通过尽量共享实例来避免 new 出实例,占用更少的内存的思想。
Flyweight 模式 登场的角色
Flyweight (轻量级) : 表示那些可以被共享的类。FlyweightFactory (轻量级工厂) :FlyweightFactory 表示生成 Flyweight 角色的工厂,在 FlyweightFactory 中生成的 Flyweight 角色可以共享。Client (请求者) : Client 使用 FlyweightFactory 来生成 Flyweight 角色。 类图如下:
2.应用 Integer 在类加载的时候会创建缓存对象,范围从 -128 到 127,当我们通过 Integer#valueOf 方法创建一个 Integer 对象时,Integer 会首先判断当前要创建的 Integer 是否在缓存中,如果在则直接从缓存中获取对象。
public static Integer valueOf(int i) { // 判断是否在缓存范围内,如果在则直接返回缓存的对象。 if (i >= IntegerCache.
一.项目接口实战总结:
1.传参赋值错乱问题,如下:
SQLSTATE[HY093]: Invalid parameter number (SQL: select count(*) as aggregate from `cars` where `company_id` = 3345 and `status` != 7 and `user_id` in (2148, 2060, 2061, 2432, 2136, 1970, 1987, 2024-01-03 00:00:00) and `updated_at` >= 2024-01-03 23:59:59 and `updated_at` <= ? and `cars`.`deleted_at` is null)
问题原因:model从原理继承BaseModel层换成了继承一层HandleModel公共参数验证与where拼接的逻辑与逻辑层的参数冲突了,造成参数预处理错乱
解决方案:service逻辑层去掉对应公共参数的判断,直接判断其它参数,如去掉company_id即可
2.数据转化成数组报错,如下
问题原因:由于查询的数据不存在,导致转换成数组的是null报错
解决方案:当没数据时,转成数组会报错,去掉转数组,先判断不为空,在进行转化处理
二.使用 Laravel 框架需要注意的事项:
1. 版本选择:根据项目需求和开发团队的技术水平,选择合适的 Laravel 版本。确保选择的版本在支持周期内,并能够满足项目的功能和性能需求。
2. 环境配置:在开始开发之前,确保正确配置开发环境。这包括安装 PHP、Composer、数据库服务等,并配置好相关的环境变量。
3. 学习文档:Laravel 提供了详细的官方文档,包含了框架的各种功能和用法说明。在使用 Laravel 进行开发之前,建议先仔细阅读官方文档,并进行实践练习。
4. 使用 Composer 管理依赖:Laravel 使用 Composer 来管理依赖库。在开始开发之前,通过 Composer 安装项目所需的依赖包,并保持依赖包的更新。
“我在使用电脑时,发现我的d盘好像满了,现在都显示成红色了,电脑d盘颜色变红怎么恢?有什么比较好的磁盘清理方法吗?” 电脑的d盘,作为电脑的一个系统盘,为用户保存了很多重要的文件和数据。D盘颜色变红,这通常表示该盘的存储空间已接近满载。为了恢复D盘的颜色,你需要采取一些措施来释放空间。
电脑d盘颜色变红怎么恢复?下文已经为大家总结好了d盘清理的简单方法,有需要的用户快去尝试一下吧!
方法一:清理临时文件 D盘太满了如何恢复?在日常使用电脑时,系统会自动保存很多临时文件,这些临时文件也会占用大量的系统空间。清理临时文件有利于更好的释放d盘空间。
步骤1:按下【win+R】,打开【运行】对话框;
步骤2:输入【%temp%】并按【Enter】键;
步骤3:选中所有临时文件,右键点击并选择【删除】,确认删除。
方法二:卸载不常用程序 在使用电脑时,很多用户都会在电脑上安装各种各样的应用程序,这些程序会占用大量的电脑内存。电脑d盘颜色变红怎么恢复?将不常用的程序卸载或许可以释放出大量的空间。
步骤1:打开【设置】中的【应用】;
步骤2:在已安装的程序列表中,找到并选择不常用的程序,点击【卸载】。
方法三:清理浏览器缓存 D盘太满了如何清理?如果是经常使用浏览器的用户,定期对浏览器进行缓存清理,也有机会释放大量的电脑内存。
步骤1:打开浏览器;
步骤2:按:下【Ctrl+Shift+Delete】(Windows)或【Cmd+Shift+Delete】(Mac),选择【高级】;
步骤3:找到历史记录,点击【清理历史记录】。
方法四:使用磁盘清理工具 在清理电脑空间时,使用磁盘清理工具是有利于快速对空间进行清理的,用户可以这样操作。
步骤1:点击进入【此电脑】,右键单击D盘,选择【属性】;
步骤2:在【常规】选项卡下,点击【磁盘清理】;
步骤3:扫描完成后,选择要删除的文件,如临时文件、已下载的程序文件等,点击【确定】并删除。
清理时误删重要文件如何恢复? 在对d盘进行清理时,如果误删了重要的数据,且回收站也被清空了。此时该如何恢复丢失的重要文件呢?建议大家使用专业可靠的数据恢复软件,比如 数 据 蛙 恢 复 专 家 。这款软件的恢复功能是比较好的,也成功帮助很多用户成功找回了重要的数据。
并且软件是支持多种类型文件和不同设备数据的扫描和恢复的,如果需要使用软件,可以下载软件后参考下方步骤。
操作环境: 演示机型:华硕无畏1414s 系统版本:Windows 10 软件版本:数 据 蛙 恢 复 专 家 3.2.12 步骤1:完成软件下载后双击运行,先点击【免费试用】,可先对数据进行免费扫描;
步骤2:将需要扫描和恢复的文件类型勾选上,并将【D盘】勾选上,点击【扫描】;
步骤3:在软件进行完快速扫描后,用户可根据个人喜欢的方式对文件进行查看,如果只扫描到少部分文件,点击【深度扫描】;
步骤4:在软件进行完深度扫描后,会呈现比较多文件,建议用户直接在【筛选器】中对相关文件进行定位,完成勾选后,点击【导出】。
提示:文件导出后,保存在与原保存位置有所区别的另一个磁盘上。 电脑d盘作为电脑中一个重要的磁盘,会存储很多数据和文件。因此会出现磁盘爆红的情况。电脑d盘颜色变红怎么恢复?上文已经为大家总结了几个简单实用的方法啦,有需要的用户可以进行尝试,但也要记住,在操作过程中如果发现文件丢失,及时使用上文方法恢复重要数据。
往期推荐:
回收站被清空如何找回?3个宝藏恢复方法分享!https://blog.csdn.net/datarecover/article/details/135814439?spm=1001.2014.3001.5501
Word表格跨页?5个方法轻松解决问题!https://blog.csdn.net/datarecover/article/details/135815300?spm=1001.2014.3001.5501
电脑摄像头设置在哪里?这3种打开方式要记好!https://blog.csdn.net/datarecover/article/details/135764841?spm=1001.2014.3001.5501
一.项目接口实战错误经验总结 1. 逻辑层静态类调用非静态方法报错,如下
Non-static method App\\Services\\Common\\StatisticBusinessService::getLevelUserCarCount() should not be called statically
问题原因:方法定义时没加static
解决方案:
2.变量类型使用错误,如下
问题原因:传了数组,但是罗层里面判断的是字符串
解决方案:修改成传新字段,在加逻辑判断,避免字段相同冲突
二.接口调试的实战经验总结: 1. 使用 Postman 进行接口测试
Postman 是一款非常强大的接口测试工具,可以用来模拟发送请求和接收响应。可以使用 Postman 来测试接口的各种情况,例如正常情况、异常情况、边界情况等等。
2. 使用环境变量进行配置
在进行接口测试时,通常需要切换不同的环境(如开发环境、测试环境、生产环境)和配置参数(如 API 地址、数据库连接信息等)。可以使用 Postman 中的环境变量功能来实现。
3. 使用断言验证结果
在接口测试中,除了验证接口是否能够正常访问和返回正确的数据之外,还需要验证返回的数据是否符合预期。可以使用 Postman 中的断言功能来验证结果。
4. 测试多种情况
在进行接口测试时,应该涵盖尽可能多的情况,例如正常情况、异常情况、边界情况、并发情况等等。通过测试不同的情况,可以发现代码中的潜在问题,并及时进行修复。
5. 记录测试结果和问题
在进行接口测试时,应该记录测试结果和发现的问题。这些记录可以帮助团队更好地追踪和修复问题,并在下一次测试中避免相同的错误。
6. 集成到 CI/CD 工具中
为了保证代码的质量和稳定性,建议将接口测试集成到 CI/CD 工具中。可以使用 Jenkins、GitLab CI 等工具来自动进行接口测试,并及时通知开发人员和运维人员。
三.在 Laravel 框架中进行接口开发时,以下是一些实战经验总结: 使用路由定义接口 在 Laravel 中,可以使用路由来定义接口的访问路径和对应的处理逻辑。建议将接口路由定义在 routes/api.php 文件中,这样可以使代码更加清晰和可维护。
Route::get('/users', 'UserController@index'); Route::post('/users', 'UserController@store'); Route::put('/users/{id}', 'UserController@update'); Route::delete('/users/{id}', 'UserController@destroy'); 使用控制器处理接口逻辑 建议使用控制器来处理接口的具体逻辑。控制器可以将请求处理、业务逻辑和响应生成等操作封装在一个地方,提高代码的可读性和可维护性。
这是一个复杂的东西,我查找了一些混乱的资料,最终在混乱的状态成功了,然后我尝试阅读代码,并删除了一些重复的东西,并以一种较为简洁的方式成功。
示例hubs端点
app.MapHub<MessageHub>("/hubs/message"); 我假设你已经知道如何添加SignalR和通常的使用jwt的验证。
这包括
处理跨域, 添加身份,数据库,账户,驱动,身份验证。
在这种情况下,只需要额外添加
builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = jswSettings.Issuer, ValidAudience = jswSettings.Audience, IssuerSigningKey = new SymmetricSecurityKey(secretKey) }; options.Events = new JwtBearerEvents(); }); builder.Services.TryAddEnumerable( ServiceDescriptor.Singleton<IPostConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>()); 其中 ConfigureJwtBearerOptions 是自定义的类,这个设计思路来自于微软的指南,是通过添加类似于中间件的形式实现。 如果不添加
options.Events = new JwtBearerEvents(); 会在后面的(上面的)组件中提示空对象。
中国(上海)国际技术进出口博览会(上交会CSITF),自成立以来,已经发展成为国内最具影响力的技术交流盛会之一。作为经国务院批准,由商务部、科技部、国家知识产权局和上海市人民政府共同主办的大型展会,上交会以“技术,让生活更精彩”为核心理念,以“创新驱动发展,保护知识产权,促进技术贸易”为主题,积极打造一个权威性展示、交流、服务的平台。
在过去的数年中,上交会始终秉持着推动技术创新、促进技术交流的宗旨,吸引了来自全球各地的参展商和观众。展会不仅集中展示了国内外最新的科技成果和创新产品,还为参展商和观众提供了一个交流和合作的平台,促进了技术转移和成果转化的进程。
作为一个大型展会,上交会的展区设置十分丰富。各个展区根据不同的主题和领域进行划分,涵盖了电子信息、人工智能、智能制造、新能源等多个领域。在展区内,参展商们纷纷展示了各自的最新产品和解决方案,其中不乏一些颠覆性的技术和创新产品。观众可以在展区内亲身体验到科技的魅力,深入了解各种新技术的实际应用和未来发展趋势。
除了展示和交流之外,上交会还为参展商和观众提供了一系列专业化的服务。例如,展会为参展商提供了展示和宣传的平台,通过各种渠道向全球推广最新的科技成果和创新产品。同时,展会还为观众提供了丰富的互动体验活动,如科技论坛、创新大赛等,让观众能够深入了解科技发展的最新动态。
值得一提的是,上交会还特别注重知识产权保护工作。在展会期间,组委会设立了知识产权保护办公室,为参展商和观众提供知识产权咨询和维权服务。这一举措不仅提升了展会的专业性和权威性,也为参展商和观众提供了一个安全、可靠的交流环境。
在未来的发展中,上交会将继续秉持“技术,让生活更精彩”的核心理念,积极推动技术创新和成果转化。同时,展会还将进一步加强国际化合作,吸引更多的国际参展商和观众参与其中,共同推动全球科技产业的繁荣和发展。
总之,中国(上海)国际技术进出口博览会(上交会CSITF)是一个集展示、交流、服务于一体的权威性平台。通过推动技术创新、促进技术交流、加强知识产权保护等工作,上交会已经成为国内最具影响力的技术交流盛会之一。在未来,我们有理由相信,上交会将继续发挥其重要作用,为全球科技产业的繁荣和发展做出更大的贡献。
目前,2024上交会招商工作已经全面启动,如果您有意愿成为展商或希望了解更多信息可关注“北京世亚展览有限公司”或者直接致电185 1555 6762,我们期待您的参与。
1:AppBar、TabBar、TabBarView实现页面切换,点击tab后tabBarView有左右切换动画,滑动page联动tabBar class DevicePage extends StatefulWidget { const DevicePage({super.key}); @override State<DevicePage> createState() => _DeviceState(); } class _DeviceState extends State<DevicePage> with SingleTickerProviderStateMixin { TabController? _tabController; List<Tab> tabs = [ const Tab( text: '设备类型', ), const Tab( text: '设备规格', ), const Tab( text: '设备台账', ), ]; int _cuttentIndex = 0; List<Widget> tabViews = [ const TabDeviceType(), const TabDeviceSpecs(), const TabDeviceLedger() ]; @override void initState() { super.initState(); _tabController = TabController(length: tabs.length, vsync: this); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppColors.
啰嗦几句 最近年终岁末,公司的各种文案各种总结,写得人是头晕脑胀,所以好多小伙伴最近在求智能写作的软件,最好是ChatGPT。
ChatGPT是国外产品,在国内并不能访问。而就智能写作来说,我们何必舍近求远呢,讯飞星火认知模型就已经非常强大了,智能写作功能方面一点也不比国外产品差。
而且最近讯飞星火上线了很多新的功能,比如增强了星火助手、增加了Ai智能插件和友伴,最最让人惊艳的是新增了“智能体”友伴功能,
永久免费申请 今天小明为大家申请了永久免费名额,传送门
讯飞星火认知大模型API针对所有【星火注册用户】免费开放,最高可免费领取1000万API使用权益。
软件介绍 讯飞星火认知大模型的功能超级多,我就从小伙伴们比较感兴趣的几个方面给大家介绍!
星火助手:星火助手这个功能并不陌生,其功能是利用Ai扮演绘画大师、文案大师、学霸助手等等各行各业的专业人士,目前星火助手已经有6400+的功能,功能十分丰富。
大家比较感兴趣的绘画大师、写作助手和程序编写功能。
写作助手:打工人必备的功能之一就是写作了,不管是总结、发言稿,还是普通的学生作文,它都可以胜任。比如我下面要求写一份发言稿:
编写程序:有好多小伙伴对编程感兴趣,在讯飞星火里输入你的需求,比如输入“实现Word转PDF的代码”,即能生成了一段带有详细的参数说明和注意事项的代码。
这些代码程序可供喜欢编程的小伙伴参考,利于学习。
AI绘画:用AI绘画时,输入你想要的画面要求,软件会给你生成一副你想要的图片,注意输入文字表达时,尽可能的详细。
此外,在手机APP中使用助手时,为了方便,我们可以把助手添加到桌面上,方法如下:
注:苹果和安卓都支持添加哟!
新增六个星火插件:
星火插件在三个月前只有3款插件,分别是:文档问答、PPT生成、简历生成,但现在已经增至9个功能了。
智能翻译:支持12种语言的翻译,包括英语、日语、德语、法语、泰语等等语言。
Ai面试官:生成的简历,我们可以使用“AI面试官”,上传刚刚生成的简历。
面试官即会给你生成可能面试时会问到的问题,这样方便我们从容的应试!
智能简历:输入你的基本信息,软件会自动的帮你生成一份简历,生成的简单可以编辑可以下载,此外如果觉得写得不好,还有范文供你参考。
智能生成思维导图:思维导图新增了很多样式,有树形图、架构图、时间轴等等,输入需求,即可一键生成。
除此之外,软件还有智能PPT生成、内容运营大师、流程图、邮件生成和文档问答,篇幅有限,我在这里就不一一介绍了,大家自己去体验!
星火友伴 这是讯飞星火新推出的功能,他通过各种角色模拟对话来回答大家提出的问题,有历史人物、虚拟角色、动漫角色等等。
我选择了曹操,提问大乔漂亮还是小乔漂亮,他的回答是难分高下。
再问他怎么看待前段时间小米汽车,曹丞相的回答是:吾甚期待其未来之发展,然亦知中途多艰。
再问他是貂蝉漂亮还是我漂亮,他前面说了一通貂蝉之美,最后回答是:汝之美,定在貂蝉之上。这情商啧啧。。。是盖过多少直男啊!
挺好玩的,大家可以自己去使用!
最后,感兴趣的小伙伴可以识别下面二维码进入体验!
注册体验地址
进入申请!现在申请权益更多,有需要的赶紧申请吧!
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。
Chapter3 Linear Neural Networks 3.3 Concise Implementations of Linear Regression import numpy as np import torch from torch.utils import data from d2l import torch as d2l true_w=torch.tensor([2,-3.4]) true_b=4.2 features,labels=d2l.synthetic_data(true_w,true_b,1000) #构造一个pytorch数据迭代器 def load_array(data_arrays,batch_size,is_train=True): #@save dataset=data.TensorDataset(*data_arrays) #"TensorDataset" is a class provided by the torch.utils.data module which is a dataset wrapper that allows you to create a dataset from a sequence of tensors. #"*data_arrays" is used to unpack the tuple into individual tensors.
项目场景:Expander集合滚动 如下图,有一个Expander集合,且设置 ScrollViewer.VerticalScrollBarVisibility = "Auto"
每个Expaner下包含有若干元素,当打开Expader(即IsExpanded = "true")时,集合右侧会出现滚动条,用户拉动滚动条来浏览集内容。
问题描述:每次滚动跳转太多 如下图所示,当用户滚轮下滑时,每次滚动了一个Expander(也就是一个集合的项——Expaner),这显然不是想要的。
原因分析: 当出现滚轮时,实际上创建了一个VirtualizingPanel,这是WPF为了优化性能做的事情,这里不深入探讨。VirtualizingPanel有个附加属性ScrollUnit,通过反编译可知(也可以查看微软官方文档),它是一个枚举,有两种模式。
public enum ScrollUnit { Pixel, Item, } 解决方案: 设置附加属性:VirtualizingPanel.ScrollUnit=“Pixel”
<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent" BorderThickness="0" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Disabled" VirtualizingPanel.ScrollUnit="Pixel" VirtualizingPanel.VirtualizationMode="Recycling" ItemsSource="{Binding MyItemCollection}"> <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Expander Header="{Binding Ip, Mode=OneWay}" HeaderHeight="26"> <ContentPresenter Content="{Binding}" /> </Expander> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> </ListBox> 解决后效果,如下,非常丝滑
这篇文章有
19635字,非常长,如果你正在地铁上,我建议你先收藏起来,这里总结的建议真的非常实用,我花了两天时间,才把他阅读并整理好,自己也受益匪浅。
今天正好是我开始写代码 20 周年。这些是我取得的一点成绩:
因在科学技术方面具有非凡能力而获得绿卡申请批准。成为 Google 开发专家。成为IEEE高级会员。曾在一家拥有 100 名员工的公司担任首席运营官。编写的一段代码被下载了1.35亿次。向2000位听众演讲两次。根据国家电视台的报道,成为俄罗斯最诚实的人。 尽管如此,我还是有很多遗憾,而且花了太长时间。我认为,如果我尽早运用我所学到的态度、原则和工作方法,我可以在 5 年的职业生涯里,获得这里的大部分成就。如果您正在开始自己的职业生涯,这篇文章有可能挽救您 15 年的生命。我不敢想象,我在 23 岁而不是现在 38 岁的时候就拥有了所有这份清单(IEEE 除外,这需要 10 年)。
在第一部分中,我将简要介绍一下我的职业生涯。在第二部分中,我将逐一分享会产生强烈影响的每一条建议。
第 1 部分:我如何度过 2003 年至 2023 年 2003年12月22日,我无法入睡,决定寻找可用的域名。我查了一下我想到的一些内容,并发现了 GetSoft.ru 等。我就购买了。
“我应该用它做什么?” - 我想。—“我想,我可以创建一个软件市场”。
那时,我已经成为一名业余开发者 7 年了(从 11 岁开始)。我正在制作俄罗斯方块、炸弹人、坦克城等游戏的克隆版本。我会将它们上传到我的网站,然后将链接放到当时的许多软件市场。它们真的很不方便,但我知道如何做一个更好的。
我学习 PHP 只是因为互联网上大多数 URL 都以“.php”结尾
2004 年 3 月 4 日,我推出了GetSoft.ru。
我的第一个商业网站的谷歌翻译版本。
然后我编写了一个脚本来解析竞争对手的网站,并发送一些个性化垃圾邮件,例如
你好,(姓名)。我们正在推出一个新的软件市场。请将您的程序(Title1、Title2、Title3…)添加到其中!
方法很有效,很快就获取了一些初始内容,吸引了搜索流量,进而吸引了更多供应商:
这个网站为我赢得了诺夫哥罗德市Telma(现为Harman Connected Services )的实习生职位。他们为摩托罗拉手机制作所有固件,并以此而闻名。一年后我辞职了,因为我认为自己更聪明,而且通过销售广告赚了很多钱。
收入让我变得懒惰。到了 2010 年,当市场发生变化、收入下降时,我错过了早期社交网络的黄金时代。我没有组建社区,仅靠搜索流量生活。
我无法想出拯救网站的计划,只是开始以自由职业者的身份为其他人制作公司网站。我在某个时候萌生了建立一个机构的想法。
2011年,我放弃了编程。我遇到了一位朋友,他是一位出色的老师。他帮助我开始有效地教授我的爱好。2013 年之前,我一直在学习摄影和摄像课程。然后,他通过投放公寓装修广告并将销售线索出售给实际的装修商,激励我创业。我取得了一些有限的成功。然后他聘请我教其他人如何获得订单并销售产品,我一直这样做到 2014 年中期。
然后他聘请我担任学习材料制作主管,负责他的教育业务的另一次迭代,然后任命我为首席技术官和首席运营官。我建立了他需要的所有 IT 基础设施,并从头开始制作了一个学习管理系统。
在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法?
这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的优化方法。
什么是优化算法? 优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数E(x)。
模型内部有些参数,是用来计算测试集中目标值Y的真实值和预测值的偏差程度的,基于这些参数,就形成了损失函数E(x)。
比如说,权重(W)和偏差(b)就是这样的内部参数,一般用于计算输出值,在训练神经网络模型时起到主要作用。
在有效地训练模型并产生准确结果时,模型的内部参数起到了非常重要的作用。这也是为什么我们应该用各种优化策略和算法,来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值。
优化算法分为两大类:
一阶优化算法 这种算法使用各参数的梯度值来最小化或最大化损失函数E(x)。最常用的一阶优化算法是梯度下降。
函数梯度:导数dy/dx的多变量表达式,用来表示y相对于x的瞬时变化率。往往为了计算多变量函数的导数时,会用梯度取代导数,并使用偏导数来计算梯度。梯度和导数之间的一个主要区别是函数的梯度形成了一个向量场。
因此,对单变量函数,使用导数来分析;而梯度是基于多变量函数而产生的。更多理论细节在这里不再进行详细解释。
二阶优化算法 二阶优化算法使用了二阶导数(也叫做Hessian方法)来最小化或最大化损失函数。由于二阶导数的计算成本很高,所以这种方法并没有广泛使用。
详解各种神经网络优化算法 梯度下降
在训练和优化智能系统时,梯度下降是一种最重要的技术和基础。梯度下降的功能是:
通过寻找最小值,控制方差,更新模型参数,最终使模型收敛。
网络更新参数的公式为:θ=θ−η×∇(θ).J(θ) ,其中η是学习率,∇(θ).J(θ)是损失函数J(θ)的梯度。
这是在神经网络中最常用的优化算法。
如今,梯度下降主要用于在神经网络模型中进行权重更新,即在一个方向上更新和调整模型的参数,来最小化损失函数。
2006年引入的反向传播技术,使得训练深层神经网络成为可能。反向传播技术是先在前向传播中计算输入信号的乘积及其对应的权重,然后将激活函数作用于这些乘积的总和。这种将输入信号转换为输出信号的方式,是一种对复杂非线性函数进行建模的重要手段,并引入了非线性激活函数,使得模型能够学习到几乎任意形式的函数映射。然后,在网络的反向传播过程中回传相关误差,使用梯度下降更新权重值,通过计算误差函数E相对于权重参数W的梯度,在损失函数梯度的相反方向上更新权重参数。
图1:权重更新方向与梯度方向相反
图1显示了权重更新过程与梯度矢量误差的方向相反,其中U形曲线为梯度。要注意到,当权重值W太小或太大时,会存在较大的误差,需要更新和优化权重,使其转化为合适值,所以我们试图在与梯度相反的方向找到一个局部最优值。
梯度下降的变体
传统的批量梯度下降将计算整个数据集梯度,但只会进行一次更新,因此在处理大型数据集时速度很慢且难以控制,甚至导致内存溢出。
权重更新的快慢是由学习率η决定的,并且可以在凸面误差曲面中收敛到全局最优值,在非凸曲面中可能趋于局部最优值。
使用标准形式的批量梯度下降还有一个问题,就是在训练大型数据集时存在冗余的权重更新。
标准梯度下降的上述问题在随机梯度下降方法中得到了解决。
随机梯度下降(SDG) 随机梯度下降(Stochastic gradient descent,SGD)对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。
θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)为训练样本。
频繁的更新使得参数间具有高方差,损失函数会以不同的强度波动。这实际上是一件好事,因为它有助于我们发现新的和可能更优的局部最小值,而标准梯度下降将只会收敛到某个局部最优值。
但SGD的问题是,由于频繁的更新和波动,最终将收敛到最小限度,并会因波动频繁存在超调量。
虽然已经表明,当缓慢降低学习率η时,标准梯度下降的收敛模式与SGD的模式相同。
图2:每个训练样本中高方差的参数更新会导致损失函数大幅波动,因此我们可能无法获得给出损失函数的最小值。
另一种称为“小批量梯度下降”的变体,则可以解决高方差的参数更新和不稳定收敛的问题。
小批量梯度下降 为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降(Mini Batch Gradient Descent),因为对每个批次中的n个训练样本,这种方法只执行一次更新。
使用小批量梯度下降的优点是:
可以减少参数更新的波动,最终得到效果更好和更稳定的收敛。
还可以使用最新的深层学习库中通用的矩阵优化方法,使计算小批量数据的梯度更加高效。
通常来说,小批量样本的大小范围是从50到256,可以根据实际问题而有所不同。
在训练神经网络时,通常都会选择小批量梯度下降算法。
这种方法有时候还是被成为SGD。
使用梯度下降及其变体时面临的挑战
很难选择出合适的学习率。太小的学习率会导致网络收敛过于缓慢,而学习率太大可能会影响收敛,并导致损失函数在最小值上波动,甚至出现梯度发散。
此外,相同的学习率并不适用于所有的参数更新。如果训练集数据很稀疏,且特征频率非常不同,则不应该将其全部更新到相同的程度,但是对于很少出现的特征,应使用更大的更新率。
在神经网络中,最小化非凸误差函数的另一个关键挑战是避免陷于多个其他局部最小值中。实际上,问题并非源于局部极小值,而是来自鞍点,即一个维度向上倾斜且另一维度向下倾斜的点。这些鞍点通常被相同误差值的平面所包围,这使得SGD算法很难脱离出来,因为梯度在所有维度上接近于零。
进一步优化梯度下降
现在我们要讨论用于进一步优化梯度下降的各种算法。
动量 SGD方法中的高方差振荡使得网络很难稳定收敛,所以有研究者提出了一种称为动量(Momentum)的技术,通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。换句话说,这种新方法将上个步骤中更新向量的分量’γ’添加到当前更新向量。
V(t)=γV(t−1)+η∇(θ).J(θ)
最后通过θ=θ−V(t)来更新参数。
动量项γ通常设定为0.9,或相近的某个值。
这里的动量与经典物理学中的动量是一致的,就像从山上投出一个球,在下落过程中收集动量,小球的速度不断增加。
在参数更新过程中,其原理类似:
使网络能更优和更稳定的收敛;
减少振荡过程。
当其梯度指向实际移动方向时,动量项γ增大;当梯度与实际移动方向相反时,γ减小。这种方式意味着动量项只对相关样本进行参数更新,减少了不必要的参数更新,从而得到更快且稳定的收敛,也减少了振荡过程。
看到有的资料说,dhcp服务器在分配ip地址时,要检测是否待分配的ip地址是否存在冲突,会向广播域发出,对应ip发出icmp的ping消息来验证是否冲突。特地用自己的公司的交换机验证一下,在交换机上镜像抓包观察一下。
wireshark的流程如下:
发现我司交换机没用ip冲突检测机制,如上图,dhcp服务器没有检测的icmp发出。
源mac是 Client MAC address: 44:37:e6:8d:95:27 (44:37:e6:8d:95:27)
发现没icmp检测消息,而检测是由终端完成了,发出arp探查消息完成的。
发现过程是终端用获得的ip进行探查arp消息发出,有应答后发出dhcp decline消息上报dhcp服务器出现ip冲突,同时,把自身ip 置为169.254.57.45发出arp探查消息,然后再次发出arp请求消息,终端再次发出dhcp的discover消息,服务器重新找个地址分配,终端重复arp消息进行探查。发现没有冲突后使用该地址。
整个流程如上。
第一次arp探查的消息
arp应答冲突了
上报这个ip192.168.205.57不可用
使用链路地址并发出arp探查
arp宣告消息,暂时使用这个ip地址
再次发起dhcp的申请流程
dhcp服务器分配一个新的ip地址
新的ip是192.168.205.55
request和ack流程后,再次用新ip发出arp探查,三次没用冲突,就使用该ip
确定没有冲突,就发出arp宣告消息
去请求网关的mac地址
结论:我司交换机设备dhcp模块无ip冲突探查功能,由终端完成arp冲突检测。终端用arp消息进行探查。
关注+星标公众号,不错过精彩内容
转自 | mculover6666
在做嵌入式 Linux 软件开发的时候,经常会阅读大型工程源码,比如 uboot 源代码,Linux Kernel 源码等。
所以,选择一个合适的工具来阅读源代码,变为了一个经久不衰的话题。
阅读源码的时候,其实无非也就两个重要的功能:
① 定义或者声明快速跳转
② 快速搜索指定内容
另外还有一些功能是和开发体验相关的,比如:
① 工具的主题(亮色和暗色)
② 工具是否方便修改编辑内容
③ 工具是否还提供其它的方便功能
目前常用的就是 Source Insight 和 VS Code,下面就来按照上述需求进行对比,看看哪个更适合?
创建代码工程
Source Insight 在阅读工程代码时,可以通过创建 Source Insight 工程来选择哪些文件加入,哪些文件不加入。
对于 uboot 这种包含有大量板级文件夹的工程,加入之后其中的文件只和目前移植的这款处理器有关,这个功能是非常有优势的,也是众多工程师喜爱 Source Insight 的原因。
相比之下,VS Code并不提供这种选择加入的功能,VS Code 非常粗暴,文件夹就是工作区,只需要打开源码文件夹,所有文件全部加入:
相比之下,我觉得 Source Insight 胜出,VS Code 这种将所有文件一股脑全部加入的方式,在查找文件时非常麻烦。
文件架构
在 Source Insight 中,打开一个文件的时候,会列出当前文件中所有预处理、宏定义、变量、函数的架构,如图:
在 VS Code 中打开文件时也有同样的功能,但又是一股脑的按照顺序将所有函数声明和定义列出,实际查看时也没有什么太多作用:
在文件整体架构方面,Source Insight 胜出,VS Code 对于代码架构方面的显示,还需要再优化。
定义跳转功能
在 Source Insight 中,可以右键跳转函数声明或者直接按住 Ctrl 点击函数名称,如果定义有重复会先提示,供你选择,如图:
关注+星标公众号,不错过精彩内容
来源 | 米尔电子
近日,米尔电子和瑞萨电子共同定义和开发了瑞萨第一款MPU生态开发板——瑞米派(Remi Pi)正式上市了!
在各种Pi板卡琳琅满目的当下,Remi Pi是一款与众不同的开发板,他兼顾了严肃产品开发和爱好者创意实现两种需要。
告诉你,选择它的五大理由:
工业芯片:采用瑞萨RZ/G2L双核A55芯片,芯片是工业级,结温可达-40℃—125℃,满足10年以上交期,是真正适合用来做严肃工业产品的芯片。
接口丰富:除了常见的HDMI,WIFI/蓝牙,音频等接口外,还包含Pi产品不多见的双网口,LVDS屏接口,通过外接模块可以扩展RS232/RS485/CAN。
软件丰富:面向HMI,网关,物联网等场景的Linux/Debian/Ubuntu等系统持续更新发布中。
核心系统:采用核心板加底板设计,如果未来开发产品,可以降低产品开发的硬件和软件难度,同时可以获得模组厂商的优良技术支持。
厂商补贴:该生态板卡不在盈利,而在推广瑞萨米尔技术产品,成本售价倒挂,厂商补贴大大降低评估和学习的成本。
为感谢广大客户长期以来的支持,Remi Pi以低于BOM成本的价格回馈市场,168元抢购价,限量推出200PCS,每个ID限购2套,售完即止,恢复原价398元,欢迎广大客户咨询抢购!
旗舰店链接:
https://detail.tmall.com/item.htm?id=763219500729
(提示:请复制链接在浏览器打开)
(1月25日 8:00限时抢购)
产品链接:
https://www.myir.cn/shows/23/14.html
旗舰店链接:
https://detail.tmall.com/item.htm?id=763219500729
资料下载链接:
http://down.myir-tech.com/RemiPi
更多关于Remi Pi技术问题讨论请登录米尔官方论坛:
https://bbs.myir-tech.com/forum-66-1.html
(提示:请复制链接在浏览器打开)
------------ END ------------
MCU百万次读写闪存测试
单片机实现呼吸灯效果的简单方法
开发到量产如何进行有效的嵌入式代码保护
在依赖注入(Dependency Injection,简称 DI)中,生命周期和作用域是非常重要的概念,它们对于正确设计和实现软件系统具有至关重要的作用。以下是生命周期和作用域在依赖注入中重要性的详细阐述:
生命周期的重要性
资源管理:生命周期定义了对象在系统中的存在时间。正确管理生命周期可以帮助我们更有效地管理系统资源,如内存和对象实例。性能优化:根据不同的生命周期模式,我们可以优化系统的性能。例如,单例模式可以减少对象的创建和销毁开销,从而提高性能。解耦和可测试性:生命周期可以帮助我们进一步解耦,使得代码更容易测试和维护。例如,瞬时对象可以在需要时创建,从而避免了对其他对象的硬性依赖。 作用域的重要性
控制对象的使用范围:作用域定义了对象在应用程序中的可见性和使用范围。这有助于我们更好地组织和管理代码,确保对象在正确的地方被使用。避免命名冲突:通过定义不同作用域,我们可以避免在全局命名空间中出现命名冲突的问题。实现特定场景的需求:某些场景可能需要对象在整个应用程序中都是可用的(如单例模式),而其他场景可能只需要对象在特定的上下文中可用(如请求作用域)。 生命周期与作用域的结合
在依赖注入框架中,生命周期和作用域通常是相互关联的。一个对象的生命周期决定了它存在的时间,而它的作用域决定了它在哪些上下文中可用。选择合适的作用域和生命周期对于构建可扩展、可维护和高性能的应用程序至关重要。
例如,一个数据库连接池可能采用单例模式以优化资源使用,同时设置其作用域为应用程序级别,以确保在整个应用程序中都可以重用这个连接池。相反,一个请求特定的对象(如一个用户会话)可能使用请求作用域,并且每次请求时都会创建一个新的对象实例。
一、生命周期 1.1 瞬时(Transient)模式 定义
瞬时模式指的是每次注入请求都会导致创建一个新的对象实例。这意味着,对于同一个注入点,每次请求都会有一个全新的对象。这个模式类似于函数式编程中的“无状态”概念,因为每次调用都会有一个全新的实例。
使用场景
瞬时模式适用于那些不依赖于其他对象、无状态且每次请求都需要新实例的情况。一些常见的使用场景包括:
短暂的计算过程: 瞬时对象适合于执行一次性任务,例如处理某个请求或执行一次性的计算。会话相关的数据: 如果数据与用户会话相关联,那么每次会话都应该有一个新的实例。**临时数据处理:**处理临时数据或中间数据的对象通常不需要与其他对象共享状态,因此适合使用瞬时模式。 优缺点
优点
隔离和独立性:由于每次请求都有一个新的实例,瞬时对象之间的状态不会相互影响。灵活性:瞬时模式允许为每个请求定制特定的参数或行为,而不受其他请求的影响。易于测试:瞬时对象易于单元测试,因为它们没有外部状态依赖,每次测试都是从一个干净的状态开始。 缺点
资源消耗:每次请求都创建新对象可能会导致更多的内存使用和对象创建的开销。缺乏持久性:瞬时对象无法保留状态,这可能导致在需要持久化数据的场景中使用不当。潜在的性能开销:频繁的对象创建和销毁可能会影响性能,特别是在大量并发请求的场景中。 瞬时模式在需要隔离状态、无状态操作或每次请求都需要一个新实例的场景中非常有用。然而,在使用瞬时模式时,也需要注意其潜在的资源消耗和性能影响。
1.2 作用域(Scoped)模式 定义
作用域模式定义了对象在应用程序中的范围或可见性。根据不同的作用域类型,对象可以在特定的上下文中被创建和使用,并可能受到作用域类型的生命周期管理。常见的作用域类型包括:
请求/上下文作用域(Request/Context Scope):在这种作用域下,对象在处理单个请求期间存在,并在请求结束时被销毁。会话作用域(Session Scope):在这种作用域下,对象在整个会话期间存在,并在会话结束时被销毁。应用程序作用域(Application Scope):在这种作用域下,对象在整个应用程序生命周期内存在,即使请求结束也不会被销毁。服务作用域(Service Scope):在这种作用域下,对象在特定的服务调用期间存在,并在服务调用结束时被销毁。 使用场景
作用域模式的使用场景取决于应用程序的需求和设计。以下是一些典型的使用场景:
请求/上下文作用域: 用于处理请求相关的临时数据,如请求日志、临时缓存等。适用于需要在请求处理期间保持状态的组件。 会话作用域: 用于存储与用户会话相关的数据,如用户首选项、购物车信息等。适用于需要在多个请求之间保持状态的组件。 应用程序作用域: 用于存储应用程序级别的全局数据,如配置信息、数据库连接池等。适用于需要在整个应用程序生命周期内保持状态的组件。 服务作用域: 用于存储与特定服务调用相关的数据,这些数据仅在服务调用期间相关。适用于需要在服务调用期间保持状态的组件。 优缺点
优点 生命周期管理:作用域模式允许对对象的生命周期进行精细管理,确保对象在正确的上下文中创建和销毁。内存优化:通过作用域管理,可以优化内存使用,避免不必要的内存分配和垃圾回收。状态管理:作用域模式有助于维护对象的状态,确保对象在正确的上下文中保持状态。 缺点 复杂性:使用多种作用域可能会增加应用程序的复杂性,需要谨慎设计和实现。性能开销:在某些情况下,作用域管理可能会引入性能开销,特别是在创建和销毁对象时。依赖性:对象的作用域可能会影响其他组件的依赖性,需要仔细考虑作用域的选择对应用程序设计的影响。跨作用域通信困难:在不同的作用域之间共享数据或状态可能会变得复杂。生命周期管理挑战:在某些情况下,确保对象在正确的时候创建和销毁可能具有挑战性,尤其是在并发环境中。 1.3 单例(Singleton)模式 定义
在单例模式中,类的实例化过程被限制,确保只能创建一个对象实例。这个唯一的实例可以通过一个全局访问点(公共静态成员变量或静态方法)来访问。使用场景
单例模式适用于以下情况: 需要全局访问的组件:如果一个组件需要在应用程序的任何地方都能被访问,并且这个组件只应该有一个实例,那么就可以使用单例模式。资源共享的情况:如果多个对象需要共享相同的资源(如数据库连接、日志记录器等),那么单例模式可以确保这个资源只被一个对象管理。控制资源的情况下:当资源的使用需要被严格控制时,例如数据库连接、线程池等,使用单例模式可以确保资源的合理使用和性能优化。需要频繁实例化然后销毁的对象:如果一个对象在多个地方被频繁地创建和销毁,但它的生命周期并不需要这么频繁,那么使用单例模式可以减少对象的创建和销毁次数,提高性能。创建对象时耗时过多或者耗资源过多的对象:如果创建一个对象需要消耗大量的资源和时间,那么使用单例模式可以避免频繁地创建和销毁对象。有状态的工具类对象:如果一个工具类对象需要保存一些状态信息,并且这些状态信息需要在多个地方共享,那么可以使用单例模式来实现这个功能。 优缺点 优点
- 资源优化:通过限制对象的创建,单例模式可以优化资源的使用,特别是当创建对象的开销很大时。
- 全局访问:单例模式提供了一种全局访问点,使得对象可以在应用程序的任何地方被访问。
- 控制实例数量:单例模式可以确保一个类只有一个实例,这对于需要严格控制实例数量的系统很有用。缺点 可测试性差:由于单例对象在系统启动时就创建了,这使得对单例对象的测试变得困难,因为对象已经存在,无法模拟它的创建过程。设计局限性:单例模式不符合“开闭原则”(Open-Closed Principle),即开可以扩展,但不能修改已有的代码。如果要添加新的单例实例,可能需要修改原始的代码。设计模式滥用:有时候可能会过度使用单例模式,导致系统难以测试和维护。全局状态:单例模式可能导致全局状态的存在,这可能会导致设计上的问题,并增加系统的复杂性。并发问题:在多线程环境中,如果单例模式没有正确实现线程同步,可能会导致并发问题,如数据不一致性等。 单例模式它适用于需要全局访问的组件和资源共享的情况。然而,在使用单例模式时,也需要注意它的局限性和潜在问题,如可测试性差、设计局限性、全局状态和并发问题等。
二、作用域 定义
重定向
0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。
在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将某个程序的错误信息输出到log文件中:./program 2>log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。
另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如:
# ls 1>/dev/null 2>/dev/null 还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如:
# ls >/dev/null 2>&1 注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null
由于使用nohup时,会自动将输出写入nohup.out文件中,如果文件很大的话,nohup.out就会不停的增大,这是我们不希望看到的,因此,可以利用/dev/null来解决这个问题。
nohup java -jar ./program >/dev/null 2>log & 如果错误信息也不想要的话:
nohup java -jar ./program >/dev/null 2>&1 &
处理器拦截器(HandlerInterceptor)在Spring MVC中的注册方式主要有两种:
1. 使用Java配置类注册
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; // 自定义的拦截器类实现HandlerInterceptor接口 @Override public void addInterceptors(InterceptorRegistry registry) { // 注册自定义拦截器 registry.addInterceptor(myInterceptor) .addPathPatterns("/**") // 指定拦截所有请求,可以根据需要指定特定路径 .excludePathPatterns("/public/**"); // 排除不需要拦截的路径 } } 2. XML配置方式注册
<!-- 在Spring MVC的配置文件中添加 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <!-- 拦截所有请求 --> <mvc:exclude-mapping path="/public/**" /> <!-- 排除不需要拦截的请求 --> <bean class="com.example.MyInterceptor" /> <!-- 自定义的拦截器类 --> </mvc:interceptor> </mvc:interceptors> 在这两种方式中,MyInterceptor 是实现了 org.
使用VS2022创建WebAPI项目时,默认勾选“配置HTTPS(H)”,这样启动WebAPI时以https方式启动。
如果要从HTTPS调整为HTTP启动,需要修改项目中以下几处,首先是Program.cs中删除app.UseHttpsRedirection()语句,删除后启动项目,会按launchSettings.json中profiles下applicationUrl的第一个url启动。
保险一点的话,应该删除launchSettings.json中applicationUrl属性内的所有https网址。再运行项目即以http方式启动。
VS2019版本中还需在项目属性中取消勾选HTTPS设置,不过在VS2022的项目属性中没有找到类似选项。
介绍 营销号,有时候需要一些特定的欢迎语,但针对特定的用户,我们希望可以个性化一点。本题需要在项目文件中修改代码存在的问题,实现根据模版生成特定用户的欢迎语。
准备 本题已经内置了初始代码,打开实验环境,目录结构如下:
├── css │ ├── bootstrap.min.css │ └── style.css ├── js │ ├── bootstrap.bundle.min.js │ └── index.js └── index.html 其中:
css/style.css 是页面样式文件。css/bootstrap.min.css 和 js/bootstrap.bundle.min.js 是 Bootstrap 相关文件。js/index.js 是页面功能实现的逻辑代码。index.html 是页面布局。 选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。打开环境右侧的【Web 服务】,就可以在浏览器中看到如下错误显示,当前显示没有正确获取到输入的用户、课程、平台的输入框内容。
目标 请修复 index.js 文件中存在的 bug,修复完成后,在表单的对应输入框中输入以下内容:
页面效果如下所示:
规定 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径等。满足题目需求后,保持 Web 服务处于可以正常访问状态,点击「提交检测」系统会自动判分。 解题思路: 首先这个题目考虑的是两个问题
一个是能否正确的获取到value值,我刚开始就是忽略这里了
subject = document.getElementById("subject").value;
第二点就是看会不会模板字写法了,(还有别的方法,我会这个)模板字面量是一种特殊的字符串表示方法,它可以在字符串中插入变量、表达式或函数调用,并且保留换行符和空格。
result = `欢迎用户${subject}在${event2}学习${event1}课程!`;
另外一定要注意这里的在***学习是event2,学习的***课程才是event1,刚开始没注意,太粗心了,这要是考试就废了
整体代码:
function generate() { subject = document.
引用和指针是两种不同的概念,尽管它们在某些方面有一些相似之处,但它们在功能和用途上是有所区别
声明与定义 引用:引用是别名,是对已存在变量的另一个称呼,一旦一个变量被引用,就不能再被引用其他变
量。
int a = 10; int& ref = a; 这里,ref 是 a 的引用,它们引用的是同一个对象。
指针:指针是一个变量,其值为另一个变量的地址。指针可以被重新赋值以指向其他变量。
int a = 10; int* ptr = &a; 这里,ptr 是一个指向 a 的指针。
初始化和绑定 引用:引用必须在声明时就初始化,并且一旦一个引用被绑定到一个对象,就不能再被重新绑定到其他对象。
指针:指针可以在任何时候被初始化,也可以被重新指向其他对象。
int a = 10; int* ptr = &a; int b = 20; ptr = &b; 这里,指针 ptr 被重新指向了 b
间接性 引用:引用不具有间接性,一旦一个变量被引用,就可以像使用该变量一样直接使用这个引用。
int a = 10; int& ref = a; std::cout << ref << std::endl; 这里可以直接使用 ref,不需要间接性。
指针:指针具有间接性,必须通过解引用来使用指针所指向的对象。
背景介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方式,这次试题将利用 Flex 实现经典布局效果。
准备步骤 在开始答题前,你需要在线上环境终端中键入以下命令,下载并解压所提供的文件。
wget https://labfile.oss.aliyuncs.com/courses/7835/fruit-flex.zip&& unzip fruit-flex.zip && rm fruit-flex.zip 下载完成之后的目录结构如下:
├── index.css └── index.html └── img 其中:
index.css 是本次挑战的需要补充样式文件。index.html 为主页面。img 图片文件夹。 选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。打开环境右侧的【Web 服务】。 考试要求 提示 align-self 值 : flex-start flex-end center baseline stretch order:<整数>(... -1, 0 (default), 1, ..) 在需要修改部分的代码有相关提示,请仔细阅读之后,使用 flex 布局中的 align-self 和 order 完善 index.css 中的代码, 把对应的水果放在对应的盘子里面,最终效果如下:
要求规定 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径等。满足题目需求后,保持 Web 服务处于可以正常访问状态,点击「提交检测」系统会自动判分。 解题思路 题目中给了提示
20240114
跟着黑马学习瑞吉外卖项目
DAY1数据库环境搭建 导入数据库
表含义
MAVEN项目搭建 检查maven配置
jre
sdk 1.8
pom设置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> 依赖加入
pom.xml parent爆红解决:idea导入项目爆红问题记录以及解决_java_脚本之家
resource导入
server: port: 8080 //启动时tomcat端口号 spring: application: #启动时应用的名称,若不配置默认使用工程名 name: reggie_take_out datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root password: root mybatis-plus: configuration: #address_book----->> AddressBook #user_name----->>userName #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: ASSIGN_ID //主键生成策略 创建启动类
创建启动类:
package com.itheima.reggie; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.
当涉及到MySQL数据库的基本操作时,我们通常会涉及到创建数据库、创建表格、插入数据、查询数据等操作。下面是一个简要的MySQL基本操作的博客:
---
MySQL基本操作详解 MySQL是一个广泛使用的关系型数据库管理系统,为许多应用程序提供了可靠的数据存储。本博客将介绍MySQL的一些基本操作,包括创建数据库、创建表格、插入数据、查询数据等操作。
#1. 安装MySQL 首先,您需要在您的系统上安装MySQL。可以通过MySQL官方网站或包管理工具进行安装。安装完成后,您可以启动MySQL服务。
2. 登录MySQL 使用以下命令登录MySQL数据库:
mysql -u 用户名 -p 系统会提示您输入密码。输入正确的密码后,您将进入MySQL的命令行界面。
3. 创建数据库 要创建一个新的数据库,可以使用以下命令:
CREATE DATABASE 数据库名; 例如:
CREATE DATABASE mydatabase; 4. 选择数据库 使用以下命令选择要操作的数据库: USE 数据库名; 例如:
USE mydatabase; 5. 创建表格 创建表格是存储数据的一种方式。以下是一个创建表格的示例:
CREATE TABLE 表格名 ( 列1 数据类型, 列2 数据类型, 列3 数据类型, ... ); 例如:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL ); 6. 插入数据 使用`INSERT INTO`语句将数据插入表格中:
第一部分:Javaweb常见安全及代码漏洞
以开源项目webgoat-server-8.1.0为例,可以在GitHub上看到,直接可以下载jar包,在本地准备jdk环境,使用以下命令进行启动:
java -jar webgoat-server-8.1.0.jar --server.port=9091
WebGoat 版本可能是用 Java 11 或更高版本编译的,因此无法在 Java 8 上运行。再下一个麻烦,直接用idea打开jar包瞧瞧,我使用idea里面自带的下载jdk运行jar包,聪明如我哈哈哈:
哎呦,访问一下,成功!
想查看源代码,就把刚刚的jar包解压后丢尽idea中查看:
可以通过bp抓包看java是怎么请求的,了解请求过程,进行一些代码追踪。
第二部分:
当使用post提交数据与后端通过数据库查询出来的值做比较时,如果s1=1&s2=2失败的话,说明s1和s2的值不满足要求,我没也不知道数据库这两个值到底是什么,现在使用s3=&s4=有可能就可以绕过,因为数据库如果没有s3和s4的话,提交的null值,从数据库查出来的也是null值,最终判断就是可以相等的
第三部分:
JWT:和以前学过的cookie/session有些类似,也是用来验证用户身份的,在php,Java等语言中都有出现过,不过最常使用在Java/Python项目上。
参考文章:https://www.cnblogs.com/yokan/p/14468030.html(强烈建议看完再往下看)
如何判断一个网站是否采用了JWT验证,查看cookie中是否又以. 点好分割的三部分,每个部分由大小写区分的字母数字随机组合,因为jwt是由三部分组成的,header.payload.signature ,例如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
可以看到这里有三段用.分割的内容:
第一段:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
第二段:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
第三段:SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
我们把第一段解密一下看看:
举一个真实的例子看看:
在官网中查看这样一段东西:
如果身份验证这里,admin的值改为true,再将左边的值放到请求包中,是否修改了权限呢?不行!如果是这样,jwt发明的人不是白干了吗!!!真实情况是还要考虑其他复杂的因素。
那采用jwt的网站有哪些攻击方式呢?
继续参考该博客:https://www.cnblogs.com/yokan/p/14468030.html
JWT攻击方式:
1. 利用加密算法:0x01 空加密算法:JWT支持使用空加密算法,可以在header中指定alg为None,当对方不验证空加密时的签名中,可以使用这种方式
{
“alg” : “None”,
“typ” : “jwt”
}
{
“user” : “Admin”
}
在jwt中,算法和密匙缺一不可:
那就明白了上面单纯修改权限的地方为什么不可以了,因为知识简单修改了payload,而没有修改密匙。那想要攻击成功,就需要对方不验证密匙,也叫空模式加密。
利用爆破密匙:
利用py脚本和字典进行破解:
py脚本内容: import jwt import termcolor if __name__ == "__main__": jwt_str = R'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY0MTg5Njc3MiwiZXhwIjoxNjQxODk2ODMyLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.ZaBAasksu_uUYloJwpaNwzRhpIaHNSSYxSANfmNZ1Rk' with open('top1000.
1、起别名 在MyBatis中,<typeAliases>元素用于定义类型别名,它可以将Java类名映射为一个更简短的别名,这样在映射文件中可以直接使用别名而不需要完整的类名。
下面是一个示例:
在mybatis核心配置文件中配置typeAliases标签
<typeAliases>
<typeAlias alias="Acount" type="duhong.entity.Account"/>
</typeAliases>
为duhong.entity.Account类指定了别名Account。
定义了这些别名后,我们可以在映射文件中直接使用这些别名来引用对应的Java类,例如:
<resultMap id="AccountMap" type="Account"> 通过使用别名,我们可以简化映射文件中的配置,并提高代码可读性和可维护性。
2、mybatis核心配置文件加载映射文件的其他方式 <package name="duhong.dao"/> 这种声明方式,会使mybatis查找duhong/dao下对应的xml文件,不过这种方式要求xml资源目录与dao层目录一致,而且xml名称要与mapper接口名称一致。
3、#{}与${}的区别 在MyBatis中,#{} 和 ${} 用于处理SQL语句中的参数,但是它们在作用和安全性方面有所不同。
#{} 语法:
在MyBatis中,当你使用 #{} 来表示一个参数占位符时,MyBatis会在运行时将其替换为一个参数的值,并且会使用预处理语句(PreparedStatement)来处理参数。也就是说,不管参数值是什么,它都会被视为一个字符串值并且正确地转义。 SELECT * FROM some_table WHERE id = #{id} ${} 语法:
与 #{} 不同,当你使用 ${} 时,MyBatis会直接将这个位置替换为变量的字面值。也就是说,如果你的变量中包含了特定的SQL关键词或结构,它将不做任何转义直接嵌入SQL语句中。 SELECT * FROM ${tableName} WHERE column = #{value} 测试:
dao层添加接口
//查询所有,按降序排列
List<Account> selectAllByDesc(String key);
mapper中添加查询语句
resultMap id="AccountMap" type="duhong.entity.Account">
<id property="id" column="id"></id>
<result property="accountNumber" column="account_number"></result>
<result property="
一个成功的软件,离不开人性化的UI设计,如何抓住用户第一视觉,让用户产生依赖感,合适优雅的布局必不可少。本文以一些简单的小例子,简述WPF中布局 面板 控件的使用,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点 在WPF中,关于布局面板控件,主要有以下几种:
StackPanel:栈面板,可以将元素排列成一行或者一列。其特点是:每个元素各占一行或者一列。
WrapPanel:环绕面板,将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够时就会自动调整进行换行,后续排序按照从上至下或从左至右的顺序进行。
DockPanel:停靠面板,定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中。
Grid:网格面板, Grid顾名思义就是“网格”,以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面,整齐配列。Grid和其他各个Panel比较起来,功能最多也最为复杂。
Canvas:画布面板,画布,用于完全控制每个元素的精确位置。他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面。
StackPanel【栈面板】 栈面板,可以将元素排列成一行或者一列,其特点是:每个元素各占一行或者一列。
Orientation属性指定排列方式:
Vertical(垂直)【默认】,垂直排列时,每个元素都与面板一样宽。
Horizontal(水平),水平排列时,每个元素都与面板一样高;
如果包含的元素超过了面板空间,它只会截断多出的内容。元素的Margin属性用于使元素之间产生一定得间隔,当元素空间大于其内容的空间时,剩余空间将由HorizontalAlignment和 VerticalAlignment属性来决定如何分配。
Vertical(垂直),默认情况下,每一个元素都与面板一样宽,如下所示:
示例代码,如下所示:
<Window x:Class="WpfApp1.SecondWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="StackPanel示例" Height="450" Width="500"> <StackPanel Margin="5,5,5,5"> <Button x:Name="button1" Content="第一个按钮" Margin="2,5,2,5"></Button> <Button x:Name="button2" Content="第二个按钮" Margin="2,5,2,5"></Button> <Button x:Name="button3" Content="第三个按钮" Margin="2,5,2,5"></Button> <Button x:Name="button4" Content="第四个按钮" Margin="2,5,2,5"></Button> <Button x:Name="button5" Content="第五个按钮" Margin="2,5,2,5"></Button> <Button x:Name="button6" Content="第六个按钮" Margin="2,5,2,5"></Button> <Button x:Name="button7" Content="第七个按钮" Margin="2,5,2,5"></Button> </StackPanel> </Window> Horizontal(水平),水平排列时,每个元素都与面板一样高。如下所示:
示例代码,与垂直排列相同,只是多了一个Oriention属性,如下所示:
<StackPanel Margin="5,5,5,5" Orientation="
Flink 系统架构 1.Flink 组件1.1 JobManager1.2 ResourceManager1.3 TaskManager1.4 Dispatcher 2.应用部署2.1 框架模式2.2 库模式 3.任务执行4.高可用设置4.1 TaskManager 故障4.2 JobManager 故障 Flink 是一个用于状态化并行流处理的分布式系统。它的搭建涉及多个进程,这些进程通常会分布在多台机器上。分布式系统需要应对的常见挑战包括 分配和管理集群计算资源,进程协调,持久且高可用的数据存储 及 故障恢复 等。
Flink 并没有依靠自身实现所有上述功能,而是在已有集群基础设施和服务之上专注于它的核心功能:分布式数据流处理。Flink 和很多集群管理器(如 Apache Mesos、YARN 及 Kubernetes)都能很好地集成;同时它也可以通过配置,作为独立集群来运行。Flink 没有提供分布式持久化存储,而是利用了现有的分布式文件系统(如 HDFS)或对象存储(如 S3)。它依赖 Apache ZooKeeper 来完成高可用性设置中的领导选举工作。
本篇博客我们将介绍搭建 Flink 时所涉及的不同组件并讨论它们在应用运行时的交互过程。我们主要讨论两类部署 Flink 应用的方式以及它们如何分配和执行任务。最后,我们将解释 Flink 高可用模式的工作原理。
1.Flink 组件 Flink 的搭建需要四个不同组件,它们相互协作,共同执行流式应用。这些组件是:JobManager、ResourceManager、TaskManager 和 Dispatcher。Flink 本身是用 Java 和 Scala 实现的,因此所有组件都基于 Java 虚拟机(JVM)运行。
1.1 JobManager 作为主进程(master process),JobManager 控制着单个应用程序的执行。换句话说,每个应用都由一个不同的 JobManager 掌控。JobManager 可以接收需要执行的应用,该应用会包含一个所谓的 JobGraph,即 逻辑 Dataflow 图,以及一个打包了全部所需类、库以及其他资源的 JAR 文件。JobManager 将 JobGraph 转化成名为 ExecutionGraph 的 物理 Dataflow 图,该图包含了那些可以并行执行的任务。JobManager 从 ResourceManager 申请执行任务的必要资源(TaskManager 处理槽)。一旦它收到了足够数量的 TaskManager 处理槽(slot),就会将 ExecutionGraph 中的任务分发给 TaskManager 来执行。在执行过程中,JobManager 还要负责所有需要集中协调的操作,如创建检查点。
代码:
#include <iostream> #include<map> using namespace std; int main() { string s1,s2; cin>>s1>>s2; map<char,int>h; for(auto b:s1){ h[b]++; } for(auto b:s2){ h[b]--; } if(s1.length()>s2.length()) { for(auto b:s1){ if(h[b]==1) cout<<b; } } else{ for(auto b:s2){ if(h[b]==1) cout<<b; } } // 请在此输入您的代码 return 0; }
通过CES 2024这个全球消费电子行业的风向标,我们可以预见汽车行业正在迎接一个怎样的未来?
AI正在重塑汽车行业
自从ChatGPT横空出世,生成式AI与大语言模型就以锐不可当之势席卷全球,并正在重塑千行百业,汽车行业自然也不例外。
事实上早在ChatGPT诞生之前,在“电动化、网联化、智能化、共享化”的“新四化”大潮下,汽车行业就已经迈入了以“智能化”为显著标志的下半场。而AI人工智能技术的飞速进步,更是进一步加快了这一进程。
近日在美国拉斯维加斯召开的CES 2024上,作为汽车行业领先的移动出行技术供应商,马瑞利就以“设计引导创新”为主题,揭示了AI技术正在给汽车行业带来的深刻变革。
创新平台展示超前设计
在CES 2024上,马瑞利向参会嘉宾展示了其全新推出的“Lean”和“Advantage”平台。通过这些创新平台,汽车制造商可以选择预装主要部分的解决方案,并留出足够空间方便进行功能定制。
“Lean”平台以精简软硬件为基础设计理念,在不牺牲性能的前提下,较常规产品零件更少,重量更轻,成本更低。在“Lean”平台上开发的系统能够满足用户需求,具有可持续性、可随时启用的特点,主要针对入门级车辆、品牌和内饰级别,以吸引预算敏感型消费者和集团客户。目前马瑞利在“Lean”首先推出的系统有LeanLight和LeanDisplay,其中LeanLight前照灯和尾灯的概念设计,较传统车灯部件减少了20%,重量减轻了20%,二氧化碳排放量减少了6公斤;LeanDisplay则采用了面向制造的设计方法,能够以超低的价格提供先进的局部调光性能,组件减少了60%,重量减轻了40%,并进一步优化了背光技术,降低了生产成本。
“Advantage”平台预留了云端应用程序接口,便于连接到马瑞利中继微服务软件架构。马瑞利的数字孪生演示器由亚马逊云科技提供支持,可以在云端模拟生成全车驾驶舱,用来加速设计、测试、模拟和无线功能部署。该模拟驾驶舱正是马瑞利首个面向市场的“Advantage”平台解决方案之一,并建立在容器化微服务架构上,在不影响现有功能的情况下,每项功能依然可以快速轻松地独立升级,并且支持便携式硬件应用程序。目前马瑞利正在“Advantage”平台上开发供设计师使用的独立软件工具,以及更加丰富的互联系统。
软件定义汽车的变革
在“软件定义汽车”的价值主张下,马瑞利正在通过可扩展的硬件架构、服务型软件,以及由亚马逊云科技、QNX以及高通技术支持的云端虚拟技术,助力软件定义汽车的变革。在本届CES上,马瑞利就为参展嘉宾们展示了支持架构可扩展性、软件的可移植性、域控制标准化和云虚拟化等多方面的技术,以及全主动机电悬架系统、域控制单元、集成热管理模块和由AI人工智能驱动的无线电池管理系统。
马瑞利的数字孪生技术展示给无数嘉宾留下了深刻印象。通过回答关于驾驶偏好的问题,数字孪生工作室能够生成与嘉宾驾驶个性化相符的数据,并基于这些数据生成相应的个性化功能,来宾可以使用交互式应用程序选择车辆功能,在模拟演示车中看到实际效果,并且与自己的个性化3D头像互动,体验“黑镜”显示器、氛围灯、智能表面、驾驶员监控和人机交互界面技术。
由数字座舱演化而来的软件定义座舱体验,可支持诸多新一代显示技术,并建立在马瑞利的集中式架构之上。该架构包括基于最新一代高通骁龙座舱平台的中央计算单元(CCU)和4个车身区域控制器(ZCU),以数字化显示屏替代了传统的模拟交互方式,并结合AI人工智能技术实现了交互内容的个性化定制。座舱体验中还无缝集成了马瑞利的软件定义音频平台,为用户提供独一无二的个性化聆听体验。用户可以根据自身喜好量身定制座椅位置、温度、氛围照明、音乐偏好和地面照明等各种汽车设置,甚至能够让马瑞利的虚拟助手充当车载副驾驶,彻底改变汽车与乘客之间的互动模式,为自己打造独特的驾驶体验。
马瑞利的智能社交显示屏也让不少嘉宾眼前一亮。该技术的初衷在于支持车辆与外界进行信息传递,为车辆的照明与通信提供了新的可能。智能社交显示屏将中分辨率显示屏集成到汽车的前部和侧面,提供了许多集成选项,可通过符号显示汽车何时处于自动驾驶模式,传达驾驶员意图,并在接近十字路口或人行横道时向行人传递“可安全通行”等信息,从而保障车辆的安全与社交需求。目前马瑞利正在研发基于mini-LED技术的第二代高分辨率显示屏,让显示屏也可以集成在车辆的尾灯或后备箱表面。
领先汽车照明解决方案显著提升夜间行车安全
对于汽车用户来说,安全永远是放在第一位的。马瑞利将Micro LED技术运用到高性能车灯,推出了e-light 9和Micro-LED车灯模组,将可独立控制的25600个像素组成一整块高亮照射区域,加上高性能远近光光型分布,使得夜间行车犹如白昼,显著提升了夜间行车安全。
该照明解决方案具有多个方面的优势:首先,ADB自适应远光性能更加安全,可以提供更亮、更精细的照明,提高可见性;其次,数字光照控制能够提供多种照明模式和精确控制,适应不同道路和环境条件;再者,道路投影功能可在道路上投射图像或文字,可为驾驶者指示方向或提供引导信息,也能给其他交通参与者提供信息。
马瑞利提供的该模组组合配置具有结构紧凑、重量轻盈、功能强大以及高效节能的各种优势,可以说是高端车型的不二之选。2023年12月蔚来发布的最新车型ET9,就是国内首款采用Micro-LED照明解决方案的自主品牌车型。ET9搭载马瑞利Micro-LED照明解决方案,实现自适应车灯(ADB)的近远光亮度增强、超广角覆盖、超大随动转向角度以及更远的照射距离,并且还具备地面投影功能,可提供多种车用信息投射交互功能,在增强驾驶的安全性和功能性的同时,还为用户提供了更加智能化、个性化的驾驶体验。
AI定义移动出行未来
在AI人工智能技术的加持下,移动出行正在迎接一个怎样的未来?
在本届CES 2024马瑞利展台的“布局未来”区域中,马瑞利重点展示了自己针对下一阶段的设计,即一种由AI人工智能技术驱动的车内体验。这些设计包括了先进的音频和声音分区、电动隐藏显示屏和内饰组件、控制台投影、环保材料、多模态交互、带地面投影的高清前照灯、多色照明前面板和格栅、外部信息显示屏、后窗投影等。这也预示着AI人工智能技术正在定义移动出行的未来。
值得一提的是,作为业界首个将红色激光技术与汽车尾部照明功能相结合的解决方案,马瑞利的激光与车规级光纤尾灯技术还在本届CES大战上荣获了2024 CES创新奖。该技术将红色半导体激光发生器与其内部的车规级光纤相耦合,最终形成一条极细、均匀的照明曲线,使得OEM汽车制造商能够灵活地创造独特且具备时尚美感的品牌特征。
对于企业级软件解决方案以及云服务市场来说,中国市场目前的发展状况如何?是否值得跨国企业深耕?未来又有着多大的潜力?
针对以上这些问题,Infor以实际行动给出了自己的答案。
稳健增长的行业领导者
“Infor的愿景,是提供能够激发客户释放所有潜能、改善人类生活的云解决方案。”Infor全球副总裁兼大中华区董事总经理冯士永(Gavin Feng)向趣味科技表示,“作为业内领先的企业级软件解决方案ERP和行业专属云公司,Infor将坚持其核心方向,并加大在行业云上的投入。与此同时,Infor将与客户共同发掘新的需求,以实现长期共赢。”
冯士永透露,Infor在2023年实现了稳健增长和持续投入,营收总规模达到了32亿美元,全球服务超过6万客户。其中在云业务方面,订阅业务增长显著,不但总营收达到12亿美元,而且还保持了高达20%的5年复合增长速度。这些成绩得益于Infor与客户的长期合作和共同发展。高达97%的客户续保率,体现了客户对Infor的高度认可。而在研发、支持及服务方面,Infor也保持着15亿美元/年的投入。
Infor作为行业专属的云公司,聚焦于深耕航空航天、汽车、分销物流、时尚、食品饮料、医疗、高科技、工业制造等八大行业。在这些行业中,Infor拥有2000多个子行业作为深耕目标。通过深入行业,Infor确保其解决方案能够满足用户的需求并成功交付。
Infor在企业解决方案、ERP和行业云方面具有领先地位,在SaaS和大型企业云ERP方面也取得了显著成绩,2023年更是被多家行业权威机构评为领导者,其中就包括在Gartner 2023年“产品导向型企业云ERP关键能力”4项用例评测中获最高分;在《IDC MarketScape:全球SaaS和大型企业云ERP厂商2023-2024评估》中获评“领导者”;被2023年Gartner CPQ应用套件魔力象限评为“领导者”;入选Nucleus Research 2023年CPQ技术价值矩阵领导者象限;入选Nucleus 2023年WMS技术价值矩阵领导者象限……这些来自用户反馈和权威机构的认可和肯定,也进一步巩固了Infor在业界的领导者地位。
根植本土的大中华区战略
作为近日才上任的Infor全球副总裁兼大中华区董事总经理,冯士永负责制定区域内的业务拓展战略,并确保客户业务成功以及项目交付。在加入Infor之前,冯士永曾在Databricks、Abbott、Oracle、Qlik等公司担任区域管理层职位。此次任命也充分表明了Infor对中国市场的重视,以及对深耕本土的决心。
冯士永表示,Infor进入中国市场已有22年,见证了中国经济的蓬勃发展。目前,Infor在大中华区拥有7个区域办公室,分别位于北京、大连、天津、上海、中国台北、香港和深圳,拥有500多名员工,其中包括超过300名本土研发人员。Infor计划将继续投资扩大本地团队,其中位于大连的客户支持中心更是不仅仅面向中国客户,还负责支持日本等其他地区。截至目前为止,Infor在中国市场已经服务了近6000家客户,并且在中国已经建立了完善的生态圈。该生态圈由经过Infor严格认证的专业伙伴组成,能够为中国客户提供完备的技术支持,解决客户的后顾之忧。
Infor大中华区的战略主要包括四个方面:根植本土、行业专注、生态完善和共赢发展。首先,公司致力于扎根本地,深入了解并满足中国市场的需求;其次,公司专注于特定的行业,譬如制造业、汽车行业等,通过深耕这些行业,提供定制化的解决方案,帮助客户提高竞争力;再者,公司重视生态系统的建设和完善,与各类合作伙伴共同为客户提供全方位的服务;最后,公司秉持共赢发展的理念,与客户和合作伙伴共同成长、共享成功。
日益强大的合作伙伴生态系统
冯士永介绍说,Infor大中华区的生态系统,是一个涵盖了各类合作伙伴的庞大网络。这些合作伙伴包括区域系统集成商、云技术合作伙伴、实施交付合作伙伴和联盟合作伙伴等。在这个生态系统中,Infor和合作伙伴们共同为客户提供优质的服务和解决方案,助力客户实现商业成功。
在过去的一年中,Infor大中华区取得了丰硕的成果。首先,公司云业务实现了长足发展,增长率达到了80%;其次,公司在聚焦行业的核心客户实现了稳步增长。以制造业为例,2023年制造业客户增长率高达85%,充分体现了公司在行业领域的专业能力和市场影响力;再者,公司成功帮助本地客户实现出海战略,助力他们在国际市场上拓展业务;最后,公司与客户携手共进,共同发展,实现共赢。总体来说,通过深入理解和满足中国市场的需求,Infor大中华区专注特定行业,建设了完善的生态系统以及秉持共赢发展的理念,并取得了显著成果。
展望未来,冯士永透露,Infor大中华区将继续秉持这些新战略和新政策,不断创新和发展,进一步推动公司在中国的业务发展,为中国市场的客户提供更优质的服务和解决方案。Infor希望能够与中国的企业和客户共同成长,共创美好未来。
在部署网站系统的时候,部分接口出现状态码206,导致功能不能正常使用,经过排查,猜测可能是nginx配置中出现的问题。
目录
一、问题原因
二、解决办法
一、问题原因 当使用Nginx作为代理服务器时,确实存在一个代理缓存区。然而,这个缓存区的默认大小只有几十K,这可能导致某些文件在代理过程中无法完全加载。尤其是在某些版本的Nginx中,默认设置中没有对这种情况进行处理。这不仅限于JS文件,实际上任何类型的文件都可能受到影响。由于框架的JS文件通常较大,因此更容易出现类似的问题。为了解决这个问题,可以考虑对Nginx的缓存区进行优化,或者考虑升级到新版本的Nginx,该版本可能已经对这个问题进行了改进。
二、解决办法 在Nginx.conf文件的http中添加一下代码片段
proxy_buffer_size 128k; proxy_buffers 32 128k; proxy_busy_buffers_size 128k; 注意事项:如果是使用宝塔面板,直接复制这段代码进去可能会导致报错,原因是因为宝塔面板nginx默认存在一些默认配置,为了避免报错,可以考虑将其conf配置进行注释处理。
1.摘要:
目的 基于Transformer架构的网络在图像分类中表现出优异的性能。然而,注意力机制往往只关注图像中的显著性特征,而忽略了其他区域的次级显著信息,基于自注意力机制的Transformer也是如此。为了获取更多的有效信息,从有区别的潜在性特征中学习到更多的可判别特征,提出了一种互补注意多样性特征融合网络(comple⁃mentary attention diversity feature fusion network,CADF),通过关注次显特征和对通道与空间特征协同编码,以增强特征多样性的注意感知。
方法 CADF 由潜在性特征模块(potential feature module,PFM)和多样性特征融合模块
(diversity feature fusion module,DFFM)组成。PFM模块通过聚合空间与通道中感兴趣区域得到显著性特征,再对特征的显著性进行抑制,以强制网络挖掘潜在性特征,从而增强网络对微小判别特征的感知。DFFM模块探索特征间的相关性,对不同尺寸的特征交互建模,以得到更加丰富的互补信息,从而产生更强的细粒度特征。
结果 本文方法可以端到端地进行训练,不需要边界框和多阶段训练。在 CUB-200-2011(Caltech-UCSDBirds-200-2011)、Stanford Dogs、Stanford Cars以及FGVC-Aircraft (fine-grained visual classification of aircraft) 4个基准数据集上验证所提方法,准确率分别达到了 92. 6%、94. 5%、95. 3% 和 93. 5%。实验结果表明,本文方法的性能优于当前主流方法,并在多个数据集中表现出良好的性能。在消融研究中,验证了模型中各个模块的有效性。结论 本文方法具
有显著性能,通过注意互补有效提升了特征的多样性,以此尽可能地获取丰富的判别特征,使分类的结果更加精准。
2.问题
细粒度目的是对属于同一基础类别的图像进行更加细致的子类划分。例如区分野生鸟类、汽车等。
由于类别之间具有细微的类间差异以及较大的类内差异,难以捕获特定区域的细微差异进行分类。
2.1发现
AlexNet (Krizhevsk等,2012)首次利用卷积神经网络(convolutional neural network,CNN)对图像进行分类,在大规模数据集中取得了当时最好的结果,但是网络提取特征的能力相对较弱。随着深度学习发展,促进了目标检测(Ren等,2017)、场景分割(Long等,2015)和行人识别(郑鑫 等,2020)的研究,但在细粒度分类中的应用依旧难以尽如人意,这是由于网络难以提取判别特征而造成的。此外,基于CNN方法的准确性也遇到了瓶颈。
2.2发展
Transformer (Dosovitskiy等,2021)在分类任务中取得了巨大成功,表明具有先天注意机制的Trans⁃former直接应用于图像块序列就可以捕获图像中的重要区域。且在一系列针对下游任务的扩展工作中证实了其具有强大的捕获全局和局部特征的能力,在多个领域取得了很好的效果,但是其计算消耗过于庞大。
与基于CNN的方法相比,基于Transformer的方法可以编码更长的序列并通过计算不同补丁之间的
相关性来提取全局特征。但是,应该注意的是,Transformer模块与所有其他注意机制一样,往往只注意目标中最显著的特征,忽略了其他区域的次级显著特征,而这些忽略的信息中也含有重要的可判别特征。
在基于CNN的细粒度图像分类方法中,类似的注意力机制(Zhao 等,2021),例如 SE(squeezeand excitation)模 块(Hu 等 ,2018)、CAM(channelattention module)(Park 等,2018)和 CBAM(convolu⁃tional block attention module)(Woo等,2018),都具有相同的问题。为了增强注意力机制的特征表示,以获得更多的特征,MAMC(multi-attention multi-classconstraint)(Sun等,2018)提出了OSME (one squeezemulti-excitation)模块来提取目标中多个注意力区域特征,然后利用度量学习引导注意力学习具有语义信息的特征。但是优化这类度量学习有很大的困难,且涉及样本选择问题。FBSM(feature boosting,suppression, and diversification)(Song和Yang,2021)提升特征图中最显著区域以获得特定部分的表示,并对其抑制以学习其他潜在区域。然而,上述注意力机制是基于CNN的,不能直接应用于基于Trans⁃former 的 网 络 中 。 CAFM(complemental attentionmulti-feature fusion network)(Miao 等,2021)提出补充注意模块以提升网络的判别能力,但是只应用于深层网络,忽略了浅层网络中的潜在性特征,且没有考虑多尺度特征的判别能力。
一、定义
web服务器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,ServletContext对象代表了当前的web应用,凌驾于servlet之上,多个servlet共用这一个ServletContext
二、作用
1、实现不同servlet之间的数据共享
一个servlet中保存的数据,可以在另一个servlet中拿到
测试:
(1)在第一个Servlet中以键值对的形式将数据存入ServletContext中
(2)另一个Servlet获取上下文数据
(3)在当前模块的web.xml文件中将两个servlet进行注册
(4)启动服务器,先访问hellowServlet,往对象中传数据,再调用getServlet页面,成功获取到数据,效果如下
2、获取网页初始化的信息
(1)首先学会在web.xml文件中定义初始化信息,用context-param标签
(2)编写一个servlet,获取参数信息,调用如下的方法
(3)注册servlet
(4)网页的执行效果
3、实现请求转发
可以实现访问的路径不变,页面的内容发生改变
(1)编写转发的servlet,请求转发的路径写的是别的servlet
(2)注册
(3)界面效果:
4、读取配置文件
读取配置文件用到的是properties对象
发现:在Java路径下新建一个properties配置文件和在resources下新建一个properties文件,都被打包到同一个路径下:classes
我们俗称这个路径为classpath
测试读取配置文件
(1)在resources下新建一个properties配置文件
(2)Servlet中调用Properties对象
(3)注册
(4)页面效果,成功将配置文件中的信息读取出来了
至此,你已经掌握了ServletContext对象的常见用法,后续还会持续更新,敬请期待!
4 课程分类查询 4.1 需求分析 下边根据内容管理模块的业务流程,下一步要实现新增课程,在新增课程界面,有三处信息需要选择,如下图:
课程等级、课程类型来源于数据字典表,此部分的信息前端已从系统管理服务读取。
课程分类信息没有在数据字典表中存储,而是由单独一张课程分类表,存储在内容管理数据库中。
下边看下course_category课程分类表的结构
这张表是一个树型结构,通过父结点id将各元素组成一个树。
我们可以看下该表的数据,下图是一部分数据:
现在的需求是需要在内容管理服务中编写一个接口读取该课程分类表的数据,组成一个树型结构返回给前端。
课程分类的PO类如下:
如果没有此po类则需要生成的此表的po类拷贝到内容管理模块的model工程中,将mapper拷贝到内容管理模块的service工程中。
4.2 接口定义 我们可以点击新增课程,观察前端的请求记录:
http://localhost:8601/api/content/course-category/tree-nodes 该地址正是前端获取课程分类的接口地址。
通过上图界面的内容可以看出该接口的协议为:HTTP GET
请求参数为空。
通过查阅接口文档,此接口要返回全部课程分类,以树型结构返回,如下所示。
JSON
[
{
"childrenTreeNodes" : [
{
"childrenTreeNodes" : null,
"id" : "1-1-1",
"isLeaf" : null,
"isShow" : null,
"label" : "HTML/CSS",
"name" : "HTML/CSS",
"orderby" : 1,
"parentid" : "1-1"
},
{
"childrenTreeNodes" : null,
"id" : "1-1-2",
"isLeaf" : null,
"isShow" : null,
"label" : "
如何同时提高一个软件系统的可维护性 和 可复用性是面向对象对象要解决的核心问题。
通过学习和应用设计模式,可以更加深入地理解面向对象的设计理念,从而帮助设计师改善自己的系统设计。但是,设计模式并不能够提供具有普遍性的设计指导原则。在经过一段时间的对设计模式的学习和使用之后,就会觉得这些孤立的设计模式的背后应当还有一些更为深层的、更具有普遍性的、共同的思想原则。
比如“开-闭”原则,这样的面向对象设计原则就是这些在设计模式中不断地显现出来的共同思想原则,它们隐藏在设计模式背后的,比设计模式本身更加基本和单纯的设计思想。
目录
一、软件与产品
1.1、可维护性
1.2、可复用性
1.3、可维护性与复用性的关系
二、接口
2.1 什么是接口
2.2 为什么使用接口
2.3 接口常见的用法
三、抽象类
3.1 什么是抽象类
3.2 为什么使用抽象类
3.2 抽象类常见的用法
3.3 哪些设计模式使用抽象类
四、软件设计原则
4.1 单一职责原则(SRP)
4.1.1 如何做到单一职责原则
4.1.2 与其它设计模式的关系
4.1.3 示例
4.2 开闭原则(OCP)
4.2.1 如何做到开闭原则
4.2.2 与其它设计模式的关系
4.2.3 示例
4.3 里氏代替原则(LSP)
4.3.1 如何做到里氏代替原则
4.3.2 与其它设计模式的关系
4.3.3 示例
4.4 依赖倒转原则(DIP)
4.4.1 如何做到依赖倒转原则
4.4.2 与其它设计模式的关系
4.4.3 示例
4.5 接口隔离原则(ISP)
4.5.1 如何做到接口隔离原则
4.5.2 与其它设计模式的关系
4.5.3 示例
4.6 合成/聚合复用原则(CARP)
1.决定下一步做什么 问题:
假如,在你得到你的学习参数以后,如果你要将你的假设函数放到一组
新的房屋样本上进行测试,假如说你发现在预测房价时产生了巨大的误差,现在你的问题是要想改进这个算法,接下来应该怎么办?
解决思路:
一种办法是使用更多的训练样本。具体来讲,也许你能想到通过电话调查或上门调查来获取更多的不同的房屋出售数据。但是实际上特别多的数据是没有太大用处的。
另一个方法,你也许能想到的是尝试选用更少的特征集。因此如果你有一系列特征,比如𝑥1, 𝑥2, 𝑥3等等。也许有很多特征,也许你可以花一点时间从这些特征中仔细挑选一小部分来防止过拟合。或者也许你需要用更多的特征,也许目前的特征集,对你来讲并不是很有帮助。
获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
1.尝试减少特征的数量
2.尝试获得更多的特征
3.尝试增加多项式特征
4.尝试减少正则化程度𝜆
5.尝试增加正则化程度𝜆
2.评估一个假设 用算法来评估假设函数,并以此为基础考虑如何避免过拟合和欠拟合问题。
选择参量来使训练误差最小化并不一定是好事,因为可能会出现过拟合的情况。
如何判定一个假设函数过拟合?
可以对假设函数ℎ(𝑥)进行画图,然后观察图形趋势,但对于特征变量不止一个的这种一般情况,还有像有很多特征变量的问题,想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现。为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数𝐽
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
3.模型选择和交叉验证集 假设我们要在 10 个不同次数的二项式模型之间进行选择:
显然越高次数的多项式模型越能够适应训练集,但是适应训练集并不一定能推广到一般情况,只需要选择更能适应一般情况的模型,需要使用交叉验证集来帮助选择模型。
即:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试。
模型选择的方法为:
使用训练集训练出 10 个模型用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)选取代价函数值最小的模型用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值) 代价函数:
模型选择是指在多个候选模型中选择一个最佳模型的过程。在机器学习中,不同的模型有不同的适用场景和性能表现,因此需要根据具体情况选择最适合的模型。常用的模型选择方法包括交叉验证、网格搜索等。
交叉验证集是用于评估模型泛化能力的数据集,它通常被分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的泛化能力。通过将数据集分成多个子集,并在不同的子集上重复进行训练和测试,可以更准确地评估模型的性能,并选择最佳的模型参数。
在模型选择过程中,可以使用交叉验证集来评估不同模型的性能表现,并选择最佳的模型。常用的交叉验证方法包括k折交叉验证、留一法等。这些方法可以帮助我们评估模型的泛化误差,并选择最佳的模型参数,从而提高模型的性能表现。
4.诊断偏差和方差 问题:如果算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟
合问题。那么这两种情况,哪个和偏差有关,哪个和方差有关,或者是不是和两个都有关?
通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:
对于训练集,当 𝑑 较小时,模型拟合程度更低,误差较大;随着 𝑑 的增长,拟合程度提高,误差减小。
对于交叉验证集,当 𝑑 较小时,模型拟合程度低,误差较大;但是随着 𝑑 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
根据图表可知:
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
5.正则化和偏差/方差 正则化可以通过调整模型参数或增加惩罚项来减小模型的复杂度,从而减小模型的偏差和方差。例如,L1正则化和L2正则化可以通过约束模型参数的绝对值或范数来减小模型的复杂度,dropout可以在训练过程中随机丢弃一部分神经元,从而使得模型不会过于依赖某一些神经元。
在训练模型的过程中,会使用正则化来防止过拟合,但是可能正则化过高或者过低,所以要选择合适的 λ。
我们选择一系列的想要测试的 𝜆 值,通常是 0-10 之间的呈现 2 倍关系的值(如:0,0.
有两个代码如下:
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>HTML粒子文字动画特效</title> </head> <body style="background-color:#000"> <div style="text-align:center;clear:both"> <script src="/gg_bd_ad_720x90.js" type="text/javascript"></script> <script src="/follow.js" type="text/javascript"></script> </div> <iframe frameborder="0" scrolling="no" src="index2.html" width="100%" height="500px"></iframe> </body> </html> index2.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>HTML粒子文字动画特效</title> </head> <body> <script type="text/javascript"> BLUR = false; PULSATION = true; PULSATION_PERIOD = 600; PARTICLE_RADIUS = 4; /* disable blur before using blink */ BLINK = false; GLOBAL_PULSATION = false; QUALITY = 2; /* 0 - 5 */ /* set false if you prefer rectangles */ ARC = true; /* trembling + blur = fun */ TREMBLING = 0; /* 0 - infinity */ FANCY_FONT = "
目录
一、链队列
1、链栈的定义:
2、链栈的优缺点:
二、链队列的基本操作算法(C语言) 1、宏定义
2、创建结构体
3、链栈的初始化 4、链队列的入队 5、链队列的出队
6、取链队列的对头元素
7、链队列的销毁
8、链队列的清空
9、判断链队列是否为空
10、求队列长度
11、遍历队列元素
三、链队列的基本操作完整代码(C语言)
四、运行结果
一、链队列 1、链栈的定义: 链队列是一种线性数据结构,采用链表来实现队列的操作。链队列具有队头指针和队尾指针,用于指示队列元素所在的位置。链队列只允许在队尾插入元素,在队头删除元素,符合先进先出(First In First Out,FIFO)的原则。
2、链栈的优缺点: 链队列的优点:
动态分配空间:链队列使用链表实现,可动态分配和释放空间。因此,不需要预先分配大量存储空间,可以根据实际需求进行空间分配。无需移动元素:相比普通队列,链队列在删除元素时无需移动大量元素,只需修改指针即可。这使得链队列在处理大规模数据时具有更高的效率。适合处理用户排队等待的情况:链队列适用于处理用户排队等待的情况,例如银行排队、网络请求等。通过链队列,可以快速地插入新用户和删除已处理的用户。 链队列的缺点:
需要额外的存储空间:为了实现链表结构,链队列需要额外的存储空间来维护指针和节点。这会增加存储空间的消耗。插入和删除操作可能引起内存分配和释放:在链队列中插入和删除元素时,可能需要动态分配和释放内存。这会增加操作的时间复杂度,并可能引起内存碎片化问题。无法充分利用连续空间的优势:链表结构使得链队列无法像数组一样充分利用连续空间的优势,这会影响空间利用率和访问速度。 二、链队列的基本操作算法(C语言) 1、宏定义 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 100 typedef int QElemtype; typedef int Status; 2、创建结构体 //创建结构体 typedef struct QNode { QElemtype data; struct QNode *next; } QNode, *QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; } LinkQueue; 3、链栈的初始化 //链队列的初始化 Status InitQueue(LinkQueue &Q) { Q.
当部署新的服务器环境时,需要对服务器的句柄数进行一次优化,
否则当用户量稍微增大可能会导致系统问题。
系统句柄数量 查看系统最大文件句柄数,执行命令:cat /proc/sys/fs/file-max,如果最大句柄数不能满足要求,执行vim /etc/sysctl.conf命令插入如下配置:
fs.file-max=1000000 配置完成后,执行sysctl -p命令,使配置立即生效。
二、进程句柄数量 设置完成系统最大句柄数之后,对单进程打开的最大句柄数进行设置,
通过ulimit -a命令查看open files行设置的值是否满足要求:
当并发接入的TCP连接数超过上限时,就会提示“too many open files”,所有新的客户端接入将失败,通过vim /etc/security/limit.conf命令添加如下配置参数:
* soft nofile 1000000 * hard nofile 1000000 修改后保存,注销当前用户重新登陆,通过ulimit -a命令查看修改是否生效。
三、swappiness限制 通过配置swappiness,避免由于使用swap导致系统卡顿
使用如下命令查看swappiness,如果数值大于10则,需要重新配置阈值 cat /proc/sys/vm/swappiness 当swappiness配置大于10,则首先使用以下命令临时修改阈值是10 echo 10 > /proc/sys/vm/swappiness 使用如下命令,配置为重启情况下永久生效(如果已经操作了第二步,不需要再手动重启服务器),如下图: # 编辑sysctl.conf vi /etc/sysctl.conf # 在sysctl.conf文件的最下方增加 vm.swappiness=10,保存并退出即可
流处理基础概念(一):Dataflow 编程基础、并行流处理流处理基础概念(二):时间语义(处理时间、事件时间、水位线)流处理基础概念(三):状态和一致性模型(任务故障、结果保障) 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
流处理基础概念(三):状态和一致性模型 1.任务故障1.1 什么是任务故障 2.结果保障2.1 AT-MOST-ONCE 至多一次2.2 AT-LEAST-ONCE 至少一次2.3 EXACTLY-ONCE 精确一次2.4 END-TO-END EXACTLY-ONCE 端到端的精确一次 状态在数据处理中无处不在,任何一个稍复杂的计算都要用它。为了生成结果,函数会在一段时间或基于一定个数的事件来累积状态(例如计算聚合或检测某个模式)。有状态算子同时使用 传入的事件 和 内部状态 来计算输出。以某个滚动聚合算子为例,假设它会输出至今为止所见到的全部事件之和。该算子以内部状态形式存储当前的累加值,并会在每次收到新事件时对其进行更新。类似地,假设还有一个算子会在每次检测到 “高温” 事件,且在随后 10 分钟内出现 “烟雾” 事件时报警。这个算子需要将 “高温” 事件存为内部状态,直到接下来发现 “烟雾” 事件或超过 10 分钟的时间限制。
在使用批处理系统分析无限数据集的情况下,状态的重要性会越发凸显。在现代流处理引擎兴起之前,处理无限数据的通用办法是将到来事件分成小批次,然后不停地在批处理系统上调度并运行作业。每当一个作业结束,其结果都会写入持久化存储中,同时所有算子的状态将不复存在。一旦某个作业被调度到下个批次上执行,它将无法访问之前的状态。该问题通常的解决方案是将状态管理交由某个外部系统(如数据库)完成。反之,在持续运行的流式作业中,每次处理事件所用到的状态都是持久化的,我们完全可以将其作为编程模型中的最高级别,按理说,我们也可以使用外部系统来管理流处理过程的状态,只是这样可能会引入额外延迟。
由于流式算子处理的都是潜在无穷无尽的数据,所以必须小心避免内部状态无限增长。为了限制状态大小,算子通常都会只保留到目前为止所见事件的摘要或概览。这种摘要可能是一个数量值,一个累加值,一个对至今为止全部事件的抽样,一个窗口缓冲或是一个保留了应用运行过程中某些有价值信息的自定义数据结构。
不难想象,支持有状态算子将面临很多实现上的挑战:
状态管理。系统需要高效地管理状态并保证它们不受并发更新的影响。状态划分。由于结果需要同时依赖状态和到来的事件,所以状态并行化会变得异常复杂。幸运的是,在很多情况下可以把状态按照键值划分,并独立管理每一部分。举例而言,如果你要处理从一组传感器得到的测量值数据流,则可以用分区算子状态(partitioned operator state)来单独维护每个传感器的状态。状态恢复。最后一个也是最大的挑战在于,有状态算子需要保证状态可以恢复,并且即使出现故障也要确保结果准确。 1.任务故障 在流式作业中,算子的状态十分重要,因此需要在故障时予以保护。如果状态在故障期间丢失,那恢复后的结果就会不正确。流式作业通常会运行较长时间,因此状态可能是经过数天甚至数月才收集得到。通过重新处理所有输入来重建故障期间丢失的状态,不仅代价高,而且很耗时。
在前面的博客中,我们讲述了如何将流处理程序建模成 Dataflow 图。在实际执行前,它们需要被翻译成物理 Dataflow 图,其中会包含很多相连的并行任务。每个任务都要运行一部分算子逻辑,消费输入流并为其他任务生成输出流。典型的现实系统设置都可以轻松做到在很多物理机器上并行运行数以百计的任务,对于长期运行的流式作业而言,每个任务都随时有可能出现故障。如何确保能够透明地处理这些故障,让流式作业得以继续运行?事实上,你不仅需要流处理引擎在出现故障时可以继续运行,还需要它能保证结果和算子状态的正确性。
1.1 什么是任务故障 对于输入流中的每个事件,任务都需要执行以下步骤。
接收事件并将它们存在本地缓冲区。选择性地更新内部状态。产生输出记录。 上述任何一个步骤都可能发生故障,而系统必须在故障情况下明确定义其行为。如果故障发生在第一步,事件是否会丢失?如果在更新内部状态后发生故障,系统恢复后是否会重复更新?在上述情况下,结果是否确定?
我们假设网络连接是可靠的,不存在记录丢失或重复,且所有事件最终都会以先进先出的顺序到达各自终点。由于 Flink 使用的是 TCP 连接,上述需求都能满足。我们还假设任何故障都会被检测到,没有任务故意捣乱。换言之,所有正常运行的任务都会遵循上面提到的步骤。
流处理基础概念(一):Dataflow 编程基础、并行流处理流处理基础概念(二):时间语义(处理时间、事件时间、水位线)流处理基础概念(三):状态和一致性模型(任务故障、结果保障) 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
流处理基础概念(二):时间语义 1.流处理场景下一分钟的含义2.处理时间3.事件时间4.水位线5.处理时间与事件时间 本篇博客,我们将介绍流式场景中时间语义和不同的时间概念。我们将讨论流处理引擎如何基于乱序事件产生精确结果,以及如何使用数据流进行历史事件处理并实现 时间旅行。
1.流处理场景下一分钟的含义 当处理一个持续到达且可能无穷的事件流时,时间便成了应用中最为核心的要素。假如你想持续计算结果,比如每分钟计算一次,那么一分钟在流式应用环境中的含义到底是什么?
假设有某个应用程序会分析用户玩在线手游时产生的事件。该应用将用户组织成不同团队,并会收集每个团队的活动信息,这样就能基于团队成员完成游戏目标的速度,提供诸如额外生命或等级提升的游戏奖励(例如,如果团队所有成员在一分钟内消除了 500 个泡泡,他们就会提升一级)。皮皮是个铁杆玩家,每天早晨上班路上都会玩这个游戏。但是有个问题:皮皮住在上海,每天乘地铁上班。而众所周知,上海地铁上手机上网信号很差。因此考虑如下情况:皮皮开始消泡泡的时候手机还能联网向分析应用发送事件,突然地铁开进隧道,手机断网了。皮皮继续玩他的,此时游戏产生的事件会缓存在手机里。在地铁离开隧道,皮皮重新上线后,之前缓存的事件才会发送给应用。此时应用该怎么办呢?在上述示例中,一分钟的含义又是什么?需要把皮皮离线的时间考虑在内吗?
当地铁进入隧道断网时,应用接收游戏事件会中断一会儿,此时事件会缓存在玩家手机中,并在网络恢复后发出。
在线游戏这个简单场景展示了算子语义应该依赖事件实际发生时间,而非应用收到事件的时间。在这个手游例子中,后果可能非常糟糕,以至于皮皮和他团队的其他玩家失望透底,再也不想碰这个游戏。但其实还有更多时间敏感应用,需要我们对其处理语义进行保障。如果我们仅考虑现实时间一分钟内收到多少数据,那结果可能会随网络连接速度或处理速度而改变,而事实上每分钟收到的事件数目是由数据本身的时间来定义的。
在上面的例子中,流式应用可以使用两个不同概念的时间,即 处理时间(processing time)和 事件时间(event time)。
2.处理时间 处理时间是当前流处理算子所在机器上的本地时钟时间。基于处理时间的窗口会包含那些恰好在一段时间内到达窗口算子的事件,这里的时间段是按照机器时间测量的。如下图所示,在上述皮皮的例子中,处理时间窗口在他手机离线后会继续计时,因此不会把他离线那段时间的活动考虑在内。
3.事件时间 事件时间是数据流中事件实际发生的时间,它以附加在数据流中事件的时间戳为依据。这些时间戳通常在事件数据进入流处理管道之前就存在(例如事件的生成时间)。如下图所示,即便事件有延迟,事件时间窗口也能准确的将事件分配到窗口中,从而反映出真实发生的情况。
事件时间将处理速度和结果内容彻底解耦。基于事件时间的操作是可预测的,其结果具有确定性。无论数据流的处理速度如何、事件到达算子的顺序怎样,基于事件时间的窗口都会生成同样的结果。
使用事件时间要克服的挑战之一是如何处理延迟事件。普遍存在的无序问题也可以借此解决。
依靠事件时间,我们可以保证在数据乱序的情况下结果依然正确,而且结合可重放的数据流,时间戳所带来的确定性允许你对历史数据 “快进”。这意味着你可以通过重放数据流来分析历史数据,就如同它们是实时产生的一样。
此外,你可以把计算 “快进” 到现在,这样一旦你的程序赶上了当前事件产生的进度,它能够以完全相同的程序逻辑作为实时应用继续运行。
4.水位线 在到目前为止有关事件时间窗口的讨论中,我们一直忽略了一个非常重要的方面。怎样决定事件时间窗口的触发机制?换言之,我们需要等多久才能确定已经收到了所有发生在某个特定时间点之前的事件?此外,我们如何得知数据会产生延迟?鉴于分布式系统现实的不确定性以及外部组件可能引发任意延迟,这两个问题都没有完美的答案。我们将了解如何利用水位线(Watermarks)来设定事件时间窗口的行为。
水位线是一个全局进度指标,表示我们确信不会再有延迟事件到来的某个时间点。本质上,水位线提供了一个逻辑时钟,用来通知系统当前的事件时间。当一个算子接收到时间为 T 的水位线,就可以认为不会再收到任何时间戳小于或等于 T 的事件了。水位线无论对于事件时间窗口还是处理乱序事件的算子都很关键。算子一旦收到某个水位线,就相当于接收到信号:某个特定时间区间的时间戳已经到齐,可以触发窗口计算或对接收的数据进行排序了。
水位线允许我们在结果的 准确性 和 延迟 之间做出取舍。激进的水位线策略保证了低延迟,但随之而来的是低可信度。该情况下,延迟事件可能会在水位线之后到来,我们必须额外加一些代码来处理它们。反之,如果水位线过于保守,虽然可信度得以保证,但可能会无谓地增加处理延迟。
在很多现实应用中,系统无法获取足够多的信息来完美地确定水位线。以手游场景为例,现实中根本无法得知用户会离线多久。他们可能正在过隧道,可能正在上飞机,也可能直接退坑不玩了。无论水位线是由用户定义还是自动生成,只要存在 “拖后腿” 的任务,追踪分布式系统中的全局进度就可能出现问题。因此简单地依赖水位线并不总是可以高枕无忧。而流处理系统很关键的一点是能够提供某些机制来处理那些可能晚于水位线的迟到事件。根据应用需求的不同,你可能想直接忽略这些事件,将他们写入日志或利用他们去修正之前的结果。
5.处理时间与事件时间 此刻你可能心存疑惑:既然事件时间能够解决所有问题,为何还要去关心处理时间?事实上,处理时间的确有其特定的适用场景。处理时间窗口能够将延迟降至最低,由于无需考虑迟到或乱序的事件,窗口只需简单地缓冲事件,然后在达到特定时间后立即触发窗口计算即可。因此对于那些更重视处理速度而非准确度的应用,处理时间就会派上用场。另一种情况是,你需要周期性地实时报告结果,而无论其准确性如何。一个常见示例应用是实时监控仪表盘,它会接收并展示事件聚合结果。最后,处理时间窗口能够表示数据流自身的真实情况,这可能会在某些用例中派上用场。例如,你可能想观察数据流的接入情况,通过计算每秒事件数来检测数据中断。
总而言之,虽然处理时间提供了很低的延迟,但它的结果依赖处理速度具有不确定性,事件时间则与之相反,能保证结果的准确性,并允许你处理延迟甚至无序的事件。