微擎模板组tpl_form_field_image设置图片
使用微擎模板组:
{php echo tpl_form_field_image(‘single-image’);}
图片框赋值:
KaTeX parse error: Expected '}', got 'EOF' at end of input: …eng1']").val("{confs[‘huandeng1’]}")
单个图片框展示:
$_W[‘attachurl’] --------->附件URL目录,如果开启远程附件后,此值是远程附件地址
$(".img-responsive").attr(“src”,"{php echo KaTeX parse error: Expected 'EOF', got '}' at position 16: _W['attachurl']}̲{confs[‘huandeng2’]}");
多个图片框展示:
var index=0;
var myArray=new Array();
$(".form-control").each(function(){
if(index!=0 && index!=6){ myArray.push($(this).val()); } index++; }); var x=0; $(".img-responsive").each(function(){ $(this).attr("src","{php echo $_W['attachurl'];}"+myArray[x]); x++; }); 微擎创建路由:
$this->createWebUrl(‘view’)
用例图关系 三种关系 泛化(Generalization)
包含(Include)
扩展(extend)
下面给大家分别通过举例来介绍一下这三种关系的概念和用法
概念和用法 概念
(1)泛化关系(带空心三角的实线表示):是一种继承关系,子用例是父用例的一种特殊形式,它继承了父用例的所有结构、行为、关系。其中三角箭头指向父用例。
举例
概念
(2)包含关系:基本用例的行为包含了另一个用例的行为,是比较特殊的依赖关系。
包含关系可以用于下面两种情况之中
举例
A. 当可以从两个或两个以上的用例中提取公共行为时,应该使用包含关系。其中提取出来的公共用例成为抽象用例,而把原始用例变成基本用例或基础用例。箭头指向抽象用例。
说明:阅读者在读书和借书的时候,都要登记记录,他们有登记记录这一共同的行为,所以把它提取出来作为一种抽象用例,借书和还书这两个基本用例中包含了登记记录这一抽象用例。
B.一个用例的功能太多时,可以使用包含关系建立若干个更小的用例。
说明:一般用户有很多功能,其中包括各种信息的查看,这时可以建立一个查询信息这一个用例,然后下面在包含查看余额、查看上机记录、查看充值记录这三个小用例。
(3)扩展关系:扩展用例在扩展点上增加新的维护和含义。扩展用例为基用例添加新的行为,箭头指向基本用例。
举例
说明:在机房收费系统当中,操作员在进行信息查询的时候,需要将查询到的信息导出为excel表格,这个导出excel用例相对于信息查询用例来说就是一个扩展用例
何时使用,如何区分? 什么时候使用包含关系
A.当两个或两个以上的用例包含大量的一致行为的时候,可以抽象出一个抽象用例
B.当用例数量太多或过于复杂的时候,可以使用抽象用例包含一些小用例
什么时候使用扩展关系
基本动作在一个用例中,如果这个基本用例还有其他动作,但需要在一定条件下才执行,可以将它放在扩展用例中
Java现在已经发展到了Java13了(正式版本),相信很多朋友还对各个版本还不是很熟悉,这里面专门把Java9到Java13各个版本的一些新特性做了一些详细讲解。我在网上也找了很多,但基本都是官方文档的CV,没有任何代码演示,而且官方的示例代码也不是很好找得到,官方API目前还是Java10,官方文档真是坑啊。所以我在这里专门写了一篇文章,主要针对平时开发与有关的功能Java9到Java13各个版本都做了代码详细讲解。
【PS】:这个季节太冷了,南方湿冷,我的手都生冻疮了,看在年前最后几天了,没办法,我最后选择去网吧花了几天时间,网费都花了好几百块,为了打造这篇干货不惜下血本啊。终于奋战几天写出来了这篇文章。每一个语法细节都经过实例演示过的,我特意把每个版本的Open JDK都下载了一遍,体验里面的细节差距和新特性。
希望大家点赞,评论和收藏三连,也不负我的一片苦心,谢谢大家了。
想获得更多干货,欢迎大家多多关注我的博客。本文为作者AWeiLoveAndroid原创,未经授权,严禁转载。
文章目录 一、Java 9Java 9 集合工厂方法REPL (JShell)接口支持私有方法和私有静态方法:改进的 Stream API和Optional 类改进的 CompletableFuture API异常处理机制改进try-with-resources改进的 @Deprecated 注解钻石操作符(Diamond Operator“<>”)Unicode 7.0扩展支持: 二、Java 10var 局部变量类型推断支持Unicode 8.0。 三、Java 11局部变量的语法lambda参数启动单文件源代码程序 四、Java 12对 switch 语句进行扩展: 五、Java 13switch表达式预览版Text Blocks预览版(文字块) 一、Java 9 【注:】Java9的更新是最多的,这个需要特别注意学一下。
Java 9 集合工厂方法 示例:
public static void main(String[] args) { Set<String> set = Set.of("set1", "set2", "set3"); // set: [set1, set3, set2] System.out.println("set: " + set); Map<String, String> maps1 = Map.of( "map1","Apple", "map2","Orange","map3","Banana", "map4","cherry"); // maps1: {map3=Banana, map2=Orange, map1=Apple, map4=cherry} System.
Flutter 汇总请看这里
文章目录 安装升级Flutter至指定版本安装Flutter for web构建工具配置环境变量准备 IDEVisual Studio CodeIntelliJAndroid Studio 获取(无状态)热重载 webdevStagehand模板 Flutter于2017年5月在Google I / O上首次使用Alpha工具包发布,并于2018年在Google I / O上发布,最终通过未来的新产品HummingBird达到1.0版,并于2019年5月7日在Google IO 2019上,谷歌终于宣布推出Flutter for Web预览版。
Flutter的创建旨在为开发人员提供快速的开发框架,并为用户提供出色的参与和快速体验。Flutter for Web是Flutter的代码兼容实现,使用基于标准的Web技术(HTML,CSS和JavaScript)呈现。借助Flutter for Web,可以将Dart编写的现有Flutter代码编译为可嵌入到浏览器中并部署到任何Web服务器的客户端。可以使用Flutter的所有功能,并且不需要浏览器插件。
安装 升级Flutter至指定版本 为了开发web,需要Flutter 1.5及以上版本,它支持使用Flutter来定位web,包括将Dart编译成JavaScript。使用Flutter SDK与flutter_web预览,确保已经通过flutter upgrade升级Flutter至v1.5.4
$ flutter upgrade 安装Flutter for web构建工具 要安装该webdev软件包,该软件包提供了Flutter for web的构建工具,请运行以下命令:
$ flutter packages pub global activate webdev 配置环境变量 $ touch ~/.bash_profile; open ~/.bash_profile 将使用TextEdit打开文件,确保对PATH中的所有组件都有引用并保存。
确保配置了$HOME/.pub-cache/bin环境变量,然后可以直接在
终端上使用webdev命令。
flutter sdk: export PATH=$PATH:[Path to your flutter directory]/flutter/bin dart sdk: export PATH=$PATH:[Path to your flutter directory] /flutter/bin/cache/dart-sdk/bin webdev: mac: export PATH=$PATH:$HOME/.
@TOC#laile
1.下载和安装anaconda(镜像) 从清华开源,下载镜像,然后打开安装包进行安装
2.在开始菜单里,找到程序文件夹 打开开始–程序–anaconda-annaconda navigator;
应该可以看到,最基础的base环境
3.在开始菜单里,打开anaconda promt 输入jypyter nootbook然后回车
此时会,自动弹出以个浏览器,在线的环境
可以在右侧的new处,选择python3,然后编写代码
4.更改代码文件目录 我们在文件夹中打开anaconda
发现里面有好几个快捷方式
然后右键点击Jupyter Notebook,点属性
其中,“目标”和“起始位置”改成这样,同时去F盘对应创建一个notebook_workspace文件夹
然后应用,确定
这样,代码目录就改好了,以后就可以双击Jupyter Notebook快捷方式,进入到环境内编程了。
#include <stdio.h> int main() { int i,n,asum=0,bsum=0,csum=0,dsum=0; scanf("%d",&n); for(i=1;i<=n;i++) { if(i%4==1&&(i%7==0||i/100==7||i%10==7||i/10%10==7)) { asum++; n++; } if(i%4==2&&(i%7==0||i/100==7||i%10==7||i/10%10==7)) { bsum++; n++; } if(i%4==3&&(i%7==0||i/100==7||i%10==7||i/10%10==7)) { csum++; n++; } if(i%4==0&&(i%7==0||i/100==7||i%10==7||i/10%10==7)) { dsum++; n++; } } printf("%d\n",asum); printf("%d\n",bsum); printf("%d\n",csum); printf("%d\n",dsum); return 0; }
Dev-C++是一个Windows环境下的适合于初学者使用的轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议。它集成了MinGW中的GCC编译器、GDB调试器和AStyle格式整理器等众多自由软件。原本的开发公司 Bloodshed 在开发完 4.9.9.2 后停止对Dev-C++的更新,目前由 Orwell 公司继续更新。截止到2017年06月07日,Dev C++ 的最新版本是 5.11。
Dev C++ 5.11 简体中文版下载地址:
官方下载:https://sourceforge.net/projects/orwelldevcpp/百度网盘:https://pan.baidu.com/s/1mhHDjO8 提取密码:mken 开始安装 Dev C++ Dev C++ 下载完成后会得到一个安装包(.exe 程序),双击该文件即可开始安装。
1) 首先加载安装程序(只需要几十秒)
2) 开始安装
Dev C++ 支持多国语言,包括简体中文,但是要等到安装完成以后才能设置,在安装过程中不能使用简体中文,所以这里我们选择英文(English)。
3) 同意 Dev C++ 的各项条款
4) 选择要安装的组件
选择“Full”,全部安装。
5) 选择安装路径
你可以将 Dev C++ 安装在任意位置,但是路径中最好不要包含中文。
6) 等待安装
7) 安装完成
开始配置 Dev C++ 首次使用 Dev C++ 还需要简单的配置,包括设置语言、字体、和主题风格。
1) 第一次启动 Dev C++ 后,提示选择语言。
这里我们选择简体中文,英语给力的朋友也可以选择英文。
2) 选择字体和主题风格
这里保持默认即可。
3) 提示设置成功
点击“OK”按钮,进入 Dev C++,就可以编写代码了。
找到两列中相通的字符
找出这两列中相同的字符
1、读取数据为dataframe个格式
2.查看是否有空值
3、将两列数据转化为小写字母。使用lower()函数
import numpy as np from numpy import nan as NA df1['S_brand']=df1.brandName.apply(lambda x : x.lower() if not pd.isnull(x) else NA) df1['S_key_word']=df1.key_word.apply(lambda x : x.lower() if not pd.isnull(x) else NA) `` 增加了两列,然后对这两列进行数据分析 定义一个函数,有可以传递两列数据。返回值作为新的一列数据 ```python def equal_word(B,A): # A ->关键词 B->品牌词 A,B=str(A),str(B) if B in A : return False #如果包含,返回False else: return True #如果不包含,则返回True df2=df1[['S_key_word','S_brand']] df1['bool']=df2.apply(lambda x :equal_word(x['S_brand'] ,x['S_key_word']),axis=1) 此时就可以进行筛选了,将bool这一列为TRUE筛选出来,即使两列没有交集的dataframe数据
保存为excel
最近应该是快要过年了,很多黑客手头紧哈,哈哈哈,开个玩笑哈,公司购买的服务器频频被攻击,于是乎就有了这篇文章,教大家如何“反击”哈。
废话不多说,直接上场景,windows服务器为例,其他场景大同小异:下面开始排查
就突然这样被肉鸡了,该怎么办,很多线上程序都挂掉了
明明记得部署软件的时候cpu、内存占用都不高,没有超过50%的,如下图
这更进一步说明了问题,cpu使用由 5% 飙升到 98%,内存由 7 个G左右飙升到32个G,句柄数由几万飙升到几百万,哇,爽歪歪了 ,话说那些所谓的黑客,你们好意思嘛,那么高的收入,还搞这些,穷疯了吧
难道真的和某位大佬发的博客(现实中的黑客VS想象中的黑客)一样,哈哈哈
废话不多说,开始解决,
1、定位服务器中的异常进程,既然是“云服务器”可以工单一波,
说实话进程中貌似没看出来,那就不费事了,直接工单提交一波,反正闲着也是闲着,还是老规矩马赛克的干活,避免广告嫌疑
让我很生气啊,用我的服务器也不要紧,还TM把我IP给封堵了,真的是忍不住爆粗口啊
2、进一步排查,可以通过某些杀毒软件,此处不一一列举,目的只有一个找出病毒文件
3、我这边检测到系统多了个用户,那个用户的目录下有些见不得人的东西
最早的一个文件竟然是2008年,这小伙子可以啊,这麽久还没被抓起来,哈哈哈
给大家看看他的密码字典:看见里边密密麻麻的常用密码不禁菊花一紧啊!
毫不留情直接用户删掉,开启防火墙,修改了常用的端口,例如:3389、3306、22、21、1433、1521
通过他的vb脚本我发现了一个网站,里边全事木马文件,毫不留情直接公布,公布出来是让大家都看下没别的意思,这不能算我侵权吧
经过小编一系列的排查,加上网络分析,耗时一小天,终于把这些垃圾清理好了,设置ip问黑名单
至此,问题基本解决了,看着服务器上的内存、cpu 平稳变化瞬间松了一口气,心情大好,喝杯茶去
为播放器添加MediaPlayer.OnInfoListener监听,在回调方法中打印what,并参照MediaPlayer提供的类型进行对比,比如MediaPlayer: Couldn't open java.io.FileNotFoundException: No content provide错误,对应的就是801,对应的类型为MediaPlayer.MEDIA_INFO_NOT_SEEKABLE(无法获取媒资)。其他问题同理。
上一篇博客记录了一下RabbitMQ的服务搭建和简单入门,但是光这些还远远不够。
要想将RabbitMQ用于生产中,需要考虑和解决很多问题。
目录 消息转换器 生产者如何确保消息发送不丢失? 消费者如何防止消息丢失? 消息预取 死信交换机 消息转换器 原生的RabbitMQ只能发送字节数组,与SpringBoot整合后,Spring允许开发者发送一个对象,原因在于Spring对消息的发送和接收进行了一些处理。
默认的消息转换器为:SimpleMessageConverter,转换大致逻辑如下:
如果请求的contentType是以text打头,则将消息转为String。转之前判断是否给定字符集,如果没有给定则以默认字符集UTF-8转换。如果contentType等于application/x-java-serialized-object则将消息进行Java序列化传输。如果都不满足以上条件,则不进行转换,原样传输。 自定义消息转换器 如果有必要,也可以选择自己实现消息转换器。
创建类实现MessageConverter接口,生产者实现toMessage方法,消费者实现fromMessage方法。
public class MyMessageConverter implements MessageConverter { //生产者发送转换 @Override public Message toMessage(Object o, MessageProperties messageProperties) throws MessageConversionException { //使用FastJson Message message = new Message(JSONObject.toJSONBytes(o), messageProperties); return message; } //消费者接收转换 @Override public Object fromMessage(Message message) throws MessageConversionException { return JSONObject.parse(message.getBody()); } } template设置自定义转换器
//设置自定义消息转换器 template.setMessageConverter(new MyMessageConverter()); 生产者如何确保消息发送不丢失? 消息发送成功分两种:
消息到达Broker消息被成功路由到Queue 一般从业务角度来说,只有消息被路由到Queue中,才算真正的发送成功。
针对这两种情况,RabbitMQ提供了两种回调:ConfirmCallback和ReturnCallback。
ConfirmCallback ConfirmCallback针对的是“消息是否到达Broker”,至于消息是否被路由到Queue它是不管的。
当消息发送到Broker中,RabbitMQ会发出一个响应,告诉生产者自己已经接受到了消息。
代码实现 开启发送者确认
<a href="javascript:messagesd(\''+errlog+'\')" onclick="" >查看</div></a>; 注:messagesd点击触发的函数;errlog要传入的参数
让人头疼的系统 相信做程序的人都知道,自己所管理的系统要是突然挂了,得多让人崩溃。领导一个电话过来,不管自己身处何方,掏出随身携带的笔记本就开始修复问题。
系统挂掉的原因有很多,所以在系统挂掉的时候,快速找到导致错误的原因,才能快速的完美修复问题。
好用的工具 线程日志分析 我们可以在系统还没有彻底死掉之前,dump 一下线程日志。或者是可以设置一下,指定系统快要挂的时候,自动保存线程日志。然后保留下的日志,要是就那样干巴巴的看,不知要看到什么时候才能准确找到导致系统挂掉的原因。
我们就可以用下面的工具,来帮我们全面分析,我们的这段线程,里面那些是正常的,那些是不正常的线程(比如发生死锁之类的)。
http://fastthread.io/
GC日志分析 除了看线程日志,我们还可以查看自己系统的GC日志,看一下系统内存的使用及回收情况。以帮助我们更好的定位到为题。下面就是分析GC日志的工具。
http://gceasy.io/
解决高并发下的问题 在高并发的情况下,我们可以通关系统限流的方案,来解决高并发带来的一些问题。
JVM进程CPU占用率高于100% 作为开发,相信也碰到过jvm进程一直居高不下的情况,所以找到出错的地方还是最重要的。
本博客只是本人记笔记使用,能力有限,上述如有错误或不足的地方,敬请谅解。
数据可视化工具-Vue-DataV入门 Vue-DataV是干什么的? DataV是一个基于Vue的数据可视化组件库(当然也有React版本)提供用于提升页面视觉效果的SVG边框和装饰提供常用的图表如折线图等飞线图/轮播表等其他组件 npm安装 $ npm install @jiaminghi/data-view 使用 import Vue from 'vue' import DataV from '@jiaminghi/data-view' Vue.use(DataV) // 按需引入 import { borderBox1 } from '@jiaminghi/data-view' Vue.use(borderBox1) 详细文档及示例请移步HomePage.
UMD版 UMD版可直接使用script标签引入,UMD版文件位于项目dist目录下,引入后将自动把所有组件注册为Vue全局组件,引入DataV前请确保已引入Vue。
UMD版使用示例
TODO 地图组件TS重构组件库底层依赖 致谢 组件库的开发基于个人学习和兴趣,由于技术水平及经验的限制,组件尚有许多不完善之处,如有BUG可及时提交issue或添加反馈群进行反馈,也欢迎提供指正和建议,感谢各位的支持。
反馈 Demo Demo页面使用了全屏组件,请F11全屏后查看。
施工养护综合数据 机电运维管理台 机电设备电子档案 捐赠
本文首发:https://www.somata.net/2019/centos7_setup_owncloud_storage.html
首先准备必要的软件和资料. 这里我已经整理好了:
百度云共享
不过最好还是自己去官网上下。这里只不过是提供了快捷方式。
owncloud官网:https://www.owncloud.org
安装vmware 和 虚拟机的安装就不演示了。下面直接开始演示安装LAMP环境, 和 owncloud的安装。
推荐使用putty或者其他ssh软件远程连接到虚拟机再开始输入命令。 比直接再虚拟机内完成操作方便。
我这里使用xshell进行远程连接。 效果都是一样的不必在意
配置国内yum源 mkdir /root/back mv /etc/yum.repos.d/* /root/back/ # 备份yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 配置国内yum源 curl -o /etc/yum.repos.d/CentOS-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo # 添加扩展yun源 curl -o /etc/yum.repos.d/CentOS-remi.repo https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi.repo # 添加php源 yum clean all # 清除原始缓存 rm -rf /var/cache/yum/x86_64/7/* # 彻底删除缓存 yum makecache # 建立新的缓存 remi的配置文件还不一定会使用国内源,这里还可是再改进以下关于remi的配置文件,强制生效:
# file: rule s@mirrorlist@#mirrorlist@g s@#baseurl=http://rpms.remirepo.net@baseurl=http://mirrors.tuna.tsinghua.edu.cn/remi@g sed -i -f rule /etc/yum.repos.d/CentOS-remi.repo 安装LAMP环境 yum -y install vim bzip2 bash-completion httpd mariadb mariadb-server php70-php php70-php-mysqlnd php70-php-cli php70-php-xml php70-php-mbstring php70-php-intl php70-php-gd php70-php-pecl-zip # 安装必要软件 配置使LAMP环境生效 首先配置mariadb数据库。
一、环境 系统: CentOS Linux 7
配置: 内存:31.1 GiB
CPU:Intel® Core™ i7-9700 CPU @ 3.00GHz × 8
显卡:Intel® HD Graphics (Coffeelake 3x8 GT2)
GNOME:Version 3.28.2
OS type:64-bit
二、编译安装 注:下面的所有下载均可参阅:https://blog.csdn.net/Tosonw/article/details/102837508
1. 安装yum依赖 $ sudo yum install gcc gcc-c++ glibc_headers libtool gtk2-devel vim git autoconf automake boost-devel bzip2 unzip 如果使用sudo命令报错:xxx is not in the sudoers file. This incident will be reported,参阅:https://blog.csdn.net/msllws/article/details/102821050
2. 安装conda $ bash ./Miniconda3-4.5.4-Linux-x86_64.sh # 按照提示输入即可 Do you accept the license terms?
使用ssh连接远程主机 最简单的用法只需要指定用户名和主机名参数即可,主机名可以是 IP 地址或者域名。 $ ssh user@hostname
ssh连接到其他端口 SSH 默认连接到目标主机的 22 端口上,可以使用-p选项指定端口号 $ ssh -p 10022 user@hostname
使用ssh在远程主机执行一条命令并显示到本地, 然后继续本地工作 直接连接并在后面加上要执行的命令就可以了 $ ssh pi@10.42.0.47 ls -l
在远程主机运行一个图形界面的程序 使用ssh的-X选项,然后主机就会开启 X11 转发功能 $ ssh -X feiyu@222.24.51.147
如何配置 SSH SSH 的配置文件在 /etc/ssh/sshd_config 中,你可以看到端口号, 空闲超时时间等配置项。
构建 ssh 密钥对 使用 ssh-keygen -t +算法 ,现在大多数都使用rsa或者dsa算法。 $ ssh-keygen -t rsa
查看是否已经添加了对应主机的密钥 使用-F选项 $ ssh-keygen -F 222.24.51.147
删除主机密钥 使用-R选项,也可以在~/.ssh/known_hosts文件中手动删除 $ ssh-keygen -R 222.24.51.147
绑定源地址 如果你的客户端有多于两个以上的 IP 地址,你就不可能分得清楚在使用哪一个 IP 连接到 SSH 服务器。为了解决这种情况,我们可以使用 -b 选项来指定一个IP 地址。这个 IP 将会被使用做建立连接的源地址。 $ ssh -b 192.
这种方法在微信小程序里面获取数组对象的下标是我一直在用的,这种方法必须在数据里自己定义一个 ID 值然后获取的时候就是获取你定义的 ID 值, 当然也有其它获取的方法,经供参考。 下面是代码
//html页面 //这里绑定了一个 dome 点击事件。点击的时候获取到当前点击的 下标 <view class="dx solid none center" wx:for="{{goods}}" bindtap="demo" data-id="{{item.id}}" wx:key="key"> <view class="Split size" >{{item.goods_name}}</view> <view class="Split" >{{item.goods_price}}</view> <view class="Split dx center"> <view class="{{item.selse ? 'bord':'bord_red'}}">{{item.info}}</view> <view style="width:10%"> <image class="img_ion" src="{{item.img_top}}" mode="widthFix" lazy-load="false" binderror="" bindload="" /> </view> </view> </view> </view> //js页面 //这里是数据,自己定义的ID值和一些数据参数 goods:[ { id:0, goods_name:'AOO铝铝', goods_price:'11515', info:'50', img_top:'http://fxkj-dinghuo.oss-cn-hangzhou.aliyuncs.com/fxkj-ossss/Uploads/Picture/2020-01-08/5e15448d338aa.png', selse:true }, { id:1, goods_name:'AOO铝铝', goods_price:'11515', info:'50', img_top:'http://fxkj-dinghuo.oss-cn-hangzhou.aliyuncs.com/fxkj-ossss/Uploads/Picture/2020-01-08/5e15448d338aa.png', selse:true } ] //下面是获取的方法 用 e 收前端页面传过来的 ID 值 demo:function(e){ console.
在此之前需要首先安装pycocotools,网上很多人说直接sudo pip install安装不了,要去git上下载coco的api然后编译python的接口,然而我按照这样的方式出现问题了。最后确实是先安装cython然后通过sudo pip install pycocotools这种方式安装好的(对了,听说win不支持,然而我也没有试过所以不知道),这里大家可以自行查阅一下pycocotools怎么安装的,毕竟每个人情况不同。
声明下:以下步骤运行起来可能会比较麻烦,但是绝对不会错。环境为python2,如果你要用3的话,要么改一下代码一些库函数。
1 第一步: 先下载数据集COCO2017,这里应为我用的darknet框架,所以只用了train(118287张)和val(5000张)。你可以将测试集和验证集放在一起当成测试集(这里推荐大家使用卡帕斯的split,重新切分了train,val,test)这样测试起来,效果应该更好一点。
2 第二步: 将coco的instances_val(train)2017.json标签转为voc(.xml)的标签。
先贴上coco json数据标签转为voc的xml标签的代码。
from pycocotools.coco import COCO import os import shutil from tqdm import tqdm import skimage.io as io import matplotlib.pyplot as plt import cv2 from PIL import Image, ImageDraw savepath="/home/test/darknet/VOC2020/" datasets_list=['val2017'] ##运行完之后再改为train2017再运行一次 img_dir=savepath+'images/' #####这个路径会把你处理的图片拷贝进来,这里我们只处理了val2017文件夹下的数据,所以处理好之后需要修改生成image文件夹的名称为val2017 anno_dir=savepath+'annotations/' # 当前目录下会生成annotations文件夹存放xml,结束后修改名称 classes_names =['person','bicycle', 'car','motorcycle','airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog','horse', 'sheep','cow','elephant','bear', 'zebra', 'giraffe','backpack','umbrella', 'handbag','tie', 'suitcase', 'frisbee', 'skis', 'snowboard','sports ball', 'kite', 'baseball bat', 'baseball glove','skateboard', 'surfboard', 'tennis racket','bottle', 'wine glass', 'cup', 'fork','knife', 'spoon', 'bowl', 'banana','apple', 'sandwich', 'orange','broccoli', 'carrot', 'hot dog', 'pizza','donut', 'cake', 'chair', 'couch', 'potted plant', 'bed','dining table', 'toilet','tv','laptop', 'mouse','remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'] dataDir= '/home/test/darknet/coco2017' ####### 连接到coco的数据集 headstr = "
拿到了一些职位信息进行数据清洗练习,这里分享一下步骤
读取数据 这里直接打开CSV格式的文件(可以使用execl转化)
import numpy as np import pandas as pd import warnings warnings.filterwarnings('ignore') data = pd.read_csv('E:\\aatableau\\data.csv',encoding='gbk') data.shape data.head(100) data.info() 数据清洗 1.处理异常值 1.1 将薪资范围转化为平均薪资 for i, j in enumerate(data['薪资']): j = j.replace('k', '').replace('K', '').replace('以上', '-0') j1 = int(j.split('-')[0]) j2 = int(j.split('-')[1]) j3 = 1/2 * (j1+j2) data['薪资'][i] = j3*1000 data['薪资'].head(10) 1.2 将公司福利处理成正常的文字格式 for i, j in enumerate(data['公司福利']): j = j.replace('[', '').replace(']', '') data['公司福利'][i] = j data['公司福利'][:10] for i, j in enumerate(data['公司福利']): j = j.