首页 文章 精选 留言 我的

精选列表

搜索[博客搭建],共10000篇文章
优秀的个人博客,低调大师

opencv 人脸识别 环境搭建---java版-----1

代码下载地址http://download.csdn.net/detail/u013378306/9656546 1.首先下载OpenCV2.4.6,下载的时候,选择windows版的。然后安装 2.其实安装的过程就是解压的过程,并没有什么安装向导之类的,安装完成后,我们最关心的是这个目录:opencv\build\java 如下图所示 注意:opencv-246.jar是需要在opencv的java类库,但是,真正的实现是opencv_java246.dll(X86和X64之分,关键看你的计算机是多少位的) 3.建立一个Java项目 4.新建一个Java类,代码如下: packagecom.njupt.zhb.test; importorg.opencv.core.CvType; importorg.opencv.core.Mat; publicclassMain{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub System.loadLibrary("opencv_java246"); Matm=Mat.eye(3,3,CvType.CV_8UC1); System.out.println("m="+m.dump()); } } 5.引入所需要的jar包,即:opencv-246.jar 6.设置项目的native库,即opencv_java246.dll所在的路径 7.运行结果为:

优秀的个人博客,低调大师

iOS - XMPP Openfire 服务器的搭建

前言 提前下载好相关软件,且安装目录最好安装在全英文路径下。如果路径有中文名,那么可能会出现一些莫名其妙的问题。 提前准备好的软件: jdk-8u91-macosx-x64.dmg mysql-5.7.17-macos10.12-x86_64.dmg mysql-workbench-community-6.3.9-osx-x86_64.dmg openfire_4_1_1.dmg Openfire 官网 MySQL 官网 JDK 官网 在安装配置 Openfire 或其他 xmpp 服务器前,需要先安装 MySQL 数据库。 MySQL 安装具体讲解见 iOS - MySQL 的安装配置。 1、下载安装 Openfire 在 Openfire 官网下载最新的 Mac 版本 Openfire 安装包。 下载完后双击安装包,点击 pkg 文件,在安装引导下进行傻瓜式安装。安装完成后,进入系统偏好设置,点击 Openfire 图标。 进入 Openfire 偏好设置界面。点击 Start Openfire,让 OpenFire 服务开始启动(默认是启动的),启动完毕后,我们就可以点击 Administration 下的按钮,进入服务器后台,然后会要求输入管理员账号密码。 Openfire 服务启动不了问题解决 安装好之后,第一次是可以启动 openfire 服务器的,但是电脑重启后,就再也不能启动服务器了,每次一点击 “Start Openfire”,然后加载一下,状态还是 “Start Openfire” 没变化,有时甚至还会跳出错误提示框,提示 “Could not start the Openfire server”。 解决方案如下: 1)首先需要确认是否已经安装了 Java 的运行环境,以及 JAVA jdk 是否与当前 OS 系统版本,Openfire 版本成对应,如果不是,就请先安装相匹配对应的软件。 在终端中输入 java -version,就可以查看电脑有没有安装 JAVA 运行环境。 2)如果软件,环境对应的,最终的解决办法是 打开终端,输入以下命令: // 获取 Openfire 目录的访问权限 sudo chmod -R 777 /usr/local/openfire/bin // 以超级管理员的权限运行脚本 sudo su cd /usr/local/openfire/bin // 设置 Java 的环境变量 export JAVA_HOME=`/usr/libexec/java_home` // 输出检验环境变量的值 echo $JAVA_HOME 输入上面的命令后回车,就会出现后面的这些语句 /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home 接着在终端,输入以下命令: cd /usr/local/openfire/bin // 运行 Openfire shell 脚本 ./openfire.sh 输入上面的命令后回车,就会出现后面的这些语句 Openfire 4.1.2 [2016-2-21 2:47:51] 管理平台开始监听: http://jhq0228-macbookair.local:9090 https://jhq0228-macbookair.local:9091 Successfully loaded plugin 'admin'. 执行完这些命令之后,服务器就可以启动了,每次开机后,都启动不了的话,都试下这个方法。 2、配置 Openfire 在 Openfire 偏好设置界面中,点击 Open Admin Console,进入 web 配置页面,开始配置 Openfire 服务器。 2.1 选择语言 简体中文 2.2 服务器设置 域:如果只是本地机器上登录,可以设置为本地的域 127.0.0.1。需要远端登录的话,设置为相应的 IP 地址或域名即可。此处设置为 Mac 的机器名。 Server Host Name (FQDN):服务器名,不能为 IP 地址。 2.3 数据库设置 1、选择数据库 如果要设置外部数据库(推荐,比如:MySQL),选择标准数据库连接。 前期 MySQL 数据库准备工作 MySQL 安装具体讲解见 iOS - MySQL 的安装配置。 1)设置 /usr/local/openfire 文件夹的访问权限为可读写 方法1:在 finder 中前往文件夹 /usr/local/,右键 openfire 文件夹,显示简介,点击如图右下角中的锁图标解锁,并设置权限为可以读写。 方法2:打开终端,输入如下命令 $ sudo chmod 777 /usr/local/openfire 其中 777 表示授权可读写权限,000 表示无访问权限。 2)在终端中登陆 MySQL,输入以下命令,然后输入数据库的 root 密码登录 $ mysql -u root -p 回车后,终端输出 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 946 Server version: 5.7.17 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 3)在终端输入以下命令,创建数据库 openfire create database openfire; 回车后,终端输出 Query OK, 1 row affected (0.03 sec) 4)在终端输入以下命令,导入 openfire 资源文件夹 resources/database 下的数据表 use openfire; source /usr/local/openfire/resources/database/openfire_mysql.sql 在终端出现一排导入过程 5)在终端输入以下命令,刷新权限 flush privileges; 回车后,终端输出 Query OK, 0 rows affected (0.07 sec) 6)在终端输入以下命令,退出 MySQL exit 2、设置数据库连接 设置标准数据库连接 1)数据库驱动选项 选择 MySQL,前提是已安装 MySQL。 2)JDBC 驱动程序类 默认不变,默认为: com.mysql.jdbc.Driver 3)数据库 URL 形式如下: jdbc:mysql://你的主机名:端口号/数据库名称 jdbc:mysql://[host-name]:3306/[database-name]?rewriteBatchedStatements=true [host-name] :主机名 [database-name]:数据库名称 这里设置为: jdbc:mysql://localhost:3306/openfire 其中主机名 [host-name] 改为 localhost。 其中数据库名称 [database-name] 改为 openfire。 解决数据库字符编码问题,可以在后面加 ?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 最终的 url 形式是 jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 注意:前提是已存在一个名为 openfire 的数据库,否则会报如下错误,连接配置不成功。openfire 数据库的创建具体见前面所讲的 “前期 MySQL 数据库准备工作”。 The Openfire database schema does not appear to be installed. Follow the installation guide to fix this error. 4)用户名和密码 这里的用户名密码,是访问 MySQL 数据库时使用的帐号:root,和安装 MySQL 设置的 root 密码。 2.4 特性设置 如果不打算使用 LDAP,则保持默认设置即可。 特性设置时出错问题解决 解决方法 在 OpenFire 偏好设置中重启 OpenFire,然后重新进入 OpenFire web 配置页面,重新开始配置 Openfire 服务器即可。 2.5 管理员账户设置 可以随便填写一个管理员邮箱,输入要设置的密码即可。管理员账号默认为 "admin",如果不设置密码,则默认密码为 "admin"。 自定义管理员账户名方法 在终端输入以下命令,输入数据库的 root 密码,登陆具体的数据库(openfire) mysql -u root -p openfire 删除表 “ofUser” 中的 admin 帐户 delete from ofUser where username = 'admin'; 创建自定义管理员(用户名:qianchia,密码:123456) insert into ofUser (username, plainPassword, encryptedPassword, name, email, creationDate, modificationDate) values('qianchia','123456','123456','Administrator','qianchia@icloud.com','0','0'); 查看用户 select * from ofUser; 如果可以往数据库里插入用户但是在用户摘要却没有数据,这是因为 openfire 的数据库驱动包太旧了,而安装的数据库太新了,把 openfire 里的驱动包换成新的就行了,路径:/usr/local/openfire/lib。 2.6 登陆管理控制台 完成安装后可以输入用户名和密码登陆管理控制台 默认的管理员帐号是 “admin”,默认管理员密码 “admin”,如果上面设置了新密码,则管理员密码是新密码。如果重设了用户名,必须重启 openfire 服务器。 无法登录管理控制平台问题解决 安装 Openfire 后 admin 无法登录管理控制平台。登录时提示:Login failed:make sure your username and password are correct and that you’re an admin or moderator。 解决方案如下: 1)使用 MySQL 查看工具进入数据库,进入表 “ofuser”,将该表清空,然后执行该 SQL INSERT INTO ofUser (username, plainPassword, name, email, creationDate, modificationDate) VALUES ('admin', 'admin', 'Administrator', 'admin@example.com', '0', '0'); 2)关闭 Openfire 服务,就是从其控制台 stop 然后再 start,再用用户名:admin,密码:admin 登录即可。 每次重启 Mac 电脑都需要重新配置 Openfire 问题解决 解决方法: 打开 /usr/local/openfire/conf/ 文件夹。 将 openfire.xml 和 security.xml 两个文件的权限设置为读与写。 重新完成 Openfire 配置。 3、卸载 Openfire 方法 1、卸载之前首先要停止 Openfire 服务。 系统偏好中点击 Openfire 图标,如下图 在 Openfire 偏好设置界面中,点击 Stop Openfire。 2、删除 Openfire 文件。 在终端里,输入以下三条命令执行即可。 sudo rm -rf /Library/PreferencePanes/Openfire.prefPane 以上执行后需要输入管理员密码。 sudo rm -rf /usr/local/openfire sudo rm /Library/LaunchDaemons/org.jivesoftware.openfire.plist 4、测试服务器 4.1 添加测试账户 服务器配置完成之后,我们可以创建几个用户,然后客户端可以使用这些用户信息登录,互相传输消息。 4.2 XMPP 客户端设置与使用 有许多通信聊天客户端可以支持 XMPP 协议,比如,Mac 电脑就自带了一个 “信息” app,“信息” app 就支持 jabber 通信协议(XMPP 的别名)。 打开 Mac 的 “信息” app,点击菜单 信息 -> 添加账户,选择其他 “信息” 账户... 选择 jabber 账户类型,填写相关信息 账户类型:Jabber 用户名:上边添加的测试账户名,格式必须为:名称@openfire服务器名称 密码:用户名对应的密码 服务器:openfire 服务器地址,可以使用自动查找服务器和端口 端口:openfire 服务器客户端端口 然后,提示验证证书,选择继续。 登录成功。 登录成功后在 openfire 服务器端可以看到用户的登录状态。

优秀的个人博客,低调大师

CentOS下LVS DR模式详细搭建过程

1、LVS环境组网 由于是使用的VM环境,自己PC当作客户机(即公网地址),调度器与服务器都是VM中虚拟机,所以客户和所有服务器之间都是物理直接相连网络,逻辑拓扑图如下: 2、ipvsadm安装前准备 外部IP地址 内部IP地址 角色 10.211.55.16/24 192.168.1.3/24 LVS调度器(虚拟机) 10.211.55.15/24 192.168.1.4/24 RS1(虚拟机) 10.211.55.14/24 192.168.1.5/24 RS2(虚拟机) 10.211.55.19/24 无 客户机(自己电脑) 注:实际应用中RS1 RS2没有外部地址,当前环境中,没有物理双网卡环境,都采用一个网卡配置多个IP地址。 例: [root@LVS1~]#cp/etc/sysconfig/network-scripts/ifcfg-eth0/etc/sysconfig/network-scripts/ifcfg-eth0:0 [root@LVS1~]#vi/etc/sysconfig/network-scripts/ifcfg-eth0:0#修改后保存退出 DEVICE=eth0:0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.1.3 NETMASK=255.255.255.0 [root@LVS1~]#/etc/init.d/networkrestart 3、httpd与ipvsadm下载 1)在各服务器上关闭防火墙和修改主机名: [root@LVS1~]#serviceiptablesstop [root@LVS1~]#hostnameLVS1 [root@RS1~]#serviceiptablesstop [root@RS1~]#hostnameRS1 [root@RS2~]#serviceiptablesstop [root@RS2~]#hostnameRS2 2)在RS1 RS2上安装httpd服务 [root@RS2~]#yuminstallhttpd&ndash;y [root@RS2~]#/etc/init.d/httpdstart [root@RS2~#ps-ef|grephttpd [root@RS1~]#yuminstallhttpd&ndash;y [root@RS1~]#/etc/init.d/httpdstart [root@RS1~#ps-ef|grephttpd<==查看httpd服务是否起来 [root@RS1~]#cat/etc/httpd/conf/httpd.conf|grepDocumentRoot<==查找系统站点目录路径 #DocumentRoot:Thedirectoryoutofwhichyouwillserveyour DocumentRoot"/var/www/html" #ThisshouldbechangedtowhateveryousetDocumentRootto. #DocumentRoot/www/docs/dummy-host.example.com [root@RS1~]#echo"RS1">/var/www/html/index.html [root@RS2src]#echo"RS2">/var/www/html/index.html Httpd服务测试: 3)下载ipvsadm wgethttp://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz ln 我所使用的源包下载目录/usr/local/src 我的LVS环境: [root@LVS1~]#yum-yinstallkernel-develgccc++ [root@RS1src]#cat/etc/redhat-release CentOSrelease5.8(Final) [root@RS1src]#uname-rm 2.6.18-308.el5x86_64 ipvsadm-1.26对内核有要求,要求内核版本在2.6.28及以后的版本,如果符合了系统环境,还要安装依赖包yum install libnlpopt-y。 我的内核版本不满足,使用ipvsadm-1.24。 [root@LVS1src]#tar-zxfipvsadm-1.24.tar.gz [root@LVS1src]#ln-s/usr/src/kernels/2.6.18-348.12.1.el5-x86_64/usr/src/linux<==编译有使用的路径为/usr/src/linux,可在Makefile中查看,如果不做链接,会编译失败 [root@LVS1src]#ll/usr/src/ total16 drwxr-xr-x2rootroot4096May112011debug drwxr-xr-x3rootroot4096Aug503:53kernels lrwxrwxrwx1rootroot43Aug503:56linux->/usr/src/kernels/2.6.18-348.12.1.el5-x86_64<==要使用ll/usr/src/查看,如果软链接一闪一闪的,代表链接失败 [root@LVS1src]#cdipvsadm-1.24 [root@LVS1ipvsadm-1.24]#make&&makeinstall<==如果编译失败,请按上面步骤一步一步排错。 [root@LVS1ipvsadm-1.24]#lsmod|grepip_vs<==查看内核模块是否有ipvsadm [root@LVS1ipvsadm-1.24]#ipvsadm IPVirtualServerversion1.2.1(size=4096) ProtLocalAddress:PortSchedulerFlags ->RemoteAddress:PortForwardWeightActiveConnInActConn 还有一种加载ipvsadm方法,用modprobe ip_vs [root@LVS1 ipvsadm-1.24]# lsmod |grep ip_vs <==查看内核模块,有代表ipvsadm加载进内核当中,此时LVS安装完毕ip_vs 122113 0 4、LVS负载均衡配置 1)配置VIP和DIP IP配置参考步骤2安装准备 [root@LVS1~]#ifconfigeth010.211.55.16netmask255.255.255.0#VIP [root@LVS1~]#ifconfigeth0:1192.168.1.3netmask255.255.255.0#DIP 2)添加真实服务器 [root@LVS1~]#ipvsadm&ndash;C<==手工清空原来表内容 [root@LVS1~]#ipvsadm--set30560<==设置连接超时值 [root@LVS1~]#ipvsadm-A-t10.211.55.16:80-swrr-p20<==-A添加地址,-t指定VIPTCP端口,-s指定调度算法–p会话保持时间 [root@LVS1~]#ipvsadm-L-n<==查看表内容,添加了一组VIP地址和端口 IPVirtualServerversion1.2.1(size=4096) ProtLocalAddress:PortSchedulerFlags ->RemoteAddress:PortForwardWeightActiveConnInActConn TCP10.211.55.16:80wrrpersistent20 [root@LVS1~]#ipvsadm-a-t10.211.55.16:80-r192.168.1.4:80-g-w1<==-a指定真实服务器,-tlvs上VIP,-r真实服务器ip及端口,-w权重值,-g先择DR模式(-m为NAT模式) [root@LVS1~]#ipvsadm-a-t10.211.55.16:80-r192.168.1.5:80-g-w1 [root@LVS1~]#ipvsadm-L-n<==查看表内容,添加了两台负载转发的真实服务器 IPVirtualServerversion1.2.1(size=4096) ProtLocalAddress:PortSchedulerFlags ->RemoteAddress:PortForwardWeightActiveConnInActConn TCP10.211.55.16:80wrrpersistent20 ->192.168.1.4:80Route100 ->192.168.1.5:80Route100 如果添加服务器地址写错了,可用如下命令删除,即大A添加改为大D删除,小a添加改为小d删除 ipvsadm&ndash;D&ndash;t10.211.55.16:80&ndash;swrr ipvsadm&ndash;d&ndash;t10.211.55.16:80&ndash;r192.168.1.4:80 5、真实WEB服务器配置及arp抑制 [root@RS1~]#ifconfigeth0|grep"inetaddr"<==此地址用来自己电脑用CRT软件登陆设备,同时也用来发送arp请求客户机MAC(因为是直接返回页面给客户机,而当前网络是同一物理网段,必须同网段才正常)。 inetaddr:10.211.55.15Bcast:10.211.55.255Mask:255.255.255.0 [root@RS1~]#ifconfigeth0:0192.168.1.4netmask255.255.255.0<==配置内部IP地址 [root@RS1~]#ifconfiglo10.211.55.16netmask255.255.255.255<==每台真实服务器都需要配置VIP 为什么要绑定VIP呢?因为DR模式原理是LVS调度器修改mac地址为真实服务器地址,报文的目的IP还是VIP没修改,,网卡只会把目的MAC和目的IP都是自己的报文上送CPU,所以真实服务器上必须配置VIP! 为什么使用lo口呢?因为lo口为本地环回口,防止本地局域网IP地址冲突! [root@RS2src]#ifconfieth0|grep"inetaddr"<==此地址用来自己电脑用CRT软件登陆设备,同时也用来发送arp请求客户机MAC(因为是直接返回页面给客户机,而当前网络是同一物理网段,必须同网段才正常)。 inetaddr:10.211.55.14Bcast:10.211.55.255Mask:255.255.255.0 [root@RS2src]#ifconfigeth0:0192.168.1.5netmask255.255.255.0<==配置内部IP地址 [root@RS2src]#ifconfiglo10.211.55.16netmask255.255.255.255 此时配置完成,只是测试时出现一个问题,再次登陆CRT中 10.211.55.16地址时,登陆到RS1上去了,再刷新,登陆到RS2上去了。怎么解决呢? 通过分析,得出,访问10.211.55.16时,会发送arp请求10.211.55.16的mac,而这个网络中有3个10.211.55.16地址,此时,那谁给的arp回应到客户机,访问的就是谁了。如果RS1的arp回应先到,就访问的RS1了 解决方法: 抑制ARP响应 该抑制只在真实服务器上配置 [root@RS1~]#echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore [root@RS1~]#echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce [root@RS1~]#echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore [root@RS1~]#echo"2">/proc/sys/net/ipv4/conf/all/arp_announce [root@RS2src]#echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore [root@RS2src]#echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce [root@RS2src]#echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore [root@RS2src]#echo"2">/proc/sys/net/ipv4/conf/all/arp_announce 1 2都代表什么内容,可在最后附录中查看,也可自己网上搜索 显示的值是RS1,则此时该链接是分配到192.168.1.4上 我们使用的是wrr调度算法,该算法中,谁的权重值高,会优先分配给谁 查看配置,发现权重值一样 [root@LVS1~]#ipvsadm-L-n IPVirtualServerversion1.2.1(size=4096) ProtLocalAddress:PortSchedulerFlags ->RemoteAddress:PortForwardWeightActiveConnInActConn TCP10.211.55.16:80wrrpersistent20 ->192.168.1.4:80Route100 ->192.168.1.5:80Route100 由于有会话保持功能,接下来修改权重值 [root@LVS1~]#ipvsadm-d-t10.211.55.16:80-r192.168.1.5:80<==删除原来配置 [root@LVS1~]#ipvsadm-a-t10.211.55.16:80-r192.168.1.5:80-g-w2<==重新配置权重值为2 [root@LVS1~]#ipvsadm-L-n IPVirtualServerversion1.2.1(size=4096) ProtLocalAddress:PortSchedulerFlags ->RemoteAddress:PortForwardWeightActiveConnInActConn TCP10.0.0.30:80wrrpersistent20 ->192.168.1.5:80Route200 ->192.168.1.4:80Route100 再次进行测试: 7、附:arp抑制参数 arp响应限制 1)arp_ignore: 定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7 - 保留未使用 8 -不回应所有(本地地址)的arp查询 2)arp_announce: 对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

优秀的个人博客,低调大师

Hive基本原理及环境搭建

今天我主要是在折腾这个Hive,早上看了一下书,最开始有点凌乱,后面慢慢地发现,hive其实挺简单的,以我的理解就是和数据库有关的东西,那这样的话对我来说就容易多啦,因为我对sql语法应该是比较熟悉了,而这个是HQL的,其实很多都差不多。先来看一下Hive的基本介绍: 一、Hive基本原理 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。 Hive将元数据存储在数据库(RDBMS)中,比如MySQL、Derby中。Hive有三种模式连接到数据,其方式是:单用户模式,多用户模式和远程服务模式。(也就是内嵌模式 、本地模式、远程模式)。 1.1 Hive体系结构: Hive体系结构图:主要分为:用户接口、Thrift服务器、元数据存储、解析器、Hadoop 1.2 Hive数据类型 Hive的存储是建立在Hadoop文件系统之上的,它本身没有专门的数据存储格式,其主要包括四类数据模型: 表(Table) 分区(Partition) 桶(Bucket) 外部表(External Table) Hive的内置数据类型可以分为两大类:(1)、基础数据类型;(2)、复杂数据类型。其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。 1.3Hive的执行流程要点 操作符(Operator)是Hive的最小处理单位; 每个操作符处理代表HDFS操作或MR作业; 编译器把Hive SQL转换成一组操作符; Hive通过ExecMapper和ExecReducer来执行MapReduce任务; 执行MapReduce时有两种模式:本地模式和分布式模式; 常见的Hive操作符(部分)如下: 1.4 Hive的HQL操作 hive基本的运行操作其实和sql差不多,例如: select u.name, o.orderid from order o join user u on o.uid = u.uid; select dealid, count(distinct uid), count(distinct date) from order group by dealid; 简单Hive表语句: create table student ( name string, sex string, age int ); 二、Hive基本配置 1、从apache官网的hadoop找到hive,目前最新版本是2.0.1,我下的就是这个,http://hive.apache.org/downloads.html, 2、下载mysql驱动,目前是5.1.38的 ,我已经把这需要的两个整理好一个压缩包了,可以通过以下链接下载:(我后续贴出) 3、分别解压到你需要的目录中,我是放置在/home/admin1/下载/hive-2.0.1中的,把mysql驱动也放到hive的这个lib包中,然后在hive-2.0.1/conf中对以下文件进行配置: 新建一个文件hive-env.sh 把里面的目录改成你的hadoop放置的目录就可以了。 export HIVE_HOME=/home/admin1/下载/hive-2.0.1 export PATH=$PATH:$HIVE_HOME/bin HADOOP_HOME=/home/admin1/下载/hadoop-2.5.2 export HIVE_CONF_DIR=/home/admin1/下载/hive-2.0.1/conf export HIVE_AUX_JARS_PATH=/home/admin1/下载/hive-2.0.1/lib 还需要新建一个hive-site.xml: 这里我用的是mysql的账号和密码来配置的,其他的你也可以参照配置。 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <!--<value>jdbc:derby:;databaseName=metastore_db;create=true</value>--> <value>jdbc:mysql://localhost:3306/hive?=createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBCmetastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <!--<value>org.apache.derby.jdbc.EmbeddedDriver</value>--> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBCmetastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>username to use against metastoredatabase</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>a</value> <description>password to use against metastoredatabase</description> </property> </configuration> 启动:在/home/admin1/下载/hive-2.0.1中执行: bin/hive 若无法初始化,则: bin/schematool -dbType mysql -initSchema 在hive2.0以上版本都需要initSchema一下,否则会报错,我也是因为这个问题折腾了好几个小时,最后发现很简单就解决了。 最后说一下的就是在安装mysql的时候,你可以直接用ubuntu里面的uk软件下载就可以了,在里面搜索mysql,然后下载mysql的服务器,客户端和工作平台就可以了,这里不再重复啰嗦了,就是需要在控制台创建一下新用户: mysql -uroot create user 'hive' identified by 'a'; create database hive; grant all privileges on *.* to 'hive'@'%' identified by 'a'; flush privileges 然后可以通过hive账号进行登陆就可以了, mysql -u hive -p 然后输入密码hive就成功登陆,把这个登陆信息配置到hive-site.xml中就可以了。 接下来就可以愉快的进行hive的使用了,创建表等。记得要把hadoop的服务打开哦 , sbin/start-all.sh 总结:今天遇到的两个主要问题就是,1:bin/hive后一直报错,最后初始化之后就可以了。2、在linux中的sublim-text无法输入中文,且无法下载gpk解决,无法编译sublime_imfix.c,后来通过在github上面发现已经编译好的库,然后导入,经过一系列复杂的操作最后成功解决了这个问题。找对方法,找对工具。

优秀的个人博客,低调大师

ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程

环境:OS X 10.10.5 + JDK 1.8 步骤: 一、下载ELK的三大组件 Elasticsearch下载地址: https://www.elastic.co/downloads/elasticsearch (目前最新版本:2.1.1) Logstash下载地址:https://www.elastic.co/downloads/logstash(目前最新版本:2.1.1) Kibana下载地址:https://www.elastic.co/downloads/kibana(目前最新版本:4.3.1) 下载后将其解压到某个目录即可,本文中的解压目录为: ~/app/elasticsearch-2.1.1 ~/app/logstash-2.1.1 ~/app/kibana-4.3.1-darwin-x64 注:这3个组件相互之间的关系及作用如下: Logstash(收集服务器上的日志文件) --》然后保存到 ElasticSearch(搜索引擎) --》Kibana提供友好的web界面(从ElasticSearch读取数据进行展示) 二、启动elasticsearch 2.1 进入elasticsearch目录\bin ./elasticsearch 顺利的话,启动成功后,在浏览器里输入http://localhost:9200/ 应该能看到类似下面的输出: 1 { 2 "name" : "Atalanta", 3 "cluster_name" : "elasticsearch", 4 "version" : { 5 "number" : "2.1.1", 6 "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71", 7 "build_timestamp" : "2015-12-15T13:05:55Z", 8 "build_snapshot" : false, 9 "lucene_version" : "5.3.1" 10 }, 11 "tagline" : "You Know, for Search" 12 } 2.2 安装kopf插件 先按Ctrl+C停止elasticsearch,接下来准备安装插件,elasticsearch有大量插件资源,用于增加其功能,bin目录下,输入 ./plugin list 可以查看当前安装的插件列表,我们刚刚全新安装,输出的是一个空列表,继续输入 ./plugin install lmenezes/elasticsearch-kopf 将会联网安装kopf插件,安装完成后,再次用./plugin list确认下: Installed plugins in /Users/yjmyzz/app/elasticsearch-2.1.1/plugins: - .DS_Store - kopf 如果输出上述类似,表明kopf安装成功。 然后重启elasticsearch,浏览器里输入http://localhost:9200/_plugin/kopf,将会看到类似下面的界面,可以很直观的看到elasticsearch的一些运行状况 以上操作都ok后,建议Ctrl+C关掉,改用nohup ./elasticsearch & 将其做为后台进程运行,以免退出。 三、logstash的启动与配置 3.1 新建索引配置文件 ~/app/logstash-2.1.1/bin 下 mkdir conf vi conf/logstash-indexer.conf 内容如下: 1 input { 2 file { 3 path => ["/var/opt/log/a.log","/var/opt/log/b.log"] 4 } 5 } 6 7 output { 8 elasticsearch { hosts => ["localhost:9200"] } 9 stdout { codec => rubydebug } 10 } 上面几个步骤的意思就是创建一个名为logstash-indexer.conf的配置文件,input{file{...}}部分指定的是日志文件的位置(可以多个文件),一般来说就是应用程序log4j输出的日志文件。output部分则是表示将日志文件的内容保存到elasticsearch,这里hosts对应的是一个数组,可以设置多个elasticsearch主机,相当于一份日志文件的内容,可以保存到多个elasticsearch中。 至于第9行的stdout,则表示终端的标准输出,方便部署时验证是否正常运行,验证通过后,可以去掉。 3.2 启动 继续保持在logstash的bin目录下,输入 ./logstash -f conf/logstash-indexer.conf 稍等片刻,如果看到Logstash startup completed,则表示启动成功。然后另开一个终端窗口,随便找个文本编辑工具(比如:vi),向/var/opt/log/a.log里写点东西,比如:hello world之类,然后保存。观察logstash的终端运行窗口,是否有东西输出,如果有以下类似输出: 1 { 2 "message" => "hello world", 3 "@version" => "1", 4 "@timestamp" => "2016-01-08T14:35:16.834Z", 5 "host" => "yangjunmingdeMacBook-Pro.local", 6 "path" => "/var/opt/log/a.log" 7 } 说明logstash工作正常,此时浏览http://localhost:9200/_search?pretty 也应该能看到一堆输出,表明elasticsearch接收到logstash的数据了。 四、kibana的配置及启动 4.1 修改配置文件 ~/app/kibana-4.3.1-darwin-x64/config 下有一个配置文件kibana.yml,大概在12行的位置,改成下面这样: 1 # The Elasticsearch instance to use for all your queries. 2 elasticsearch.url: "http://localhost:9200" 即:指定elasticsearch的访问位置 4.2 启动 ~/app/kibana-4.3.1-darwin-x64/bin 下,输入: ./kibana 注:如果启动不成功,请检查版本是否为4.3.1,kibana必须与elasticsearch的版本匹配,一般说来,都从官网下载最新版即可。 启动完成后,在浏览器里输入http://localhost:5601/ 即可看到kibana界面,首次运行,会提示创建index,直接点击Create按钮即可。 然后,就能看到类似下面的界面了: 参考文章: http://baidu.blog.51cto.com/71938/1676798?utm_source=tuicool&utm_medium=referral https://www.elastic.co/products http://www.cnblogs.com/yjf512/p/4199105.html http://kibana.logstash.es/content/

优秀的个人博客,低调大师

精选博客系列|VMware Tanzu Mission Control增强策略功能,让Kubernetes的安全性更加灵活

随着分布式系统日益复杂,定义和实施 Kubernetes 集群的策略以确保环境的安全性、可靠性和合规性——当然也是为了构建可扩展性的支撑结构,变得至关重要。 因此,我们很高兴宣布 VMware Tanzu Mission Control 现在有了更多的策略相关的改进,旨在增强 Kubernetes 安全性。平台团队现在可以改变工作负载的安全上下文(security context),并修改默认的 Open Policy Agent(OPA)Gatekeeper策略设置。 Tanzu Mission Control推出动态修改,或称变异(mutation)策略是因为它们可以显著增强组织的安全措施,使其能够保持一种始终开启的安全姿态。这些策略可以对pod的功能施加限制,以帮助阻止恶意行为。例如,它们可以禁止使用特权容器或禁止容器作为root操作,从而有助于最大程度地降低潜在安全漏洞的风险。此外,它支持那些正在将集群迁移出Pod Security Policies(PSPs)的客户,同时仍然保持其组织的安全姿态。它还支持平台团队采用“左移(shift left)”安全策略,有助于减轻开发人员在Kubernetes安全策略和设置这个不断变化的世界中所面临的负担。这有助于在企业范围内始终强制保证平台团队所需的安全状态,无论使用哪种Kubernetes发行版。 我们发布的第二部分涵盖了修改默认的OPA Gatekeeper策略设置的能力,例如增加资源限制,以实现更好的治理,使用户能够更好地调整对高使用率的集群的资源分配。此外,它还给要求高安全性及合规性的公司,如金融领域的公司等,提供了覆盖默认设置的能力,例如修改失败策略和超时秒数等,以更有效地锁定其基础设施。 在跨集群和跨环境中自动执行策略 Tanzu Mission Control目前能够帮助平台团队应用多种类型的策略,包括: 访问- 能够为每个组或个人授予对集群或单独的命名空间的访问权限。 网络- 可以将应用程序分隔开并确保其不会接收到不需要的流量。 镜像仓库- 有能力只允许从已知和可信的仓库中拉取镜像,防止来自不受信任来源的镜像像,并避免使用如Docker hub等外部来源。 配额- 使用预配置和自定义模板,限制您的集群中指定的多个命名空间的总体资源使用数量。 安全– 能够限制容器的功能和特权升级,并配置策略以进行监视而无需执行,以便可以识别违规者。 自定义- 使用模板实施额外的业务规则,执行那些未被其他内置策略类型覆盖的策略。 PSP和OPA Gatekeeper都可以用于在Kubernetes环境中执行安全策略,但它们的方法和能力有所不同。 在其他原生Kubernetes安全组件(例如Antrea Network Policies)之外,VMware使用OPA作为Tanzu Mission Control中的策略引擎,用于安全、自定义和镜像相关的策略,因为它具有更广泛的灵活性(例如支持可变策略),并且是一个拥有充满活力社区的Cloud Native Computing Foundation(CNCF)的已毕业开源项目。 随着PSP在Kubernetes v1.25及更高版本中被移除,许多使用这个解决方案的组织可能会措手不及,不得不赶紧更新他们的部署和配置。因此,利用OPA Gatekeeper可以帮助确保工作负载在必要的更新和应用更改发生时是符合标准的。 OPA Gatekeeper的好处包括支持“dryrun”等操作,它允许用户创建一个策略而不强制执行它,并通过“Insights”页面查看任何违规情况,以修复他们的工作负载或更新策略、当确认策略设置没问题后,可以再将执行行为更改为“拒绝”。管理员可以在细粒度级别(群集、群集组或组织)定义策略并相应地执行它们,使其成为一个更强大的解决方案,用于规模化管理安全策略。管理员还可以使用基于标签的命名空间选择器来包括和排除特定的命名空间,确保集群符合安全策略。 通过提供在Kubernetes环境中执行策略的更强大和灵活的方式,OPA Gatekeeper提供了更好的治理能力,以在集群间执行策略。 这就是为什么我们在Tanzu Mission Control中通过增加策略相关功能来提升Kubernetes的安全,包括可以修改容器和Pod的安全上下文并修改默认的OPA Gatekeeper策略设置。 不再有验证错误:使用变异(mutation)策略设置更多规则 变异策略与验证安全策略不同,因为它们不会阻止创建可能违反策略的 Kubernetes 资源。相反,它们将在运行时更新或改变该请求以创建所需的资源。 因此,变异策略是提高 Kubernetes 对象可靠性和一致性的强大工具,通过强制实施策略限制并确保对象始终处于有效状态。 要创建变异策略,平台管理员必须前往策略分配下的Mutation选项页,并单击创建变异策略。Tanzu Mission Control目前提供对PodSecurity的动态修改,未来将支持更多选项。 平台管理员可以为其策略输入名称,并选择安全上下文中的需要修改的多个字段,以便在该集群中有人创建Pod时,它将继承这些安全相关属性值。 一个常见的变异策略示例是确保所有提交的工作负载都配置了runAsUser、runAsNonRoot和disallowPrivilegeEscalation。Gatekeeper Admission控制器根据变异策略中定义的属性验证资源,并根据您配置的条件(Always、IfFieldExists、IfFieldDoesNotExist)通过Admission控制器为资源添加属性。 (在Tanzu Mission Control中创建具有修改值的变异策略) Pod安全性扩展:更新Gatekeeper的设置 如上所述,Tanzu Mission Control有各种类型的警戒策略,其中一些(例如安全性、镜像、自定义和变异)是使用OPA Gatekeeper开源工具执行的。 当Tanzu Mission Control在集群上安装Gatekeeper时,会应用一些默认设置和配置值。 现在,通过新的策略设置功能,各组织可以在TMC界面的左侧菜单中的管理页面内的设置选项卡中覆盖其中的一些值。 这意味着组织和管理员可以调整Gatekeeper部署设置以适应其所有级别,例如组织、集群组和集群。此初始版本允许修改Validating Webhook的配置(更改失败策略和超时秒数)以及控制器管理器部署和自动部署设置(通过改变副本数和CPU内存限制)。 这种增加的灵活性的一个例子是覆盖Gatekeeper的默认验证Webhook策略,该策略目前(默认情况下)设置为“忽略”,即如果Gatekeeper在集群上宕机,也仍允许Cron作业和其他工作负载被接受和创建。通过将该默认设置更改为“失败”,管理员将能够确保拒绝任何工作负载或作业,直到Gatekeeper再次可用。 能够在利用OPA Gatekeeper的关键安全功能的同时覆盖策略设置,使Tanzu Mission Control成为跨多云Kubernetes集群的企业策略管理的非常强大的选择。 (Tanzu Mission Control的管理区域中的“设置”选项卡视图) (在Tanzu Mission Control的新设置功能中,验证Webhook配置) 访问策略已支持Kubernetes服务账户(servicee account) Tanzu Mission Control现在允许在访问策略中创建角色绑定(role binding)时将Kubernetes服务帐户作为实体类型使用。通过这个更新,管理员可以在整个集群群集中管理服务帐户访问,而不是在每个群集上单独管理,从而减少了专门处理此类操作的时间,他们还可以跨集群审计策略。 在Kubernetes中,服务帐户身份类型非常重要,因为它们确定服务帐户在集群中具有的访问和权限级别,这对于维护集群的安全性和完整性至关重要。 能够向服务帐户添加策略非常有价值,因为它有助于进一步确保只有经过授权的服务和用户可以访问Kubernetes集群中的资源,而服务帐户仅限于执行其任务所需的资源。这再次提高了集群的安全性和稳定性,尤其是在多租户环境中。 内容来源|公众号:VMware 中国研发中心

优秀的个人博客,低调大师

基于百度飞桨paddlepaddle的疫情可视化实战 |【大学生博客大赛】

百度paddlepaddle安装及疫情可视化实战 1. paddle安装可以参考官方文档 地址链接: https://www.paddlepaddle.org.cn/install/quick选择合适自己的方式进行安装 2. 疫情数据可视化 思路:通过爬虫得到数据并且通过pyecharts进行可视化 爬取丁香园公开的统计数据 上网的全过程: 普通用户打开浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 渲染到页面上。 爬虫程序模拟浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 提取有用的数据 --> 保存到本地/数据库。 爬虫的过程: 1.发送请求(requests模块) 2.获取响应数据(服务器返回) 3.解析并提取数据(re正则) 4.保存数据 我们用到了:request模块: requests是python实现的简单易用的HTTP库,官网地址:http://cn.python-requests.org/zh_CN/latest/ re模块: re模块是python用于匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的, import json import re import requests import datetime today = datetime.date.today().strftime('%Y%m%d') #20200315 def crawl_dxy_data(): """ 爬取丁香园实时统计数据,保存到data目录下,以当前日期作为文件名,存JSON文件 """ response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia') #request.get()用于请求目标网站 print(response.status_code) # 打印状态码 try: url_text = response.content.decode() #更推荐使用response.content.deocde()的方式获取响应的html页面 #print(url_text) url_content = re.search(r'window.getAreaStat = (.*?)}]}catch', #re.search():扫描字符串以查找正则表达式模式产生匹配项的第一个位置 ,然后返回相应的match对象。 url_text, re.S) #在字符串a中,包含换行符\n,在这种情况下:如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始; #而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。 texts = url_content.group() #获取匹配正则表达式的整体结果 content = texts.replace('window.getAreaStat = ', '').replace('}catch', '') #去除多余的字符 json_data = json.loads(content) with open('data/' + today + '.json', 'w', encoding='UTF-8') as f: json.dump(json_data, f, ensure_ascii=False) except: print('<Response [%s]>' % response.status_code) def crawl_statistics_data(): """ 获取各个省份历史统计数据,保存到data目录下,存JSON文件 """ with open('data/'+ today + '.json', 'r', encoding='UTF-8') as file: json_array = json.loads(file.read()) statistics_data = {} for province in json_array: response = requests.get(province['statisticsData']) try: statistics_data[province['provinceShortName']] = json.loads(response.content.decode())['data'] except: print('<Response [%s]> for url: [%s]' % (response.status_code, province['statisticsData'])) with open("data/statistics_data.json", "w", encoding='UTF-8') as f: json.dump(statistics_data, f, ensure_ascii=False) if __name__ == '__main__': crawl_dxy_data() crawl_statistics_data() 运行以上代码,我们需要在代码同目录下创建data文件夹运行成功后,在data文件夹下能够得到两个文件分别是:statistics_data.json和一个今天日期的json 安装第三方库pyecharts Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。pyecharts api可以参考:https://pyecharts.org/#/zh-cn/chart_api 使用 options 配置项,在 pyecharts 中,一切皆 Options。 主要分为全局配置组件和系列配置组件。 (1)系列配置项 set_series_opts(),可配置图元样式、文字样式、标签样式、点线样式等; (2)全局配置项 set_global_opts(),可配置标题、动画、坐标轴、图例等; pyecharts非常好用!!!我们通过pip安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts 如果下载时出现断线和速度过慢的问题导致下载失败,可以尝试使用其他国内源当出现Successfully installed pyecharts-1.7.1 simplejson-3.17.0时我们就安装成功了 数据可视化地图 全国地图 import json import datetime from pyecharts.charts import Map from pyecharts import options as opts # 读原始数据文件 today = datetime.date.today().strftime('%Y%m%d') #20200315 datafile = 'data/'+ today + '.json' with open(datafile, 'r', encoding='UTF-8') as file: json_array = json.loads(file.read()) # 分析全国实时确诊数据:'confirmedCount'字段 china_data = [] for province in json_array: china_data.append((province['provinceShortName'], province['confirmedCount'])) china_data = sorted(china_data, key=lambda x: x[1], reverse=True) #reverse=True,表示降序,反之升序 print(china_data) # 全国疫情地图 # 自定义的每一段的范围,以及每一段的特别的样式。 pieces = [ {'min': 10000, 'color': '#540d0d'}, {'max': 9999, 'min': 1000, 'color': '#9c1414'}, {'max': 999, 'min': 500, 'color': '#d92727'}, {'max': 499, 'min': 100, 'color': '#ed3232'}, {'max': 99, 'min': 10, 'color': '#f27777'}, {'max': 9, 'min': 1, 'color': '#f7adad'}, {'max': 0, 'color': '#f7e4e4'}, ] labels = [data[0] for data in china_data] counts = [data[1] for data in china_data] m = Map() m.add("累计确诊", [list(z) for z in zip(labels, counts)], 'china') #系列配置项,可配置图元样式、文字样式、标签样式、点线样式等 m.set_series_opts(label_opts=opts.LabelOpts(font_size=12), is_show=False) #全局配置项,可配置标题、动画、坐标轴、图例等 m.set_global_opts(title_opts=opts.TitleOpts(title='全国实时确诊数据', subtitle='数据来源:丁香园'), legend_opts=opts.LegendOpts(is_show=False), visualmap_opts=opts.VisualMapOpts(pieces=pieces, is_piecewise=True, #是否为分段型 is_show=True)) #是否显示视觉映射配置 #render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html") m.render(path='./data/数据.html') 这里代码都有完善的注释,就不拆解来讲了 ### 数据可视化湖北省地图 ```python import json import datetime from pyecharts.charts import Map from pyecharts import options as opts # 读原始数据文件 today = datetime.date.today().strftime('%Y%m%d') #20200315 datafile = 'data/'+ today + '.json' with open(datafile, 'r', encoding='UTF-8') as file: json_array = json.loads(file.read()) # 分析湖北省实时确诊数据 # 读入规范化的城市名称,用于规范化丁香园数据中的城市简称 with open('/home/aistudio/data/data24815/pycharts_city.txt', 'r', encoding='UTF-8') as f: defined_cities = [line.strip() for line in f.readlines()] def format_city_name(name, defined_cities): for defined_city in defined_cities: if len((set(defined_city) & set(name))) == len(name): name = defined_city if name.endswith('市') or name.endswith('区') or name.endswith('县') or name.endswith('自治州'): return name return name + '市' return None province_name = '湖北' for province in json_array: if province['provinceName'] == province_name or province['provinceShortName'] == province_name: json_array_province = province['cities'] hubei_data = [(format_city_name(city['cityName'], defined_cities), city['confirmedCount']) for city in json_array_province] hubei_data = sorted(hubei_data, key=lambda x: x[1], reverse=True) print(hubei_data) labels = [data[0] for data in hubei_data] counts = [data[1] for data in hubei_data] pieces = [ {'min': 10000, 'color': '#540d0d'}, {'max': 9999, 'min': 1000, 'color': '#9c1414'}, {'max': 999, 'min': 500, 'color': '#d92727'}, {'max': 499, 'min': 100, 'color': '#ed3232'}, {'max': 99, 'min': 10, 'color': '#f27777'}, {'max': 9, 'min': 1, 'color': '#f7adad'}, {'max': 0, 'color': '#f7e4e4'}, ] m = Map() m.add("累计确诊", [list(z) for z in zip(labels, counts)], '湖北') m.set_series_opts(label_opts=opts.LabelOpts(font_size=12), is_show=False) m.set_global_opts(title_opts=opts.TitleOpts(title='湖北省实时确诊数据', subtitle='数据来源:丁香园'), legend_opts=opts.LegendOpts(is_show=False), visualmap_opts=opts.VisualMapOpts(pieces=pieces, is_piecewise=True, is_show=True)) m.render(path='./data/湖北省数据.html') 增长趋势 on from pyecharts.charts import Line from pyecharts import options as opts # 读原始数据文件 datafile = 'data/statistics_data.json' with open(datafile, 'r', encoding='UTF-8') as file: json_dict = json.loads(file.read()) # 分析各省份2月1日至今的新增确诊数据:'confirmedIncr' statistics__data = {} for province in json_dict: statistics__data[province] = [] for da in json_dict[province]: if da['dateId'] >= 20200201: statistics__data[province].append(da['confirmedIncr']) # 获取日期列表 dateId = [str(da['dateId'])[4:6] + '-' + str(da['dateId'])[6:8] for da in json_dict['湖北'] if da['dateId'] >= 20200201] # 全国新增趋势 all_statis = np.array([0] * len(dateId)) for province in statistics__data: all_statis = all_statis + np.array(statistics__data[province]) all_statis = all_statis.tolist() # 湖北新增趋势 hubei_statis = statistics__data['湖北'] # 湖北以外的新增趋势 other_statis = [all_statis[i] - hubei_statis[i] for i in range(len(dateId))] line = Line() line.add_xaxis(dateId) line.add_yaxis("全国新增确诊病例", #图例 all_statis, #数据 is_smooth=True, #是否平滑曲线 linestyle_opts=opts.LineStyleOpts(width=4, color='#B44038'),#线样式配置项 itemstyle_opts=opts.ItemStyleOpts(color='#B44038', #图元样式配置项 border_color="#B44038", #颜色 border_width=10)) #图元的大小 line.add_yaxis("湖北新增确诊病例", hubei_statis, is_smooth=True, linestyle_opts=opts.LineStyleOpts(width=2, color='#4E87ED'), label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部 itemstyle_opts=opts.ItemStyleOpts(color='#4E87ED', border_color="#4E87ED", border_width=3)) line.add_yaxis("其他省份新增病例", other_statis, is_smooth=True, linestyle_opts=opts.LineStyleOpts(width=2, color='#F1A846'), label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部 itemstyle_opts=opts.ItemStyleOpts(color='#F1A846', border_color="#F1A846", border_width=3)) line.set_global_opts(title_opts=opts.TitleOpts(title="新增确诊病例", subtitle='数据来源:丁香园'), yaxis_opts=opts.AxisOpts(max_=16000, min_=1, type_="log", #坐标轴配置项 splitline_opts=opts.SplitLineOpts(is_show=True),#分割线配置项 axisline_opts=opts.AxisLineOpts(is_show=True)))#坐标轴刻度线配置项 line.render(path='./data/趋势图.html') 需要自己完成的饼状图 import json import datetime from pyecharts.charts import Map, Pie from pyecharts import options as opts # 读原始数据文件 today = datetime.date.today().strftime('%Y%m%d') #20200315 datafile = 'data/'+ today + '.json' with open(datafile, 'r', encoding='UTF-8') as file: json_array = json.loads(file.read()) # 分析全国实时确诊数据:'confirmedCount'字段 china_data = [] for province in json_array: china_data.append((province['provinceShortName'], province['confirmedCount'])) china_data = sorted(china_data, key=lambda x: x[1], reverse=True) #reverse=True,表示降序,反之升序 print(china_data) labels = [data[0] for data in china_data] counts = [data[1] for data in china_data] m = Pie(init_opts=opts.InitOpts(height='900px')) m.add("累计确诊", [list(z) for z in zip(labels, counts)], center=["50%", "60%"], radius=['0%', '40%']) #,)center=[100,50] m.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}", font_size=12), is_show=False) #全局配置项,可配置标题、动画、坐标轴、图例等 m.set_global_opts(title_opts=opts.TitleOpts(title='全国实时确诊数据', subtitle='数据来源:丁香园'), legend_opts=opts.LegendOpts(is_show=False, type_="scroll", pos_left="80%", orient="vertical"), ) #render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html") m.render(path='./data/饼状图.html') over!!!

优秀的个人博客,低调大师

[python作业AI毕业设计博客]英文原版新书下载:Impractical Python Projects - 2019.Pdf

python测试开发项目实战-目录 python工具书籍下载-持续更新 python 3.7极速入门教程 - 目录 下载:Impractical Python Projects - 2019.Pdf Impractical Python Projects is a collection of fun and educational projects designed to entertain programmers while enhancing their Python skills. It picks up where the complete beginner books leave off, expanding on existing concepts and introducing new tools that you'll use every day. And to keep things interesting, each project includes a zany twist featuring historical incidents, pop culture references, and literary allusions. You'll flex your problem-solving skills and employ Python's many useful libraries to do things like:• Help James Bond crack a high-tech safe with a hill-climbing algorithm • Write haiku poems using Markov Chain Analysis• Use genetic algorithms to breed a race of gigantic rats• Crack the world's most successful military cipher using cryptanalysis• Derive the anagram, "I am Lord Voldemort" using linguistical sieves • Plan your parents' secure retirement with Monte Carlo simulation• Save the sorceress Zatanna from a stabby death using palingrams• Model the Milky Way and calculate our odds of detecting alien civilizations• Help the world's smartest woman win the Monty Hall problem argument• Reveal Jupiter's Great Red Spot using optical stacking• Save the head of Mary, Queen of Scots with steganography• Foil corporate security with invisible electronic ink Simulate volcanoes, map Mars, and more, all while gaining valuable experience using free modules like Tkinter, matplotlib, Cprofile, Pylint, Pygame, Pillow, and Python-Docx. Whether you're looking to pick up some new Python skills or just need a pick-me-up, you'll find endless educational, geeky fun with Impractical Python Projects. e-Books Highlight Edition1st Edition ISBN159327890X Posted on12/3/2018 FormatPdf Page Count426 Pages AuthorLee Vaughan, 参考资料 本文最新版本地址 本文涉及的python测试开发库 谢谢点赞! 本文相关海量书籍下载 2018最佳人工智能机器学习工具书及下载(持续更新)

优秀的个人博客,低调大师

[雪峰磁针石博客]计算机视觉opcencv工具深度学习快速实战2 opencv快速入门

opencv基本操作 # -*- coding: utf-8 -*- # Author: xurongzhong#126.com wechat:pythontesting qq:37391319 # 技术支持 钉钉群:21745728(可以加钉钉pythontesting邀请加入) # qq群:144081101 591302926 567351477 # CreateDate: 2018-11-17 import imutils import cv2 # 读取图片信息 image = cv2.imread("jp.png") (h, w, d) = image.shape print("width={}, height={}, depth={}".format(w, h, d)) # 显示图片 cv2.imshow("Image", image) cv2.waitKey(0) # 访问像素 (B, G, R) = image[100, 50] print("R={}, G={}, B={}".format(R, G, B)) # 选取图片区间 ROI (Region of Interest) roi = image[60:160, 320:420] cv2.imshow("ROI", roi) cv2.waitKey(0) # 缩放 resized = cv2.resize(image, (200, 200)) cv2.imshow("Fixed Resizing", resized) cv2.waitKey(0) # 按比例缩放 r = 300.0 / w dim = (300, int(h * r)) resized = cv2.resize(image, dim) cv2.imshow("Aspect Ratio Resize", resized) cv2.waitKey(0) # 使用imutils缩放 resized = imutils.resize(image, width=300) cv2.imshow("Imutils Resize", resized) cv2.waitKey(0) # 顺时针旋转45度 center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, -45, 1.0) rotated = cv2.warpAffine(image, M, (w, h)) cv2.imshow("OpenCV Rotation", rotated) cv2.waitKey(0) # 使用imutils旋转 rotated = imutils.rotate(image, -45) cv2.imshow("Imutils Rotation", rotated) cv2.waitKey(0) # 使用imutils无损旋转 rotated = imutils.rotate_bound(image, 45) cv2.imshow("Imutils Bound Rotation", rotated) cv2.waitKey(0) # apply a Gaussian blur with a 11x11 kernel to the image to smooth it, # useful when reducing high frequency noise 高斯模糊 # https://www.pyimagesearch.com/2016/07/25/convolutions-with-opencv-and-python/ blurred = cv2.GaussianBlur(image, (11, 11), 0) cv2.imshow("Blurred", blurred) cv2.waitKey(0) # 画框 output = image.copy() cv2.rectangle(output, (320, 60), (420, 160), (0, 0, 255), 2) cv2.imshow("Rectangle", output) cv2.waitKey(0) # 画圆 output = image.copy() cv2.circle(output, (300, 150), 20, (255, 0, 0), -1) cv2.imshow("Circle", output) cv2.waitKey(0) # 划线 output = image.copy() cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5) cv2.imshow("Line", output) cv2.waitKey(0) # 输出文字 output = image.copy() cv2.putText(output, "https://china-testing.github.io", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imshow("Text", output) cv2.waitKey(0) 原图: 选取图片区间 ROI (Region of Interest) 缩放 按比例缩放 旋转 使用imutils无损旋转 高斯模糊 画框 画圆 划线 输出文字 执行时的输出 $ python opencv_tutorial_01.py width=600, height=322, depth=3 R=41, G=49, B=37 本节英文原版代码下载 关于旋转这块,实际上pillow做的更好。比如同样逆时针旋转90度。 opencv的实现: import imutils import cv2 image = cv2.imread("jp.png") rotated = imutils.rotate(image, 90) cv2.imshow("Imutils Rotation", rotated) cv2.waitKey(0) pillow的实现: from PIL import Image im = Image.open("jp.png") im2 = im.rotate(90, expand=True) im2.show() 更多参考: python库介绍-图像处理工具pillow中文文档-手册(2018 5.*) 参考资料 技术支持qq群144081101(代码和模型存放) 本文最新版本地址 本文涉及的python测试开发库 谢谢点赞! 本文相关海量书籍下载 2018最佳人工智能机器学习工具书及下载(持续更新) 代码下载:https://itbooks.pipipan.com/fs/18113597-320636142 代码github地址:https://github.com/china-testing/python-api-tesing/tree/master/opencv_crash_deep_learning 识别俄罗斯方块 # -*- coding: utf-8 -*- # Author: xurongzhong#126.com wechat:pythontesting qq:37391319 # 技术支持 钉钉群:21745728(可以加钉钉pythontesting邀请加入) # qq群:144081101 591302926 567351477 # CreateDate: 2018-11-19 # python opencv_tutorial_02.py --image tetris_blocks.png import argparse import imutils import cv2 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") args = vars(ap.parse_args()) image = cv2.imread(args["image"]) cv2.imshow("Image", image) cv2.waitKey(0) # 转为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imshow("Gray", gray) cv2.waitKey(0) # 边缘检测 edged = cv2.Canny(gray, 30, 150) cv2.imshow("Edged", edged) cv2.waitKey(0) # 门限 thresh = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)[1] cv2.imshow("Thresh", thresh) cv2.waitKey(0) # 发现边缘 cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] output = image.copy() # loop over the contours for c in cnts: # draw each contour on the output image with a 3px thick purple # outline, then display the output contours one at a time cv2.drawContours(output, [c], -1, (240, 0, 159), 3) cv2.imshow("Contours", output) cv2.waitKey(0) # draw the total number of contours found in purple text = "I found {} objects!".format(len(cnts)) cv2.putText(output, text, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (240, 0, 159), 2) cv2.imshow("Contours", output) cv2.waitKey(0) # we apply erosions to reduce the size of foreground objects mask = thresh.copy() mask = cv2.erode(mask, None, iterations=5) cv2.imshow("Eroded", mask) cv2.waitKey(0) # 扩大 mask = thresh.copy() mask = cv2.dilate(mask, None, iterations=5) cv2.imshow("Dilated", mask) cv2.waitKey(0) # a typical operation we may want to apply is to take our mask and # apply a bitwise AND to our input image, keeping only the masked # regions mask = thresh.copy() output = cv2.bitwise_and(image, image, mask=mask) cv2.imshow("Output", output) cv2.waitKey(0) 原图和灰度图: 边缘检测 门限 轮廓 查找结果 腐蚀和扩张 屏蔽和位操作 串在一起执行 $ python opencv_tutorial_02.py --image tetris_blocks.png

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册