Jquery操作复选框(CheckBox)的取值赋值实现代码

1. 获取单个checkbox选中项(三种写法): $("input:checkbox:checked").val() 或者 $("input:[type='checkbox']:checked").val(); 或者 $("input:[name='ck']:checked").val(); 2. 获取多个checkbox选中项: $('input:checkbox').each(function() { if ($(this).attr('checked') ==true) { alert($(this).val()); } }); 3. 设置第一个checkbox 为选中值: $('input:checkbox:first').attr("checked",'checked'); 或者 $('input:checkbox').eq(0).attr("checked",'true'); 4. 设置最后一个checkbox为选中值: $('input:radio:last').attr('checked', 'checked'); 或者 $('input:radio:last').attr('checked', 'true'); 5. 根据索引值设置任意一个checkbox为选中值: $('input:checkbox).eq(索引值).attr('checked', 'true');索引值=0,1,2.... 或者 $('input:radio').slice(1,2).attr('checked', 'true'); 6. 选中多个checkbox: 同时选中第1个和第2个的checkbox: $('input:radio').slice(0,2).attr('checked','true'); 7. 根据Value值设置checkbox为选中值: $("input:checkbox[value='1']").attr('checked','true'); 8. 删除Value=1的checkbox: $("input:checkbox[value='1']").remove(); 9. 删除第几个checkbox: $("input:checkbox").eq(索引值).remove();索引值=0,1,2.... 如删除第3个checkbox: $("input:checkbox").eq(2).remove(); 10.遍历checkbox: $('input:checkbox').each(function (index, domEle) { //写入代码 }); 11.全部选中 $('input:checkbox').each(function() { $(this).attr('checked', true); }); 12.全部取消选择: $('input:checkbox').each(function () { $(this).

mysql 存储过程:把昨天的数据找出来并保存到对应的月份分表

DELIMITER $$ CREATE PROCEDURE insertDataEveryday() BEGIN #把昨天的数据找出来插入到对应的月份分表 DECLARE v_tableName, v_time_begin,v_time_end,v_year,v_month ,v_month_current,v_yesterday VARCHAR(32); DECLARE v_sql VARCHAR(2000); DECLARE v_count int; #获取系统时间 select year(CURRENT_DATE) into v_year; #上个月 #select substr( DATE_ADD(CURDATE(),INTERVAL -1 MONTH),6,2)into v_month; #本月 select substr( CURDATE(),6,2) into v_month_current; #昨天 select DATE_SUB(curdate(),INTERVAL 1 DAY) into v_yesterday; #要插入数据的月份 select REPLACE(substr(DATE_SUB(curdate(),INTERVAL 1 DAY),1,7),'-','') into v_month; #获取时间起止 set v_time_begin=CONCAT('''',v_yesterday,' 00:00:00',''''); set v_time_end=CONCAT('''',v_yesterday,' 23:59:59',''''); #获取表名 set v_tableName=CONCAT('smp_equip_realtimedata_',v_month); #插入数据 set v_sql=CONCAT('insert into ', v_tableName,' (id,create_by,create_date,update_by,update_date,remarks,del_flag,equip_id,equip_code,equip_name,equip_type,func_code,data_lenth,uv_a,uv_b,uv_c,ia_a,ia_b,ia_c,leakage_current,temperature_i,temperature_ii,temperature_iii,temperature_iv,ta_trans_ratio,alarm_leakage_current,alarm_overload,alarm_short_circuit,alarm_overvoltage,alarm_under_voltage,alarm_broken_circuit,alarm_open_phase,alarm_phase_stagger,alarm_electric_arc,alarm_smoke_detector,alarm_flammable_gas,alarm_toxic_gas,alarm_temp_i,alarm_temp_ii,alarm_temp_iii,alarm_temp_iv,di1,di2,di3,di4,di5,di6,di7,di8,do1,do2,do3,do4,do5,do6,do7,do8,data_time,fault_leakage_current,fault_temp_i,fault_temp_ii,fault_temp_iii,fault_temp_iv,pt,active_energy,reactive_energy ) select id,create_by,create_date,update_by,update_date,remarks,del_flag,equip_id,equip_code,equip_name,equip_type,func_code,data_lenth,uv_a,uv_b,uv_c,ia_a,ia_b,ia_c,leakage_current,temperature_i,temperature_ii,temperature_iii,temperature_iv,ta_trans_ratio,alarm_leakage_current,alarm_overload,alarm_short_circuit,alarm_overvoltage,alarm_under_voltage,alarm_broken_circuit,alarm_open_phase,alarm_phase_stagger,alarm_electric_arc,alarm_smoke_detector,alarm_flammable_gas,alarm_toxic_gas,alarm_temp_i,alarm_temp_ii,alarm_temp_iii,alarm_temp_iv,di1,di2,di3,di4,di5,di6,di7,di8,do1,do2,do3,do4,do5,do6,do7,do8,data_time,fault_leakage_current,fault_temp_i,fault_temp_ii,fault_temp_iii,fault_temp_iv,pt,active_energy,reactive_energy from smp_equip_realtimedata a where a.

C# Legend 素材转换 Bmp转Png

传奇的资源里大致分为两种资源图片 一种是 黑色的纯色背景。 一种是 技能特效也是黑色背景 废话不多说 上代码 使用代码 Bitmap bitmap = new Bitmap("0.bmp"); bitmap = GeneralConvert(bitmap,Color.Black); bitmap.Save(@"0.png"); 普通资源图片转换 可去指定纯色的背景 keycolor 参数指定要透明的颜色 public unsafe Bitmap GeneralConvert(Bitmap mybm, Color keycolor) { var lpdata = mybm.LockBits(new Rectangle(new Point(0, 0), mybm.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); var Pixels = new byte[(mybm.Width * mybm.Height) * 4]; Marshal.Copy(lpdata.Scan0, Pixels, 0, Pixels.Length); fixed (Byte* p = &Pixels[0]) { for (int i = 0; i < Pixels.Length; i += 4) { var B = p[i]; var G = p[i + 1]; var R = p[i + 2]; var A = p[i + 3]; var b = keycolor.

常用函数总结

//统计文件中的行数,即数据文件中数据数目 int count(string file) { cout << "数据计数中..." << endl; ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行 string s; vector<string> ve; int num = 0; while (getline(infile, s)) { num++; } infile.close(); //关闭文件输入流 cout << "文件计数完毕..." << endl; return num; } //从一个数据文件中复制length个数据到新文件中 void copyData(string file, int length) { std::cout << "读取数据中..." << endl; ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行 string s; //char str; vector<string> ve; vector<Point> num; int aa = length; while (aa) { Point p; int i = 0; string num_s = "

mysql表无法修改,执行命令以后一直卡住问题

今天遇到个问题,要修改一个字段的数据类型,但是执行完 ALTER TABLE c2c_acceptant_info MODIFY email CHAR(50) NOT NULL;命令后一直卡住无法执行,ctrl+c中断后报error1317错误,终端窗口关了,忘记报错截图了。 首先执行: show full processlist; 列出当前的操作process,看到了很多waiting的process,说明已经有卡住的proces了。 show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。除非单独给这个用户赋予了PROCESS 权限。 查看正在执行的线程,并按 Time 逆排序 select * from information_schema.processlist where Command != 'Sleep' order by Time desc; 找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句,方便后面查杀 select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc; 我是没有使用kill杀进程,最直接有效的方法,重启mysql,就可以正常操作了。 kill processid。杀死进程,如:kill 10141,10141表示上面查询得到的id;

spring cannot resolve mvc view

controller会根据应用上下文中的viewResolver的路径查找视图是否存在,如果出现“cannot resolve mvc view”一般是路径配置错了 xml配置为例: <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> 转载于:https://www.cnblogs.com/lvjianwei/p/7993337.html

vue props default Array或是Object的正确写法

1、错误写法 demo:{ type:Array, default:[] } eslint语法报错: Invalid default value for prop “demo”: Props with type Object/Array must use a factory function to return the default value. 2、正确的写法应该是: demo: { type: Array, default: function () { return [] } } 或是用箭头函数: demo: { type: Array, default: () => [] } 3、对象的箭头函数写法: demoObj: { type: Object, default: () => ({}) } 或是常规 demoObj: { type: Object, default: function () { return {}

Postman以json形式向java后台传递对象和数组

Postman自测时以json形式向java后台传递对象和数组 一:json形式传递对象 首先我们以post请求传递json映射到对象中,看下请求内容,映射实体类和后台接收方式。 请求方式: 实体类: 后台接收: 总结: 1、前台拼接参数满足映射后台实体类的形式,可以通过上面的传递参数和实体类对比进行 2、后台接收参数的时候@requestBody后面的实体类参数随便起名,spring会把前台传的参数映射到实体类里,跟实体类的名字无关。 3、后台的headers = {"content-type=application/json"}可以用consumes = "application/json"替换。 4、consumes = "application/json"和products = "application/json"区别:顾名思义,consumes(消费)是指前台发送的形式,consumes = "application/json"代表前台发送的数据要是json,如果不是json形式的数据,对不起: consumes(消费)是指返回给前台的数据形式,products = "application/json"代表返回的数据形式要是json。 二:json形式传递数组 请求方式: 后台接收: 1、直接传成数组,postMan中选择application/json。ajax传的时候需要JSON.Stringfy(passport)。把数组序列化成json。 2、后台接收参数的时候@requestBody后面的数组名参数随便起名,Spring会把前台传的数组映射到接收的数组中,跟数组名字无关。 三:扩展 POST请求中(json形式传递参数时)的param和body的参数的区别: body中传的参数会映射到Object中,实体类或者List,Array甚至以Map接收,前提是参数拼的符合要求。 param中的参数会拼接在url中。可以通过request.getParameter("passport")或者 @RequestParam(value = "passport", required = true) String passport)获取到。 @ModelAttribute参数的用法 @ModelAttribute可以用来把有效参数(传的参数)映射到实体类中。当然不加的话Spring也可以帮你映射。 参数不同,不同接口的方法。 @RequestMapping(value = "/products/{productKey}/threads/{docId}/comments/{commentId}/action/{action:delete|recover}", method = RequestMethod.POST) 根据传入的参数给action变量赋值,这时候可以通过一个路径的两个变量的不同实现不同的业务。

【AI不惑境】计算机视觉中注意力机制原理及其模型发展和应用

大家好,这是专栏《AI不惑境》的第七篇文章,讲述计算机视觉中的注意力(attention)机制。 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考。如果说学习是一个从模仿,到追随,到创造的过程,那么到这个阶段,应该跃过了模仿和追随的阶段,进入了创造的阶段。从这个境界开始,讲述的问题可能不再有答案,更多的是激发大家一起来思考。 作者&编辑 | 言有三 Attention机制在近几年来在图像,自然语言处理等领域中都取得了重要的突破,被证明有益于提高模型的性能。Attention机制本身也是符合人脑和人眼的感知机制,这次我们主要以计算机视觉领域为例,讲述Attention机制的原理,应用以及模型的发展。 1 Attention机制与显著图 1.1 何为Attention机制 所谓Attention机制,便是聚焦于局部信息的机制,比如图像中的某一个图像区域。随着任务的变化,注意力区域往往会发生变化。 面对上面这样的一张图,如果你只是从整体来看,只看到了很多人头,但是你拉近一个一个仔细看就了不得了,都是天才科学家。 图中除了人脸之外的信息其实都是无用的,也做不了什么任务,Attention机制便是要找到这些最有用的信息,可以想见最简单的场景就是从照片中检测人脸了。 1.2 基于Attention的显著目标检测 和注意力机制相伴而生的一个任务便是显著目标检测,即salient object detection。它的输入是一张图,输出是一张概率图,概率越大的地方,代表是图像中重要目标的概率越大,即人眼关注的重点,一个典型的显著图如下: 右图就是左图的显著图,在头部位置概率最大,另外腿部,尾巴也有较大概率,这就是图中真正有用的信息。 显著目标检测需要一个数据集,而这样的数据集的收集便是通过追踪多个实验者的眼球在一定时间内的注意力方向进行平均得到,典型的步骤如下: (1) 让被测试者观察图。 (2) 用eye tracker记录眼睛的注意力位置。 (3) 对所有测试者的注意力位置使用高斯滤波进行综合。 (4) 结果以0~1的概率进行记录。 于是就能得到下面这样的图,第二行是眼球追踪结果,第三行就是显著目标概率图。 上面讲述的都是空间上的注意力机制,即关注的是不同空间位置,而在CNN结构中,还有不同的特征通道,因此不同特征通道也有类似的原理,下面一起讲述。 2 Attention模型架构 注意力机制的本质就是定位到感兴趣的信息,抑制无用信息,结果通常都是以概率图或者概率特征向量的形式展示,从原理上来说,主要分为空间注意力模型,通道注意力模型,空间和通道混合注意力模型三种,这里不区分soft和hard attention。 2.1 空间注意力模型(spatial attention) 不是图像中所有的区域对任务的贡献都是同样重要的,只有任务相关的区域才是需要关心的,比如分类任务的主体,空间注意力模型就是寻找网络中最重要的部位进行处理。 我们在这里给大家介绍两个具有代表性的模型,第一个就是Google DeepMind提出的STN网络(Spatial Transformer Network[1])。它通过学习输入的形变,从而完成适合任务的预处理操作,是一种基于空间的Attention模型,网络结构如下: 这里的Localization Net用于生成仿射变换系数,输入是C×H×W维的图像,输出是一个空间变换系数,它的大小根据要学习的变换类型而定,如果是仿射变换,则是一个6维向量。 这样的一个网络要完成的效果如下图: 即定位到目标的位置,然后进行旋转等操作,使得输入样本更加容易学习。这是一种一步调整的解决方案,当然还有很多迭代调整的方案,感兴趣可以去有三知识星球星球中阅读。 相比于Spatial Transformer Networks 一步完成目标的定位和仿射变换调整,Dynamic Capacity Networks[2]则采用了两个子网络,分别是低性能的子网络(coarse model)和高性能的子网络(fine model)。低性能的子网络(coarse model)用于对全图进行处理,定位感兴趣区域,如下图中的操作fc。高性能的子网络(fine model)则对感兴趣区域进行精细化处理,如下图的操作ff。两者共同使用,可以获得更低的计算代价和更高的精度。 由于在大部分情况下我们感兴趣的区域只是图像中的一小部分,因此空间注意力的本质就是定位目标并进行一些变换或者获取权重。 2.2 通道注意力机制 对于输入2维图像的CNN来说,一个维度是图像的尺度空间,即长宽,另一个维度就是通道,因此基于通道的Attention也是很常用的机制。 SENet(Sequeeze and Excitation Net)[3]是2017届ImageNet分类比赛的冠军网络,本质上是一个基于通道的Attention模型,它通过建模各个特征通道的重要程度,然后针对不同的任务增强或者抑制不同的通道,原理图如下。 在正常的卷积操作后分出了一个旁路分支,首先进行Squeeze操作(即图中Fsq(·)),它将空间维度进行特征压缩,即每个二维的特征图变成一个实数,相当于具有全局感受野的池化操作,特征通道数不变。 然后是Excitation操作(即图中的Fex(·)),它通过参数w为每个特征通道生成权重,w被学习用来显式地建模特征通道间的相关性。在文章中,使用了一个2层bottleneck结构(先降维再升维)的全连接层+Sigmoid函数来实现。 得到了每一个特征通道的权重之后,就将该权重应用于原来的每个特征通道,基于特定的任务,就可以学习到不同通道的重要性。 将其机制应用于若干基准模型,在增加少量计算量的情况下,获得了更明显的性能提升。作为一种通用的设计思想,它可以被用于任何现有网络,具有较强的实践意义。而后SKNet[4]等方法将这样的通道加权的思想和Inception中的多分支网络结构进行结合,也实现了性能的提升。

浅谈图像分割算法

文章目录 FCNUnetSegNetPSPNetDeepLab 系列(V1-V4)RefineNetLarge_kernel_Matters 目前比较有名的图像分割算法当属,Unet,SegNet,FCN,DeepLab 系列,RefineNet,PSPNet,Large kernel Matter 等。本文旨在对这写分割算法进行一个简单的总结比较,不会对文章的细节细抠,因为不同的文章肯定有很多不一样的实现细节,所以如果对相关网络及思想感兴趣的读者可以自行阅读原论文。 后续对一些高效的分割网络,例如 ENet, DFANet 等 FCN FCN 是一篇很经典的工作,是第一次实现使用全卷积网络可以端到端训练来进行语义分割任务,并且模型并不需要任何的前置处理和后置处理。 文章主要是将当前分类网络的全连接层(也是限制网络输入图像分辨率的主要原因)看作是卷积核覆盖了整张图的卷积层。经过等效转换以后就可以使用全卷积网络,并且可以使用分类任务中训练好的预训练权重了,最后加入解卷积层的操作来进行像素级别的类别预测。 文中使用的提前特征的网络结构是 VGGNet, 然后加入了多级合并的结构来得到更精细的结果,上采样过程中,如果遇到前后尺寸上采样后不一样的情况,需要使用 Crop 操作,从大尺寸的特征图中心裁剪层一样尺寸然后融合,具体的结构图下图(图片参考自本小节的链接博客): 下面这篇文章介绍的挺详细的,有兴趣的可以看一下: https://blog.csdn.net/qq_36269513/article/details/80420363 Unet 其首次提出是主要应用在医学图像分割领域,因为医学图像相对来说结构固定单一,数据量少,并且需要分割的很精细,文中提出了 Unet网络,以及对应的医学图像的增广方式来进行医学图像的检测任务。其网络结构以型似 U 型而得名,其中有跨层连接(Concat)的操作,为的就是弥补编码器部分下采样信息的损失。网络结构方面编码器部分是使用了 VGGNet 作为主干网络进行特征提取,应为输入的尺寸(572x572)并不是 2 的次幂,所以在解码器部分还涉及到编、解码器部分尺寸的对齐(Crop)操作,这里的上采样使用的是解卷积层(deconvolution layer)。 针对医学图像问题,为了边缘检测更准备,文中对原图片进行了边缘扩张,如下图所示,将红框边界部分都进行了镜像,以此来有更多的上下文信息预测后续黄色框中的区域,多余的区域在解码器过程中应该就通过 crop 操作去除掉了。 文中为了加强细胞的边缘学习,还用了形态学的方法,得到一张细胞边缘权重图,是边缘的地方给予 Loss 更大的权重去训练网络,取得最后分割输出。 SegNet 相较于 Unet, SegNet 也是使用了 VGGNet 作为主干网络来提取特征,很大的区别就是在解码器部分,在文中 SegNet 的提出重点是场景分割,需要场景分割的图片特性是,需要有能力去分辨不同类别物体的外貌特性(道路、建筑),形状特性(车、人),并且一些空间关系(主道路和路边),以道路分割为例,可能一张图中大部分是道路和建筑,车辆或者行人所占的像素很少,那么车辆和行人更多的就需要根据它们的边缘形状信息来判断,所以本文的主要特点就是上采样方式的不同。在解码器端 SegNet 主要是利用解码器端使用 MaxPooling 时的索引信息上采样(Caffe 框架下,使用了一个索引矩阵来存储 MaxPooling 选择的最大值的位置信息),以此来尽可能保住物体的边缘及形状信息。 文中基于 FCN 包括不同的上采样方式:双线性插值,MaxPooling索引,解卷积学习。做了几个不同模型的对比实验,具体感兴趣的读者可以前往阅读原论文。 PSPNet 本片论文主要讨论的点是场景分割的过程种有很多物体是很难被分割准确的,我们需要更多的上下文信息(例如,一个 船 很可能被错分割成 车 ,但是如果加上上下文信息,既 船 周围的像素被分割成了 水, 这样被分割成 车 的概率就会小很多),主要网络如上图所示,是从图像金字塔中获得的灵感,巧妙的点是,作者把这个思路很好的应用在了分割这种像素级别的分类任务中。

CBAM: Convolutional Block Attention Module—— channel attention + spatial attention

影响卷积神经网络的几大因素: Depth: VGG, ResNetWidth: GoogLeNetCardinality: Xception, ResNeXtAttention:channel attention, spatial attention Attention在人类感知系统中扮演了重要角色,人类视觉系统的一大重要性质是人类并不是试图一次处理完整个场景,与此相反,为了更好地捕捉视觉结构,人类利用一系列的局部瞥见,选择性地聚焦于突出的部分。 CBAM其实就是顺序进行channel attention和spatial attention: Channel attention: focus on what feature map is meaningful; 全连接层是使用卷积核=1的卷积实现的Spatial attention:focus on where is an informative part;沿channel 轴的求均值操作 Attention和fature map是元素级别的相乘,相乘时会自动进行broadcast(copy)操作,即channel attention沿着spatial维度广播,spatial attention沿着channel维度广播 class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // 16, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // 16, in_planes, 1, bias=False) self.

使用python操作mysql数据库

PyMySQL的安装 python3:pip install Pymysql python连接数据库 一: import pymysql db = pymysql.connect("数据库ip","用户","密码","数据库" ) # 打开数据库连接 cursor.execute("SELECT VERSION()") # 使用 execute() 方法执行 SQL 查询 data = cursor.fetchone() # 使用 fetchone() 方法获取单条数据 print ("Database version : %s " % data) db.close() 二: import pymysql #打开数据库连接 主机地址 端口号3306 用户名 密码 数据库名 db = pymysql.Connect(host="localhost",port=3306,user="root",password="wzc27229",db="test",charset="utf-8") #创建一个游标对象 cursor=db.cursor() print(db) 更多参数: import pymysql conn = pymysql.connect( host='localhost', user='root', password="root", database='db', port=3306, charset='utf-8', ) cur = conn.cursor(cursor=pymysql.cursors.DictCursor) 创建表操作 import pymysql # 打开数据库连接 db = pymysql.

我的小车调试进度之:实现超声波测距并显示

小车调试进度六更~~ 利用定时器的输入捕获功能得到ECHO口高电平持续的时间,进而得到距离。 关于超声波模块HC-SR04 超声波测距模块工作原理: (1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; (4)本模块使用方法简单,一个控制口(Trig)发一个10US以上的高电平,就可以在接收口(Echo)等待高电平输出。 关于定时器的输入捕获功能 通用定时器以及高级定时器都具有输入捕获功能,且每个定时器都有四路输入捕获通道;利用定时器的输入捕获功能捕获Echo口的高电平(先捕获一个上升沿,再捕获一个下降沿,即可判断捕获到高电平),进而可得到高电平的持续时间;超声波模块的Echo引脚需要接入定时器的一路输入捕获通道(也就是和定时器的某个通道的GPIO口相连),如图: 我是将Echo接到了PB0口上,也就是定时器三的通道三上,所以我们在配置定时器时,需要把通道三设置为捕获模式,且初始化设置为上升沿捕获,这样一旦捕获到一个上升沿就会进入中断,我们在中断里再将捕获方式设置为下降沿捕获,并将计数器清零,那么下一次捕获到下降沿时才会再进入中断,则此时的计数值即为高电平的计数值,再经过处理后可转换为实际的高电平持续时间,进而可得到距离,思路就是这样,里面还有一些处理的细节,先看程序叭。 TIM3_CH3(通道三)输入捕获初始化 /*TIM3_CH3(通道三)输入捕获初始化*/ TIM_ICInitTypeDef TIM3_ICInitStructure; void TIM3_Cap_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB0 输入(ECHO) GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB1输出(Trig) GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //2M GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化定时器3 TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.

PostgreSQL安装配置

一、前置准备 参考网站: 官网下载安装方式:https://www.postgresql.org/download/linux/redhat/ 安装版本:PostgreSQL11 系统版本:CentOS7 二、开始安装 1)通过yum进行安装 yum install postgresql-server 2)初始化数据库 postgresql-setup initdb 安装完成。(操作真简单- -、) 三、初期配置 1)启动相关 #开机启动 systemctl enable postgresql.service #启动 systemctl start postgresql.service #重启 systemctl restart postgresql.service #查看状态 systemctl status postgresql.service #停止 systemctl stop postgresql.service 2)简单配置 a,设置密码 #切换用户环境 su - postgres #进入pgsql psql -U postgres #修改密码 alter user postgres with password 'new password'; #退出 \q #退出当前用户 exit b,修改配置文件 配置文件路径:/var/lib/pgsql/data 修改postgresql.conf #原配置 #listen_addresses = 'localhost' # what IP address(es) to listen on; ↓ #修改后 listen_addresses = '*' # what IP address(es) to listen on; 修改pg_hba.

基于kibana的Dev Tools控制板上es常用查询语句

基于kibana的Dev Tools控制板的es常用查询语句: 1、集群相关 --- 查询集群健康状态 GET _cluster/health --- 查询所有节点 GET _cat/nodes --- 查询索引及分片的分布 GET _cat/shards --- 查询所有插件 GET _cat/plugins 2、索引相关查询 --- 查询所有索引及容量 GET _cat/indices --- 查询索引映射结构 GET my_index/_mapping --- 查询所有索引映射结构 GET _all --- 查询所有的相同前缀索引 GET my-*/_search --- 查询所有索引模板 GET _template --- 查询具体索引模板 GET _template/my_template 3.索引的操作 1、写入索引模板 PUT _template/my_template { "template" : "my-*", "order" : 0, "settings" : { "number_of_shards" : 10, "number_of_replicas" : 0 }, "mappings": { "default": { "

kafka集成kerberos认证后的命令总结

有kerberos认证之后的kafka,先进行授权的操作 测试集群上的超级用户为kafka kinit -kt /etc/kafka/conf/kafka.keytab kafka 首先切换到安装的kafka的目录下,随后可以执行以下命令 1、创建topic的命令操作: 测试集群上的超级用户为kafka bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test01 2、查看消费组的积压情况命令 bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --new-consumer --command-config ../config/consumer.properties --group test01 --describe 3、查看所有消费组的信息的命令 bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --command-config ../config/consumer.properties --new-consumer --list 4、消费某一个topic的数据的命令 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer.config ../config/consumer.properties --topic test01 --new-consumer 5、向一个topic中在控制台上生产数据的命令 bin/kafka-console-producer.sh --broker-list localhost:9092 --producer.config ../config/consumer.properties --topic test01

C++ 常用数学函数

一.头文件cmath.h或math.h中包含的常用数学函数,使用时要头文件引用,两者区别: 1.cmath是标准C++里面推荐使用的库。 math是C语言的旧头文件. 2.用后面那个就好 math.h,前面那个如果没有C++对应的库会出错 用后面的一定不会出错. 二.常用的数学函数: 1.开平方 double sqrt(double x); 2.求常数e的x次方 double exp(double x); 3.求x的y次方 double pow(double x, double y); 4.求对数ln(x) double log(double x); 求对数lg(x) double log10(double x); 其他用换底公式 5.求x绝对值 int abs(x); long int abs(long int x); double fabs(double x); 6.取整函数 向上取整 : ceil(x)返回的是大于x的最小整数。 double ceil(double x); 如:ceil(10.5) == 11 ceil(-10.5) ==-10 向下取整 : floor(x) 返回的是小于或等于x的最大整数。 double floor(double x); 如:floor(10.5) == 10 floor(-10.5) == -11 fix (x) 朝零方向取整,如fix(-1.3)=-1; fix(1.

isotropy与anisotropy?各向同性与各向异性滤波?

这篇文章主要区分各向同性和各向异性滤波的区别,明白各向异性滤波的优点,熟悉适合各向异性滤波的应用场景. 双边滤波(bilateral filter)的原理大家都还熟悉吗?双边滤波是一种非线性滤波器,优点是可以保持边缘,使得降噪平滑,双边滤波虽然采用邻域图像像素加权,但是,双边滤波的权重不仅考虑了像素的欧式距离(位置对中心像素的影响),还考虑了像素范围域中的辐射差异(像素与中心像素之间的相似程度,颜色强度,深度距离等),在计算中心像素的时候,需要同时考虑这两个权重. 双边滤波的核函数是空间域核与像素范围域核综合的结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保留可边缘信息.权重公式如下,可细细品味: 那么,各向异性滤波和双边滤波很像. 非均向性(anisotropy),或作各向异性,与各向同性相反,指物体的全部或部分物理、化学等性质随方向的不同而有所变化的特性,例如石墨单晶的电导率在不同方向的差异可达数千倍,又如天文学上,宇宙微波背景辐射亦拥有些微的非均向性。许多的物理量都具有非均向性,如弹性模量、电导率、在酸中的溶解速度等。 各向异性扩散滤波主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的,和双边滤波很像。

pip3 install mysqlclient 安装报错解决

CentOs7 pip3 install mysqlclient 安装报错解决 1、在通过 pip3 install mysqlclient 安装失败后我们可以选择源码安装: 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient 2、进入网站,ctrl+f 查询 mysqlclient ,注意第一个红圈指的是python的版本,一定要选对,第二个是系统位数,最好也选对 3、使用Xftp远程文件传输工具,把下载好的包传输到系统桌面,命令行 cd ~ 切回桌面,使用以下命令重新安装: pip3 install mysqlclient-1.4.2-cp36-cp36m-win_amd64.whl 4、如果运行时再次报错: ERROR: mysqlclient-1.4.2-cp36-cp36m-win_amd64.whl is not a supported wheel on this platform. 重新下载32位系统版本的试试,如果还是不行的话可以试试以下方法 5、查找到 mysql_config配置文件,命令行输入: sudo find / -name mysql_config 如果没有任何回应,说明并没有查找到 mysql_config 配置文件,该问题为缺少mysql源所导致的 6、下载安装mysql配置源: wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm # 根据自己mysql版本下载相对应的mysql配置源,作者菌的mysql版本为mysql8.0版本 7、查看提示是否下载成功: 8、安装mysql-devel依赖包: sudo yum install mysql-devel 9、再次执行 pip3 install mysqlclient 命令安装,安装成功!

pointRCNN 结果可视化

由于pointRCNN源码的训练和inference很详细,但是没有可视化的代码,本文介绍其3d框结果的可视化方法 1. 跑通pointRCNN https://github.com/sshaoshuai/PointRCNN pointRCNN的运行本文就不赘述了。 我是下载的作者训练好的模型,跑了一遍inference,因为生成的检测结果在下面可视化时会用到。 2. 将pointRCNN预测结果拷贝到KITTI数据集 pointRCNN的结果存储在:(里面包含000001.txt等等,存的是3d框的预测结果) PointRCNN/output/rcnn/default/eval/epoch_no_number/val/final_result 把整个文件夹复制到kitti数据集的training目录下,文件夹命名pred 数据组织结构如下: (注意,这里的training里面是全部7481张图,不然会报错没有000000.txt) kitti object testing calib image_2 label_2 velodyne training calib image_2 label_2 velodyne pred # 这个是需要自己复制过来的 3. 运行可视化源码kitti_object_vis 源码地址:https://github.com/kuixu/kitti_object_vis 下载源码并进到源码文件夹 git clone https://github.com/kuixu/kitti_object_vis 把上述kitti数据集的object/目录,链接到data/目录下过去,并命名为obj(因为这个源码需求) cd kitti_object_vis/data ln -s /home/ubuntu/dataset/KITTI/object obj 下载源码和源码所需的库(mayavi之类的),照readme里面去做 运行 命令分为几种: (1) 只显示LiDAR 仅真值 cd kitti_object_vis python kitti_object.py --show_lidar_with_depth --img_fov --const_box --vis # 终端按回车键进行下一张图 (2) 显示LiDAR和image 仅真值 python kitti_object.py --show_lidar_with_depth --img_fov --const_box --vis --show_image_with_boxes # 终端按回车键进行下一张图 (3) 显示特定某张图的LiDAR和image 仅真值

对kafka进行了kerberos认证之后,要topic和用户进行acl授权的操作

kafka的acl的授权命令大总结 对kafka进行了kerberos认证之后,要topic和用户进行acl授权的操作,因为最近使用kafka的acl的命令进行授权操作比较频繁,特意总结下来。不说废话了,直接上干货。 1、查看kafka集群所有的acl授权信息 ./kafka-acls.sh --authorizer-properties zookeeper.connect=com.hadoop.node01:2181 --list 示例结果如下: Current ACLs for resource `Topic:LITERAL:acl_test`: User:* has Allow permission for operations: Write from hosts: * User:kafka/com.hadoop.node01 has Allow permission for operations: Write from hosts: * User:kafka/com.hadoop.node01 has Allow permission for operations: Write from hosts: com.hadoop.node01 2、添加kafka的读acl权限 ./kafka-acls.sh --authorizer-properties zookeeper.connect=com.hadoop.node01:2181 --add --allow-principal User:aclTest --consumer --group=* --operation Read --topic acl_test 3、移除kafka的组 ./kafka-acls.sh --authorizer-properties zookeeper.connect=com.hadoop.node01:2181 --remove --allow-principal User:aclTest --group * --operation Read --operation Describe --force --resource-pattern-type MATCH --topic acl_test 4、添加kafka的producer写acl权限 .

最长单调子序列(动态规划)

最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。 例如: 对于序列(1, 7, 3, 5, 9, 4, 8),我们就会得到一些上升的子序列,如(1, 7, 9), (3, 4, 8), (1, 3, 5, 8)等等,而这些子序列中最长的(如子序列(1, 3, 5, 8) ),它的长度为4,因此该序列的最长上升子序列长度为4。 子串和子序列的概念: (1)字符子串指的是字符串中连续的n个字符,如abcdefg中,ab,cde,fg等都属于它的字串。 (2)字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序。如abcdefg中,acdg,bdf属于它的子序列,而bac,dbfg则不是,因为它们与字符串的字符顺序不一致。 子序列、公共子序列以及最长公共子序列都不唯一,但很显然,对于固定的数组,虽然LIS序列不一定唯一,但LIS的长度是唯一的。如:给出序列 ( 1, 7, 3, 5, 9, 4, 8),易得最长上升子序列长度为4,这是确定的,但序列可以为 ( 1, 3, 5, 8 ), 也可以为 ( 1, 3, 5, 9 )。 动态规划 :要求n个数的最长上升子序列,可以求前n-1个数的最长上升子序列,再跟第n个数进行判断。求前n-1个数的最长上升子序列,可以通过求前n-2个数的最长上升子序列……直到求前1个数的最长上升子序列,此时LIS为1。 样例输入: 7 1 7 3 5 9 4 8 样例输出: 4 代码实现: #include <iostream> #include <algorithm> using namespace std; int main() { int i,n,j; int a[110],b[110]; while(cin>>n) { for(i=0; i<n; i++) { cin>>a[i]; b[i]=1; } for(i=0; i<n; i++) for(j=0; j<i; j++) if(a[j]<a[i]) b[i]=max(b[i],b[j]+1); sort(b,b+n); cout<<b[n-1]<<endl; } return 0; }

tomcat设置字符集

在server.xml里加入 URIEncoding="UTF-8" <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> 转载于:https://my.oschina.net/u/2842177/blog/3080614

前端箭头函数的使用

箭头函数 1、箭头函数介绍 2、写法 3.箭头函数注意事项 学习链接 -----------------------欢迎大家学习!

第二周-python实战-youtube视频分析

python实践 前言:本文主要针对kaggle上的一份 数据集,内容是关于youtube热点视频的分析,用python进行了一些分析,主要用到的是pandas的一些方法,结合案例加以操作,巩固python知识。 # 引入模块 import pandas as pd import arrow from matplotlib import pyplot as plt %matplotlib inline # 导入数据集,因为数据是按国家/地区分开的,鉴于全部数据量太多,本文只选择了四个国家/地区的数据 # 导入youtube数据,将不同地区的文件拼接在一起 data = pd.DataFrame() for reg in ['CA', 'DE', 'FR', 'IN']: df = pd.read_csv(r'./data/youtube-new/{reg}videos.csv'.format(reg=reg)) df['country'] = reg data = pd.concat([df, data], ignore_index=True ) # 观察数据结构,可以看到description包含较多的空值 data.info() # 数据清洗 # 将趋势日期进行转换 data['trending_date'] = data['trending_date'].apply(lambda x: arrow.get(str('20'+x[:2]+'-'+x[6:8]+'-'+x[3:5]))) data['trending_year'] = data['trending_date'].apply(lambda x: x.year) # 统计每一年有多少个视频量,及占比,可看出2017占24%, 2018占76% video_num = data.groupby(['trending_year'])['video_id'].count().reset_index() video_num['rate'] = video_num['video_id']/data['video_id'].

Python函数系列之装饰器(三)

在Python中,装饰器的本质就是Python中的一个函数,其来源自Python面向对象。装饰器是在函数调用之上的修饰。这些修饰仅是当声明一个函数或方法的时候,才会被应用额外的调用。有点类似Java中的AOP(面向方面编程)。同时在设计模式中,还有装饰器模式,也即是:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。原则是:不修改被修饰函数的源代码,不修改被修饰函数的调用方式。 装饰器的用途: 引入日志 增加计时逻辑来检测性能 给函数加入事务的能力 权限校验 缓存 执行函数前/后的预备或清理功能等 例子: # -*- coding: utf-8 -*- import time def deco(func): #func = test1或test2 def wrapper(): start_time = time.time(); func(); #就是运行 test1()或者test2()函数 end_time = time.time(); print("此模块运行时间为:%s" %(end_time - start_time)); return wrapper; def test1(): time.sleep(3); print("函数Test1运行结束"); def test2(): time.sleep(3); print("函数Test2运行结束") #在没用使用装饰器调用时,如下调用 test1 = deco(test1) #返回的wrapper函数地址 test1() #执行的wrapper() test2 = deco(test2) test2() #若上面函数有上百上千个,都是那样调用,都是重复的代码调用,在Python中,使用@语法糖 #例如下面定义一个test3函数 @deco #就相等于 test3 = deco(test3) def test3(): time.sleep(3); print("函数Test-3运行结束"); test3() 运行结果如下:

【touch screen】Qt触摸屏原理及实现

Qt中触摸屏实现鼠标原理: Pointer Handling Layer The mouse driver (represented by an instance of the QWSMouseHandlerclass) is loaded by the server application when it startsrunning(当鼠标驱动需要运行时), using Qt’s pluginsystem. A mouse driver(即图中的Mouse Handler, 由QWSMouseHandler类或其派生类的实例描述)receives mouse events from the device and encapsulates each event with an instance ofthe QWSEvent classwhich it then passes to the server. Qt forEmbedded Linux provides ready-made(现成的) drivers for severalmouse protocols, see the pointerhandling documentation for details. Custom mouse drivers can beimplemented by subclassing the QWSMouseHandlerclass and creating a mouse driver plugin.

CPU-IO-网络-内核参数调优

一、 有关使用CPU资源的调优 1、 nice概述 在LINUX系统中,Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在LINUX系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。默认优先级是0 2、 调整命令运行优先级,让进城使用更多的CPU资源 语法:nice -n 优先级数字 命令 [root@xuegod120 ~]# nice -n -5 vim a.txt 另外终端查看vim的优先级 [root@xuegod120 ~]# ps -aux | grep vim root 23305 0.0 0.2 151264 4920 pts/0 S<+ 14:45 0:00 vim a.txt [root@xuegod120 ~]# top -p 23305 3、 使用renice修改正在运行进程的优先级 [root@xuegod120 ~]# renice -n 6 23305 23305 (process ID) old priority -5, new priority 6 4、 进程先级不能超过-20到19 会自动调整为最大和最小的优先级数值 5、 设置CPU的亲和力 taskset 作用:在多核的情况下,可以认为指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之前切换的开销。 5.1 安装taskset命令

Kafka学习之旅(六): Kafka生产者通信

一 简介 由官网可以了解到Kafka 所有组件(生产者,消费者,broker)之间的通信协议使用的是TCP,而不是使用的是HTTP 或者其他的通讯协议。那为什么他要去选择TCP而不使用HTTP呢?其实这里面的原因有很多,个人觉得最主要的原因在于 TCP 和 HTTP 之间的区别。 从社区的角度来看,在开发客户端时,人们能够利用 TCP本身提供的一些高级功能,比如多路复用请求以及同时轮询多个连接的能力。 什么是多路复用呢简单的介绍一下就是两个或者多个数据流合并到底层单一的物理连接中TCP 的多路复用请求会在一条物理连接上创建若干个虚拟连接,每 个虚拟连接负责流转各自对应的数据流。其实严格来说,TCP 并不能多路复用,它只是提供可靠的消息交付语义保证,比如自动重传丢失的报文。更严谨地说,作为一个基于报文的协议,TCP 能够被用于多路复用连接场景的前提是,上层的应用协议(比如 HTTP)允许发送多条消息。 二 Kafka是如何打开TCP 通信的 在创建 KafkaProducer 实例时,生产者应用会在后台创建并启动一个名为 Sender 的线程,该 Sender 线程开始运行时首先会创建与 Broker 的连接 下面可以给出一个测试例子来证明一下: public static void main(String[] args) { Map map=new HashMap<String,String>(); map.put("bootstrap.servers","localhost:9092"); map.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); map.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); KafkaProducer kafkaProducer=new KafkaProducer(map); // ProducerRecord producerRecord=new ProducerRecord("test-topic","id","1"); //kafkaProducer.send(producerRecord); //kafkaProducer.close(); } 下面给出一段日志: [12:55:31:581] [DEBUG] - org.apache.kafka.clients.Metadata.update(Metadata.java:290) - Updated cluster metadata version 1 to Cluster(id = null, nodes = [localhost:9092 (id: -1 rack: null)], partitions = [], controller = null) [12:55:31:885] [DEBUG] - org.

负载均衡种类及优缺点

负载均衡也不是什么新鲜词儿了,相信大家都有所了解,甚至有的人有过深入的学习和实操,那么本文就来把常见的负载均衡相关东东总结一下。 负载均衡种类 DNS,硬件,软件 DNS负载均衡 DNS是最简单也是最常见的负载均衡方式,一般用来实现“地理级别”的负载均衡,比如说:北方人访问北京的机房,南方人访问广州的机房,西方人访问成都的机房。DNS负载均衡的本质是DNS解析同一个域名可以返回不同的IP地址。比如说:https://www.sina.com.cn/ 在北方的用户使用时会解析成10.210.1.12(北京机房)返回,南方的用户使用时会解析成14.213.164.27返回(广州机房)。 DNS简单示意图 优点 简单、成本低:负载均衡工作交给DNS服务处理,无须自己开发或维护负载均衡设备。 就近访问,提升访问速度:DNS解析时可以根据请求来源IP,解析成距离用户最近的服务器地址,可以加快访问速度,从而到达改善性能。 缺点 更新不及时:DNS缓存的时间比较长,修改DNS陪之后,由于缓存的原因,会导致部分用户还会继续访问修改之前的地址,毫无疑问这样的访问会失败的,不仅达不到负载均衡的效果,更严重的是用户不能正常使用。 扩展性差:DNS负载均衡的控制权限不是使用者的,而是域名商那里,无法根据业务特点针对性做一些定制化功能,更别提扩展性了。 分配策略比较简单:DNS负载均衡支持的算法不多,不能区分服务器的差异,也无法感知后端服务的状态。 针对以上DNS的优缺点,也有部分公司自己实现了HTTP-DNS,即使使用HTTP协议实现一个私有的DNS系统,但是其实和上面的DNS优缺点刚刚相反。 硬件负载均衡 硬件负载均衡是通过单独的设备来实现负载均衡的功能,这类设备和路由器交换机有那么一些类似,更或者可以理解为一个用于负载均衡的基础网络设备。目前业界主要有两款硬件负载均衡:F5和A10。这类设备性能好,功能强大,但是价格可以用昂贵来形容,一般只有银行,国企等大型有钱的企业开会考虑使用此类设备,本人也只是在银行里见识过F5。至于A10没接触过就不撤了。 优点 功能强大:全面支持各层级的负载均衡,支持各种负载均衡算法,支持全局负载均衡。 性能好:一般软件负载均衡能支撑10w+并发已经很不错了,但是硬件的负载均衡却可以支持100w+以上的并发。 高稳定性:因为是商业品,所以经过了良好严格的测试,经过大规模的使用,所以稳定非常高。 安全性高:硬件负载均衡设备除了能处理负载均衡以外,还具有防火墙、防DDOS攻击等效果。 缺点 价格昂贵:我记得之前银行购买F5花了上百万,据说还有更贵的,所以价格可想而知。 扩展性不好:硬件设备可以根据业务进行配置,但无法进行扩展和定制化。 软件负载均衡 软件负载均衡是通过负载均衡软件来实现负载均衡功能的。常见的负载均衡软件有LVS和Nginx。其中LVS是Linux内核的四层负载均衡,四层和七层的区别在于他们协议和灵活性的不同。Nginx是7层负载均衡,支持HTTP,E-mail协议,而LVS是四层负载均衡,所以和协议无关,基本上所有应用都可以做到,比如说:聊天、数据库等。 以下是Nginx的负载均衡简单示意图: 优点 便宜:只要每个Linux服务器,然后装上Nginx或者其他负载均衡软件 灵活:7层和4层负载均衡可以根据业务进行选择,也可以根据业务进行比较方便的扩展,比如:由于业务特殊性需要做一些定制化的功能。 缺点 性能一般:比如说一个Nginx大约能支撑5w并发 功能没有硬件负载均衡强大(这个有点牵强,毕竟价格差距在那里) 安全性远不如硬件负载均衡。

推荐国外经典计算机教材9本

国外经典计算机教材9本推荐给你,其中前两本刚刚上架。你读过哪些经典教材欢迎一起来分享。 最新上架: 1、C++程序设计(第3版) 作者:[美]瑞克·莫瑟(Rick Mercer) 译者:凌杰 合没有编程经验的读者学习C++编程也适合有其他语言编程经验想要转向C++的读者学习。 本书是以C++编程语言来讲解计算基础知识和技能的实用教程。本书是作者数十年教学经验凝结的成果, 深入浅出地介绍对象和类的概念,帮助学生更好地学习计算机科学的第一门课,并为后续课程的学习打下坚实的基础。本书每一章都给出了自测题、练习题、编程技巧、编程项目等内容。附录部分给出了所有自测题的解答,供读者学习参考。 本书适合作为高等院校计算机专业程序设计、编程基础等课程的教材,也适合专业程序员和想要学习C++编程的读者阅读参考。 本书具有以下特色: 涵盖传统话题:本书致力于利用面向对象编程的相关性和有效性来介绍计算基础概念。遵循C++标准:支持C++14 或更新的标准。先讲对象:第3 版保留了之前两个版本先讲对象的方法。精心组织教学内容:让学生先专注于那些能丰富语言表达能力的部分,一些隐晦难懂的问题都放到了最后几章中。无需特定的C 系统:所有的材料都可以在任何支持C++标准的编译器系统中使用,并且所有代码都在Windows 的Microsoft Visual C++和UNIX 的GNU g++中通过了测试。引入算法模式:首先介绍了一种算法模式,即输入—处理—输出(IPO)模式,并在后续章节使用到它。此外,还在适当的场景中介绍Alternative Action、Indeterminate Loop等其他算法模式。进行了广泛而持续的教学测试:作者坚持在教学中使用并搜集学生、老师的反馈,不断更新、改进和完善,26年来连续推出了本书的3个版本。教学辅助资源齐全:包含自测题、练习题、编程技巧、编程项目等丰富的学习内容。书中大部分的C++代码以及相关PPT可从异步社区(http://www.epubit.com)下载。 2、编程原本 作者:[美] 亚历山大·斯特潘诺夫(Alexander Stepanov),[美]保罗·麦克琼斯(Paul McJones) 译者:裘宗燕 追溯数学原理,探求编程的本质本书作者是C++的STL之父Alexander Stepanov本书得到了C++之父Bjarne Stroustrup鼎力推荐。 本书将严格的数学定义、公理化和演绎方法应用于程序设计,讨论程序与保证它们正确工作的抽象数学理论之间的联系。本书把理论的规程、基于这些规程写出的算法,以及描述算法性质的引理和定理一起呈现给读者,以帮助读者将复杂系统分解为一些具有特定行为的组件。 本书适合软件开发人员和需要进行程序设计的科学家及工程师阅读,也可供高等院校计算机及相关专业的师生参考。 经典教材 1、操作系统导论 作者:[美] 雷姆兹·H.阿帕希杜塞尔( Remzi H. Arpaci-Dusseau), [美]安德莉亚·C.阿帕希杜塞尔(Andrea C. Arpaci-Dusseau) 译者:王海鹏 美国知名操作系统教材紧紧围绕操作系统的三大主题元素:虚拟化 并发和持久性进行讲解豆瓣原版评分9.7 本书围绕虚拟化、并发和持久性这三个主要概念展开,介绍了所有现代系统的主要组件(包括调度、虚拟内存管理、磁盘和I/O子系统、文件系统)。全书共50章,分为3个部分,分别讲述虚拟化、并发和持久性的相关内容。作者以对话形式引入所介绍的主题概念,行文诙谐幽默却又鞭辟入里,力求帮助读者理解操作系统中虚拟化、并发和持久性的原理。 本书内容全面,并给出了真实可运行的代码(而非伪代码),还提供了相应的练习,很适合高等院校相关专业的教师开展教学和高校学生进行自学。 2、人工智能(第2版) 作者:[美]史蒂芬·卢奇(Stephen Lucci),丹尼·科佩克(Danny Kopec) 译者:林赐 人工智能百科全书易于上手的人工智能自学指南涵盖机器学习 深度学习 自然语言处理 神经网络 计算机博弈等各种知识 图文详细 讲解细致 配备丰富的教学资源和学习素材美国经典教材,在美亚上,被评价为自Russell & Norvig的《人工智能:一种现代方法》之后更好的教材,更加适合本科生使用。 本书是作者结合多年教学经验、精心撰写的一本人工智能教科书,堪称“人工智能的百科全书”。全书涵盖了人工智能简史、搜索方法、知情搜索、博弈中的搜索、人工智能中的逻辑、知识表示、产生式系统、专家系统、机器学习和神经网络、遗传算法、自然语言处理、自动规划、机器人技术、高级计算机博弈、人工智能的历史和未来等主题。 本书提供了丰富的教学配套资源,适合作为高等院校人工智能相关专业的教材,也适合对人工智能相关领域感兴趣的读者阅读和参考。 3、软件工程(第4版•修订版) 作者:[美] 莎丽•劳伦斯•弗里格(Shari Lawrence Pfleeger)[加] 乔安妮•M.

scp覆盖命令

本地的/home/hadoop/hadoop-2.7.7 文件夹复制到另一条服务器下的/home/hadoop/ 下。 如下命令不会覆盖目标地址的同名文件夹 scp -r /home/hadoop/hadoop-2.7.7/ root@node1:/home/hadoop/hadoop-2.7.7 使用以下命令可覆盖。 scp -r /home/hadoop/hadoop-2.7.7/ root@node1:/home/hadoop/ 转载于:https://my.oschina.net/u/2842177/blog/3079806

darknet: ./src/utils.c:256: error: Assertion `0' failed.

1.darknet: ./src/utils.c:256: error: Assertion `0' failed. Aborted (core dumped) 2.darknet: ./src/cuda.c:36: check_error: Assertion `0' failed. Aborted (core dumped) makefile文件更改: GPU=1 CUDNN=1 OPENCV=0 OPENMP=0 DEBUG=0 ARCH= -gencode arch=compute_52,code=compute_52 \ #1060的算力5.2 GPU计算力不匹配的问题,建议修改,注意找到自己匹配的 下面的需要对应自己cuda文件路径: NVCC=/usr/local/cuda/bin/nvcc COMMON+= -DGPU -I/usr/local/cuda/include/ CFLAGS+= -DGPU LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand /darknet/cfg /yolov3.cfg中的更改如下: # Testing batch=1 subdivisions=1 # Training #batch=64 #subdivisions=16 darknet目录下打开Terminal: sudo ./darknet detector test cfg/coco.data cfg/yolov3.cfg weights/yolov3.weights data/dog.jpg 测试结果: Loading weights from weights/yolov3.weights...Done! data/dog.jpg: Predicted in 0.

简介Webkit中AtomicString

简要介绍一下webkit中有AtomicString 创建目的 为了解决字符的超快速比较以及节省内存而生 应用场景 AtomicString大部分应用在保存脚本关键字,或者出现频率很高的字符串,例如HTML的各种tag,它们出现很频繁,用AtomicString保存对后期的比较会非常快(对比指针就行)。 共享内存 同样的字符串内容,不同的AtomicString实例会使用同样一份字符串内存, 例如下面代码: AtomicString test2("123"); AtomicString test3("123"); test3不需要额外为保存“123”而开辟内存,内部会自动和test2共享一份内存。 缺点 1.因内部需要一系列数据结构处理,实例创建比较耗时,比普通的String创建速度慢; 2. 跨线程使用须谨慎,因为不同线程都自行维护一份AtomicString的数据结构,所以同样内容的AtomicString在不同线程并非共享同一份内存。不同线程的AtomicString实例比较可能会错误,例如test2可能会不等于test3。不可多线程访问同一个AtomicString. 本文结束。

安装配置JSP集成开发环境Eclipse,安装tomcat服务器教程

1.在你的电脑上安装JDK,输入一下网址,根据自己的电脑配置进行下载安装。 https://www.oracle.com/technetwork/java/javase/downloads/index.html 这里不过多讲解JDK的安装,网上类似的教程有好多,可以自行百度。 2.配置环境变量 打开 电脑 ->属性->高级系统设置 ->环境变量 ->系统环境变量。 如果你是第一次安装jdk,那么在系统环境变量中应新建java_home属性 变量值是你刚才安装JDK的路径。 下一步是配置path变量。找到path变量,点击编辑,到这一步 然后点击新建,路径是你刚下载好的jdk的bin目录下的路径,如图所示。 然后配置classpath变量,找到classpath变量,点击编辑 -》编辑文本 ,在最前面输入 .;"C:\Program Files\Java\jdk1.8.0_131\lib; 然后确定 ->确定 ->确定。 检测jdk是否安装正确, 在键盘输入window +R键 打开运行 ->输入cmd ->确定 ->打开cmd 输入javac,出现内容如图所示: 然后输入java,出现内容如下图所示: 最后输入 java -version,出现你安装的jdk的版本号: 这样就说明你的jdk安装好了。 接下来就是安装环境Eclipse ,输入以下网址: https://www.eclipse.org/downloads/ 然后点击download 64bit 然后点download 进行下载。 然后找到你下载的eclipse目录,进行安装 下载eclipse IDE for Java EE Developers 然后安装。 这样就安装成功了。 ps:由于我已经安装好了,所以最后这两张图我是在网上找的图,不要质疑它的真实性哦,如果有问题,给我留言就好啦。 接下来安装 tomcat服务器,输入tomcat的官网地址: http://tomcat.apache.org 点击左侧的Tomcat 8,(听说最新的版本一般不稳定,建议下载tomcat 8) 根据自己的电脑版本进行下载,我下载的是64 位的 这个是安装版本,建议下载除这个之外的其他版本。 点击对应的版本,右击 目标另存为 ->保存到你的电脑上。 解压安装在d盘下的tomcat文件夹中。 如图所示。 接下来,是tomcat的配置与测试 tomcat 的配置与jdk的配置相似,也要配置环境变量。 打开环境变量 ->新建环境变量 如图所示。点击确定,然后关闭此界面就ok啦。

IDEA关闭双击shift搜索框

转换中英文的时候,会弹出一个搜索框,很不方便,现在要把搜索框禁用掉 1、按ctrl+shift+a,弹出搜索框 2、输入registry,然后按回车 3、找到“ide.suppress.double.click.handler”,将后面的复选框勾上 如果回车之后没有出来“ide.suppress.double.click.handler”,那么慢慢按照字母顺序往下找就会找到 4、勾选上复选框后直接点击close,然后双击shift的时候就不会再出现全局搜索框了

机器学习相关速查表Cheat Sheet

写在前面 早上逛技术新闻时,看到的一个有意思的帖子,分享给大家:) 速查表内容包括(12项): kerasnumpypandasscipymatplotlibscikit-learnneural networks zooggplot2pysparkR studiojupyter notebookdask keras 图片来源——https://www.datacamp.com/community/blog/keras-cheat-sheet#gs.DRKeNMs numpy 图片来源——https://www.datacamp.com/community/blog/python-numpy-cheat-sheet#gs.AK5ZBgE pandas 图片来源——https://www.datacamp.com/community/blog/pandas-cheat-sheet-python#gs.HPFoRIc 图片来源2——https://www.datacamp.com/community/blog/python-pandas-cheat-sheet#gs.oundfxM scipy 图片来源——https://www.datacamp.com/community/blog/python-scipy-cheat-sheet#gs.JDSg3OI matplotlib 图片来源——https://www.datacamp.com/community/blog/python-scipy-cheat-sheet#gs.JDSg3OI scikit-learn 图片来源——https://www.datacamp.com/community/blog/scikit-learn-cheat-sheet Neural Networks Zoo 图片来源————http://www.asimovinstitute.org/neural-network-zoo/ ggplot2 图片来源——https://www.rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf pyspark 图片来源——https://www.datacamp.com/community/blog/pyspark-cheat-sheet-python#gs.L=J1zxQ 图片来源2——https://www.datacamp.com/community/blog/pyspark-sql-cheat-sheet R studio 图片来源——https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf jupyter notebook 图片来源——https://www.datacamp.com/community/blog/jupyter-notebook-cheat-sheet dask 图片来源——http://docs.dask.org/en/latest/_downloads/daskcheatsheet.pdf

Coregistration: Simultaneous Alignment and Modeling of Articulated 3D Shape

这篇文章是SCAPE的延伸 公式(1) Q f ( θ ) Q_f(\theta) Qf​(θ)是每个三角形根据Pose参数 θ \theta θ产生的形变 D f D_f Df​ body shape deformation R f R_f Rf​是三角形所属rigid part的形变 BlendSCAPE 用linear blend B f B_f Bf​来替换 R f R_f Rf​ 公式(2), 是让template T T T尽量接近 S S S, 注意括号里面是待求变量 公式(3), 待求的三角形向量从template原始三角形向量形变过去, 注意括号里面是待求变量 公式(4), body shape deformation smoothness term 以及 pose-dependent deformation term. 公式(5)总的能量函数 优化就不看了

为虚拟机vCPU绑定物理CPU

为了提高缓存命中率,提高虚拟机性能,可以将vCPU绑定到指定的物理CPU去执行。具体设置步骤如下: 在宿主机操作系统启动时将用于虚拟机的CPU独立出来,使其上只运行vCPU线程,QEMU进程和少数的管理进程。设置方法即是在内核启动参数中加入: isolcpus=0,1 例如在grub.cfg下面的配置如下: menuentry 'Fedora (3.13.6-200.fc20.x86_64) 20 (Heisenbug)' --class fedora --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.4-200.fc20.x86_64-advanced-5bcef32f-430b-4d74-beaa-4fcfccc438f9' { ...... linux /vmlinuz-3.13.6-200.fc20.x86_64 root=UUID=5bcef32f-430b-4d74-beaa-4fcfccc438f9 ro vconsole.font=latarcyrheb-sun16 rhgb quiet LANG=zh_CN.UTF-8 isolcpus=0,1 initrd /initramfs-3.13.6-200.fc20.x86_64.img } 使用taskset命令将vCPU线程绑定到指定的物理CPU。例如,某虚拟机的qemu进程及两个vCPU线程如下: ​[root@kelvin ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep -v grep root 4706 3629 4706 1 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm root 4706 3629 4708 1 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm root 4706 3629 4709 0 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.

C#*.bmp,*.jpg,*.png指定颜色,转换为透明背景的png

透明背景 直接上代码 partial class Form1 { /// /// private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows /// <summary> /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.Image = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.imgPath = new System.Windows.Forms.TextBox(); this.saveImagePath = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.

python基础07

字典的key只能使用不可变类型的数据 #注意: 1.可变类型的数据变化,是通过方法实现的 2.如果给一个可变类型的变量,赋值了一个新的数据,引用会修改 ·变量不再对之前的数据引用 ·变量改为对新赋值的数据引用 在python中,是不允许直接修改全局变量的值,如果使用赋值语句,会在函数内部定义一个局部变量 如果在函数中需要修改全局变量,需要使用global进行声明,不会创建局部变量 注意:在开发时,应该把模块中的所有全局变量定义在所有函数上方,就可以保证所有的函数都能够正常访问到每一个全局变量了 代码结构示意图如下: shebang import模块 全局变量 函数定义 执行代码 交换数字 a = 6 b = 100 #解法一: c = a a = b b = c #解法二: a = a + b b = a - b a = a - b #解法三: a,b = (b,a) 在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量 列表变量使用+不会做相加再赋值的操作!本质上时在调用列表的extend方法 在参数后使用赋值语句,可以指定参数的缺省值,1)定义位置:必须保证带有默认值的缺省参数在参数列表末尾2)调用带有多个缺省参数的函数:需要指定参数名,这样解释器才知道参数的对应关系 调用多值函数时,元组和字典变量分别传递给args和kwargs可以在元组变量前增加一个字典变量前增加两个| 变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.

window安装MySQL5.7 的压缩包安装过程(实测有效)(中间报错: mysql.connector.errors.NotSupportedError和由于找不到msvcr120.dll无法继续

文章目录 说明:1、下载mysql5.7的 zip包2、配置安装报错 1、找不到msvcr120.dll报错 2、mysqld -install(这个时候我已经添加环境变量了) 3、一些配置命令3.1 、初始化命令3.2、安装命令mysqld --install3.3、启动服务 net start mysql3.4、登陆mysql,3.5、肯定需要先修改密码 说明: 今天有个python程序,找到网上一个获取代理ip的,然后我的电脑(widow系统),程序运行一直报错,报错类似于,然后网上查找解决方法,意思是我的MySQL版本过高,然后开始寻找安装低版本5.7的方法,但是就是安装不成功,经过多次,安装过成又报了一个错,所以觉得下来了,既方便下载需要,也能给他人一个参考。 mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported 1、下载mysql5.7的 zip包 直接下再5.7的压缩包地址(64位的): https://dev.mysql.com/downloads/file/?id=487427 如果需求其他版本,请去Windows官网 https://dev.mysql.com/downloads/windows/ 然后其他版本进来之后,选择自己需要的下载即可 2、配置安装 压缩包,解压之后,放到想要安装的位置,我放到软件盘。其中my.ini,需要自己写的配置文件,我看了好多博客写的这个,但是就没有说放到哪个位置,我把我成功的图片截屏出来。 里面的内容:basedir和datadir 你要改成自己的 [client] default-character-set=utf8 [mysqld] #设置3306端口 port=3306 #设置mysql的安装目录 basedir=D:/tools/mysql-5.7.24-winx64 #设置mysql数据库的数据的存放目录 datadir=D:/tools/mysql-5.7.24-winx64/data #允许最大连接数 max_connections=200 #服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 collation-server=utf8_general_ci #创建新表时将使用的默认存储引擎 default-storage-engine=INNODB 然后把当前的bin文件夹,加到环境变量中。 比如我的是 D:\tools\mysql-5.7.25-winx64\mysql-5.7.25-winx64\bin 然后cmd中,命令安装:mysqld -install 报错 1、找不到msvcr120.dll 我的这个时候保错**,(由于找不到msvcr120.dll无法继续执行代码)** 这个时候百度找到了原因,需要安装一个软件 软件地址: https://www.microsoft.com/zh-CN/download/details.aspx?id=40784 点击下载之后,选择自己对应的版本软件,下载好安装即可解决这个问题。 成功之后,我重新打开进入cmd,然后再次报错: 报错 2、mysqld -install(这个时候我已经添加环境变量了) 这个时候解决办法,就是使用管理员重新进入cmd即可: 这个时候,显示成功了。 3、一些配置命令 3.1 、初始化命令 mysqld --initialize --user=mysql --console(注意执行命令后会出现一个password的关键字,这是一个随机密码,一定要记住一会会使用)。

MySQL 启动

1. 配置环境变量: 将MySQL /bin目录设为环境变量 2. 将服务添加到注册表中: mysqld --install(添加服务) sc delete ServiceName (删除服务) 3. 初始化服务: mysqld --initialize 4. 启动MySQL net start mysql 5. 进入MySQL 在初始化完成之后会生成临时密码 在.err文件中 mysql -u root -p 6. 修改密码 set password for root@localhost = password('root'); 转载于:https://www.cnblogs.com/GHzcx/p/11237949.html

ADRC学习笔记(二)

添加链接描述源码1.最速跟踪微分器TD 它的离散表达式为: 参数中:V(t)是目标值h、h0为积分步长,一般来说h可以等于h0,但是为了减少超调和减少震荡,才把他们分开,一般h0比h大,比如大20倍。当h0较大时,能够明显减少震荡,所以也叫滤波因子。减小h可以抑制噪声放大作用。r为速度因子,值越大,逼近速度越快,但是最好根据实际被控对象的可承受能力而定。 表达式中:其中fhan函数第一种表达式为: fhan函数第二种表达式为: 其中fsg函数表达式为: 两种fhan函数是等价的。最速跟踪微分器的作用是起到一个缓冲作用,比如输入一个阶跃信号,它会让信号有一定斜率,让执行机构不会一启动就进入最大马力,从而导致第一次及后面几次逼近设定值时出现超调。它的可调参数与实际系统 2.扩张状态观测器 其中函数fal的表达式为: 它的另一种表达式为 3.状态误差反馈律 3.1线性反馈率 其中e1=x1-z1,e2=x2-z2,e0为e1的积分。 3.2非线性反馈率 然而这种线性组合不一定最好。大量仿真研究表明, 采用 e 0,e 1,e 2 的适当非线性组合效果更好, 我们通常采用的非 线性组合有如下两种形式: 完成的二阶自抗扰控制器算法如下 这里 r0,β01,β02,β03,r,c,h1,b0 是控制器的参数, 其中 r0是根据过渡 过 程 快 慢 的 需 要 和 系 统 的 承 受 能 力 来 决 定的 ; 参 数 β01,β02,β03 是 由 系 统 所 用 采 样 步 长 来 决定 的 ( 不 管 什 么 样 的 对 象 , 采 样 步 长 一 样 , 都 可 以 用相 同 的 β01, β02, β03) 。 这 样 , 系 统 中 真 正 需 要 调 整的参数为控制量增益 r、阻尼系数 c、精度因子 h1 和补偿 因 子 b0 四 个 了 。 在 一 般 情 况 下 , 控 制 量 增 益 r 是 大到 一 定 程 度 就 可 以 , 再 大 也 几 乎 没 有 影 响 。 因 此 只 需三 个 参 数 c,h1,b0 需 要 进 行 调 整 , 这 与 PID 的 三 个 增 益差不多: l/h1 相当于 PID 的比例增益; 阻尼因子 c 相当于 PID 的微分增益; 补偿因子 b0 有 点 像 PID 的 积 分 增益, 但也不很像。这里三个参数与 PID 的三个参数有很 多 相 似 之 处 , 但 也 有 很 大 的 差 别 。(韩老师原话)

原来这样可以优雅地解决小米手机后台弹窗权限问题

/ 今日科技快讯 / 7月23日,据外媒报道,微软宣布将向总部位于美国旧金山的人工智能研究公司OpenAI投资10亿美元,为其云计算平台开发AI技术。 / 作者简介 / 本篇文章转载自nodzhang的博客,分享了他对于小米手机后台弹出界面权限的适配方案,相信会对大家有所帮助! 原文地址: https://juejin.im/post/5d328ce3e51d454fbf540aad / 前言 / 在一个风和日丽的下午,突然收到测试同学反馈在小米手机中有些页面无法正常启动的消息,我便立刻去排查代码,发现都是常规启动Activity的操作,却真的无法实现了,这让人感觉十分诡异。而这一现象只在小米手机中发生,所以断定肯定和小米手机的MIUI系统有关系,经过排查发现是小米手机中“后台弹出界面”的权限默认被拒绝了,这样在后台Service中或者其他一些后台操作都无法启动Activity了。 / 分析一波 / 在小米手机的应用权限管理中有一个“后台弹出界面权限”,该项权限会限制当APP处在后台时弹出Activity的动作,该权限时默认关闭的,可以在小米系统的权限管理页看到: 这个时候正常的startActivity()方法无法弹出Activity,在Log中筛选MIUILOG查看系统日志: 我们可以看到其中有权限拒绝的具体说明: 可以看到是权限原因拒绝了启动Activity动作,随后我们在小米的官方论坛中也看到了他们的声明: / 解决方案 / 自从2019年5月份开始,小米开启了这项权限判断,所以之前可以正常弹出的界面现在无法弹出了。我们尝试了一些方法来绕过这个权限判断,比如启动一个前台Service来跳转、在Toast中来跳转,都无法绕过该权限判断,所以绕过权限这条路是不能走了,只能想办法正面解决。 商务谈判,让小米MIUI给默认开启此权限 我们普通APP安装后,此项权限默认是关闭的,当然有些大型APP具备和小米商务谈判的能力,小米会在系统设置中默认给予开启,比如“搜狗输入法”就是默认开启此权限的。 但是只有具备足够影响力的公司才能与小米谈判,而且要满足他们的各种条件,才能让其系统中默认为我们开启此权限,我们普通APP是做不到的,所以此方法不适用于我们普通APP。 进行权限判断,通过代码请求开启权限 我们面对普通权限请求一般处理方案是这样的,先判断是会否具有此项权限,如果没有就请求开启此权限。但是对于小米的这种厂商独有的权限,我们的难点在于没有相关API可以判断是否具备此权限,也没有API去申请此权限,所以这条路是不通的。当然可以通过反射之类的方法,去调用他系统层的一些东西,不过这样不太靠谱,研发代价也比较大,所以可以说是没有直接解决方案的。 那么这个问题就无解了么?我通过一系列讨论最后通过迂回方法进行解决,得出最终可用解决方案: 判断要启动的Activity是否被成功启动,如果没有则代表没有获取到权限。 弹窗提示用户去开启该权限。(由于没有后台弹出权限,无法直接跳转到系统的权限设置页,所以弹窗提示) 这里难点在于判断Activity是否被成功打开了,至于弹窗引导自己定制引导内容即可。下面一节,具体对如何判断Activity被成打开进行说明。 / 判断Activity是否被成功启动 / 这里同样也尝试了多种方案,比如: 在每个Activity的OnCreate()方法中进行处理(最终放弃) 当startActivity()后做一个0.5s倒计时逻辑,在要启动的Activity的OnCreate()方法中发一个广播来去掉该倒计时,如果没有被取消那么就说明没有启动成功。这样需要在每个Activity中做处理,过于繁琐,所以放弃。 通过Activity栈获取栈顶Activity判断(最终放弃) 当startActivity()后做一个0.5s倒计时逻辑,然后通过Activity栈的管理获得栈顶Activity,判断是否打开成功。这样避免每个Activity都要处理,比如我们可以查到常用方法是这样的 : 这个问题在于这些方法在Android 5.1之后也失效了,网上也有其他方法,使用usageStatsManager.queryUsageStats要获取额外的权限,所以也不是合理的方法。最终这个方法也不能实现可用性。 最终解决方案 工具类统一处理startActivity()方法,同时开启一个0.5s的倒计时。在Application中自己管理记录栈顶的Activity,用于判断栈顶Activity并完成是否成功打开,如果没有打开则展示引导弹窗。 这样把启动Activity和权限判断都在一个工具类中处理,以后只需要调用这个工具类,就实现了启动Activity、判断权限、以及权限弹窗引导。同时自己进行Activity栈的管理,解决了无法在各个Android版本上完成对Activity启动判断的问题。 首先在Application中监听所有Activity的生命周期,来记录栈顶Activity: 然后在工具类中做统一处理: 最后使用的时候直接调用工具类的方法startActivity()即可: / 总结 / 小米后台弹出权限问题的解决,是通过曲线救国的方法解决的,因为没有直接的API可调用。这里封装成了一个工具类,任何需要添加权限判断的地方只需要调用工具类的方法就行了,这样既实现了统一管理,又方便调用,所以这是我们最终采用的方案。 推荐阅读: Android Q新特性,一起来学习折叠屏应该如何适配 7张图带你轻松理解Java 线程安全 动手开发一个滴滴出行,是的,你没有看错! 欢迎关注我的公众号 学习技术或投稿 长按上图,识别图中二维码即可关注

好站推荐-四个在线识别字体网站,从此不在为找字体烦恼

每天字体设计交流群里都有人问这是什么字体那是什么字体,字库那么多真没有人能认识那么,分享四个在线识别字体的网站,不管你找字体,还是求字体,这几个网站能帮你稿定, 第一个:站长工具的上传图片即可找字体,方法简单 浏览要上传的作品,开始上传即可,之后按照提示查找即可 召唤入口连接 http://font.chinaz.com/zhaozi 第二个:识字体网可以识别简体繁体日语英文四种语言 召唤入口连接 http://www.likefont.com 还提供的有本地软件下载不用网页也可以识字体,软件下载 http://www.likefont.com/windows/download/ 第三个:求字体网提供中英文字体下载,求字体很多设计师都在上他。 召唤入口连接 http://www.qiuziti.com 第四个:在线可以识别图片上的文字,大概就是上图,右边的效果,有的时候图片上文字不想打了,就用这个方法吧。 召唤入口连接 http://www.ocrmaker.com

sklearn的特征抽取和特征筛选

数据分析过程中,往往需要处理很多类型的数据,数值型和非数值型,无论是在回归问题还是分类问题中,特征工程都是重中之重。 我们都知道,特征值和特征向量在高等数学和线性代数中极为关键,特征工程,从表面上来说,就是从大大小小的数据中,筛选出有意义或者有用的条目,进而转换成一种数学表达,让机器和算法能够理解其中的意义。好比一个班上的每个学生,都有性别、年龄、身高、体重、成绩、性格特点等等特征,年龄、身高、体重、成绩属于数值型的特征,可以直接为我们所用,性别、性格特点属于非数值型特征,需要通过转换才能被算法理解。 python的sklearn包,包含了特征工程常用的工具和api,主要有以下几个方面: 特征抽取 sklearn.feature_extraction:包含了常用的用于特征抽取的api DictVectorizer(dtype=<class ‘numpy.float64’>, separator=’=’, sparse=True, sort=True) 通过字典传入抽取特征,用于将标签型或非数值型数据的抽取和转换,sparse参数表示是否转换为稀疏矩阵>>> from sklearn.feature_extraction import DictVectorizer >>> v = DictVectorizer(sparse=False) >>> D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}] >>> X = v.fit_transform(D) >>> X array([[2., 0., 1.], [0., 1., 3.]]) FeatureHasher(n_features=1048576, input_type=’dict’, dtype=<class ‘numpy.float64’>, alternate_sign=True) 将输入转换为hash矩阵,n_features为特征的列数,也就是特征维数,input_type为输入的python数据类型,通常用于处理特征的维度较大的问题。>>> from sklearn.feature_extraction import FeatureHasher >>> h = FeatureHasher(n_features=10) >>> D = [{'dog': 1, 'cat':2, 'elephant':4},{'dog': 2, 'run': 5}] >>> f = h.

mysql数据库基础与权限认证

关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 数据结构:数据存储的问题,二维表(有行和列) 操作指令集合:所有sql语句 完整性约束:表内数据约束(字段与字段),表与表之间约束(外键) 2.关系型数据库的设计 关系型数据库:从需要存储的数据需求中分析,如果是一类数据(实体)应该设计成一张二维表:表与表头(字段名:用来规定 数据的名字)和数据部分组成(实际存储的数据单元) 二维表:行和列 表头 字段名 字段名2 数据单元 数据1 数据2 关系型数据库:维护实体内部,实体与实体之间的联系. 关系型数据库特点:如果表中队友的某个字段没有值(数据),但是系统依然要分配恐惧:关系型数据库比较浪费空间 授权认证: mysql权限系统的作用是授予来自某个主机的某个用户可以查询,插入,修改,删除等数据库操作的权限 不能明确的指定拒绝某个用户的连接 权限控制(授权与回收)的执行语句包括create user ,grant ,revoke 授权后的权限都会存放在Mysql的内部数据库中(数据库名叫mysql),并在数据库启动之后把权限信息复制到内存中 MySQL用户的认证信息不光包括用户名, 还要包含连接发起的主机 ALL/ALLPrivileges权限代表全局或者全数据库对象基本的所有权限 Alter权限代表允许修改表结构的权限,但必须要求有create和insert权限配。如果是rename表面,则要求有alter和drop原表,create和insert新表的权限 Alter routine权限代表允许修改或者删除存储过程,函数的权限 Create权限代表允许创建新的数据库和表的权限 Delete权限调拨允许删除行数据的权限 Execute权限代表允许执行存储过和函数的权限 Insert 权限代表是否允许在表里插入数据,同时在执行analyze table,optimzetable,repair rable语句的时候也需要insert权限 Update权限代表允许修改表中的数据的权限 系统权限表: User表:存放用户账户以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例 Db表:存放数据库级别的权限,决定了来自哪些主的哪些用户可以访问此数据库 Tables priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这这个表 Columns_priv表:存放列级别的权限,决定了来自哪些主的哪些用户可以访问数据库表的这个字段 Procs_priv表:存放存储过程和函数级别的权限 User权限表结构中的特殊字段 Plugin,password,authenticattion_string三个字段存放用户认证信息 password_expired设置成‘Y’则表明允许DBA将此用户的密码设置成过期而且过期后要求用户的使用者重置密码(alter user/ set password重置密码) Password_last_changed作为一个时间戳字段代表密码上次修改时间,执行create user/alter user/set password/grant等命令创建用户或修改用户密码事此数值自动更新 Password_lifetime代表从password_last_changed时间开始此密码过期的天数 Accout_locked代表此用户被锁住,无法使用 权限认证中的大小写敏感问题 字段user password authencation_string db,table_name 大小写敏感 字段host,column_name,routine_name大小写不敏感 查看用户权限信息 show grant for用户:查看已经授权用户的权限信息