python实战:破解大众点评用CSS加密数字的反爬机制

**1、**此次我们以该站点:惠州粤菜推荐 为目标站点,来到站点后打开chrome的开发者工具,点击刷新页面,按下图操作你会看到点评数中部分数字被进行了加密,所显示的只有span标签和class 并没有数字信息。 点击其中的某个标签,通过查看css信息就会发现在里面有个网址(即上图中的【4】),点击打开该网址你会看到下图: 其实这些数字是SVG矢量图,SVG矢量图是基于可扩展标记语言,用于描述二维矢量图形的一种图形格式,通过使用不同的偏移量就能显示不同的字符。而在第一张图中我们可以看到rtsj0这个css class里面有一个background属性,其定义了背景图片偏移的位置,所以点评网上显示数字的原理就是通过设置不同的偏移位置,显示背景图片相应位置上的数字。 **2、**知道其原理后,我们需找到定义这些css的文件及相应的svg矢量图,按照第一张图的操作我们点击【3】,会跳转到下图: 从上图中我们就能知道各种css是如何定义偏移量的,且从backgro-image这个属性里能得到svg矢量图的地址,要想知道这个svg矢量图地址我们就得先知道这个css文件是如何请求到的。前期经过多次测试发现这个css文件的网址是会变化的,因此我们需让程序去找到这个css文件的地址而不是每次都手动寻找。我们先按下图进行操作 再切换到Elements中按下图操作进行搜索: 找到这个css文件后,我们就可以通过正则表达式将该地址提取出来(提取规则看最后源码),提取出来后请求这个URL地址会到下图这个页面: 在上图中就有包含svg矢量图的地址,我们再次用正则表达式提取(提取规则看最后源码)就能得到backgro-image这个属性的值后再去请求就得到svg矢量图。接下来就是该如何解密这个偏移量来找到对应的数字,我在这篇博客 https://blog.csdn.net/weixin_43796109/article/details/86506050 中的解密方法受到启发。 **3、**知道解密的方式后编写代码,以下是我的全部源码: import re from lxml import etree from requests_html import HTMLSession class DaZhong(): def __init__(self): #此处以爬取第一页中的评论数为例 self.stat_url='http://www.dianping.com/huizhou/ch10/g103' def parse_url(self,url): session = HTMLSession() response = session.get(url) return response.content.decode() #在页面找到定义这些css的URL地址 def get_css_url(self): html = self.parse_url(self.stat_url) svgtextcss = re.search(r'href="([^"]+svgtextcss[^"]+)"', html, re.M) css_url = svgtextcss.group(1) return css_url #我们从定义偏移量的css文件里找到背景图片的路径,并获取SVG返回的数据 def get_svg(self): content = self.parse_url('https:'+self.get_css_url()) svg = re.search(r'span\[class\^="rt"\].*?background\-image: url\((.*?)\);', content) svg_url = svg.

python3.6 print同一行覆盖打印

1.python3.6中 print同一行覆盖打印可以这样使用 通用: print("\r",object,end="",flush=True) 例子: print("\r"+"loss_G:{:0.3f}".format(loss_G.item()),end = "",flush=True) 注意:不能同时print两条都覆盖打印,这样无效。 参考: 1.https://www.zhihu.com/question/21100416(风骨666的评论)

Centos7 Mysql5.7.25 tar包解压安装

mysql官网下载mysql-5.7.25-el7-x86_64.tar.gz [root@centos7 src]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-el7-x86_64.tar.gz 一、卸载系统自带的Mariadb [root@centos7 src]# rpm -qa|grep mariadb mariadb-libs-5.5.60-1.el7_5.x86_64 [root@centos7 src]# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64 二、删除/etc下my.cnf配置文件(如果存在的话)、检查mysql是否存在 [root@centos7 src]# rm -rf /etc/my.cnf [root@centos7 src]# rpm -qa | grep mysql 三、检查mysql用户组、用户是否存在,不存在则创建 [root@centos7 src]# cat /etc/group | grep mysql [root@centos7 src]# cat /etc/passwd | grep mysql [root@centos7 src]# groupadd mysql [root@centos7 src]# useradd -g mysql mysql 四、解压mysql-5.7.25-el7-x86_64.tar.gz,移动到/usr/local/mysql5.7下,更改文件归属为mysql [root@centos7 src]# tar -zxvf mysql-5.7.25-el7-x86_64.tar.gz [root@centos7 src]# mkdir -p /usr/local/mysql5.7 [root@centos7 src]# mv /usr/local/src/mysql-5.

CTF隐写常用:常见文件头文件尾总结

文件头文件尾总结 JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9 PNG (png), 文件头:89504E47 文件尾:AE 42 60 82 GIF (gif), 文件头:47494638 文件尾:00 3B ZIP Archive (zip), 文件头:504B0304 文件尾:50 4B TIFF (tif), 文件头:49492A00 Windows Bitmap (bmp), 文件头:424D CAD (dwg), 文件头:41433130 Adobe Photoshop (psd), 文件头:38425053 Rich Text Format (rtf), 文件头:7B5C727466 XML (xml), 文件头:3C3F786D6C HTML (html), 文件头:68746D6C3E Email [thorough only] (eml), 文件头:44656C69766572792D646174653A Outlook Express (dbx), 文件头:CFAD12FEC5FD746F Outlook (pst), 文件头:2142444E MS Word/Excel (xls.or.doc), 文件头:D0CF11E0 MS Access (mdb), 文件头:5374616E64617264204A

【PTA练习】L2-4 部落 (25 分)以例子总结讲解并查集

L2-4 部落 (25 分) 试题链接:https://pintia.cn/problem-sets/976473537405652992/problems/976477039905349643 这次自己总结一下并查集!(题目在后半部分,看题解的直接跳转后半段吧) 并查集 并查集是一种维护集合的数据结构,主要含有查找和合并两个操作 合并:将两个集合或元素合并成一个。 查找:查找两个元素是不是在同一个集合中。 其实现通过设立一个father数组,顾名思义就是一个父亲结点数组,记录这一个结点的上一结点(父亲结点),并且父亲结点也在这个集合内。 注意:同一个集合中应该只存在一个根节点,这个根节点应该是这个集合中所有结点的根节点,是整个这个结合的一个标识点。 如下图,几个结点在father中的表示结果: fa[1]=1; fa[2]=1; fa[3]=2; fa[4]=2; fa[5]=5; fa[6]=6; 接下来说并查集中模板步骤: 1.初始化 一开始所有的结点都是独立离散的,那么就要将其的父亲结点设为他们自己来表示自己是独立的点。 代码: for(int i=0;i<n;i++){ father[i] = i; } 2.查找 前面说了一个结点在一个集合中必有一个根节点来表示这个集合,那么我们可以通过递推与递归的方式不断查找父亲结点,从而层层深入找到根节点老祖宗啊!必须注明一点:递推就是比递归要慢!别问我为什么,问就是不跟你讲!哈哈哈 递推代码: int find(int x){//此函数是返回元素x所在集合的根节点。 while(x!=fa[therx]){ //当爸爸不是老祖宗结点时候 x = father[x];//现在我是爸爸,我去找爸爸的爸爸! } return x; } 递归代码: int find(int x){ if(father[x]==x){ //如果我就是祖宗结点那么就返回祖宗结点 return x; }else{ //如果不是,就判断爸爸是不是祖宗结点 return find(father[x]); } } 3.合并 将两个集合或元素合并成一个集合,注明此时只有属于两个不同集合的元素或集合才能合并!所以主要分两步:判断这俩人是不是一家的,如果不是那么可以联姻一下子成为一家子对吧。emmm好好讲话:对于两个给定的元素a和b,判断是不是属于一个集合的,如果不是那么就进行第二步骤合并。 代码: void Union(int a, int b){ int fathera = find(a); //查找a的祖宗 int fatherb = find(b); //查找b的祖宗 if(fathera!

【数据库】liquibase: Waiting for changelog lock....

经常运行过程中出现 Liquibase - Waiting for changelog lock Waiting for changelog lock.... Running the migration script for a database may produce this: ... INFO … Liquibase: Waiting for changelog lock.... INFO … Liquibase: Waiting for changelog lock.... INFO … Liquibase: Waiting for changelog lock.... ... 解决方法: 看下那个机器锁住了database,执行下面语句: USE [Database Name] SELECT * FROM DATABASECHANGELOGLOCK; 一般情况下是本机锁住的;则通过下面sql解锁: UPDATE DATABASECHANGELOGLOCK SET locked=0, lockgranted=null, lockedby=null WHERE id=1 原文地址:https://blog.csdn.net/WANTAWAY314/article/details/51354096

Minimum supported Gradle version is 2.14.1. Current version is 2.2.1. If using the gradle wrapper

android\gradle\wrapper\gradle-wrapper.properties 由 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-2.12.1-all.zip 改为 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 转载于:https://www.cnblogs.com/woodafeng/p/10456698.html

Could not open device at /dev/ipmi0 or /dev/ipmi/0

执行ipmitool命令时提示信息Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory 需要加载以下三个模块 sudo modprobe ipmi_watchdog sudo modprobe ipmi_poweroff sudo modprobe ipmi_devintf 转载于:https://blog.51cto.com/xiaoahehe/2356550

解决“Windows系统弹出窗口,请插入service pack 2 CD-ROM,无法识别光驱的问题”

插入对应光盘,或者把ISO镜像文件解压到本地磁盘中 打开注册表(运行,输入regedit) 找到 HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Setup 更改位置: “CDInstall”键值数据修改为“0” “ServicePackSourcePath”键值数据修改为“光驱盘符/ILO镜像解压的文件” “SourcePath”键值数据修改为“光驱盘符/ILO镜像解压的文件” 如此,CD-ROM文件就成功加载。

VASP计算新手礼包:基于CentOS 7.6 系统安装VASP 5.4.1

2020-9-24更新:更新VASP5.4.1网盘链接: 链接:https://pan.baidu.com/s/1n9C9CmF0j7iMilo1cPe1cA 提取码:69dj 2019-9-9 更新: 因有人反馈最后编译vasp5.4.1的时候出现cp: cannot stat ‘src/.objects’: No such file or directory 的错误,因此在网盘中更新了 VASP5.4.1未解压版本的源文件,请后续安装的朋友自行下载,并在Linux系统中解压获得 VASP.5.4.1 及 VASP.5.lib 文件夹,其他步骤不变 ========================== =分割线= ================================ 同为Linux系统,Cent OS 系统更适用于计算科研人员的使用。在没有参考教程,编译一个之前没接触过的新型科研类程序的情况下,Cent OS 比 Ubuntu 更容易成功、遇到的困难更少。因此,本文将详细介绍基于目前最新版本(截止2019.2.28)的Cent OS 7.6 如何安装VASP 5.4.1(适用于零基础小白)。 一、 前言 笔者能够在零基础情况下成功编译VASP,网传最广的VASP编译教程:教你从头编译VASP-5.4.1及CSDN博客上各位大神的安装记录功不可没。因此,特撰写该教程,回馈各位朋友,也希望能够为刚从事材料计算的小白贡献绵薄之力。 实践证明,参照教你从头编译VASP-5.4.1中楼主的步骤能够成功编译VASP 5.4.1,但时至2019,教程中的配置(Cent OS 6.6+intel 2011+openmpi 1.6.5+fftw 3.3.4+vasp 5.4.1)看起来有些“落后”。为使VASP保持最高效率运行,笔者尝试更新各个软件的版本,并使VASP 5.4.1 能够基于新版本的Cent OS、intel、openmpi、fftw下被成功编译。于是乎,本文就此诞生。 二、Cent OS 下VASP 5.4.1的安装配置 Cent OS 7.6 64位 Intel-parallel_studio XE 2019 openmpi 3.1.3 fftw 3.3.8 vasp 5.4.1 VMware Workstation Pro 14 三、 详细安装步骤 (一) VMware Workstation Pro 14 为方便整个安装教程的记录截图,笔者将使用虚拟机安装Cent OS 7.

ubuntu 18.04 域名解析问题 "Temporary failure in name resolution”

ping google.com出错。 解决过程: ping 8.8.8.8 可行,说明是dns nameserver配置问题。 添加google dns 8.8.8.8到本机nameserver 从ubuntu 18.04开始,使用netplan配置nameserver,之前的一些解决方案如修改 /etc/resolv.conf不再有效 cd /etc/netplan/ ### 修改该目录下格式为01-netcfg.yaml的文件中nameservers部分 格式如下 nameservers: addresses: [8.8.8.8,8.8.4.4] 保存并退出 ### #重新启动netplan sudo netplan apply https://www.techrepublic.com/article/how-to-set-dns-nameservers-in-ubuntu-server-18-04/

数据结构与算法:树与二叉树python实现

最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习。 一、树的一些容易混淆的定义: 结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推; 树的深度(或高度):树中最大的结点层; 满二叉树:这个定义国内和国外有较大的区别: 国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。如图1: 图1 国外(国际)定义:a binary tree T is full if each node is either a leaf or possesses exactly two childnodes. 大意为:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。(一棵满二叉树的每一个结点要么是叶子结点,要么它有两个子结点,但是反过来不成立,因为完全二叉树也满足这个要求,但不是满二叉树),如图2: 图2 满二叉树的任意节点,要么度为0,要么度为2.换个说法即要么为叶子结点,要么同时具有左右孩子。霍夫曼树是符合这种定义的,满足国际上定义的满二叉树,但是不满足国内的定义。 完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。 完美二叉树(可能国外才有):当所有的叶子节点都在同一层就是完美二叉树,毫无间隙填充了 h 层。对应国内满二叉树。 二、树数据结构python实现 我们将定义一个具有根值属性的类,以及左和右子树, 这个表示更接近于面向对象的编程范例。 属性:根、左右子树 方法:设置根、左右子树,获取根和左右子树 #定义二叉树类 class BinaryTree(object): def __init__(self, root, left = None, right = None): self.root = root self.left = left self.right = right def getRoot(self): return self.root def setRoot(self, root): self.

spring @Scheduled实现定时任务

转载于:http://blog.csdn.net/prisonbreak_/article/details/49180307 Spring配置文件xmlns加入: xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation中加入: http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" Spring扫描注解的配置:(如果已经有了,看一下能扫到定时任务类的包么) <context:component-scan base-package="com.thinkgem.jeesite"> <!-- base-package 如果多个,用“,”分隔 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <!-- 解决事物失效问题:在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解 --> </context:component-scan> 任务扫描注解: <!-- 配置任务线性池 --> <task:executor id="executor" pool-size="10"/> <task:scheduler id="scheduler" pool-size="10"/> <!-- 启用annotation方式 --> <task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true"/>代码实现: 在类文件上加上注解: @Service //在用在controller时要注意,因为之前配置了context:exclude-filter在主容器中屏蔽了controller注解,所以不走前台请求的话是不能注入此controller的,此时就要使用@component来注入服务。所以建议此时还是将定时任务放到service层比较好。 @Lazy(false)//为了避免spring懒加载造成的定时任务失效,必须加上此注解 在方法上写定时任务配置: @Scheduled(cron = "0 0 10 * * ?") public void birthdayReminder() { } 配置规则: 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 7.年份(1970-2099) 其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于”月份中的日期”和”星期中的日期”这两个元素互斥的,必须要对其中一个设置?.

分布式事务_三阶段提交(3PC)协议

三阶段提交协议 三阶段提交协议出现背景:我们初识分布式系统篇说过,分布式系统遵守CAP理论,于是我们在权衡之中,拿取部分一致性换取可用性。在BASE理论中,业界大佬通过长时间的测试和总结,设计出了二阶段提交协议(2PC),但是2PC设计中还存在缺陷,于是就有了三阶段提交协议,这便是3PC的诞生背景。 1. 三阶段提交协议 三阶段提交(Three-phase commit)也叫三阶段提交协议,是在计算机网络及数据库的范畴下,使得一个分布式系统内的所有节点能够执行事务的提交的一种分布式算法。三阶段提交是为解决两阶段提交协议的缺点而设计的。 三阶段提交升级点(基于二阶段): <1>三阶段提交协议引入了超时机制。 <2>在第一阶段和第二阶段中,引入了一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。 简单讲:就是除了引入超时机制之外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。 2.三个阶段详解 第一阶段(CanCommit 阶段) 类似于2PC的准备(第一)阶段。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。 1.事务询问: 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。 2.响应反馈 参与者接到CanCommit请求之后,正常情况下, 如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。 否则反馈No。 第二阶段(PreCommit 阶段) 协调者根据参与者的反应情况来决定是否可以记性事务的PreCommit操作。根据响应情况,有以下两种可能。 如果响应Yes,则: 1.发送预提交请求: 协调者向参与者发送PreCommit请求,并进入Prepared阶段。 2.事务预提交 参与者接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。 3.响应反馈 如果参与者成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令。 假如有任何一个参与者向协调者发送了No响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断。则有: 1.发送中断请求: 协调者向所有参与者发送abort请求。 2.中断事务 参与者收到来自协调者的abort请求之后(或超时之后,仍未收到协调者的请求),执行事务的中断。 第三阶段(doCommit 阶段) 该阶段进行真正的事务提交,也可以分为执行提交和中断事务两种情况。 如果执行成功,则有如下操作: 1.发送提交请求 协调者接收到参与者发送的ACK响应,那么它将从预提交状态进入到提交状态。 并向所有参与者发送doCommit请求。 2.事务提交 参与者接收到doCommit请求之后,执行正式的事务提交。 并在完成事务提交之后释放所有事务资源。 3.响应反馈 事务提交完之后,向协调者发送ACK响应。 4.完成事务 协调者接收到所有参与者的ACK响应之后,完成事务。 协调者没有接收到参与者发送的ACK响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。则有如下操作: 1.发送中断请求 协调者向所有参与者发送abort请求 2.事务回滚 参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作, 并在完成回滚之后释放所有的事务资源。 3.反馈结果 参与者完成事务回滚之后,向协调者发送ACK消息 4.中断事务 协调者接收到参与者反馈的ACK消息之后,执行事务的中断。 注意:在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者rebort请求时,会在等待超时之后,会继续进行事务的提交。(其实这个应该是基于概率来决定的,当进入第三阶段时,说明参与者在第二阶段已经收到了PreCommit请求,那么协调者产生PreCommit请求的前提条件是他在第二阶段开始之前,收到所有参与者的CanCommit响应都是Yes。(一旦参与者收到了PreCommit,意味他知道大家其实都同意修改了)所以,一句话概括就是,当进入第三阶段时,由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是它有理由相信:成功提交的几率很大。 ) 3.三阶段提交协议(3PC)存在的问题 相对于2PC,3PC主要解决的单点故障问题,并减少阻塞,因为一旦参与者无法及时收到来自协调者的信息之后,他会默认执行commit。而不会一直持有事务资源并处于阻塞状态。但是这种机制也会导致数据一致性问题,因为,由于网络原因,协调者发送的abort响应没有及时被参与者接收到,那么参与者在等待超时之后执行了commit操作。这样就和其他接到abort命令并执行回滚的参与者之间存在数据不一致的情况。 总结:了解了2PC和3PC之后,我们可以发现,无论是二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题。Google Chubby的作者Mike Burrows说过, there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos.

34 文件地理数据库(GDB)变文件夹了怎么办

我们都知道文件地理数据库(GDB)是ArcGIS软件特有的格式,有其独特的设计之处,在文件资源管理器中显示为.gdb的文件夹,但是里面的文件却看不明白,而且将gdb文件夹在Windows资源管理器中直接复制粘贴的话,也有可能出现一些问题导致gdb文件损坏,那当gdb文件损坏之后该如何修复呢? 1、按照文中操作步骤,让gdb在ArcMap中能识别到且能连接,不会报连接失败的错 https://support.esri.com/en/technical-article/000012096 2、运行恢复文件地理数据库工具 http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/data-management-toolbox/recover-file-geodatabase.htm (以上方法在10.6.1中亲测有效,别的版本有待测试,仅适用与文件地理数据库)

Ceph优化总结

Ceph优化总结 一. 硬件层面1、 CPU2、 内存3、 网络4、 SSD5、 BIOS 二. 软件层面1、 Kernel pid max2、 设置MTU,交换机端需要支持该功能,系统网卡设置才有效果3、 read_ahead, 通过数据预读并且记载到随机访问内存方式提高磁盘读操作4、 swappiness, 主要控制系统对swap的使用5、 I/O Scheduler,SSD要用noop,SATA/SAS使用deadline6、 ceph.conf配置选项7、 PG Number8、 修改crush map9、 其他因素 参考文章: https://www.jianshu.com/p/dd572541df2e https://blog.csdn.net/fuzhongfaya/article/details/80932766 一. 硬件层面 硬件规划 SSD选择 BIOS设置 1、 CPU ceph-osd进程在运行过程中会消耗CPU资源,所以一般会为每一个ceph-osd进程绑定一个CPU核上。 ceph-mon进程并不十分消耗CPU资源,所以不必为ceph-mon进程预留过多的CPU资源。 ceph-msd也是非常消耗CPU资源的,所以需要提供更多的CPU资源。 2、 内存 ceph-mon和ceph-mds需要2G内存,每个ceph-osd进程需要1G内存。 3、 网络 万兆网络现在基本上是跑Ceph必备的,网络规划上,也尽量考虑分离cilent和cluster网络。网络接口上可以使用bond来提供高可用或负载均衡。 4、 SSD SSD在ceph中的使用可以有几种架构 a、 ssd作为Journal b、 ssd作为高速ssd pool(需要更改crushmap) c、 ssd做为tier pool 5、 BIOS a、 开启VT和HT,VH是虚拟化云平台必备的,HT是开启超线程单个处理器都能使用线程级并行计算。 b、 关闭节能设置,可有一定的性能提升。 c、 NUMA思路就是将内存和CPU分割为多个区域,每个区域叫做NODE,然后将NODE高速互联。 node内cpu与内存访问速度快于访问其他node的内存, NUMA可能会在某些情况下影响ceph-osd 。解决的方案,一种是通过BIOS关闭NUMA,另外一种就是通过cgroup将ceph-osd进程与某一个CPU Core以及同一NODE下的内存进行绑定。但是第二种看起来更麻烦,所以一般部署的时候可以在系统层面关闭NUMA。CentOS系统下,通过修改/etc/grub.conf文件,添加numa=off来关闭NUMA。 二. 软件层面 Linux OS

异常解决:java.lang.IllegalStateException: Failed to introspect Class

java.lang.IllegalStateException: Failed to introspect Class 异常详情原因解决办法 异常详情 Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name xxxxx Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [classA] from ClassLoader [sun.misc.Launcher$AppClassLoader@14dad5dc] 原因 此异常原因是因为classA中使用了项目没有导入的类,从而导致类加载失败。一般来说如果使用了没有依赖的类应该会报ClassNotFindException的错误,但是如果只是导入却没有使用的使用可能就会报此错误。 通常此错误见与使用maven框架配置了第三方类的scope是provided的情况下。笔者在使用spring boot、maven时导致此错误。 解决办法 检查classA类中可能存在的没有依赖的类或者包,将之导入(或者加入maven依赖、或调整依赖的包中的依赖的scope),总之使其类加载器能够在当期classPath找到此类即可。

spring自定义注解失效的原因

自定义注解如何写,这个百度就很多了,这里就不重复了。这里重点说一下为什么有时候自定义注解不起作用,失效的原因,以及解决办法。 一、自定义注解失效的例子 @Component public class Run1 implements CommandLineRunner { @Autowired Run1 run; @Autowired TestRecord testRecord; @Record("run1->run") @Override public void run(String... args) throws Exception { //因为是直接用this来调用的,没走代理调用,@Record无效 test(); run.test(); testRecord.test(); } @Record("run1->test") public void test(){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } @Component public class TestRecord { @Record("run1->TestRecord->test") public void test() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Record { String value() default "

Git之中git add与git commit的区别与关系

Git之中git add与git commit的区别与关系 使用 git add 命令将想要快照的内容写入缓存区, 使用 git commit命令则将缓存区内容添加到仓库中。 基本的 Git 工作流程如下: 1.在工作目录中修改文件。 2.暂存文件,将文件的快照放入暂存区域。 3.提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。 也就是说,git add是让文件进入第二个状态(staged),而git commit是让文件进入第三个状态(committed)。

解决java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use

1.遇到的问题: 在单元测试的时候报:java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use 问题有可能是有两个: 1.你没有写启动类: 2.虽然你写了启动类但是你的启动类所在的包和单元测试的包不在同一级根目录下。如上图:一个是在cn.xxxx.cmcc,另一个是在cn.xxxxx,他们不在同一个目录下所以报 找不到启动类: 放在同一个包目录下就解决这个问题了。 总结:单元测试的测试类一定要和启动类在同一个根目录下。

如何将视频导入到ipad中并播放

首先在电脑上下载并安装itunes,然后用apple账号登入, 在ipad上从apple store中下载一个播放器如KMPlayer 点击itunes上小手机的图标,找到文件共享,选中应用KMPlayer,然后将文件拖到右边的框里就能完成传输了,ipad上就可以看了 转载于:https://www.cnblogs.com/61355ing/p/10439828.html

Python中查找包含它的列表元素的索引,index报错!!!

对于列表["foo", "bar", "baz"]和列表中的项目"bar",如何在Python中获取其索引(1)? 一、index >>> ["foo", "bar", "baz"].index("bar") 1 警告如下 请注意,虽然这也许是回答这个问题最彻底的方法是问,index是一个相当薄弱的组件listAPI,而我不记得我最后一次使用它的愤怒。在评论中已经向我指出,因为这个答案被大量引用,所以应该更加完整。关于list.index跟随的一些警告。最初可能需要查看文档字符串: >>> print(list.index.__doc__) L.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present. 我曾经使用过的大多数地方index,我现在使用列表推导或生成器表达式,因为它们更具有推广性。因此,如果您正在考虑使用index,请查看这些出色的python功能。 如果元素不在列表中,则抛出 如果项目不存在则调用index结果ValueError。 >>> [1, 1].index(2) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 2 is not in list 如果该项目可能不在列表中,您应该 首先检查它item in my_list(干净,可读的方法),或将index呼叫包裹在try/except捕获的块中ValueError(可能更快,至少当搜索列表很长时,该项通常存在。) 二、enumerate() 大多数答案解释了如何查找单个索引,但如果项目在列表中多次,则它们的方法不会返回多个索引。用途enumerate(): for i, j in enumerate(['foo', 'bar', 'baz']): if j == 'bar': print(i) 该index()函数仅返回第一个匹配项,同时enumerate()返回所有匹配项。

给新人的一些基础常识

本文主要介绍了对java对象的简单认知、常见错误排查、常见错误思想和常见陋习。 本文适合刚上手的小白或者对基础理解不够的人阅览,已经对android有很好的了解或者什么都不会的可以绕道了。 首先:引用是什么?指针是什么?new干了什么? 对于刚撸代码的小白来说引用、指针是左脑的面粉,new是右脑的水,动一动脑筋... 既然面对刚上手的人当然是通俗的讲好了:内存就好比一块矩形,new对象就是在矩形里创建了一块区域(例如:TestClass test=new TestClass()),你的“test”就是引用(比作一个牵线的线头),“=”比作一条有方向的线。发个图更形象,如下代码: 申明一下,这些图只是方便理解有个概念,并不是原理 public class MainActivity extends AppCompatActivity { TestClass mTest; static TestClass staticTest; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); TestClass test = new TestClass();//示例代码 test = new TestClass(); mTest = test; staticTest = mTest; } public static class TestClass { } } 1.首先MainActivity被系统创建:系统会new 一个MainActivity并绑定一些属性(具体过程暂时忽略) 2.然后系统调用onCreate,并执行完TestClass test = new TestClass()时:对象1被new出来,test引用将线指向对象1 3. 第二句test = new TestClass():test会将线换成对象2 4.第三句 mTest = test:mTest是MainActivity的成员变量,此时mTest也会将线指向对象2 5.第四句staticTest = mTest:staticTest是静态成员变量 (和MainActivity对象无关,可以暂时理解他是属于系统的某个静态块)也指向了对象2

使用SpringCache进行缓存数据库查询

1、在SpringBoot的启动类上添加注解@EnableCaching,开启SpringCache缓存支持 @SpringBootApplication // 开启SpringCache缓存支持 @EnableCaching public class GatheringApplication { public static void main(String[] args) { SpringApplication.run(GatheringApplication.class, args); } } 2、在service的方法上添加对应的注解 /** * 根据ID查询 * * @param id * @return */ // 使用SpringCache进行缓存数据库查询 @Cacheable(value = "gathering", key = "#id") public Gathering findById(String id) { return gatheringDao.findById(id).get(); } /** * 修改 * * @param gathering */ // 修改数据库数据后需要删除redis中的缓存 @CacheEvict(value = "gathering", key = "#gathering.id") public void update(Gathering gathering) { gatheringDao.save(gathering); } /** * 删除 * * @param id */ // 删除数据库数据后需要删除redis中的缓存 @CacheEvict(value = "

电脑读取不了U盘怎么办

在笔记本和别人电脑上U盘都可以正常使用,自己台式机确无法识别,说明U盘本身没问题, 解决方法: 1.在插入U盘的情况下,打开设备管理器,找到通用串行总线控制器 2.找到USB大容量存储设备,将其卸载; 3.插拔一次U盘,电脑就认识了 完美解决。

统计字符串相同且连续字符的数目

昨天同事给我看了一道面试题目,说的是给任意一个字符串,比如'aaaabbccazzggggg',然后写一个函数,最后将字符串输出为a4b2c2a1z2g5。起初自己想偏了,想用递归来做,想的相对比较复杂。(递归应该是可以的,有时间再好好研究一下)。后来重新整理一下思路,很快就写出来了。PHP代码如下: <?php function test($str){ $key = 0; $arrChar[$key] = $str{0};//第一个字符 $arrCount[$key] = 1;//与第一字符相对于的数量 $length = strlen($str); for ($i=1;$i<$length;$i++){ if($arrChar[$key] == $str{$i}){ $arrCount[$key] = $arrCount[$key] + 1; }else{ $key = $key + 1; $arrChar[$key] = $str{$i}; $arrCount[$key] = 1; } } $count = count($arrChar); $return_str = ''; for($i = 0; $i < $count; $i++){ $return_str .= $arrChar[$i]; $return_str .= $arrCount[$i]; } return $return_str; } $str = test('aaaabbccazzggggg'); echo $str;exit; 同事自己也写了一个,看上去比我写的简单:

python实战:破解网易云音乐params及encSecKey加密参数实现歌单内任意歌曲下载(附参数分析过程)

**1、**首先我们打开歌单内的任意一首歌曲,在该页面下打开chrome的开发者工具后切换到Network后重新刷新页面,找到请求到该歌曲播放源的URL,如下图: 找到后切换到Headers,可以看到其为一个post请求,URL为:‘https://music.163.com/weapi/song/enhance/player/url?csrf_token=’ ,从上图可知这个URL返回的是json,里面包含的是歌曲的信息及其MP3播放链接,请求时携带的参数为params及encSecKey,为了找到该歌曲播放源的URL,我们需解密params及encSecKey。 **2、**以encSecKey为关键词进行全局搜索,找到加密该参数的文件,如下图: 接着找到该参数是如何生成的,从下图可以看到其与bYd2x有关,为了得到该encSecKey我们需知道bYd2x这个值是如何生成的,所以我们按下图的操作设置断点,然后重新刷新页面进行调试。 按上图操作后,我们可以看到bYd2x这个函数中有四个参数,其中i8a与我们的歌曲id有关,另外三个参数我们也需要找出来,通过多次调试后可以看到其返回的值其实都是固定值,调试结果如下图: 通过上面分析得知其需要的参数值后,我们需找到window.asrsea这个函数是如何执行的,这样才能从其返回值里得到encText(即params)和encSecKey。在调试模式下我们按下图将鼠标悬浮到这个函数上可知它其实就是d函数,因此我们需找到d函数的定义。 **3、**按上图将鼠标悬浮到这个函数上后我们点击悬浮框上的蓝色字体可以到达定义d函数的位置,如下图所示: 从上图可知d函数与a函数,b函数及c函数有关,且excText的值由b函数加密了两次,因此我们要分别找到这些函数的定义并写成python语言,同样的我们在var h={}这行打上断点后重新刷新页面。首先我们找到a函数,其定义如下图: 可以看到它其实是在一堆字符串中随机找出16个字符串,将其写成python为: get_i=execjs.compile(r""" function a(a) { var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = ""; for (d = 0; a > d; d += 1) e = Math.random() * b.length, e = Math.floor(e), c += b.charAt(e); return c } """) i=get_i.call('a',16) 接着调试到b函数,其定义如下图: 从上图b 函数中的f可知其采用了 AES 加密,加密模式 为CBC ,加密的密文是 e 【其实就是我们上面说的i8a】,c是密钥【其实就是buU9L([“爱心”, “女孩”, “惊恐”, “大笑”])的返回值,是一个常量】,偏移量 d是一个常量为 ‘0102030405060708’,将其写成python语言为: def to_16(key): while len(key) % 16 !

Linux:创建文件夹

(1)输入命令:mkdir music,创建文件夹 music,再次查看列表,可以看到多了一个文件夹 music; (2)输入命令:mkdir a1 a2 a3,批量创建文件夹 a1、文件夹 a2、文件夹 a3; (3)输入命令:mkdir -p b1/b2/b3,连续创建文件夹 a1、文件夹 a2、文件夹 a3; 【总结】 mkdir xxx 创建文件夹xxxmkdir a1 a2 a3 批量创建文件夹 a1、文件夹 a2、文件夹 a3mkdir -p b1/b2/b3 连续创建文件夹 b1、文件夹 b2、文件夹 b3 相关推荐:Linux 常用命令

C盘满了清理c盘

http://baijiahao.baidu.com/s?id=1600453778864401969&wfr=spider&for=pc 下面小编给大家分享清理C盘的方法: 1、打开我的电脑,在C盘上鼠标右键选择“属性”→“清理磁盘”,这样可以先把C盘里的一些表面垃圾和零碎文件清理掉。 2、在进入C盘的“C:\WINDOWS\SoftwareDistribution”,把Download文件夹里的文件都删除掉,这里面的文件都是一些电脑系统更新的补丁文件,需要手动清理。 3、在进入C盘的“C:\Users\电脑用户名\AppData\Local”路径,把Temp文件夹里的文件都可以删除掉,Temp文件夹里面都是一些缓存文件,定期可以清理一次。 4、最后在百度软件中心下载一款C盘瘦身软件,把安装在C盘的软件程序都搬运到其它盘里,这样C盘就会节省很多空间。 电脑系统的系统文件都会存放在C盘里,所以我们在清理C盘的时候不要随意删除文件。如果删除了系统文件,就会影响到电脑系统正常运行。 借助360吧,注意重要软件

Linux 上使用 Linux Shell 脚本自动化按天分割、压缩(延迟压缩)和定期清理日志文件...

2019-02-26 10:10:54 最近 Hgh这边有一个需求,需要对Linux服务器上的日志进行相应地自动化处理: 1) 定期清理:当分区的可使用空间超过一个预先设定好的阈值(如当分区的可使用空间超过 80 % 时)就自动清 理日志,清理周期是一天一次; 2) 按天分割:有的日志文件如 access.log 会不断地增长,现在需要对其进行分割操作(假设今天的日期是 2019 年 1 月 25 日,当时间到达 2019 年 1 月 26 日 0 点 0 分时,自动分割出一个 access.log.20190125 的日志文 件; 3) 压缩:对 access.log.20190125 这样的日志文件进行压缩,即生成压缩包 access.log.20190125.tar.gz 并删除日志文件 access.log.20190125 ; 4) 延迟压缩:有的开发可能需要查看最近几天的日志,为了方便开发查看日志,可对最近几天的日志文件进行延迟压缩的操作(假设今天的日期是 2019 年 1 月 25 日,根据开发的要求暂时不压缩最近一天的日志,则当时间到达 2019 年 1 月 26 日 0 点 0 分时,压缩的是 2019 年 1 月 24 日的日志文件 access.log.20190124 ,过了 24 小时以后再压缩 access.

三星soc平台Exynos4412介绍

4412开发板 4412开发板属于armv7架构,contexA9系列,32bit,cpu4核心1.5GHZ主频,内存1G,emmc4G,gpio304个,引脚804个。

react antd less-loader 配置

问题说明 由于react 的版本不同,观看教程时 react的配置文件无法对应,导致 less-loader的配置出现问题,而且less 版本3.0之后,在react 加载 less 文件时会报出 错误: .bezierEasingMixin();Inline JavaScript is not enabled. Is it set in your options? 如何修改antd主题EONSPC错误 问题解决 安装 less-loader less 插件之后 配置 webpack.config.js 文件: 将webpack.config.js中的 sass 的配置copy一份,修改为如下: const lessRegex = /\.less$/; const lessModuleRegex = /\.module\.less$/; { test: lessRegex, exclude: lessModuleRegex, use: getStyleLoaders( { importLoaders: 2, }, 'less-loader', ), }, { test: lessModuleRegex, use: getStyleLoaders( { importLoaders: 2, modules: true, getLocalIdent: getCSSModuleLocalIdent, }, 'less-loader' ), }, 解决 Inline JavaScript is not enabled.

7.React Native之StackNavigator实现页面跳转及navigationOptions参数说明;

目录 1.StackNavigator介绍 2.StackNavigator属性介绍 2.1RouteConfigs 2.2StackNavigatorConfig 3.StackNavigator使用示例 3.1添加react-navigation库几种方式 3.2引入react-navigation库 3.3创建StackNavigator组件 3.4调用StackNavigator显示 3.5效果图 4.StackNavigator页面跳转及参数传递 4.1页面跳转 4.1.1导航跳转介绍 4.1.2导航跳转示例 4.2参数传递和接收 4.2.1传递参数 4.2.2接收参数 目录 1.StackNavigator介绍 2.StackNavigator属性介绍 2.1RouteConfigs 2.2StackNavigatorConfig 3.StackNavigator使用示例 3.1添加react-navigation库几种方式 3.2引入react-navigation库 3.3创建StackNavigator组件 3.4调用StackNavigator显示 3.5效果图 4.StackNavigator页面跳转及参数传递 4.1页面跳转 4.1.1导航跳转介绍 4.1.2导航跳转示例 4.2参数传递和接收 4.2.1传递参数 4.2.2接收参数 5.StackNavigator配置navigationOptions说明 1.StackNavigator介绍 StackNavigator为我们开发的应用提供一种在屏幕之间转换的方式,其中每个新启动屏幕都放置在堆栈顶部。 默认情况下,堆栈导航器配置我们熟悉的iOS和Android页面切换效果:新启动的的屏幕从iOS右侧滑入,从Android底部淡入。在iOS上,堆栈导航器也可以配置为模式(Modal)样式,屏幕从底部滑入。 2.StackNavigator属性介绍 createStackNavigator(RouteConfigs, StackNavigatorConfig); 2.1RouteConfigs RouteConfigs对象是从路由名称到路由配置的映射,它告诉导航器为该路由提供什么。简单说就是定义了页面的映射关系,为每个界面定义一个名字,以便导航器可以通过名字跳转到该页面; createStackNavigator({ //为了每个你要导航到的页面(组件)创建一个入口,定义了一个名为Profile入口,如下: Profile: { // `ProfileScreen` is a React component that will be the main content of the screen. //`ProfileScreen`是一个React组件,它将成为屏幕的显示的主要内容 screen: ProfileScreen, //当`ProfileScreen`通过StackNavigator被加载时,它将被给予一个`navigation`属性 // 可选的:在Web应用程序中深度链接或使用react-navigation时,将使用以下路径: path: 'people/:name', // 动作和路由参数从路径中提取。 // 可选的: 为了屏幕修改覆盖`navigationOptions` navigationOptions: ({ navigation }) => ({ title: `${navigation.

【postgresql】role "root" does not exist 解决办法

问题原因 postgresql是不允许使用root用户启动服务的,所以必须切换到其他用户下才可以进行正常的服务启动,但是有些时候我们又需要使用root用户来使用postgresql 解决办法 方法一 非必要情况下就不要用root用户使用postgresql 方法二 手动创建root role,我这里是使用用户名为postgres来启动postgresql服务的 su postgres # 创建root用户 postgres=#create user root with password 'password'; CREATE ROLE # 将数据库权限赋予root用户 postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase to root; GRANT # 将用户修改为超级用户(看实际需求) postgres=# ALTER ROLE root WITH SUPERUSER; postgres=# \q 也可以直接将root创建为超级用户,login是指允许登录 CREATE ROLE root superuser PASSWORD 'password' login;

C语言总结二(分支与循环语句)

本次我们要讨论的便是分支和循环语句,在c语言中我们用;作为一条语句的结束标志,在c语言中最重要的便是语句了,通过一条条语句的结合,我们才能实现一定的逻辑。 分支语句 if 例:if(条件1){ 语句 } else if(条件2){ 语句 } … else{ 语句 } 注:if else 语句较容易理解,条件满足执行语句,不满足执行else语句,一大堆的if条件语句很复杂,故而我们又引入了switch语句。 switch 例:switch(整型表达式){ case 1: 语句1; break; case 2: 语句2; break; … default: 语句; break; } 注:switch语句一般应搭配break使用,default加上会防止其它情况的遗漏。 循环语句 for(;;;){ 语句 } 注:()中为循环条件 while(条件){ 语句 } 注:条件成立循环 do{ 语句 }while(条件) 注:循环语句是我们最常用到的语句,有了循环语句我们就不用去重复同样的事情,让计算机自己执行即可,减轻了我们的代码量。for 、 while、 do while 之间都可以相互转换,不同的是do while循环会执行一次循环体内容,而for与while如果条件不满足则一次也不会执行。 在c语言中分支与循环语句必不可缺,起到相当重要的作用,所以对于我们初学者而言这两种语句也是非常重要,其实你只要将逻辑搞清楚,便能很轻松的将代码写出来。

软考适合报考人群

软考适合报考人群 ①有北、上、广、天办理工作居住证,居转户需求的学员适合考软考; ②系统集成企业需要申报项目经理资质的专业技术人员适合考软考; ③各政府部门及事业单位从事企业信息化,需要评中级、高级职称的人员适合考; ④项目管理专业人员、项目经理、软件工程师等行业技术人员也适合考 总之,你想学习,想提升自己的综合项目管理能力,都可以报考软考。软考与工作居住证之间的关系 北京地区:通过软考证书获取中高级职称,中级以上职称可以申请北京市工作居住证软考真题难度 《软考高级(信息系统项目管理师)》真题解读 科目一:综合知识 题量:75小题 题型:单选题 分值:满分75分,合格分数45分 考试时间:9:00-11:30 时长:150分钟 科目一考试特点,及题型分类:

Dart配置环境变量

Dart配置环境变量 在学习dart语言时,当你遇到zsh: command not found: dart这个错误时,这说明你的dart没有添加进环境变量中。 1、首先打开你的配置文件, vi ~/.zshrc 2、将你的dart sdk路径添加进去 路径为你的sdk路径/flutter/bin/cache/dart-sdk/bin # dart export DART_HOME=/Users/xxx/sdk/flutter/bin/cache/dart-sdk/bin export PATH="${DART_HOME}:${PATH}" 3、关闭终端,然后重新打开。执行dart --version,效果如下: tinytongtongdeMacBook-Pro% dart --version Dart VM version: 2.1.1-dev.0.1.flutter-ec86471ccc (Thu Jan 3 22:43:43 2019 +0000) on "macos_x64" 这说明安装成功了。

Mybatis中foreach标签的使用

Mybatis中foreach标签的使用 foreach代码示例foreach标签参数解释使用foreach注意事项 Mybatis中foreach标签的作用: 一般使用foreach遍历传入的列表,如list。在Mybatis中的xml文件中,和普通的sql语句组合成一条完整的语句 foreach代码示例 <select id="findFileStatusByUrlList" parameterType="java.util.List" resultMap="BaseResultMap"> SELECT * FROM file_approve WHERE file IN <foreach collection="list" item="item" index="index" open="(" close=")" separator=","> #{item} </foreach> </select> <!--最终的效果等同于: SELECT * FROM file_approve WHERE file IN ("idCard","bankCard","securityCard",...) --> foreach标签参数解释 其中collection和item参数为必填! collection:必须指定, 当传入的参数为list类型,为list当传入的参数为array类型,为array当传入的参数为map类型,为map的键key(较少使用) item:迭代集合时,元素的别名index:在list和数组中,index是元素的序号,在map中,index是元素的keyopen:包裹被迭代集合元素的开始符号,一般为"("close:包裹被迭代集合元素的结束符号,一般为")"separator:被迭代元素之间的分隔符,一般为"," 使用foreach注意事项 1.在sql标签需内要指定parameterType,即传入参数类型 2.同时也需要指定resultMap(查询的时候需要),返回值类型。用户也可自定义自己的resultMap。一般返回BaseResultMap,即对应的实体类。

开启nginx和php-fpm的status状态监控

最近服务器的php-fpm进程偶尔会异常飙升,于是想在zabbix上配置监控服务器的nginx和php-fpm的状态。前提是需要开启nginx和php-fpm的status功能。 启用nginx status配置 配置server,一般我们在默认的主机下配置: server { #listen 80; listen 80 default_server; root /var/www/html; index index.php index.html index.htm; server_name 127.0.0.1; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location /ngx_status { allow 127.0.0.1; deny all; stub_status on; access_log off; } } 重启nginx,测试访问 sudo /etc/init.d/nginx retart curl http://127.0.0.1/ngx_status nginx status 参数说明 active connections – 活跃的连接数量 server accepts handled requests — 总共处理了4个连接 , 成功创建4次握手, 总共处理了4个请求 reading — 读取客户端的连接数. writing — 响应数据到客户端的数量 waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.

Go略有个性的时间格式化

GO的诞生时间是2006年1月2号所以格式化于此有关,GO的时间相关操作使用自带的time,下面是个来自gobyexample.com示例: package main import "fmt" import "time" func main() { p := fmt.Println // Here's a basic example of formatting a time // according to RFC3339, using the corresponding layout // constant. t := time.Now() p(t.Format(time.RFC3339)) // Time parsing uses the same layout values as `Format`. t1, e := time.Parse( time.RFC3339, "2012-11-01T22:08:41+00:00") p(t1) // `Format` and `Parse` use example-based layouts. Usually // you'll use a constant from `time` for these layouts, but // you can also supply custom layouts.

Ubuntu18.04解决gnome-tweak-tool安装后shell主题提示user-theme extension没有启用的问题

换用Ubuntu18之后,桌面又回到了gnome,因此找到了gnome-tweak-tool对桌面进行美化。 1. 安装gnome-tweak-tool sudo apt-get install gnome-tweak-tool 安装之后在拓展中可以开启ubuntu dock 和ubuntu appindicators 但并没有网上所说的添加拓展的链接,主题设置中也在shell theme位置也带有一个感叹号,提示 shell user-theme extension not enabled. 2. 使用火狐浏览器访问 https://extensions.gnome.org 网页提示需要完成安装浏览器插件和本地应用两步, 直接点click here to install brower extension安装浏览器插件.然后通过Ctrl+Alt+T打开一个终端,通过以下命令安装本地软件 sudo apt install chrome-gnome-shell 安装后打开 https://extensions.gnome.org/extension/19/user-themes/ 这时候已经多了一个按钮,不用选择版本,直接点按钮,稍等之后有一个弹窗提示是否安装,点安装。 4. 关闭tweak-tool再打开,感叹号已经没有了 同时在extensions 的网页还可以选择其他拓展, 推荐dash to dock, hide top bar. 参考资料: http://ubuntuhandbook.org/index.php/2017/05/enable-shell-theme-in-gnome-tweak-tool-in-ubuntu/ https://zhuanlan.zhihu.com/p/35362159

Monitor your Oracle database by 12C em and send the message to you

Monitor your Oracle database by 12C em and send the message to you 使用12c EM自带脚本实现DB关键事件短信告警 主要为了总结下12C em的自带脚本提取额自身Incident,Event等,并通过短信告警的功能,每DBAer的监控方式很多,这里只总结和记录下目前适合我们的一种简单粗暴但很灵活的监控方式,其他童鞋如果想参考,必须具备如下条件: 1)对12C em的告警规则及配置非常明确; 2)公司内部必须已有一个短信平台或者短信猫; 3)官方提取的12C em的告警脚本及简单的Shell编程能力; 12C告警规则配置 待补充 12C em官方告警脚本 将如下shell脚本包存至OEM服务器对应位置即可(见下文通知方法配置图): #!/bin/sh# LOG_FILE=/net/myhost/logs/oscmdNotify.log echo ‘-------------’ >> $LOG_FILE echo ‘issue_type=’ $ISSUE_TYPE >> $LOG_FILE echo ‘notif_type=’ $NOTIF_TYPE >> $LOG_FILE echo ‘message=’ $MESSAGE >> $LOG_FILE echo ‘message_url’ = M E S S A G E U R L > > MESSAGE_URL >> MESSAGEU​RL>>LOG_FILE echo ‘severity=’ $SEVERITY >> $LOG_FILE

CSRF/XSS

CSRF:通常称为跨站请求伪造,英文名为 Cross-site request forgery CSRF:攻击原理 (必须登录过某个网站,并且这个网站有漏洞) 防御措施: 1,加token 验证 2,Referer 验证 (站点下的页面,是:放行,不是:拦截) 3,隐藏令牌 (会隐藏head中) XSS :跨域脚本攻击,英文:cross-site scripting 攻击原理:向页面注入js,并执行 防御措施:让注入的js不能执行。 区别: xss 是向页面注入js 并运行 CSRF:依赖于用户登录 好浅的表诉,还没有深入理解,劳烦大家提供一些自己的见解,咯咯。

Ubuntu怎么开启/关闭防火墙

首先打开Ubuntu的终端命令行 为使用bash命令 我们需要打开终端工具 我们可以使用alt+t 快捷键打开终端。也可以使用鼠标单击终端工具。如图所示 查看当前防火墙状态 在Ubuntu中 我们使用sudo ufw status命令查看当前防火墙状态;inactive状态是防火墙关闭状态 active是开启状态。 开启防火墙 在Ubuntu中 我们使用sudo ufw enable命令来开发防火墙 通过sudo ufw status命令查看开启防火墙后的状态为active 说明防火墙开启成功。 关闭防火墙 在Ubuntu中 我们使用sudo ufw disable命令来关闭防火墙。执行该命令之后 我们使用sudo ufw status命令来查看当前防火墙的状态 如果是inactive 说明我们的防火墙已经关闭掉了。 Ubuntu中其他常用的防火墙命令 ufw default allow/deny:外来访问默认允许/拒绝 ufw allow/deny 20:允许/拒绝 访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。 ufw allow/deny servicename:ufw从/etc/services中找到对应service的端口,进行过滤。 ufw allow proto tcp from 10.0.1.0/10 to 本机ip port 25:允许自10.0.1.0/10的tcp封包访问本机的25端口。 ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则 例如开启允许80端口被访问,如下图所示

360应用商店上架提示签名算法采用“SHA256withRSA”,在部分4.2一下安卓版本的手机上不能安装

问题描述 前一段时间给公司一个新的App上架360应用商店,因为需要加固,便下载了最新版的360加固助手,加固助手挺方便的,加固签名一条龙。然而问题就出在了这里,拿加固签名之后的App上架,wtf???提示:您的应用签名算法采用“SHA256withRSA”,在部分4.2一下安卓版本的手机上不能安装。显然,是签名出问题了。我就纳闷了,用你自家的签名工具签名,上架你们自家的应用商店,提示签名有问题,让人无语。我之前也是用过360加固助手的,不过是老版本的,也上架过360应用市场,并没有出现这样的问题。网上也给出了解决方案: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 ~/Workspace/jks -signedjar ./xxx.apk ./xxx.signed.apk yyy 问题分析 这样是可以解决问题,但我觉得,这肯定是360加固助手的bug呀,为了验证我的猜想,我将加固助手设置成只加固不签名:签名设置 >取消勾选启用自动签名下载老版本的360签名工具,为了验证我的猜想:新版本才会有这个bug,本着方便大家的原则,本文提供 360签名工具下载链接使用360签名工具签名加固后的apk文件,然后你会发现,神奇的事产生了,不报错了。我的猜想正确,新版360加固助手有这样一个bug。 最后总结 其实这个问题的根本原因是:jdk1.6版本下的keytool用的是SHA1算法生成的签名,而在jdk1.6+变成了SHA-256。360新版加固助手,也更新了签名算法,但是,自家应用商店有不支持SHA-256签名算法,于是bug就这样产生了。应该是部门之前沟通不充分吧。 补充说明 jarsigner的命令格式: jarsigner -verbose -keystore [您的私钥存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [您的证书名称] jarsigner的参数说明 -keystore 参数指定您的私钥的绝对路径,例如:c:\jks-signedjar 参数指定签名后apk文件存放绝对的路径,例如 c:\test-singned.apk[未签名的文件路径] 指定要签名apk文件的绝对路径,也就是您从我们这里下载到的,例如 c:\test-unsigned.apk[您的证书名称] 是指您创建密钥时,您设置的证书名称

【Linux】bash-4.2问题解决

bash-4.2问题原因 /etc/skel/ 目录丢失,(该目录下是用户的配置文件),不知道具体产生这个问题的原因,个人怀疑是个bug bash-4.2问题解决办法 办法1 将/etc/skel/目录下.bash开头的文件拷贝到用户的home目录下即可。 办法2 删掉该用户,重新创建,并显示指定组 useradd -g xxx username 发现显式指定组之后没有出现过这个问题 ~。~

微信小程序数据库关于openId的坑

本人写的小程序,判断当用户第一次使用小程序(云开发的)时,会向数据库(云)写入用户信息。但是数据库好像会自动给这条记录添上"_openid":adadwasdcwee27y7sdhvf7e(瞎写的,勿用)。本人测试自己代码的时候,发现了一条记录有_openid和openId两个字段,而且数据还一样,才发现的,后来就去掉了自己写的openId字段。

关于SCI、EI、CCF、DASFAA

期刊会议的论文,sci,ieee,ccf 等等他们之间的关系 对于期刊、会议、SCI、EI、CCF等上一个链接写的很清楚。在这我只做一些补充,如有错误请批评指正。 1.SCI一般收录高质量的期刊的文章,会议文章一般很少收录,除非是很高质量的会议文章。 2.SCI分区知识(JCR分区与中科院分区区别)以及查询方法。 3.SCI一区难度相当于CCF A类会议或期刊的难度。SCI二区的难度相当于CCF B类会议或期刊的难度。 4.DASFAA属于CCF B类会议,一般不被SCI收录,但是中稿难度相当于SCI二区。 5.EI检索稍次于SCI检索,DASFAA论文一般会被EI检索。 以下为某双一流高校的计算机博士毕业最低标准,请自行体会。 计算机科学与技术学科博士生发表学术论文最低标准为以下三个条件之一: 在SCI一区/CCF A类会议或期刊发表1篇长文(Regular Paper),同时发表1篇SCI论文;在SCI二区/CCF B类会议或期刊发表1篇长文,同时发表1篇SCI论文以及1篇检索论文;发表3篇SCI论文。 论文发表相关说明: SCI分区采用汤森路透JCR分区;检索论文指SCI、EI、ISTP三大系统检索的论文。 申请提前毕业的博士生,须在SCI一区/CCF A类会议或期刊发表1篇长文(Regular Paper),同时发表1篇SCI论文和1篇检索论文。

pip命令使用详解

windows下pip的安装 其实在windows下是默认安装了pip工具的,只是没有将其所在目录加入Path,导致命令查找不到。 将python安装目录下的Scripts目录加入环境变量Path中即可。 Linux执行下面命令即可完成安装 # wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate # python get-pip.py pip使用 列出已安装的包 pip freeze or pip list 导出 requirements.txt pip freeze > <目录>/requirements.txt 安装包 在线安装 pip install <包名> 或 pip install -r requirements.txt # 安装1.9版本的django pip install django==1.9 # 安装版本号大于1.9的django,注意有引号 pip install "django>1.9" pip install "django>=1.9" pip install "django<1.9" pip install "django<=1.9" pip install "django><1.9" requirements.txt 内容格式为: APScheduler==2.1.2 Django==1.5.4 MySQL-Connector-Python==2.0.1 MySQL-python==1.2.3 PIL==1.1.7 South==1.0.2 django-grappelli==2.6.3 django-pagination==1.0.7 安装本地安装包 pip install package_name pip install <目录>/<文件名> 或 pip install --use-wheel --no-index --find-links=wheelhouse/ <包名> <包名> 前有空格

SpringBoot配置文件@PropertySource 同时支持properties文件与yaml(yml)

Yaml(yml)最近比较流行的配置文件,相对properties,配置文件结构更清晰简洁.前段时间项目需要引入的配置,于是想用yml文件来增加新的属性配置,新增属性放在application.yml中是没问题的,但是放其他文件中,然后通过@PropertySource 引入时,却出现了问题,所有.yml中的参数配置全部读取无效,properties文件是正常的,后来在stackoverflow上看到@PropertySource中存在factory参数,通过配置factory参数可以达到我们想要的效果。 @PropertySource factory属性的factory默认配置是Class<? extends PropertySourceFactory> factory() default PropertySourceFactory.class;, 我们再看下PropertySourceFactory的源码就可知道了, /** * Strategy interface for creating resource-based {@link PropertySource} wrappers. * * @author Juergen Hoeller * @since 4.3 * @see DefaultPropertySourceFactory */ public interface PropertySourceFactory { /** * Create a {@link PropertySource} that wraps the given resource. * @param name the name of the property source * @param resource the resource (potentially encoded) to wrap * @return the new {@link PropertySource} (never {@code null}) * @throws IOException if resource resolution failed */ PropertySource<?

如何使用 vue + typescript 编写页面 (typescript简单语法篇)

在使用typescript编写项目之前,需要有一定的js【es6】基础知识。在学习ts的过程中,类比js的差异,做到基本结合。 开发中除去js报错的部分,大部分会受到ts的语义限定。 typescript基本内容 1. 变量申明 变量申明的时候,和js一样但又不一样。一样的是变量申明符号是一样的,不一样的是需要附加类型限定。如果你是一个强类型的语言开发者 // js的声明 var name; let age; const eat; function play(bool){} 复制代码 // ts的声明 var name:string; let age:number; const eat:Function; // Function是类型,而function是用来声明函数变量的,请不要用混 function run(bool:string):void { /* 传参和基本一样,需要限定传值类型, 在函数的参数列表后面需要加上返回值限定 */ } 复制代码 类型申明时,有一个通用类型 any,这个表示这个变量可以接受任意类型的值,并且语法器也会忽略掉当前参数为null/undefined的情况。建议:除非特殊情况,尽量不要使用any作为参数类型,以便后期修改时,发生不必要的错误。 1.1 其他情况 // 大部分时候,我们会声明成这种情况 // 但是在使用时却发现,不能赋值,push值。 var classes:[]; // 实际上上面的那个等价于 var classes:Array<never>; // 或者等价于 var classes:never[]; 复制代码 never ts独有的修饰类型,表示当前什么也没有。和undefined/null不同,ts只存在never的申明,不存在never这个值。 // 当使用 var a:never; var b = a; // 此时的a会被语法提示,在赋值前使用了a。因此,需要将a先初始化才能使用,但是又没有一种值叫never,因此a是无效的声明类型。 // 那么,我们一定要用呢? // 借助数组实现 var a:never[] = []; var b:never = a[0]; // 如果在对象里声明使用never呢? var a = { b:never /*Error: “never”仅表示类型,但在此处却作为值使用。 */ } 复制代码 2.

java批量下载文件及压缩文件解压后里面的文件名乱码解决

方法一:【成功】 将文件压缩为一个包再下载,期间出现一个问题是本地没问题,sit环境出现压缩文件解压后里面的文件名乱码,后来发现自己使用的是jdk1.8,而项目用的是jdk1.6。jdk1.6关于压缩文件有一个bug,在jdk1.7的时候才修复。 前端代码: /**下载按钮事件*/ $("#downloadBtn").click(function(){ /*图片路径集合*/ var _list = []; var i=-1; $.each($('input:checkbox'),function(){ if(this.checked && $(this).val()!=null &&$(this).val()!='on'){ i=i+1 _list[i]=$(this).val(); } }); /*传递路径至后台*/ if(_list.length!=null&&_list.length!=0){ submitPath(_list) }else{ alert("请选择一条记录下载") } }); /**表单提交所有路径进行下载*/ function submitPath(list){ var form=$("<form>"); form.attr("style","display:none"); form.attr("target","_blank"); form.attr("method","post"); form.attr("action","downloadFile.html"); var input1=$("<input>"); input1.attr("type","hidden") input1.attr("name","list") input1.attr("value",list) $("body").append(form); form.append(input1); form.submit(); } 后台代码: /** * 下载附件 */ @ResponseBody @RequestMapping(value = "downloadFile", method = { RequestMethod.POST, RequestMethod.GET }) public void downloadFile(@RequestParam("list")List<String> paths,QueryEntity entity, ModelMap model, HttpServletResponse response) throws Exception { log.

企业JDK版本选择建议

保持在现有的JDK版本,如JDK7、JDK8 如果需要升级,可以考虑付费订阅 或者AdoptOpenJDK 升级到JDK11这样的LIS版本 除非有特定需求,不要选择JDK9/10/12这样的版本 JDK集合底层很多都改,面试的时候要说明版本之类的 过度版本,不是长期支持版本! 转载于:https://www.cnblogs.com/xuziyu/p/10417578.html

“ fatal error: openssl/ssl.h: No such file or directory “错误解决

今天在 CentOS 7.6 上编译 HAProxy 1.9.4 版本的时候发生如下错误 [root@JasonSong haproxy-1.9.4]# make clean [root@JasonSong haproxy-1.9.4]# make -j 8 TARGET=linux2628 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1 CC src/ev_poll.o CC src/ev_epoll.o CC src/ssl_sock.o CC src/proto_http.o CC src/cfgparse-listen.o CC src/proto_htx.o CC src/stream.o In file included from include/types/global.h:32:0, from src/ev_epoll.c:26: include/types/listener.h:29:25: fatal error: openssl/ssl.h: No such file or directory #include <openssl/ssl.h> ^ compilation terminated. In file included from include/types/global.h:32:0, from src/ev_poll.c:26: include/types/listener.h:29:25: fatal error: openssl/ssl.h: No such file or directory #include <openssl/ssl.

opencv中四种立体匹配算法示例(StereoBM,StereoSGBM,StereoBinaryBM, StereoBinarySGBM)

OpenCV3.4.4 StereoBM,StereoSGBM在正式库中 StereoBinaryBM, StereoBinarySGBM在contrib模块中 1 StereoBM // 预处理滤波参数 preFilterType:预处理滤波器的类型,主要是用于降低亮度失真(photometric distortions)、消除噪声和增强纹理等, 有两种可选类型:CV_STEREO_BM_NORMALIZED_RESPONSE(归一化响应) 或者 CV_STEREO_BM_XSOBEL(水平方向Sobel算子,默认类型), 该参数为 int 型; preFilterSize:预处理滤波器窗口大小,容许范围是[5,255],一般应该在 5x5…21x21 之间,参数必须为奇数值, int 型 preFilterCap:预处理滤波器的截断值,预处理的输出值仅保留[-preFilterCap, preFilterCap]范围内的值,参数范围:1 - 31(文档中是31,但代码中是 63), int // SAD 参数 SADWindowSize:SAD窗口大小,容许范围是[5,255],一般应该在 5x5 至 21x21 之间,参数必须是奇数,int 型 minDisparity:最小视差,默认值为 0, 可以是负值,int 型 numberOfDisparities:视差窗口,即最大视差值与最小视差值之差, 窗口大小必须是 16 的整数倍,int 型 // 后处理参数 textureThreshold:低纹理区域的判断阈值。如果当前SAD窗口内所有邻居像素点的x导数绝对值之和小于指定阈值,则该窗口对应的像素点的视差值为 0(That is, if the sum of absolute values of x-derivatives computed over SADWindowSize by SADWindowSize pixel neighborhood is smaller than the parameter, no disparity is computed at the pixel),该参数不能为负值,int 型

quill-editor实现自定义按钮,上传图片到服务器,获取文本内容并展示

quill-editor是一款非常强大的富文本组件,在最近的项目里也是使用到了,附上:插件源码 使用也是非常简单: 一.下载Vue-Quill-Editor npm install vue-quill-editor --save 二.在vue里的组件中使用 <template> <div class="edit_container"> <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)"> </quill-editor> </div> </template> <script> import { quillEditor } from "vue-quill-editor"; //调用编辑器 export default { components: { quillEditor }, data() { return { content: `<p></p><p><br></p><ol><li><strong><em>Or drag/paste an image here.</em></strong></li><li><strong><em>rerew</em></strong></li><li><strong><em>rtrete</em></strong></li><li><strong><em>tytrytr</em></strong></li><li><strong><em>uytu</em></strong></li></ol>`, editorOption: {} } }, methods: { onEditorReady(editor) {} // 准备编辑器, onEditorBlur(){}, // 失去焦点事件 onEditorFocus(){}, // 获得焦点事件 onEditorChange(){}, // 内容改变事件 }, computed: { editor() { return this.

微信小程序动态设置live-pusher/live-player属性

最近开发小程序视频会议,发现通过api wx.createLivePusherContext() 创建LivePusherContext之后,只能暂停背景音,或者切换摄像头,并没有关闭摄像头而打开背景音的方法: 方法 LivePusherContext.start() 播放推流 LivePusherContext.stop() 停止推流 LivePusherContext.pause() 暂停推流 LivePusherContext.resume() 恢复推流 LivePusherContext.switchCamera() 切换前后摄像头 LivePusherContext.snapshot() 快照 LivePusherContext.toggleTorch() 切换 LivePusherContext.playBGM(Object object) 播放背景音 LivePusherContext.stopBGM() 停止背景音 LivePusherContext.pauseBGM() 暂停背景音 LivePusherContext.resumeBGM() 恢复背景音 LivePusherContext.setBGMVolume(Object object) 设置背景音音量 而<live-pusher></live-pusher>组件的属性中是有enable-camera这个属性的,并且组件的推流url也是通过双向数据绑定来动态添加上去的; 于是想到通过双向数据绑定给组件动态添加属性,从而通过修改live-pusher的属性达到开关摄像头的目的: wxml: data: 同样的道理,live-player也可以这样操作

Apache出现Error:Apache shutdown unexpectedly的解决办法

Apache出现Error:Apache shudown unexpectly的原因 是因为Apache服务使用的端口被占用了,Apache默认端口号80 解决办法: 1、按window+R,在运行里输入cmd打开命令行,如果输入netstat -ano出现了提示:不是内部或外部命令,也不是可运行的程序或批处理文件,说明cmd当前操作不在系统文件夹system32下,那么只需输入:cd c:\WINDOWS\system32\,再输入netstat -ano,就可查看当前使用的端口号。 2、查看80端口号被占用的PID是多少(PID指的是运行程序的身份证) 3、打开状态栏鼠标右键,选择‘启动任务管理器’,选择‘进程’,点击状态栏‘查看’中的‘选择百度收录批量查询列’(如果看不到状态栏,双击上面空白处就可看到),将PID的选项对勾,点击确定,如果有PID=4,说明Windows操作系统占用了80 4、修改Apache端口号: 打开XamppControle Panel界面 选择“Apache”的“config”按钮 选择“[Browse]Apache”,打开Apache的安装目录 在该目录中,打开conf目录 在该目录中,打开httpd.conf文件 修改listen80为listen8888(其他端口号也行) 保存,重启Apache服务 5、访问Apache服务 打开浏览器,在地址栏中输入一下内容 http://127.0.0.1:8888或者http://localhost:8888

MapReduce: Simplified Data Processing on Large Clusters 翻译加理解

前言 这是真正的核心知识,我要将这篇论文阅读并翻译一遍。 原文可以从MapReduce: Simplified Data Processing on Large Clusters下载 MapReduce: 大型集群上的简化数据处理 作者:Jeffrey Dean,Sanjay Ghemawat;Google, Inc. 译者:LittleFall 摘要 MapReduce是一个编程模型和用于处理生成大型数据集的相关实现。用户定义一个map函数去处理一个键值对去生成一组中间键值对,一个reduce函数去合并所有具有相同中间键的中间值。如下文所示,许多真实世界的任务都可以通过这个模型来表达。 遵循这个模型的程序可以自然并行地执行在一个大型商业计算机集群上。运行时由系统关注于以下问题的细节:分割输入数据、将程序在一组计算机上调度执行、处理机器故障、管理必要的机器间内部通信。这使得没有任何并行与分布式系统编程经验的程序员可以轻松利用大型分布式系统的资源。 1. 引言 在过去的五年里,笔者和许多谷歌同僚已经实现了数以百计的独立计算程序,用于处理大量的原始数据,例如爬虫文件、网络请求日志,等等,用于计算各种各样的衍生数据,如反转索引、网页文档的各种表示图结构、每个宿主爬取大量页面的总结、一天中最频繁的一组查询,等等。大多数这样的计算程序在概念上是简洁明了的。然而,输入数据通常非常大,而且为了在合理时间内执行完毕计算程序必须分布运行在成百上千个计算机上。这些有关于如何并行计算、分布数据、解决故障的事务需要大量复杂的代码去处理,这使得本来朴素的计算任务变得极为冗杂。 作为对这种复杂性的应对,我们设计了一个新的抽象模型,它允许我们直接去做纯粹的计算,而将繁杂的细节如并行,容错,数据分布,负载均衡等封装在库中。我们的抽象受到了来自Lisp和其它函数式语言中map和reduce原语(primitives present)的启发。我们发现我们大多数的计算程序都涉及到以下特性:对于输入中的每个逻辑记录提供一个map操作,目的是计算得到一组中间键值对;然后对于所有具有相同键的值实现一个reduce操作,目的是适当地联合衍生数据。我们对于函数模型的使用以及用户自定义map和reduce操作允许我们可以轻易并行化大量的计算,并将重新执行作为容错的主要机制。 这项工作的主要贡献是一个简洁有力的接口,它实现了自动并行化与大规模数据的分布。这个接口与它的实现一起在大规模商业计算机集群上获得了优异表现。 第二部分描述了基础编程模型并且给出了一些例子。第三部分描述了一个定制在基于集群的计算环境下的MapReduce接口实现。第四部分描述了一些有用的编程模型细节。第五部分对其在一个任务的实现进行了表现评估。第六部分探索了MapReduce的使用,包括谷歌内部使用它重写产品索引系统的经验。第七部分讨论了相关工作与未来展望。 2. 编程模型 计算过程接受一系列输入键值对,产生一系列输出键值对。MapReduce库的用户用两个函数来表示计算:Map和Reduce。 Map函数由用户编写,接收一个输入键值对,产生一组中间键值对。MapReduce库组合所有的具有相同中间键 I I I的中间值并且将它们传给Reduce函数。 Reduce函数也由用户编写,接收一个中间键 I I I和对应的一组值。它将其合并成一组可能规模更小的值。通常每个Reduce函数只会输出零个或一个值。中间值通过一个迭代器提供给用户的reduce函数。这允许我们操作过大以至于不能放在内存中的值列表。 2.1 例子 考虑统计大型文章集合中每个单词出现次数的问题,用户写出的代码将类似于如下伪代码: map(String key, String value): // key: document name // value: document contents for each word w in value: EmitIntermediate(w, "1"); reduce(String key, Iterator values): // key: a word // values: a list of counts int result = 0; for each v in values: result += ParseInt(v); Emit(AsString(result)); map函数生成每个单词加上一个关联的出现计数(例子中为1)。reduce函数对同一个单词所有生成的计数求和。

jquery的sortable拖拽排序问题,在页面上多次拖拽保存顺序之后,刷新页面,排序出现紊乱

一、前言 这篇博客是因为我在做完拖拽保存之后,测试多次拖拽,然后刷新页面,发现保存的顺序出来紊乱。这就很无奈了啊,打印各项数据才发现,因为保存用的是ajax的方式,所以页面上的列表序号是固定的,比如列表序号是: 1-2-3-4-5 那么把1和5互换位置之后为: 5-2-3-4-1 也就是说,每个列表的序号是固定的 我在保存的时候,是每次拖拽结束之后都保存,所以数据库的顺序相当于一直在变。所以多次拖拽之后,就出现问题了。 二、关于jauery的sortable 这里我就不多说关于拖拽插件的东西了,网上有很多。怕麻烦的老哥可以直接点下面这几个链接,写的都不错: https://www.cnblogs.com/mailan/articles/4779071.html http://www.runoob.com/jqueryui/example-sortable.html 三、排序之后,如何获得序号传递给后台 我这边的html结构为: <table> <tbody> <tr> <td></td> </tr> <tr> </tr> </tbody> </table> 所以获取序号的代码为: $("table.sortable tbody").sortable({ placeholder: "ui-state-highlight", cancel: ".drag-disabled", axis: "y", opacity: 0.7, stop: function (event, ui) { var sortedIDs = $("table.sortable tbody").sortable("toArray", {attribute: "id"}); // console.info(sortedIDs); // return false; //这里获取到的是tr的id值的数组集合 res = sortedIDs.join(','); ajax_sort(res); //这是我保存排序的ajax方法 } }); 这部分代码就是排序结束后,调用stop方法,进行自己的逻辑操作,保存排序等。保存的话,直接在数据库加上sort字段,按大小排序即可。 四、碰到的问题 1、问题描述 由于我的页面是不刷新的,所以排序之后,数组的序号已经发生改变了,比如: 第一次排序: 原序号:1-2-3-4-5 我们把5和1交换一下位置,此时传给后台的顺序是:5,2,3,4,1 数据库存储:1-2-3-4-5 排序后: 5-2-3-4-1 这是第一次排序。 数据库存储:1-2-3-4-5 此时数据库中,原id为5的数据排序为1.

kd树之中位数问题

统计学习方法一书在41页 根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为什么为7,为什么不是5或者6呢?5和7的平均值不是6吗? 摘自维基百科kd-tree的Python代码 point_list.sort(key=itemgetter(axis)) median = len(point_list) // 2 # choose median location=point_list[median] 在KD-Tree中中位数的求取是序列的长度除以2向下取整后的下一个数(升序排序)。所以,问题出在中位数定义不一致上,统计学习方法一书在41页注脚的中位数定义是错误的。 https://toutiao.io/posts/563580/app_preview 感谢 https://me.csdn.net/olzhy 同学解答疑惑

Java HTTP GET

HTTP GET 有两种流行的方式使用HTTP GET在Java中:apache第三方库和Java URL Java URL public static void main(String[] args) { try { URL url=new URL("http://www.baidu.com"); URLConnection urlConnection=url.openConnection(); urlConnection.connect(); //URL连接之后可以获取输入流 InputStream inputStream=urlConnection.getInputStream(); Channel channel= Channels.newChannel(inputStream); Channel console=Channels.newChannel(System.out); //以下使用NIO流进行数据传送 ByteBuffer byteBuffer=ByteBuffer.allocateDirect(64); int byteread=((ReadableByteChannel) channel).read(byteBuffer); while (byteread!=-1){ byteBuffer.flip(); ((WritableByteChannel) console).write(byteBuffer); byteBuffer.clear(); byteread=((ReadableByteChannel) channel).read(byteBuffer); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 上述方法,可以将获取的网页内容打印到控制台(console)。 Apache 引入Maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.

Java自动封装类型的基础类型的缓存策略

缓存策略 在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。 上面的规则适用于整数区间 -128 到 +127。 这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。 Java 编译器把原始类型自动转换为封装类的过程称为自动装箱(autoboxing),这相当于调用valueOf方法 Integer a = 10; //this is autoboxing Integer b = Integer.valueOf(10); //under the hood public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } public class JavaIntegerCache { public static void main(String[] args) { Integer integer1 = 3; Integer integer2 = 3; if (integer1 == integer2) { System.

linux下卸载docker

卸载 1.查询安装过的包 yum list installed | grep docker docker-engine.x86_64 17.03.0.ce-1.el7.centos @dockerrepo 2.删除安装的软件包 yum -y remove docker-engine.x86_64 3.删除镜像/容器等 rm -rf /var/lib/docker 亲测可用。。。。。。。

springBoot集成拦截器拦截404,500请求

1.直接在controller写一个控制器,但是这个控制器要实现HandlerInterceptor接口,并且要实习里面的三个方法: preHandle; preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在 Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返 回值为false,当preHandle的返回值为false的时候整个请求就结束了。 postHandle; 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像, 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。 afterCompletion 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行, 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 具体详细代码: package com.boot.zhiyi.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @Controller public class ErrorInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub System.out.println("------------开始处理请求------------"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if (response.

WFP(二)——环境搭建 vs2017+WDK

本文将搭建vs2017 + WDK的驱动开发环境以开发 WFP 应用。 实测,此方法在windows 10有效。 步骤 1. msdn官网下载vs2017 ed2k://|file|mu_visual_studio_community_2017_version_15.3_x86_x64_11100062.exe|1069960|5984B3CD547F9F213DE21EFE5887F08D|/ 安装的过程中,选择 以C++开发桌面 程序的work station. 2. 查看vs自带的sdk的版本 打开控制面板的 应用和功能,查看sdk的版本号。 3. msdn官网下载相应sdk版本号的wdk,并安装 https://docs.microsoft.com/en-us/windows-hardware/drivers/other-wdk-downloads 一定要确认,sdk版本和wdk的版本一致,否则编译的时候会报类似如下错误: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB6004 指定的任务可执行文件位置“C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\stampinf.exe”无效。 msnmntr C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.common.targets 482 4.安装成功后的效果 sdk和wdk版本一致 vs显示出WDF项目类型

基于STM32从零写操作系统系列---基于寄存器写串口驱动

如有不详细的描述、错误或疑问,欢迎留言!!! 基于STM32从零写操作系统系列---前言与目录 目的 尝试基于寄存器层面,编写串口的驱动。用这种方式编写串口驱动,有点类似于使用汇编语言。面向的是每一个单独的寄存器,通过读、改、写的手段,配置寄存器。但是这种方式能够更接近硬件,用硬件的思维编程。 相对于《基于STM32从零写操作系统系列---使用C语言》,这章重新调整了文件结构,让项目文件更好管理和维护。主要使用了makefile的嵌套编译方法来编译多目录下的代码文件。 分析 1.Makefile嵌套编译 首先简单来看一下文件结构: 再看一下顶层Makefile,主要差异如下: 各子目录下的Makefile比较简单 其中需要注意的是: 在windows的cmd命令行中for命令用于查找文件,@echo用于输出找到的文件路径。这与linux系统中的find命令类似。OBJS变量中的多个.o文件用于链接生成.out文件。 2.寄存器与串口驱动编写 设置某个功能,本质就是向寄存器某个位或字段写入相关数据。所以必须看清楚你要写入的寄存器的地址是否准确,修改的位或字段是否准确。 3.在led.c中调用串口1初始化函数 4.编译下载调试 由于USART1.c使用了<>尖括号的头文件,还有编译选项中使用了 -nostdinc -nostdlib(即不用标准头文件和标准库),所以确保编译选项中有-I(大写i)并路径正确。 小结 源代码在这里 源代码里有更详细的注释。我在stm32f103zet6平台上测试过,是可以用的。如果不行,可以自己调试以下,找出错误或平台的差异。

苹果电脑安装Windows系统完整教程,新手快速解决装系统问题

苹果电脑安装Windows系统一直是大家的一个难题,很多人觉得安装苹果电脑系统是深不可测甚至从来都没有想过自己可以独立的装好苹果电脑的系统,今天我们抛开所有的废话,不像网上查询的那么复杂,有时明明很简单、很直观的问题却被一些人描述的非常绕人,导致我们大家起初还能看得懂,可是越看越迷糊、越看越复杂,小编今天给大百度收录批量查询家介绍分享苹果电脑安装Windows系统教程,简单明了直白,直接进入主题: 一、苹果电脑安装Windows系统前准备。 1、制作好的UEFI引导启动U盘(置入需要的相应Windows系统)。 2、需要安装的苹果电脑。 二、步骤方法及图解(这里我们以Windows 10系统为例)。 1、把启动系统U盘插入苹果电脑USB口。 2、按下电源开机键后立马反复按ALT键(苹果电脑没有BIOS设置只有启动项选择,这里按下的ALT键就相当于按普通电脑的F12键功能作用一致)。 如图小编反复按ALT键后出现的启动选择 3、这时候出现的画面是电脑启动选择,我们使用方向键选择UEFI引导的U盘。 选择EFI Boot按下回车键 4、这时候的界面和系统的安装方法和普通系统方法是一模一样了哦。 按照向导提示一步一步完成 5、这步很多人都犯过错误,当界面下一步为灰色不可选择,我们把眼睛所能看见的盘符全部删除掉(如果不想要原机自带的苹果系统),删除后重新新建盘符,注意硬盘里面的重要数据哈,如果硬盘里面有重要数据只要是GPT引导也是无妨,格式化主分区盘然后直接点击下一步即可安装系统了,系统拷贝完成电脑会自动解压进入操作系统。 6、这样您的苹果电脑安装系统基本上已经接近尾声了,小伙伴们是不是觉得很简单啊,不要被一些人描述糊涂了,简单的事情非要绕着复杂化,当系统拷贝完成的时候电脑会自动解压完成直到进入系统。 苹果电脑安装Windows10系统已完成 大家说苹果电脑换Windows系统简不简单呢?不饶人吧,是不是简单易懂,这是抹掉苹果系统只装Windows系统教程,下期我们更新在苹果系统的基础上再装Windows操作系统,也就是我们常常说的双系统。看过小编分享的教程大家是不是觉得So simple(如此简单)呢?觉得小编的作品不错请点击关注小编哦,苹果电脑双系统安装教程下期小编献给大家,您还在为苹果电脑去维修店装系统贵而烦恼吗?看完这教程您还需要去维修店吗?答案是NO,您如果正在使用的苹果电脑正好需要安装Windows系统的花,您不妨以便对照小编的教程一边来操作,小编可以拍胸口的说:No problem。

使用java NIO FileChannel读取文件并解决中文乱码问题

FileChannel 是java.nio下的一个连接文件的通道。通过此通道能够方便的实现对文件的读写操作。FileChannel 操作是ByteBuffer,能够读取文件字节到ByteBuffer或将ByteBuffer中的字节写入文件。 由于读取的文件内容涉及到中文(假设文件编码是utf8),FileChannel读取的是byte,而一个中文字符可能占2个或3byte,这样很容易导致一次读取到的byte不足以全部转换为中文,如果按照常规的方式new String(byte[],"utf-8"),根本无法解决乱码。 本文通过一个完整的示例,展示了如果用FileChannel读取中文文件并解决乱码问题。 打开文件通道 File file = new File(getClass().getResource("").getPath(), "中文测试.txt"); RandomAccessFile raFile = new RandomAccessFile(file, "rw"); FileChannel fChannel = raFile.getChannel(); 从文件通道读取字节到buffer ByteBuffer bBuf = ByteBuffer.allocate(32); int bytesRead = fChannel.read(bBuf); 转码。以utf编码转换ByteBuffer到CharBuffer CharBuffer cBuf = CharBuffer.allocate(32); decoder.decode(bBuf, cBuf, true); 判断decode操作后是否有未处理完的字节,如果有,则缓存等待下次处理 byte[] remainByte = null; int leftNum = 0; leftNum = bBuf.limit() - bBuf.position(); if (leftNum > 0) { // 记录未转换完的字节 remainByte = new byte[leftNum]; bBuf.get(remainByte, 0, leftNum); } 将上步缓存的字节写回ByteBuffer,然后进行下一次读取 if (remainByte !

RabbitMQ订阅发布的消息处理之后,通过WebSocket实现数据实时推送到前端显示

原文:https://blog.csdn.net/u013507760/article/details/53259192 一、架构简单概述 RabbitMQ消息队列服务善于解决多系统、异构系统间的数据交换(消息通知/通讯)问题,并且可以订阅和发布,而随着HTML5诞生的WebSocket协议实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。 因此,我们可以使用RabbitMQ的订阅发布技术,订阅后,当RabbitMQ端有新的数据就直接发布到指定的queue,订阅端接收到订阅队列的数据直接通过WebSocket推送到前端,前端拿到数据之后实时解析上显,此过程相比传统的Rest接口定时请求,减去了数据入库、读库、客户端不断的请求服务器和刷新页面,大大的减小了服务器的压力和减少了请求时间。该设计更适用于实时数据接收后直接推送到前端上显的一些不需要处理和统计的场景,如实时船舶的上显,导航等。 二、最终效果 通过RabbitMQ订阅发布的实时消息,并且实时推送到前端,前端接收消息时间几乎和RabbitMQ发布消息同时,更好的实现了数据的实时上显,此处将前端接收到的Json格式数据丢在网页上,拿到数据以后就可以根据坐标位置上显对应的场景(此处未渲染)。 三、代码实现 (1)项目依赖包,maven管理 <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> (2)前端连接、关闭WebSocket和接收消息代码 <%@ page language="java" pageEncoding="UTF-8" %> <html> <head> <title>WebSocket</title> </head> <body> <div id="main"> <div id="message"></div> </div> </body> <script type="text/javascript"> var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { //创建一个WebSocket连接,URL:127.0.0.1:8080/realTimeWebSocket/webSocket //注:后端Server在模块realTimeWebSocket下,所以路径下多了一层realTimeWebSocket websocket = new WebSocket("ws://127.0.0.1:8080/realTimeWebSocket/webSocket"); } else { alert('当前浏览器 不支持WebSocket') } //连接发生错误的回调方法 websocket.onerror = function () { setMessageInnerHTML("连接发生错误"); }; //连接成功建立的回调方法 websocket.onopen = function () {

QQ音乐的动效歌词是如何实践的?

本文由云+社区发表 作者:QQ音乐技术团队 一、 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果。当然,我们也不例外。 2. 目标 我们的目标十分明确,一是提升歌词的基础体验,二是在此基础上,能提供差异化的VIP特效,来吸引用户开通VIP。 二、探索技术方案 经过多次的需求评审和沟通讨论,各方在需求的目标和细节上也达成了初步的统一。 产品的希望 :效果炫酷,能实现逐字动画(位移,翻转,渐隐渐现,模糊,粒子特效等),可配置等。开发的思考: 技术架构方案,性能挑战等,接下来我们简单介绍一下确定技术方案的过程。 1. 技术方案选型 这里最初的思路有两个方向,升级现有歌词组件和开发全新歌词组件。所谓知已知彼,百战不殆, 通过对移动端面主流竞品的技术方案和PC端类似方案的技术调研与分析。最终将技术方案锁定在以下三种: 现有歌词组件升级Shader序列帧动画ASS序列帧动画 2. 备选技术方案介绍 下面简单介绍一下三种方案的原理和特点,如下表所示: 总的来说,就是在原生动画开发和帧动画方案中进行选择。 3. 技术方案对比 以下主要是从是否实现特效,开发的难度,方案的性能,实现的成本,跨平台等方面对比三种方案,具体细节如下表所示: 4. 确定方案 通过以上几个维度的综合考量: 现有歌词组件基本上无法实现逐字动画。Shader帧动画开发周期长,实现成本高,逐字动画支持不是很好。ASS实现逐字动画,可通过植入动画标签实现复杂的特效,有开源支持,且跨平台。综上所述,ASS方案性价比最高。 最终方案也确定采用ASS序列帧动画方案。 三、 技术架构 1. ASS技术工作原理介绍 前面简单介绍了一下什么ASS字幕和帧动画的原理。我们知道ASS是一种字幕文件格式,属于高级字幕,可以制作出华丽的特效字幕。所以,要想在电影或者视频上显示ASS效果,首先要做的是编写ASS特效文件,然后再将ASS特效文件解析成序列帧动画的位图,最后将这些位图按照特定的顺序和一定的帧率进行播放,就能看到各种特效的动画。如下图所示: 2. 如何接入ASS方案 2.1 合成 如下下图所示:,首先,需要准备展示内容(字幕或者歌词内容),比如一个文本文件,有了最基本的文本文件,怎么转换成ASS解析器能解析的ASS文件呢?答案是打K值,打K值是指给字幕文件加上时间轴属性。而是什么K值呢,就是ASS中K拉OK的效果标签代码,即每行甚至每个字的时间坐标。有了打完K值的ASS文件,我们就可以在视频播放器中浏览,也就有了最基本的逐字染色动画。如果要开发更复杂的特效,就需要加入更多的特效标签。而这一部分,就可以通过脚本加上动画模板(动效模板就是具有特定动画效果的ASS文件),将动画标签注入到打完K值ASS文件中,生成最终的ASS特效文件。至此,一个具有特效的ASS文件就诞生了。 2.2 解析 解析的过程相对比较简单。解析一个ASS文件,不仅需要ASS文件本身,还需要知道ASS文件是用什么字体合成的。这里补充一下,前面合成的时候,其中的动画模板也是需要指定是使用哪种字体来合成的。因为这里会涉及到字体的大小,间距等,对动画效果和排版的影响。然后,再回到解析上来,通过ASS文件加上字体库就可以解析生成特定序列的帧动画位图。 3. 技术架构 最终方案的技术架构:功能上划分如下,后负责存储和合成;客户端负责解析和绘制,呈现用户最终的动画效果。 4. 通用性 上面提到了这套方案的通用性和易复用的特点。那除了动效歌词之外,我们还可以做些什么呢? 首先,我们脱离业务对架构进行更高一层的抽象,梳理出了更通用的架构方。这里还需要补充一点,“字体库”,从字面上理解应该是一堆字体的容器,所以字体库应该是保存了一大堆的文字信息等。但其实不仅是文字也可以是图形,所以我们的动画效果可以不只是针对文字的,还可以设计一些图形动画效果。所以,这里可以有更多的想像空间。前面解析的过程我们提到,解析出一帧帧的图,就拿去直接播放了,这样我们就能实时看到动画效果。那如果把这些图片保存下来,根据业务需求在需要的时候再播放呢。这里就可以拆分出实时渲染和离线渲染两种方案。 这里的渲染提供了两种方案: 1. 实时渲染 将解析出来的位图立即绘制到屏幕上。 适用场景:实时要求高的场景。 特点: 对系统性能消耗大,需要注意当前场景的性能开销。 2. 离线渲染 将解析出来的位图保存到磁盘上,并可以此基础上建立序列帧动画的资源管理。 适用场景:适用于异步化的场景。 特点: 建议采用异步线程在后台处理,减少对主线程消耗。 大家可以根据各自业务场景和特点灵活选择或者组合使用这两种方案。 以上主要是介绍动效歌词技术方案的实现原理与架构介绍。 四、技术难点与挑战 在开发过程中,我们遇到了两个重要的问题:一个是在运行复杂的效果时,动画效果出现了肉眼可见的卡顿;另一个则是内存的问题,即使是比较简单的效果播放以后也会占用大量的内存。本文后半部分将重点阐述K歌是如何解决这两个问题的。

hive 创建表报错,truncate ,drop 都报错

hive 创建表报错,truncate ,drop 都报错: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: Read timed out 因为hive 和CM元数据共用同一台mysql。mysql和CM五个角色放同一个服务器。服务器空间不足导致这个报错。清理磁盘就没有问题了。

一文精通flinkOnYarn

简介 本文主要是讲解flink on yarn的部署过程,然后yarn-session的基本原理,如何启动多个yarn-session的话如何部署应用到指定的yarn-session上,然后是用户jar的管理配置及故障恢复相关的参数。 交互过程概览 flink on yarn的整个交互过程图,如下: 要使得flink运行于yarn上,flink要能找到hadoop配置,因为要连接到yarn的resourcemanager和hdfs。可以使用下面的策略来指定hadoop配置: 1.会查看YARN_CONF_DIR,HADOOP_CONF_DIR或者HADOOP_CONF_PATH是否设置,按照顺序检查的。然后,假如配置了就会从该文件夹下读取配置。 2.如果上面环境变量都没有配置的话,会使用HADOOP_HOME环境变量。对于hadoop2的话会查找的配置路径是$HADOOP_HOME/etc/hadoop;对于hadoop1会查找的路径是$HADOOP_HOME/conf. 每当常见一个新flink的yarn session的时候,客户端会首先检查要请求的资源(containers和memory)是否可用。然后,将包含flink相关的jar包盒配置上传到hdfs。 接下来就是客户端会向resourcemanager申请一个yarn container 用以启动ApplicationMaster。由于客户端已经将配置和jar文件注册为了container的资源,所以nodemanager会直接使用这些资源准备好container(例如,下载文件等)。一旦该过程结束,AM就被启动了。 Jobmanager和AM运行于同一个container。一旦创建成功,AM就知道了Jobmanager的地址。它会生成一个新的flink配置文件,这个配置文件是给将要启动的taskManager用的,该配置文件也会上传到hdfs。另外,AM的container也提供了Flink的web接口。Yarn代码申请的端口都是临时端口,目的是为了让用户并行启动多个Flink YARN Session。 最后,AM开始申请启动Flink Taskmanager的containers,这些container会从hdfs上下载jar文件和已修改的配置文件。一旦这些步骤完成,flink就可以接受任务了。 部署启动yarn-session 这个就是yarn-session脚本启动的整个过程吧。 默认可以直接执行bin/yarn-session.sh 默认启动的配置是 {masterMemoryMB=1024, taskManagerMemoryMB=1024,numberTaskManagers=1, slotsPerTaskManager=1} 需要自己自定义配置的话,可以使用来查看参数: bin/yarn-session.sh –help 比如,我们启动一个yarn-session有10个Taskmanager,8GB内存,32处理slot,那么脚本编写应该是这样的: ./bin/yarn-session.sh-n 10 -tm 8192 -s 32 系统默认使用con/flink-conf.yaml里的配置。Flink onyarn将会覆盖掉几个参数:jobmanager.rpc.address因为jobmanager的在集群的运行位置并不是实现确定的,前面也说到了就是am的地址;taskmanager.tmp.dirs使用yarn给定的临时目录;parallelism.default也会被覆盖掉,如果在命令行里指定了slot数。 如果你想保证conf/flink-conf.yaml仅是全局末日配置,然后针对要启动的每一个yarn-session.sh都设置自己的配置,那么可以考虑使用-D修饰。 这种情况下启动完成yarn-session.sh会在会话窗口结尾 输入stop然后回车就会停掉整个应用。 官网说的是CTRL+C可以会在杀死yarn-session.sh的客户端的时候停止整个应用,max os下实测,不行的。 假如要启动多个需要多个shell会话窗口,那么假如想在启动完yarn-session.sh脚本之后使其退出,那么只需要加上-d或者-detached参数即可。这种情况下,客户端在提交flink到集群之后就会退出,这个时候要停止该yarn-session.sh必须要用yarn的命令了yarn application –kill <appid> 提交job到yarn-session 启动完yarn-session就是提交应用了,那么一个集群中可以存在多个yarn-session如何提交到自己的yarn-session呢? 其实,前面在讲yarn-session启动的时候应该强调一下那个叫做-nm的参数,这个就是给你的yarn-session起一个名字。比如 bin/yarn-session.sh -nm test 这样根据你的业务需求特点,可以自己起一个名字,然后就可以确定那个yarn-session可以用来提交job了。 当然,前面我们也说了 运行bin/flink run –help 可以产看flink提交到yarn的相关参数其中有一个叫做 然后就可以提交任务了 ./bin/flink run./examples/batch/WordCount.jar --input /input/test.txt --output/output/result.txt 假如只启动了一个yarn-session的话,那么就是他会找到默认的,否则的话就用-m参数指定了。 jobmanager的地址也可以从下面页面查询。

[前端]IE滚动条透明,导致会挡住内容

1:问题 IE浏览器右侧滚动条的底部透明状,网页内容会往右侧偏移,导致滚动条会遮挡住内容,如下图: 2:解决 添加如下代码即可: <style> body { -ms-overflow-style: scrollbar; } </style> 3:效果

解决跨域问题的8种方案(最新最全)

转自 PheonixHkbxoic 的《前端解决跨域问题的8种方案(最新最全)》 原址:https://www.cnblogs.com/PheonixHkbxoic/p/5760838.html 1.同源策略如下: URL说明是否允许通信http://www.a.com/a.js http://www.a.com/b.js同一域名下允许http://www.a.com/lab/a.js http://www.a.com/script/b.js同一域名下不同文件夹允许http://www.a.com:8000/a.js http://www.a.com/b.js同一域名,不同端口不允许http://www.a.com/a.js https://www.a.com/b.js同一域名,不同协议不允许http://www.a.com/a.js http://70.32.92.74/b.js域名和域名对应ip不允许http://www.a.com/a.js http://script.a.com/b.js主域相同,子域不同不允许http://www.a.com/a.js http://a.com/b.js同一域名,不同二级域名(同上)不允许(cookie这种情况下也不允许访问)http://www.cnblogs.com/a.js http://www.a.com/b.js不同域名不允许 特别注意两点: 第一,如果是协议和端口造成的跨域问题“前台”是无能为力的, 第二:在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。 “URL的首部”指window.location.protocol +window.location.host,也可以理解为“Domains, protocols and ports must match”。 2. 前端解决跨域问题 1> document.domain + iframe (只有在主域相同的时候才能使用该方法) 1) 在www.a.com/a.html中: document.domain = 'a.com'; var ifr = document.createElement('iframe'); ifr.src = 'http://www.script.a.com/b.html'; ifr.display = none; document.body.appendChild(ifr); ifr.onload = function(){ var doc = ifr.contentDocument || ifr.contentWindow.document; //在这里操作doc,也就是b.html ifr.onload = null; }; 2) 在www.script.a.com/b.html中: document.domain = 'a.com'; 2> 动态创建script 这个没什么好说的,因为script标签不受同源策略的限制。

Shell编程-运维

什么是运维 术语名词 IDC--(Internet Data Center)互联网数据中心,主要服务包括整机租用、服务器托管、机柜租用、机房租用、专线接入和网络管理服务等。广义上的IDC业务,实际上就是数据中心所提供的一切服务。客户租用数据中心的服务器和带宽,并利用数据中心的技术力量,来实现自己对软、硬件的要求,搭建自己的互联网平台,享用数据中心所提供的一系列服务。ISP--(Internet Service Provider)互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务、和增值业务的电信运营商。ICP--(Internet Content Provider)互联网内容提供商,向广大用户综合提供互联网信息业务和增值业务的电信运营商。 根据中华人民共和国国务院令第292号《互联网信息服务管理办法》规定,国家对提供互联网信息服务的ICP实行许可证制度。从而,ICP证成为网站经营的许可证,经营性网站必须办理ICP证,否则就属于非法经营。因此,办理ICP证是企业网站合法经营的需要.CDN--(Content Delivery Network)内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。 CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。LVS--(Linux Virtual Server)的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。 CGI--(Common Gateway Interface)通用网关接口。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体 GSLB--(Global Server Load Balance,全局负载均衡)作为 CDN 系统架构中最核心的部分,负责流量调度.基于DNS的GSLB 绝大部分使用负载均衡技术的应用都通过域名来访问目的主机,在用户发出任何应用连接请求时,首先必须通过DNS请求获得服务器的IP地址,基于DNS的GSLB正是在返回DNS解析结果的过程中进行智能决策,给用户返回一个最佳的服务IP。用户应用流程与没有GSLB时未发生任何变化。这也是市场上主流的GSLB技术。 BOSS--(Business & Operation Support System,BOSS)是业务运营支撑系统。通常所说的BOSS分为四个部分:计费及结算系统、营业与账务系统、客户服务系统和决策支持系统。BOSS从业务层面来看就是一个框架,来承载业务系统、CRM系统、计费系统。实现统一框架中的纵向、横向管理。该系统最早由电信部门的计费系统发展演变而来,基本功能包括客户资料管理、产品管理、用户订购管理、计费、出帐、结算等,负责登记客户资料、管理用户订购服务的提供、实时的根据不同产品、套餐的资费标准计算业务(手机、固定电话用户通话时、点播收视、宽带流量与时间等)的消费金额,准实时及定期计算用户帐单,实时或定期结算用户各种消费费用。 管理 配置管理事件管理问题管理成本管理容量管理资源管理需求管理 规划 架构规划IDC规划服务器规划ISP规划预算规划 优化 速度优化成本优化ISP优化CDN优化告警优化故障预案故障演习 安全 漏洞扫描域名劫持扫描挂马扫描CGI扫描网页篡改扫描 告警 告警模型告警故障告警统计告警关联拨测 定时curl一下某个url,有问题就告警. 日志告警:5分钟Error大于xxx次告警。 指标告警:cpu使用率大于xxx告警。 告警对象可以分为两种: 业务规则监控系统可靠性监控 对于业务规则监控可以举一个游戏的例子。比如游戏角色在一定装备的情况下,单次打击的伤害输出应该是有一个上限,如果超过了就说明有作弊的情况。又比如斗地主游戏里一个人的连胜场次是有一定上限的,每天的胜率是有一定上限,如果超出平均值太多就可能是作弊。业务规则监控的不是硬件,也不是软件是否工作正常。而是软件是否按照业务规则实现的,是否有漏洞。也可以理解为对“正确性”的监控。 系统可靠性监控是最常见的监控形式,比如发现是不是服务器挂掉了,服务是不是过载了等等。对于大部分后台服务,系统可以抽象建模成这个样子: 监控 URL监控LVS监控IDC监控数据库监控模块监控站点监控响应监控 系统/平台 CDN平台静态应用平台动态应用平台点击流系统数据库平台下载平台网络健康系统经营分析系统存储平台流媒体平台质量监测系统GSLB管理系统BOSS系统立体监控系统自动发布系统站点分析系统统一告警系统运维工具系统 规范 项目立项规范运营故障分级和处罚规范重大运营故障处理流程环境一致性规范运营资源申请流程IDC变更流程预算管理规范 linux发行版 RedHat: Fedora, CentOS, MandrivaSuSE: SLES, OpenSuSEDebian: UbuntuGentoo:BackTrace/kali linux (黑客) 运维第一工具-shell编程 shell历史 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Shell提示符下执行。 由于历史原因,UNIX系统上有很多种Shell: 1.sh(Bourne Shell):由Steve Bourne开发,各种UNIX系统都配有sh。

root 用户下显示 -bash-4.2#,如何恢复正常?

登录 root 账户后,发现并没有按照标准的用户名显示,而是显示奇怪的 -bash-4.2 : 原因:这样显示大多是因为不小心删除了 root 下的 .bash_profile 和 .bashrc 文件所造成的,我们可以从其他用户拷贝这两个文件到 root 目录下即可。 (1)查看 root 用户下相关文件是否缺失? 输入命令: l. 查看所有隐藏文件(带.的为隐藏文件,ls是不会列举出来的),可以看到,并没有所说的两个文件; (2)切换到其他用户目录,没有其他用户可以创建一个新的用户(不会创建的点我): 输入命令:cd /home/zyq01 ,我们进入home文件夹下的zyq01用户下,查看该用户下是否有这两个文件, 从这里我们可以看到是有.bash_profile 和 .bashrc 这两个文件的。 (3)拷贝文件到 root 用户下: 输入命令:cp .bash_profile /root 拷贝 bash_profile 文件到 root 下; 输入命令:cp .bashrc /root 拷贝 bashrc 文件到 root 下; (4)再次查看 root 用户下,是否已经存在相关文件? 可以看到 root 下已经存在该两个文件了,但你会发现还是显示的-bash-4.2,没关系,重新登录下就好了。 (5)再次登录,就能看到所期望的结果了。 参考文章:https://blog.csdn.net/liulihui1988/article/details/52796395 

计算机网络五:局域网、城域网、广域网和互联网

局域网、城域网、广域网和互联网 ㈠局域网 1、局域网定义 局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。 2、局域网介绍 局域网(Local Area Network,LAN)是在一个局部的地理范围内(如一个学校、工厂和机关内),一般是方圆几千米以内,将各种计算机,外部设备和数据库等互相联接起来组成的计算机通信网。它可以通过数据通信网或专用数据电路,与远方的局域网、数据库或处理中心相连接,构成一个较大范围的信息处理系统。局域网可以实现文件管理、应用软件共享、打印机共享、扫描仪共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网严格意义上是封闭型的。它可以由办公室内几台甚至上千上万台计算机组成。决定局域网的主要技术要素为:网络拓扑,传输介质与介质访问控制方法。 3、局域网组成 局域网由硬件(包括服务器、工作站、打印机、网卡、互联设备等)和网络传输介质(光纤和WIFI等),以及软件所组成。 4、局域网拓扑结构 星形、树形、总线形和环形。 5、局域网四种技术类型/标准 以太网(Ethernet);令牌环(Token Ring);令牌总线(Token Bus),如ARCNET;光纤分布式数据接口(FDDI)。目前,以太网(Ethernet)类型的局域网应用最为广泛。 ㈡ 城域网 1、城域网定义 城域网(Metropolitan Area Network),简称MAN,是在一个城市范围内所建立的计算机通信网。属宽带局域网。由于采用具有有源交换元件的局域网技术,网中传输时延较小,它的传输媒介主要采用光缆,传输速率在100兆比特/秒以上。 2、城域网介绍 城域网MAN是基于一种大型的局域网LAN,通常使用与局域网LAN相似的技术。将城域网单独列出来的一个主要原因是它有自己的一个标准:分布式队列双总线DQDB(Distributed Queue Dual Bus),即IEEE802.6。DQDB是由双总线构成,所有的计算机都连结在上面。 MAN的一个重要用途是用作骨干网,通过它将位于同一城市内不同地点的主机、数据库,以及LAN等互相联接起来,这与WAN的作用有相似之处,但两者在实现方法与性能上有很大差别。 建设局域网或广域网包括资源子网和通信子网两个方面,而城域网的建设主要集中在通信子网上,其中也包含两个方面: 一是城市骨干网,它与中国的骨干网相连。 二是城市接入网,它把本地所有的联网用户与城市骨干网相连。 ㈢广域网 广域网定义 广域网(Wide Area Network),简称 WAN,又称广域网、外网、公网(相对应,局域网LAN也称内网、私网)。是连接不同地区 局域网或 城域网计算机通信的远程网。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。广域网并不等同于 互联网。 ㈣广域网与互联网 一般来说互联网就是国际互联网的简称,国际互联网就是Internet,所以互联网=Internet。 广域网是网络专业的一个专业术语,通常特指跨接很大物理范围的 计算机网络,一般要超过几十公里,比如某公司总部在北京,分公司在上海,这两个地方的分别有各自的局域网,这两个局域网通过自建或者租用通讯线路的方式连接起来就构成了一个广域网络。 所以,广域网是网络的一个类别,国际互联网是广域网的一种,或者说国际互联网是广域网的一个实例,就像山羊(国际互联网)是一种羊(广域网),但是羊(广域网)不一定就是山羊(国际互联网)。 除了国际互联网是广域网的一种外,电力调度网、大型跨地区企业的内部网不会和国际互联网(Internet)连接,但他们也是典型的广域网。 转载于:https://www.cnblogs.com/Chuck-Yue/p/10395857.html

Linux:如何创建用户

下面将演示创建用户 zyq01 (1)输入命令:sudo useradd zyq01,回车,创建用户; (2)输入命令:ls,回车,查看用户是否创建成功(可以看到用户已经创建成功了); (3)输入命令:sudo passwd zyq01,回车,设置登录用户密码; (4)输入密码,回车(输入时候密码不可见,光标也不会移动); (5)重复输入密码,回车(可以看到,密码已被设置成功了); (6)输入命令:su zyq01,切换到新用户下试试吧; 相关文章推荐:root 用户下显示 -bash-4.2#,如何恢复正常?

电源的安规设计(1)

安规的含义 以法规的形式实现电在应用中的安全; 是安全规范(法律法规)和安全标准的简称。 执行安规的目的 降低电气产品对人身和财产的各种伤害, 包括电击、起火、过热、机械伤害等, 降低公司运行的风险。 电子产品设备可能存在的危险 1)电击; 2)能量危险(如电池的正负极短路); 3)着火; 4)与热有关的危险; 5)机械危险; 6)化学危险; 7)辐射危险。 安全的基本原则 设备在正常使用及单一故障条件下, 防止引起人身伤害和着火等危险; 制造商应提供足够的资料, 说明一切必须具备的条件, 以保证用户在按制造商的规定使用设备时不会引起危险; 涉及安全的元器件, 应经公认的试验机构认证, 或作为设备的一个组成部分,承受有关试验; 避免设备在操作、安装、维修、运输或储存时引起维修, 则制造商应提供必要的说明。 与安全有关的说明书和设备标记应使用客户识别的文字和标识。 安全防护的基本思想 危险位置与人之间提供双重防护l防护的途径为采用合理的绝缘措施: 1、工作(功能)绝缘(F) 2、基本绝缘 (B) 3、附加绝缘 (S) 4、双重绝缘 (D) 5、加强绝缘 (R) 6、保护接地 (PE) 去除对人身安全的威胁 1、触电 2、起火 3、烫伤 4、辐射 5、机械伤害 电击对人的伤害 人类对电的感应 1、皮肤阻抗:人的皮肤阻抗根据皮肤的湿度改变,干的时候达到3兆欧姆,潮湿时大约500欧姆,皮肤的阻抗也会随周围环境温度、疲劳情况空气湿度、惊吓、焦虑及其它因素改变。 2、致命电流 :99%的健康男性的心脏能通过的极限电流的时间为:(即致命电流与时间)。 电流(A) 时间(s) 0.116 1 0.0367 10 0.0232 25 0.014 60 危险电压 1、IEC 60950-1 办公室环境60Vdc,42.4Vpeak,30Vac 2、IEC 60950-22户外环境30Vdc,21.2Vpeak,15Vac 人对温度的刺激表现 1、肌肉组织在50℃会遭到破坏;神经组织会在更低的温度下被破坏;

第二次作业

——————————换钱 7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。 输入格式: 输入在一行中给出一个不超过9位的非负整数。 输出格式: 在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。 输入样例1: 813227345 输出样例1: iYbQdBcScWhQdBeSf 输入样例2: 6900 输出样例2: gQjB ———————————————————————————————————————————————————————————————————————————————————————————— 标准代码: ———————————————————————————————————————————————————————————————————————————————————————————— #include<stdio.h> #include<string.h> int main() { char a[10]={'a','b','c','d','e','f','g','h','i','j'}; char b[]={' ',' ','S','B','Q','W','S','B','Q','Y'}; char num[10]; gets(num); int l=strlen(num); int n; int i=0; int ling=0; int k=0; if(num[0]=='0'&&l==1) printf("a"); else while(l-->0) { n=num[i++]-'0'; if(n!=0) { if(ling==1) printf("a"); printf("%c",a[n]); ling=0; } else { ling=1; if(l==4&&k==1) printf("W"); continue; } if(l>0) { if(l>4&&l<8) k=1; printf("

java文件的运行

运行java文件,首先要有程序入口,即:public static void main(String[] args){}方法,当有类有这个方法后,可以用javac命令编译并用java命令(已配置好java环境变量)来执行该文件。 环境变量作用:当配置java环境变量后,输入java命令则会使windows直接在变量里配置的目录中找到java.exe运行。 本文分析的源码为jdk8源码 运行java命令后,jdk8启动入口:main.c就会执行 可以看到这个文件在非win32位下几乎就是直接调用JLI_Launch方法!进入同目录下的java.c可以看到JLI_Launch方法的实现,具体代码如下: JLI_Launch(int argc, char ** argv, /* main argc, argc */ int jargc, const char** jargv, /* java args */ int appclassc, const char** appclassv, /* app classpath */ const char* fullversion, /* full version defined */ const char* dotversion, /* dot version defined */ const char* pname, /* program name */ const char* lname, /* launcher name */ jboolean javaargs, /* JAVA_ARGS */

typeScript面试必备之-通识一

现在玩ts的前端越来越多,作为马上来临的春季招聘,前端的小伙伴你准备好了吗?ts越来越像java,更加规整,个人认为这是一个大趋势。 Typescript 介绍 1、 TypeScript 是由微软开发的一款开源的编程语言。 2、 TypeScript升级了JavaScript,遵循最新的es5和es6规范,并且还扩展了Javascript的语法譬如多态,很像java了。 3、vue3.0已经开始支持ts文件,react也支持。 4、goole支持ts,angular2.x+也是基于typescript 二、ts的安装和编译 编译 tsc --init 生成配置文件 准备工作结束,后面开始介绍语法了: typeScript中的10大数据类型 布尔类型(boolean):var isOpen:boolean=true; 复制代码 数字类型(number) : var num:number=123; 复制代码 字符串类型(string) : var str:string='string'; 复制代码 数组类型(array) : var arr1:number[]=[1,2,3]; var arr2:Array<number>=[1,2,3] var arr3:any[]=['131214',22,true]; 复制代码 元组类型(tuple) : arr:[number,string]=[1,'aaa']; 复制代码 枚举类型(enum) :方式1 enum Flag {success=1,error=2}; let s:Flag=Flag.success;//1 方式2 enum Flag {success,error}; let s:Flag=Flag.success;//0就是下标 复制代码 任意类型(any) : var num:any=123; num='str'; num=true; 适用场景: var oBox:any=document.getElementById('box'); oBox.style.color='red'; 复制代码 null 和 undefined :定义没有赋值就是undefined,只是声明没有赋值会报错。 如图1和图2,图3的方式可以解决。 复制代码 图1

Java实现微信公众号扫描二维码未关注时跳转关注界面已关注跳转业务界面

以下只是测试代码写得不太整齐规范,但是主要思路以及要注意的都写了: 前提:需要申请认证的微信公众号;获取对应的APPID和APPSECRET;并且还需要获取到用户信息权限(点击“修改“添加服务器的域名地址),前期工作安装测试账号为例给大家展示下: 1)、公众测试账号获取 访问上面的连接,选择“接口测试号申请”获得直接打开http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index通过微信客户端扫码登录即可登录。 登录完即可获取到一个测试公众账号的信息。主要有appId和appsecret两个参数,这将唯一标示一个公众号,并且需要将他们作为参数获取用户的信息。 2)、关注公众号 用户只有关注了这个公众号了,才能通过打开有公众号信息的链接去授权第三方登录,并获取用户信息的操作。故我们还需要用我们的微信关注微信号,操作如下: 还是刚刚那个登录成功后跳转的页面,我们可以看到,该页面有一个二维码,我们可以通过扫描该二维码进行关注,关注成功在右边的“用户列表”会多一个用户的信息。如下图所示: 3)配置回调函数 我们在微信客户端访问第三方网页(即我们自己的网页)的时候,我们可以通过微信网页授权机制,我们不仅要有前面获取到的appid和appsecret还需要有当用户授权之后,回调的域名设置,即用户授权后,页面会跳转到哪里。具体的配置如下: 还是在刚刚的页面,有一个“网页授权获取用户基本信息”,点击后面的修改 填写回调的域名: 生产环境上配置回调的域名地方 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 如果你的网址没有被列入过黑名单,就会在顶部出现 然后,域名配置就成功了!可以进行开发了。 一。授权开发的流程(详情的东西请以官网为准,在此就不多说了):具体而言,网页授权流程分为四步: 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) 注意:微信静默授权与非静默授权所拿到OpenId与关注微信公众号后所拿到的OpenID是一致的,但是与微信开放平台的扫码登录中OpenId是不一样的,此时可以通过UnionId来做业务上关联。 同时,通过BIZ跳转到微信关注页面方法,已经被微信所屏蔽。只能通过微信内部跳转才可以,如:推送消息点击连接跳到关注页,或是通过微信扫-扫扫码方式都可以。 二.按照如上流程我就不多说废话直接粘代码供大家参考,请大家多多指教(代码里的所有APPID,APPSECRET都是使用的官网提供测试账号) 1.设计一个公用网络请求工具类: import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.springframework.util.DigestUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class WXAuthUtil { public static final String APPID="

Java基础知识

Java 的接口组成: (1)全局常量(public static final,如果要省略,只能省略 public) (2)抽象方法(public abstract,如果要省略,可省略任一或全部) 注意:即便省略了,依然代表全部。如:全局常量省略为 static final,其实依然是 public static final。即接口仅包含方法定义和常量值。 方法 static void method( ) 静态方法,只有静态方法才能被类名调用public void method( ) 一般方法,只能被实例对象调用final void method( ) final修饰方法,只是说明本方法不能被重写abstract void method( ) abstract修饰方法,表示本方法为抽象方法,没有方法体,且抽象方法必须在抽象类中,但是抽象类中可以没有抽象方法 构造方法(构造函数construct) 构造函数可以省略,省略后JVM会自动创建一个无参的构造函数 ;构造函数必须与public 类同名,方法和类同名;一个class可以定义多个构造函数(注意:构造函数可以由任意访问修饰符访问,比如public、protected、private,但不能由static、finally等修饰符修饰);构造函数可以重载;构造函数在一个对象被new 时执行。 封装 封装使实现的改变对架构的影响小化。 原则:装使对象的属性尽可能的私有,根据需要配上相应的get/set 方法,对象的方法尽可能的公开。该隐藏的一定要隐藏,该公开的一定要公开。 private :仅本类成员可见 default :本类+同包类可见(默认) protected:本类+同包+不同包的子类 public :公开 注:这里的同包指的是跟父类所在的包相同 完全封装:属性全部私有,并提供相应的 get/set 方法。 继承 基于一个已存在的类构造一个新类,在此基础上,还可以在新类中添加一些新的方法和属性。 继承用关键字 extends Java 中只允许单继承(java 简单性的体现) ,父子类之间的关系是树状关系。(而多继承是网状关系) 父类中的私有属性可以继承但是不能访问。 也可以说父类中的私有属性子类不能继承。 原则:父类放共性,子类放个性。 构造方法不能被子类继承 super 关键字 Super()表示调用父类的构造方法 Super()也和 this 一样必须放在方法的第一行第一句。

webstorm常用快捷键大全

下面是Webstorm的一些常用快捷键: 与行有关 Shift+Enter 添加行Ctrl+Enter 添加行,光标不动Ctrl+Alt+Enter向上添加行Ctrl+D复制一行Ctrl+Y删除一行Shift+Alt+Up 向上移动行Shift+Alt+Down 向下移动行Ctrl+Shift+Alt+Left向左移动 常用在html标签特性换位置Ctrl+Shift+Alt+Right向右移动Ctrl+Shift+J 当前行与下一行合并Ctrl+Shift+M 移动光标到块前后,支持{},(),[],<> 复制、粘贴有关 Ctrl+C 复制,不选的话复制整行Ctrl+Shift+C 复制文件路径名Ctrl+Shift+Alt+C 复制某行代码的路径并加上行号Ctrl+X 剪切Ctrl+C 复制Ctrl+Shift+V 从剪贴板中选择某个进行粘贴Ctrl+drag 先选中,按ctrl 拖动也是复制Ctrl+Z 撤销Ctrl+Shift+Z 反撤销 选择有关 Ctrl+A 全选Shift+Left/Right 选择Shift+Ctrl+Left/Right 快速选择Shift+Ctrl+Up/Down 上下移动行双击Ctrl+Home/End向前/向后选择整行Ctrl+Shift+Page Up/Page Down选择至屏幕顶端/底端Ctrl+W 选择最近的一个词Ctrl+Shift+Alt+Left鼠标选择多行编辑alt+left多行编辑Ctrl+w选择代码块 查找有关 Ctrl+N JS中查找ClassAlt+7 structure中查找 直接输入Ctrl+Shift+N 查找文件,目录后面加/或者\Alt+Tab 查找在工作区打开的文件Ctrl+E 查找最后一次打开的文件Ctrl+Shift+E 查找最近修改的文件Ctrl+Shift+Alt+N查找SymbolCtrl+F或Ctrl+Shift+F7或Alt+F3查找, F3下一个 Shift+F3上一个Shift+Shift search everywhere输入# 查找系统设置 窗口切换有关 Alt+F1切换视图Alt+1 切换到projectAlt+2 切换到favouriteAlt+6 切换到todoAlt+7 切换到structureAlt+Home 导航条切换Alt+F12切换到terminalCtrl+Tab切换文件视图Alt+Left/Right左右切换编辑窗口F12 打开最近使用的工具窗口Shift+ESC 关闭打开的工具窗口Escape 返回编辑窗口Alt+F4关闭webstorm 模板有关 Ctrl+Alt+T 生成代码块,在一个语句后面使用。js中比如生成if/else代码块。Ctrl+J直接使用,html中比较多 删除有关 -Ctrl+Shift+Delete 范围性删除标签,tag标签 文件有关 F10 打开file选项Ctrl+E 打开最近的文件Ctrl+Shift+E 打开最近修改过的文件F4打开文件(在project窗口中)Shift+F4新窗口打开文件Ctrl+F4关闭当前标签Ctrl+左键点击编辑窗口上面的文件标签,可以打开对应的文件,以及目录 注释有关 Ctrl+Slash 注释行Ctrl+Shift+Slash 注释块 其他快捷方式

RTTheard学习笔记-全局中断及临界操作分析

本文将以Cortx-M3为例说明RTThread开关中断的过程以及进入临界区的相关操作: 1、全局中断 对于Cortx-M3系列MCU ,RTThread是通过操作,中断屏蔽寄存器PRIMASK实现开关中断操作的,《Cortex-M3权威指南》中对PRIMASK寄存器有描述如下: 这个是只有1位的存储器,当它置1时,就关闭所有可屏蔽的异常,只剩下NMI和fault可以响应。它的缺省值是0,表示没有关中断。 由此可见只要对PRIMASK置1就可实现关中断操作,对PRIMASK清0就可实现开中断操作;为了快速的开关中断CM3专业设置了一条CPS指令实现相应的操作 CPSID I ; PRIMASK =1 关中断 CPSIE I ; PRIMASK =0 开中断 下面重点讨论一下RTThread中开关中断的具体实现过程,RTThread开关中断函数都是通过汇编函数来实现的,实际操作的时候是在C中调用相应的汇编函数来完成开关中断操作,开关中断函数都在rthw.h里面 rt_base_t rt_hw_interrupt_disable(void); //关中断 void rt_hw_interrupt_enable(rt_base_t level); //开中断 关中断函数 ;/* ; * rt_base_t rt_hw_interrupt_disable(); ; */ rt_hw_interrupt_disable PROC (1-1) EXPORT rt_hw_interrupt_disable (2) MRS r0, PRIMASK (3) CPSID I (4) BX LR (5) ENDP (1-2) (1-1)PROC 是定义子程序的伪指令,位于子程序的开始位置,必须和ENDP成对出现。 (1-2)ENDP 位于子程序的末尾,必须和PROC成对出现。 使用 EXPORT 关键字导出标号 rt_hw_interrupt_disable,使其具有全 局熟悉,在外部头文件声明后(在 rthw.h 中声明) ,就可以在 C 文件中调用。 (3 )通过 MRS 指令将特殊寄存器 PRIMASK 寄存器的值存储到通用寄 存器 r0。当在 C 中调用汇编的子程

代码: 0x80131500:应用商店崩溃了修复

建议您先尝试更换网络连接,比如连接个人手机热点,再使用 Microsoft Store 进行尝试。如果您连接了 VPN 或下载了第三方防火墙应用,建议断开 VPN,卸载第三方防火墙应用。 如果上述方法无法解决问题,您可以尝试清理应用商店的缓存,看看是否可以恢复正常: 按 “Windows 徽标键+R”,在运行窗口中,键入“WSReset.exe” 并点击 “运行”。 如果问题依旧,建议您打开 设置>应用>应用和功能>在左边的列表中找到应用商店选中>高级选项>重置。 如果重置无效,请打开 IE 浏览器,点击设置,打开 Internet 选项,点击高级,并勾选 “使用SSL 3.0”、”使用 TLS 1.0“、”使用 TLS 1.1“、”使用 TLS 1.2“,应用后重启电脑,查看能否解决问题。 如果上述方法均无效,建议您尝试以下方案重新部署您的应用商店: 在打开的 “Windows Powershell(管理员)” 窗口中输入以下命令(慎用): get-appxpackage store | remove-Appxpackage 再次安装: add-appxpackage -register “C:\Program Files\WindowsApps*Store*\AppxManifest.xml” -disabledevelopmentmode 如果以上的方法均无法解决问题,请按 “Windows 徽标键+F” 启动反馈中心,添加一条反馈来详细说明您遇到的问题,以便 Microsoft 工程师调查和处理。 原始链接:https://answers.microsoft.com/zh-hans/windows/forum/all/代码/cbbe7aaf-8f66-4779-89c8-3c74f5341c7b

JSP及EL表达式、JSTL标签库等前端技术汇总

前文: JSP本质上为servlet,是一个用于开发动态web资源(展示页面)的技术。 一、JSP的定义 二、JSP语法、指令 1.语法 2.指令 三、PageContext作用域,并引出九大内置对象 四、JSP调用过程 五、EL表达式 原来的通过Page对象<%...%>的获取元素/数据的方式过于复杂,于是引进了EL表达式的${}进行替换。 六、JSTL标签库 部分JS需要在<body>中编写,使文本过于复杂,于是引进了标签库来替换<body>中的JS代码。 六、前端技术汇总 相关链接:JS及JQuery库的引入与json串的来源https://blog.csdn.net/weixin_42687074/article/details/86628094

mybaits错误解决:There is no getter for property named ... in ‘class java.lang.String‘

在使用mybaitis传参数的时候,如果仅传入一个类型为String的参数,那么在 xml文件中应该使用_parameter来代替参数名。 正确的写法: <select id="getDeptInfo" parameterType="String" resultType="com.gskdht.pushmessage.model.DeptInfo"> SELECT DEPT_ID,PARENT_ID,DEPT_NAME,DEPT_LEVEL from PARA_DEPT <where> <if test="_parameter != '1'.toString() "> PARENT_ID = #{_parameter} </if> </where> </select> 错误的写法: <select id="getDeptInfo" parameterType="String" resultType="com.gskdht.pushmessage.model.DeptInfo"> SELECT DEPT_ID,PARENT_ID,DEPT_NAME,DEPT_LEVEL from PARA_DEPT <where> <if test="parentId != '1'.toString() "> PARENT_ID = #{parentId} </if> </where> </select> 也可以在mapper的接口中,给这个方法的参数加上@Param(value=“parentId”),这样就能在.xml中使用#{parentId} 了。 如:public List<DeptInfo> getDeptInfo(@Param("parentId") String parentId) 这样也是可以的。

二分查找算法及其变种详解

背景: 春节已过,开工大吉!让我们回顾下一些经典的算法吧 ~ 注:kafka的 log存储稀疏索引就是通过二分查号快速定位数据的! 一、思想介绍 二分查找(Binary Search)算法,也叫折半查找算法,它的思想非常简单,在生活中随处可见(比如:猜字游戏),但这看似简单的算法,实际却没那么容易掌握透彻。 二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 二、时间复杂度 二分查找是一种非常高效的查找算法,高效到什么程度呢?我们来分析一下它的时间复杂度。 我们假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。 被查找区间的大小变化:n、n/2、n/4、n/8 ... n/2^k 可以发现,每次比较后查找区间会呈等比数列缩小,且每一次缩小操作只涉及两个数据的大小比较,所以,经过了 k 次区间缩小操作,时间复杂度就是 O(k),最终区间大小为n/2^k=1,我们可以求得 k=log2n,所以时间复杂度就是 O(logn)。 这种对数时间复杂度。这是一种极其高效的时间复杂度,有的时候甚至比时间复杂度是常量级 O(1) 的算法还要高效。为什么这么说呢? 因为 logn 是一个非常“恐怖”的数量级,即便 n 非常非常大,对应的 logn 也很小。比如 n 等于 2 的 32 次方,这个数很大了吧?大约是 42 亿。也就是说,如果我们在 42 亿个数据中用二分查找一个数据,最多需要比较 32 次。 我们用大 O 标记法表示时间复杂度的时候,一般会省略掉常数、系数和低阶。对于常量级时间复杂度的算法来说,O(1) 有可能表示的是一个非常大的常量值,比如 O(1000)、O(10000)。所以,常量级时间复杂度的算法有时候可能还没有 O(logn) 的算法执行效率高。 三、最简单二分查找 - 代码实现 为什么说是最简单的二分查找呢?因为我们默认有序数组中不存在重复元素,在其中用二分查找值等于给定值的数据。 非递归实现: // 1.经典二分查找,有序数组无重复数据,查找等于给定值的元素 public static int bSearch1(int[] arr, int value) { int low = 0; int high = arr.

如何重装agent

yum install -y cloudera-manager-agent-5.10.0-1.cm5100.p0.85.el6.x86_64 vi /etc/cloudera-scm-agent/config.ini # 修改cm的ip。 server_host=hadoop001