题目:树的度为3,且有9个度为3的节点,20个叶子节点,但没有度为1的节点。则该树中度为2的节点数为:1
解析:树的度为3,表示树中只存在度为0、1、2、3的结点。设总结点树是n,则度为2的结点为n-9-20-0=n-29。根据树中的节点数=树中所有结点的度之和+1,得9*3+(n-29)x2+0x1+20x0+1=n,则n=30,度为2的节点数为30-29=1
智能优化算法:头脑风暴优化算法 文章目录 智能优化算法:头脑风暴优化算法1.算法原理1.1 聚类1.2 变异 2.算法流程3.算法结果4.参考文献5.MATLAB代码 摘要:头脑风暴优化算法(Brain Storming Optimization algorithm, BSO)是Shi在2011年第2次群体智能国际会议上提出的一 种基于模拟人类创造性解决问题的过程的群体行为智能算法。,因其具有模型简单、收敛速度快、参数少等优点 ,已在工程优化 、模型识别等问题中得到较好的应用,很快得到了国内外学者的广泛关注,成为智能优化算法领域新的研究热点。 1.算法原理 头脑风暴优化算法主要由聚类和变异组成。
1.1 聚类 聚类:BSO采用K-means聚类算法,将相似的个体聚成k类,并将人为设定的适应度函数值最优的个体作为聚类的中心。当然,为了避免陷入局部最优,将有概率随机产生一个新个体替换其中
一个聚类中心。
1.2 变异 BSO变异主要有4种方式,分别是:(a)在随机一个类中心,即该类最优个体上添加随机扰动产生新的个体;(b)在随机一个类中随机选择一个个体添加随机扰动产生新的个体;©随机融合两个类中心,并添加随机扰动产生新的个体;(d)随机融合两个类中随机的两个个体,并添加随机扰动产生新的个体。
上述4种方式每个聚类中心,即类中最优个体
被选中的概率为:
p j = ∣ M j ∣ N (1) p_j = \frac{|M_j|}{N} \tag{1} pj=N∣Mj∣(1)
其中, ∣ M j ∣ |M_j| ∣Mj∣代表 类中个体的数量。新个体产生公式为:
x n d = x s d + ξ ∗ N ( 0 , 1 ) d (2) x_{nd}=x_{sd}+\xi *N(0,1)_d\tag{2} xnd=xsd+ξ∗N(0,1)d(2)
ξ = l g s i g ( ( 0.
点击上方“Java基基”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
原创 | Java 2020 超神之路,很肝~
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
作业调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
来源:鲜枣课堂(ID:xzclasscom)
图片来自网络
蓝色系
黄色系
绿色系
青色系
紫色系
橙色系
混色系
黑暗系。。。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
部署wordpress
As a PHP application, WordPress is often deployed using an older method: uploading files via FTP. This can be stressful and time consuming, especially when a heavy duty WordPress project has to be deployed.
作为PHP应用程序,WordPress通常使用较旧的方法进行部署:通过FTP上传文件。 这可能是压力大且耗时的,尤其是当必须部署重型WordPress项目时。 There are quite a few tools like: Jenkins, Beanstalk, and Deploy; which promise a pain-free WordPress deployment via an automated approach. However, in this article, I’ll be introducing you to a powerful Ruby package — Wordmove, which offers a very fast and easy automated WordPress website deployment.
问题描述 Run按钮灰色状态,无法点击运行,如图:
原因分析 上图估计大佬一看就看出问题了,其实就是因为少了一个main函数
问题解决 我现在把main函数补上去
public static void main(String[] args){ int a; for (a=0;a<=100;a++){ System.out.println(a); } } 把main函数补上去后,右上角的运行就会亮了起来,这时候就可以运行了
别收藏了,点个赞就好~
Python语法基础-最大公约数、最小公倍数 概述思路代码解析1、最大公约数和最小公倍数函数2、主函数 完整代码、效果展示 概述 大家好,又到了愉快的周末=o=不如看个精品文章后满足地睡去zZZZ。今天给大家准备了一个计算两个正整数最大公约数和最小公倍数的代码。
下面就开始学习叭~
思路 1、首先是编写计算最大公约数和最小公倍数函数,采用辗转相除法。a).将输入的两个正整数,分别赋值给num_1和num_2,num_1和num_2里较大者除以较小者取余,若余数为0则此时的较小者为最大公约数,输入的两个正整数的乘积除以最大公约数的结果即为最小公倍数,分别作为函数的返回值;b).若余数不为0,则将num1和num_2里较小者赋值给num_1,余数赋值给num_2,再次进行a)中操作。
2、编写主函数。提示用户输入2个正整数,这里需要两点:一是为防用户输入了非整数字符,用try…except结构做一下防呆处理,二是需对输入的两个正整数加以判断(不能相同),然后调用最大公约数和最小公倍数函数即可。
代码解析 1、最大公约数和最小公倍数函数 def public(num1,num2): num_1 = num1 num_2 = num2 while True: num_extra = max(num_1,num_2) % min(num_1,num_2) if num_extra == 0: return min(num_1,num_2),num1*num2//min(num_1,num_2) # 这里需注意最大公倍数是由两个“原始数”的乘积除以最大公约数 else: num_1 = min(num_1,num_2) num_2 = num_extra 2、主函数 def main(): while True: try: num1 = int(input('请输入第一个正整数:')) num2 = int(input('请输入第二个正整数:')) if num1 == num2: print('输入的两个正整数不能相同,请重新输入。') continue else: public_b = public(num1,num2)[0] public_s = public(num1,num2)[1] print('*'*30) print('{}和{}的最大公约数为{}。'.format(num1,num2,public_b)) print('{}和{}的最小公倍数为{}。'.format(num1,num2,public_s)) print('*'*30) con = input('是否继续计算(输入Y或y继续,其他则退出程序):') if con.
react-native-crypto安装成功后在程序运行过程中,会出现如下错误的可能性会非常大(我也曾有好长一段时间没有出现过这样的错误)
处理方法:
1. 默认在shim.js中,crypto被注释了,将最后一行的注释去掉
2.在package.json中添加, "postinstall": "rn-nodeify --install buffer,crypto,stream,util,process,vm --hack"
3.删除node_modules
4.yarn 5.yarn android/ios ,到此刻问题全部解决
*这个问题耗费了我3天时间
问题:for下使用el-input,发现最后一个输入不了。
解决办法:使用原生input替代,并在原生input上套上el-input的class。
希望帮到其他小伙伴~
1.安装 https://www.cnblogs.com/thomaschen750215/p/9699236.html
注意在httpd.conf中配置完php之后,要重启下apapche
2.调试
注意要写一下具体的starturl文件,
3.配置数据库驱动
直接用phpinfo()函数查看。看pod列表目前支持哪些数据库,如果要添加新的驱动,只要修改php.ini中的配置,如添加:
extension=pdo_mysql
重启apache,则可以看到
vscode + xdebug 调试,按照下面的文档配置(很可能不成功)
https://blog.csdn.net/u013583311/article/details/100599919?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242
我使用的是phpstduy + vscode + phpdebug, 配置的时候没成功,重新把默认的apache卸载后再启动,就好了
调试的时候 chrome是不用装插件的,apache要启动,配置如下
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9000 } ] } php.ini配置如下:
[Xdebug]
zend_extension=D:/soft/phpstudy_pro/Extensions/php/php7.3.4nts/ext/php_xdebug.dll
xdebug.collect_params=1
xdebug.collect_return=1
xdebug.auto_trace=On
文章主要参考:
https://blog.csdn.net/lingyunxianhe/article/details/79063547
算法介绍SIFT算法步骤图像金字塔空间极值点检测关键点方向分配特征点描述符API即openCV应用 1.算法介绍 SIFT--尺度不变特征转换算法(Scale-invariant feature transform),通常用来侦测与描述影像中的局部性特征,在空间尺度中寻找极值点,并提取出其位置,尺度,旋转不变量。 SIFT的应用范围包括物体识别,机器人感知与导航,3D模型建立,影像追踪等。 局部影像特征的描述与侦测可以帮助识别物体,**SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关** **SIFT算法的实质是在不同的尺度空间上查找关键点**,并计算出关键点的方向。SIFT所查找到的关键点十分突出,不会因光照,噪音而变化 2.SIFT算法步骤 3.图像金字塔 3.1、高斯金字塔 高斯金字塔是采用高斯函数对图像进行模糊以及降采样处理得到的。
高斯模糊系数计算公式:
高斯函数与图像卷积
分离高斯卷积
3.2的图像卷积方法,速度比较慢,同时图像边缘信息也会损失严重。可以使用分离的高斯卷积(即先用1XN的模板沿着X方向对图像卷积一次,然后用NX1的模板沿着Y方向对图像再卷积一次,其中N=[(6σ+1)]且向上取最邻近奇数),这样即省时,也见笑了直接卷积对图像边缘信息的算是
高斯金字塔源码
for (o = 0; o < octvs; o++)//金字塔组数为octvs, for (i = 0; i < intvls + 3; i++)//每一组有intvls + 3 层,intvls一般为3 { if (o == 0 && i == 0)//如果是第一组第1层 gauss_pyr[o][i] = cvCloneImage(base);//base 为原始灰度图像经过升采样或降采样得到的图像 /* base of new octvave is halved image from end of previous octave */ else if (i == 0)//建立非第一组的第1层 gauss_pyr[o][i] = downsample(gauss_pyr[o - 1][intvls]);//降采样图像 /* blur the current octave's last image to create the next one */ else//建立非第一组的非第1层 { gauss_pyr[o][i] = cvCreateImage(cvGetSize(gauss_pyr[o][i - 1]),IPL_DEPTH_32F, 1); cvSmooth(gauss_pyr[o][i - 1], gauss_pyr[o][i],CV_GAUSSIAN, 0, 0, sig[i], sig[i]);// sig[i]为模糊系数 }//cvSmooth 为平滑处理函数,也即模糊处理。CV_GAUSSIAN 为选用高斯函数对图像模糊 return gauss_pyr;//返回建好的金字塔 3.
部分结果展示 2020年“深圳杯”数学建模挑战赛D题-公交车在高峰和平峰转换期间的调度 题解思路 原题地址
一、背景 公交车是为市民出行提供服务的“准公共”产品。它服务的对象是公众而非特定的个人,也就是说,不考虑任何一个人在任何时候都能得到公交服务这样的要求。另一方面,公共交通不以盈利为目标但也不是免费的。
因此,公交要在给定的财政拨款约束下,兼顾“尽可能减少私家车使用以缓解城市交通拥堵”和“尽量让公众满意”两大目标。 目标还应该有阈值
公交车的站点布局、线路规划、车型配备、票价制定、发车频率和车辆调度等都要按照它的基本属性和目标来进行设计和调整的。 这是相当复杂的系统问题,反映一个现代城市的管理水平。因为这个问题的重要、复杂和困难,从传统的“交通工程”到今天的“智慧城市”,长期以来它吸引了大量的理论和应用研究,积累了丰富的研究成果和系列的设计标准与规范。
多目标优化问题
二、任务 1、给出一条公交线路==“高峰”和“平峰”的定义==,并说明其合理性。
通过“阈值”确定——即不改变调度方案的时超过阈值部分的为平峰
得收集有关数据。
通过其他各种数据得出收益和支出
根据阈值计算出它的高峰和平峰
2、对高峰和平峰任意给定的一组数据,给出==“转换期”的调度方案==,并说明在什么指标下,该方案是可行的、最优的。进一步,讨论调度方案对参数的稳健性和敏感性。
根据第一问数据,处理数据
(因为公交客流数据是无法直接得出,得从其他数据推出)
各种基本属性作为优化变量->多目标优化
(一些参数暂时为假设/固定(包括高峰和平峰),方便第4问求解。)
鲁棒性分析
敏感度分析
3、给出“高峰”和“平峰”的预测方法。
收集一天的特性与人流分布关系的数据
BP神经网络
4、试通过实际运行数据验证你的结果。
根据第三问的模型预测高峰和平峰的时间(人流密度分布)
人流密度分布带入第二问的模型,得出调度方案
用实际的该天人流分布对方案进行仿真
如果未突破阈值等目标,得证
三、注记 公交车是为市民出行服务的。市民出行并不是“均匀”的,有乘客多的时段(称为“高峰期”)和乘客不太多的时段(称为“平峰”期),起讫点也不尽相同。容易理解,高峰期公交车发车频率高,投入的运营车辆也多,以满足乘客的需要;而平峰期则要相应地减下来,以节约成本开支。我们想来关注一下这方面的“调度问题”。为此,先作一些深入一点的分析。
首先,“高峰期”和“平峰期”的划分并不是绝对的,完全可以由“决策者”的价值标准来定,但如何划分将直接关系到后面的工作。其次,我们注意到,公交车一旦从起点站出发,就必须驶完一个单程而不能在中途停运。因此从高峰期到平峰期把运营的公交车数量“减下来”是需要一个过程的,很难“立竿见影”。同时,这个过程显然与驶完一个单程所需的时间,或等价地,与线路的长短有关,因此要思考“分步减下来”还是“一步到位”。特别,当乘客数“急剧变化”,从高峰到平峰又到高峰的转换来得非常快,以至于“减下来”还来不及见效就要马上“恢复”,就可能“得不偿失”,因此需要周密的“精细”计算。这里又涉及到另外一个问题:乘客数量的预测。至此,我们已经能够想象,这么一个“看似普通”的问题,其实并不简单。为了不把问题弄得太复杂,就像我们无法考虑每一个乘客的行为和愿望一样,我们也只考虑确定的某一条公交线路。尽管公交线路是一个网,两条公交线路可能有部分重合,但我们也不考虑考虑它们之间的“替代”和“竞争”。现在,我们明确要讨论的问题、范围和假设:
所考虑的公交线路是确定的,这意味着它的长度、站点、单程耗时及运营成本都已经定了,一票制的票价也是定的且不考虑乘客的差异和优惠。都不需要去另做假设。我们要讨论的是从“正常时段”(也就是所说的乘车高峰)到乘客数量变少的“平峰时段”再回复到“正常时段”的调度问题。为明确起见,“正常时段”指的是运营总收入与运营总成本之差不小于某一个给定的“阈值”的时段。 第一题
调度的目标是使得在乘客数下降和恢复的过程中,通过相应地减少和恢复投入运营的车辆数量来保证这个“阈值”(也就是“下界”)不被突破,当然(“盈利”的)“上界”是不受限的。 第二题
数据收集:
https://github.com/qiupin499/bus-passenger-volum
原数据是刷卡时间与GPS地址
实际上车站点得通过聚类分析得到,下车人数由OD矩阵运算得到
阿里云,公交线路客流预测[广东赛场一]
https://tianchi.aliyun.com/competition/entrance/231514/information,2015-11-30
刷卡时间和天气数据
2020年“深圳杯”数学建模挑战赛D题-公交车在高峰和平峰转换期间的调度-交通文档类资源-CSDN下载
变量与常量 public class HelloWorld { public static void main(String[] args) { int m = 5; int n = 7; int x = (m*8/(n+2))%m; System.out.println("m:" + m); System.out.println("n:" + n); System.out.println("x:" + x); } } public class HelloWorld{ public static void main(String[] args) { System.out.println("hello imooc"); } } public class HelloWorld{ public static void main(String[] args) { String hobby="慕课网"; System.out.println(hobby); } } public class HelloWorld{ public static void main(String[] args) { String a1="
快速、便捷的创建在vue cli中使用quill。
参考资料: quill中文文档
在线示例: 点我预览
github仓库地址:https://github.com/font-size/vue-quill-simple-demo
1: 找一个文件夹 输入vue create quill-editor(前提是电脑上已经安装了cli)
按回车,出现提示。问你项目配置,没有特殊需求直接继续按回车,默认配置走起。
静等几分钟,提示完成了 接下来自然是打开vscode 2:简单的quill实例 ctrl+shift+~ 打开终端,安装quill。输入npm i quill@1.3.6 --save 在tempalte里删掉原来的代码,写入 <div class="quill-editor"> <div id="toolbar" slot="toolbar"> <div class="editor" ref="editor"></div> </div> 接着引入quill依赖 // 引入原始组件 import * as Quill from 'quill' // 引入核心样式和主题样式 import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' 大致是这样
接着在data里定义个option,作为quill的配置项 quill: null, options: { theme: 'snow', modules: { // 工具栏的具体配置 toolbar: [ ['bold', 'italic', 'underline', 'strike'], // toggled buttons ['blockquote', 'code-block'], [{ 'header': 1 }, { 'header': 2 }], // custom button values [{ 'list': 'ordered'}, { 'list': 'bullet' }], [{ 'script': 'sub'}, { 'script': 'super' }], // superscript/subscript [{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent [{ 'direction': 'rtl' }], // text direction [{ 'size': ['small', false, 'large', 'huge'] }], // custom dropdown [{ 'header': [1, 2, 3, 4, 5, 6, false] }], [{ 'color': [] }, { 'background': [] }], // dropdown with defaults from theme [{ 'font': [] }], [{ 'align': [] }], ['clean'] // remove formatting button ], }, placeholder: '请输入内容.
原本以为智能车大赛和我没什么缘分,也看到过学长在理五一楼调车子,感觉这个小车还是蛮炫酷的。短学期开始突然任老问了一句:有没有会python的同学?对智能车有没有兴趣?我刚开始还没放在心上,寻思着我这么菜这种事情怎么可能轮得到我?后来任老又问了问,给了个开会的地址,那我就要趁机溜出去看看了呀,结果这以后便是一发不可收拾……
起初是在外面铺了赛道调车子,不仅热,蚊子也来凑热闹。隔壁组的电蚊拍几乎整天被我们“征用”,后来从117“偷”来了一个风扇,情况才好一点。但还是热啊……沈哥每次下来都是热热热热热的状态,我们的大脑都要热死机了。第一次没啥经验,什么都搞不好,勉强完赛,成绩自然不好看。
转机是在学校承办完比赛之后,大概15号那个时候,突然告诉我们还有一个进国赛的名额,因为承办学校自带一个名额,可是我们那时候都不太想去了,算是打击过大心灰意冷?陈慧老师让我们去试试,那就试试吧。
后来大家聚在一起讨论了一下,觉得是模型过拟合了,用官方的模型训练了一下,效果非常好……沈哥当场“气到吐血”,感觉受到了深深的伤害……接下来的事情就很顺利了,得益于107给力的空调和足够大的地方,我们铺好赛道,开始了科目二的准备工作。有了空调,工作效率翻倍不是梦!还是辛苦了沈哥,一天把如影随形的代码肝了出来,后面就是对小车的调试。
终于到了比赛的日子,我们打包好小车去了南京。
u1s1南信工大好偏啊……想找好吃的都找不到(。 ́︿ ̀。)
我阴差阳错的参加了这个项目,107地板不平整却因祸得福的契合了国赛场地。(体育馆里铺的有点皱)
国赛上午比科目二,原本抽的签能够在午饭前比完的,结果因为组织的混乱,12点休息的时候,我们前面还差了2组……无奈之下只好让沈哥去买饭,我们在场馆里等,生怕又出什么幺蛾子。等啊等,大家都太饿了,当沈哥进来的时候,就像自带圣光出场一样哈哈哈,又或者是 我的意中人,总有一天他会踩着七彩祥云带着盒饭来拯救我?哈哈哈哈哈哈
草草填了填肚子,就赶紧下去调程序了。本来以为如影随形会很大一个地盘,结果超级小……只好降速。我们还是D组第一个,只能边调边跑,好在有沈哥的技术指导,加上夏哥技术过硬,成功完赛。
比如影随形的时候,卓晴大大到处解说,不停的奶人,结果隔壁一组奶的轮子掉了……真是大型翻车现场……
这个夏天,这是最完美的结局。感谢老师们的支持,感谢学长的技术指导,感谢队友的付出,谢谢大家的努力。
可以先把真个页面写在一个view里面 定义一个id 比如 <view id="zong"> 所有内容 </view> js 在onLoad里面写入即可获取页面总高度 var query = wx.createSelectorQuery(); query.select('#zong').boundingClientRect(function (rect) { that.setData({ juligao: rect.height, }) console.log("top", that.data.juligao) }).exec();
c语言81重要 请编写函数fun,其功能是∶验证参数n是否可以分解成2个素数相乘,是则返回1,否则返回0,并通过指针变量x、y返回分解后的2个
素数值,要求*x<y。主程序中将打印出分解结果。
例如,111=337,当函数fun的参数n为111时,可以分解为2个素数(3和37)的乘积,函数返回值为1。
另外,prime函数验证参数m是否为素数,是则返回1,否则返回0。
在码云上下载的另一个springboot项目,启动报错:class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
解决方案:
将pom.xml中的热部署依赖去掉(或注释掉) <!--热启动--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>true</scope> </dependency> 将SpringBoot版本升到2.x版本:
修改前: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> 修改后:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> </parent> 总结:将项目中的热部署依赖注释,并将springboot由原来的1.5.9升级到2.1.3后,该问题解决。
原文链接:
https://blog.csdn.net/qq_40722208/article/details/105287695
记得先更新源
sudo apt-get update #更新源
方法1 成功测试
wget http://www.c-nergy.be/downloads/Std-Xrdp-Install-0.5.3.zip # 下载脚本
unzip Std-Xrdp-Install-0.5.3.zip # 解压压缩包
chmod +x Std-Xrdp-Install-0.5.3.sh # 赋予执行权限
./Std-Xrdp-Install-0.5.3.sh # 执行完成后就行了
方法2 成功测试
wget http://www.c-nergy.be/downloads/install-xrdp-3.0.zip
unzip install-xrdp-3.0.zip
chmod 777 Install-xrdp-3.0.sh
./Install-xrdp-3.0.sh
最后重启机器 sudo shutdown -r now
注意:重启后千万不要用虚拟机登录,否则无法远程。
在线直达地址: https://bitly.com/
bitly.com提供了可能是全球最稳定的短链接服务
可通过Google授权一键登陆Bitly 为避免短链接被滥用, Bitly只为注册用户提供短链接服务, 我使用了Google授权的登陆方式, 无需填写个人信息即完成了注册
登陆地址: https://bitly.com/a/sign_in
image-20200826134856439 生成短链接 以URL https://www.v2fy.com/p/readme-onlinetoolsbook/ 做一个生成短链接的演示
生成短链接为 https://bit.ly/3lmi4mL
自带统计功能 image-20200826113230085 小结 新浪的短链接工具,由于种种原因,越来越难用, bitly.com的短链接服务一直很坚挺,且自带统计功能, 推荐使用~
本文出处 本文选自在线工具秘籍 🍭「在线工具秘籍」, 为在线工具写一本优质开源中文说明书, 让在线工具造福人类~ Online tool cheats, write a quality manual for online tools, make online tools benefit humanity~
「在线工具秘籍」Github永久开源地址:https://github.com/zhaoolee/OnlineToolsBook
「在线工具秘籍」国内阿里云镜像地址:https://www.v2fy.com/p/readme-onlinetoolsbook/
MYSQL查询今天、昨天、本周、本月、上一月 、下一月、上一年、下一年、上季度、下季度 -- 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); -- 昨天 select * from 表名 where to_days( now( ) ) - to_days(时间字段名) <= 1; -- 本周 select * from 表名 where yearweek( date_format(时间字段名,'%y-%m-%d' ) ) = yearweek(now()); -- 上一周 select * from 表名 where yearweek(date_format(时间字段名, '%y-%m-%d')) = yearweek(now())-1; -- 本月 select * from 表名 where date_format(时间字段名,'%y-%m')=date_format(now(),'%y-%m'); -- 上一月 select * from 表名 where period_diff(date_format(now(), '%y%m'), date_format(时间字段名, '%y%m')) = 1; -- 本季度 select * from 表名 where quarter(时间字段名)=quarter(now()); -- 上一季度 select * from 表名 where quarter(时间字段名)=quarter(date_sub(now(),interval 1 quarter)); -- 本年 select * from 表名 where year(时间字段名)=year(now()); -- 上一年 select * from 表名 where year(时间字段名)=year(date_sub(now(),interval 1 year)); -- 查询距离当前现在6个月的数据 select * from 表名 where 时间字段名 between date_sub(now(),interval 6 month) and now(); -- 周 日期数据 -- 获取昨天日期 select DATE_SUB( curdate( ), INTERVAL 1 DAY ); -- 获取上周第一天 select date_sub(now(),interval dayofweek(now())-1+6 day); -- 获取上周最后一天 select date_sub(now(),interval dayofweek(now())-1 day); -- 获取本周第一天 select date_sub(now(),interval dayofweek(now())-2 day); -- 获取本周最后一天 select date_add(now(),interval 7-dayofweek(now())+1 day); -- 获取下周第一天 select date_add(now(),interval 7-dayofweek(now())+1+1 day); -- 获取下周最后一天 select date_add(now(),interval 7-dayofweek(now())+1+7 day); -- 月 日期数据 -- 本月天数 select day(last_day(curdate())); -- 获取当前月已过了几天 select day(curdate()); -- 上月今天的当前日期 select date_sub(curdate(), interval 1 month); -- 上月今天的当前时间(时间戳) select unix_timestamp(date_sub(now(), interval 1 month)); -- 获取当前时间与上个月之间的天数 select datediff(curdate(), date_sub(curdate(), interval 1 month)); -- 获取本月的第一天 select date_add(curdate(), interval - day(curdate()) + 1 day); -- 获取本月的最后一天 select last_day(curdate()); -- 获取上个月的第一天 select date_add(curdate() - day(curdate()) + 1, interval -1 month); -- 上个月的最后一天 select last_day(date_sub(now(), interval 1 month)); -- 获取下个月的第一天 select date_add(curdate() - day(curdate()) + 1, interval 1 month); -- 获取下个月最后一天 select last_day(date_sub(now(), interval -1 month)); -- 获取当前月的天数(先加一个月,再减今天是第几天,得到当前月的最后一天,最后求最后一天是几号) select day(date_add(date_add(curdate(), interval 1 month), interval -day(curdate()) day)); -- 获取当前月的天数(先加一个月,再减今天是第几天,得到当前月的最后一天,最后求最后一天是几号) select day(date_add(date_add(curdate(), interval 1 month), interval -day(curdate()) day)); -- 季度 日期数据 -- 返回上季度第一天 select concat(year(now()),'-',lpad((quarter(now())-1)*3-2,2,'0'),'-01'); -- 返回上季度最后一天 select date_sub(concat(year(now()),'-',lpad((quarter(now())-1)*3+1,2,'0'),'-01'),interval 1 day); -- 返回本季度第一天 select concat(year(now()),'-',lpad((quarter(now())-1)*3+1,2,'0'),'-01'); -- 返回本季度最后一天 select last_day(concat(year(now()),'-',lpad(quarter(now())*3,2,0),'-01')); -- 返回下季度第一天 select concat(year(now()),'-',lpad((quarter(now()))*3+1,2,'0'),'-01'); -- 返回下季度最后一天 select last_day(concat(year(now()),'-',lpad((quarter(now())+1)*3,2,0),'-01')); -- 年 日期数据 -- 返回上年第一天 select concat(year(now())-1,'-01-01'); -- 返回上年最后一天 select concat(year(now())-1,'-12-31'); -- 返回本年第一天 select date_sub(now(),interval dayofyear(now())-1 day); -- 返回本年最后一天 select concat(year(now()),'-12-31'); -- 返回下年第一天 select date_add(concat(year(now()),'-12-31'),interval 1 day); -- 返回下年最后一天 select date_add(concat(year(now()),'-12-31'),interval 1 day); -- 查询表结构包含注释 select * from information_schema.
在python3中当用urllib.request.urlopen或者urllib.request.urlretrieve打开一个 https 的时候会验证一次 SSL 证书, 当目标使用的是自签名的证书时就会爆出一个
URLError: urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)的错误消息;
解决方法一(适用于urlopen函数,因为urlretrieve没有context参数所以不适用):
import ssl context = ssl._create_unverified_context() urllib.request.urlopen(url, context=context) 解决方法二(同时适用urlopen和urlretrieve函数):
import ssl ssl._create_default_https_context = ssl._create_unverified_context url.request.retrieve(url,file_name)
利用SPSS对变量进行分组转换结合方差(U)检验轻松做出SCI表一
SCI里常见这样的表格一,表明人群基线资料,通常都是分段表示,可这样的表格是怎么做出来的呢?
今天我们来实际做一下:
假设我们有一组肺炎和炎症指标的数据,fy为是否肺炎,age为年龄,其他是炎症指标,如下:
想知道不同年龄层段炎症指标有没有关系,比如老人是不是比成人炎症反应更加重?数据里给的是实际年龄,我们要把年龄进行转换,分成青少年(0-20岁)、成年(21-60岁)、和老年(>60岁)。我们先把数据录入SPSS
点转换,然后选择重编码为不同变量
选入age,点新值和旧值
点击范围,把青少年定义为0—20新值为1,成年定义为21-60新值为2,老年定义为60-100新值为3,
新输出数据取名age1
点击变化量得出新数据
对age1的数值进行标定1青少年,2成年,3老年,然后通过方差分析
最后得到SCI表一的结果,是不是很简单啊,就把SCI表一的结果得出来了
动动小手关注一下吧,更多精彩文章尽在零基础说科研
推荐阅读: 我总结了72份面试题,累计3170页,斩获了30+互联网公司offer(含BATJM)
2020首战告捷,这份Java面试神技Plus版,让我成功拿到了阿里、京东、字节跳动等大厂offer
疫情之下,收到美团电话面试(成功拿下offer),附学习路线+刷题库
事 情 经 过
这天中午,小编吃完午饭,摊在自己的躺椅上,想趁吃饱喝足的午后时间静静享受独自的静谧。
干点什么好呢?小编单手操作鼠标打开了一个陌生而隐秘的网站。正开着某个视频起劲,突然浏览器弹出了一个对话框:
请使用微信扫码登录账号,继续观看
这…
但是由于强烈的好奇驱使,迫于无奈,小编只好选择登录再继续观看。只见他熟练的掏出手机,打开微信扫一扫对准上面的二维码,只听见 “叮” 的一声,网页上的二维码仿佛活过来了,直接刷新出了小编的微信头像,同时手机上也弹出登录的提醒。
小编心中略微惊叹,但没来得及多想。忙点击手机界面中登录按钮。此时网页刷新,恢复了正常,表示可以继续观看。
上网冲浪的时间总是过得很快,小编很快就有些疲倦。他闭上眼睛,脑海中却浮现出了刚刚微信扫描二维码,然后登录网页的场景,心中再次惊叹,并开始思考起其中的原理来。
原理解析
微信扫码登录现在在日常生活中已经是常见不能再常见的场景之一了,但是要知道微信首次公开这项功能时,却是惊艳众人。移动端与PC端以这样一种巧妙的方式连接在了一起,的确是让人惊叹。
小编想起来之前听过的前后端的概念,知道账户的数据信息一般都是放在服务器上,前端负责向后端 “讨要数据” 并显示,后端则是对前端的 “讨要” 做出反应。这样一来,小编猜测微信登录的过程可能就是:
网页前端向微信后台请求账号数据
微信后台接受网页前端的请求,然后将他的账号数据返回
网页前端接收到了数据后,在浏览器里进行显示
还手脚麻利的画了个示意图:
当小编正准备沾沾自喜的时候,突然看到桌面上的手机。咦,如果就只是这么个过程,那手机的作用是啥。他才开始意识到,问题没这么简单。
于是,他决定重新探秘微信扫码登录的过程。
过程分析
小编打开了一个十分简洁的网站,说是微信的网页版,可以微信直接扫码登录。
https://wx.qq.com/
小编看着网页中硕大的二维码陷入了沉思,他在想这个二维码跟他的身份有没有关系呢。如果没有,那它又是怎么生成的呢。
思考间,小编打开了浏览器的开发者工具。在网络监控一栏找到了这幅二维码,与之对应的链接是
https://login.weixin.qq.com/qrcode/4fhrH4fhTQ==
然后习惯性地,小编尝试多次刷新页面,发现二维码不断发生变化,链接也不断更改。
https://login.weixin.qq.com/qrcode/YdDa9LAqpA==
https://login.weixin.qq.com/qrcode/ofw5oAsMVg==
https://login.weixin.qq.com/qrcode/gaNS_fxO_w==
他似乎发现了些东西。二维码不断变化,其对应的链接尾的代码也相应变化,并且是随机性的变化。
这也就是说,**每一次页面刷新都会随机且唯一地生成一个二维码。**这或许可以与手机登录的过程联系起来。
小编似乎开始明白了,他随即再次拿起手机,熟练的使用微信扫描了此时的二维码。
“叮” 的一声,网页上的二维码顿时变成了小编帅气的微信头像。这个时候,小编才突然意识到,是扫码之后网页才与他的微信账号建立起了联系。
没有扫码之前,页面上的二维码只是随机生成的且与用户无关的码;而当用户扫码之后,二维码便与用户帐号绑定在了一起。
原来手机扫码的用处是这样!
小编此时注意到,手机微信上弹出了『微信登录确认』的提醒。小编这个时候谨慎地点击了下方的登录按钮。
随着平滑的动画一闪而过,网页上已经显示出了小编的账号信息,显然小编的微信账号已经登录。再一次体验这个过程,小编心中开始思索手机微信在登录过程中所起到的具体作用。
首先需要明白几个过程:
进入网页登陆界面,随机生成一个二维码;
小编通过手机扫描二维码,将微信账号与二维码绑定;
小编在手机微信点击登录按钮,授权网页登录微信账号;
网页获得小编的账号信息,将数据显示。
原理解释
小编望着上述过程,结合最开始的原理猜测,开始思索整个环节哪里出了差错。
网页的二维码到底从何而来?
是谁向微信后台请求了账号数据?
突然,他意识到,不同的网站可能都需要通过微信后台进行数据的获取,那么每一个网站必然也存在它的后台来给微信后台发送请求。
这样一来,整个过程就能解释得通了!
网站页面刷新,网页后台向微信后台请求授权登录;
微信后台返回登录所需二维码;
用户通过手机扫描二维码,并在手机上授权登录后,微信后台告知网页后台已授权;
网页后台向微信后台请求微信账号数据;
微信后台返回账号数据;
网页后台接收数据并通过浏览器显示;
技术剖析
小编在想清楚了整个过程后,决定对整个过程的技术实现进行进一步的探究。他打开了微信开发官方文档,找到了第三方网站应用微信登录开发指南:
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
这次讲讲openwrt的结构.
1. 代码上来看有几个重要目录package, target, build_root, bin, dl....
---build_dir/host目录是建立工具链时的临时目录
---build_dir/toolchain-<arch>*是对应硬件的工具链的目录
---staging_dir/toolchain-<arch>* 则是工具链的安装位置
---target/linux/<platform>目录里面是各个平台(arch)的相关代码
---target/linux/<platform>/config-3.10文件就是配置文件了
---dl目录是'download'的缩写, 在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们make menuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。
---而在build_dir/目录下进行解压,编译和打补丁等。
---package目录里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。在openwrt中ipk就是一切, 我们可以使用
$ ./scripts/feeds update来对软件包进行更新.
$ ./scripts/feeds search nmap 查找软件包'nmap'
Search results in feed ’packages’: nmap Network exploration and/or security auditing utility $ ./scripts/feeds install nmap 安装'nmap'这个软件
$ make package/symlinks //估计意思是更新软件源之类的
---bin目录下生成了很多bin文件,根据不同的平台来区分。另外bin/<platform>/package目录,里面有很多ipk后缀的文件,都是package目录下的源码在build_dir目录下编译后的生成的结果。
2. 新建自己的packages
对于自己新建的package,而这个package又不需要随固件一起安装,换句话说,就是可以当做一个可选软件包的话。我们可以利用我们的SDK环境来单独编译,编译后会生成一个ipk的文件包。然后利用 opkg install xxx.ipk 来安装这个软件。
下面具体说下,如何编译一个helloword的软件包。
(1)首先,编写helloworld程序
编写helloworld.c
/****************
* Helloworld.c
* The most simplistic C program ever written.
这是我的第二个免费软件了, 为了方便大家,也有博友提出有这个需求,所以写了这个桌面采集\录屏\推流的一体化工具.
作为一个基本的桌面采集软件,麻雀虽小五脏俱全. 它的功能也算强大了, 基本够用. 用过它你就不想再用别的了!呵呵!!
当然后面我会继续丰富优化, 敬请关注!
下载地址: 录课直播-2.0.1.3.exe
免费高性能流媒体服务器也以先前发布了, 有需要去我博客里找.
免费高性能流媒体服务器: 免费流媒体服务器(AMS3.0 非AdobeMediaServer)_wanghaisheng的专栏-CSDN博客
如果你没有分可以留言,我发你邮箱. 资源里面除采屏工具外,还包含了一个自己包装的播放器,核心非自己实现,延迟相对其它播放器稍小, 可以供大家测试使用.
下面我把功能都作一下简介:
1. 可以选择采集的屏幕, 当你机器有多屏的时候这个就比较方便了.
2. 可以在选择采集屏幕的情况,再去选择一个要采集的窗口, 这样可以完成一些软件的共享分享功能
3. 可以选择是否采集系统声音, 这样如果是在直播屏幕时可以一边讲解一边直播.录像也是会同步把声音录下. 这里是MIC与系统声音的混音.
4. 可以录像, 录像时输出都是1920*1080的画面, 即便是采集的是小窗口最后我们看到的也是1920*1080, 录像生成是MP4. 5. 可以进行RTMP适时推流到服务器, 做同步直播, 如果搭配我另一篇博文中的AMS3.0免费服务器,可以做到毫秒级的延迟.
6. 支持采集过程暂停但流不停的功能, 如果在录屏或直播时你想暂不要输出你的画面, 但又不想直接断掉直播,此时可以使用暂停.
7. 可以插入图片显示. 如果你是暂停时想显示一幅自己的图画而不是屏幕,那么这个功能就有用了, 此时你选中"使用暂停图片",就会把你设定图显示出来. 如果你想显示很多不同的图片, 你可以自己手动选择你要展示的图片就可以了. 一切都可以在预览窗口中看到.
8.支持输出画面预览功能, 你想看时可以打开, 不想看时可以关闭, 关闭后更省资源. 9.支持应用最小化, 最小化后不影响工作. 优点就是高效呀, 一个字快!!!
1. 采用先进的屏幕采集技术, 采集帧率可达30帧以上, 画质可以达到原样输出的效果,非常流畅,而且资源占用很小.
2. 采用软编和硬编和相结合, 在硬件支持的情况下资源占用非常小. 没有硬件支持下情况软编自动启用,且效率比一般编码器也高.
3. 网络推流部分是完全自己实现的TRMP模块,是超低延迟模块.这部分可以用在导播推流中, 毫秒级延迟. 注意与改进
安装Apache 1 、下载 Apache 的安装程序 apache_2.2.3-win32-x86-no_ssl.exe 后,安装很简单,一直回车。
2 、安装完毕后,将下载的 mod_jk-1.2.20-apache-2.2.3.so改名为mod_jk.so,并复制到 Apache 安装目录下的 modules 目录中。
httpd.conf 配置 3 、然后进入 Apache 安装目录下的 conf 子目录中,打开 httpd.conf 配置文件,在最后插入以下一行: Include conf/mod_jk.conf
4.修改httpd.conf 配置文件Listen 80,改为Listen 81,因为80端口号容易冲突。
mod_jk.conf配置 4、 在 conf 子目录下,建立一个新的配置文件:mod_jk.conf ,此文件为 Apache 加载连接器的配置文件,文件名可修改,但要与 httpd.conf 中 Include 的文件名一致,在logs子目录下建立日志文件mod_jk.log,mod_jk.conf内容如下:
# Load mod_jk module # Specify the filename of the mod_jk lib LoadModule jk_module modules/mod_jk.so # Where to find workers.properties JkWorkersFile conf/workers.properties # Where to put jk logs JkLogFile logs/mod_jk.
问题引入 现有三种鸢尾花分别标为0,1,2类,存在4种不同的属性,即萼片长(setosa),萼片宽(versicolor),花瓣长与花瓣的宽度,现在需要对这三种鸢尾花的分布在二维平面中进行可视化分析。数据来自于sklearn中的dataset部分数据。
萼片长萼片宽花瓣长花瓣的宽度类别5.13.51.40.20.04.93.01.40.20.04.73.21.30.20.07.03.24.71.41.06.43.24.51.51.06.93.14.91.51.06.33.36.02.52.05.82.75.11.92.07.13.05.92.12.06.32.95.61.82.0 高维数据进行可视化分析,常用思路是对数据进行降维。
符号说明 n n n表示列属性的个数。
x i \textbf{x}_i xi为nx1的列向量,在表格中代表一个不包括类别属性的行。
c = 0 , 1 , ⋯ , k , ⋯ c={0,1,\cdots,k,\cdots} c=0,1,⋯,k,⋯表示类别的集合,对应上述表格中的0、1。
m k m^k mk表示类别为c的样本总个数。
X k \textbf{X}^k Xk表示类别k组成的矩阵,大小为 m k × n m^k\times{n} mk×n。
x i k , k ∈ c \textbf{x}_i^k,k\in{c} xik,k∈c为nx1列向量,在表格中表示类别为k的属性行。
m = ∑ k ∈ c m k m=\sum_{k\in{c}}{m^k} m=∑k∈cmk表示所有样本数。
θ \theta θ表示位于直线 l l l上的nx1的单位列向量。
前情提要 线性判别分析在二分类的应用中,我们有类内距离为
θ T S w θ = θ T ∑ k ∈ c ∑ i = 1 m k ( x i k − u k ) ( x i k − u k ) T θ \theta^T\textbf{S}_w\theta=\theta^T\sum_{k\in{c}}\sum_{i=1}^{m^k}(\textbf{x}_i^k-u^k)(\textbf{x}_i^k-u^k)^T\theta θTSwθ=θTk∈c∑i=1∑mk(xik−uk)(xik−uk)Tθ
model:
title תÔËÎÊÌâ;
!¶¨Ò弯ºÏ¶Î;
sets:
GongChang/1…2/:A;
CangKu/1…3/:B;
Guke/1…4/:C;
GongChangDaoCangKu(GongChang,CangKu):L,n1;
CangKuDaoGuke(CangKu,Guke):S,n2;
EndSets
Data:
!¹¤³§µÄ²úÁ¿ÏÞÖÆ;
A = 9 8;
!¹¤³§µ½²Ö¿âµÄÔËÊäÁ¿£¬Î´Öª£»
!ºó¶¨
!²Ö¿âµ½¹Ë¿ÍµÄÔËÊäÁ¿;
C = 3 5 4 5;
!¹¤³§µ½²Ö¿âµÄÔ˷ѵ¥¼Û;
L =
1 2 1000000
3 1 2;
!²Ö¿âµ½¹Ë¿ÍµÄÔ˷ѵ¥¼Û;
S =
5 7 1000000 3
9 6 7 1000000
5 6 7 4;
EndData
[Obj]Min =
@sum(GongChang(i):@sum(CangKu(j):n1(i,j)*L(i,j))) +
@sum(CangKu(i):@sum(Guke(j):n2(i,j)*S(i,j)));
! ÏÞÖÆÌõ¼þ
! ¹¤³§µÄ²úÁ¿ÏÞÖÆ;
@for(GongChang(i):
@sum(CangKu(j):n1(i,j)) < A(i)
);
! ¹Ë¿ÍµÄÐèÇóÁ¿ÏÞÖÆ;
@for(guke(j):
@sum(CangKu(i):n2(i,j)) = c(j)
针对情景: Win10下运行py工程报错,最后一行为“OSError: [WinError 126] 找不到指定的模块”倒数第二端为Shapely相关函数的语句(如下图) PS:其他情景用该方法未必有效
问题原因: 由上图可见,倒数第二段Shapely传递一个xxxxx.dll给下一段ctypes,但由于xxxxx.dll文件缺失(也可能是VC库的锅,但这里只需要处理Shapely即可解决问题),所以程序报错“OSError: [WinError 126] 找不到指定的模块”
解决方法: 在命令行中执行命令,先卸载shapely:pip3 uninstall shapely;出来是否确认的提示就y回车去该网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely下载对应版本的shapely的whl安装包。如何查看对应版本?根据提供的shapely文件名判断哪个版本是符合你的:第一看cp36 cp37 cp39这一部分,代表的是你python版本,如你装的是python3.7那就选择cp37(后缀m不用在意);第二看最后位数,64位就选win_amd64,32位就选win32,现在的Win10基本都是64位系统,安装默认也是64位的。选择后点击下载,如图:下载后打开命令行,通过cd命令进入到所下载上述文件的路径下执行目录从c:\users\xxxx\变为cd的路径后在此执行命令: pip3 install 所下载该文件的文件名.whl 例:pip3 install Shapely-1.7.1-cp37-cp37m-win_amd64.whl
安装完成后再执行代码,发现这个问题已解决
补充 如果执行cd后目录并没有进入到指定路径,那就按照下图进行:
python图像处理笔记-十一-多视图重建与立体图像 多视图重建 由于照相机运动给我们提供了三维结构,所以这样计算三维重建的方法通常称作SFM (Structure from Motion,从运动中恢复结构)。我们假设摄像机已经标定,计算重建可以分为下面四个步骤:
检测特征点,在两幅图像中匹配由匹配计算出基础矩阵由基础矩阵计算照相机矩阵三角形剖分这些三维点 我们前面已经把者四个东西都做过了,但是当图像间的点包含不正确的匹配关系时,需要一个文集爱你方法来估计矩阵。
稳健估计基础矩阵 类似于稳健计算单应性矩阵,存在噪声和不正确匹配的时候,我们需要估计基础矩阵,和前面的方法一样,使用RANSAC,不过这次结合了八点法。
我们写一段代码来实现它:
# 归一化的八点法def compute_fundamental_normalized(x1,x2): """ 使用归一化的八点算法,由对应点(x1,x2 3×n 的数组)计算基础矩阵""" n = x1.shape[1] if x2.shape[1] != n: raise ValueError("Number of points don't match.") # 归一化图像坐标 x1 = x1 / x1[2] mean_1 = np.mean(x1[:2],axis=1) S1 = np.sqrt(2) / np.std(x1[:2]) T1 = np.array([[S1,0,-S1*mean_1[0]],[0,S1,-S1*mean_1[1]],[0,0,1]]) x1 = np.dot(T1,x1) x2 = x2 / x2[2] mean_2 = np.mean(x2[:2],axis=1) S2 = np.sqrt(2) / np.std(x2[:2]) T2 = np.array([[S2,0,-S2*mean_2[0]],[0,S2,-S2*mean_2[1]],[0,0,1]]) x2 = np.
造成标题问题的原因是因为在ios系统上,css overflow属性和echarts图表z-index冲突,这是ios上的一个Bug,页面设置了overflow属性,z-index就会失效,图表上的图形就会覆盖tooltip.
对此,针对这个问题,有两个解决方案:
1.页面不设置overflow属性,但是这个不太可行,因为实际情况页面会有需要滚动条的情况,所以这个方法需根据实际情况来使用。
2.在tooltip上设置position,强行把图表上的overflow属性给去掉,亲自证明,此方法可行,下面贴上代码
tooltip: { title: "客流量", trigger: "axis", axisPointer: { type: "shadow", }, textStyle: { color: "#999", align: "left", }, extraCssText: "box-shadow:0px 0px 8px 0px rgba(176,176,176,1)", backgroundColor: "#fff", formatter: function (params) { //去除重复数据 for (var i = 0; i < params.length; i++) { for (var j = params.length - 1; j > i; j--) { if ( params[j].seriesName == params[i].seriesName ) { params.splice(j, 1); break; } } } var res = "
Spring中涉及到的设计模式详解
一、单例模式 1、介绍 要点:
某个类只能有一个实例;它必须自行创建这个实例;它必须自行向整个系统提供这个实例。 实现:
单例模式的类只提供私有的构造函数(这样就不会被继承);类定义中含有一个该类的静态私有对象;该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。 使用单例模式的好处:
对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。 2、饿汉式 在类加载的期间,就已经将 instance 静态实例初始化好了,所以,instance 实例的创建是线程安全的。不过,这样的实现方式不支持延迟加载实例。
如果从资源利用效率角度来讲,比懒汉式单例类稍差些。但是从速度和反应时间角度来讲,则比懒汉式要稍好些。
public class Singleton { // 直接创建对象 public static Singleton instance = new Singleton(); // 私有化构造函数 private Singleton() { } // 返回对象实例 public static Singleton getInstance() { return instance; } } 3、懒汉式 Public class Singleton2{ //声明变量 Private static final Singleton2 instance=null; //私有的默认构造函数 Private Singleton1(){ } //静态工厂方法,提供对外方法 Public synchronized static Singleton2 getInstance(){ If(instance==null){ Instance=new Singleton2(); } Return instance; } } 这种写法和饿汉式的区别在于:实例并没有直接实例化,而是在静态工厂方法被调用的时候才进行的,而且对静态工厂方法使用了同步化,以处理多线程并发的环境。
一、文章概述 本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:
1、检测图片中的人脸
2、实时检测视频中出现的人脸
3、用运设备的摄像头实时检测人脸
二:准备工作 提前做的准备:
安装好Python3下载安装OpenCV库,方法是pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com/pypi/simple下载特征数据HAAR和LBP,这两种数据都能实现对人脸特征的提取,HAAR大多是小数计算所以运算速度较慢,LBP大多是整数计算运行速度较快。如图所示,本次实例用红框中的文本,其他的文本,比如第一个haarcascade_eye.xml是眼睛识别的文本,我们下次再用。
注意:点击下载HAAR和LBP的特征数据--------数据集下载 三、开始讲述 1、图片人脸检测 (1)代码和说明
import cv2 as cv import numpy as np def face_detect_demo():#人脸检测函数 gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)#把图片变成灰度图片,因为人脸的特征需要在灰度图像中查找 #以下分别是HAAR和LBP特征数据,任意选择一种即可,注意:路径中的‘/’和‘\’是有要求的 # 通过级联检测器 cv.CascadeClassifier,加载特征数据 # face_detector = cv.CascadeClassifier("D:/pyproject/cv_renlianjiance/haarcascades/haarcascade_frontalface_alt_tree.xml") face_detector = cv.CascadeClassifier( "D:/pyproject/cv_renlianjiance/lbpcascades/lbpcascade_frontalcatface.xml") #在尺度空间对图片进行人脸检测,第一个参数是哪个图片,第二个参数是向上或向下的尺度变化,是原来尺度的1.02倍,第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸,这里是在相邻的5个人脸检测框内出现,如果图片比较模糊的话建议降低一点 faces = face_detector.detectMultiScale(gray, 1.02, 5) for x, y, w, h in faces:#绘制结果图 #rectangle参数说明,要绘制的目标图像,矩形的第一个顶点,矩形对角线上的另一个顶点,线条的颜色,线条的宽度 cv.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 2) cv.imshow("result", src)#输出结果图 src = cv.
1. 简介 在Java中拷贝对象有深拷贝和浅拷贝两种。本文将对这两种方法进行比较,并学习四种实现深拷贝的方法。
2. Maven依赖 后文实现深拷贝会依赖两个工具 Gson、Jackson 及 apache commons lang。为了进行单元测试我们这里使用assertj流式断言库。
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.11.1</version> </dependency> 3.Model 为了比较不同拷贝Java对象的方法,我们需要使用两个类作为例子进行演示。
class Address { private String street; private String city; private String country; // standard constructors, getters and setters } class User { private String firstName; private String lastName; private Address address; // standard constructors, getters and setters } 4.
Mathtype如何实现自动编码 1 设置章节号 1.1插入新的章节号: 1.2 根据需要修正章节号: 在此可以修改章节号。
2 插入公式(以编号在右侧为例) 点击Ringht-numbered,就会出现编号公式的界面,如下:
保存后即为公式居中、编号靠右的格式,其中数字编码可根据自己需要的字体格式调整,如图下:
RStudio 加载包时出现 Package LibPath Version Priority Depends Imports Linking To Suggests Enhances License License_is_FOSS License_restricts_use OS_type Archs MD5sum NeedsCompilation Built RStudio 出错详情修改办法 License License_is_FOSS License_restricts_use OS_type Archs MD5sum NeedsCompilation Built) RStudio 出错详情 修改办法 出现该种错误的原因是加载包时错用语句:
installed.packages("***")
应该为
install.packages("***")
installed.packages()可以用于查看你已经安装过的包
++i和i++在某些地方的差异,主要在实现的方式导致的 a = i++; 类似于: a = i; i = i + 1; a = ++i; 类似于: i = i + 1; a = i; i++和++i的 最重要的区别就是 +1和返回值顺序从效率上来说++i比i++来的更有效率,因为i++多声明了一个过渡的变量。如下所示:
对于i++的实现是: int temp; temp = i; i = i+1; return temp; 而++i的实现是: i = i+1; return i; 比如printf("%d",i++);是先输出i值随后i自加,而printf("%d",++i);中i先加1再输出,即输出的结果为i大1的数字。
对于for循环:
for(operation1;operation2;operation3)
{
//Do Something
}
循环是按下面的顺序来执行的:
operation1operation2//Do Somethingoperation3 因此i++与++i在单独的语句中结果是一样的。
简单而言:
++i 在 i 存储的值上增加一并向使用它的表达式 返回新的, 增加后的值; 即先加再返回值。
而 i++ 对 i 增加一, 但返回原来的是未增加的值。即先返回再加。
Solr搜索引擎 一、什么是Solr?二 、数据库本身就支持搜索啊,干嘛还要搞个什么solr?三、如果我们想要使用solr那么首先我们得安装它2.solr官网3.解压后打开solr文件夹进bin目录,在地址框输入cmd 回车 此时弹出命令行4.输入solr.cmd start 命令开启solr服务5.看到下面这个界面说明solr安装成功啦!6.创建 code 核心并添加 conf 配置文件7.重启服务8.显示以下界面表示核心创建成功啦!9.一起来试试吧!10.查询成功 一、什么是Solr? 其实我们大多数人都使用过Solr,也许你不会相信我说的这句话,但是事实却是如此啊 ! 每当你想买自己喜欢的东东时,你可能会打开某宝或者某东,像这样一搜,就能搜到很多东西,你知道你看到的这些数据都来自哪儿吗?百度一下你就知道!这些数据来自哪儿吗?等你了解完Solr后你就知道答案啦!
现实生活中我们都知道大多数网站或应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。
这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,这就确保你能从几乎任何编程语言来使用solr。
Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr是企业级的,快速的和高度可扩展的。 使用Solr构建的应用程序非常复杂,可提供高性能。
为了在CNET网络的公司网站上添加搜索功能,Yonik Seely于2004年创建了Solr。并在2006年1月,它成为Apache软件基金会下的一个开源项目。并于2016年发布最新版本Solr 6.0,支持并行SQL查询的执行。
Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于
搜索,Solr也可以用于存储目的。像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。
总之,Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。
二 、数据库本身就支持搜索啊,干嘛还要搞个什么solr? 1 .其实正如上面solr的介绍中所说的那样,solr本身也可以看成数据库,(no sql类型),但它比数据库搜索速度更快,所以在项目中我们一般把搜搜的部分交给solr,就像我们在京东首页所看到的商品信息,并不是来自数据库,而是来源于sorl的索引库
2.数据库本身不能实现分词效果,而只能使用模糊查询,但是模糊查询非常低效,查询速度比较慢,由于在实际生活中,一般搜索是用的比较多的,这样数据库压力自然就很大,所以我们就让供专业的solr来做搜索功能
三、如果我们想要使用solr那么首先我们得安装它 1:由于solr是以java开发而成,所以必须在jdk环境中运行。(配置 JAVA_HOME 这里就不具体介绍了)
2:下载并解压 solr,官网 https://lucene.apache.org/solr,我们直接附上最新版链接( solr-8.6.1.zip )
3:解压后打开solr文件夹进bin目录,在地址框输入cmd 回车 此时弹出命令行
4:输入solr.cmd start 命令开启solr服务
5:打开浏览器输入https://localhost:8983/solr 下文附上全部图解
6:创建 code 核心并添加 conf 配置文件
2.solr官网 3.解压后打开solr文件夹进bin目录,在地址框输入cmd 回车 此时弹出命令行 4.输入solr.cmd start 命令开启solr服务 5.看到下面这个界面说明solr安装成功啦! 6.创建 code 核心并添加 conf 配置文件 创建后找到 server\solr\ 创建核心新建的文件夹
前段时间安装了php的openssl扩展后,nginx未重启过,使用一切正常。今天重启了下电脑,突然发现nginx无法启来了,报错如下:
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib Referenced from: /usr/local/bin/nginx Reason: image not found Abort trap: 6 搜索各种资料未解决。因openssl版本过高,nginx依赖的还是低版本openssl,故无法启动。
解决办法:
brew upgrade nginx 执行更新nginx命令,使nginx版本为最新版本后,重启nginx成功。
mysql也是同理。如果出现上述错误信息,执行 brew upgrade mysql。使用mysql.server start 启动mysql
MIB文件就是一个规范的ASN.1的模块,也可以称为MIB模块。
MIB 结构:
模块声明部分:
所有的MIB模块都需要使用 DEFINITIONS 关键字定义模块,以END标识结束 导入/导出部分:
也就是IMPORT/EXPORT,它一般紧跟在模块声明后,该部分主要声明导入其他模块,尤其是标准模块中定义的数据类型,宏等。只有导入相关数据类型,才可以在本模块中使用。
利用IMPORTS标识,所有的模块引用使用FROM关键字说明其出处,引用使用分号(;)结束 IMPORTS Unsigned32 FROM SNMPv2-SMI OBJECT-TYPE FROM RFC-1212 enterprises FROM SNMPv2-SMI; 模块标识部分:
一般都使用MODULE-IDENTITY以描述该模块的详细信息。该部分必须紧跟IMPORTS子句后。模块有更新历史时使用关键字REVISION进行描述。 ipMIB MODULE-IDENTITY LAST-UPDATED "200602020000Z" ORGANIZATION "IETF IPv6 MIB Revision Team" CONTACT-INFO "Editor: EMail: <sar@iwl.com>" DESCRIPTION "The MIB module for managing IP and ICMP implementations, but excluding their management of IP routes. REVISION "200602020000Z" DESCRIPTION "The IP version neutral revision with added IPv6 objects for ND, default routers, and router advertisements.
见:https://blog.csdn.net/weixin_37766087/article/details/99974385
linux的绝对路径 linux的绝对路径就是指从根目录开始,完整表示的绝对路径,绝对路径一般都是/开头的路径,比如:/mnt/lustre/share/open-mmlab/datasets就是绝对路径。
特别地,在linux中.表示当前目录,例如,假设当前目录是/mnt/lustre/share,那么.就等价于/mnt/lustre/share,那么./open-mmlab/datasets就等价于/mnt/lustre/share/open-mmlab/datasets,也就是说带.的路径本质上也是绝对路径。
linux的相对路径 linux下的相对路径就是不以/开头的路径。
C#系列学习笔记1:.Net和JIT .NetJIT .Net .NET是跨语言的一个平台,核心就是.NET Framwork,是.NET程序开发和运行的环境。语言可以是C#,f#,j#,VB.net等等。c#是运行在.Net平台下的一种面向对象的高级编程语言。
.Net框架的组成分为两部分: CLR:公共语言运行时(Common Language Runtime),提供内在管理,代码安全性检测等功能。FCL:.NET框架类库(.NET Framework Class Library),提供大量应用类库,类库中有很多线程的资源可使用(比如:类,方法,属性),提高开发效率。 CLR的结构: CLS:公共语言规范,获取各种语言转换成统一的语法规范,是.Net跨语言开发的基础。CTS:通用类型系统,将各种语言中的数据类型转换成统一的类型JIT:实时编译器(即时编译器)用于将转换之后的语言编译为二进制语言,交给CPU执行。
CLR一个很重要的特性就是Type安全。CLR在任何时候都知道某个对象的类型。你可以通过GetType方法获得,由于该方法不是虚函数,因此不能被覆盖,也就是说返回的值是永远真实的。 .Net运行的机制流程
各种语言(c#,F#,j#等对应的源程序)-> 经过CLS,CTS第一次编译 -> 统一规范语言(中间语言)MSIL(.EXE,.DLL) -> JIT第二次编译 -> 二进制语言 -> 运行在CPU中
.Net的基础类库BCL
当通过VS创建一个项目后,这个项目就已经引用好了通过.NET下的语言编写好的一些类库。比如ConSole类,System.IO类,这些都是微软帮你写好的,不用你自己去编写,它帮你编写了一个面向.NET的开发语言中使用的基本的功能。这部分类,我们称之为BCL(Base Class Library)基础类库,它们大多都包含在System命名空间下。由微软开发的类库统称为:FCL,Framework Class Library,.NET框架类库,我上述所表达的BCL就是FCL中的一个基础部分,FCL中大部分类都是通过C#来编写的。
基础类库BCL包含:基本数据类型,文件操作,集合,自定义属性,格式设置,安全属性,I/O流,字符串操作,事件日志等的类型
JIT JIT(Just-in-time compilation, JIT)编译器会使用即时编译,对不同架构的机器生成不同的机器码,大部分的代码优化都在这里完成。JIT 只有在运行时才会工作,当生成(Build)项目时,JIT 不会工作。编译器在编译时,会对代码进行检查,对于只调用过一次的代码,不会JIT优化。多次使用的代码(例如for循环)才会进行JIT。
通常,程序有两种运行方式:预先编译(AOT)与动态编译。预先编译的程序在执行前全部被翻译为机器码,而动态编译则是一句一句,边运行边翻译。即时编译则混合了这二者,一句句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。
当运行程序时,CLR 先会调用类加载器加载需要的类型,加载完成之后,就创建了类型对象,包括方法表。
当首次调用该类型的 X 方法。由于其没有对应的机器码(除非它预先编译好了,例如Console 类中的方法),CLR 会在调用时遭遇 jmp 指令(目标为 JIT 编译器),将 X 方法的 IL 代码转换为机器码。
JIT 编译过程中,会做运行时的类型验证,将代码和元数据中的定义进行比对,确定代码的类型安全性。
编译完成之后,将机器码存储在缓存中,并将缓存地址放在 jmp 指令的后面,代替之前的 JIT 编译器地址。
以后对该方法的所有调用都不需要再次 JIT 编译, JIT 已将将机器码储存在内存中。当程序结束后,这些机器码就会消失,所以每次程序运行都伴随着即时编译。
不过,这个现象带来的性能损耗仅仅会在方法第一次调用时体现,而大部分程序都会调用方法不止一次。
实践中,对于多因素的试验设计,以往多是采用正交设计。最近,有人咨询我,两个因素4个水平的正交设计是怎样的?
我运行了DoE.base包里的oa.design(),结果令人诧异,结果如下:
// oa design > oa.design(nfactors=2,nlevels=4) creating full factorial with 16 runs ... A B 1 1 4 2 3 3 3 4 4 4 2 4 5 1 3 6 4 1 7 3 2 8 4 3 9 3 1 10 2 1 11 1 1 12 3 4 13 4 2 14 2 3 15 2 2 16 1 2 class=design, type= full factorial oa.design给出了全因子设计。而对于3因素3水平,oa.design可以给出正常的正交设计:
一、前言 公司的固件开发人员经常用本机的代码编译打包文件,然后把编译好的固件发给硬件测试人员,经常出现开发人员不及时提交代码的问题。为了加强代码管控和规范化管理,最近搭了一个给硬件测试人员使用的服务器, 写了一个脚本文件用于自动拉取GIT上的固件代码,然后自动编译并打包。
二、以前的代码 由于是做物联网项目,公司的流量卡有分定向流量卡和普通流量卡,定向流量卡只能访问一个固定的内网地址,普通流量卡就类似我们手机中的普通上网卡,什么网站都可以访问。
以前编译打包文件时,开发人员通过修改代码中的__VPN_SIM__和FirmVer这2个参数来控制编译出的固件是什么版本号和区分流量卡的,部分代码如下:
//版本号定义 #ifdef __VPN_SIM__ #define FirmVer "V005" #else #define FirmVer "P028" #endif //服务器URL定义 #ifdef __VPN_SIM__ #define HOMEPAGE "http://192.168.0.125:80" #else #define HOMEPAGE "http://www.xxx.cn:80" //正式服务器 //#define HOMEPAGE "http://test.xxx.cn:8080/" //测试服务器 #endif 三、改造的过程 3.1 改造的思路 执行脚本的指令 ./buildFireware.sh P001 或者 ./buildFireware.sh V001 脚本的输入参数就1个:
参数1 -- 固件的版本号 在buildFireware.sh脚本中调用make命令执行Makefile中的编译指令时,直接传入固件版本号来代替代码中的FirmVer,同时在shell脚本中通过<版本号>的第一个字符是V还是P自动控制HOMEPAGE,不需要开发和测试人员更改代码就可以灵活输出不同的固件版本。
3.2 改造的C语言代码 只是加多了一个#ifndef FirmVer和#endif
//版本号定义 #ifndef FirmVer #ifdef __VPN_SIM__ #define FirmVer "V005" #else #define FirmVer "P028" #endif #endif //服务器URL定义 #ifdef __VPN_SIM__ #define HOMEPAGE "
CDA数据分析师 出品 作者:真达、Mika
数据:真达 后期:泽龙
【导读】
今天教大家如何用Python写一个员工流失预测模型。公众号后台,回复关键字“离职”获取完整数据。Show me data,用数据说话。
今天我们聊一聊 员工离职,说到离职的原因,可谓多种多样。人们归总了两点:
1. 钱没给到位
2. 心受委屈了
有人离职是因为“世界那么大,我想去看看”,也有人觉得“怀有绝技在身,不怕天下无路”。
另一方面,员工离职对于企业而言有什么影响呢?
要知道,企业培养人才需要大量的成本,为了防止人才再次流失,员工流失分析就显得十分重要了。这不仅仅是公司评估员工流动率的过程,通过找到导致员工流失的主要因素,预测未来的员工离职状况,从而进一步减少员工流失。
那么,哪些因素最容易导致员工离职呢?
这次我们用数据说话,
教你如何用Python写一个员工流失预测模型。
01、数据理解
我们分析了kaggle平台分享的员工离职相关的数据集,共有10个字段14999条记录。数据主要包括影响员工离职的各种因素(员工满意度、绩效考核、参与项目数、平均每月工作时长、工作年限、是否发生过工作差错、5年内是否升职、部门、薪资)以及员工是否已经离职的对应记录。字段说明如下:
02、读入数据
# 导入包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from pyecharts.charts import Bar, Pie, Page from pyecharts import options as opts from pyecharts.globals import SymbolType, WarningType WarningType.ShowWarning = False plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 # 读入数据 df = pd.
1.算法题:寻找k:在无序数组中,k的所有左值比它更小,所有右值比他更大。限定o(n)。 2.算法题:将int转换成汉字表示,尽量考虑边界以及特殊情况。(0,1,-1,10,12,123,1000,1001) 线程的同步方式 synchronizedvolatileReentrantLock 进程和线程的区别? 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机资源的基本单位
线程:是一个进程的执行单元,比进程更小的独立运行的基本单位,它也被称为轻量级进程,是cpu调度和分派的基本单位
地址空间不同:线程没有独立的地址空间,它们共享同一进程的地址空间,而进程则是独立的地址空间资源拥有不同:同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的多进程比多线程更加的健壮:多线程只要一个线程挂掉,整个进程就会死掉,但是一个进程崩溃后,并不会影响其他的进程,因为进程拥有独立的地址空间进程间的切换资源消耗大,它的切换通常伴随的页调度,而线程的切换只需要切换上下文就可以了,所以在涉及频繁的切换时,使用线程要比进程好。如果同时进行并且又要共享某些变量的并发操作,那么只能用线程进程相当于一个应用程序执行的实例,每个独立的进程都拥有一个程序运行的入口,程序顺序执行序列和,而每个线程相当于这个进程的一个执行流,所以不能独立执行,必须依存于进程 优缺点:
线程执行开销小,但是不利于资源管理和保护,适合于多cpu
进程执行开销大,但是能够很好的进行资源管理和保护
客户端怎么保证服务端知道自己还活着? 心跳包,它是客户端和服务器之间定时发送通知告诉对方自己的状态的一个命令字,按照一定的时间间隔发送。客户端定时发送简单的信息到服务端告诉它自己还活着,服务端收到后会回复一个固定信息,如果服务端指定时间内没有收到客户端的信息则视为客户端断开。在知道了断开以后,服务器可能会做一些事情,比如数据清理和重新连接等等,心跳包主要也就是用于长连接的保活和断线处理
tcp的可靠性? 对数据进行分割和重组确保数据按顺序传输(给每个数据包都标明序列号)支持失败重传能够进行流量控制(通过滑动窗口实现的)拥塞控制 可以通过http发送数据吗? 可以,比如post、get请求就是通过http发送的
List和List相同吗? 不同,List里面只能放String类型的变量,而List中可以放所有类型的变量,虽然最后经过泛型擦除后都是一个类型Object。并且List的值不能直接传递给List。虽然String是Object的子类,但是List并不是List的子类
List<? extends T> 和 List<? super T> List<? extends T>表示类型的上界为T,这里面的元素要么是T,要么是T的子类,它是被设计用来读取数据的泛型,只能读取类型为T的元素List<? super T>表示类型的下界为T,里面的元素要么为T,要么为T的父类,它被设计用来添加数据,只能写入T或T的子类型,不能用来进行读操作 用wait/notify实现生产者消费者模式 class Producer implements Runnable { private EventStorage storage; public Producer(EventStorage e){ storage = e; } @Override public void run() { for (int i=0;i<100;i++){ storage.put(); } } } class Consumer implements Runnable { private EventStorage storage; public Consumer(EventStorage e){ this.
一、命名与获取 多线程每一次运行都是不同的运行结果,因为它会根据自己的情况进行资源抢占(除非加锁)。要区分每一个进程,那么必须依靠线程的名字。对于线程名字,一般而言会在其启动之前进行定义,不建议对已经启动的线程更改名称/设置不同线程重名。
如果要进行线程名称的操作,可以使用Threa类如下方法:
构造方法:
/** * Allocates a new {@code Thread} object. This constructor has the same * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} * {@code (null, target, name)}. * * @param target * the object whose {@code run} method is invoked when this thread * is started. If {@code null}, this thread's run method is invoked. * * @param name * the name of the new thread */ public Thread(Runnable target, String name) { init(null, target, name, 0); } 普通方法:
c语言64 请编写函数fun ,函数的功能是查找x在s所指数组中下标的位置作为函数值返回,若x不存在,则返回-1。
C语言输入输出格式符 printf函数(格式输出函数)
1.一般格式
printf(格式控制,输出表列)
例如:printf(“i=%d,ch=%c\n”,i,ch);
说明:
(1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:
①格式说明:由“%”和格式字符组成,它的作用是将输出的数据转换为指定的格式输出。
②普通字符,即需要原样输出的字符。
(2)“输出表列”是需要输出的一些数据,可以是表达式
(3)printf函数的一般形式可以表示为
printf(参数1,参数2,……,参数n)
功能是将参数2~参数n按参数1给定的格式输出
2.格式字符(9种)
(1)d(或i)格式符。用来输出十进制整数,有以下几种用法:
①%d,按整型数据的实际长度输出。
②%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
③%ld(%mld 也可),输出长整型数据。
例如:long a=123456;
printf("%ld",a);
(2)o格式符,以八进制数形式输出整数。格式:%o,%mo,%lo,%mlo都可。
(3)x(或X)格式符,以十六进制数形式输出整数。格式:%x,%mx,%lx,%mlx都可。
(4)u格式符,用来输出unsigned型数据,即无符号数,以十进制数形式输出。格式:%u,%mu,%lu都可。
(5)c格式符,用来输出一个字符。格式:%c,%mc都可。
(6)s格式符,用来输出一个字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。
(7)f格式符,用来输出实数(包括单、双精度),以小数形式输出。格式:%f,%m.nf,%-m.nf都可。
注意:单精度实数的有效位数一般为7位,双精度为16位。
(8)e(或E)格式符,以指数形式输出实数。格式:%e,%m.ne,%-m.ne都可。
(9)g(或G)格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种)。
3.说明
(1)除了X、E、G(用大写字母表示)外,其他格式字符必须用小写字母;
(2)“格式控制”字符串内可以包含转义字符;
(3)如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如:
printf("%f%%",1.0/3);
(4)格式字符表参见下表
表4.1 printf格式字符
格式字符 说 明
d,i 以带符号的十进制形式输出整数(正数不输出符号)
o 以八进制无符号形式输出整数(不输出前导符0)
x,X 以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出
u 以无符号十进制形式输出整数
c 以字符形式输出,只输出一个字符
s 输出字符串
f 以小数形式输出单、双精度数,隐含输出6位小数
e,E 以指数形式输出实数
g,G 选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0
表4.2 printf的附加格式说明字符
字符
说明
字母l
用于长整型整数,可加在格式符d、o、x、u前面
m(代表一个正整数)
数据最小宽度
n(代表一个正整数)
Vue 实现实搜索功能(前端搜索) 用于前端的实时搜索要求:首先我的思路(本人新手思路):HTML部分:然后是JS部分:然后是方法:最后将方法放到Vue的监听里面: 用于前端的实时搜索 新人前端刚入行,不严谨请多指教
场景是这样的!
要求: 1、输入名称和位置能够实时显示检索内容
2、最少检索单位为一个字符串,有一个字符串匹配,则显示对应项
3、输入为空时,显示所有项,初始化也为所有项
4、检索为空,显示为空
首先我的思路(本人新手思路): 先做CSS、HTML在想逻辑(JS):
列表显示的后台数据怎么显示在前端页面=>数据里面哪些字段是我需要的=>怎么样去寻找相应的字段=>找到了相应的字段怎么样显示在前端编写测试 HTML部分: 一开始对Vue没有多少理解,看视频学到双向绑定,觉得这个写实时搜索真的太好用了
先用v-model绑定input的value,方便传到后台
<!-- 右边弹窗 --> <div id="monitorRecord" class="row"> <!-- 搜索框 --> <div class="col-md-4 left" style="border: 1px solid black;"> <div class="searchRecord row"> <input type="search" class="cameraSearch " v-model="keyword" placeholder="输入设备位置/名称"><a class="searchbtu fa fa-search" @keypress="getCommityCamera(keyword)"></a> </div> <!-- 展示列表 --> <div style="height: 600px;overflow-y: auto;"> <div v-if="cameraData.length <= 0" v-show="nocameraData"> <ul v-for="cam in cameraList" class="camList" :key="cam.entityID.id"> <li class="selectedCam active" @click="getPhotoList(cam.entityID.id)"> <p>{{cam.
前言 互联网的访问依靠IP地址。但IP地址不好记。
所以使用域名服务(DNS,好记名),来替代访问的地址。
例如百度的IP为14.215.177.38
但更多是www.baidu.com来搜索
基本概念 专业术语1 hosts文件 不同系统的位置
windows
C:\Windows\System32\drivers\etc\hosts
需要超级管理员权限
Linux
/etc/hosts
作用: 实现名字解析,主要为本地主机名、集群节点提供快速解析
数据库: 平面式结构,集中式数据库
缺点:不便于查询,更新
DNS DNS(Domain Name System,域名系统)
作用: 实现名字解析(例如将主机名解析为IP)
(分布式,层次性)
FQDN FQDN:(Fully Qualified Domain Name)完全合格域名/全称域名
baidu.com.
www.baidu.com.
www.sina.com.
www.qq.com.
www.music.baidu.com.
www.icbc.com.cn.
主机名.四级域.三级域.二级域.顶级域.(根域)
空间分类 专业术语2 DNS解析流程 例如客户端解析 www.126.com
1. 客户端查询自己的缓存(包含hosts中的记录),如果没有将查询发送/etc/resolv.conf中的DNS服务器
2. 如果本地DNS服务器对于请求的信息具有权威性,会将(权威答案)发送到客户端
3. 否则(不具有权威性),如果DNS服务器在其缓存中有请求信息,则将(非权威答案)发送到客户端
4. 如果缓存中没有该查询信息,DNS服务器将搜索权威DNS服务器以查找信息:
a. 从根区域开始,按照DNS层次结构向下搜索,直至对于信息具有权威的名称服务器,为客户端获答案
DNS服务器将信息传递给客户端 ,并在自己的缓存中保留一个副本,以备以后查找。
b. 转发到其它DNS服务器
递归/迭代 服务器类型 主服务器
又名根服务器
根服务器主要用来bai管理互联网的主目录du,全世界只有13台。1个为主根服zhi务器,放置dao在美国。其余12个均为辅根服务器,其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。
从服务器
类似于每个地方的子服务器
缓存服务器
缓存指的是将需要频繁访问的网络内容存放在离用户较近、访问速度更快的系统中,以提高内容访问速度的一种技术。缓存服务器就是存放频繁访问内容的服务器。
正向解析/反向解析 DNS服务主要起到两个作用:
1)可以把相对应的域名解析为对应的IP地址,这叫正向解析。
标题来点基础的练习题吧,看见CSDN这类基础的代码不多 //正三角形 void ex03(){ int i,k=0, rows, space; printf("请输入三角形的层次:"); scanf("%d",&rows); for(i=1; i<=rows; i++,k=0){ //k值每次循环都要重新初始化 for(space=1; space<=rows-i; space++){ printf(" "); } while(k != 2*i-1){ printf("* "); ++k; } printf("\n"); } } 效果如下:
//倒三角形 void ex04(){ int rows, space, i, k = 0; printf("请输入三角形行数:"); scanf("%d",&rows); for(i = 1; i <= rows; i++,k = 0){ //k值每次循环都要重新初始化 for(space = 1; space <= i; space++){ printf(" "); } for(k = 0; k < 2*(rows-i+1)-1 ; k++){ printf("
要使用CLI模式就是:要用服务器cmd打开
php的模式分php-cfpm、cli(命令行)
小白菜的STM32cubeMX学习(2)中断的配置 0 前言1 外部中断1.1 CubeMX配置1.2 代码编写 2 定时器中断CubeMX配置2.2 代码编写 0 前言 在小白菜的STM32cubeMX学习(1)点亮第一颗LED中,我总结了一下如何用CubeMX配置GPIO并且点亮第一颗LED。
这一篇则介绍如何配置中断,包括外部中断和定时中断,串口中断下次和串口一起说吧。
这里我默认大家知道一些关于中断的基本原理了。
1 外部中断 1.1 CubeMX配置 外部中断可以用按键来触发,偷偷瞄一眼开发板的原理图
这里就用KEY0/1/2三个按键吧,根据原理图的接线呢,我们需要对PH2/3和PC13设置上拉电阻。先在CubeMX芯片上找到这几个引脚,设置成GPIO_EXTI
接下来在GPIO中将中断模式改成下降沿触发,并设置上拉电阻,这里的设置和按键那里的电路图有关。
在NVIC中将三个引脚的中断打上对勾,算是使能吧,然后把中断优先级改成1,这里的数字越大表示优先级越低。这里将中断优先级降低,是因为如果优先级为0的话,会导致HAL_DELAY()无法在外部中断函数中使用。
中断函数得有个啥子现象吧,这里将LED亮灭的IO口也配置好,和上一篇一样。
至此,CubeMX端的配置完成,按照上一篇的介绍完成其他配置并生成代码。
1.2 代码编写 打开工程,找到中断的Handler,按图中顺藤摸瓜找到回调函数
三个中断执行完之后都会进入到这个回调函数,可以直接把这个函数copy到main.c里面 进行修改。也可以直接把要干的事写道中断的Handler里面。
我这里写的是不同按键,就闪烁不同次数
这个buling()我是写在main.c里面了,调用的话在前面加extern关键词就好。
编译上传,没得问题。
2 定时器中断 先说一下想法,我这个板子上有两个灯,一个灯用来外部中断,按键会闪烁对应的次数。
另外一个灯用来定时器中断定时闪烁。
开始干活~
CubeMX配置 在Timers中打开TIM1定时器,选择内部时钟源。这里时钟源是APB2 Timer clocks,即16M.
设置频率,频率=APB2 Timer clocks/(预分频+1)/(自动重装值+1),所以设置的时候要-1,这个误差其实不大~
这里我们让它2s闪一下,即1s反转一下引脚IO,所以设置成16000-1和1000-1
最后在NVIC里面打开TIM1的中断使能,其实只需要打开溢出中断updata就行。
CubeMX配置完了,生成代码并打开
2.2 代码编写 打开代码,找到MX_TIM1_Init();顺藤摸瓜到__HAL_RCC_TIM1_CLK_ENABLE();
这里表明了TIM1是使用了APB2的时钟。
定时器初始化已经写在main()里面了,找到HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);这个函数是用来开始定时器计时的。把该函数写到main()中
找到回调函数HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),将会点函数copy到main.c中进行更改即可。
也可以直接在TIM1_UP_TIM10_IRQHandler()函数中写中断
编译烧录没得问题
这次的工程已经上传到https://github.com/MercerD/interrupt.
这次步骤有很多省略,对stm32的中断也不是很清楚,我是按照51单片机的理解去走的,欢迎大家一起交流
layui.use 加载layui.define 定义的模块,当外部 js 或 onclick调用 use 内部函数时,需要在 use 中定义 window 函数供外部引用
window.test= function(){ alert("test"); }
2019年云计算笔试面试题库 区别:
单引号: 所见即所得 里面的内容会原封不动显示出来
双引号: 会解析里面的变量和特殊符号
反引号: 反引号里面的内容会被优先执行(将里面的输出暂时保存 在适当的地方显示出来)
[root@alice ~]# echo ‘$UID’
KaTeX parse error: Expected 'EOF', got '#' at position 19: … [root@alice ~]#̲ echo "UID"
0
[root@alice ~]# echo date
Wed May 15 09:28:43 CST 2019
1、在linux中links分类?
软、硬连接 2、编写shell程序运行前赋予该脚本什么权限?
x 执行权限 3、唯一标识每个用户得是?
uid和用户名 4、在linux系统中, 用来存放系统所需要的配置文件和子目录的目录是
/etc 5、结束后台进程命令?
kill 6、在超级用户下显示linux 系统中正在运行的全部进程,应使用的命令及参数?
ps -ef 7、为脚本程序指定执行权限的命令和参数是?
chmod +x 脚本 8、什么命令是删除文件和目录?
rm 9、什么命令是移动文件和目录的命令?
mv 10、增加一个用户得命令是?
useradd 11、终止一个前台进程可能用到的命令和操作(A)
A. kill
1、3D重建 主要包括基于单目图像重建、结构光、双目重建、多目重建、多视图几何、深度相机、光场、SFM等内容~
链接:Tom-Hardy-3D-Vision-Workshop/aweosme-3D-restruction
2、3D检测与识别 主要包括基于单目图像的3D检测、基于双目的3D检测、基于立体视觉的3D检测、基于融合数据的3D检测~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-3D-object-detection
3、点云处理 主要包括点云的滤波、特征提取、线面拟合、面积体积计算、识别分类、点云分割与配准、点云数据集等~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-pointcloud-processing
4、姿态估计 主要包括基于RGB图像的姿态估计、基于RGB-D数据的姿态估计、基于点云数据的姿态估计、基于model方式的姿态估计、基于投票方式的姿态估计、基于深度学习方式的姿态估计等~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-6D-pose-estimation
5、深度估计 主要包括基于单目的深度估计、半监督和自监督方式的深度估计~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-depth-estimation
6、自动驾驶领域算法汇总 主要包括仿真工具、框架、数据集、感知算法等~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-Autopilot-algorithm
7、SLAM 主要汇总了一些优秀的开源仓库~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-SLAM-algorithm
8、缺陷检测 主要包括缺陷检测的一些文章汇总、代码实现~
链接:Tom-Hardy-3D-Vision-Workshop/awesome-defect-detection
9、CV会议期刊汇总 链接:Tom-Hardy-3D-Vision-Workshop/awesome-cv-conference-journals
10、AI相关公司汇总 链接:Tom-Hardy-3D-Vision-Workshop/awesome-AI-company-summary
不管是电视剧,电影,还是动画等视频类型中,有很多的画面非常的有趣,可以将这些能够制作gif动图,作为表情包,在与好友聊天互动的时候进行使用,更好的表达自己的情绪,营造良好的氛围。那么,大家知道怎样才能够将视频转化gif动图吗?下面教给大家视频转gif(https://www.gif.cn/)的方法是怎样的,一起来看一下详细的操作步骤。
第一步,点击“添加视频”按钮,将准备好的视频上传到网站上去。
第二步,在弹出的视频截取窗口,点击开始取图,确定gif动图的第一个画面,点击停止取图,完成动图画面的长度,点击取图完成跳转到参数页面。
第三步,设置gif动图的参数,宽或高,画面播放延迟,水印的设置等,删除链接即可下载无水印的动图。根据自己的需求来选择压缩选项以及图片质量,点击开始生成gif。
第四步,gif动图生成之后,点击下载图片,完成全部操作。
我觉得这个需求肯定很多朋友都有。
首先应该考虑一点:如果装了不同版本的CUDA,是不是也得装不同版本的cuDNN?我目前的结论是:为了不影响系统中本来的cuDNN,是可以不装的。按照这篇博客的介绍:https://www.cnblogs.com/laosan007/p/12612511.html
“如果没有编译cuDNN的话,执行一些基于Caffe这一深度学习框架的程序速度上要慢3-5倍”
这个measurement我没有自己做过,如果目的仅仅是为了试着跑一下别人的代码,完全可以不理会cuDNN。另外针对上面的这个博客有点疑问,这篇博客里说:“这种方法如果不重置cuDNN相应的符号链接的话是不能成功的安装cuDNN的。”呵呵,我仔细拜读了这篇文章很多遍,也没发现他在什么地方重置了所谓的符号链接啊。
言归正传,首先,我们应该清楚针对目前系统中的显卡驱动,能够装哪些版本的CUDA,具体可以参考这里:
https://blog.csdn.net/hesongzefairy/article/details/89946900
当然我还是有点疑问,如果显卡驱动比较新,装老的版本的CUDA会有什么影响吗?这个表并不能看出这一点。
其次,要搞清楚我们为什么要装多个版本的CUDA,原因也很简单,一些老版本的PyTorch对应的CUDA也比较老。那怎么样知道我们要用的pytorch版本对应的CUDA呢,这个说实话从PyTorch的主页是看不出来的:https://pytorch.org/get-started/locally/
不过可以用一些迂回的方法:我们在这里:https://pytorch.org/get-started/previous-versions/#via-pip
可以看到下面几个链接实际上列出了CUDA版本所能对应的pytorch版本:
Download the whl file with the desired version from the following html pages:
https://download.pytorch.org/whl/cpu/torch_stable.html # CPU-only buildhttps://download.pytorch.org/whl/cu80/torch_stable.html # CUDA 8.0 buildhttps://download.pytorch.org/whl/cu90/torch_stable.html # CUDA 9.0 buildhttps://download.pytorch.org/whl/cu92/torch_stable.html # CUDA 9.2 buildhttps://download.pytorch.org/whl/cu100/torch_stable.html # CUDA 10.0 build 例如我们点开这个:https://download.pytorch.org/whl/cu92/torch_stable.html
可以看到,最早的PyTorch版本是0.4.1了,例如我现在要用PyTorch 0.3.0,那似乎装CUDA 9.2可能不行。
所以我决定装CUDA 9.0试试。在这里:https://developer.nvidia.com/cuda-toolkit-archive
找到9.0的链接:https://developer.nvidia.com/cuda-90-download-archive
按照这里的建议:https://blog.csdn.net/tunhuzhuang1836/article/details/79545625
我们需要选择runfile进行安装(这样可以做到不影响之前的版本):
下载下来之后按照这里的教程正常安装即可:https://blog.csdn.net/ashome123/article/details/105822040/
结果我运行了:
sudo sh cuda_9.0.176_384.81_linux.run 之后报错:
Error: cannot find Toolkit in /usr/local/cuda-9.0 呵呵呵。
先试了一下大家说的最简单的办法:
sudo apt install nvidia-cuda-toolkit 结果经过漫长的等待,报了一堆:ibcudnn_cnn_train.
java基本数据类型 Java是一种强类型语言,变量的声明必须声明其类型,并且后续不可改变
1. 分类
2. 占用空间及表示范围
类型占用空间表示范围byte1字节-128~127short2字节-32768~32767int4字节-231~231-1long8字节-263~263-1float4字节-3.403E38~3.403E38double8字节-1.798E308~1.798E308char2字节0-65535boolean1字节或4字节 *在Java虚拟机2.0规范中,使用boolean声明一个基本类型变量时,该变量占4个字节,在编译class文件时,将boolean编译成一个int变量,如果使用boolean声明一个数组的时候,每个数组元素占一个字节,即编译成byte数组。
3. 类型转换
自动(隐式)类型转换
容量小的数据类型可以自动转换为容量大的数据类型,此处容量不是指的是字节数,而是指的表示范围。转换顺序如下图:
*虚线代表会丢失精度
2.强制(显示)类型转换
容量大的数据类型转换为容量小的数据类型时需要强制类型转换。
强制转换符:(需要转换成的类型)变量
4. 注意事项
1字节占8个bit(比特、位);
long类型的数值要以字母l或者L结尾,强制使用大写;
float类型的数值要以字母f或者F结尾;
char类型只能表示一个字符;
char类型是0-65535范围内,运算时直接当作整数来运算,可以把0-65535之间的数字转化为char;
boolean类型只有两个值:true和false。
遇到一个python循环题目:有N个人(编号为1-N)围成一个圈,从编号为1的人开始报数,报数的范围是1~M,报到M的人出圈,下一个人重新从1开始报数,直到留下最后一个人,问最后一个人的编号是多少?
答:这是一个循环的问题,解决的问题主要有:
1,需要将报到数为M的人排除;
2,报数过程中索引不能因为有人排除而断掉,如何让索引在最后一名与开始一名接上;
3,最后一个人的编号与索引的关系。
那么开始写代码了!
# N为你设置的总人数,M为你选择的报数,方便验证此次选了8和3 N, M = 8, 3 # 围成圈后,有人的地方都为True persons = [True] * N # total为总人数,开始为N,以后每当遇到报数为M时,total应该就会排除一个人。 # num为报数值最大为M。 # index 为圈的索引起始为0,最大为 total-1 total, num, index = N, 0, 0 # 当总人数大于1之前都应该继续报数 while total > 1: # 当有人的索引时 if persons[index]: num += 1 #当报数到M时应该讲此编号的人排除圈外 if num == M: persons[index] = False total, num = total - 1, 0 # 虽然人被排除了,但是索引还得继续增加起来,当增加到N的时候,索引为0,相当于报数了一圈,所以用index %= N来连接。 index += 1 index %= N # 当total等于1的时候,while循环结束,此时需要找到列表中还为True的索引,此索引由于是从0开始,故与编号值之间的关系为编号-1=索引 for index, person in enumerate(persons): if person: print(index + 1) break 得到最终结果为:7
实战案例 部署博客系统 wordpress 一、基础环境[已完成] [root@apache ~]# sed -ri ‘/^SELINUX=/cSELINUX=disabled’ /etc/selinux/config
[root@apache ~]# setenforce 0
[root@apache ~]# systemctl stop firewalld.service
[root@apache ~]# systemctl disable firewalld.service
二、安装LAMP[已完成] [root@apache ~]# yum -y install httpd mariadb-server mariadb php php-mysql gd php-gd
[root@apache ~]# systemctl start httpd mariadb
[root@apache ~]# systemctl enable httpd mariadb
三、安装wordpress Apache 配置虚拟主机
[root@apache ~]# vim /etc/httpd/conf.d/wordpress.conf
<VirtualHost *:80>
ServerName www.wordpress.com
ServerAlias wordpress.com
DocumentRoot /webroot/wordpress
<’/VirtualHost>
<Directory “/webroot/wordpress”>
Require all granted
nginx 一个页面中,404 和 200交替出现
一个页面时候,一会儿正常200 一会儿404
个人总结:
第一种原因:是因为改了配置文件,然后重启NGINX 但是NGINX的子进程没有完全清空
导致后面 旧进程的配置还没有更新,还在用旧的配置,重启NGINX的时候,这时候用的是新配置
第二种原因(我遇到的):
原因就是,nginx重启不合理导致的,通过下图发现 NGINX 有三个master进程,这三个master进程里面,只有一个是因为重启而得到的新配置,其他的两个都是旧配置
下面开始讲述我的第一步,查看所有的NGINX进程
发现有三个master,分别进程号为:19126,26222,26237,这很明显是不对的。
然后我kill一个master,可以看到我已经kill 掉了19126主进程 master,居然还有两个master进程存在
kill后的结果图
然后我再试着去重启NGINX,发现旧的进程号26222,26237,仍然存在
可以看到,旧的master进程就是后面的两个(26222,26237 进程号)
这时候请求页面,部分请求去了这两个进程(旧进程)
部分请求去了新的进程(19718)
所以才会有时候 404 有时候200的执行
后面我直接执行以下命令,把所有的NGINX进程全部清空
killall nginx 把所有的NGINX进程清空,清得干干净净
然后重启NGINX
service nginx start ps -ef | grep nginx 得到以下结果,现在所有的进程都是最新配置
再疯狂请求接口,再也没404的情况
Windows10系统下使用VS code远程连接集群(在有跳板机的情况下) 一、使用PowerShell安装适用于Windows10的OpenSSH二、在本地机器上生成SSH key三、远程服务器配置四、安装Visual Studio Code五、在插件市场中搜索Remote SSH并安装六、配置VS code设置七、连接到服务器 一、使用PowerShell安装适用于Windows10的OpenSSH step1: 使用快捷键Windows+X,接着按A或点选「Windows PowerShell(管理员)」,以管理员身份打开PowerShell。
step2: 输入指令Get-WindowsCapability -Online | ? Name -like 'OpenSSH*',这是为了检查本地OpenSSH客户端及服务端是否已经安装,如果都未安装,应打印:
Name : OpenSSH.Client~~~~0.0.1.0 State : NotPresent Name : OpenSSH.Server~~~~0.0.1.0 State : NotPresent step3: 输入指令Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0,这是为了安装OpenSSH客户端,安装成功时应打印:
Path : Online : True RestartNeeded : False 在本地机器上,我们只需要安装客户端即可,不需要安装服务端。
二、在本地机器上生成SSH key step1: 使用快捷键Windows+X,接着按A或点选「Windows PowerShell(管理员)」,以管理员身份打开PowerShell。
step2: 输入指令ssh-keygen -t rsa -b 4096,生成公钥和私钥,在C:\Users\XXX\.ssh目录下(XXX是你的用户名),id_rsa是私钥,本地机器持有,千万不可外泄,千万不能丢失。id_rsa.pub是公钥,后面需要进一步操作。
三、远程服务器配置 用你自己的方式连接到远程服务器(我用的是MobaXterm),把本地机器上的ssh公钥(C:\Users\XXX\.ssh\id_rsa.pub里面的内容)加到服务器的authorized_keys(~/.ssh/authorized_keys)里面。
四、安装Visual Studio Code 传送门
五、在插件市场中搜索Remote SSH并安装 六、配置VS code设置 step1: 点击VS code边栏的远程连接图标。
参考文章:
Python多线程3 多线程的传参与返回值
BBJG_001的博客——多线程
threading库知识点补充
学习网站:
莫烦Python
学习别人的经验: 在主线程用一个变量或者直接输出就能获取或使用函数中return的值。但是在多线程中,可以这么理解,多线程之间的变量空间是互相隔绝的,所以return是不能把值返回到主进程的,只能在所在的线程使用,线程结束,值所在空间也就被释放了。所以,多线程之间需要一个更加全局性的存储器来保存所有线程之间的值,这里使用queue(队列)来完成这项工作。
什么是队列?
简单介绍一下队列,队列是一种存储结构,就像一个水管一样,给这根水管规定一个方向,只能从一头写入(进水),只能从另一头读出(出水)。
存满了怎么办?
采用动态机制,每存一项,我找一块空间,标记好上一次存储的队列头部;然后把新存入的这项声明为整个队列新的头部。从逻辑上讲,这还是那个队列,动态的增加了一节长度(通过地址指向连接的方式),所以,它是不会满的。(不考虑物理存储空间不够的情况)
读出来在队列中就没了。
下面程序中从队列中读出的命令是q.get(),这个函数不用传参,不像列表那样通过索引取值。上面也提到了,队列只能从一端取值,每次只能取尾部的一个值,这里的取值动作相当于 拿出来,之后尾部会向前移动一个单位,这样也就再能取下一个值了,通过这样的机制,使队列成为了一种先进先出的数据结构。
示例程序:
import threading import time from queue import Queue # def job(l, q): # for i in range(len(l)): # l[i] = l[i]**2 # return l # 在普通的函数定义时,使用return来返回值 def job(l, q): for i in range(len(l)): l[i] = l[i]**2 q.put(l) # 在多线程中,即使return了,也只能return到当前线程,无法给主线程调用,因此这里用一个更加全局性的存储器——queue(队列)——来存储多个线程的结果 # time.sleep(1) def multithreading(): q = Queue() threads = [] data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]] for i in range(4): # for1 t = threading.
el-table修改表头 表格 <el-table v-loading="loading" :data="preventionList"> <el-table-column label="业务工作" align="center" prop="businessWork" /> <el-table-column label="责任人" align="center" prop="personLiable" /> <el-table-column label="岗位名称" align="center" prop="jobTitle" :formatter="jobTitleFormat" /> <el-table-column label="岗位等级" align="center" prop="postGrade" :formatter="postGradeFormat" /> <el-table-column label="风险等级" align="center" prop="riskLevel" :formatter="riskLevelFormat" /> <el-table-column label="责任领导" align="center" prop="responsibleLeadership" /> <el-table-column label="廉政风险点" align="center" prop="riskPointsOfCleanGovernment" /> <el-table-column label="所属领域" align="center" prop="field" :formatter="fieldFormat" /> <el-table-column label="风险种类" align="center" prop="typesOfRisks" :formatter="typesOfRisksFormat" show-overflow-tooltip /> <el-table-column label="防控措施" align="center" prop="preventionAndControlMeasures" show-overflow-tooltip /> </el-table> 样式 <style lang="scss" scoped> /deep/ .el-table__header tr,//修改th表头高度 .
1、使用for循环遍历数组
//不需要变量时,可以使用下划线_代替变量
for _ in 1..<6
{
print("字符串")
}
for i in 1..<10
{
print(i)
}
for i in 1...10
{
print(i)
}
for item in [1, 2, 3, 4, 5]
{
print(item)
}
2、使用循环语句获得序列中的最小值
let aaa = [
"bbb":[1,3,5,31,53,6],
"ccc":[12,35,5,123,45]
]
var min = 100
for (_, num) in aaa
{
for nums in num
{
if nums < min
{
min = number
}
} }
3、switch-case语句实例解析
彼岸图网站里有大量的高清图片素材和壁纸,并且可以免费下载,读者也可以根据自己需要爬取其他类型图片,方法是类似的,本文通过python爬虫批量下载网站里的高清美女图片,熟悉python写爬虫的基本方法:发送请求、获取响应、解析并提取数据、保存到本地。
目标url:http://pic.netbian.com/4kmeinv/index.html
1. 爬取一页的图片 正则匹配提取图片数据 网页源代码部分截图如下:
重新设置GBK编码解决了乱码问题
代码实现:
import requests import re # 设置保存路径 path = r'D:\test\picture_1\ ' # 目标url url = "http://pic.netbian.com/4kmeinv/index.html" # 伪装请求头 防止被反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1", "Referer": "http://pic.netbian.com/4kmeinv/index.html" } # 发送请求 获取响应 response = requests.get(url, headers=headers) # 打印网页源代码来看 乱码 重新设置编码解决编码问题 # 内容正常显示 便于之后提取数据 response.encoding = 'GBK' # 正则匹配提取想要的数据 得到图片链接和名称 img_info = re.findall('img src="(.*?)" alt="(.*?)" /', response.
1、下载地址 百度云链接:https://pan.baidu.com/s/1FnbM50hec8wZECVIeSF3aA
提取码:umxz
阿里云链接(建议使用这个,不限速):https://www.aliyundrive.com/s/bAeQkVnbvUX
2、安装 双击iso镜像文件 --> 一路下一步–>完成后会有个DM8 install.pdf的文件–>打开这个文件一步一步安装
3、使用idea连接达梦数据库 需要将下载下来的jar包放到如图的位置
再在idea上新增驱动
jdbc:dm://localhost:5236/DAMENG?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 4、使用官方的图形化界面操作 5、达梦数据库时间日期语法 点击跳转
内存和硬盘读写速度差异太大,如果内存容量足够尽量不要使用虚拟内存。
如电脑监测到内存使用率高于90%以上,就要加物理内存或设置虚拟内存,当然增物理内存为善行。
配置:G3260 4G+2G 240G(SSD)
与自动设置虚拟内存,开了OFICEE2019的WODR EXCEL 基本没有区别
虚拟内存是计算机系统内存管理的一种技术。虚拟内存将计算机的 RAM 和硬盘上的临时空间组合在一起。。
虚拟内存只是真实内存不足的补充,虚拟内存的读写性能(即硬盘的读写)只有真正内存性能的几十分之一,而且频繁使用对硬盘损伤很大!能不用则不用,能少用则少用!原则是一般工作操作,物理内存足够大(8+G),就不要设置虚拟内存。
1 AXI GPIO MIO和EMIO 是直接挂在PS上的GPIO,而AXI_GPIO相当于 GPIO 的 IP 核,该IP核通过AXI总线与PS互联实现了GPIO。 在PS端通过对该IP核的控制寄存器进行读写,即可控制GPIO端口的状态。AXI GPIO 可以使用两个通道,分别是 GPIO 和 GPIO2。当PS的GPIO端口不够用时,我们可以用这种方法把GPIO挂接在AXI总线上与PS交互,大大拓展了PS可用的GPIO数量。
1.1 PL逻辑部分设计 我们用一个开发板上的按钮控制4个LED灯的亮暗情况,搭建好的系统如下所示:
当有IP核挂接在PS的AXI总线上时,会自动地为我们分配好地址以及可寻址的范围。在PS中我们就是对这一范围内的控制寄存器进行操作的。 最好不要自己分配,因为可能会与一些外设的控制寄存器地址冲突!!
注意引出的三态引脚在Creat HDL Wrapper时会自动加上IOBUF。
然后对FPGA引脚根据开发板文档进行xdc约束。 set_property PACKAGE_PIN H11 [get_ports {AXI_GPIO_BTN_tri_io[0]}] set_property IOSTANDARD LVCMOS15 [get_ports {AXI_GPIO_BTN_tri_io[0]}] set_property PACKAGE_PIN E13 [get_ports {AXI_GPIO_LED_tri_io[0]}] set_property IOSTANDARD LVCMOS15 [get_ports {AXI_GPIO_LED_tri_io[0]}] set_property PACKAGE_PIN E12 [get_ports {AXI_GPIO_LED_tri_io[1]}] set_property IOSTANDARD LVCMOS15 [get_ports {AXI_GPIO_LED_tri_io[1]}] set_property PACKAGE_PIN F13 [get_ports {AXI_GPIO_LED_tri_io[2]}] set_property IOSTANDARD LVCMOS15 [get_ports {AXI_GPIO_LED_tri_io[2]}] set_property PACKAGE_PIN H13 [get_ports {AXI_GPIO_LED_tri_io[3]}] set_property IOSTANDARD LVCMOS15 [get_ports {AXI_GPIO_LED_tri_io[3]}] 然后生成bitstream,导出到SDK进行裸机程序开发。 1.
一、什么是阻塞队列 阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示:
当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。当阻塞队列是满时,往队列里添加元素的操作将会被阻塞。 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程从列中移除一个或者多个元素或者完全清空队列后使队列重新变得空闲起来并后续新增。 二、为什么用?有什么好处? 在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。
为什么需要BlockingQueue?
好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了。
在concurrent包发布以前,在多线程环境下,我们每个程序员都必须去自己控制这些细节,尤其还要兼顾效率和线程安全,而这会给我们的程序带来不小的复杂度。
三、架构介绍和种类分析 ArrayBlockingQueue:由数组结构组成的有界阻塞队列。LinkedBlockingQueue:由链表结构组成的有界(但大小默认值为Integer.MAX_VALUE)阻塞队列。SynchronousQueue:不存储元素的阻塞队列,也即单个元素的队列。PriorityBlockingQueue:支持优先级排序的无解阻塞队列。DelayQueue:使用优先级队列实现的延迟无界阻塞队列。LinkedTransferQueue:由链表结构组成的无界阻塞队列。LikedBlockingDeque:由链表结构组成的双向阻塞队列。 四、BlockingQueue的核心方法 package com.jak.demo.Thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * ArrayBlockingQueue:是一个基于数组结构的有界队列,此队列按FIFO(先进先出)原则对元素进行排序。 * LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO(先进先出)排序元素,吞吐量通常要高于ArrayBlockingQueue. * SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高。 * 1.队列,排队,先进先出 * 2.阻塞队列 * 2.1 阻塞队列有没有好的一面 * 2.2 不得不阻塞,你如何管理 **/ public class BlockingQueueDemo { public static void main(String[] args) { List list = new ArrayList(); BlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(3); System.out.println(blockingQueue.add("a")); System.out.println(blockingQueue.add("b")); System.out.println(blockingQueue.add("c")); System.out.println(blockingQueue.element()); System.out.println(blockingQueue.remove()); System.out.println(blockingQueue.remove()); System.out.println(blockingQueue.remove()); System.out.println(blockingQueue.remove()); } } 4.
Ubuntu下git的安装与使用 Ubuntu下git的安装与使用与Windows下的大致相同,只不过个人感觉在Ubuntu下使用git更方便。
步骤1.首先,通过运行以下命令确保您的系统和apt包列表完全更新:
sudo apt-get update 确认你的系统是否已安装git,可以通过git指令进行查看,如果没有,在命令行模式下输入sudo apt-get install git命令进行安装。
安装后您可能想要做的第一件事是在Git中配置自己的名称和电子邮件地址,以便您提交的更改包含正确的信息。进行git配置,输入指令git config --global user.name "xxx"和 git config --global user.email "你的邮箱地址"
配置完成后,需要创建验证用的公钥,因为git是通过ssh的方式访问资源库的,所以需要在本地创建验证用的文件。使用命令ssh-keygen -C 'you email address@gmail.com' -t rsa(注意ssh与-keygen之间没有空格),会在用户目录~/.ssh/下建立相应的密钥文件。
创建完公钥后,需要上传。使用命令cd ~/.ssh进入~/.ssh文件夹,输入gedit id_rsa.pub打开id_rsa.pub文件,复制其中所有内容。接着访问http://git.oschina.net/profile网页,点击SSH公钥,标题栏可以随意输入,公钥栏把你刚才复制的内容粘贴进去就OK了。
可以使用ssh -T git@git.oschina.net命令来测试连接是否畅通。
接下来的内容就和在Windows下使用git上传一样了,先自己创建一个文件夹,把敲的代码拷贝进去(或者每次使用vim的时候直接切到该文件夹目录下进行编辑),先使用git init指令初始化一个git仓库,接着输入git add .添加文件,输入git commit -m "注释"提交至仓库。
输入git remote add origin https://git.oschina.net/你的用户名/项目名.git,git push origin master即可完成推送
分析淘宝网 这次选择的是淘宝网热卖而不是淘宝网,二者虽然名字有不同,但是数据还是一样的,区别就在于前者把后者的所有店铺和商品的海量数据按照销售量、好评度、信誉度综合测评、重新计算、重新排序展现给买家的一个导购网站。
找到准确数据:
请求参数对比:
jsv: 2.4.0 appKey: 12574478 t: 1597626852590 sign: 457c09a81147eb493d1f58ad6ab64d52 api: mtop.alimama.union.sem.landing.pc.items v: 1.0 AntiCreep: true dataType: jsonp type: jsonp ecode: 0 callback: mtopjsonp1 data: {"keyword":"女装","ppath":"","loc":"","minPrice":"","maxPrice":"","ismall":"","ship":"","itemAssurance":"","exch jsv: 2.4.0
appKey: 12574478
t: 1597626856031
sign: 4a87f4308903ded469a1328275ded458
api: mtop.alimama.union.sem.landing.pc.items
v: 1.0
AntiCreep: true
dataType: jsonp
type: jsonp
ecode: 0
callback: mtopjsonp1
data: {"keyword":"女装","ppath":"","loc":"","minPrice":"","maxPrice":"","ismall":"","ship":"","itemAssurance":"","exchange7":"","custAssurance":"","b":"","clk1":"91a160066daf9f8b69646bd610341da7","pvoff":"","pageSize":"100","page":"","elemtid":"1","refpid":"mm_26632258_3504122_32538762","pid":"430673_1006","featureNames":"spGoldMedal,dsrDescribe,dsrDescribeGap,dsrService,dsrServiceGap,dsrDeliver, dsrDeliverGap","ac":"5TGcF6nyjHkCAXt4MaK1QH5c","wangwangid":"","catId":""}
发现请求数据有所改变的地方只有t和sign以及data中的page和ac,其他均没有发生改变,t参数明眼就能猜出是时间戳,sign参数还得通过调试和阅读源码进行逆向分析。
解决t和sign参数 发现sign和t以及其他参数都在这里面构造的。
所以我们现在开始下断点调试这些参数,得出sign参数的构造过程。可以发现t就是当前时间戳,然后sign是由h(d.token + "&" + i + "&" + g + "&" + c.data)构成,d.token是this.options.token也就是cookie值中的_m_h5_tk参数的前部分,i是时间戳,g就是12574478,c.data就是this.params.data。
涉及到文件如下(注意备份):
dede/catalog_add.php dede/catalog_edit.php
dede/templets/catalog_add.htm
dede/templets/catalog_edit.htm
二、新加字段 typenameen
后台执行SQL(前缀默认为dede_ 具体前缀根据自己网站修改):
alter table `dede_arctype` add `typenameen` char(100) NOT NULL default '';
二、打开dede/catalog_add.php 查找:v5.7在第65行。
在65行typename后面增加【typenameen,】,在66行'~typename~'增加【'~typenameen~',】。
二、打开dede/catalog_edit.php 查找:v5.7在第41行。
在typename='$typename',后面增加一行 【typenameen='$typenameen',】。
二、打开dede/templets/catalog_add.htm 查找:v5.7在252行。
图
在252行换行增加:
<tr>
<td class='bline' height="26" style="padding-left:10px;"><font color='red'>英文名称:</font></td>
<td class='bline'><input name="typenameen" type="text" id="typenameen" size="30" class="iptxt" /></td>
</tr>
二、打开dede/templets/catalog_edit.htm 查找:v5.7在219行。
图
在219行换行增加:
<tr>
<td class='bline' height="26" style="padding-left:10px;">英文名称:</td>
<td class='bline'><input name="typenameen" type="text" id="typenameen" size="30" value="<?php echo $myrow['typenameen']?>" class="iptxt" />
(栏目模板里用{dede:field.typenameen /}调用)</td>
</tr>
完成!
BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,
bean工厂的bean属性处理容器,说通俗一些就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性。
可以在任何获得了BeanDefinitionRegistry或者SingletonBeanRegistry实例的地方进行动态注册。
但是如果bean不是在BeanFactoryPostProcessor中被注册,那么该bean则无法被BeanPostProcessor处理,即无法对其应用aop、Bean Validation等功能。
注意:这个仅是注册及定义bean,并没有创建及初始化
@Component public class P implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 创建一个bean的定义类的对象 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(C.class); // 将Bean 的定义注册到Spring环境 registry.registerBeanDefinition("c", rootBeanDefinition); //第一、先调用这个注册c System.out.println("postProcessBeanDefinitionRegistry----注册c"); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // bean的名字为key, bean的实例为value // 第二、当bean都完成注册后,调用这个方法 // 这里只是做好了bean 的定义,但是没有真正的如,初始化bean和bean的注入 String[] strings = beanFactory.getBeanDefinitionNames(); System.out.println("postProcessBeanFactory----start"); for (String string : strings) { System.out.println(string); } System.out.println("postProcessBeanFactory----end"); } } @Component public class A { public A() { System.
概念 B/S结构:Browser/Server,浏览器/服务器模式
构架特点:
1、维护和升级方式简单
2、成本降低,选择更多
3、应用服务器运行数据负荷较重
名词 html html,全称Hypertext Markup Language,bai也就是超文本的链接标示语言。zhiHTML文本是由 HTML命令组成的描述性文本,HTML 命令可以说明文字、 图形、动dao画、声音、表格、链接等。 即平常上网所看到的的网页。
超文本标记语言是WWW的描述语言。
网页 使用HTML,PHP,JAVA等语言格式书写的文件。
主页 网页中呈现用户的第一个页面。
网站 多个网页组合而成的一台网站服务器
URL http://www.baidu.com:80/1.html
ftp://192.168.142.143:21/1.txt
Uniform Resource Locator
统一资源定位符
访问网站的地址
网站架构 LAMP Linux + Apache + MySQL + PHP
系统+服务器程序+数据管理软件+中间软件
静态站点 Apache基础 Apache官网: www.apache.org
软件包名称: httpd
服务端口: 80/tcp(http) 443/tcp(https)
主配置文件: /etc/httpd/conf/httpd.conf
子配置文件:/etc/httpd/conf.d/*.conf
主目录:/var/www/html
网站源代码默认位置
安装Apache [root@localhost ~]# yum -y install httpd
安装
[root@localhost ~]# systemctl start httpd
启动
[root@localhost ~]# systemctl status httpd
计算机组成原理知识点汇总(考研用)——第三章:存储系统 本文参考于《2021年计算机组成原理考研复习指导》(王道考研),《计算机组成原理》
思维导图:
文章目录 计算机组成原理知识点汇总(考研用)——第三章:存储系统3.存储系统3.1 存储器概述 3.1.1 存储器的分类 1.按在计算机中的作用(层次)分类 2.按存储介质分类 3.按存取方式分类 4.按信息的可保存性分类 3.1.2 存储器的性能指标 3.2 存储器的层次化结构 3.2.1 多级存储系统 3.3 半导体随机存储器 3.3.1 SRAM和DRAM 1.SRAM的工作原理 2.DRAM的工作原理 3.存储器的读、写周期 4.SRAM和DRAM的比较 3.3.2 只读存储器 1.只读存储器(ROM)的特点 2.ROM的类型 3.3.3 主存储器的基本组成 3.4 主存储器与CPU的连接 3.4.1 连接原理 3.4.2 主存容量的扩展 1.位扩展法 2.字扩展法 3.字位同时扩展法 3.4.3 存储芯片的地址分配和片选 1.线选法 2.译码片选法 3.4.4 存储器与CPU的连接 1.合理选择存储芯片 2.地址线的选择 3.数据线的选择 4.读/写命令线的连接 5.片选线的连接 3.5 双端口RAM和多模块存储器 3.5.1 双端口RAM 3.5.2 多模块存储器 1.单体多字存储器 2.多体并行存储器 3.6 高速缓冲存储器 3.6.1 程序访问的局部性原理 3.6.2 Cache的基本工作原理 3.6.3 Cache和主存的映射方式 1.直接映射 2.
报错如下:
org.apache.dubbo.remoting.RemotingException: client(url: dubbo://192.168.1.137:20880/org.springframework.cloud.alibaba.dubbo.service.DubboMetadataService?anyhost=true&application=south-db-service&bind.ip=192.168.1.137&bind.port=20880&check=false&codec=dubbo&default.delay=-1&default.deprecated=false&default.dynamic=false&default.lazy=false&default.register=true&default.sticky=false&default.timeout=6000&deprecated=false&dubbo=2.0.2&dynamic=false&generic=true&group=aep&heartbeat=60000&interface=org.springframework.cloud.alibaba.dubbo.service.DubboMetadataService&lazy=false&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs&pid=7956&qos.enable=true&qos.port=10580®ister=true®ister.ip=172.10.1.39&release=2.7.1&remote.application=aep&remote.timestamp=1597894394745&revision=0.9.0.RELEASE&side=consumer&sticky=false×tamp=1597917712415&version=1.0.0) failed to connect to server /192.168.1.137:20880 client-side timeout 3000ms (elapsed: 3004ms) from netty client 172.10.1.39 using dubbo version 2.7.1
at org.apache.dubbo.remoting.transport.netty4.NettyClient.doConnect(NettyClient.java:136)
排查问题:
发现了“Failed to start NettyClient /172.10.1.39 connect to the server /192.168.1.137:20880”这段日志,里面有个ip:192.168.1.137引起了我的注意,因为该ip并不是我的ip也不是nacos服务器的ip。
经过排查发现nacos上面已经启动了一个aep服务,该服务的ip的正好是192.168.1.137。我尝试着在nacos中将该服务下线,然后重启db服务,启动成功了!
分析:
问题出现的原因可能是aep服务订阅了db服务,也就是provider(提供者)服务启动在cosumer(消费)服务之后,会出现该问题
解决:
将已经存在的consumer(消费)服务下线,启动provider(提供者)服务之后再启动consumer服务
在使用pandas对结构化数据进行探索性分析时,我们经常需要打印几条样本出来看看数据读取和处理是否正确,除了用iloc函数以索引区间的方式读取,pandas为我们提供了更简单的head和tail函数,这两个函数的使用方法和效果如下。
1、head函数 pandas中的head函数的使用方法如下:
import numpy as np import pandas as pd df_data = pd.DataFrame(np.random.rand(10, 5)) # 打印全体数据 print(df_data) # 打印前5条数据 print(df_data.head()) # 打印前2条数据 print(df_data.head(2)) 结果如下:
0 1 2 3 4 0 0.718092 0.899116 0.125582 0.978291 0.906551 1 0.173210 0.433652 0.620770 0.824463 0.037136 2 0.012881 0.683509 0.449453 0.859218 0.464844 3 0.243671 0.436372 0.518020 0.091002 0.631860 4 0.044998 0.688442 0.487132 0.230478 0.963189 5 0.453796 0.276635 0.458563 0.165412 0.763591 6 0.975923 0.890063 0.
在跑模型的时候,我们有时需要计算模型运行时间,此时我们需要获取到模型开始运行的时间以及模型结束运行的时间,以二者的差值作为模型的总运行时间。在python语言中,我们可以使用以下两种常用的方式获取当前时间。
1、使用time模块 代码如下:
# 打印时间戳 print(time.time()) # 打印自从1970年1月1日午夜(历元)经过了多长时间,以秒为单位 # 打印本地时间 print(time.localtime(time.time())) # 打印本地时间 # 打印格式化时间 print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) # 打印按指定格式排版的时间 结果如下:
1597915314.907726 time.struct_time(tm_year=2020, tm_mon=8, tm_mday=20, tm_hour=17, tm_min=21, tm_sec=54, tm_wday=3, tm_yday=233, tm_isdst=0) 2020-08-20 17:21:54 2、使用datetime模块 代码如下:
import datetime # 打印当前时间 time1 = datetime.datetime.now() print(time1) # 打印按指定格式排版的时间 time2 = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(time2) 结果如下:
2020-08-20 17:27:59.363265 2020-08-20 17:27:59 3、python中的时间格式化符号 我们进一步看看python中有哪些时间格式化符号,下图来自RUNOOB.COM Python基础教程:Python 日期和时间
根据上图中的内容,我们可以让程序输出便于处理的按特定格式显示的时间。
程序员如何把控自己的职业 时代的趋势和认识自己 自动化加规模化,从而降低成本,提升效率。培养兴趣,再难再累不会放弃,要有时间观念,做计划,懂统筹、多总结、举一反三,自己找答案,总结一些套路,勤奋。 需要什么样的人 技工:码农,不是真正的工程师,只是电脑操作员。特种工:懂原理,有解决问题的能力、套路和方法。工程师:使用技术把活儿做好,做事又稳又快,可以做出很多称手的工具和方法论。设计师和架构:主要开发工具、框架、模式,提升软件开发和维护效率,提升用户体验,提升稳定性、性能、代码重用等,总的就是降本增效。经理:组织团队、完成项目、创造利润,粘合剂。 需要的能力 0 – 对于相关的技术领域还不熟悉 1 – 可以读懂这个领域的基础知识 2 – 可以实现一些小的改动,清楚基本的原理,并能够在简单的指导下自己找到更多的细节。 3 – 基本精通这个技术领域,完全不需要别人的帮助 4 – 对这个技术领域非常的熟悉和舒适,可以应对和完成所有的日常工作。 对于软件领域 – 有能力开发中等规模的程序,能够熟练和掌握并使用所有的语言特性,而不是需要翻书,并且能够找到所有的冷知识。 对于系统领域 – 掌握网络和系统管理的很多基础知识,并能够掌握一些内核知识以运维一个小型的网络系统,包括恢复、调试和能解决一些不常见的故障。 5 – 对于该技术领域有非常底层的了解和深入的技能。 6 – 能够从零开发大规模的程序和系统,掌握底层和内在原理,能够设计和部署大规模的分布式系统架构 7 – 理解并能利用高级技术,以及相关的内在原理,并可以从根本上自动化大量的系统管理和运维工作。 8 – 对于一些边角和晦涩的技术、协议和系统工作原理有很深入的理解和经验。能够设计,部署并负责非常关键以及规模很大的基础设施,并能够构建相应的自动化设施 9 – 能够在该技术领域出一本经典的书。并和标准委员会的人一起工作制定相关的技术标准和方法。 10 – 在该领域写过一本书,被业内尊为专家,并是该技术的发明人。 – TCP/IP Networking (OSI stack, DNS etc) – Unix/Linux internals – Unix/Linux Systems administration – Algorithms and Data Structures – C/C++ – Python – Java – Perl – Go – Shell Scripting (sh, Bash, ksh, csh) – SQL and/or Database Admin – Scripting language of your choice (not already mentioned) _____________ – People Management – Project Management 怎么获得这些能力 打好基础:程序语言、系统原理、中间件、理论知识学习效率:与人讨论、自己动手实践、教授别人,是为主动学习。(开个博客吧)挑选一手知识和信息源。注意原理和基础。使用知识图谱。学会举一反三。总结和归纳。实践和坚持。
收到包含无效cookie的cookie头[1597904809; JSESSIONID=410E5AB8E2E97F02AB95C8C77A896ECA]。将忽略该cookie。?注意:此错误的进一步
我发现当我发送URL请求时,部署在tomcat上的API可以捕获cookie,尽管有tomcat警告,是由于没有相应的存储cookie的部分,将会把cookie忽略。
下面是把静态数据存入到 cookie中(cookie的储存)
4.1。Set-Cookie
Set-Cookie HTTP响应标头用于从
服务器到用户代理。
4.1.1。句法
Set-Cookie响应标头非正式地包含标头名称
“ Set-Cookie”后跟一个“:”和一个cookie。每个Cookie都以
名称-值对,后跟零个或多个属性-值对。
服务器不应发送不符合要求的Set-Cookie标头
set-cookie-header =“ Set-Cookie:” SP set-cookie-string
set-cookie-string = cookie-pair *(“;” SP cookie-av)
cookie-pair = cookie-name“ =” cookie-value
cookie名称=令牌
cookie值= * cookie八位字节/(DQUOTE * cookie八位字节DQUOTE)
cookie八位位组=%x21 /%x23-2B /%x2D-3A /%x3C-5B /%x5D-7E
; US-ASCII字符,不包括CTL,
; 空白DQUOTE,逗号,分号,
; 和反斜杠
令牌= <令牌,在[RFC2616]第2.2节中定义>
cookie-av = expires-av / max-age-av / domain-av /
path-av / secure-av / httponly-av /
扩展名
expires-av =“ Expires =” sane-cookie-date
anaconda基础教程 一、anaconda下载安装1、windows系统2、linux系统 二、基本技术路线三、换源操作(windows和linux均适用)四、基本使用方法(windows和linux相同) 一、anaconda下载安装 1、windows系统 去anaconda官网:https://www.anaconda.com/products/individual下载安装anaconda个人版,然后安装,安装过程中会有很多选项和提示说明,写得很清楚,需要仔细阅读,按照自己的需要勾选选项。
2、linux系统 从https://repo.continuum.io/archive/index.html上下载对应版本的Anaconda。
比如:选择安装Anaconda3-5.0.1-Linux-x86_64.sh,(对应python3.6,x64系统)可以采用下列命令。
wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh 下载完成之后,执行bash Anaconda3-5.0.1-Linux-x86_64.sh命令进行安装,特别需要注意的是,安装过程中它会提示你是否执行初始化?一定要选择是!否则会很麻烦的!
二、基本技术路线 anaconda的UI主界面大概长这个样子:
在这里需要选择一种交互方式,比如cmd,jupyter,PowerShell等,我在这里选择PowerShell,因为感觉PowerShell比cmd好用(语法规则更优雅一些?)。
使用conda config --show命令来查看全部基础设置,包含日志输出控制、源等信息。(值得一提的是cmd和PowerShell是共享配置的,其他交互平台不知道是不是共享的,没有进行测试。)
三、换源操作(windows和linux均适用) anaconda默认源太慢了!必须换源!
换源指令如下:
conda config --remove-key channels # 先把原来的源都删掉(不过会默认留下defaults源) # 然后添加上海交通大学开源镜像站(最好不要用清华源,清华源很慢!) conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/ # 下面这个是用来设置输出信息的,安装各种依赖的时候,会在Shell输出源信息 conda config --set show_channel_urls yes conda config --set ssl_verify true 或者添加清华源:
conda config --remove-key channels # 先把原来的源都删掉(不过会默认留下defaults源) # 然后添加清华源 conda config --add channels https://mirrors.
文章目录 selenium设置请求的Cookieselenium设置请求的Token selenium设置请求的Cookie 设置Cookie,首先要获取请求连接的Cookie,根据F12开发者工具/各种抓包工具都可以
注意cookie格式是key-value的格式
# 获取cookie cookies=browser.get_cookies() print(cookies) #添加cookie browser.add_cookie({'name': '...', 'value': '...'}) selenium设置请求的Token 有些网站不用Cookie有自己的Token,我们也可以试试设置本地存储一下Token
#获取token token=browser.execute_script('window.localStorage.getItem("token")') print(token) # 设置添加Token js = 'window.localStorage.setItem("token", "token值")' browser.execute_script(js) 本人实践中设置Token时,可以成功添加Token,但是还会跳转到登陆页面解决方法:在写一个get请求连接即可解决,可以直接打开页面请求 browser.get('http://登陆........') # 设置Token后,在调试过程中进行F12查看是否成功添加了Token browser.get('http://具体页面........')
【问题描述】
今天用pycharm新建工程突然提示:编译环境有问题,简单写了两行代码测试一直有问题, 报错如下:
Fatal Python error: init_sys_streams: can’t initialize sys standard streams
【原因分析】
找了很多解决方案,结合错误提示,还是问题发生在虚拟环境下lib目录中的io.py身上,网上有好多老铁说改文件名字,然而证明并没有什么用,认真看下文件信息和内容发现并无区别,最后突然发现io.py的生成日期不对,恒新鲜,不是新建环境的那个日期,问题就出在这里,
【解决方案】因为都是标准文档,所以我们只需要把虚拟环境中,有io.py的生成日期为环境生成日期的io.py拷贝并替换掉日期异常的io.py文件问题瞬间解决。坑了我小半天的时间,真心无语。
io.py一般在虚拟环境的Lib目录下,具体代码如下:
"""The io module provides the Python interfaces to stream handling. The builtin open function is defined in this module. At the top of the I/O hierarchy is the abstract base class IOBase. It defines the basic interface to a stream. Note, however, that there is no separation between reading and writing to streams; implementations are allowed to raise an OSError if they do not support a given operation.
https://wenku.baidu.com/view/bf8ca1a0998fcc22bcd10dfd.html?sxts=1540872677307
黑客秘籍:渗透测试实用指南
When I was in college, my university built a “green” (a fancy field for people to hang out in the middle of campus). Instead of building paths immediately through the green, the university waited until “natural” dirt paths were built — and then paved those paths.
当我上大学时,我的大学建立了一个“绿色”(供人们在校园中间闲逛的理想场所)。 这所大学没有立即建立穿过绿色的道路,而是等到建立了“自然”的土路,然后才铺好这些路。 Why did they do this? I imagine, they did this because they didn’t know the exact paths that people would take or how the field would be used — and left it to the users of the field to figure it out.
IP 定位框架 GeoIP2 for Java 一、GeoIP2 简介二、GeoIP2 使用1、下载离线库2、添加 Maven 依赖3、封装 IP 定位工具类 三、GeoIP2 总结 一、GeoIP2 简介 GeoIP 官网:https://www.maxmind.com/en/geoip2-services-and-databases
MaxMind 是位于马萨诸塞州的数字地图公司,提供全世界的 IP 地址的位置数据。MaxMind 的定位服务在全球范围内享有盛誉,是应用最广泛的定位服务。其提供 Geoip 和 Geoip2 两个版本的 IP 地址定位服务,并提供开放源代码数据 GeoLite2,GeoLite2 数据库是 GeoIP2 的免费版,其准确率稍低于付费版。
GeoLite2 数据库由几部分组成:GeoLite2 国家库、GeoLite2 城市库和 Geolite2 ASN。他们分别满足不同的功能,GeoLite2 国家库仅能查询 IP 地址所在的国家和洲;GeoLite2 城市库可以查询到 IP 地址所在的国家、地区、城市、经纬度和邮政编码等信息;Geolite2 ASN 用于查询IP地址所属的自治域 AS 或者运营商 ISP。
GeoLite2 离线数据库每月更新一次,可以通过官方网站下载 MaxMind DB 格式的压缩文件。MaxMind 提供支持 7 种编程语言或软件的 API 支持,包括 C#、C、Java、Perl、PHP、Python、Apache(mod_maxminddb)。还有许多第三方 API 支持更多种编程语言或软件。GeoLite2 支持包括英语、汉语、俄语、日语和西班牙语等在内的多种语言。
二、GeoIP2 使用 1、下载离线库 官方下载地址:https://dev.maxmind.com/geoip/geoip2/downloadable/
百度网盘:https://pan.baidu.com/s/1BMirxMxrGN6G6qZwH597Cg 提取码: vxsb
Java对象的内存布局及堆内存划分 前言对象的指向Java内存模型Object obj=new Object()占用字节 对象的访问句柄访问和直接指针访问对比 堆内存Young区Old区名词扫盲一个对象的人生轨迹图 总结 前言 上一篇我们分析了Java虚拟机方法执行流程及方法重载和方法重写原理,并分析了方法的调用过程及原理,Java虚拟机栈是线程私有的,没有数据安全问题,而堆相比较于Java虚拟机栈而言更为复杂,因为堆是所有线程共享的一块内存空间,会出现线程安全性问题,而垃圾回收也主要是回收堆内空间,所以堆内的布局我们非常有必要深入去了解一下。现在就让我们继续来分析一下堆内布局以及Java对象在内存中的布局把。
对象的指向 先来看一段代码:
package com.zwx.jvm; public class HeapMemory { private Object obj1 = new Object(); public static void main(String[] args) { Object obj2 = new Object(); } } 上面的代码中,obj1 和obj2在内存中有什么区别?
我们先来回忆一下JVM系列1的文章中有提到,方法区存储每个类的结构,比如:运行时常量池、属性和方法数据,以及方法和构造函数等数据。所以我们这个obj1是存在方法区的,而new会创建一个对象实例,对象实例是存储在堆内的,于是就有了下面这幅图(方法区指向堆):
而obj2 是属于方法内的局部变量,存储在Java虚拟机栈内的栈帧中的局部变量表内,这就是经典的栈指向堆:
这里我们再来思考一下,我们一个变量指向了堆,而堆内只是存储了一个实例对象,那么堆内的示例对象是如何知道自己属于哪个Class,也就是说这个实例是如何知道自己所对应的类元信息的呢?这就涉及到了一个Java对象在内存中是如何布局的。
Java内存模型 对象内存中可以分为三块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),以64位操作系统为例(未开启指针压缩的情况) Java对象布局如下图所示:
其中对象头中的Mark Word中的详细信息在文章synchronized锁升级原理中有详细介绍。
上图中的对齐填充不是一定有的,如果对象头和实例数据加起来刚好是8字节的倍数,那么就不需要对齐填充。
知道了Java内存布局,那么我们来看一个面试问题
Object obj=new Object()占用字节 这是网上很多人都会提到的一个问题,那么结合上面的Java内存布局,我们来分析下,以64位操作系统为例,new Object()占用大小分为两种情况:
未开启指针压缩
占用大小为:8(Mark Word)+8(Class Pointer)=16字节开启了指针压缩(默认是开启的)
开启指针压缩后,Class Pointer会被压缩为4字节,最终大小为:
8(Mark Word)+4(Class Pointer)+4(对齐填充)=16字节 结果到底是不是这个呢?我们来验证一下。
首先引入一个pom依赖:
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.
本文翻译自:This project references NuGet package(s) that are missing on this computer
I have an ASP.NET MVC5 application that worked yesterday and now I am getting this error when I try to build: 我有一个昨天运行的ASP.NET MVC5应用程序,现在尝试构建时出现此错误: This project references NuGet package(s) that are missing on this computer. 该项目引用了此计算机上缺少的NuGet软件包。 I have the two options checked that allow nuget to automatically download and install missing packages checked / turned ON. 我选中了两个选项,它们允许nuget自动下载并安装已选中/已打开的缺少软件包。 I have also tried deleting all of the files in the packages folder and then have nuget re-download them.
1.报错如下:[Err] 1046 - No database selected
2.错误造成原因:
直接在连接位置上右击选择了运行sql文件
3.解决方法:
第一步:连接位置右键新建一个数据库,数据库名称跟要导入的数据库名称相同;
第二步:在数据库位置右键运行sql文件;
第三步:点开始就可以运行成功了!显示Successsfully;
注意:导入成功之后刷新可能数据库表还没有出来,这时候可以先关闭数据库再打开就会显示了。
使用mvn编译一个java project: mvn clean compile exec:java
结果出现如下错误:
[INFO] [INFO] — exec-maven-plugin:1.5.0:java (default-cli) @ snmpclient — [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11.477 s [INFO] Finished at: 2018-11-11T10:31:08+08:00 [INFO] Final Memory: 23M/125M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:java (default-cli) on project snmpclient: The parameters ‘mainClass’ for goal org.codehaus.mojo:exec-maven-plugin:1.5.0:java are missing or invalid -> [Help 1] 用百度找到一条相关的结果:https://www.aliyun.com/jiaocheng/799238.html, 解决了问题,在pom文件添加如下解决:
<build> <plugins> ...... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>pl.
分布式训练允许扩大深度学习任务,因此可以学习更大的models或以更快的速度进行训练。在之前的教程中,我们讨论了如何MirroredStrategy在单个节点(物理机器)内实现多GPU训练。在本教程中,我们将解释如何在多个节点之间进行分布式训练。本教程包括:
用于多节点分布式培训的代码样板。示例代码在多台计算机上运行。 要重现本教程,请参考TensorFlow 2分布式培训 github repository。
代码样板
与单节点内的多GPU训练相似,多节点训练也使用分布式策略。在这种情况下,tf.distribute.experimental.MultiWorkerMirroredStrategy。多节点训练还需要设置TF_CONFIG环境变量。请注意,每个节点上的环境变量都会略有不同。例如,这是worker 0两节点分布式培训作业中的设置:
os.environ["TF_CONFIG"] = json.dumps({ 'cluster': { 'worker': ["10.1.10.58:12345", "10.1.10.250:12345"] }, 'task': {'type': 'worker', 'index': 0} }) 本质上,TF_CONFIG是一个JSON字符串,代表集群并标识该机器在该集群中的角色。上面的代码设置了TF_CONFIG环境变量,也可以使用命令行导出或将其作为shell命令的前缀进行设置,例如:
TF_CONFIG='{"cluster": {"worker": ["10.1.10.58:12345", "10.1.10.250:12345"]}, "task": {"index": 0, "type": "worker"}}' python worker.py cluster所有节点上的字段均相同。它描述了如何设置群集。在这种情况下,我们的集群只有两个工作节点,其IP:port信息列在worker阵列中。该task场从节点到不同的节点。它指定节点的类型和索引,然后将其用于从cluster字段中获取详细信息,并提供给任务管理器以划分工作。在这种情况下,此配置文件指示培训作业在工作程序0上运行,即"10.1.10.58:12345"
我们需要为每个节点自定义此python代码段。因此,第二个节点将具有'task': {'type': 'worker', 'index': 1}。
然后,我们需要创建分布式策略:
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy() 注意,此行必须TF_CONFIG在定义数据管道和模型之后以及在定义数据管道和模型之前完成。否则,Collective ops must be configured at program startup将触发错误。
代码样板的最后一部分定义了策略范围内的模型:
with strategy.scope(): model = resnet.resnet56(img_input=img_input, classes=NUM_CLASSES) model.compile( optimizer=opt, loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy']) model.fit(train_dataset, epochs=NUM_EPOCHS) 进行训练
要运行分布式培训,需要自定义培训脚本并将其复制到所有节点。为了更加清楚,我们可以使用前缀语法设置环境变量。各个节点的设置不同。
一、什么是docker 镜像 就是把业务代码,可运行环境进行整体的打包
二、如何创建docker镜像: 现在docker官方共有仓库里面有大量的镜像,所以最基础的镜像,我们可以在公有仓库直接拉取,因为这些镜像都是原厂维护,可以得到即使的更新和修护。
Dockerfile: 我们如果想去定制这些镜像,我们可以去编写Dockerfile,然后重新bulid,最后把它打包成一个镜像,这种方式是最为推荐的方式包括我们以后去企业当中去实践应用的时候也是推荐这种方式。
Commit : 当然还有另外一种方式,就是通过镜像启动一个容器,然后进行操作,最终通过commit这个命令commit一个镜像,但是不推荐这种方式,虽然说通过commit这个命令像是操作虚拟机的模式,但是容器毕竟是容器,它不是虚拟机,最好还是使用dockerfile创建。
三、docker镜像的分层结构 四、Docker 镜像使用 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:
1、管理和使用本地 Docker 主机镜像 2、创建镜像 12 列出镜像列表 我们可以使用 docker images 来列出本地主机上的镜像。
[root@server1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 4e5021d210f6 2 weeks ago 64.2MB 123 各个选项说明:
REPOSITORY:表示镜像的仓库源 TAG:镜像的标签 IMAGE ID:镜像ID CREATED:镜像创建时间 SIZE:镜像大小 123456789 同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:
输入:intervals = [[1,4],[3,6],[2,8]] 输出:2 解释:区间 [3,6] 被区间 [2,8]
覆盖,所以它被删除了。
提示:
1 <= intervals.length <= 1000 0 <= intervals[i][0] < intervals[i][1]
<= 10^5 对于所有的 i != j:intervals[i] != intervals[j]
解法: public static void main(String[] args) { int [][] data =new int[][] {{3,10},{4,10},{5,11}}; int i = removeCoveredIntervals(data); System.out.println(i); } public static int removeCoveredIntervals(int[][] intervals) { int [] tmp = new int[intervals.
符号说明 x , x 0 , x t , △ x \textbf{x},\textbf{x}_0,\textbf{x}_t,\triangle\textbf{x} x,x0,xt,△x都是nx1的列向量。
x t , i \textbf{x}_{t,i} xt,i代表向量 x t \textbf{x}_t xt的第i个元素,是个常量。
f ( x ) f(\textbf{x}) f(x)为 x \textbf{x} x的函数,是一个常量。
基本思想 梯度下降法的基本思想非常简单,想象一下自己在一个盆地中,现在需要进入到盆地最底部,那么最简单的方式就是一直往下走,直到不能再向下走为止,此时就到达了盆地最底部。那么对于一个复杂的函数而言,找到一个合适的公式去描述这一简单的思想,就可以求出函数的极小值位置了。
算法推导 高维函数带有佩亚诺余项的一阶泰勒展开式如下
f ( x ) = f ( x 0 ) + ▽ f ( x 0 ) T ( x − x 0 ) + o ( ∣ ∣ x − x 0 ∣ ∣ ) f(\textbf{x})=f(\textbf{x}_0)+\triangledown{f(\textbf{x}_0)}^T(\textbf{x}-\textbf{x}_0)+o(||\textbf{x}-\textbf{x}_0||) f(x)=f(x0)+▽f(x0)T(x−x0)+o(∣∣x−x0∣∣)
点盾云视频加密安全解决方案自推向市场以来,得到了广大商家的认可,也解决了商家的视频安全困扰。为了让商家给学员更好的点盾云加密播放器使用指导,小编整理了一些学员在使用点盾云前的注意事项,希望对商家和学员都有帮助。
1、为什么不能开qq和WPS?
首先很多购买课程的同学是正常的观看行为,但不排除有些会对课程进行录屏,而一些常用的软件如QQ和WPS也具有类似功能,所以为了保护视频的安全性对这类程序做了处理。但对于有些不知道的学员来说,很容易造成误伤确实给点盾云的使用造成了不便。这本身是一个矛盾的过程,后续我们也会做一些优化,在保护视频安全的同时给播放器使用者尽可能的便利。但目前在使用时还是需要关闭下这些程序。
2、无需注册后台
学员使用点盾云无需在后台注册,只需下载安装对应平台的专用播放器,激活视频的时候拿到商家给的激活码,激活后观看即可。注册后台没有任何作用,还浪费时间,不过可以从点盾云官网下载Win版播放器和Mac版播放器。手机端的则除了官网外可直接从应用市场下载。
3、播放中遇到问题怎么办?
对于一些常规的问题,建议商家在给学员传加密视频的时候,把我们常见问题的处理方法网址也发给学员,可以按照操作说明去简单处理,一般都可解决。如果实在解决不了,可以直接联系我们,请详细表述问题,并把使用的是哪个平台的播放器以及播放器的版本号告诉客服。更多关于点盾云的问题,欢迎随时联系我们。
以前使用聊天工具与好友进行聊天,一般是以文字的方式,随着互联网的不断发展,现在聊天时使用的方式也在不断的增多,比如动态表情包已经成为聊天中必不可少的工具,越来越多的人开始自己的制作表情包。其实想要自己制作动画表情包制作是非常简单的,接下来教大家使用视频转gif(https://www.gif.cn/)功能来制作表情包的技巧,一起来看一下吧。
首先,准备好视频,然后点击“添加视频”功能,将视频上传到网站中来进行在线操作。
选择视频截取开始的时间,点击停止取图确定时长,点击取图完成,跳转到参数设置页面。
设置生成gif动图的宽或者高,播放的延迟值,删除水印设置下文本框中的链接即可下载无水印的gif图片,如果需要添加水印的话,可以在文本框中进行修改,勾选压缩选项,调整图片质量,图片质量越高,生成的gif动图清晰度越高,点击开始生成gif。
gif动图生成之后,点击下载图片,即可完成gif制作的全部过程。
大家可以根据以上的操作步骤,来完成gif动画表情包的制作,非常的简单。