Ansible_yaml剧本

YAML语法 YAML最初是Yet Another Markup Language(另一种标记语言)的缩写,后来为了强调yaml是以数 据为中心重新命名为递归写法YAML Ain’t Markup Language(YAML 不是一种标记语言)。 散列表:(又叫哈希表),有键值对组成。 示例: name: aaa age: 12 或者 {name: aaa, age: 12} 列表: 示例: - list1 - list2 - list3 或者 [list1, list2, list3] 散列表中是引用列表: 示例: name: - name1 - name2 列表中使用散列项: 示例: - name: aaa age: 18 或者 - {name: aaa, age: 18} 列表中使用列表项: 示例: - [name, age, ] 或者 - - name1 - name2 散列表中使用散列表: 示例: names1: name1: aaa name2: bbb name3: ccc names2: .

elsticsearch curl 查看集群状态

在使用elasticsearch,一般集群都是部署在服务器上的,有以下几种方法可以去查看集群和索引库的相关信息 第一种:搭建elk,当然这是部署了elk的前提之下去通过kibana查看,不是为了查看故意去搭elk,那effort就太大了第二种:安装插件等,其中可以选择head插件(5.x后需要自行安装,不再作为内部插件存在)、x-pack(功能很强大,可是5.x开始已经开始要收费了,而且占资源很大)第三种:用最简单的http请求,最原始的语句去请求访问,通过返回的json来查看集群以及节点的状态(如果是偶尔的查看和手头没有搭建一些东西的同志,建议这么做,毕竟这也是最基础的) 下面就来看一下: 1、查看集群健康值 curl -XGET 'http://localhost:8200/_cluster/health?pretty' 结果: { "cluster_name" : "if2c", "status" : "yellow", //集群的状态红绿灯,绿:健康,黄:亚健康,红:病态 "timed_out" : false, "number_of_nodes" : 1, //节点数 "number_of_data_nodes" : 1, //数据节点数 "active_primary_shards" : 3, //分片数,3个Index库 "active_shards" : 3, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 3 //未指定节点,配置了复本,仅使用一台机器部署会出现这种情况 } 2、 也可以对具体Index库(一个或者多个库)进行查看健康状态 curl -XGET 'http://localhost:8200/_cluster/health/zh?pretty' 一个index库 curl -XGET 'http://localhost:8200/_cluster/health/zh,west?pretty' 多个index库 3、 也可以附加一些参数显示更加具体的内容 level=indices, shards, cluster curl -XGET 'http://localhost:8200/_cluster/health?level=indices&pretty' curl -XGET 'http://localhost:8200/_cluster/health?level=shards&pretty' 4、查看当前节点的所有状态(包括集群状态、索引库数量、每个索引库的状态、所有搜索线程组的状态和线程数,很全) curl -XGET 'http://localhost:9200/_nodes/stats?

Transport Client 与 Node Client 官网谈差别

通过使用elasticsearch 5.x版本,由于是追着潮流,所以遇到了很多疑惑和坑,接下来我们来看一下我一开始用5.x出现两个client 时关于两者区别的疑惑。 Transport Client 与 Node Client 如果你使用的是 Java,你可能想知道何时使用传输客户端(注:Transport Client,下同)与节点客户端(注:Node Client,下同)。 在书的开头所述, 传输客户端作为一个集群和应用程序之间的通信层。它知道 API 并能自动帮你在节点之间轮询,帮你嗅探集群等等。但它是集群 外部的 ,和 REST 客户端类似。 另一方面,节点客户端,实际上是一个集群中的节点(但不保存数据,不能成为主节点)。因为它是一个节点,它知道整个集群状态(所有节点驻留,分片分布在哪些节点,等等)。 这意味着它可以执行 APIs 但少了一个网络跃点。 这里有两个客户端案例的使用情况: 如果要将应用程序和 Elasticsearch 集群进行解耦,传输客户端是一个理想的选择。例如,如果您的应用程序需要快速的创建和销毁到集群的连接,传输客户端比节点客户端”轻”,因为它不是一个集群的一部分。 类似地,如果您需要创建成千上万的连接,你不想有成千上万节点加入集群。传输客户端( TC )将是一个更好的选择。 另一方面,如果你只需要有少数的、长期持久的对象连接到集群,客户端节点可以更高效,因为它知道集群的布局。但是它会使你的应用程序和集群耦合在一起,所以从防火墙的角度,它可能会构成问题。

ajax请求当发送post方式application/json格式数据,url后面又带有参数的时候

var url="${pageContext.request.contextPath}/json/jsonTest.do?idl=123&id=111"; $.ajax( {type : "POST", url : url, contentType:"application/json", dataType: "JSON", async : false, data : JSON.stringify({"name":"whj","age":"18","sex":"nv"}), //data : {"id":"1","name":"whj","age":"18","sex":"nv"}, beforeSend: function(){ }, complete: function(){ }, success : function(data){//格式{key:value} alert(data); alert(data[0].name) }, error: function(data) { alert("error"); } }); 后台接受方法 @RequestMapping(value="jsonTest") public @ResponseBody Person execute8( Person person,String idl,Stirng id){ //public @ResponseBody List<Person> findAll(){ //模拟数据库方法 Logger.getLogger(JsonAction.class).debug("进入personFindAllaction"); 后台控制台输出可以看到 person.toString=[id":"1","name":"whj","age":"18","sex":"nv"]. idl=123 id=111 return new Person(2,"whj1",25,"nan",new Date()); } 这里不会报错。 但是当去掉contentType:"application/json", $.ajax( {type : "

[微信小程序]搜索功能实现,搜索框样式

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: 上效果图: 一:搜索框功能实现 1.在首页做一个搜索框的样式并实现跳转到搜索页面 <view class='page_row' bindtap="suo"> <view class="search"> <view class="df search_arr"> <icon class="searchcion" size='20' type='search'></icon> <input class="" disabled placeholder="请输入关键字" value="{{searchValue}}"/> </view> </view> <view class='sousuo'>搜索</view> </view> .search{ width: 80%; } .search_arr { border: 1px solid #d0d0d0; border-radius: 10rpx; margin-left: 20rpx; } .search_arr input{ margin-left: 60rpx; height: 60rpx; border-radius: 5px; } .bc_text { line-height: 68rpx; height: 68rpx; margin-top: 34rpx; } .sousuo { margin-left: 15rpx; width: 15%; line-height: 150%; text-align: center; border: 1px solid #d0d0d0; border-radius: 10rpx; } .

基于Flink流处理的动态实时超大规模用户行为分析

作者 | 吴昊 编辑 | Vincent AI前线出品| ID:ai-front AI 前线导语:“传统的用户行为分析系统通常以离线批处理模式根据既定规则对用户数据进行分析。规则相对简单,且更新规则需要重启系统。而在安全领域,许多安全场景要求能够 7/24 小时实时监测威胁、作出报警。 因此我们需要一个高吞吐量的实时计算框架来满足对实时性的需求。在这里我们将介绍网络安全中基于流式计算框架 Flink 并搭载机器学习算法的超大规模用户行为分析系统(UBA)的实践经验。看瀚思科技如何利用 Flink 的高效流式处理框架,承载 UBA 核心计算任务,并融合批处理和流处理模式,如何定义完备易用的场景规则语法,并利用 Flink 对复杂事件处理(CEP)的原生支持,实现规则的动态更新的实战经验。” 各位晚上好,首先感谢大家参与我的这次主题分享,同时也感谢 InfoQ AI 前线组织这次瀚思科技主题月! 瀚思科技成立于 2014 年,按行业划分我们是一家安全公司。但和大家熟知的卖杀毒软件或者防火墙的传统安全公司不同。瀚思科技帮助各种中大型企业搭建安全大数据的分析平台,平台上应用的安全分析策略深度结合了多种机器学习算法,最终帮助企业定位与揭示各种安全问题。所以我们自己定位是一家安全 + 大数据 +AI 的公司。 言归正传,今天的分享主题是:基于 Flink 流处理的动态实时大规模用户行为分析 今天的分享主要包括四大部分: 1)网络安全中的用户行为分析(简称 UBA); 2)实时超大规模用户行为分析的技术挑战 ; 3)Drools 规则引擎在 CEP 中的应用 ; 4)Flink 原生 CEP 组件。 首先,我们先明确一个概念,什么是网络安全中的用户行为分析?简而言之,用户行为分析是通过分析用户数据(例如交易数据,用户登录数据),找出异常行为以检测外部及内部人士的攻击活动。举例来说,外部攻击通常是由外部黑客通过破解 VPN 密码并夺取员工帐户的方式实现。而内部攻击则往往表现为心存不满的或者即将离职的员工对敏感信息的窃取。从右图可以看出,我们需要分析的源数据通常表现为多种数据类型,例如服务器数据、网络数据、数据库数据、应用程序数据、安全数据等。这些数据被送入用户行为分析系统,输出用户正常行为和异常行为(内 / 外部攻击)。 传统的用户行为分析系统通常以离线批处理模式根据既定规则对这些数据进行分析。比如每天定时跑前一天的数据。这种方式适合对实时性要求不高甚至没有要求的业务场景。而面对强调实时性的场景,例如反欺诈场景,需要对实时交易数据进行分析,及时应对不正常的交易。在这种情况下,离线的方式显然不适用。我们必须利用在线 / 流式处理框架,并添加必要的机器学习算法,对实时数据进行 7/24 监控,以区分威胁行为与正常行为。 然而大规模用户行为分析并没有想象中那么简单,尤其是对实时性要求高的场景下。实际应用中,会存在很多细节问题以及技术挑战。我们可以看到这里列举出了四点主要的技术挑战。第一点,输入信息规模过大。举例来说:在一个有 10k+ 员工的大型企业部署用户行为分析系统时,往往需要对这 10k+ 用户在十余个维度上做分析。面对这样体量的数据。分析性能往往受到巨大的挑战。第二点也就是我们先前谈到的实际需求往往需要以实时方式检测攻击活动。第三点讲的是检测逻辑往往不是单一的,实际应用中需要将黑名单、业务逻辑规则以及机器学习算法加以结合。一旦规则数量过大,单个规则逻辑复杂时,整个系统的吞吐量就会受到挑战。第四点讲的是规则不是静态的,而是需要被实时更新的,也就是规则的动态部署。 为了应对以上问题,我们通过技术调研选择了 Flink 作为底层的流处理框架。主要出于以下几点原因: 第一,Flink 是一个纯流式系统,吞吐量实际测试可达 100K EPS。而不像某些框架是用 mini batch 的模式来达到所谓的流式处理的;

linux 安装mysql数据库——yum安装法2

一、下载 下载地址: http://dev.mysql.com/downloads/mysql/ 安装顺序是这样的 rpm -ivh MySQL-server-5.6.21-1.rhel5.x86_64.rpm rpm -ivh MySQL-client-5.6.21-1.rhel5.x86_64.rpm rpm -ivh MySQL-devel-5.6.21-1.rhel5.x86_64.rpm 【注意版本】 下载的版本和centos 版本要一致否则会出错 这里就是64位, MySQL-5.6.37-1.el6.i686.rpm-bundle 这种就是32位的 如果在32位上安装64位 会提示出错 libc.so.6(GLIBC_2.0) is needed by cndrvcups-common-2.60-1.x86_64 类似这样的 我们可以使用下面命令查看系统是32位还是64位 getconf LONG_BIT 4、 修改配置文件、初始化Mysql 4.1、修改配置文件路径到etc目录,命令: cp /usr/share/mysql/my-default.cnf /etc/my.cnf 1 4.2、初始化Mysql ,命令: /usr/bin/mysql_install_db 4.3、查看mysql服务是否已经启动,若没有启动,则启动mysql: 查看命令: ps -ef|grep mysql netstat -anpt|grep 3306 启动命令:(老版本用service mysqld start命令) service mysql start (若没有启动成功,且启动时抛The server quit without updating PID file 异常,请查看后面“三、可能出现的异常”中的第4条) 5、修改root账户初始密码 因为Mysql安装好后的初始默认密码是一个随机密码,我们可能需要修改成我们自己设置的密码: 查询默认密码命令: more /root/.mysql_secret 显示初始化密码 登录 修改秘密

STM32 中断函数SysTick_Handler理解

目的 滴答定时器整理(STM32F103)。用了一段时间的滴答定时器,突然忘记其中配置方法,重新翻阅手册及博文,在此记录备忘。 SysTick的重装寄存器决定了定时器频率,若SysTick的时钟源是72M, SystemFrequency = 72000000Hz //1ms时基 //HCLK_Frequency = 72000000Hz; //#define OS_TICKS_PER_SEC 1000 SysTick_SetReload((u32)RCC_Clocks.HCLK_Frequency / OS_TICKS_PER_SEC); 时钟树 寄存器 寄存器名称和地址 STK_CSR, 0xE000E010 – 控制寄存器 STK_LOAD, 0xE000E014 – 重载寄存器 STK_VAL, 0xE000E018 – 当前值寄存器 STK_CALRB, 0xE000E01C – 校准值寄存器 寄存器描述 STK_CSR控制寄存器:寄存器低4位含义 第0位:ENABLE,Systick 使能位 (0:关闭Systick功能;1:开启Systick功能)第1位:TICKINT,Systick 中断使能位(0:关闭Systick中断;1:开启Systick中断) 第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟) 第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零 STK_LOAD 重载寄存器: Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。 STK_VAL当前值寄存器: 也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。 STK_CALRB校准值寄存器: 位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms 位[23:0] :Calibration value Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock.

python3 判断列表是一个空列表

python3 判断空列表 @(python3) 有个判断列表是否为空的需求,试了好多方式,比如: a = [] if a is not None: COMMAND a = [] if a[0] is None: COMMAND 各种乱七八糟的逻辑,老是无法满足。其实很简单。 a = [] if a: COMMAND 空列表等于 False,那么直接 if a 就是判断在列表不为空的时候,需要执行的命令 a = [] if len(a): COMMAND 同理,len(a) = 0在 a 不为空的时候,执行 Command

在Scrapy中启动shell来调试

在Scrapy中写爬虫时,有时想在spider运行到某个位置时暂停,查看被处理的response, 以确认response是否是期望的。 这可以通过 scrapy.shell.inspect_response 函数来实现。 以下是如何在spider中调用该函数的例子: import scrapy class MySpider(scrapy.Spider): name = "myspider" start_urls = [ "http://example.com", "http://example.org", "http://example.net", ] def parse(self, response): # We want to inspect one specific response. if ".org" in response.url: from scrapy.shell import inspect_response inspect_response(response, self) # Rest of parsing code. 当运行spider时,您将得到类似下列的输出: 2017-10-23 17:48:31-0400 [myspider] DEBUG: Crawled (200) <GET http://example.com> (referer: None) 2017-10-23 17:48:31-0400 [myspider] DEBUG: Crawled (200) <GET http://example.org> (referer: None) [s] Available Scrapy objects: [s] crawler <scrapy.

在linux virtualenv下添加PYTHONPATH

将’/home/ll/seglink-master/pylib/src’添加到 PYTHONPATH 1、新建一个.pth文件 sudo gedit /home/ll/seg-env/local/lib/python2.7/site-packages/a.pth 2、写入要添加的路径,保存退出 3、查看一下新添加的路径 (seg-env)ll@gpuserver1:~$ python Python 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/home/ll/seg-env/lib/python2.7', '/home/ll/seg-env/lib/python2.7/plat-x86_64-linux-gnu', '/home/ll/seg-env/lib/python2.7/lib-tk', '/home/ll/seglink-master/pylib/src'] 已经在了,OK… 参考http://blog.csdn.net/gaohuazhao/article/details/54317017

vue使用vuex时展开运算符出错解决方案

当需要进行vuex进行数据状态管理的时候,会使用到mapGetters,mapState,还有自身的计算属性的时候,这个时候就会用到这个了! 安装依赖 npm install babel-plugin-transform-object-rest-spread -D 修改.babelrc文件 { "presets": [ ["env", { "modules": false }] ], "plugins": ["transform-object-rest-spread"] //增加这一行 } 使用 <script> import {mapState,mapGetters} from 'vuex' export default { methods:{ increment(){ this.$store.commit('increment'); } }, computed:{ ...mapGetters([ 'count' ]), ...mapState({ counts(){ return this.$store.state.count; } }) } } </script>

Unable to get element from the feed as bytes.解决

报错: tensorflow.python.framework.errors_impl.InternalError: Unable to get element from the feed as bytes. 是因为模型路径下存在同名的文件夹,如图: 将文件夹model.ckpt-136750删除,解决问题

Qt之QSS(Q_PROPERTY-原始属性)【转】

简述属性实例 效果QSS源码 更多参考 简述 在Qt之QSS(样式表语法)一节讲过关于“设置对象属性”的用法,里面有一条很重要的原则是:任何可被识别的Q_PROPERTY都可以使用qproperty-语法设置。 这里需要对Qt属性系统有一定的了解,详见:Qt之属性系统。 属性 下面我们以QLabel为例,讲解如何在QSS中使用属性。 class Q_WIDGETS_EXPORT QLabel : public QFrame { ... Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap) Q_PROPERTY(bool scaledContents READ hasScaledContents WRITE setScaledContents) ... }; 可以看到,其中pixmap、scaledContents等属性均可使用,这样我们就可以通过QSS按照qproperty-语法的方式设置标签的图标和适应性了。 但是如果要设置标签的大小该怎么办呢?因为我们并没有发现与width、height、size相关的属性。难道真的束手无策?当然不是了,我们可以继续向上级联查找基类,这样,可以很容易的发现QWidget中有需要的属性: class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice { ... Q_PROPERTY(QSize minimumSize READ minimumSize WRITE setMinimumSize) Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize) ... }; 实例 通过以上的分析,我们可以很快的用QSS构建属于自己的样式了。 效果 QSS 下面,主要介绍qproperty-语法,其它样式可以忽略。 QLabel#customLabel { qproperty-minimumSize: 100px 100px; qproperty-maximumSize: 100px 100px; qproperty-pixmap: url(:/Images/logo); qproperty-scaledContents: true; } QPushButton#customButton { qproperty-text: "

STM32 软件按键消抖

###引言 通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图1所示。 ![抖动](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcxMTIxMTgwOTI3MTgy?x-oss-process=image/format,png) 图1 ###分析 按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按的话能达到 40-50ms 左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在 10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。 ###方法一 在绝大多数情况下,我们是用软件即程序来实现消抖的。最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。实际应用中,这种做法局限性大(实时性差)。 ###方法二 启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的阶段,而非处于抖动的阶段,如下图2所示。 ![抖动过程](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcxMTIxMTgwODE1MDE1?x-oss-process=image/format,png) 图2 ###代码片 //外部中断触发(下降沿) void EXTI15_10_IRQHandler(void) { if ( RESET != EXTI_GetFlagStatus( EXTI_Line5 ) ) { static u32 lasttime = 0; if( (g_tickCount - lasttime) > 100 ) { TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); lasttime = g_tickCount; } EXTI_ClearITPendingBit( EXTI_Line5 ); } } /* Tim2 部分中断服务函数 */ void TIM2_IRQHandler(void)//250us { if(TIM_GetITStatus(TIM2, TIM_IT_Update) !

STM32F407 Flash操作笔记

简述 STM32F4XX的闪存擦除方式分为两种:扇区擦除(最小单元16K)和整片擦除。在实际应用中,为满足重要信息的存储,需将信息存入FLASH中,针对以上两种擦除方式,扇区擦除更符合实际的需要。 参考手册: 写FLASH操作 经过以上五个步,就可以擦除某个扇区。但是实际运用过程中,一个扇区只存储一个信息或标志,会造成资源严重浪费。现采用缓存的方式,先读取当下扇区的数据,将读取的数据和要写入的数据组合,待擦除后再次写入。 代码片 写FLASH操作 /* * WriteAddr: 起始地址 (u32)address 是 4 的整数倍, (u32)data * pBuffer: 数据指针 * NumToWrite:字(u32)数 */ void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite) { FLASH_Status status = FLASH_COMPLETE; u32 addrx=0; u32 endaddr=0; if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return; //非法地址 FLASH_Unlock();//解锁 FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存 addrx=WriteAddr; //写入起始地址 endaddr=WriteAddr+NumToWrite*4; //写入结束地址 if(addrx<0X1FFF0000) //是否为主存储区 { while(addrx<endaddr) //对非0XFFFF FFFF 的地方,先擦除 { if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//对非0XFFFF FFFF 的地方,先擦除 { status=FLASH_EraseSector(GetSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!! if(status!=FLASH_COMPLETE)break; //异常 }else addrx+=4; } } if(status==FLASH_COMPLETE) { while(WriteAddr<endaddr)//写数据 { if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据 { break; //写入异常 } WriteAddr+=4; pBuffer++; } } FLASH_DataCacheCmd(ENABLE);//FLASH擦除结束,开启数据缓存 FLASH_Lock();//上锁 Printf("

随机数环设想

序 突然脑袋发热的一个设想,如果是想单纯生成不重复随机数的,请出门左转有个更好的算法(用数组下标位随机,随机到的下标位对应数据扔到最后位置),什么?你要生成的随机数范围很大,浪费空间?来来来,坐下喝茶。 基本思路: 定义一个位长度大于bitNum的数组位环(使用位运算)每次取的随机数要先去数组对应下标位中判断下标位的数是否为0,若为0则直接返回 并把这个位置置1,如果是1,则寻找1前面的那个位,如果找了一定的数量destoryLen都是1那么将该随机数返回,环终结个数+1,数组元素全部置0,将新数组该随机下标位 置1。 代码实现: import java.util.concurrent.ThreadLocalRandom; /** * Created by Kowalski on 2017/1/22. * */ public class RandomIdWorker { /**位运算数组*/ private static final int[] arr_32 = { 0x80000000,0x40000000,0x20000000,0x10000000, 0x08000000,0x04000000,0x02000000,0x01000000, 0x00800000,0x00400000,0x00200000,0x00100000, 0x00080000,0x00040000,0x00020000,0x00010000, 0x00008000,0x00004000,0x00002000,0x00001000, 0x00000800,0x00000400,0x00000200,0x00000100, 0x00000080,0x00000040,0x00000020,0x00000010, 0x00000008,0x00000004,0x00000002,0x00000001, }; /**随机数最大值*/ private static int bitNum; /**随机数长度*/ private static int circleLenNum; /**当前圈数*/ private static int circleNum; /**圈最大值*/ private static int maxCircleNum; /**摧毁圈长度*/ private static int destoryLen; /**环数组*/ private static int[] arr; /**随机数*/ private static ThreadLocalRandom random = ThreadLocalRandom.

Notepad++ 64位 Jsonviewer Compareplugin 安装

Notepad++ 是一款轻量级,非常好用的编辑工具,但是64位的各种功能插件需要手动添加(包括Plugin Manager), 可是往往找到的都是32位的插件,64位不能使用。我就是安装的64位,为了安装 Jsonviewer 和 compare 插件,大费周章,为了造福后人,现把方法和插件一并提供给需要的朋友: 方法一:鉴于64位的插件很难找,那就安装32位的吧;32位的插件可以通过 Plugins-->Plugin Manager-->Show Plugin Manager-->Available 选择你需要安装的插件,确定之后 会自动帮你下载安装相关插件,然后重启Notepad++, 即可在Plugins中看到安装的新插件。 方法二:如果你依然坚持使用64位,那么你只能手动安装需要的插件,我只安装了JSonviewer 和Compare。 1. 下载安装 Notepad++: https://notepad-plus.en.softonic.com/; 2. 下载Jsonviewer:Jsonviewer 3. 下载Compare plugin:compare 4. 找到Notepadd++ 的安装路径:Notepad++/plugins, 将下载到的插件解压,复制 .dll 文件到 这里; 5. 重新启动Notepad++。 如果有帮助,请点赞,好评。

Python爬虫实战--爬取网络小说并存放至txt文件

目录 前言 小说爬虫基本流程 一.网站类型(1) 二.网站类型(2) 前言 本教程再次更新,希望做成一个完整系列。 读者阅读完毕便可以基本掌握爬取网络小说的步骤与方法。 实践出真知,真正的学会是使用教程中的方法去爬取一个全新的网站。 【在学习的过程中千万不要先完整的学习第三方扩展包教程,例如我先把beautifulsoup教程里的所有函数操作都熟练背诵下来。这样只会浪费你的时间,因为你一段时间不使用便会忘掉。我的建议是你可以大概浏览一下每个库里的常用函数,知道每个库都可以用来做什么,然后真正实战时再进行查阅即可~】 最后,希望大家可以学会爬虫,热爱爬虫。 如果您感到有所收获,希望给我点赞,或者评论区留言,谢谢! 小说爬虫基本流程 爬取网页:urllib,requests等 解析网页:beautifulsoup4,lxml等 之前我在写爬虫时在爬取独立网页时都是urllib和requests混合着使用,不过如今真的强烈推荐requests! 如果你想搞清楚urllib、urllib3、requests谁更加优秀,可以移步该讨论区stackoverflow-讨论区 一.网站类型(1) 从乐文小说网站上爬取小说相见欢,并存放至txt文件中 URL: 相见欢 (一)介绍 该类网站为静态网站。 特点:(1)章节目录直接加载所有章节内容【如下图所示】 (2)章节链接暴露在html中(非动态js加载) (3)章节内容静态加载(如下图所示) (二)爬取教程 首先,我们引入我们需要的库文件 import re import requests from bs4 import BeautifulSoup from tqdm import trange import time 接下来,我们进行爬虫伪装(伪装报头) (该网站没有反爬虫机制,可以选择跳过) #头部伪装 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE' } 我们从爬取单章开始,首先我们进入第一张的网址相见欢-第一章 url = "http://www.lewendu8.com/books/21/21335/6381842.html" req = requests.get(url,headers=headers) req.

屏幕自适应的values-sw720dp的疑问

屏幕自适应。 项目中有几个页面的就涉及到不同屏幕的布局和尺寸值不同。 我们是这样做的 --res --values --dimens.xml --values-sw720dp --dimens.xml --values-sw600dp --dimens.xml 每种屏幕对应的控件长宽、padding、margin都是一套值 现在遇到这么一个情况: 在1024*600的7寸屏的联想的pad上跑,sw600dp效果能显示出来;但是在我的小米2s 1280*720,4.3寸屏幕上运行,它用的不是sw720p的尺寸,而是default下的值; 结论: 最小宽度的单位是dp,小米2S的分辨率是 1280*720,单位是像素,2S的dpi是320,根据px、dp换算公式 px = dp * (dpi/ 160),得2S实际最小宽度是360dp ,所以没有适配到sw720dp

python3 学习笔记 多进程 multiprocessing 模块

多进程 Multiprocessing 模块 multiprocessing 模块官方说明文档 Process 类 Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。 star() 方法启动进程,join() 方法实现进程间的同步,等待所有进程退出。close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。 multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) target 是函数名字,需要调用的函数args 函数需要的参数,以 tuple 的形式传入 示例: import multiprocessing import os def run_proc(name): print('Child process {0} {1} Running '.format(name, os.getpid())) if __name__ == '__main__': print('Parent process {0} is Running'.format(os.getpid())) for i in range(5): p = multiprocessing.Process(target=run_proc, args=(str(i),)) print('process start') p.start() p.join() print('Process close') 结果: Parent process 809 is Running process start process start process start process start process start Child process 0 810 Running Child process 1 811 Running Child process 2 812 Running Child process 3 813 Running Child process 4 814 Running Process close Pool Pool 可以提供指定数量的进程供用户使用,默认是 CPU 核数。当有新的请求提交到 Poll 的时候,如果池子没有满,会创建一个进程来执行,否则就会让该请求等待。 - Pool 对象调用 join 方法会等待所有的子进程执行完毕 - 调用 join 方法之前,必须调用 close - 调用 close 之后就不能继续添加新的 Process 了

java.lang.NoClassDefFoundError: org/apache/commons/collections/map/MultiKeyMap

我在下载Json相关的jar后,结合tomcat服务器运行一直报这个异常找不到相关的类,我又从网上下载了好几个版本,都是无法解决,还是一样报同样异常。当时没有想到tomcat的lib目录下已经有一个commons-collections4-4.1.jar更高的版本包了。而我工程里libs目录又是另一个版本的commons-collections.jar包导致两个版本不同。tomcat运行时就会去commons-collections4-4.1.jar找,结果找不到相关的类。将commons-collections.jar复制到tomcat的lib目录下,解决问题。

改写jtopo滚轮缩放代码

问题 原生的jtopo滚轮缩放在mac上用触控板触发时,会出现疯狂缩放的现象,同时还会触发浏览器的默认事件(页面前进、页面后退) 参考 地址:https://adom.as/javascript-mouse-wheel/ /** This is high-level function. * It must react to delta being more/less than zero. */ function handle(delta) { if (delta < 0) …; else …; } /** Event handler for mouse wheel event. */ function wheel(event){ var delta = 0; if (!event) /* For IE. */ event = window.event; if (event.wheelDelta) { /* IE/Opera. */ delta = event.wheelDelta/120; } else if (event.detail) { /** Mozilla case.

输入输出隔离的半/全双工RS-485/RS-422接口隔离芯片电路

原文来自与博客园的vonly先生,原文链接:点击打开链接 RS-485标准是一种常见的总线架构,其通用性及远距离传输能力使其广泛应用于各种通信接口电路。在多数情况下,由于应用环境的恶劣,需要对RS-485接口采用隔离方案以防止出现接地环路。 对RS-485接口的隔离方案有很多,老式的光耦隔离电路由于占用空间、体积太大,需要分立元件、缓存驱动及电路设计繁琐,已经不适合应用于当今要求越来越严格的高速数字通信系统。因此,我们可以采用ADI公司的iCoupler磁隔离解决方案,它能够提供多通道数字隔离、集成RS-485收发器的数字隔离、集成isoPower磁隔离电源的数字隔离等多种灵活的隔离方案。在体积、功耗、速率等众多方面提供优于光耦的解决方案。 在这里,我们了解一下目前最简单,集成度最高的RS-485接口隔离方案。本方案采用隔离型RS-485收发器ADM2582E/ADM2587E,以单芯片实现完全的半/全双工RS-485接口隔离。ADM2582E/ADM2587E集成isoPower磁隔离电源,无需外部隔离电源供电。在单芯片封装内还集成了数字隔离通道和RS-485收发器,与传统光耦隔离电路相比,PCB面积缩小84%,元器件数减少83%。 ADM2582E/ADM2587E是具备±15 kV ESD保护功能的完全集成式隔离数据收发器,适合用于多点传输线路上的高速通信应用。其内部集成的RS-485驱动器带有一个高电平有效使能电路,并且还 提供一个高电平接收机有效禁用电路,可使接收机输出进入高阻抗状态。该器件具备限流和过热关断特性,能够防止输出短路,并防止出现由于总线争用而引起功耗 过大的情况。 图1、ADM2582E/ADM2587E功能框图 根据ADM2582E/ADM2587E的功能框图,我们可以看出其内部含有isoPower技术,具有反馈控制的高频开关稳压电路。 对于TxD、RxD、DE和RE均采用iCoupler磁隔离技术对其数字信号进行隔离。此外,还包含一个能够实现半/全双工的RS-485/RS- 422收发器。以单芯片实现了能适应各种需求的RS-485/RS-422接口隔离方案,其芯片封装仅为SOIC-20。 ADM2582E/ADM2587E通过简单的外部电路连接即可实现接口隔离功能,下面以ADM2587E为例,来实现半双工和全双工的RS-485/RS-422接口隔离。 半双工隔离ADM2587E带有RE/DE使能控制引脚,能够支持半双工应用,其应用电路图如下: 图2、ADM2587E用于半双工RS-485/RS-422接口隔离 由于ADM2587E后端有A、B、Y、Z四路输出,当用作半双工电路时,需要将A和Y连接,作为半双工的A信号线,将B和Z连接,作 为半双工的B信号线。两个VCC引脚的输入端和GND1引脚之间接有0.01uF、10uF及2个0.1uF电容,这些电容是必要的,能够去耦及滤波,保 证输入电源的平稳。 同样,Visoin与GND2引脚之间的0.1uF和0.01uF电容,Visoout和GND2引脚之间的0.1uF和10uF电容都是芯片工作所需要 的。在ADM2587E的总线输出侧的Visoin引脚和Visoout引脚必须连接在一起,从图1的功能框图中我们可以看到,Visoout引脚是 ADM2587E内部隔离电源的输出引脚,而Visoin引脚是内部集成RS-485/RS-422收发器的电源输入引脚。 全双工隔离ADM2587E的全双工隔离电路非常简单,将逻辑侧引脚与控制芯片连接,总线侧引脚与总线相接即可。其应用电路图如下: 图3、ADM2587E用于全双工RS-485/RS-422接口隔离 ADM2587E的全双工隔离电路与半双工隔离电路类似,其后端的A、B、Y、Z直接与全双工总线相连即可。 结语 ADM2582E/ADM2587E均可采用3.3V或5V供电,能够方便的与普通5V供电系统和低功耗的3.3V供电系统连接。A、 B、Y、Z引脚上带有±15KV的ESD保护及25KV/us的共模抑制能力,能够为芯片引脚提供大部分的保护功能,在恶劣的应用环境中,可以在总线上添 加TVS管等器件以增强芯片对大的浪涌电流、电压的防护能力。 总的来说,ADM2582E/ADM2587E集成度高,外围电路简单,整体性能稳定,非常适合于工业、电力等恶劣通信环境中的RS- 485/RS-422接口隔离应用。

virtualenv 创建虚拟环境报错ImportError: No module named 'pkg_resources'

aaa@dockerserver:$ virtualenv -p /usr/bin/python2 env Traceback (most recent call last): File "/usr/bin/virtualenv", line 5, in <module> from pkg_resources import load_entry_point ImportError: No module named 'pkg_resources' 解决方法: 卸载virtualenv,重新安装 aptitude show virtualenv#显示已安装软件信息 dpkg -L virtualenv#查看安装位置 sudo pip uninstall virtualenv pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ virtualenv aaa@dockerserver:~$ virtualenv env #报错 bash: /usr/bin/virtualenv: 没有那个文件或目录 将virtualenv安装路径添加到系统路径 #得到安装位置 pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ virtualenv aaa@dockerserver:~$ virtualenv env Requirement already satisfied: virtualenv in /usr/local/lib/python2.7/dist-packages #将安装位置添加到系统路径: cd ~ sudo vi .

windows7上安装WebSphere Application Server BASE V8.5

第一步,下载安装包 登录IBM官网下载WebSphere Application Server Base版本, 点击上图框中按钮,在弹出的窗口中选择第一项,点击“下载”选项,进入到下图页面 填写相关数据后点击“我确认”,进入下载页面,选择“使用HTTP下载”,然后在下列选项中选择对应操作系统版本下载。 第二步,安装 将下载到的压缩包解压,得到如下图目录, 以管理员身份运行install.exe,然后安装,过程耗时较久,请耐心等待 除了默认勾选的项以外,还需要勾选下载jdk7,因为到2018年4月以后WAS就不支持对jdk6的更新了,记得安装完成将修改默认jdk为jdk7版本的。 接下来的安装过程就是正常执行,遇到需要勾选的就保持默认勾选项就OK了。 当出现上图窗口时,就表示已安装成功了,至此结束安装流程。

原生js实现视差滚动效果(类似D3官网的效果),兼容IE

js视差效果 1.思路: 鼠标在图片上上下左右滑动时,让图片整体转动,转动方向与鼠标移动的方向相同,转动角度大小正相关于鼠标离开图像中心点的水平或垂直距离,图片转动可以用css3的: transform:rotateX() rotateY(); 实现,剩下的是求鼠标的位置图片中心点的距离差,鼠标位置为: e.clientX; e.clientY //鼠标相对于屏幕可视区域的位置(不包括滚动条) 对于图片中心点可以先求图片左上角相对于屏幕的位置坐标,加上图片宽高的一半即可求得。 2.求一个元素左上角相对于屏幕的位置 //获取元素相对于屏幕绝对位置 function getAbsPosition(element){ var abs={x:0,y:0} //如果浏览器兼容此方法 if (document.documentElement.getBoundingClientRect){ //注意,getBoundingClientRect()是jQuery对象的方法 //如果不用jQuery对象,可以使用else分支。 abs.x = element.getBoundingClientRect().left; abs.y = element.getBoundingClientRect().top; abs.x += window.screenLeft + document.documentElement.scrollLeft - document.documentElement.clientLeft; abs.y += window.screenTop + document.documentElement.scrollTop - document.documentElement.clientTop; } //如果浏览器不兼容此方法 else{ while(element!=document.body){ abs.x+=element.offsetLeft; abs.y+=element.offsetTop; element=element.offsetParent; } //计算想对位置 abs.x += window.screenLeft + document.body.clientLeft - document.body.scrollLeft; abs.y += window.screenTop + document.body.clientTop - document.body.scrollTop; } return abs; } 此方法循环累加位置坐标,直到父元素为根元素。

【区块链】区块链的诗和远方

人工智能赛博物理操作系统 AI-CPS OS “人工智能赛博物理操作系统”(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能)分支用来的今天,企业领导者必须了解如何将“技术”全面渗入整个公司、产品等“商业”场景中,利用AI-CPS OS形成数字化+智能化力量,实现行业的重新布局、企业的重新构建和自我的焕然新生。 AI-CPS OS的真正价值并不来自构成技术或功能,而是要以一种传递独特竞争优势的方式将自动化+信息化、智造+产品+服务和数据+分析一体化,这种整合方式能够释放新的业务和运营模式。如果不能实现跨功能的更大规模融合,没有颠覆现状的意愿,这些将不可能实现。 领导者无法依靠某种单一战略方法来应对多维度的数字化变革。面对新一代技术+商业操作系统AI-CPS OS颠覆性的数字化+智能化力量,领导者必须在行业、企业与个人这三个层面都保持领先地位: 重新行业布局:你的世界观要怎样改变才算足够?你必须对行业典范进行怎样的反思? 重新构建企业:你的企业需要做出什么样的变化?你准备如何重新定义你的公司? 重新打造自己:你需要成为怎样的人?要重塑自己并在数字化+智能化时代保有领先地位,你必须如何去做? AI-CPS OS是数字化智能化创新平台,设计思路是将大数据、物联网、区块链和人工智能等无缝整合在云端,可以帮助企业将创新成果融入自身业务体系,实现各个前沿技术在云端的优势协同。AI-CPS OS形成的数字化+智能化力量与行业、企业及个人三个层面的交叉,形成了领导力模式,使数字化融入到领导者所在企业与领导方式的核心位置: 精细:这种力量能够使人在更加真实、细致的层面观察与感知现实世界和数字化世界正在发生的一切,进而理解和更加精细地进行产品个性化控制、微观业务场景事件和结果控制。 智能:模型随着时间(数据)的变化而变化,整个系统就具备了智能(自学习)的能力。 高效:企业需要建立实时或者准实时的数据采集传输、模型预测和响应决策能力,这样智能就从批量性、阶段性的行为变成一个可以实时触达的行为。 不确定性:数字化变更颠覆和改变了领导者曾经仰仗的思维方式、结构和实践经验,其结果就是形成了复合不确定性这种颠覆性力量。主要的不确定性蕴含于三个领域:技术、文化、制度。 边界模糊:数字世界与现实世界的不断融合成CPS不仅让人们所知行业的核心产品、经济学定理和可能性都产生了变化,还模糊了不同行业间的界限。这种效应正在向生态系统、企业、客户、产品快速蔓延。 AI-CPS OS形成的数字化+智能化力量通过三个方式激发经济增长: 创造虚拟劳动力,承担需要适应性和敏捷性的复杂任务,即“智能自动化”,以区别于传统的自动化解决方案; 对现有劳动力和实物资产进行有利的补充和提升,提高资本效率; 人工智能的普及,将推动多行业的相关创新,开辟崭新的经济增长空间。 给决策制定者和商业领袖的建议: 超越自动化,开启新创新模式:利用具有自主学习和自我控制能力的动态机器智能,为企业创造新商机; 迎接新一代信息技术,迎接人工智能:无缝整合人类智慧与机器智能,重新 评估未来的知识和技能类型; 制定道德规范:切实为人工智能生态系统制定道德准则,并在智能机器的开 发过程中确定更加明晰的标准和最佳实践; 重视再分配效应:对人工智能可能带来的冲击做好准备,制定战略帮助面临 较高失业风险的人群; 开发数字化+智能化企业所需新能力:员工团队需要积极掌握判断、沟通及想象力和创造力等人类所特有的重要能力。对于中国企业来说,创造兼具包容性和多样性的文化也非常重要。 子曰:“君子和而不同,小人同而不和。” 《论语·子路》云计算、大数据、物联网、区块链和 人工智能,像君子一般融合,一起体现科技就是生产力。 如果说上一次哥伦布地理大发现,拓展的是人类的物理空间。那么这一次地理大发现,拓展的就是人们的数字空间。在数学空间,建立新的商业文明,从而发现新的创富模式,为人类社会带来新的财富空间。云计算,大数据、物联网和区块链,是进入这个数字空间的船,而人工智能就是那船上的帆,哥伦布之帆! 新一代技术+商业的人工智能赛博物理操作系统AI-CPS OS作为新一轮产业变革的核心驱动力,将进一步释放历次科技革命和产业变革积蓄的巨大能量,并创造新的强大引擎。重构生产、分配、交换、消费等经济活动各环节,形成从宏观到微观各领域的智能化新需求,催生新技术、新产品、新产业、新业态、新模式。引发经济结构重大变革,深刻改变人类生产生活方式和思维模式,实现社会生产力的整体跃升。 产业智能官 AI-CPS 用“人工智能赛博物理操作系统”(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能),在场景中构建状态感知-实时分析-自主决策-精准执行-学习提升的认知计算和机器智能;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链。 长按上方二维码关注微信公众号: AI-CPS,更多信息回复: 新技术:“云计算”、“大数据”、“物联网”、“区块链”、“人工智能”;新产业:“智能制造”、“智能农业”、“智能金融”、“智能零售”、“智能城市”、“智能驾驶”;新模式:“财富空间”、“特色小镇”、“赛博物理”、“供应链金融”。 点击“阅读原文”,访问AI-CPS OS官网 本文系“产业智能官”(公众号ID:AI-CPS)收集整理,转载请注明出处! 版权声明:由产业智能官(公众号ID:AI-CPS)推荐的文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,与您共同协商解决。联系、投稿邮箱:erp_vip@hotmail.com

ViewHolder的使用

使用listView的时候,通过ViewHolder进行缓存可以提升性能 JavaBean,创建了News对象的几个参数title,detail,comment,imageUrl package com.ldw.newsView.domain; public class News { private String title; private String detail; private String comment; private String iamgeUrl; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getIamgeUrl() { return iamgeUrl; } public void setIamgeUrl(String iamgeUrl) { this.

京东金融上线人工智能解决方案“京东超脑”,重庆市建立国际大数据产业学院 | 大数据24小时

京东金融上线人工智能解决方案“京东超脑”;高德地图与德尔福就大数据、智能驾驶能达成战略合作;专注为中小企业提供贷款服务,金融科技公司Lendingkart获2500万美元融资……以下为您奉上更多大数据热点事件。 编辑 | Abby 官网 | www.datayuan.cn 微信公众号ID | datayuancn 一、京东金融上线人工智能解决方案“京东超脑” 据媒体报道称,京东金融正式对外宣布,其人工智能技术解决方案“京东超脑”将于近日上线。据介绍,该产品的核心技术主要包括人脸识别、虹膜识别、深度学习、图像处理和自然语言等,可基于深度学习平台应用算法,对指定的人物照片进行提取、识别人脸特征、人脸检测、聚类、美颜等。目前,“京东超脑”的人脸识别技术已经被应用到了多个场景中,其中京东无人车则实现了刷脸取件。 二、高德地图与德尔福就大数据、智能驾驶能达成战略合作 高德地图日前对外宣布称,公司已经与德尔福汽车公司正式签订的战略合作协议。据悉,未来双方将在大数据、导航、智能驾驶等领域达成深度合作。届时,德尔福将基于高德的实时交通信息和基于位置的在线地图,在其信息娱乐系统和导航系统中提供路线规划服务和在线兴趣点搜索服务。此外,双方还将基于自动驾驶地图数据,以及相关软件能力和云计算能力,共同为中国市场提供基于云端的自动驾驶服务。 三、专注为中小企业提供贷款服务,金融科技公司Lendingkart获2500万美元融资 日前,总部位于印度的金融科技公司Lendingkart对外宣布,公司继今年6月获得770万美元债权融资之后,又于近日完成了新一轮的2500万美元融资,投资方为IFMR Capital, Capital First, Tata Capital Financial Services (TCFSl) 以及 Manappuram Finance。资料显示,Lendingkart成立于2014年,是一家在线金融机构,专门从事为中小企业进行贷款业务,主要以数据为导向,通过数据算法进行筛选,从而决定公司信用及额度。 四、图像识别科技公司“爱华盈通”获数千万元融资 成立于今年4月的“爱华盈通”是一家专注为B端客户提供图像识别方案的科技公司。致力于基于人脸识别、文档内容搜索、OCR三大技术,面向移动应用市场,为其提供移动终端应用产品。近日,该公司宣布刚刚完成了新一轮的A轮融资,融资金额达数千万元人民币,投资方信息尚未透露。据悉,此轮所获融资将主要用于产品研发及市场推广方面。 五、重庆市宣布建立国际大数据产业学院 近日,重庆仙桃国际数据谷产业园与重庆工程学院宣布正式达成了战略合作关系,根据签订的协议显示,双方将共同建立重庆仙桃国际大数据产业学院。届时该学院成立之后,将依托于仙桃数据谷的技术优势,为当地输送更多的大数据产业应用型、技术技能型人才。此外,还将为重庆工程学院相关专业的学生提供实训实践平台。 六、高考大数据平台“旭德教育”申请挂牌新三板 成立于2013年的“旭德教育”总部位于重庆,是一家教育咨询创企,其拥有的高考大数据平台致力于对考生高考的成绩、职业兴趣、生涯规划,加分情况等进行数据挖掘与分析,从而为其提供个性化高考志愿填报方案。日前,该公司正式向新三板提交申请,拟挂牌上市,其申请挂牌的主办券商为中泰证券。 更多“大数据24小时”,可加作者Abby微信:wmh4178(请注明姓名、公司)交流。 更多精彩内容 (点击关键词查看) · 观 点 · 阿里金融云徐敏 | 达观数据陈运文 易日升史建伟 | 易宝支付余晨 诸葛io于晓松 | 91征信薛本川 聚信立甘建铃 | 天创信用张宇 安华金和杨海峰 | 东方金信王伟哲 · 案 例 · 光大银行:风险一体化项目实施 中国人民银行反洗钱监测分析二代系统 大数据综合分析平台 ——海量数据复杂分析处理

Vue key的作用

1、v-if中用 key 管理可复用的元素 Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做,除了使 Vue 变得非常快之外,还有一些有用的好处。例如,如果你允许用户在不同的登录方式之间切换: <template v-if="loginType === 'username'"> <label>Username</label> <input placeholder="Enter your username"> </template> <template v-else> <label>Email</label> <input placeholder="Enter your email address"> </template> 那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模版使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder。 这样也不总是符合实际需求,所以 Vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可: <template v-if="loginType === 'username'"> <label>Username</label> <input placeholder="Enter your username" key="username-input"> </template> <template v-else> <label>Email</label> <input placeholder="Enter your email address" key="email-input"> </template> 现在,每次切换时,输入框都将被重新渲染。注意, <label> 元素仍然会被高效地复用,因为它们没有添加 key 属性 2、v-for中的key 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略。如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。这个类似 Vue 1.

Mac Python3安装MySQL问题记录

Mac如何安装MySQL: 去MySQL官网下载最新的MySQL社区版https://dev.mysql.com/downloads/mysql/ 不断下一步,直到安装成功,在【系统偏好设置】中找到【MySQL】,进入后点击【Start MySQL Server】开启MySQL服务 提示-bash: mysql: command not found的解决方法: vim ~/.bashrc 在文件末尾加入: alias mysql=/usr/local/mysql/bin/mysql alias mysqladmin=/usr/local/mysql/bin/mysqladmin 执行命令: vim ~/.bash_profile 在文件末尾加入: source ~/.bash_profile 重启终端即可 pip安装mysqlclient失败(mysql_config not found)的解决方法 报错信息: WodeMacBook-Pro:~ macbook$ pip3 install mysqlclient Collecting mysqlclient Using cached mysqlclient-1.3.12.tar.gz Complete output from command python setup.py egg_info: /bin/sh: mysql_config: command not found Traceback (most recent call last): File "<string>", line 1, in <module> File "/private/var/folders/42/nrhy_y6s3sd_ykgm16lpbcjm0000gn/T/pip-build-m7lqcyxa/mysqlclient/setup.py", line 17, in <module> metadata, options = get_config() File "

shell 将相同字母后面的数字相加在一起

shell 将相同字母后面的数字相加在一起 假如现在有个文本,格式如下: a 1 b 3 c 2 d 7 b 5 a 3 g 2 f 6 d 9 即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为: a 4 b 8 c 2 d 16 f 6 g 2 即将相同的字母后面的数字加在一起,按字母的顺序输出。 ... 假如现在有个文本,格式如下: a 1 b 3 c 2 d 7 b 5 a 3 g 2 f 6 d 9 即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为: a 4 b 8 c 2 d 16 f 6 g 2 即将相同的字母后面的数字加在一起,按字母的顺序输出。

Linux shuf --随机选择器

 Linux shuf --随机选择器 转载 2016年04月08日 10:56:50 http://blog.csdn.net/mosesmo1989/article/details/51094605 标签:linux /shell / 2106

常见的Python 2 和 3 差别

Python2.7 print "hello" hello Python3.0 print "hello" File "tmp.py", line 1 print "hello" ^ SyntaxError: invalid syntax 正确应为: Python3.0 print("hello") hello Python2.7 print 1 / 2 0 Python3.0 print(1 / 2) 0.5 Python2.7 print {}.keys() [] Python3.0 print({}.keys()) <dict_keys object at 0x385f50> Python2.7 print None < None False Python3.0 print(None < None) Traceback (most recent call last): File "tmp.py", line 1, in <module> print(None < None) TypeError: unorderable types: NoneType() < NoneType() Python2.

convertToRinex.exe 程序错误

错误信息如下: D:\programs\Trimble\convertToRINEX>convertToRinex.exe -? 未处理的异常: System.TypeInitializationException: “trimble.convertToRinex.Program”的类型初始值设定项引发异常。 ---> System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.Exception: 引发类型为“System.Exception”的异常。 在 Trimble.Geodetic.Antenna.Antenna.a() 在 Trimble.Geodetic.Antenna.Antenna..ctor(String name) 在 Trimble.Geodetic.Antenna.Antenna.CreateUnknownAntenna() 在 trimble.rinex.CrinexFile.getAntenna(Int32 antennaType) 在 trimble.rinex.CfileConversionInfo.get_antennaType() --- 内部异常堆栈跟踪的结尾 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 在 System.

webpack-hot-middleware 插件的使用

该文章以收录 《webpack探索之路》 前言 webpack-hot-middleware 是用来进行页面的热重载的,刷新浏览器 一般和 webpack-dev-middleware 配合使用,实现热加载功能,<!-- more --> 接下来我们使用webpack-hot-middleware 和 webpack-dev-middleware来实现像webpack-dev-server 一样的热加载功能。 webpack-hot-middleware的用法:传送门, github地址: https://github.com/glenjamin/webpack-hot-middleware 练习代码地址: (webpackHotMiddleware 文件夹,下载执行命令即可) https://github.com/webxiaoma/webpack-domes 使用方法 一、文件目录 二、安装 webpack, webpack-dev-middleware, webpack-hot-middleware, 三、文件内容 1.index.js var sub = require('./sub'); var app = document.createElement('div'); app.innerHTML = '<h1>Hello World h1</h1>'; app.appendChild(sub()); document.body.appendChild(app); 2.sub.js function generateText() { var element = document.createElement('h2'); element.innerHTML = "Hello h2 world h2"; return element; } module.exports = generateText; 3.webpack.config.js const path = require('path'); const HtmlwebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); //定义了一些文件夹的路径 const ROOT_PATH = path.

WebView match_parent wrap_content 无法显示,或显示特别小

问题描述 WebView设置了match_parent或 wrap_content无法显示,或显示特别小,原因可能是加载的url 或 内容,使得webview无法计算自身的大小。 例如:html的body的高度设置成了100%,以比例的形式设置的。 测试方法 加载一个其他公司的移动网站地址(如:http://m.baidu.com),测试webview的大小是否正常。 解决方法: 一、如果加载的网页是自己公司做的,可以提出修改网页以兼容移动端。 二、如果不能更改webview加载的内容,只能自己计算并手动设置 webview 的高度了

理解Python协程:从yield/send到yield from再到async/await

Python中的协程大概经历了如下三个阶段: 1. 最初的生成器变形yield/send 2. 引入@asyncio.coroutine和yield from 3. 在最近的Python3.5版本中引入async/await关键字 一、生成器变形yield/send 普通函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是一个生成器。 def mygen(alist): while len(alist) > 0: c = randint(0, len(alist)-1) yield alist.pop(c) a = ["aa","bb","cc"] c=mygen(a) print(c) 输出:<generator object mygen at 0x02E5BF00> 像上面代码中的c就是一个生成器。生成器就是一种迭代器,可以使用for进行迭代。生成器函数最大的特点是可以接受外部传入的一个变量,并根据变量内容计算结果后返回。 这一切都是靠生成器内部的send()函数实现的。 def gen(): value=0 while True: receive=yield value if receive=='e': break value = 'got: %s' % receive g=gen() print(g.send(None)) print(g.send('hello')) print(g.send(123456)) print(g.send('e')) 上面生成器函数中最关键也是最易理解错的,就是receive=yield value这句,如果对循环体的执行步骤理解错误,就会失之毫厘,差之千里。 其实receive=yield value包含了3个步骤: 1、向函数外抛出(返回)value 2、暂停(pause),等待next()或send()恢复 3、赋值receive=MockGetValue() 。 这个MockGetValue()是假想函数,用来接收send()发送进来的值 执行流程: 1、通过g.send(None)或者next(g)启动生成器函数,并执行到第一个yield语句结束的位置。这里是关键,很多人就是在这里搞糊涂的。运行receive=yield value语句时,我们按照开始说的拆开来看,实际程序只执行了1,2两步,程序返回了value值,并暂停(pause),并没有执行第3步给receive赋值。因此yield value会输出初始值0。这里要特别注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。 2、通过g.send('hello'),会传入hello,从上次暂停的位置继续执行,那么就是运行第3步,赋值给receive。然后计算出value的值,并回到while头部,遇到yield value,程序再次执行了1,2两步,程序返回了value值,并暂停(pause)。此时yield value会输出”got: hello”,并等待send()激活。

Python学习—matplotlib使用—plt.tick_params中which用法

原文: which : {‘major’, ‘minor’, ‘both’} Default is ‘major’; apply arguments to which ticks. which一共3个参数[‘major’ , ‘minor’ ,‘both’] 默认是major表示主刻度,后面分布为次刻度及主次刻度都显示. 参考用例: import matplotlib.pyplot as plt plt.scatter(2,4,s=200) #设置刻度标记的大小 plt.tick_params(axis='both',which='major',labelsize=14) plt.show() 官方文档:http://matplotlib.org/index.html

json与数据库

public class FragmentListView extends Fragment { private PullToRefreshListView refreshListView; private List<DataDataBean.ResultsBean> list = new ArrayList<>();//记录当前展示的所有数据 private ListViewAdapter listViewAdapter; private int page_num = 1; private ILoadingLayout startLabels; private JsonDao jsonDao; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_listview_layout,container,false); refreshListView = view.findViewById(R.id.refresh_list_view); return view; } /** * 使用数据库做一个数据的缓存 * @param savedInstanceState */ @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); jsonDao = new JsonDao(getContext()); //1.

【vue-router①】router-link跳转页面传递参数

在vue项目中,往往会遇到这样的情况,就是要实现在一个循环列表中,点击其中一条跳转到下个页面,然后将这一条的相关数据带到下个页面中显示,这是个循环列表,无论点哪一条都是跳到相同的页面,只是填的数据不一样,这个时候就需要实现跳转的时候一起把参数携带过去。 1、我在项目中想要点击v-for的<li>,然后跳到下个页面的表格,顺带将参数传递过去。如下图: 这里实现的是第一个组件跳转到第二个组件的时候将待办任务的id传递过去,第二个组件接收id后提交给后台请求列表的数据。实现如下: 第一个组件里: <template> <div class="template"> <!--待办任务--> <ul> <li v-for="(work_task,index) in tasks"> <!--使用v-bind动态绑定id传递给目标路径--> <router-link tag="a" :to="{path:'/workTaskEdit',query{id:work_task.id}}"> <div class="mui-navigate-right"> <span>{{index+1}}.</span> <span>{{work_task.title}}</span> <span> {{work_task.schedulel}}% </span> </div> </router-link> </li> </ul> </div> </template> 因为是根据每个li的不同id进行不同的传参,所以需要使用v-bind动态绑定to,然后将要传递的work_task.id重新命名为id存入query中一起传给目标组件里。 在目标组件里接收id,只需要在created()钩子中接收即可,实现如下: <script> export default { data() { return { } }, created() { this.id = this.$route.query.id;//获取上个页面传递的id,在下面获取数据的时候先提交id }, } </script> 这样就能接收id,进行相应操作了。 2、上面实现的是带一个参数,重点代码如下: <router-link tag="a" :to="{path:'/目标路径',query{id:work_task.id}}"></router-link> 同理,也可实现携带多个参数,用逗号隔开即可,如下: <router-link tag="a" :to="{path:'/目标路径',query{param1:当前param1, param2:当前param2, param3:当前param3, ...} }"> </router-link> 3、有时候,我们要传递一个数组,数组都是带着多个参数的,我们可以使用上面的写法,但是呢,当数组参数过多的时候,用上面的写法会显得太过于麻烦和累赘,就需要使用下面的方法。 比如用上面的例子,我不止传work_task的id,我要传整个work_task,里面就有id,title,schedulel等等许多参数,这时候的写法如下: <router-link tag="a" :to="{path:'/目标路径',query{arry:work_task}}"></router-link> 上面整体写法看起来是没区别的,但本质就差很多了,实际传的arry就是work_task这一整个数组的参数了,在下一个目标组件中接收基本也是一样的写法。

LaTex基本语法

【注】隔一段时间写blog的时候,LaTex的语法就基本忘干净了呀,,所以为了在下次忘记慌神之前,偷偷的翻开blog,,会不会很开心,,好记性不如烂笔头,,嗯呐,加油 提供一个可以写Latex的网页工具吧,狂戳LaTex工具 LaTex基本语法–学习整理 在讲基本的语法之前,首先介绍一下比较棘手的问题,行内和行间公式。 行内公式&&行间公式 $中间写内容$ //行内公式 $$中间写内容$$ //行间公式 如:$a^b =c$ $$\frac{3}{5}=0\dot6 如: ab=c , Ai,j=2i+j s=35=0.6 【注意】在编辑公式的时候一定要带上 $符啊,不然公式就不会直接显示哈 字体字号 注意区分大小写 点数(pt)相应中文字号控制命令25一号\Huge20二号\huge17三号\LARGE14四号\Large12小四号\large10五号\normalsize9小五号\small8六号\footnotesize7小六号\scriptsize5七号\tiny 举个例子:如选择四号字体 $\Large f(x)=a_b$ f(x)=ab 基本运算 加减乘除 一些基本的运算无外乎就是加减乘除,就先从这个着手写吧 加 +减 -乘 \times除 \div,\frac 如:$c=a+b$, $c=a-b$,$c=ab$, $c=a \div b$ 如: c=a+b , c=a−b , c=ab , c=a÷b 幂运算 a的n次幂:a^{n} a的1n次幂 :a^{\frac{1}{n}}根号a:\sqrt{a} a的1n次幂 :\sqrt[n]{a} 逻辑运算 或( ∨ ):\vee或\lor抑或( ⊕ ):\oplus与( ∧ ):\land或\wedge非(^):^ 其他 求和:\sum_{i=1}^{n} 连乘:\prod 极限:\lim 积分:\int 多重积分:\iint ∮: \oint $ f(x)=\sum_ {i=1}^{m}ab$,$\prod_{i=1}{n} a_i$ $\lim_{i\rightarrow +\infty}{a^i}$ f(x)=∑mi=1ab ∏ni=1ai limi→+∞ai f(x)=∫x2dx f(x)=∮xdx f(x)=∬xydxdy 二元运算符和关系运算符 各种等号、不等号 等于小于大于小于等于大于等于约等于不等于=<>\leq\geq\approx\not=不等相似近似恒等远大于远小于正比\neq\sim\simeq\equiv\gg\||\pro 关系符 ← :\leftarrow ⇒ :\Rightarrow ⇐ :\Leftarrow → :\rightarrow ⟺ :\Longleftrightarrow ⟷ :\longleftrightarrow 集合 符号 语法 符号 语法

mongodb日志分割

(1)新建一个js文件logRotate.js,加入如下命令: db.runCommand({logRotate:1}) (2)新建一个logRotate.bat文件,输入如下命令: E:\MongoDB-3.X\bin\mongo -authenticationDatabase admin localhost/admin "E:\MongoDB-3.X\logRotate.js" (3)在计划任务程序里面定期执行这个代码即可。

centos 安装mysql,更改初始密码

安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ # 下载mysql源安装包 shell> wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm # 安装mysql源 shell> yum localinstall mysql57-community-release-el7-8.noarch.rpm 检查mysql源是否安装成功 shell> yum repolist enabled | grep "mysql.*-community.*" 看到上图所示表示安装成功。 可以修改vim /etc/yum.repos.d/mysql-community.repo源,改变默认安装的mysql版本。比如要安装5.6版本,将5.7源的enabled=1改成enabled=0。然后再将5.6源的enabled=0改成enabled=1即可。改完之后的效果如下所示: 2、安装MySQL shell> yum install mysql-community-server 3、启动MySQL服务 shell> sudo systemctl start mysqld 查看MySQL的启动状态 shell> sudo systemctl status mysqld ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled) Active: active (running) since 五 2016-06-24 04:37:37 CST; 35min ago Main PID: 2888 (mysqld) CGroup: /system.

java代码实现身份证第18位的计算和验证身份证号码是否是真实有效.

一、身份证第18位(校验码)的计算方法 : 1、将前面的身份证号码17位数分别乘以不同的系数。 从第一位到第十七位的系数分别为: 7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 2、将这17位数字和系数相乘的结果相加。 3、用加出来和除以11,看余数是多少? 4、余数只可能有 0-1-2-3-4-5-6-7-8-9-10这11个数字。 其分别对应的最后一位身份证的号码为 1-0-X-9-8-7-6-5-4-3-2。 5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。 首先我们得出前17位的乘积和是189,然后用189除以11得出的结果是17+2/11,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的数字是x。所以,可以判定这是一个合格的身份证号码 package cn.java.example; public class TestCard { private static int[] w = {7,9,10,5,8,4,2,1,6, 3,7,9,10,5,8,4,2}; private static String id = "34052419800101001X"; public static void main(String[] args) { System.out.println(isCard(id)); } public static boolean isCard(String id) { char[] c=id.toCharArray(); int sum=0; for (int i = 0; i < w.length; i++) { sum+=(c[i]-'0')*w[i]; } System.out.println(sum); char[] verifyCode="10X98765432".toCharArray(); char ch =verifyCode[sum%11]; System.

Kotlin Parameter specified as non-null is null

报错信息如下: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter animation at cn.enjoytoday.expandmateriallayout.ExpandRefreshLayout$mRefreshListener$1.onAnimationEnd(ExpandRefreshLayout.kt:0) at cn.enjoytoday.expandmateriallayout.ExpandRefreshLayout$HeadViewContainer.onAnimationEnd(ExpandRefreshLayout.kt:1099) at android.view.ViewGroup.finishAnimatingView(ViewGroup.java:6293) at android.view.View.draw(View.java:17180) ...... kotlin 中对于回调对象若是为说明可以为空的情况下,kotlin 会自动对齐对象进行非空检查,就会报出如上错误,检查代码发现是设置接口的参数和创建的接口的回调参数的类型设置不一致,如下: //创建的接口: private animationListener = object: Animation.AnimationListener { override fun onAnimationStart(animation:Animation) { ...... } override fun onAnimationRepeat(animation:Animation) {} override fun onAnimationEnd(animation:Animation) { log(message = "onAnimationEnd") ...... } } //监听的类的声明 class CustomLayout(context:Context):LinearLayout(context){ private var listener: Animation.AnimationListener? = null fun setAnimationListener(listener: Animation.AnimationListener?) { this.listener = listener } public override fun onAnimationStart() { super.

nodejs作为前后端分离中间件的跨域解决方案

前后端分离时候SEO问题很头疼,上次提供了nuxt+axios解决服务端渲染问题的解决方案,其实nodejs一样可以做服务端渲染,这时候会产生ajax跨域问题,本文旨在nodejs中跨域问题 其实很简单,像其他的服务端程序一样,在http请求中处理下头信息即可。app.js中添加以下代码: app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1') if(req.method=="OPTIONS") res.send(200);/*让options请求快速返回*/ else next(); }); ​

面试必问50题

点击上面蓝字关注的都是靓仔仙女 什么是线程局部变量?(答案) 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。 2.用 wait-notify 写一段代码来解决生产者-消费者问题?(答案) 请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件。 3. 用 Java 写一个线程安全的单例模式(Singleton)?(答案) 请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类。当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java 中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。 4.Java 中 sleep 方法和 wait 方法的区别?(答案) 虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。 5.什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?(答案) 不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。详情参见答案,一步一步指导你在 Java 中创建一个不可变的类。 6.我们能创建一个包含可变对象的不可变对象吗? 是的,我们是可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。 数据类型和 Java 基础面试问题 7.Java 中应该使用什么数据类型来代表价格?(答案) 如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。 8.怎么将 byte 转换为 String?(答案) 可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。 9.Java 中怎样将 bytes 转换为 long 类型? 这个问题你来回答 :-)