开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

ClassLoader和双亲委派机制

前言:网上关于类加载器讲解的文章特别多,在学习的时候让我受益匪浅,某段时间觉得自己懂了。但是在昨天遇到一个问题,并去看Spark关于用户类加载的时候,它实现的类加载器让我看的很疑惑,半天没有转过来。我才发现自己原来根本不懂类加载器的原理,对双亲委派机制只是停留在字面上,知道会先找父但是不知道怎么去找的,所以今天把JDK关于ClassLoader的代码撸了一遍,把以前一些模糊的地方捋明白了,内心稍安。同时这也是我昨天遇到的问题的前篇,扫清后面问题的障碍,后续会把关于Spark的问题捋出来,再来分享 ## 三种缺省类加载器 当一个JVM启动的时候,Java默认有三种类加载器 + 启动(Bootstrap)类加载器:Bootstrap类加载器是由C和C++实现的类加载器,它负责将 `/lib` 或者由 `-Xbootclasspath` 指定位置下的类库加载到内存中。由于是`native`的,所以我们无法直接接触它,也无法直接引用它。在JDK的ClassLoader类里可以看到关于它的方法调用都是`private native`的 + 扩展(Exttension)类加载器:ExtClassLoader是由Sun公司提供的实现,它负责将 `< Java_Runtime_Home >/lib/ext` 或者由系统变量 `java.ext.dir` 指定位置中的类库加载到内存中,在 `sun.misc.Launch...
问津已非少年 发布于 2小时前 阅读 15

73款阿里巴巴开源软件详解!

详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
阿里巴巴

疯狂Spring Cloud连载(23)Spring Cloud集群使用Zuul

Spring Cloud Zuul使用
杨大仙的程序空间 发布于 3小时前 阅读 23

SpringBoot和Vue的工程化实践之分分合合

背景 由于现在普遍的前后端分离开发 【前端vuejs 后端springboot】那么存在如下工程化问题: 目前SpringBoot采用fatjar的形式发布 Vue通过nodejs运行 发布时Vue打包出来的结果没有后端支持将无法访问 存在如下的方案 开发时将前后端项目联合开发,前端代码存在后端的子目录下【不建议】 开发时vue使用vue-cli的纯粹前端方案 部署时将生成的代码copy到后端项目中   方案 我们建议采用方案2,但是部署时不建议copy【不利于工程化的实践】 我们采用如下方式进行工程化的实践。【将vue代码copy到static文件夹下同样道理】 我们定义vue访问时采用固定前缀【比如ui】 访问ui目录时通过SpringBoot后端重定向到指定目录文件【更好的方案在生产上建议使用cdn或者nginx】 我们考虑增加SpringBoot的Resourcehandler 代码 定义对应映射关系 resource.resource-handler-list[0].pattern=/ui/** resource.resource-handler-list[0].location=file:/Users/qixiaobo/Downloads/ 定义具体对应类 /** * @author qixiaobo */ public class ResourceHandler { private String pattern; private String location; public String getPattern() { return pattern; }...
Mr_Qi 发布于 5小时前 阅读 56

ECMAScript6词法

ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,它于2015 年 6 月正式发布。ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。ECMAScript实现还有Jscript和ActionScript。
周胜 发布于 6小时前 阅读 41

MySql Binlog事件数据篇

前言 前两篇文章MySql Binlog初识和MySql Binlog事件介绍篇分别从Binlog入门和Binlog事件如何产生的两个角度来介绍Binlog,本文将从Binlog事件的数据来更深入的了解Binlog。 Binlog事件数据 1.QUERY_EVENT 执行更新语句时会生成此事件,包括:create,insert,update,delete; Fixed data part,总长度13字节: 4字节:执行sql的线程id; 4字节:执行sql的时间; 1字节:数据库名称的长度; 2字节:执行sql产生的错误码; 2字节:状态变量的长度,具体内容在Variable part; Variable part: 可变字节:状态变量,每个状态变量key为一个字节,后面跟着value,不同的key对应不同长度的value,但是总长度在Fixed data part中已经定义; 可变字节:数据库名称 可变字节:sql语句,通过事件的总长度-header长度-Fixed data-状态变量,剩余的字节数组通过utf-8编码即可获取; 2.STOP_EVENT 当mysqld停止时生成此事件; Fixed data part:空的 Variable part:空的 3.ROTATE_EVENT 当mysqld切换到新的binlog文件生成此事件; Fixed data part,总长度8字节: 8字节:下一个binlog文件的第一个事件的position,这个值一直是4,因为魔数占用了4字节; Variable data part: 可变字节...
ksfzhaohui 发布于 7小时前 阅读 66

使用 Docker 搭建 Java Web 运行环境

原料 前提条件 首先,您要准备一个 CentOS 的操作系统,虚拟机也行。总之,可以通过 Linux 客户端工具访问到 CentOS 操作系统就行。 需要说明的是,Ubuntu 或其它 Linux 操作系统也能玩 Docker,只不过本文选择了以 CentOS 为例,仅此而已。 CentOS 具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核: uname -r 如果执行以上命令后,输出的内核版本号低于 3.8,请参考下面的方法来来升级您的 Linux 内核。 对于 CentOS 6.5 而言,内核版本默认是 2.6。首先,可通过以下命令安装最新内核: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm yum -y --enablerepo=elrepo-kernel install kernel-lt 随后,编辑以下配置文件: vi /etc/grub.conf 将default=1修改为default=0。 最后,通过reboot命令重启操作系统。 重启后如果不出意外的话,再次查看内核,您的 CentOS 内核将会显示为 3.10。 如果到这里,您和我们所期望的结果是一致的。恭喜您!下面我们就一起来安装 Docker 了。 安装 Docker 只需通过以下命令即可安装 Docker 软件: ...
郑江江 发布于 7小时前 阅读 92

Unity太空大战游戏-Socket网络通信教学示例

U3D游戏与WeaveSocket网络通信教学示例
dreamsfly 发布于 11小时前 阅读 197 点赞 1

码云开始征集企业Logo和客户优秀案例啦!

码云企业版经过一年多的飞速发展,在业内取得了非常不错的成绩。码云的进步离不开众多合作伙伴和客户的大力支持,为了能够使码云的众多伙伴有更多机会和平台展现企业取得的优异成绩,并能够为众多码云企业版客户提供可参照依据,我们全面启动征集成功企业 Logo 和客户案例活动。 **展示一:展示企业 Logo** **征集时间:** 2017年12月8日之前。 **征集内容:** 本次征集最终选取20个企业 Logo 长期展示在码云企业版首页,作为品牌推广。 **征集要求:** 1、需提供 AI 格式的 Logo 文件。 2、文件按照“姓名+企业名称”发送至码云工作人员邮箱:**cuiliang@oschina.cn**,且邮件中需注明在码云上的企业个性地址。 **展示二:展示客户优秀案例** **征集时间:** 2017年12月8日之前 **征集内容:** 本次征集最终选取10篇进入码云企业版首页作为长期展示客户案例。 **征集要求:** 1、客户资料介绍。文字不少于100字。 2、成功案例——包括客户介绍、使用码云之后带来的改变(如开发效率的提升,项目管理/研发模式的创新,团队管理的便利性等等)、举具体的事例进行说明、客户感受等,文字不少于500字。 3、文件按照“姓名+企业名称”发送至码云工作人员邮箱:**cuiliang@oschin...
码云Gitee 发布于 12小时前 阅读 127 评论 1 点赞 1

用Python实现一个大数据搜索引擎

搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理。 布隆过滤器 (Bloom Filter) 第一步我们先要实现一个布隆过滤器。 布隆过滤器是大数据领域的一个常见算法,它的目的是过滤掉那些不是目标的元素。也就是说如果一个要搜索的词并不存在与我的数据中,那么它可以以很快的速度返回目标不存在。 让我们看看以下布隆过滤器的代码: class Bloomfilter(object): """ A Bloom filter is a probabilistic data-structure that trades space for accuracy when determining if a value is in a set. It can tell you if a value was possibly added, or if it was definitely not added, but it can't tell you for certain that it was added. """ def __init__(self, size): """Setup the BF with the appropriate size""" self.values = [False] * size self.size = size def hash_value(self, value): """Hash the value provided and scale it to fit the BF size""" ...
naughty 发布于 12小时前 阅读 470 评论 1

Spring Boot 2.0 - WebFlux With MongoDB

原文链接 [http://www.spring4all.com/article/239](http://www.spring4all.com/article/239) ### 1、理论知识 [Spring Boot 2.0 - WebFlux framework](http://www.jianshu.com/p/f4ff6d74ad4a) ### 2、基于 Spring Boot 2.0 的实践 #### ① 在 docker 上运行 MongoDB 首先,获取 MongoDB 的镜像: ``` $ docker pull mongo ``` 然后启动 MongoDB 容器 ``` $ docker run -d --name any-mongo -p 27017:27017 mongo ``` #### ② 构建 Spring Boot 2.0 WebFlux 运行环境 首先,在 IDEA 上新建 Maven 工程,pom.xml 文件内容如下: ``` 4.0.0 com.anoy webflux 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.0.0.M3 org.springframework.boot spring-boot-starter-webflux org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-undertow org.springframework.boot spring-boot-starter-data-mongodb-reactive org.projectlombok lombok org.springframework.boot spring-boot-starter-log4j2 spring-milestones Spring Milestones https://repo....
SpringForAll 发布于 13小时前 阅读 228 评论 1

译文连载:如何利用开源软件赚钱(一)

内容概览:0、为什么要翻译这本书;1、本书原作者简介;2、本书主要内容;3、本书前言部分。这篇是个先导文,后续正文部分会陆续更新,期望能够给大家新的想法。也欢迎随时与我交流沟通,联系方式在文章末尾。
中国政法大学开源研究 发布于 1天前 阅读 129

持续集成实践二之Jenkins与Sonar Qube集成

## 前言   作为一名码农,曾几何时,无数次挑灯夜战,只为第二天为客户稳定演示系统,奈何到关键时候,会发现代码中会有很多坑,这个时候,往往是最令人崩溃的。如何能做到提前发现程序潜在的问题,找到隐藏的八阿哥,保证系统的稳定,一直是困扰着我们的问题。记得以前为了解决这个问题,部门专门组织每周一次代码走查,虽然最后情况有所改善,但费事费力,并未得到根本上的解决。   所幸的是,有些大牛开发出了一系列代码质量检测工具,给我们这些码农带来了福音。下面就来介绍一款开源的代码质量管理系统——SonarQube。相信通过下面简单的介绍,你会跟我一样有种相见恨晚的感觉。 ## Sonar Qube简介   **SonarQube**(曾用名**Sonar**(声纳))是一个开源的代码质量管理系统。它支持C/C++、JavaScript、C#、Java、COBOL、TypeScript、PL/SQL、PL/I、PHP、FLEX、Python、Swift、XML等超过20种编程语言的检测。Sonar可以通过插件Findbugs、Checkstyle等工具持续对代码进行检测,可以使我们尽早发现项目中的Bugs,漏洞及坏味道,从而保证软件产品质量。 ## 环境准备 - 操作系统:Windows10 - Java环境:下载 jdk-1.8.0-131-X64.zip,配置Java环境变量(参考:) Ma...
老司机带你撸代码 发布于 1天前 阅读 87 点赞 1

Vert.x Guide demo解析续 译<三>

Vert.x demo解析
woshixin 发布于 1天前 阅读 33

疯狂Activiti6.0连载(18) Activiti与Drools整合

Activiti Drools 整合
杨大仙的程序空间 发布于 1天前 阅读 154

换个角度剖析iptables防火墙

    这篇文章会尽量以通俗易懂的方式描述iptables的相关概念,请耐心的读完它。   防火墙相关概念   此处先描述一些相关概念。 从逻辑上讲。防火墙可以大体分为主机防火墙和网络防火墙。 主机防火墙:针对于单个主机进行防护。 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。 网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)。   从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。   那么在此处,我们就来聊聊Linux的iptables   iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter   netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。 iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框...
开源中国首席哲♂学家 发布于 1天前 阅读 133 评论 1 点赞 5

入门到放弃node系列之网络模块(一)

### 前言 本文首发公众号【一名打字员】 上一次相信大家都基本了解node的用法了,有做功课的童鞋肯定回去温习了一下js的语法。这些年来js发展很快,出了很多类似许多vue、react、node等等众所周知的玩意儿,对应的社区配套也越来越完善。好的,接下来我们补充一下node的内置网络模块,顺带复习一下网络编程的相关知识,毕竟“技多不压身”。 ### API概览 其实nodejs一开始就是帮助编写高性能的web服务器,在这里简单介绍一下相关的API,好让大家知道什么情况下该使用哪个API,具体使用的方法还是去[官网][1]上瞄一下,毕竟官网已经解释的不能再详细了。我们将会介绍 - HTTP - HTTPS - URL - QUERY STRING - ZLIB - NET 今天我们先主要介绍一下HTTP与HTTPS。 - HTTP与HTTPS HTTP与HTTPS模块基本上都一样,唯一不同的地方就是HTTPS访问我们通常是需要证书的嘛,所以需要单独处理一下SSL证书。在这里先介绍一下HTTP模块,使用HTTP模块有两种用途,一是作为服务端,创建一个HTTP服务器,监听客户端并响应。二是作为客户端,进行HTTP请求,获取服务端信息。 说到HTTP请求,不得不插一句,相信很多人对其既陌生又熟悉。它大致上分为请求头和请求体,也就是我们常说的Request hea...
拯救世界的小安安 发布于 1天前 阅读 341 评论 1 点赞 1

LODOP!LODOP!!LODOP!!!(喊三遍啊喊三遍~)

公司买了一套LODOP的打印,没办法,那就用呗,开始还没理会,后面因为特殊原因一接触,才发现一入LODOP深似海,从此掉入“钱”眼里。(钱么,数的都是数字,咱也是数的数字,看下面的截图,你就知道此处应该要省略几万字~~) 上图第一张,出来的第一版打印的JS代码(部分): 完了,写完一个以后,眼睛看哪里晃来晃去的都是数字~  ***de,全是各种 TOP LEFT  WIDTH HEIGHT  必须的想想办法,吃了个中饭好好理了理思绪,想了想我要达到的目的: 摆脱数字,这么数来数去的计算位置,不行,效率太低下,应该要全部自动的生成,对于我么这种开发工(ma)程(nong)师来说不应该把时间浪费在这种事情上面(说白了,其实就是懒~) 对象化,上图那种代码,写位置不好算不说,写完了以后要维护,也是各种头大,包你一打开先要傻眼一会儿,咱也要面向对象编程的,是不?这才是咱工(ma)程(nong)师应该干的事 有对象那肯定就得有结构,于是乎根据一餐中饭想下来的思路,白板上画出来了一个版草稿 (请忽略左上角那块抹布,请忽略字写得有点丑~,请。。。) 后面事实证明,上面这张图确实只是一餐中饭拍脑袋临时拍出来的而已,不过大概的框架结构就出来了,回头拿笔细化梳理了一下...
Alfie 发布于 1天前 阅读 442 评论 7 点赞 1 打赏 1

SpringBoot DevTool实现热部署

背景 由于现在越来越多在使用IDEA做SpringBoot开发,和原先Tomcat不同的是 无法用reload class将对应的修改的class放入classpath 但是SpringBoot自身提供了SpringBoot-DevTool来做热部署  步骤 加入指定的maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>   idea选择auto build 快捷键 Command/Ctrl+Shift+A 键入 Registry 将图示选项勾上即可
Mr_Qi 发布于 1天前 阅读 524 点赞 1

SpringBoot之内容协商器

背景 使用了restful的小伙伴对于导出这些需求本能就是拒绝的~破坏了restful的url的一致性【严格矫正 不是http json就是restful 很多小伙伴都会吧暴露出一个json就直接称为restful 】 正如上文的代码生成器 我们会批量生成一堆代码 其中绝大部分都是RestController public abstract class AbstractRestController<V extends Vo, S extends So, PK extends Serializable> { protected Class<V> voClazz; @Autowired private Service<V, S, PK> service; public AbstractRestController() { TypeToken<V> voType = new TypeToken<V>(getClass()) { }; voClazz = (Class<V>) voType.getRawType(); } @PostMapping() @ApiOperation(value = "新建实体", notes = "") public Result add(@RequestBody V vo) { service.saveSelective(vo); return ResultGenerator.genSuccessResult(); } @DeleteMapping("/{id}") @ApiOperation(value = "删除实体", notes = "") public Result delete(@PathVariable PK id) { service.deleteById(id); return ResultGenerator...
Mr_Qi 发布于 1天前 阅读 337 点赞 2

HTTP 重定向: 你可能不知道的故事 - 上

在 Spring 里面我们要重定向的话一般都会这样做: ```java @Controller final class RedirectTestController { @RequestMapping(value = "/foo") String foo() { return "foo"; } @RequestMapping(value = "/bar") String bar() { return "redirect:/foo"; } } ``` 应用遇到发送到 `/bar/` 的请求被重定向到 `/foo`. 很简单,不是吗? 现在问题来了, 上面的代码能够在 `/bar` 上除了能够处理 GET 请求之外, 还能处理其他方法, 比如 `POST /bar`. 那如果用户发起一个 `POST /bar` 的请求, 会有什么效果呢? 我们把代码稍微改一下: ```java @Controller final class RedirectTestController { @RequestMapping(value = "/foo", method = RequestMethod.GET) String getFoo() { return "get:foo"; } @RequestMapping(value = "/foo", method = RequestMethod.POST) String postFoo() { return "post:foo"; } @RequestMapping(value = "/bar") String bar() { return "redirect:/foo"; } } ``` 然后使用 PostMan 工具来尝试向 `/bar` 发起一个 POST 请求. 结果发现返回的是 `get:foo`, 而不是 `post:foo`. 检查返回头发现 Spring 处理 `redirect:` 的时候返回的状态是 `HTTP 302 Fo...
罗格林 发布于 2天前 阅读 540 评论 5 点赞 9

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

用Python实现一个大数据搜索引擎

搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理。 布隆过滤器 (Bloom Filter) 第一步我们先要实现一个布隆过滤器。 布隆过滤器是大数据领域的一个常见算法,它的目的是过滤掉那些不是目标的元素。也就是说如果一个要搜索的词并不存在与我的数据中,那么它可以以很快的速度返回目标不存在。 让我们看看以下布隆过滤器的代码: class Bloomfilter(object): """ A Bloom filter is a probabilistic data-structure that trades space for accuracy when determining if a value is in a set. It can tell you if a value was possibly added, or if it was definitely not added, but it can't tell you for certain that it was added. """ def __init__(self, size): """Setup the BF with the appropriate size""" self.values = [False] * size self.size = size def hash_value(self, value): """Hash the value provided and scale it to fit the BF size""" ...
naughty 发布于 12小时前 阅读 470 评论 1

执行脚本 遇到 Host key verification failed

应用背景:通过 GitHub 的 webhook 实现 git push 后,服务器自动更新代码 通过我的站点提供一个 Url 给 GitHub 回调 这里的站点是基于 Laravel 搭建的博客. 关键代码 public function webhook(Request $request) { Log::info("git push 啦 该更新代码啦~"); $data = []; exec('/脚本所在的目录/updateGit.sh 2>&1', $data, $data1); Log::info($data ); Log::info($data1); return view("success"); } 脚本内容 #!/bin/bash cd /项目所在的目录/myBlog/ git pull 执行自动更新脚本时报错 1 => 'Host key verification failed.', 2 => 'fatal: The remote end hung up unexpectedly' 问题的起因是因为当前站点执行脚本时的用户为 www 用户,当前 www 用户的公钥没有配置在 GitHub 上。所以解决方案也很简单,切换到 www 用户,生成 ssh-key 并保存到 GitHub 的 ssk-key 列表即可! 修改完成后,再次调用 'Already up-to-date.' 大功告成! 原链接:http://www.chenyanjin.tk/blog/host-key-verification-failed...
我叫陈彦瑾 发布于 1周前 阅读 263

Spring Boot 2.0 - WebFlux With MongoDB

原文链接 [http://www.spring4all.com/article/239](http://www.spring4all.com/article/239) ### 1、理论知识 [Spring Boot 2.0 - WebFlux framework](http://www.jianshu.com/p/f4ff6d74ad4a) ### 2、基于 Spring Boot 2.0 的实践 #### ① 在 docker 上运行 MongoDB 首先,获取 MongoDB 的镜像: ``` $ docker pull mongo ``` 然后启动 MongoDB 容器 ``` $ docker run -d --name any-mongo -p 27017:27017 mongo ``` #### ② 构建 Spring Boot 2.0 WebFlux 运行环境 首先,在 IDEA 上新建 Maven 工程,pom.xml 文件内容如下: ``` 4.0.0 com.anoy webflux 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.0.0.M3 org.springframework.boot spring-boot-starter-webflux org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-undertow org.springframework.boot spring-boot-starter-data-mongodb-reactive org.projectlombok lombok org.springframework.boot spring-boot-starter-log4j2 spring-milestones Spring Milestones https://repo....
SpringForAll 发布于 13小时前 阅读 228 评论 1

Unity太空大战游戏-Socket网络通信教学示例

U3D游戏与WeaveSocket网络通信教学示例
dreamsfly 发布于 11小时前 阅读 197 点赞 1

码云开始征集企业Logo和客户优秀案例啦!

码云企业版经过一年多的飞速发展,在业内取得了非常不错的成绩。码云的进步离不开众多合作伙伴和客户的大力支持,为了能够使码云的众多伙伴有更多机会和平台展现企业取得的优异成绩,并能够为众多码云企业版客户提供可参照依据,我们全面启动征集成功企业 Logo 和客户案例活动。 **展示一:展示企业 Logo** **征集时间:** 2017年12月8日之前。 **征集内容:** 本次征集最终选取20个企业 Logo 长期展示在码云企业版首页,作为品牌推广。 **征集要求:** 1、需提供 AI 格式的 Logo 文件。 2、文件按照“姓名+企业名称”发送至码云工作人员邮箱:**cuiliang@oschina.cn**,且邮件中需注明在码云上的企业个性地址。 **展示二:展示客户优秀案例** **征集时间:** 2017年12月8日之前 **征集内容:** 本次征集最终选取10篇进入码云企业版首页作为长期展示客户案例。 **征集要求:** 1、客户资料介绍。文字不少于100字。 2、成功案例——包括客户介绍、使用码云之后带来的改变(如开发效率的提升,项目管理/研发模式的创新,团队管理的便利性等等)、举具体的事例进行说明、客户感受等,文字不少于500字。 3、文件按照“姓名+企业名称”发送至码云工作人员邮箱:**cuiliang@oschin...
码云Gitee 发布于 12小时前 阅读 127 评论 1 点赞 1

使用 Docker 搭建 Java Web 运行环境

原料 前提条件 首先,您要准备一个 CentOS 的操作系统,虚拟机也行。总之,可以通过 Linux 客户端工具访问到 CentOS 操作系统就行。 需要说明的是,Ubuntu 或其它 Linux 操作系统也能玩 Docker,只不过本文选择了以 CentOS 为例,仅此而已。 CentOS 具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核: uname -r 如果执行以上命令后,输出的内核版本号低于 3.8,请参考下面的方法来来升级您的 Linux 内核。 对于 CentOS 6.5 而言,内核版本默认是 2.6。首先,可通过以下命令安装最新内核: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm yum -y --enablerepo=elrepo-kernel install kernel-lt 随后,编辑以下配置文件: vi /etc/grub.conf 将default=1修改为default=0。 最后,通过reboot命令重启操作系统。 重启后如果不出意外的话,再次查看内核,您的 CentOS 内核将会显示为 3.10。 如果到这里,您和我们所期望的结果是一致的。恭喜您!下面我们就一起来安装 Docker 了。 安装 Docker 只需通过以下命令即可安装 Docker 软件: ...
郑江江 发布于 7小时前 阅读 92

MySql Binlog事件数据篇

前言 前两篇文章MySql Binlog初识和MySql Binlog事件介绍篇分别从Binlog入门和Binlog事件如何产生的两个角度来介绍Binlog,本文将从Binlog事件的数据来更深入的了解Binlog。 Binlog事件数据 1.QUERY_EVENT 执行更新语句时会生成此事件,包括:create,insert,update,delete; Fixed data part,总长度13字节: 4字节:执行sql的线程id; 4字节:执行sql的时间; 1字节:数据库名称的长度; 2字节:执行sql产生的错误码; 2字节:状态变量的长度,具体内容在Variable part; Variable part: 可变字节:状态变量,每个状态变量key为一个字节,后面跟着value,不同的key对应不同长度的value,但是总长度在Fixed data part中已经定义; 可变字节:数据库名称 可变字节:sql语句,通过事件的总长度-header长度-Fixed data-状态变量,剩余的字节数组通过utf-8编码即可获取; 2.STOP_EVENT 当mysqld停止时生成此事件; Fixed data part:空的 Variable part:空的 3.ROTATE_EVENT 当mysqld切换到新的binlog文件生成此事件; Fixed data part,总长度8字节: 8字节:下一个binlog文件的第一个事件的position,这个值一直是4,因为魔数占用了4字节; Variable data part: 可变字节...
ksfzhaohui 发布于 7小时前 阅读 66

千万级MySQL大表要怎么优化?

第一优化你的sql和索引; 第二加缓存,memcached,redis; 第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护; 第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了; 第五如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统; 第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表; 有人又会问:如何设计或优化千万级别的大表?对于一个存储设计,必须考虑业务特点,收集信息如下: 1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节; 2.数据项:是...
MS集边缘化 发布于 7小时前 阅读 63

Dubbo超时机制导致的雪崩连接

Bug标题:Dubbo超时机制导致的雪崩连接 ​Bug影响:Dubbo服务提供者出现无法获取Dubbo服务处理线程异常,后端DB爆出拿不到数据库连接池,导致前端响应时间异常飙高,系统处理能力下降,核心基础服务无法提供正常服务。 ​Bug发现过程: ​线 上,对于高并发的服务化接口应用,时常会出现Dubbo连接池爆满情况,通常,我们理所应当的认为,这是客户端并发连接过高所致,一方面调整连接池大小, 一方面考虑去增加服务接口的机器,当然也会考虑去优化服务接口的应用。很自然的,当我们在线上压测一个营销页面(为大促服务,具备高并发)时,我们遇到了 这种情况。而通过不断的深入研究,我发现了一个特别的情况。 场景描述: 压力从Jmeter压至前端web应用marketingfront,场景是批量获取30个产品的信息。wsproductreadserver有一个批量接口,会循环从tair中获取产品信息,若缓存不存在,则命中db。 压测后有两个现象: 1)Dubbo的服务端爆出大量连接拿不到的异常,还伴随着无法获取数据库连接池的情况 2)Dubbo Consumer端有大量的Dubbo超时和重试的异常,且重试3次后,均失败。 3)Dubbo Consumer端的最大并发时91个 Dubbo Provider端的最大并发却是600个,而服务端配置的dubbo...
码代码的小司机 发布于 4小时前 阅读 66

SpringBoot和Vue的工程化实践之分分合合

背景 由于现在普遍的前后端分离开发 【前端vuejs 后端springboot】那么存在如下工程化问题: 目前SpringBoot采用fatjar的形式发布 Vue通过nodejs运行 发布时Vue打包出来的结果没有后端支持将无法访问 存在如下的方案 开发时将前后端项目联合开发,前端代码存在后端的子目录下【不建议】 开发时vue使用vue-cli的纯粹前端方案 部署时将生成的代码copy到后端项目中   方案 我们建议采用方案2,但是部署时不建议copy【不利于工程化的实践】 我们采用如下方式进行工程化的实践。【将vue代码copy到static文件夹下同样道理】 我们定义vue访问时采用固定前缀【比如ui】 访问ui目录时通过SpringBoot后端重定向到指定目录文件【更好的方案在生产上建议使用cdn或者nginx】 我们考虑增加SpringBoot的Resourcehandler 代码 定义对应映射关系 resource.resource-handler-list[0].pattern=/ui/** resource.resource-handler-list[0].location=file:/Users/qixiaobo/Downloads/ 定义具体对应类 /** * @author qixiaobo */ public class ResourceHandler { private String pattern; private String location; public String getPattern() { return pattern; }...
Mr_Qi 发布于 5小时前 阅读 56

ECMAScript6词法

ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,它于2015 年 6 月正式发布。ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。ECMAScript实现还有Jscript和ActionScript。
周胜 发布于 6小时前 阅读 41

浅谈分布式服务协调技术 Zookeeper

什么是Zookeeper 在Zookeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services。 这大概描述了Zookeeper主要是一个分布式服务协调框架,实现同步服务,配置维护和命名服务等分布式应用。是一个高性能的分布式数据一致性解决方案。 通俗地讲,ZooKeeper是动物园管理员,它是拿来管大象 Hadoop、鲸鱼 HBase、Kafka等的管理员。   Zookeeper和CAP的关系 作为一个分布式系统,分区容错性是一个必须要考虑的关键点。一个分布式系统一旦丧失了分区容错性,也就表示放弃了扩展性。因为在分布式系统中,网络故障是经常出现的,一旦出现在这种问题就会导致整个系统不可用是绝对不能容忍的。所以,大部分分布式系统都会在保证分区容错性的前提下在一致性和可用性之间做权衡。 ZooKeeper是个CP(一致性+分区容错性)的,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性;但是它不能保证每次服务请求的可用性。也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果。 ZooK...
行走在旅途中 发布于 1周前 阅读 242 评论 1

使用Log4J来作为Spring Boot的日志系统

# 1. 修改`build.gradle` 排除掉对logback的依赖,添加对log4j的依赖 ``` dependencies { compile('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } compile('org.slf4j:slf4j-api') compile('org.slf4j:slf4j-log4j12') compile('commons-logging:commons-logging') } ``` # 2.设置定log4j的配置文件位置,例如: 把`log4j-dev.xml`文件放到`src/main/resources`目录下,然后在`application.properties`文件里设置 ``` logging.config=classpath:log4j-dev.xml ``` # 3. 在Spring Boot的启动类里用代码手动加载log4j,例如: ``` @SpringBootApplication public class Application implements EnvironmentAware { private Environment env; @Value('${logging.config}') private String log4jName; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void setEnvironment(Environment environment) { this.env = environment; String[] dProfiles = env.getDefaultProfiles(); String[] aProfiles = env.getActivePr...
白石 发布于 3周前 阅读 70 点赞 2 打赏 1

同一个服务器部署多个tomcat

一、前言     同一服务器部署多个tomcat时,存在端口号冲突的问题,所以需要修改tomcat配置文件server.xml,以tomcat7为例,了解tomcat几个主要的端口: 1、HTTP端口 // 其中8080为HTTP端口,8443为HTTPS端口 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="60000" redirectPort="8443" disableUploadTimeout="false" executor="tomcatThreadPool" URIEncoding="UTF-8"/> 2、远程停服务端口 // 8005为远程停服务端口 <Server port="8005" shutdown="SHUTDOWN"> 3、AJP端口 // 8009为AJP端口,APACHE能过AJP协议访问TOMCAT的8009端口 <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> 二、操作步骤 1、修改HTTP端口:默认8080,同个服务器的多个tomcat必须都不同 2、修改远程停服务端口:默认8005,同个服务器的多个tomcat必须都不同 3、AJP端口:默认8009,同个服务器的多个tomcat必须都不同 三、补充说明 1、若使用安装包安装tomcat,默认会在系统的环境变量指定Catalina_Home,此时只会运行指定的tomcat,多个tomcat时需将其删除。 2、每个运行的tomcat程序会默认命名为Tomcat,若想修改以示区别可在其tomcat\bin\catalina...
HarleyZhuge 发布于 23小时前 阅读 19

疯狂Spring Cloud连载(23)Spring Cloud集群使用Zuul

Spring Cloud Zuul使用
杨大仙的程序空间 发布于 3小时前 阅读 23

8张图理解Java

一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。 1、字符串不变性 下面这张图展示了这段代码做了什么 String s = "abcd"; s = s.concat("ef"); 2、equals()方法、hashCode()方法的区别 HashCode被设计用来提高性能。equals()方法与hashCode()方法的区别在于: 如果两个对象相等(equal),那么他们一定有相同的哈希值。 如果两个对象的哈希值相同,但他们未必相等(equal)。 3、Java异常类的层次结构 图中红色部分为受检查异常。它们必须被捕获,或者在函数中声明为抛出该异常。 4、集合类的层次结构 注意Collections和Collection的区别。(Collections包含有各种有关集合操作的静态多态方法) 5、Java同步 Java同步机制可通过类比建筑物来阐明。 6、别名 别名意味着有多个变量指向同一可被更新的内存块,这些别名分别是不同的对象类型。 7、堆和栈 图解表明了方法和对象在运行时内存中的位置。 8、Java虚拟机运行时数据区域 图解展示了整个虚拟机运行时数据区域的情况。...
Java团长 发布于 13小时前 阅读 16

如果优化100s的Elasticsearch 查询到1s以内

在SQL的世界里, 查询优化是相当成熟并且是可以理解的, 另外一方面, 分布式数据库系统是新出现的, 并且不太成熟. 理解查询是如何工作的将是一件非常重要的事情. Elstaticsearch的查询有时候将超过100s, 从而引发了很多timeout(超时), GC(垃圾回收) ,cache(缓存)更新等问题, 这里我们列出了在分析过程中发现的几个有意思的问题, 我们是如何优化到1s以内的, 下面也会给出答案. 在最慢的时候, 我们的请求量大约有150,000每秒 ![输入图片说明](https://abhishek376.files.wordpress.com/2014/11/searchrequests.png?w=390&h=166&zoom=2 "在这里输入图片标题") 大量的请求并不是问题, 如下图片显示了filter cache的大小变化过程, 当前我们环境中有11个Elasticsearch的结点, 每个结点实例有30G内存, 总计整个集群有330G的内存, 40%的内存贡献给了 filter cache, 当我们执行查询的时候, 查询结果就缓存在这里, 查询结果的重复使用极大地提升了查询性能. ![输入图片说明](https://abhishek376.files.wordpress.com/2014/11/filtercache.png "在这里输入图片标题") 内存空间是被所有消费者共享使用的, 并且受最近最少执行计划影响, 当我们增加一块filter cache内存空间时, 最近最少执...
leon_lu 发布于 3周前 阅读 16

VMware Workstation player 克隆多个CentOS实践

VMware Workstation player 克隆多个CentOS实践
MaxBill 发布于 9小时前 阅读 15

Java基础总结第(3)天

二.面向对象 1.面向对象思想: (1)概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象。 (2)思想特点: A:是符合人们思考习惯的一种思想;B:将复杂的事情简单化了;C:将程序员从执行者变成指挥者; 比如我们要达到某种结果,我就寻找能帮我达到该结果的功能的对象,如我要洗衣服我就买洗衣机,至于怎么洗我不管。 (3)特征: 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。 继承:多个类中的存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类就无需再定义这些属性和行为,只要继承那个类即可。 多态:一个对象在程序不同运行时刻代表的多种状态,父类或者接口的引用指向子类对象。 2.类和对象 类:对现实世界中的某些事物的描述,是抽象的,概念上的定义。 对象:事物具体存在的个体。 3.成员变量和局部变量的区别(重点) (1)作用域 成员变量:针对整个类有效。 局部变量:只在某个范围内有效。(一般指的是方法,语句体内) (2)存储位置 成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。 局部变量:在方法被调用,或者语句被执行的时候存...
wtyicy 发布于 22小时前 阅读 13

spring cloud + spring boot + ...分布式微服务云架构

做一个微服务架构需要的技术整理: View:  H5、Vue.js、Spring Tag、React、angularJs Spring Boot/Spring Cloud: Zuul、Ribbon、Feign、Turbine、Hystrix、Oauthor2、Sleuth、API Gateway、Spring Cloud、Config Eureka、SSO、Spring Cloud、 BUS、Turbine、Zipkin、Cache、Spring Cloud Admin、API Gateway、ELK Spring Cloud Security、 Spring Cloud Stream Component: RoketMQ、Kafka、MongoDB、OSS、Redis、Swagger、Zuul、Label、BASE、Charts、Utils DAO:  Spring Data、Mybatis、OSS、 DTO Data Storage: RDBS DFS、NOSQL/Hadoop Infrastructure: LogBack、BUS、Jenkins、Zipkin、Druid、Swagger、Docker   框架源码来源...
你在干嘛啊 发布于 11小时前 阅读 13

73款阿里巴巴开源软件详解!

详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
阿里巴巴

Python库打包到PyPI

### 打开pypi官网, 并注册账号 ``` https://pypi.python.org/ ``` ### 创建并编辑.pypirc (注: 家目录下创建) ``` tianshl@tianshl ~ $ vim .pypirc [pypirc] index-servers = pypi pypitest [pypi] repository=https://pypi.python.org/pypi [pypitest] repository=https://testpypi.python.org/pypi [server-login] username:tianshl password:****** ``` ### 前提 ``` 1. 要打包的代码必须是一个包(package) 2. 代码是开源的 ``` ### 包(package) ##### 创建包 ``` 右键 / New / Python Package / 输入包名 / OK ``` ##### 创建成功后,查看目录结构 ``` tianshl@tianshl wechat $ tree . └── wxReply └── __init__.py 实际上就是文件夹中包含__init__.py文件 ``` ### 编写要打包的源代码 ``` tianshl@tianshl wechat $ tree . └── wxReply ├── __init__.py └── wxReply.py 1 directory, 2 files ``` ### 创建README.rst和setup.py文件 ``` README.rst为说明文档 setup.py为安装脚本 (核心) ``` ##### 此时wechat包的目录结构 ``` tianshl@tianshl wechat $ tree . ├── README.rst ├── setup.py └── wxReply ├── __init__.py └── wxRepl...
tianshl 发布于 2周前 阅读 81956 评论 1

xxx is not in the sudoers file

### 问题 ``` 无法使用sudo指令 ``` ### 方法一 ``` 1. 查找sudoers位置(默认会在/etc/sudoers) [tianshl@tianshl ~]# whereis sudoers sudoers: /etc/sudoers /etc/sudoers.bak /usr/share/man/man5/sudoers.5.gz 2. 切换到root身份 [tianshl@tianshl ~]# su - 3. 修改sudoers权限 [root@tianshl ~]# chmod u+w /etc/sudoers 4. 把用户添加到sudoers中 [root@tianshl ~]# vi /etc/sudoers 1. 找到 "root ALL=(ALL)" 2. 另起一行输入 "tianshl ALL=(ALL) ALL" 备注:tianshl为用户名 修改后如下所示: ## Allow root to run any commands anywhere root ALL=(ALL) ALL tianshl ALL=(ALL) ALL 5. 去掉sudoers的写权限 [root@tianshl ~]# chmod u-w /etc/sudoers 6. 退出root用户后就可以利用sudo命令来执行管理员权限了。 ``` ``` 注:如果不去掉写权限,系统不允许执行suoders文件,运行sudo命令时会出现以下错误: sudo: /etc/sudoers is mode 0640, should be 0440 ``` ### 方法二 ``` 1.首需要切换到root身份 [tianshl@tianshl ~]# su - 2. 执行visudo [root@tianshl ~]# visudo 1、移动光标,到最后一行 2、按a,进入append模式 3、输入 "tianshl ALL=(ALL) ALL" 备注...
tianshl 发布于 2周前 阅读 94045

image not recognized

image not recognized
tianshl 发布于 1个月前 阅读 225396

java递归删除文件或文件夹

```java /** * 递归删除文件或文件夹 * * @param file 文件或文件夹 */ public void delFile(File file) { if (!file.exists()) { return; } if (file.isFile()){ // 文件: 直接删除 file.delete(); } else if (file.isDirectory()) { // 文件夹 // 1. 删除子文件 for (File f: file.listFiles()){ delFile(f); } // 2. 删除文件夹 file.delete(); } } ```
tianshl 发布于 2周前 阅读 77514

javacsv读写csv文件

### 添加依赖 ``` net.sourceforge.javacsv javacsv 2.0 ``` ### 读文件 ``` CsvReader reader = null; String row; String path = "./tmp/read.csv"; try { reader = new CsvReader(path, ',', Charset.forName("GBK")); // 跳过表头(需要表头就不用跳过) reader.readHeaders(); while (reader.readRecord()) { // 读取每行数据 row = reader.getValues(); System.out.println(row); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (Exception e) { e.printStackTrace(); } ``` ### 写文件 ``` CsvWriter csvWriter = null; String path = "./tmp/write.csv"; try { csvWriter =new CsvWriter(path,',', Charset.forName("GBK")); // 写入一行数据 csvWriter.writeRecord(new String[]{"张三", 18, "男"}); } catch (Exception e) { e.printStackTrace(); } finally { try { if (csvWriter != null) { csvWriter.close(); } } catch (Exception e) { e.printStackTrace(); } } ``` ### 备注 ##### 参考文档 [JavaCSV API](http://javacsv.sourceforge.net/) ``` http://javacsv.sourceforge.net/ `...
tianshl 发布于 2周前 阅读 77048

阿里Dubbo疯狂更新,关Spring Cloud什么事?

原文出处,在 Spring For All 社区(http://spring4all.com ): http://www.spring4all.com/article/213 最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本。 我上次在写[放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结](http://mp.weixin.qq.com/s/bciSlKearaVFQg1QWOSn_g)这篇文章的时候,就有很多的网友给我留言说,Dubbo 又开始更新了。我当然是清楚的,我也一直在关注着 Dubbo 的走向,在几个月前技术圈里面就有一个消息说是 Dubbo 又开始更新了,大家议论纷纷不知真伪。我还专门跑到 GitHub 上面进行了留言询问,最后在 Dubbo 的 gitter 聊天室里面找到了确信的答案,说是正在组建团队。虽然稍稍有所期待,但也不知道阿里这次拿出了多少的诚意来做这件事,于是我昨天又到 GitHub 逛了一下,发现从 9 月开始,阿里三个月连着发布了四个版本,还是非常有诚意的,值得关注。 ## Dubbo简介 Dubbo 是阿里巴巴公司一个开源的高性能服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案,使得应用可通过高性能 RPC 实现服务的输出、输入功能...
SpringForAll 发布于 5天前 阅读 6024 评论 20 点赞 5

2017 十大最佳 Linux 服务器发行版

在这篇文章中,我们将基于以下的考虑因素列出 2017 十大最佳 Linux 服务器发行版:与受支持的功能和硬件相关的数据中心的性能和可靠性;是否易于安装和使用;在许可方面的所有权和维护相关的问题;商业支持的可接入性
编辑部的故事 发布于 1周前 阅读 11282 评论 89 点赞 7

人工智能,机器学习和深度学习之间的差异是什么?

如果你在科技领域,你经常会听到人工智能,机器学习,甚至是深度学习。怎样才可以在正确的时间正确的使用这些词?他们都是一样的意思吗?然而更多时候,人们总是混淆的使用它们。 人工智能,机器学习和深度学习都是属于一个领域的一个子集。但是人工智能是机器学习的首要范畴。机器学习是深度学习的首要范畴。 深度学习是机器学习的一个子集,机器学习是人工智能的一个子集 这个领域的兴起应该归功于深度学习。人工智能和机器学习这个领域近年来一直在解决一系列有趣的问题,比如从自动化的杂货店购买到自动驾驶汽车。 人工智能: 人工智能的定义可以分为两部分,即“人工”和“智能”。“人工”比较好理解,争议性也不大。有时我们会要考虑什么是人力所能及制造的,或者人自身的智能程度有没有高到可以创造人工智能的地步,等等。但总的来说,“人工系统”就是通常意义下的人工系统。 尼尔逊教授对人工智能下了这样一个定义:“人工智能是关于知识的学科――怎样表示知识以及怎样获得知识并使用知识的科学。”而另一个美国麻省理工学院的温斯顿教授认为:“人工智能就是研究如何使计算机去做过去只有人才能做的智能工作。”这些说法反映了人工智能学科的基本思想和基本内容...
编辑部的故事 发布于 4天前 阅读 2975 评论 9 点赞 6

【码云周刊第 47 期】6个开源项目提升物联网开发效率

每周为您推送最有价值的开源技术内参!
码云Gitee 发布于 1周前 阅读 2419 评论 4 点赞 1

使用Hutool爬取开源中国的开源资讯

## 介绍 为了演示Hutool-http的http请求功能,因此这个栗子用红薯家的开源资讯开刀,在此做个简单的Demo。 ## 开始 ### 分析页面 1. 打开红薯家的主页,我们找到最显眼的开源资讯模块,然后点击“更多”,打开“开源资讯”板块。 ![](https://static.oschina.net/uploads/img/201711/19204312_zJD8.png) 2. 打开F12调试器,点击快捷键F12打开Chrome的调试器,点击“Network”选项卡,然后在页面上点击“全部资讯”。 ![](https://static.oschina.net/uploads/img/201711/19204634_1ahd.png) ![](https://static.oschina.net/uploads/img/201711/19204743_eJBy.png) 3. 由于红薯家的列表页是通过下拉翻页的,因此下拉到底部会触发第二页的加载,此时我们下拉到底部,然后观察调试器中是否有新的请求出现。如图,我们发现第二个请求是列表页的第二页。 ![](https://static.oschina.net/uploads/img/201711/19205000_V7Sj.png) 4. 我们打开这个请求地址,可以看到纯纯的内容。红框所指地址为第二页的内容,很明显p参数代表了页码page。 ![](https://static.oschina.net/uploads/img/201711/19205156_dTb8.png) 5. 我们右键点击后查看源码,可以看到源码。 ![](https://static...
路小磊 发布于 5天前 阅读 2080 评论 19 点赞 6

Java的SPI机制分析

Java SPI
宸明 发布于 6天前 阅读 2725 评论 4 点赞 2

有的放矢,你应该在性能测试报告中使用的 10 个微观指标

在这篇文章中,你将会了解到为什么常见的主要测试指标是不完美的,以及十个新的测量指标 —— 它们可能会改进你未来的性能测试报告。
编辑部的故事 发布于 3天前 阅读 1146 评论 1 点赞 1

如何7步实现根据源码包创建rpm包

### 如何7步实现根据源码包创建rpm包 --- > 本文是"[7 Steps to Build a RPM Package from Source on CentOS / RedHat](http://www.thegeekstuff.com/2015/02/rpm-build-package-example/)"一文的简单翻译。 **version: 0.1.0 2017-11-19** 有时你可能需要获取一个开源应用的源码包,但是可能没有无法通过该应用的RPM文件来安装到系统。 在这种情况下,你既可以编译源码安装,也可以以源码包来创建一个rpm包文件,实现安装应用的功能。 同样存在一种情况即你想要创建一个你自己开发的自定义的RPM包。 这篇指南解释了如何提高源码来创建一个rpm包。 为了创建rpm包,你将需要源码包(通常为一个压缩文件,其内也包含了SPEC文件)。 SPEC文件包含以下说明:如何创建rpm包,包内包含的文件,安装的路径。 RPM将展现创建过程中的测试过程。 执行spec文件中的prep块中定义的系统命令和宏命令。 检测文件列表的内容 执行spec文件中的build块中定义的系统命令和宏命令。在这一步中文件列表中的宏命令也被执行。 创建二进制包文件 创建源码包文件 一旦RPM执行了上述步骤,将创建二进制的包文件和源码包文件。 二进制包文件包含所有安装或卸载包的额外信息的源文件。 通常安装包的所有...
Lu_Castiel 发布于 5天前 阅读 948 评论 7 点赞 2

2017 热门开源自动化测试框架优缺点对比

时间一晃已来到 2017 年的最后一个季度,TestProject 对比了在今年比较热门的 7 款开源自动化测试框架的优缺点,以帮助你选择适合自己的测试框架。 1. Robot Framework Robot Framework(RF)是用于验收测试和验收测试驱动开发(ATDD)的自动化测试框架。 基于 Python 编写,但也可以在 Jython(Java)和 IronPython(.NET) 上运行,提供跨平台支持(Windows、Linux 或 MacOS )。 优点: 通过使用关键字驱动测试(KDT)方法简化了自动化测试过程,方便测试人员创建易读的测试。 测试数据语法简单易用。 生态系统丰富。由各种通用测试库和工具组成,这些工具都是作为独立项目开发的。 具有高度可扩展性。 可通过 pabot 或 Selenium Grid 执行并行测试。 缺点: 自定义 HTML 报告较为麻烦。 如果是针对大范围的库和扩展的 KDT 自动化测试,建议使用此跨平台框架。如果想要添加新的关键字(通过 RF 测试库 API ),需要具备 Java / Python / C 语言的基础知识。 2. JUnit JUnit 是一款针对 Java 应用的单元测试框架,用于编写和运行可重复的测试。 优点: 纯 Java 编写。 支持测试驱动开发(TDD)。 允许创建自己的单元测试用例套件。 能很好地与其他工具(如 Maven )和 ...
编辑部的故事 发布于 1周前 阅读 3769 评论 6 点赞 2

Spring boot + LayIM + t-io 单聊群聊的实现

一个基于Spring boot,t-io的通讯框架,LayIM的实现。
丶Pz 发布于 3天前 阅读 927 评论 7 点赞 3

Redis 笔记系列(七)——“开发不是核心、配置才是王道”

断了一年的坑,今年年底了给自己个小目标,年底前把这个系列的文章填完。
HappyBKs 发布于 6天前 阅读 734 评论 3 点赞 4

后端自动化版本管理,再也不用改URL了!

每次升级接口版本时,后端、前端、客户端都是痛苦的: 后端:要兼容旧版客户端,以前的接口不能动啊,又得写新接口、新文档了,唉! 前端:还好,就是版本号到处都是,改起来比较烦。 Android:快点啊产品催需求呢,服务器别停太久。对了你知道编译一次要多久么?泪奔。。。 前端:对对,别停太久。还有文档别再写错了啊,上次你复制粘贴的 v3 害我接口调了半天,原来是 v4 。。。 iOS:我也被坑了。。。 后端:呃,我尽快,写文档会注意的哈。 后端:另外旧域名 http://api.aaa.com/v4 也会一直开着,保证不会像上次那样让3.0客户端请求挂的。 后端:@前端 对了,你们用一个全局的 BASE_URL 存起来,以后改一个地方就好了。 Android:我们就是这么干的嘿嘿! iOS:我们也是,还是我封装的。 iOS:但问题是往往多个接口版本并存,还是要写好几个BASE_URL,我们这是从BASE_URL_V2到BASE_URL_V4。 Android:唉,这个就没办法了。 前端:我们现在也是这么做的,但之前的那家伙没封装啊,写得到处都是。。。     后端:周哥,升级接口版本好烦啊,你有什么好的办法吗? 周哥:具体说下你的问题。 后端:每次都要写新的接口和文档,服务器也要重启,前端和客户端总是抱怨改域名...
孤独的探索号 发布于 3天前 阅读 655 评论 10

我所理解的JVM(七):JVM调优

之前所有关于JVM的知识,主要视为JVM调优做准备的。 对于虚拟机的**调优步骤**,一般分为3步: 1. 根据一定参数启动虚拟机 2. 配置好压力测试参数进行压力测试 3. 可视化工具或者命令行查看虚拟机运行状态和GC日志进行分析 以上3步循环执行,最终目的是确定好启动参数。 **考核虚拟机的指标**: - 吞吐量:重要指标之一,是指不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。 - 延迟:其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。 - 内存占用:垃圾收集器流畅运行所需要 的内存数量。   一般虚拟机的所使用的内存是确定的,优化指标主要体现在需求上是要低延迟还是高吞吐量。   压力测试的参数及接口主要看业务。 Jdk在jdk/bin目录下自带了一些**可视化工具**: 如jvisualvm和jconsole。 Jdk在运行时也可以使用**命令行**来查看当前虚拟机的运行状态: - jps:查看当前虚拟机的进程状况。参数-v可以查看JVM的启动参数。 - jstat:查看当前虚拟机的统计信息。非常重要。 - jinfo:查看当前虚拟机的配置信息。比如未显式指定的一些默认值和默认选项 - jmap:生成堆转储...
康斯但丁 发布于 6天前 阅读 746 点赞 3

曾经做过的40道程序设计课后习题总结(四)

曾经做过的40道程序设计课后习题总结,包括斐波那契数列、判断素数、水仙花数、分解质因数、杨辉三角、学习成绩查询、求最大公约数与最小公倍数、完全平方数、统计字母、空格、数字和其它字符个数、求主对角线之和、完数求解、求s=a+aa+aaa+aaaa+aa...a的值、高度计算、乘法口诀、无重复三位数、菱形打印、利润计算、第几天判断、从小到大输出数列、猴子吃桃问题、乒乓球比赛、求分数之和、求阶乘的和、递归求法、求不多于5的正整数、回文判断、星期判断、插数入数组、取整数的任意位、按顺序输出数列、位置替换、字符串排序、贷款器、通讯录排序、闰年判断、二元方程求解、密码解译、DVD查询、电子日历、万年历
闵开慧 发布于 4天前 阅读 505 评论 4 点赞 2

SpringBoot 打包之可运行jar

背景 一个可运行的工具始终比XXX配置更加方便 每次一堆tomcat版本指定,对应jar替换 各种打包 替换properties 参考 maven profile VS spring profile tomcat什么的下载太麻烦了 SpringBoot 的execute jar可以解决上述一堆问题 当然我们仍然可以将其导出成war 后放入 tomcat中运行 实现 在需要打包的模块加入如下plugin <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 如果继承自spring-boot的pom可以指定start-class <properties> <start-calss>com.f6car.base.Application</start-calss> </properties> 那么当我们运行 mvn clean package 将会生成一个可运行jar 那么执行脚本就很简单 如下 java -jar /Users/qixiaobo/Downloads/zeus/web/target/web-0.0.1-SNAPSHOT.jar So easy! 原理 知其然不知其所以然不是本人风格~ 稍微剖析一下可执行jar的原理 springboot提供的maven插件会将对应start-class作为入口【如何实现呢】 学习Java web的小伙伴应该知道WEB-INF这个目录 通常规定会将一些不直接提供给...
Mr_Qi 发布于 3天前 阅读 451 评论 3 点赞 1

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

树与二叉树基础

  树的基本概念:          1、结点的度       结点的度是子结点的个数。例如:结点1有三个字结点2,3,4,所以结点1的度为3。 2、树的度       树的度等于所有结点度中度最高的值。例如:上图中结点度最高为3,所以树的度为3。 3、叶子结点       叶子结点是度为0的结点即没有子结点的结点。例如:上图中3,5,6,7,9,10。 4、分支结点       分支结点是除了叶子结点,树中的其他所有结点。例如:上面树的分支结点为1,2,4,8。 5、内部结点       内部结点是除了根结点以及叶子结点或在分支结点的基础之上在去掉根结点。例如:上面树的内部结点为2,4,8。 6、父结点、子结点、兄弟结点      父节点、子结点和兄弟结点是相对而言的。例如:结点1是结点2,3,4的父节点,结点2,3,4也是结点1的子结点,结点2,3,4又是兄弟结点。 7、层次      图中我们已经表出来了,根为第一层,根的孩子为第二层,依此类推,若某结点在第i层,则其孩子结点在第i+1层。 8、森林      m棵互不相交的树的集合。 9、有序树,无序树     如果树中每棵子树从左到右的排列拥有一定的顺序,不得互换,则称为有序数,否则称为无序数。 树的遍历  树的遍历特...
小衰哥有点帅 发布于 45分钟前 阅读 1

《数据库系统概念》7-函数、存储过程、触发器

一、函数和存储过程 a)通过函数和存储过程可以将业务逻辑保存在数据库,在需要的时候调用。比如学生在一个学期可以修的最大课程数、导师的最小授课数等,这些判断具有比较复杂的逻辑,虽然在数据库外也可以实现这样的控制,但用函数或存储过程在数据库的入口来把关,可以与应用程序独立开来,便于维护。但感觉将业务逻辑独立写在存储过程也不一定就能便于维护。 b)SQL标准规定的函数定义方法为: create function dept count(dept_name varchar(20)) returns integer begin declare d_count integer; select count(*) into d_count from instructor where instructor.dept_name= dept_name return d count; end 函数定义好后,可以在查询语句中调用,就像内置函数一样: select dept name, budget from instructor where dept count(dept name) > 12; c)函数还可以返回表,称为表函数(table functions),这相当于带参数的视图 create function instructors of (dept_name varchar(20)) returns table ( ID varchar (5), name varchar (20), dept_name varchar (20), salary numeric (8,2)) return table (select ID, name, dept_name, salary from instructor where instruc...
zhixin9001 发布于 53分钟前 阅读 1

百度云盘技巧两则

百度云盘越来越鸡肋,但是已经不少资源了,离不开了。 1、各种资源,共享了之后,一点不对就被和谐了,还tm不通知,怎么办? 加密打包改名上传,为了避免被破解,采用Winrar +11位以上随机密码。 2、相同的资源被覆盖了,或者被封禁了。百度采用特征码进行文件识别,如果特征码一致,文件就会被其他文件替换了。虽然特征码很难一样,但禁不住百度云盘上文件多。我已经见过好几次美剧都播放成某些私人视频的情况了。 新建一个文本文件,用copy file1+file2 newfile的方式将文本文件附加到要重新传的文件中。大多数文件都能自己识别自己的文件末尾,因此附加一个文本文件并不影响文件的使用,但可以影响百度云客户端特征码的识别。这种方式比较节省空间,速度也很快。修改完了文件就可可以重新上传了。PS秒传虽然有好处,但对于百度来说,它太省空间了。
袁国涛 发布于 57分钟前 阅读 2

Ubuntu webmin 安装

https://linux.cn/article-3113-1.html Webmin是一个开源的基于网页的Unix/Linux系统管理工具。通过使用Webmin,你可以在浏览器上设置和安装所有的系统服务,包括:DNS、DHCP、Apache、NFS和Samba等等。因此,有了这个,你就再也不需要去记住所有的修改配置的命令了。 使用官方软件源在Ubuntu 14.04 LTS上安装Webmin 添加webmin的官方仓库: 修改 /etc/apt/sources.list,   sudo vi /etc/apt/sources.list 添加如下内容:   deb http://download.webmin.com/download/repository sarge contrib deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib 添加GPG密钥:   sudo wget http://www.webmin.com/jcameron-key.asc sudo apt-key add jcameron-key.asc 更新软件源:   sudo apt-get update 通过如下命令安装webmin:   sudo apt-get install webmin 如果你想从远程系统访问webmin的控制台,就在防火墙里开启webmin的默认端口“10000”   sudo ufw allow 10000 访问Webmin控制界面 打开浏览器并访问URL** https://ip-address:10000/**。应该会出现如下的场景。在此输入用户名和密码来登录webmin的控制台。 Login to Webmin 这是我的Webmin面...
阿豪boy 发布于 59分钟前 阅读 1

awk小记

本文索引: * awk调用外部变量 * awk文件合并 * awk将文件内容连接为单行 * awk工具gsub函数使用 * awk使用print打印单引号 * awk实现多条件过滤 * awk格式化打印 --- ### awk调用外部变量 `-v`参数设置内部变量调用外部变量 ``` [root@castiel-Lu awk]# a=44 [root@castiel-Lu awk]# echo "ABCD" | awk -v GET_A=$a '{print GET_A}' 44 ``` 更复杂的应用: ``` [root@castiel-Lu awk]# cat awk1.sh #!/bin/bash # sort先排序,awk截取第一个字段,uniq取独 sort -n file | awk -F ':' '{print $1}' | uniq > id.txt for id in `cat id.txt`;do echo "[$id]" # 使用-v设置内部变量,用于打印时的判断 awk -v id2=$id -F ":" '$1==id2 {print $2}' file done [root@castiel-Lu awk]# cat file 1111111:13443253456 2222222:13211222122 1111111:13643543544 3333333:12341243123 2222222:12123123123 # 效果 [root@castiel-Lu awk]# sh awk1.sh [1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123 ``` ### awk文件合并(暂时未理解) 将两个文件中,第一列相同的行合并到同一行中 ``` [root@castiel-Lu awk]# cat 1.txt 1 aa 2 bb...
Lu_Castiel 发布于 1小时前 阅读 1

python-mysql删除和更新数据

删除数据 import codecs import MySQLdb def connect_mysql(): db_config = { 'host': '192.168.48.128', 'port': 3306, 'user': 'xiang', 'passwd': '123456', 'db': 'python', 'charset': 'utf8' } cnx = MySQLdb.connect(**db_config) return cnx if __name__ == '__main__': cnx = connect_mysql() sql = '''select * from Student where StdName in (select StdName from Student group by StdName having count(1)>1 ) order by StdName;''' try: cus = cnx.cursor() cus.execute(sql) result = cus.fetchall() with codecs.open('select.txt', 'w+') as f: for line in result: f.write(str(line)) f.write('\n') cus.close() cnx.commit() except Exception as e: cnx.rollback() print('error') raise e finally: cnx.close() 结果:   正确执行         修改数据 import codecs import MySQLdb def connect_mysql(): db_conf...
peizh 发布于 1小时前 阅读 1

awk练习题

1. 用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt ``` [root@centos001 ~]# awk -F ':' '{print $0}' test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin ``` > $0表示打印所有 2. 查找所有包含 ‘bash’ 的行 ``` [root@centos001 ~]# awk '/bash/' test.txt root:x:0:0:root:/root:/bin/bash user1:x:1000:1000::/home/user1:/bin/bash aming:x:1001:1007::/home/aming:/bin/bash awei:x:1002:1002::/home/awei:/bin/bash ``` 3. 用 ‘:’ 作为分隔符,查找第三段等于0的行 ``` [root@centos001 ~]# awk -F ':' '$3==0' test.txt root:x:0:0:root:/root:/bin/bash ``` 4. 用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用) ``` [root@centos001 ~]# awk -F ':' '$1==root' test.txt | sed 's/root/toor/' [root@centos001 ~]# awk -F ':' '$1=="root"' test.txt | sed 's/root/toor/' toor:x:0:0:root:/root:/bin/bash ``` > 第一段没有正确输出是因为没有加双引号,==是精确匹配,不加双引号就会被认为是数字 5. 用 ‘:’ 作为分隔符,打印最后一段 ``` [roo...
杉下 发布于 1小时前 阅读 1

Mysql 中ORDER BY 是否能够增加执行效率

同样的sql语句,只是缺少order by 。这里的排序最好是主键或者索引
季书歌 发布于 1小时前 阅读 1

Redis 笔记系列(八)——Redis的持久化之RDB

Redis的持久化 我记得读研那会儿,我“老板”让我冒充老师去帮他参加一个本科生的答辩评审,当时有个大四学弟貌似在外实习,把在公司做的一个电商网站的代码改改作为毕设课题,有用到redis。当时我正好看了点redis,于是就问:“redis能做持久化吗?怎么做的?”学弟斩钉截铁的答道:“不可以老师,redis不能持久化,redis只能存内存,要持久化得用mysql”。于是,我心里呵呵,嘴上默许了(旁边还好坐了两个搞人工智能不懂redis的老师,所以我就不搞学弟难看了)。但是,官网上这么大的字啊!!! https://redis.io/topics/persistence redis是能够持久化的,你断电之后数据还是能回来,就表明redis通过某种机制实现了数据的持久化。并且,resdis的持久化提供了两种方式:RDB和AOF。 如果非要做个白话的开场白,那就打两个比方吧: RDB就像巡逻队,每隔一段时间跑过来一下:“现在都有谁啊?“然后咔嚓,拍了个现在时刻的所有人(数据)的照片,走了。并且巡逻队长的巡逻频度,还有特定策略,比如人来往频繁(set数据频繁)他可能会很快回来巡视和拍个快照(这个对应于RDB的快照save策略的配置)。 AOF就是跟踪狂、你GF的私人侦探,你在做什么,他不管结果(数据本身),只...
HappyBKs 发布于 1小时前 阅读 2

ClassLoader和双亲委派机制

前言:网上关于类加载器讲解的文章特别多,在学习的时候让我受益匪浅,某段时间觉得自己懂了。但是在昨天遇到一个问题,并去看Spark关于用户类加载的时候,它实现的类加载器让我看的很疑惑,半天没有转过来。我才发现自己原来根本不懂类加载器的原理,对双亲委派机制只是停留在字面上,知道会先找父但是不知道怎么去找的,所以今天把JDK关于ClassLoader的代码撸了一遍,把以前一些模糊的地方捋明白了,内心稍安。同时这也是我昨天遇到的问题的前篇,扫清后面问题的障碍,后续会把关于Spark的问题捋出来,再来分享 ## 三种缺省类加载器 当一个JVM启动的时候,Java默认有三种类加载器 + 启动(Bootstrap)类加载器:Bootstrap类加载器是由C和C++实现的类加载器,它负责将 `/lib` 或者由 `-Xbootclasspath` 指定位置下的类库加载到内存中。由于是`native`的,所以我们无法直接接触它,也无法直接引用它。在JDK的ClassLoader类里可以看到关于它的方法调用都是`private native`的 + 扩展(Exttension)类加载器:ExtClassLoader是由Sun公司提供的实现,它负责将 `< Java_Runtime_Home >/lib/ext` 或者由系统变量 `java.ext.dir` 指定位置中的类库加载到内存中,在 `sun.misc.Launch...
问津已非少年 发布于 2小时前 阅读 15

springboot

第一天用 springboot出现异常 Unregistering JMX-exposed beans on shutdown 解决方式 Maven目录下boot文件删除重新生成一下就好
优雅的弗利萨 发布于 2小时前 阅读 2

jQuery-基础篇

jQuery是一个快速、简洁的JavaScript框架 jQuery设计的宗旨是“write Less,Do More”
anlve 发布于 3小时前 阅读 2

疯狂Spring Cloud连载(23)Spring Cloud集群使用Zuul

Spring Cloud Zuul使用
杨大仙的程序空间 发布于 3小时前 阅读 23

若干年后,中国的铁路空座率是常态

若干年后,中国的铁路空座率是常态。 随着,中国的人口慢慢的城市化后,农村和城市之间的来回式迁徙,将慢慢的减少。加上以后的汽车普及,人们坐铁路的就越来越少了。所以,现在中国继续建设一些没必要的铁路就是浪费资源,浪费人力物力。 铁路的国际化,想法是好,现实很骨感。 据说,从雅鲁藏布江引入水到新疆的想法正在验证,如果可行,将实施。这个问题,根据网络搜索,很早的时候就有人提出,一直没有做,因为其工作量很大。如果可行,尽早实施吧,毕竟还是有点作用。 性爱机器人的诞生,也许是催生机器人快速实现的重要突破口,只要有需求了,肯定就越来越兴旺发达。到时候,我也希望搞一两个机器人来改造改造一下,至少可以不用做一些重复劳动的事。 还有一个,以后估计炒股将慢慢消失了,也就是证券这个东西将会在世界上退出舞台,替换它的估计是另一个东西。
祝网 发布于 3小时前 阅读 2

netstat命令详解

转博客园上一篇文章
mskk 发布于 4小时前 阅读 1

Java面试——从JVM角度比较equals和==的区别

1.  Java中数据类型分类 1.1    基本数据类型 又称为原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较应该使用(==),比较的是他们的值。   1.2    复合数据类型 当复合数据类型用(==)进行比较,比较的是他们在内存中的存放地址。 当复合数据类型之间进行equals比较时,这个方法的初始行为是比较对象在堆内存中的地址,但在一些诸如String,Integer,Date类中把Object中的这个方法覆盖了,作用被覆盖为比较内容是否相同。 本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52089040   2.  String类的讨论   [java] view plain copy String s1 = "Hello";   String s2 = "Hello";   if (s1 == s2){    System.out.println("s1 == s2");   }else{   System.out.println("s1 != s2");   }   输出:s1 == s2   说明:双等号在进行复合数据类型比较时,比较的是内存中的存放地址。因此s1与s2引用同一个String对象。   [java] view plain copy String s1 = "Hello";   String s2 = new String("Hello");   if (s1 == s2){   System.out.println("s1...
new_chaos 发布于 4小时前 阅读 1

Dubbo超时机制导致的雪崩连接

Bug标题:Dubbo超时机制导致的雪崩连接 ​Bug影响:Dubbo服务提供者出现无法获取Dubbo服务处理线程异常,后端DB爆出拿不到数据库连接池,导致前端响应时间异常飙高,系统处理能力下降,核心基础服务无法提供正常服务。 ​Bug发现过程: ​线 上,对于高并发的服务化接口应用,时常会出现Dubbo连接池爆满情况,通常,我们理所应当的认为,这是客户端并发连接过高所致,一方面调整连接池大小, 一方面考虑去增加服务接口的机器,当然也会考虑去优化服务接口的应用。很自然的,当我们在线上压测一个营销页面(为大促服务,具备高并发)时,我们遇到了 这种情况。而通过不断的深入研究,我发现了一个特别的情况。 场景描述: 压力从Jmeter压至前端web应用marketingfront,场景是批量获取30个产品的信息。wsproductreadserver有一个批量接口,会循环从tair中获取产品信息,若缓存不存在,则命中db。 压测后有两个现象: 1)Dubbo的服务端爆出大量连接拿不到的异常,还伴随着无法获取数据库连接池的情况 2)Dubbo Consumer端有大量的Dubbo超时和重试的异常,且重试3次后,均失败。 3)Dubbo Consumer端的最大并发时91个 Dubbo Provider端的最大并发却是600个,而服务端配置的dubbo...
码代码的小司机 发布于 4小时前 阅读 66

Webservice

1:Webservice 服务端创建定义(axis) /**  * 定义webservice服务(可以是接口和实现类)  * 服务端发布: 参数1:服务的发布地址                   参数2:服务的实现者         Endpoint.publish("http://192.168.1.104:90/hello",  new HelloWebservice());  * @author admin  *  1:用命令生成客户端程序:wsimport  -s . http://192.168.1.105:86/hello?wsdl  *  2:用eclipse生成客户端程序  */ @WebService public class HelloService {          public String getMsg(String msg){         System.out.println("服务端接收到:"+msg);                  return "给客户端返回:"+msg;     }     @WebMethod(exclude=false)     public String sayHello(String msg){         System.out.println("服务端接收请求:"+msg);         return "服务端已经响应:"+msg;     }     public String sayHello1(String msg){         System.out.println("服务端接收请求:"+msg);         return "服务端已经响应:"+msg;     }          public static void main...
m243043962 发布于 4小时前 阅读 2

mysql 检测从库状态

先将show slave status的结果转换成字典,再取key对应的值去判断相关属性的状态 #!/bin/bash HOSTNAME="XXXX" PORT="3306" USERNAME="XXXX" PASSWORD="XXXXX" DBNAME="mysql" use_db_sql="use ${DBNAME}" mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${use_db_sql}" select_sql="show slave status\G;" state=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"` ret=${state//: /:} ####echo $ret ####下面是将字符串分割成数组 OLD_IFS="$IFS" IFS=" " arr=($ret) IFS="$OLD_IFS" ####字典必须先声明 declare -A dic OLD_IFS="$IFS" IFS=":" for s in ${arr[@]} do     arr2=($s)     ##echo  ${#arr2[@]} ":count"     if [ ${#arr2[@]} -eq 2 ];then       dic[${arr2[0]}]=${arr2[1]}     else      dic[${arr2[0]}]=""     fi done IFS="$OLD_IFS" io_run=${dic["Slave_IO_Running"]} sql_run=${dic["Slave_SQL_Running"]} str="Yes" if [ "$io_run" != "$str" ] || [ "$sql_run" != "$str" ];then     ####发送邮件通知     sh sendmail.sh fi #####sendmail.sh #!/bin/bash /us...
二师弟的大师兄 发布于 4小时前 阅读 1

mybatis update语句判断怎么写?

<!-- 修改 --> <update id="updateWorkJobs" parameterType="com.lvic.prsp.dao.dto.CRM_JobsDto"> UPDATE PRSP_CRM_ENTERPRISE <trim prefix="SET" suffixOverrides=","> <if test="null != enterp_name and '' != enterp_name"> ENTERP_NAME=#{enterp_name,jdbcType=VARCHAR}, </if> <if test="null != enterp_type and '' != enterp_type"> ENTERP_TYPE=#{enterp_type,jdbcType=VARCHAR}, </if> <if test="null != enterp_address and '' != enterp_address"> ENTERP_ADDRESS=#{enterp_address,jdbcType=VARCHAR}, </if> <if test="null != enterp_resume and '' != enterp_resume"> ENTERP_RESUME=#{enterp_resume,jdbcType=VARCHAR}, </if> </trim> ,UPDATETIMESTAMP=sysdate WHERE ENTERP_NO=#{enterp_no,jdbcType=INTEGER} AND DELETE_FLG='0' </update> 这段代码很容易看懂: prefix : 就是前缀   suffixOverrides : 去除多余的 “,”  注意的地方: 注意这个哦,前面去除多...
一个橙子HHH 发布于 4小时前 阅读 6

springboot+vue的前后端分离与合并方案

springboot+vue的前后端分离与合并
上官胡闹 发布于 2天前 阅读 3065 评论 24 点赞 5

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

MariaDB的延迟开源模式及其BSL许可证介绍(一)

本文主要内容:①我为啥拖延;②MariaDB的BSL许可证;③BSL示例。下一步准备介绍下MySQL和MariaDB的版权细节问题。
中国政法大学开源研究 发布于 2天前 阅读 940 评论 1 点赞 2

阿里Dubbo疯狂更新,关Spring Cloud什么事?

原文出处,在 Spring For All 社区(http://spring4all.com ): http://www.spring4all.com/article/213 最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本。 我上次在写[放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结](http://mp.weixin.qq.com/s/bciSlKearaVFQg1QWOSn_g)这篇文章的时候,就有很多的网友给我留言说,Dubbo 又开始更新了。我当然是清楚的,我也一直在关注着 Dubbo 的走向,在几个月前技术圈里面就有一个消息说是 Dubbo 又开始更新了,大家议论纷纷不知真伪。我还专门跑到 GitHub 上面进行了留言询问,最后在 Dubbo 的 gitter 聊天室里面找到了确信的答案,说是正在组建团队。虽然稍稍有所期待,但也不知道阿里这次拿出了多少的诚意来做这件事,于是我昨天又到 GitHub 逛了一下,发现从 9 月开始,阿里三个月连着发布了四个版本,还是非常有诚意的,值得关注。 ## Dubbo简介 Dubbo 是阿里巴巴公司一个开源的高性能服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案,使得应用可通过高性能 RPC 实现服务的输出、输入功能...
SpringForAll 发布于 5天前 阅读 6024 评论 20 点赞 5

如何7步实现根据源码包创建rpm包

### 如何7步实现根据源码包创建rpm包 --- > 本文是"[7 Steps to Build a RPM Package from Source on CentOS / RedHat](http://www.thegeekstuff.com/2015/02/rpm-build-package-example/)"一文的简单翻译。 **version: 0.1.0 2017-11-19** 有时你可能需要获取一个开源应用的源码包,但是可能没有无法通过该应用的RPM文件来安装到系统。 在这种情况下,你既可以编译源码安装,也可以以源码包来创建一个rpm包文件,实现安装应用的功能。 同样存在一种情况即你想要创建一个你自己开发的自定义的RPM包。 这篇指南解释了如何提高源码来创建一个rpm包。 为了创建rpm包,你将需要源码包(通常为一个压缩文件,其内也包含了SPEC文件)。 SPEC文件包含以下说明:如何创建rpm包,包内包含的文件,安装的路径。 RPM将展现创建过程中的测试过程。 执行spec文件中的prep块中定义的系统命令和宏命令。 检测文件列表的内容 执行spec文件中的build块中定义的系统命令和宏命令。在这一步中文件列表中的宏命令也被执行。 创建二进制包文件 创建源码包文件 一旦RPM执行了上述步骤,将创建二进制的包文件和源码包文件。 二进制包文件包含所有安装或卸载包的额外信息的源文件。 通常安装包的所有...
Lu_Castiel 发布于 5天前 阅读 948 评论 7 点赞 2

使用Hutool爬取开源中国的开源资讯

## 介绍 为了演示Hutool-http的http请求功能,因此这个栗子用红薯家的开源资讯开刀,在此做个简单的Demo。 ## 开始 ### 分析页面 1. 打开红薯家的主页,我们找到最显眼的开源资讯模块,然后点击“更多”,打开“开源资讯”板块。 ![](https://static.oschina.net/uploads/img/201711/19204312_zJD8.png) 2. 打开F12调试器,点击快捷键F12打开Chrome的调试器,点击“Network”选项卡,然后在页面上点击“全部资讯”。 ![](https://static.oschina.net/uploads/img/201711/19204634_1ahd.png) ![](https://static.oschina.net/uploads/img/201711/19204743_eJBy.png) 3. 由于红薯家的列表页是通过下拉翻页的,因此下拉到底部会触发第二页的加载,此时我们下拉到底部,然后观察调试器中是否有新的请求出现。如图,我们发现第二个请求是列表页的第二页。 ![](https://static.oschina.net/uploads/img/201711/19205000_V7Sj.png) 4. 我们打开这个请求地址,可以看到纯纯的内容。红框所指地址为第二页的内容,很明显p参数代表了页码page。 ![](https://static.oschina.net/uploads/img/201711/19205156_dTb8.png) 5. 我们右键点击后查看源码,可以看到源码。 ![](https://static...
路小磊 发布于 5天前 阅读 2080 评论 19 点赞 6

Java的SPI机制分析

Java SPI
宸明 发布于 6天前 阅读 2725 评论 4 点赞 2

Tomcat7 自动加载类及检测文件变动原理

在一般的web应用开发里通常会使用开发工具(如Eclipse、IntelJ)集成tomcat,这样可以将web工程项目直接发布到tomcat中,然后一键启动。经常遇到的一种情况是直接修改一个类的源文件,此时开发工具会直接将编译后的class文件发布到tomcat的web工程里,但如果tomcat没有配置应用的自动加载功能的话,当前JVM中运行的class还是源文件修改之前编译好的class文件。可以重启tomcat来加载新的class文件,但这样做需要再手工点击一次【restart】,为了能够在应用中即时看到java文件修改之后的执行情况,可以在tomcat中将应用配置成自动加载模式,其配置很简单,只要在配置文件的Context节点中加上一个reloadable属性为true即可,示例如下: <Context path="/HelloWorld" docBase="C:/apps/apache-tomcat/DeployedApps/HelloWorld" reloadable="true"/> 如果你的开发工具已经集成了tomcat的话应该会有一个操作界面配置来代替手工添加文件信息,如Eclipse中是如下界面来配置的: 此时需要把【Auto reloading enabled】前面的复选框钩上。其背后的原理实际也是在server.xml文件中加上Context节点的描述: <Context docBase="test" path="/test" reloadable="true"/> 这样Tomcat就会监...
开源中国首席哲♂学家 发布于 1周前 阅读 1262 评论 1 点赞 2

一致性hash在DynamoDB上的应用

Dynamo是Amazon提供的一个分布式存储NoSQL 数据库,它采用去中心化、松散耦合的方式,组成一个支持高度扩展的Key/Value 数据库,本篇我们着重分析一下,它是如何采用采用一致性hash而达到可高度扩展的。
wier 发布于 1周前 阅读 953 评论 1 点赞 1

疯狂Activiti6.0连载(15)DMN规则匹配表达式

Activiti DMN 规则引擎 规则匹配 表达式
杨大仙的程序空间 发布于 1周前 阅读 1409 评论 2 点赞 1

Jenkins+SVN+Maven自动化部署环境搭建

## 前言 因今年公司新产品线较多,为了降低耦合,达到业务分离、重用,提高内部开发效率的目的,采用了基于服务组件、前后端分离的架构体系。与之前传统单应用架构相比,系统部署、配置更加复杂,为了能够频繁地将软件的最新版本,及时、持续地交付给测试团队及质量控制团队,以供评审,所以引入持续集成工具Jenkins,从而实现公司新产品持续集成,自动化部署。 ## 环境准备 - 操作系统:Windows10 - Java环境:下载 jdk-1.8.0-131-X64.zip,配置Java环境变量(参考:http://jingyan.baidu.com/article/02027811629b941bcc9ce521.html) - Maven环境:下载apache-maven-3.5.2-bin.zip,配置Maven环境变量(参考:http://wiki.jikexueyuan.com/project/maven/environment-setup.html) - Tomcat环境:下载apache-tomcat-8.5.20-windows-x64.zip,配置Tomcat环境变量(参考:http://jingyan.baidu.com/article/8065f87fcc0f182330249841.html) - Jenkins环境:下载Jenkins2.73.2 for Windows ## 安装Jenkins 1. 运行下载好的Jenkins安装包jenkins.msi,选择安装路径,点击”安装“,等待安装完成; ![11](https://gitee.com/lsjcoder/img/raw/master/%E4%BB%A3%E7%A0%81%E7%...
老司机带你撸代码 发布于 1周前 阅读 3171 评论 12 点赞 12

用vue做一个酷炫的menu

写在前面         最近看到一个非常酷炫的menu插件,一直想把它鼓捣成vue形式,谁让我是vue的死灰粉呢,如果这都不算爱😔。😆开个小玩耍,我们一起来探索黑魔法吧。观看本教程的读者需要具备一定的vue和css3的知识. 本文结构 1.效果演示 2.使用方法介绍 3.关键步骤讲解 正文 1.效果演示   pic_1   pic2   pic_3      在线演示live demo 2.使用介绍         项目地址:github.com/MingSeng-W/vue-bloom-menu,clone项目到本地        a. 首先在单文件组件里引入menu组件,导入common文件夹stylus里的menuConfig.stylus.        b.配置相应的参数             可选参数             * radius:default为100px,item距离menu的button的距离。             *  startAngle:defaut为0,item开始的角度,以时钟3点钟方向记为0,然后顺时针方向为递增方向。            *  endAngle:default为315,最后一个item的角度。            *  itemNum:default为8             *  animationDuration:default为0.5s,每个item动画的执行时间             *  itemAnimationDelay:d...
MingSeng-W 发布于 2周前 阅读 5582 评论 18 点赞 17

使用Spring Cloud Sleuth实现链路监控

作者:社区 徐靖峰 原文地址:http://www.spring4all.com/article/156 在服务比较少的年代,一个系统的接口响应缓慢通常能够迅速被发现,但如今的微服务模块,大多具有规模大,依赖关系复杂等特性,错综复杂的网状结构使得我们不容易定位到某一个执行缓慢的接口。分布式的服务跟踪组件就是为了解决这一个问题。其次,它解决了另一个难题,在没有它之前,我们客户会一直询问:你们的系统有监控吗?你们的系统有监控吗?你们的系统有监控吗?现在,谢天谢地,他们终于不问了。是有点玩笑的成分,但可以肯定的一点是,实现全链路监控是保证系统健壮性的关键因子。 介绍Spring Cloud Sleuth和Zipkin的文章在网上其实并不少,所以我打算就我目前的系统来探讨一下,如何实现链路监控。全链路监控这个词意味着只要是不同系统模块之间的调用都应当被监控,这就包括了如下几种常用的交互方式: 1 Http协议,如RestTemplate,Feign,Okhttp3,HttpClient... 2 Rpc远程调用,如Motan,Dubbo,GRPC... 3 分布式Event,如RabbitMq,Kafka... 而我们项目目前混合使用了Http协议,Motan Rpc协议,所以本篇文章会着墨于实现这两块的链路监控。 ## 项目结构 ![项目结构](http://ov0zuistv.bk...
SpringForAll 发布于 2周前 阅读 2459 评论 2 点赞 3

Kubernetes在vivo容器云平台中的应用与实践

本博文是我参加2017/11/04 K8S技术社区深圳站Meetup分享的PPT内容,主要介绍Kubernetes在vivo容器云平台的应用与实践,重点介绍我们跟业界大多数方案不一样的地方,包括整体架构(HA/Security)、定制化的应用滚动方案、Ingress方案及部署实践、容器网络方案以及在TaaS方向的探索与实践等等。
WaltonWang 发布于 2周前 阅读 1958 评论 15 点赞 7

放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结

Spring For All 社区作者: 纯洁,原文地址 [传送门](http://spring4all.com/article/144) 上次写了一篇文章叫[Spring Cloud在国内中小型公司能用起来吗?](https://mp.weixin.qq.com/s/vnWXpH5pv-FAzLZfbgTGvg)介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇。其实我们在这条路上已经走了一年多,从16年初到现在。在使用Spring Cloud之前我们对微服务实践是没有太多的体会和经验的。从最初的开源软件[云收藏](https://github.com/cloudfavorites/favorites-web)来熟悉Spring Boot,到项目中的慢慢使用,再到最后全面拥抱Spring Cloud。这篇文章就给大家介绍一下我们使用Spring Boot/Cloud一年多的经验。 在开始之前我们先介绍一下几个概念,什么是微服务,它的特点是什么? Spring Boot/Cloud都做了那些事情?他们三者之间又有什么联系? ## 技术背景 ### 什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“[Microservices](http://martinfowler.com/articles/microservices.html)”。 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的...
SpringForAll 发布于 2周前 阅读 4066 评论 23 点赞 17

用 Electron 打造 Win/Mac 应用,从「代码」到可下载的「安装包」,可能比你想得麻烦一点

我们能从很多地方学习到怎么起一个 Electron 项目,有些还会介绍怎么打包或构建你的代码,但距离「真正地发行一款 Electron 产品」这一目标,还有很多工作需要做... 这是 Electron 系列文章的第二篇,这一篇文章将和大家分享我是怎么去构建**自动化的 Electron 开发构建工程**的,说白了,就是**怎么把敲的代码变成一个用户可以下载安装的包**,当然随着之后应用复杂度的提升和技术再选型,工程体系可能随时会重构或演进,但至少可以给大家一些参考,欢迎留言交流。
Stinson_Zhao 发布于 2周前 阅读 3014 评论 9 点赞 13

Storm消息处理可靠性保证

http://storm.apache.org/releases/0.9.7/Guaranteeing-message-processing.html 本文是对Storm官方文档的翻译并结合了自己的一些理解。最后发现网络上已经有了很多的翻译版本,自己翻译收获还是不一样的。 文中可能会有翻译理解不到位的情况,还望不吝指教。另外在阅读本文前须要对storm的一些基本概念有所了解,包括spout,bolt,tuple,拓扑等
囚兔 发布于 3周前 阅读 984

lvm讲解、磁盘故障小案例

### lvm讲解 ``` DiskA 分区分别为Physical Volume1、Physical Volume2;DiskB 分区为Physical Volume3,在这里Physical volume1,2,3就是磁盘分区 也就是物理卷;然后由单个或多个物理卷组成物理卷组,最后在物理卷的基础上划分出逻辑卷,而逻辑卷格式化后挂载上就可以使用了 ``` #### 准备磁盘分区阶段 - fdisk /dev/sdb - 创建三个新分区,大小分别为2G - 改变分区类型为8e(fdisk中使用t更改类型) 1. 创建新分区 ``` //这里我创建了5个2G的分区,多出的2个留待测试用 [root@24centos7-01 /]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 //创建第一个分区 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (2048-20971519,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+2000M 分区 1 已设置为 Linux 类型,大小设为 2 GiB //创建第二个分区 命令(输入 m 获取帮助):n Partition type: p primary (1 primary, 0 ext...
vitus_feng 发布于 3周前 阅读 1283 评论 4 点赞 2

深度解读Tomcat中的NIO模型

I/O复用模型,是同步非阻塞,这里的非阻塞是指I/O读写,对应的是recvfrom操作,因为数据报文已经准备好,无需阻塞。说它是同步,是因为,这个执行是在一个线程里面执行的。有时候,还会说它又是阻塞的,实际上是指阻塞在select上面,必须等到读就绪、写就绪等网络事件。
新栋BOOK 发布于 3周前 阅读 2710 评论 11 点赞 12

Java混淆工具 ProGuard之初体验

**1.混淆工具版本** 本文使用的是ProGuard这一款Java代码混淆工具。 因为在我们实际的开发工作中,有些程序包含了公司核心产品的代码,所以为了保护自身的知识产权,避免程序包不小心外流出去,我们有必要进行一些保护措施,在程序开发完之后,需要将程序代码进行混淆。 本文使用的是ProGuard v5.3.3版本。 下载地址:http://www.jb51.net/softs/242707.html **2.混淆工具安装步骤** 2.1下载后的文件是一个压缩包: ![输入图片说明](https://static.oschina.net/uploads/img/201711/05141208_UU6w.png "在这里输入图片标题") 2.2 解压压缩包 ![输入图片说明](https://static.oschina.net/uploads/img/201711/05141219_crA0.png "在这里输入图片标题") **3.混淆工具使用步骤** 3.1 解压后,执行 bin目录下的proguardgui.bat ![输入图片说明](https://static.oschina.net/uploads/img/201711/05141328_A5vq.png "在这里输入图片标题") 执行proguardgui.bat后如图: ![输入图片说明](https://static.oschina.net/uploads/img/201711/05141356_BC65.png "在这里输入图片标题") 注意:执行proguardgui.bat后会出现一个cmd命令框,不要关闭,最小化即可。 3.2 点击左侧菜单栏中的...
godcvcv 发布于 3周前 阅读 2857 评论 9 点赞 2

Angular 5 快速入门与提高

**一、概述** 尽管被称为`Angular5`,实际上它只是这个诞生于2012年的前端框架的的第四个版本: ![angular history](http://xc.hubwiz.com/class/59de66862d4f22811dc6b2f7/img/angular-history.png) 看起来差不多半年就发布一个新版本,不过实际上从重写的版本`2`开始,开发 接口与核心思想就稳定下来了,并基本保持着与前序版本的兼容性。 在`5`这个新的版本中,`Angular`团队将改进重点放在以下特性方面: - 更易于构建渐进式`Web`应用 —— __P__rogressive __W__eb __A__pp - 使用构建优化器剔除无用代码,以获得更小的应用、更快的网络加载时间 - 使物化设计组件兼容服务端渲染 `PWA`是`Google`提出的一个标准,旨在让Web应用在移动终端上获得媲美原生 应用的用户体验。一个`PWA`应用主要利用`Service Worker`和浏览器缓存来 提省交互体验,它不仅可以直接部署在手机桌面,而且可以离线应用: ![pwa](http://xc.hubwiz.com/class/59de66862d4f22811dc6b2f7/img/pwa.png) **二、引入angular环境** `Angular`推荐使用`TypeScript`来开发应用,这要求使用一个在线 编译器(`JIT`)实时编译代码,或者在开发期采用预编译器(`AOT`)提前编译代码。 为了避免这个繁琐的过程影...
笔阁 发布于 3周前 阅读 2398 评论 11 点赞 4
顶部