开源中国

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

It appears you’re using an unsupported browser

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

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

Java9 新特性 详解

1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方法的改进(在接口中 jdk7 只能声明全名常量和抽象方法 jdk8 添加了静态方法和默认方法 jdk9添加了私有方法) 6.钻石操作符升级 可以有{} 7.异常处理try升级 8.下划线标识符命名的限制 _ 不允许了 9.String底层存储结构的变更(char数组变成byte字节数组) 10.增强了Stream API(在java8基础上,新增加4个方法) 11.jdk9 中引入httpClient api 代替原有的HttpURLConnection
木九天 发布于 8小时前 阅读 184 评论 4 点赞 3

python爬虫学习——urllib、urllib2库的使用

1.urllib2库的使用示例 >>> import urllib2 >>> response=urllib2.urlopen('http://www.baidu.com')#获取网页信息 >>> print response.read()#打印出网页信息 首先我们调用的是urllib2库里面的urlopen方法,传入一个URL,这个网址是百度首页,协议是HTTP协议,当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,只是代表了一种访问控制协议。 2.分析程序信息 (1)第一句程序是导入urllib2库 (2)第二句我们主要看一下urlopen这个函数 作用:打开一个网页信息 格式: urlopen(url,data,timeout) 参数:三个参数,一个必传参数URL,两个参数(date,timeout) 第一个参数url即为URL 第二个参数data是访问URL时要传送的数据 第三个timeout是设置超时时间 第二三个参数是可以不传送的,data默认为空None,timeout默为 socket._GLOBAL_DEFAULT_TIMEOUT 第一个参数URL是必须要传送的,在这个例子里面我们传送了百度的URL,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。 (3)第三句是把urlopen获取到的网页信息,打印出来(response对象有一个read方法,可以返回获取到的网页内容。) response.read() response对象有一个read方法,可以返回获取到的网...
十年磨一剑3344 发布于 8小时前 阅读 46

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

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

区块链(Blockchain)简单介绍

# 区块链(Blockchain)简单介绍 ## 概要 ​ 此项目旨在了解区块链,包括概念、原理及使用。 ## 区块链概念及原理 - 区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。 - 区块链本质上是一种去中心化的分布式数据库。任何人只要架设自己的服务器,接入区块链网络,都可以成为这个庞大网络的一个节点。 ![区块链网络结构图](https://mmbiz.qpic.cn/mmbiz_jpg/NtO5sialJZGq6LnNSp2UwsFYBibro39eU0k2cjQBId7t3BQ7IZvXsJeIdwhkENI3XyuhC4jaefCXHLILewj7Dddg/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1) - 区块链本质是数据库,存储的基本单元为“区块(Block)”,一个区块分为两大部分: 1. **区块头** 区块头里面存储着区块的头信息,包含上一个区块的哈希值(PreHash),本区块体的哈希值(Hash),以及时间戳(Timestamp)等等。 2. **区块体** - 区块体存储着这个区块的详细数据(Data),这个数据包含若干行记录,可以是交易信息,也可以是其他某种信息。 - 区块链就是由许许多多的区块所组成的链式结构 - MD5是典型的哈希算法,可以把一串任意长度的明文转化成一串固...
程序员狗蛋 发布于 9小时前 阅读 81 评论 1

服务注册中心,Eureka与Zookeeper比较

1. 前言     服务注册中心,给客户端提供可供调用的服务列表,客户端在进行远程服务调用时,根据服务列表然后选择服务提供方的服务地址进行服务调用。服务注册中心在分布式系统中大量应用,是分布式系统中不可或缺的组件,例如rocketmq的name server,hdfs中的namenode,dubbo中的zk注册中心,spring cloud中的服务注册中心eureka。     在spring cloud中,除了可以使用eureka作为注册中心外,还可以通过配置的方式使用zookeeper作为注册中心。既然这样,我们该如何选择注册中心的实现呢?    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。 2. Zookeeper保证CP     当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 12...
细肉云吞 发布于 11小时前 阅读 71 评论 1

Java数据结构和算法(六)——前缀、中缀、后缀表达式

前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗?以及数据结构与本篇博客的主题前缀、中缀、后缀表达式有什么关系呢? 1、人如何解析算术表达式   如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的:   ①、求值 3+4-5      这个表达式,我们在看到3+4后都不能直接计算3+4的值,知道看到4后面的 - 号,因为减号的优先级和前面的加号一样,所以可以计算3+4的值了,如果4后面是 * 或者 /,那么就要在乘除过后才能做加法操作,比如:   ②、求值 3+4*5        这个不能先求3+4的值,因为4后面的*运算级别比前面的+高。通过这两个表达式的说明,我们可以总结解析表达式的时候遵循的几条规则:   ①、从左到右读取算式。   ②、已经读到了可以计算值的两个操作数和一个操作符时,可以计算,并用计算结果代替那两个操作数和一个操作符。   ③、继续这个过程,从左到右,能算就算,直到表达式的结尾。 2、计算机如何解析算术表达式   对于前面的表达式 3+4-5,我...
architect刘源源 发布于 11小时前 阅读 47 评论 1

大话深度残差网络(DRN)ResNet网络原理

本文主要介绍深度残差网络的发展背景,以及讲解残差网络模型ResNet的技术原理
雪饼 发布于 11小时前 阅读 23

安卓设计师不容错过的15款实用UI界面设计工具

最近刮起了一股“养蛙儿子”的风潮。独特的UI设计、萌萌的画风和简洁的用户体验吸引了大批的用户。在不少人直呼“哇,我的蛙儿子好可爱,好萌”的背后,我们可以看到一个高质量的UI设计对于提高应用下载量有着非常重要的作用。在此,小编为大家整理了几款好用的安卓UI界面设计工具,希望能为大家在设计Android UI界面的时候有所帮助。 1. Android Developers (Free)   优势:全面的Material design设计指南、资源 作为安卓系统开发的官方网站,Android 采用以纸墨为灵感的新设计理念,提供令人倍感心安的触感。基于Material design, Android developer提供了十分全面的移动应用UI设计指南,包括图标,颜色工具,运动,样式,布局,组件,模式等,为最新的安卓界面设计提供了方向。其目标是”为用户创建一种视觉语言,将优秀设计的经典原则与技术和科学的创新和可能性相结合。” 2. Mockplus (Free-$199/year) 系统:Mac & Windows 优势:快速Android界面原型设计 Mockplus是一款简单快速的Android/iOS手机界面原型设计工具,拥有丰富全面的Android手机应用界面设计组件和图标库。大到安卓应用界面设计模板库,小到极具安卓特色的图标、按钮,使得Mockplus在移动应用原...
mo311 发布于 12小时前 阅读 39

自己手写一个SpringMVC框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课.
liugh_develop 发布于 1天前 阅读 2948 评论 15 点赞 19 打赏 1

让互联网更快:新一代QUIC协议在腾讯的技术实践分享

本文主要介绍 QUIC 协议在腾讯内部及腾讯云上的实践和性能优化,新一代的互联网协议需要大家一起努力推动,你准备好了吗?
JackJiang- 发布于 1天前 阅读 361 评论 2 点赞 1

以太坊·单机多实例演示

这是一篇演示如何使用一台服务器,运行多个以太坊客户端,并且将节点互联,完成两个节点之间的转账操作。
neo-chen 发布于 1天前 阅读 333

利用K8S技术栈打造个人私有云(连载之:基础镜像制作与实验)

![封面图片](http://upload-images.jianshu.io/upload_images/9824247-904f1ca7a1821eb8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) --- 【利用K8S技术栈打造个人私有云系列文章目录】 - [利用K8S技术栈打造个人私有云(连载之:初章) ](https://www.jianshu.com/p/9bc87b5380e8) - [利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)](https://www.jianshu.com/p/7d1fb03b8925) - [利用K8S技术栈打造个人私有云(连载之:K8S环境理解和练手)](https://www.jianshu.com/p/5b0cd99e0332) - [利用K8S技术栈打造个人私有云(连载之:基础镜像制作与实验)](https://www.jianshu.com/p/e38c05cf076a) - 利用K8S技术栈打造个人私有云(连载之:资源控制研究)(Coming Soon...) - 利用K8S技术栈打造个人私有云(连载之:私有云客户端打造)(Coming Soon...) - 利用K8S技术栈打造个人私有云(连载之:总结与升华)(Coming Soon...) --- 任何一家云主机厂商提供给用户的主机功能其实讲白了就是一个操作系统基础镜像的运行实例。因此本篇博文将讲解如何在本地构建一个带ssh组件的centos底包镜像并上传到docker hub上供下载使用。 --- ## docker hub注册 ...
hansonwang 发布于 2天前 阅读 170 评论 2

以太坊·Rinkeby 测试网络

连接测试网络,启动 "Ethereum Wallet",主菜单-Develop-Network,选择 "Rinkeby - Test network"。 如果这个菜单是灰色的,可以你在本地运行过 geth,解决方法如下:
neo-chen 发布于 2天前 阅读 233

Node.JS从相识到相知--徒手搭建简易版json服务

保持对技术的热忱
洛山红茶 发布于 2天前 阅读 215

开源巨献:2017 年 Google 开源了这些超赞的项目

春节小长假,走亲访友之余,还可以利用一些零碎的时间收集学习资料,给自己充充电,好在 2018 年成为更优秀的自己。我们知道在开源和贡献开源方面,Google 一直是行业的典范。2017 年它开源了哪些优秀的软件,有哪些值得我们借鉴学习呢?让我们一起来看下: 1、硬件加速的机器学习 JavaScript 库 DeepLearn.js DeepLearn.js 是 Google 推出的一个可用于机器智能并加速 WebGL 的开源 JavaScript 库,完全在浏览器中运行,不需要安装,不需要后端处理。 2、大型微服务系统管理工具 Istio Istio 是一个由谷歌、IBM 与 Lyft 共同开发的开源项目,旨在提供一种统一化的微服务连接、安全保障、管理与监控方式。Istio 项目能够为微服务架构提供流量管理机制,同时亦为其它增值功能(包括安全性、监控、路由、连接管理与策略等)创造了基础。这款软件利用久经考验的 Lyft Envoy 代理进行构建,可在无需对应用程序代码作出任何发动的前提下实现可视性与控制能力。Istio 项目是一款强大的工具,可帮助 CTO/CIO 们立足企业内部实施整体性安全、政策与合规性要求。 3、可自动生成命令行接口 Python Fire Python Fire 是 Google 开源的一个可从任何 Python 代码自动生成命令行接口(...
编辑部的故事 发布于 3天前 阅读 4165 评论 3 点赞 2

SpringBoot笔记3——控制器知识点总结

想了想有必要把控制器的一些内容放在系列里一起写一下,虽然之前springMVC的博文中已经介绍了很多有关Controller的东西,但是现在既然希望大家全面使用springboot,所以把这部分内容也放在本系列中总结概括一下吧。
HappyBKs 发布于 3天前 阅读 455

JDBC常见面试题

以下我是归纳的JDBC知识点图:     图上的知识点都可以在我其他的文章内找到相应内容。 JDBC常见面试题 JDBC操作数据库的步骤 ? JDBC操作数据库的步骤 ? 注册数据库驱动。 建立数据库连接。 创建一个Statement。 执行SQL语句。 处理结果集。 关闭数据库连接 代码如下: Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { /* * 加载驱动有两种方式 * * 1:会导致驱动会注册两次,过度依赖于mysql的api,脱离的mysql的开发包,程序则无法编译 * 2:驱动只会加载一次,不需要依赖具体的驱动,灵活性高 * * 我们一般都是使用第二种方式 * */ //1. //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //2. Class.forName("com.mysql.jdbc.Driver"); //获取与数据库连接的对象-Connetcion connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zhongfucheng", "root", "r...
Java3y 发布于 3天前 阅读 330 评论 4 点赞 3

MySQL数据库规范及解读

一、基础规范 ------ > 第一条:必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高 > 第二条:必须使用utf8(utf8mb4)字符集 解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4是utf8的超集,由于近年移动设备的增多,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4 > 第三条:数据表、数据字段必须加入中文注释 解读:N年后谁会知道这个a1,a2,a3字段是干嘛的 > 第四条:禁止使用存储过程、视图、触发器、Event 解读:*高并发**大数据**的互联网业务,**架构**设计思路是“解放**数据库**CPU,将计算转移到服务层”*,并发量大的情况下,这些功能很可能将数据库拖死,*业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”*。数据库擅长存储与索引,CPU计算还是上移吧 > 第五条:禁止存储大文件或者大照片 解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好 二、命名规范 ------ > 第一条:只允许*使用内网域名,而不是ip连接数据库* 解读:虽然IP访问更快,域名访问需要内网dns,但是对于大数据库的扩展和迁库考虑,域名更好 > 第...
szj1006 发布于 3天前 阅读 376 评论 3 点赞 2

iOS后台唤醒实战:微信收款到账语音提醒技术总结

本文借此总结了iOS平台上的APP后台唤醒和语音合成、播放等一系列技术开发过程中遇到的坑和小技巧,希望与您分享。
JackJiang- 发布于 3天前 阅读 257 点赞 2

Linux配置开机自启动执行脚本的两种方法

开机要启动的脚本qidong.sh [root@c69-01 scripts]# vim /server/scripts/qidong.sh [root@c69-01 scripts]# cat /server/scripts/qidong.sh #!/bin/bash /bin/echo $(/bin/date +%F_%T) >> /tmp/qidong.log 方法一:修改/etc/rc.local /etc/rc.local,该文件为链接文件 [root@c69-01 ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Feb 5 10:03 /etc/rc.local -> rc.d/rc.local 修改/etc/rc.local文件 [root@c69-01 scripts]# tail -n 1 /etc/rc.local /bin/bash /server/scripts/qidong.sh >/dev/null 2>/dev/null 重启系统,查看结果 [root@c69-01 ~]# cat /tmp/qidong.log 2018-02-19_23:30:56 已开机自启动该脚本 方法二:chkconfig管理 删除掉方法一的配置 [root@c69-01 ~]# vim /etc/init.d/test #!/bin/bash # chkconfig: 3 88 88 /bin/bash /server/scripts/qidong.sh >/dev/null 2>/dev/null [root@c69-01 ~]# chmod +x /etc/init.d/test 添加到chkconfig,开机自启动  [root@c69-01 ~]# chkconfig --add test [root@c69-01 ~]# chkconfig --list test test 0:off 1:off 2:off 3:on 4:off 5:off 6:off 重启系统,查看结果 [root@c69-...
Linux_yk 发布于 3天前 阅读 1478 评论 6 点赞 3

拯救小容量,6 款开源图片无损优化工具推荐

科技在进步,相机、手机拍出来的照片越来越清晰也越来越大时,容量小一点的手机、磁盘开始有些吃紧了。目前其实有很多工具可进行低损,甚至是无损优化、压缩图片,能帮你保存更多的照片。 1、OptiPNG OptiPNG 是一个专门的 PNG 图像优化工具,可将图像文件重新压缩为更小尺寸,且不会丢失任何信息。 OptiPNG 还可将其它格式(BMP、GIF、PNM 和 TIFF )转换为优化的 PNG 格式,并执行 PNG 完整性检查和校正。  2、Jpegoptim Jpegoptim 是一个专门用来优化 JPEG 文件的工具,提供无损的优化(基于哈夫曼表),同时也可设置质量因子实现的有损优化。 3、Leanify Leanify 是一个轻量级的文件无损压缩器/优化器。它会删除不必要的数据(调试信息、注释、元数据等),并重新压缩文件以减小文件大小。 Leanify 支持 jpeg、svg、png 等图片格式,完全无损,不会降低图像质量。此外,还支持递归缩减,以及其他非图片格式,包括压缩格式、文档格式等。无外部依赖,跨平台,支持 Windows、Linux 和 Mac 。能够通过其数据而不是名称来识别文件格式。 4、Pngcrush Pngcrush 是一个非常实用的图像优化命令行工具,可用来批量压缩 PNG 格式图片大小。它主要是通过尝试各种压缩级别和 PN...
编辑部的故事 发布于 4天前 阅读 1729 评论 4 点赞 1

Java9 新特性 详解

1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方法的改进(在接口中 jdk7 只能声明全名常量和抽象方法 jdk8 添加了静态方法和默认方法 jdk9添加了私有方法) 6.钻石操作符升级 可以有{} 7.异常处理try升级 8.下划线标识符命名的限制 _ 不允许了 9.String底层存储结构的变更(char数组变成byte字节数组) 10.增强了Stream API(在java8基础上,新增加4个方法) 11.jdk9 中引入httpClient api 代替原有的HttpURLConnection
木九天 发布于 8小时前 阅读 184 评论 4 点赞 3

区块链(Blockchain)简单介绍

# 区块链(Blockchain)简单介绍 ## 概要 ​ 此项目旨在了解区块链,包括概念、原理及使用。 ## 区块链概念及原理 - 区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。 - 区块链本质上是一种去中心化的分布式数据库。任何人只要架设自己的服务器,接入区块链网络,都可以成为这个庞大网络的一个节点。 ![区块链网络结构图](https://mmbiz.qpic.cn/mmbiz_jpg/NtO5sialJZGq6LnNSp2UwsFYBibro39eU0k2cjQBId7t3BQ7IZvXsJeIdwhkENI3XyuhC4jaefCXHLILewj7Dddg/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1) - 区块链本质是数据库,存储的基本单元为“区块(Block)”,一个区块分为两大部分: 1. **区块头** 区块头里面存储着区块的头信息,包含上一个区块的哈希值(PreHash),本区块体的哈希值(Hash),以及时间戳(Timestamp)等等。 2. **区块体** - 区块体存储着这个区块的详细数据(Data),这个数据包含若干行记录,可以是交易信息,也可以是其他某种信息。 - 区块链就是由许许多多的区块所组成的链式结构 - MD5是典型的哈希算法,可以把一串任意长度的明文转化成一串固...
程序员狗蛋 发布于 9小时前 阅读 81 评论 1

服务注册中心,Eureka与Zookeeper比较

1. 前言     服务注册中心,给客户端提供可供调用的服务列表,客户端在进行远程服务调用时,根据服务列表然后选择服务提供方的服务地址进行服务调用。服务注册中心在分布式系统中大量应用,是分布式系统中不可或缺的组件,例如rocketmq的name server,hdfs中的namenode,dubbo中的zk注册中心,spring cloud中的服务注册中心eureka。     在spring cloud中,除了可以使用eureka作为注册中心外,还可以通过配置的方式使用zookeeper作为注册中心。既然这样,我们该如何选择注册中心的实现呢?    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。 2. Zookeeper保证CP     当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 12...
细肉云吞 发布于 11小时前 阅读 71 评论 1

Tomcat源码分析之 doGet方法(二)

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。 在第一讲我们介绍了当一个请求到达 Servlet 时,首先将 ServletRequest 和 ServletResponse 转化为 HttpServletRequest 和 HttpServletResponse,然后获得 HTTP 请求的方法类型,最后根据不同的方法类型调用不同的方法。如了解更多,请阅读Tomcat源码分析之 doGet方法(一)。 第一讲我们重点搞明白了当一个请求到达 Servlet 后发生的所有事情,那么这个请求在到达 Servlet 之前发生了什么呢? 在请求到达 Servlet 之前发生了很多很多事情,这也是我们本系列博客要探讨的主题。我们本讲主要探讨的是在到达 Servlet 前,该请求会经过一系列的过滤器 Filter,Tomcat 的过滤器机制是如何实现的呢?  1 目标 深入理解Tomcat的过滤器机制,理解ApplicationFilterChain 内部实现原理。 2 分析方法 根据上一讲的堆栈信息,结合 Intellij Idea 的堆栈视图、断点、单步调试等手段分析源码。 4. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 5.at org.apache.catalina.cor...
算法与编程之美 发布于 6小时前 阅读 64 评论 3

关于程序员如何赚点小钱

技术人员很苦逼,如何赚点钱,积累点钱,首先要学会记账,开源节流,钱都没有,你投资个毛线. 首先需要明白资产配置,学会举一反三,融会贯通,放在我们生活中,其实有很多项目是可以投资的,比如 养殖,种植,搞点小生意等等. 资产配置: 1. 低风险投资 2. 中等风险投资 3. 高风险投资 故事1:     我们家那边的小县城,刚发展起来,其实有很多生意都是没有的,随着小县城人们的消费能力提高,很多大城市的东西在慢慢加入,你会发现,网吧,超市,健身房,游泳馆等等在慢慢的崛起,在一线城市打拼的好处就是,你的眼界和格局,视野会不一样,但是缺少一颗敢于冒险的心,害怕承担风险的话,建议你好好啃死工资.     有时候你刚做,但是随着做的人越来越多,虽然变成了红海,但是不要害怕,敢和你竞争的对手,你要让他变成你的食物的决心,要有站在顶端的勇气,红海也能杀出蓝海,不一样的市场,比如你搞一个生意,赚钱后很多人都来搞,这时候应该不搞了,可以转变批发材料,批发设备给他们,哈哈,赚他们的钱.     其实说了那么多,道理很简单,就是复制那些已经发生过的事情,看看吧,当当网,滴滴打车,好多软件,设备都是先复制的其它人的. 故事2:     外...
冰雪情缘l 发布于 22小时前 阅读 57 评论 3 点赞 1

python爬虫学习——urllib、urllib2库的使用

1.urllib2库的使用示例 >>> import urllib2 >>> response=urllib2.urlopen('http://www.baidu.com')#获取网页信息 >>> print response.read()#打印出网页信息 首先我们调用的是urllib2库里面的urlopen方法,传入一个URL,这个网址是百度首页,协议是HTTP协议,当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,只是代表了一种访问控制协议。 2.分析程序信息 (1)第一句程序是导入urllib2库 (2)第二句我们主要看一下urlopen这个函数 作用:打开一个网页信息 格式: urlopen(url,data,timeout) 参数:三个参数,一个必传参数URL,两个参数(date,timeout) 第一个参数url即为URL 第二个参数data是访问URL时要传送的数据 第三个timeout是设置超时时间 第二三个参数是可以不传送的,data默认为空None,timeout默为 socket._GLOBAL_DEFAULT_TIMEOUT 第一个参数URL是必须要传送的,在这个例子里面我们传送了百度的URL,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。 (3)第三句是把urlopen获取到的网页信息,打印出来(response对象有一个read方法,可以返回获取到的网页内容。) response.read() response对象有一个read方法,可以返回获取到的网...
十年磨一剑3344 发布于 8小时前 阅读 46

Java数据结构和算法(六)——前缀、中缀、后缀表达式

前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗?以及数据结构与本篇博客的主题前缀、中缀、后缀表达式有什么关系呢? 1、人如何解析算术表达式   如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的:   ①、求值 3+4-5      这个表达式,我们在看到3+4后都不能直接计算3+4的值,知道看到4后面的 - 号,因为减号的优先级和前面的加号一样,所以可以计算3+4的值了,如果4后面是 * 或者 /,那么就要在乘除过后才能做加法操作,比如:   ②、求值 3+4*5        这个不能先求3+4的值,因为4后面的*运算级别比前面的+高。通过这两个表达式的说明,我们可以总结解析表达式的时候遵循的几条规则:   ①、从左到右读取算式。   ②、已经读到了可以计算值的两个操作数和一个操作符时,可以计算,并用计算结果代替那两个操作数和一个操作符。   ③、继续这个过程,从左到右,能算就算,直到表达式的结尾。 2、计算机如何解析算术表达式   对于前面的表达式 3+4-5,我...
architect刘源源 发布于 11小时前 阅读 47 评论 1

安卓设计师不容错过的15款实用UI界面设计工具

最近刮起了一股“养蛙儿子”的风潮。独特的UI设计、萌萌的画风和简洁的用户体验吸引了大批的用户。在不少人直呼“哇,我的蛙儿子好可爱,好萌”的背后,我们可以看到一个高质量的UI设计对于提高应用下载量有着非常重要的作用。在此,小编为大家整理了几款好用的安卓UI界面设计工具,希望能为大家在设计Android UI界面的时候有所帮助。 1. Android Developers (Free)   优势:全面的Material design设计指南、资源 作为安卓系统开发的官方网站,Android 采用以纸墨为灵感的新设计理念,提供令人倍感心安的触感。基于Material design, Android developer提供了十分全面的移动应用UI设计指南,包括图标,颜色工具,运动,样式,布局,组件,模式等,为最新的安卓界面设计提供了方向。其目标是”为用户创建一种视觉语言,将优秀设计的经典原则与技术和科学的创新和可能性相结合。” 2. Mockplus (Free-$199/year) 系统:Mac & Windows 优势:快速Android界面原型设计 Mockplus是一款简单快速的Android/iOS手机界面原型设计工具,拥有丰富全面的Android手机应用界面设计组件和图标库。大到安卓应用界面设计模板库,小到极具安卓特色的图标、按钮,使得Mockplus在移动应用原...
mo311 发布于 12小时前 阅读 39

再见 2017 你好 2018 ,程序员们的精彩年度总结

弹指一挥间,我们已经从 2017 迈入了 2018 。转身回望,有喜有悲,有失望有后悔,也有兴奋和感动。回顾这一年,发生了很多事,有人从学校步入社会,有人开始涉猎新的技术领域,有人挑战新的项目开发,也有人脱单成功,或是为父为母进入人生新阶段。 前两天,朋友圈被大家晒的 18 岁照片刷屏了。看着一张张青涩的脸,不禁感叹时间飞逝。标签易乱,记忆易黄,我们不妨在新年起航之际,写一篇年终总结,留给未来的自己。 打开开源中国的博客,看到已经有不少 OSCer 发布了自己的年度总结博文,讲诉他们的故事。在此,对其中的精彩内容做个简单的汇总,让我们跟随他们的足迹,一起回味 2017 的喜怒哀乐,并做好准备,迎接属于我们的 2018 ! 期待,你也来留下自己的故事……   1、2017 —— 关于坚持了一年的事情(@wier) 其实一直想写一篇,关于坚持一件事的心得,但看惯了网上大v的方法论,以及遇到各种方法的局限性之后,我便不敢妄下结论进行自行分析,以免使用不当,带偏了一批听信我的人,而这份信任异常难得,被辜负十分可惜。 我在想,既然自己反感说教,那自己写出的东西也一定不能把说教放在第一位,而是讲出来一些好的方法,提供一个交流的契机,把我知道的,所...
编辑部的故事 发布于 2个月前 阅读 4043 评论 4 点赞 2

8个写完以后就可以让你成为顶尖开发者的有趣应用程序

只有不断的努力才能成为伟大的开发人员。想象一下 ——你不能通过阅读大量关于健身,成为一个身体健康的人。你实际上需要去健身房,把时间和汗水放进去!同样的概念也适用于编码。 这里有8个很棒的项目来训练你的编码肌肉!我们的目标是用你喜欢的技术堆栈构建每个应用程序。使用任何你想要的内容来保证没有任何冲突! Project #1: Trello Clone Trello clone by Indrek Lasn Demo :https://trello-copy-ddiaorohmd.now.sh/ 你将clone一个Trello: 路由 拖放 创建新对象(板子、列表、卡片) 处理输入和验证 客户端路径:如何使用本地存储,将数据保存到本地存储中,从本地存储中读取数据。 服务器端路径:如何使用数据库,将数据保存到数据库,再从数据库读取数据。 这里的有一个用React+Redux做的例子:https://github.com/wesharehoodies/simple-trello。 Project #2: User admin dashboard 简单的CRUD应用,重要的基础。你将学到: 创建用户,管理用户。 与数据库 ——创建、读取、编辑、删除用户。 输入验证和如何处理表单。 Project #3: Cryptocurrency tracker (native mobile app) 这是一个本地应用程序 ——Swift,Objective-C,React Native,java,Kotlin。...
笔阁 发布于 1个月前 阅读 68

大话深度残差网络(DRN)ResNet网络原理

本文主要介绍深度残差网络的发展背景,以及讲解残差网络模型ResNet的技术原理
雪饼 发布于 11小时前 阅读 23

CAS SSO单点登录框架学习

1.了解单点登录  SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个)    2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进行。   2) SSO 认证中心通过一些方法来告诉 Web 应用当前访问用户究竟是不是通过认证的用户.   3) SSO 认证中心和所有的 Web 应用建立一种信任关系.     3.了解单点登录体系结构 1) CAS Server 负责完成对用户信息的认证,需要单独部署,CAS Server 会处理用户名/密码 等凭证(Credentials).       2)  CAS Client 部署在客户端,当有对本地 Web 应用受保护资源的访问请求,并且需要对请 求方进行身份认证,重定向到 CAS Server 进行认证.    4.CAS  SSO单点登录可以不依赖于cookie跨域的解决方案 不依赖于cookie跨域是比较有优势的,假如我们在京东商城上登录一次,在京东商城上其实还有很多的站点,点击其他站点以后是直接可以使用而无需重新登录,我们可以很清楚的看到,里面的域名都是不一样的,如果用传统的方案可能会出现cookie跨域的问题,解决起来比较麻烦。   5.CAS SSO单点登录官网: https://...
SpringCloud关注者 发布于 5天前 阅读 37 评论 1 点赞 9

Job 失败了怎么办?- 每天5分钟玩转 Docker 容器技术(133)

本节讨论 Kubernetes 如何处理运行失败的 Job。
CloudMAN 发布于 17小时前 阅读 19

关于Ginit的性能探讨

Ginit是基于JavaScript的新型脚本语言,它主要为了更简洁的HTML代码,它也支持JS和CSS这两种语言,关于Ginit我就不多做介绍了,想了解的小伙伴可以参考这个链接:https://www.oschina.net/p/ginit 好了,废话少说,直接开始我们的正题--------------------------- 由于Ginit是基于JS的脚本语言,所以大家都知道Ginit可能会有一些部分的性能丧失,所以我们现在就来测试一下: 以下的Ginit代码是在body标签里创建一个class为Ginit的div,并开启Ginit的Debug模式 :ginitDebug; @class(Ginit); @div(body); setUI(div); 然后,我们把这段代码的后三句复制49遍 再然后,我们就有了151行Ginit代码 ok,那现在我们运行一下html文件(首先要在html文件里用<script>引入Ginit编译器,然后再使用ginitRead方法读取Ginit文件) 打开控制台,大家会发现Ginit的编译速度还是很快的 151行代码,总共编译的时间才13.7ms(每次编译用时可能不一样),可见Ginit的性能非常出众!所以说,大家基本不用担心Ginit的性能问题了! 注意:本次测试仅适用于Ginit1 Community版本...
Skyogo 发布于 7小时前 阅读 17

AVL树的代码实现

二叉平衡查找树又称AVL树,以及红黑树,其实就是在普通的二叉树结构里面不断加入规则。用程序来满足这些规则。 /** * Created by Administrator on 2018-02-23. */ public class AVLTree<AnyType extends Comparable> { private static final int ALLOWED_IMBALANCE = 1; private static class AvlNode<AnyType> { AvlNode(AnyType theElement) { this(theElement,null,null); } AvlNode(AnyType theElement,AvlNode<AnyType> lt,AvlNode<AnyType> rt) { element = theElement; left = lt; right = rt; height = 0; } AnyType element; AvlNode<AnyType> left; AvlNode<AnyType> right; int height; } private int height(AvlNode<AnyType> t) { return t == null ? -1:t.height; } private AvlNode<AnyType> insert(AnyType x,AvlNode<AnyType> t) { if (t == null) return new AvlNode<>(x,null,null); int compareResult = x.compareTo(t.element); if (compar...
算法之名 发布于 14小时前 阅读 14

eclipse ERMaster插件安装 利用ERMaster快速生成db维护文档

1.插件获取 ERMaster插件:https://sourceforge.net/projects/ermaster/ 链接:http://pan.baidu.com/s/1o7UWLMa 密码:wkax 2.插件安装 解压到eclipse下的plugins目录中,重启eclipse。 3.在工程中新建ermaster文件     4.配置数据库连接   .    5.选择要生成的格式类型导出    
啃不动地大坚果 发布于 9小时前 阅读 13

Spring boot的配置参数清单(带中文解释)

累死老衲了~!
乱舞 发布于 1个月前 阅读 16

Dubbo集群容错和负载均衡

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点
Idea 发布于 1个月前 阅读 22

你才不是一个没有故事的男同学

你才不是一个没有故事的男同学,今天看了一篇同事分享的博文,讲的是一位技术大牛成长7年的历程,我看了有点感触,觉得自己也算有点故事,就决定提笔讲讲自己的故事。     2010年夏,一个懵懂少年留着当时很流行的毛寸发型,拖着一个箱子,踏进了大学的大门,开始了自由、新鲜、趣味、难忘的4年生活。这4年,经历的也算挺多,但算不上牛逼,大多都是吃饭、喝酒、打游戏、谈恋爱,没什么大的收获,唯一的收获就是结识了一群志同道合的室友。本可以在这里长篇大论,顺便谈谈自己的情感经历,想想还是算了。把墨水留给我毕业之后的工作经历吧。       时间很快,一转眼就到了大四,这时候班里已经有部分人开始找工作了,学校也召开了几场招聘会。当时磕磕跘跘写下了人生的第一封简历,最大的感受就是除了当过宿舍长之外特么没啥可以写的了,根本写不满一页纸啊。结果也是意料之中,投了十几份之后,都是石沉大海。当时觉得必须有一门技术活,才有更多的选择。于是偶然的一次机会,我的一个表哥问我对计算机培训有没有兴趣,由于自己从小对电脑比较感兴趣,其实是对电子游戏感兴趣,所以就抱着试试看的态度去南京一家培训机构咨询了一下,最终在几周考虑之后,决定报名...
tony.chen 发布于 8小时前 阅读 11

用“响应式JS-UI框架PathJs-UI制作一个代码域”

【本篇教程需要依赖于PathJs-UI框架】 首先,再开始的时候先放一波简介: PathJs是一款响应式JavaScript UI框架,他有着出色的能力,帮助你化繁为简。有了他,你大可不必担心繁杂的UI设计工作,只需2行代码,轻松胜任工作里的一切事物。 再来波链接:https://www.oschina.net/p/pathjs-ui 好了,现在正式开始! 1、首先在html文件里先把基础结构写好 <html> <head> <title>Pathjs Demo</title> <meta charset="utf-8"> <script type="text/javascript" src="js/pathjs.js"></script> <script> window.onload = function(){ } </script> </head> <body> <div id="div1"> </div> </body> </html> 2、在window.onload里写创建PathJs控件的方法 pathjsCreate(); 3、接下来我们往这个方法里写参数,这个创建控件的方法有9个参数,不过请放心,不是每个参数都是需要填写的(参数分别是:type\div\title\content\id\url\size\code\CallBackCode) type填写code,div填写#div1,title随便填写,content就是里面要显示的代码(如果需要显示<>请使用>...
Skyogo 发布于 2个月前 阅读 171 评论 1

开源巨献:年度最佳 JavaScript 和 CSS 开源库推荐!

Tutorialzine 每个月都会公布一次当月新增的 JS 和 CSS 库。2018 新年之际,该网站整理出了 2017 年最受用户欢迎和喜爱的一些 JS 和 CSS 库,供大家学习和参考。 JavaScript 本地存储库 localForage localForage 是一个 JavaScript 库,提升了应用程序的离线体验,通过使用异步的数据存储,提供简单的类似 localStorage 的 API,允许开发者存储多种类型数据。 CSS3 驱动的动画滚动库 AOS AOS(Animate on scroll)是小型动画滚动库,可在页面滚动时给元素添加动画效果。CSS3 驱动,效果类似于 WOWJS。 响应式邮件标识语言 MJML MJML 是一个标识语言,用来减少编写响应式邮件的复杂度。其语义语法在展示丰富邮件内容时更加简单和直观。该项目提供一个开源的引擎用来将 MJML 标识语言转成 HTML。 基于浏览器的代码编辑器 Monaco-Editor Monaco Editor 是微软开源的基于 VS Code 的代码编辑器,运行在浏览器环境中。编辑器提供代码提示,智能建议等功能。供开发人员远程更方便的编写代码。 Web 虚拟现实框架 A-Frame A-Frame 是 Mozilla 开源的网页虚拟现实体验( WebVR )框架,可用于桌面、iPhone(即将支持安卓)以及 Oculus Rift。A-Frame 可以让创建 WebVR 体验变得...
编辑部的故事 发布于 5天前 阅读 7084 评论 8 点赞 11

开源巨献:2017 年 Google 开源了这些超赞的项目

春节小长假,走亲访友之余,还可以利用一些零碎的时间收集学习资料,给自己充充电,好在 2018 年成为更优秀的自己。我们知道在开源和贡献开源方面,Google 一直是行业的典范。2017 年它开源了哪些优秀的软件,有哪些值得我们借鉴学习呢?让我们一起来看下: 1、硬件加速的机器学习 JavaScript 库 DeepLearn.js DeepLearn.js 是 Google 推出的一个可用于机器智能并加速 WebGL 的开源 JavaScript 库,完全在浏览器中运行,不需要安装,不需要后端处理。 2、大型微服务系统管理工具 Istio Istio 是一个由谷歌、IBM 与 Lyft 共同开发的开源项目,旨在提供一种统一化的微服务连接、安全保障、管理与监控方式。Istio 项目能够为微服务架构提供流量管理机制,同时亦为其它增值功能(包括安全性、监控、路由、连接管理与策略等)创造了基础。这款软件利用久经考验的 Lyft Envoy 代理进行构建,可在无需对应用程序代码作出任何发动的前提下实现可视性与控制能力。Istio 项目是一款强大的工具,可帮助 CTO/CIO 们立足企业内部实施整体性安全、政策与合规性要求。 3、可自动生成命令行接口 Python Fire Python Fire 是 Google 开源的一个可从任何 Python 代码自动生成命令行接口(...
编辑部的故事 发布于 3天前 阅读 4165 评论 3 点赞 2

Django开发环境

### 1.虚拟环境 ``` tianshl:workspace tianshl$ mkdir server tianshl:workspace tianshl$ cd server/ tianshl:server tianshl$ virtualenv venv --python=python3 tianshl:server tianshl$ source venv/bin/activate ``` ### 2. 安装依赖 ``` (venv) tianshl:server tianshl$ pip install django (venv) tianshl:server tianshl$ pip install djangorestframework ``` ### 3. 创建项目 ``` (venv) tianshl:server tianshl$ django-admin.py startproject server (venv) tianshl:server tianshl$ tree server/ server ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` ### 4. 更新配置 ``` (venv) tianshl:server tianshl$ cd server/ (venv) tianshl:server tianshl$ vim server/settings.py # 1.修改 INSTALLED_APPS = ( ... 'rest_framework', ) # 2.添加 REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ] }...
tianshl 发布于 1个月前 阅读 13798

Nginx日志配置及分割

1. 格式化日志内容 2. 日志文件切割
tianshl 发布于 2个月前 阅读 273618 点赞 1

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

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

Java中的OneToMany

### 写在开头 ``` 使用jhipster声明的OneToMany在One的一方DTO中是没有与Many的DTO的映射关系的, 为了在One的一方DTO中使用Many的DTO, 使用以下三步解决此问题。 ``` ### 步骤 ``` 1. OneDTO 中的"mark 1"处为自己写的一对多的关系, 此处变量名称不能与实体One中相应的变量名称一致,否则编译失败。 2. OneMapper 中的"mark 2"处 uses属性添加ManyMapper。 2. OneMapper 中的"mark 3"处使用@Mapping注解声明 Entity 转 DTO 的映射关系。 ``` ### Entity ``` @Entity @Table(name = "one") public class One { ... @OneToMany(mappedBy = "one") private Set manys = new HashSet<>(); ... public void setManys(Set manys) { this.manys = manys; } public Set getManys() { return manys; } } @Entity @Table(name = "many") public class Many { ... @ManyToOne private One one; } ``` ### DTO ``` public class OneDTO { ... // mark 1 private Set manyDTOS = new HashSet<>(); ... public void setManyDTOS(Set manyDTOS) { this.manyDTOS = manyDTOS; } public Set getManyDTOS() { return manyDTOS; } } public class ManyDTO { ... private Long oneId; ... public...
tianshl 发布于 3周前 阅读 9020

Java实现的k-means聚类算法

### 需求 ``` 对MySQL数据库中某个表的某个字段执行k-means算法,将处理后的数据写入新表中。 ``` ### 源码及驱动 ``` http://download.csdn.net/download/xiaobuding007/10203673 ``` ### 源码 ```java import java.sql.*; import java.util.*; /** * @author tianshl * @version 2018/1/13 上午11:13 */ public class Kmeans { // 源数据 private List origins = new ArrayList<>(); // 分组数据 private Map> grouped; // 初始质心列表 private List cores; // 数据源 private String tableName; private String colName; /** * 构造方法 * * @param tableName 源数据表名称 * @param colName 源数据列名称 * @param cores 质心列表 */ private Kmeans(String tableName, String colName,List cores){ this.cores = cores; this.tableName = tableName; this.colName = colName; } /** * 重新计算质心 * * @return 新的质心列表 */ private List newCores(){ List newCores = new ArrayList<>(); for(List v: grouped.values()){ newCores.add(v.stream().reduce(0, (sum, num) -> sum + num) / (v.size() + 0.0)); } Collections.sort(newCores); return newCores; } /...
tianshl 发布于 1个月前 阅读 49134

Sublime配置Python3运行环境

### 新增Python3编译环境 ``` Tools > Build System > New Build System 将默认内容替换为: { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python" } 保存为 Python3.sublime-build ``` ### 选中Python3环境 ``` Tools > Build System > Python3 ``` ### 使用Python3编译运行 ``` Ctrl + b ``` ### 可能遇到的问题 ##### 问题 ``` UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) ``` ##### 原因 ``` 默认是ascii编码但是输出中包含中文 ``` ##### 解决 ``` Preferences > Browse Packages > Users > Python3.sublime-build 修改配置文件, 配置文件中新增一条 "env": {"LANG": "en_US.UTF-8"} 修改后如下: { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "env": {"LANG": "en_US.UTF-8"} } ```...
tianshl 发布于 1个月前 阅读 15125

MacOS 配置Java环境变量

### 编辑 bash_profile ```shell vim ~/.bash_profile 输入以下内容并保存 export JAVA_HOME=`/usr/libexec/java_home` export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin ``` ### 使环境变量生效 ``` source ~/.bash_profile ``` ### 检验 ```shell tianshl@tianshl ~ $ echo $PATH ``` ### 备注 ``` 1. source前使用fish的要先退出fish 2. /usr/libexec/java_home 这条命令可以输出JAVA_HOME的路径 ```
tianshl 发布于 3个月前 阅读 355731 点赞 1

免费云服务器

如何快速申请免费的阿里云服务器
tianshl 发布于 2个月前 阅读 239289 点赞 1

Java递归拷贝文件夹

### 拷贝文件或文件夹 ``` /** * 拷贝文件 * * @param source 源文件 * @param target 目标文件 */ public void copyFile(String source, String target) { // 源文件 File sourceFile = new File(source); if (!sourceFile.exists()) { return; } // 目标文件 File targetFile = new File(target); // 文件拷贝 if (sourceFile.isFile()) { copyFromChanel(sourceFile, targetFile); return; } // 文件夹拷贝 if (!targetFile.exists()) { targetFile.mkdirs(); } for (File file: sourceFile.listFiles()) { copyFile(file.getAbsolutePath(), target + File.separator + file.getName()); } } ``` ### 利用文件管道拷贝文件 ``` /** * 利用文件管道拷贝文件 * * @param source 源文件 * @param target 目标文件 */ public void copyFromChanel(File source, File target) { // 文件流 FileInputStream fis = null; FileOutputStream fos = null; // 文件管道 FileChannel fci = null; FileChannel fco = null; try { // 文件流 fis = new FileInputStream(source); fos = new FileOutputStream(target); // 文件管道 fci = fis.getChannel(); fco = fos.getChannel(); ...
tianshl 发布于 2个月前 阅读 273226 点赞 1

Python随机生成手机号

### 依据 ``` 根据2017年10月份最新的手机号正则进行编码, 正则如下: (13\d|14[579]|15[^4\D]|17[^49\D]|18\d)\d{8} ``` ### 代码 ``` # -*- coding: utf-8 -*- import random def create_phone(): # 第二位数字 second = [3, 4, 5, 7, 8][random.randint(0, 4)] # 第三位数字 third = { 3: random.randint(0, 9), 4: [5, 7, 9][random.randint(0, 2)], 5: [i for i in range(10) if i != 4][random.randint(0, 8)], 7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)], 8: random.randint(0, 9), }[second] # 最后八位数字 suffix = random.randint(9999999,100000000) # 拼接手机号 return "1{}{}{}".format(second, third, suffix) # 生成手机号 phone = create_phone() print(phone) ``` ### 运行结果 ``` 13937342780 15835720604 14589505530 ... ``` ### 验证 (使用正则验证) ``` # -*- coding: utf-8 -*- import random import re def create_phone(): # 第二位数字 second = [3, 4, 5, 7, 8][random.randint(0, 4)] # 第三位数字 third = { 3: random.randint(0, 9), 4: [5, 7, 9][random.randint(0, 2)], 5: [i for i in range(10) if i != ...
tianshl 发布于 3个月前 阅读 298806 评论 1

ELK -- Logstash安装与配置

### Logstash ##### 使用yum安装 ###### 编辑 repo ``` vim /etc/yum.repos.d/elasticsearch.repo # 内容如下 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` ###### 安装 ``` sudo yum install logstash ``` #### 配置 Logstash ``` # 参考 https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html # input项配置源数据,此处为监听 "/log"目录下满足"insert.*.log"匹配的所有日志文件 # filter项过滤input输入的数据, "insert.*.log"中每条日志形式如:"2018-01-15 | type | cid | src | eventId | reason", 所以使用" | "拆分每条日志 # output项是输出数据,此处为输出至ElasticSearch # 新建配置文件 insert.conf vim conf.d/insert.conf # 内容如下 input { file { path => "/log/insert.*.log" } } filter { mutate{ split=>["message"," | "] add_field => { "date" => "%{[message][0]}" } add_field => { "type" => "%{[message][1]...
tianshl 发布于 1个月前 阅读 31814

ELK -- ElasticSearch集群安装、配置及错误处理

### ElasticSearch ``` 现有三台服务器[192.168.1.30, 192.168.1.31, 192.168.1.32],使用这三台服务器搭建ElasticSearch集群 ``` #### CentOS 使用 yum 安装 ###### 编辑 repo ``` vim /etc/yum.repos.d/elasticsearch.repo # 内容如下 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` ###### 使用yum安装 ``` yum install elasticsearch ``` ###### 创建用户 ``` useradd elastic ``` ###### 修改权限 ``` # 数据 chown -R elastic:elastic /var/lib/elasticsearch # 日志 chown -R elastic:elastic /var/log/elasticsearch # 配置 chown -R elastic:elastic /etc/elasticsearch chown -R elastic:elastic /etc/sysconfig/elasticsearch # 指令 chown -R elastic:elastic /usr/share/elasticsearch ``` ###### 配置 ``` # 主节点 192.168.1.30 vim /etc/elasticsearch/elasticsearch.yml # 修改以下几项 cluster.name: etl_es node.name: node-30 node.master: true node.d...
tianshl 发布于 1个月前 阅读 31520

Nginx日志分割

### 一.使用脚本切割 ##### 编辑脚本 ``` tianshl@tianshl nginx $ vim nginx_log_division.sh ``` ##### 脚本内容 ``` #! /bin/sh # 昨天日期 yesterday=`date -v -1d +%Y%m%d` # 日志目录 log_path="/usr/local/var/log/nginx/" # SDK日志路径 sdk_path=${log_path}sdk # 以天为单位切分日志 mv -f ${sdk_path}.log ${sdk_path}_${yesterday}.log # 重新生成日志文件 pid_path="/usr/local/var/run/nginx.pid" sudo kill -USR1 `cat ${pid_path}` ``` ##### 定时任务 ###### 切换到root身份 ``` tianshl@tianshl nginx $ sudo su root ``` ###### 编辑 crontab ``` sh-3.2# crontab -e ``` ###### crontab 添加一行 ``` 0 0 * * * sh /usr/local/var/log/nginx/nginx_log_division.sh ``` ###### 查看是否添加成功 ``` sh-3.2# crontab -l ``` ### 二.不使用脚本切割 ##### server 段增加以下代码 ``` if ($time_iso8601 ~ "(\d{4})-(\d{2})-(\d{2})") { set $time $1$2$3; } ``` ##### 日志文件路径中增加日期参数 ``` access_log /var/log/nginx/api-$time.log; ``` ##### 举个栗子 ``` events { worker_connections 1024; } http { server { # 监听88端口 listen 88;...
tianshl 发布于 2个月前 阅读 275060

Supervisor&Gunicorn&Django

# django ``` # 刚写的就不复制粘贴了 https://my.oschina.net/tianshl/blog/1611257 # 列一下目录结构 root@tianshl:~# cd server/ root@tianshl:~/server# tree server server ├── db.sqlite3 ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` # gunicorn ##### 安装 ``` pip install gunicorn ``` ##### 配置 ``` # 修改django项目的settings.py INSTALLED_APPS = [ ...... 'gunicorn', ] ``` ##### 运行 ``` root@tianshl:~# cd /root/server/server/ root@tianshl:~/server/server# gunicorn --pythonpath /root/server/venv/bin/python3 -w 3 -b 0.0.0.0:80 server.wsgi # 测试能否正常运行, 然后ctrl+c结束进程 ``` # supervisor ##### 安装 ``` pip install supervisor ``` ##### 配置 ``` # 默认配置 # 使用echo_supervisord_conf命令查看默认配置 root@tianshl:~# echo_supervisord_conf # 自定义配置 root@tianshl:~# mkdir /etc/supervisor root@tianshl:~# mkdir /etc/supervisor/conf.d root@tianshl:~# echo_supervisord_conf > /etc/supervisor/supervisor.conf root@tianshl:~# vim /etc/su...
tianshl 发布于 1个月前 阅读 13770

JavaScript指定长度和进制的UUID

### 指定长度和进制的UUID ``` /** * 指定长度和进制的UUID * @param len 长度 * @param radix 进制 * @returns {string} */ function uuid(len, radix) { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); var uuid = [], i; radix = radix || chars.length; if (len) { for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix]; } else { var r; uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; uuid[14] = '4'; for (i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | Math.random()*16; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } } return uuid.join(''); } ``` ### 测试 ``` uuid(32, 2) "11110011000001100111011111001111" uuid(32, 8) "31730315503322654076326054034634" uuid(32, 10) "50235847867589708943975575132412" uuid(32, 16) "405F8CA9918F71FC9C73DACB47CEC6EE" ```...
tianshl 发布于 3个月前 阅读 340108

拯救小容量,6 款开源图片无损优化工具推荐

科技在进步,相机、手机拍出来的照片越来越清晰也越来越大时,容量小一点的手机、磁盘开始有些吃紧了。目前其实有很多工具可进行低损,甚至是无损优化、压缩图片,能帮你保存更多的照片。 1、OptiPNG OptiPNG 是一个专门的 PNG 图像优化工具,可将图像文件重新压缩为更小尺寸,且不会丢失任何信息。 OptiPNG 还可将其它格式(BMP、GIF、PNM 和 TIFF )转换为优化的 PNG 格式,并执行 PNG 完整性检查和校正。  2、Jpegoptim Jpegoptim 是一个专门用来优化 JPEG 文件的工具,提供无损的优化(基于哈夫曼表),同时也可设置质量因子实现的有损优化。 3、Leanify Leanify 是一个轻量级的文件无损压缩器/优化器。它会删除不必要的数据(调试信息、注释、元数据等),并重新压缩文件以减小文件大小。 Leanify 支持 jpeg、svg、png 等图片格式,完全无损,不会降低图像质量。此外,还支持递归缩减,以及其他非图片格式,包括压缩格式、文档格式等。无外部依赖,跨平台,支持 Windows、Linux 和 Mac 。能够通过其数据而不是名称来识别文件格式。 4、Pngcrush Pngcrush 是一个非常实用的图像优化命令行工具,可用来批量压缩 PNG 格式图片大小。它主要是通过尝试各种压缩级别和 PN...
编辑部的故事 发布于 4天前 阅读 1729 评论 4 点赞 1

前端利器,6 款开源 Web 性能优化辅助工具推荐

Web 性能优化是一个老生常谈的话题,也是前端页面开发十分重要的部分。当页面加载速度越慢,用户流失的概率就越大,性能和交互直接影响用户体验。下面推荐几款 Web 性能优化辅助工具推荐,希望能对大家有所帮助。 1、Lighthouse Lighthouse 是 Google 开源的一个自动化工具,用于改进网络应用的质量。你可以将其作为一个 Chrome 扩展程序运行,或从命令行运行。 当为 Lighthouse 提供一个要审查的网址,它将针对此页面运行一连串的测试,然后生成一个有关页面性能的报告。可以参考失败的测试,看看可以采取哪些措施来改进应用。 Chrom 扩展则会把报告以非常人性化的图形界面展示给你。 2、Speed Racer SpeedRacer 是一款性能测试工具,它在 Chrome 中运行脚本,并生成详细的性能报告。 SpeedRacer 是直接借助浏览器来实际测试性能的工具,在实际工作中,可以与其它模拟用户访问流量来评估性能的工具配合使用。 3、Yellow Lab Tools Yellow Lab Tools 是一款 Web 性能及前端质量测试工具。与其他工具不同的是,它有一些在其他工具上无法看到的独特功能,例如页面加载时 JavaScript 与 DOM 互动和其他程序代码验证问题。 Yellow Lab Tools 偏向于一个发现不良实践的工具,...
编辑部的故事 发布于 5天前 阅读 1577 评论 3 点赞 4

Linux配置开机自启动执行脚本的两种方法

开机要启动的脚本qidong.sh [root@c69-01 scripts]# vim /server/scripts/qidong.sh [root@c69-01 scripts]# cat /server/scripts/qidong.sh #!/bin/bash /bin/echo $(/bin/date +%F_%T) >> /tmp/qidong.log 方法一:修改/etc/rc.local /etc/rc.local,该文件为链接文件 [root@c69-01 ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Feb 5 10:03 /etc/rc.local -> rc.d/rc.local 修改/etc/rc.local文件 [root@c69-01 scripts]# tail -n 1 /etc/rc.local /bin/bash /server/scripts/qidong.sh >/dev/null 2>/dev/null 重启系统,查看结果 [root@c69-01 ~]# cat /tmp/qidong.log 2018-02-19_23:30:56 已开机自启动该脚本 方法二:chkconfig管理 删除掉方法一的配置 [root@c69-01 ~]# vim /etc/init.d/test #!/bin/bash # chkconfig: 3 88 88 /bin/bash /server/scripts/qidong.sh >/dev/null 2>/dev/null [root@c69-01 ~]# chmod +x /etc/init.d/test 添加到chkconfig,开机自启动  [root@c69-01 ~]# chkconfig --add test [root@c69-01 ~]# chkconfig --list test test 0:off 1:off 2:off 3:on 4:off 5:off 6:off 重启系统,查看结果 [root@c69-...
Linux_yk 发布于 3天前 阅读 1478 评论 6 点赞 3

JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的。。。 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开、关闭连接造成系统性能低下 编写连接池 编写连接池需实现java.sql.DataSource接口 创建批量的Connection用LinkedList保存【既然是个池,当然用集合保存、、LinkedList底层是链表,对增删性能较好】 实现getConnetion(),让getConnection()每次调用,都是在LinkedList中取一个Connection返回给用户 调用Connection.close()方法,Connction返回给LinkedList private static LinkedList<Connection> list = new LinkedList<>(); //获取连接只需要一次就够了,所以用static代码块 static { //读取文件配置 InputStream inputStream = Demo1.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); try { properties.load(inputStream); String url = properties.getProperty("url"); String username = properties.getProperty("username"); St...
Java3y 发布于 4天前 阅读 1157 评论 3 点赞 1

私有IP段和特殊IP段和保留IP段

| Address Block | Name | RFC | Allocation Date | Termination Date | Source | Destination | Forwardable | Globally Reachable | Reserved-by-Protocol | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | 0.0.0.0/8 | "This host on this network" | [[RFC1122](http://www.iana.org/go/rfc1122)], Section 3.2.1.3 | 1981-09 | N/A | True | False | False | False | True | | 10.0.0.0/8 | Private-Use | [[RFC1918](http://www.iana...
Swire 发布于 32分钟前

著名的蒙提霍尔问题(或称三门问题)

现在已经非常着名的蒙提霍尔问题(或称三门问题),大约是在1990年Parade Magazine上被登载出来而引起广大关注。根据中文维基百科,这个题目在Parade Magazine上被叙述为 * 假设你正在参加一个游戏节目,你被要求在三扇门中选择一扇:其中一扇后面有一辆车;其余两扇后面则是山羊。你选择了一道门,假设是一号门,然后知道门后面有什么的主持人,开启了另一扇后面有山羊的门,假设是三号门。他然后问你:“你想选择二号门吗?”转换你的选择对你来说是一种优势吗? 答案是:是的,要转换; 显而易见,转换选择前你的获胜概率是1/3。 那么,转换选择后你的获胜概率是多少呢? 如果要转换选择后获胜,那么当前选择必定是羊,所以转换选择后你的获胜概率就等效于你当前选择是羊的概率,也就是2/3 [蒙提霍尔问题](https://weibo.com/2282634772/G4lni79yh?ref=collection&type=comment)
yoyoso 发布于 44分钟前 阅读 1

虚拟机搭建Hadoop集群

#### 安装包准备 > 操作系统:ubuntu-16.04.3-desktop-amd64.iso > > 软件包:VirtualBox > > 安装包:hadoop-3.0.0.tar.gz,jdk-8u161-linux-x64.tar.gz #### 1. 环境准备 使用VirtualBox和下载的ubuntu镜像文件新建三个Ubuntu操作环境,具体配置如下: | 用户 | 内存(G) | 磁盘空间(G) | | -------- | ----- | ------- | | hadoop01 | 1.5 | 10 | | hadoop02 | 1.5 | 10 | | hadoop03 | 1.5 | 10 | #### 2. 网络环境准备        点击VirtualBox右侧“全局工具->主机网络管理器”,点击新建,并且勾选DHCP服务器中的启用服务器,其余的按照默认配置点击应用即可,这个过程相当于在VirtualBox中创建了一个名称为vboxnet0的路由器: ![netbox](http://upload-images.jianshu.io/upload_images/7944306-99c07d91c7186ab4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)        关闭创建的每一台虚拟机,然后分别选中每一台虚拟机,点击“设置->网络->网卡2”,启用网络连接,并且选择连接方式为“仅主机(Host-Only)网络”,界面名称为刚刚创建的vboxnet0。 ![](http://upload-images.jianshu.io/upload_images/7944306-b457289f4b699673.png?image...
爱宝贝丶 发布于 44分钟前 阅读 2

C++ 基础知识,博客收藏

### [C++ 浅谈类对象和类指针](http://www.cnblogs.com/yedushusheng/p/5524043.html) 类指针,需要New;类对象 ,不需要New。 ### [c++ 接口类](https://www.cnblogs.com/first-semon/p/6957475.html)
zanglaowei 发布于 1小时前 阅读 4

简化Kubernetes应用部署工具-Helm之应用部署

编者的话】微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。Helm通过软件打包的形式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用部署和管理的复杂性。 随着业务容器化与向微服务架构转变,通过分解巨大的单体应用为多个服务的方式,分解了单体应用的复杂性,使每个微服务都可以独立部署和扩展,实现了敏捷开发和快速迭代和部署。但任何事情都有两面性,虽然微服务给我们带来了很多便利,但由于应用被拆分成多个组件,导致服务数量大幅增加,对于Kubernetest编排来说,每个组件有自己的资源文件,并且可以独立的部署与伸缩,这给采用Kubernetes做应用编排带来了诸多挑战: 管理、编辑与更新大量的K8s配置文件 部署一个含有大量配置文件的复杂K8s应用 分享和复用K8s配置和应用 参数化配置模板支持多个环境 管理应用的发布:回滚、diff和查看发布历史 控制一个部署周期中的某一些环节 发布后的验证 而采用Helm,可以轻松的解决上面的问题。 Helm把Kubernetes资源(比如deployments...
xiaomin0322 发布于 1小时前 阅读 2

Java 数据类型定义

各个数据类型的表示方法 数据类型 表示方法 数组(如:int) [(表示成 [I) 类(String) L;(表示成Ljava/lang/String;) byte B boolean Z char C double D float F int   I Long J short     S void V          
Ryan-瑞恩 发布于 1小时前 阅读 4

df命令 、du命令 、磁盘分区

## 磁盘管理 ### df命令 df=disk filesystem 用于查看已挂载磁盘的总容量,使用量,剩余容量等信息的命令,不加任何参数直接使用,容量的默认单位是千字节(KByte)。 ``` [root@test-01 ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda3 16659456 872980 15786476 6% / devtmpfs 929836 0 929836 0% /dev tmpfs 935392 0 935392 0% /dev/shm tmpfs 935392 8692 926700 1% /run tmpfs 935392 0 935392 0% /sys/fs/cgroup /dev/sda1 201388 75920 125468 38% /boot ``` 上面的信息中后面的挂载点,像/ ,/boot ,这是我们在安装系统的时候划分的分区;/dev ,/dev/shm,这是内存分区,默认大小是内存的1/2 ,如果我们把文件保存在这个分区下,那么重启之后文件会消失。其他的想/run, /sys/fs/cgroup等分区是临时分区,平时工作当中不用动这些分区。 ### df命令常用的参数,-i ,-h ,-k ,-m - df -i :表示查看inodes的使用情况,如果inodes使用100% ,就算分区还有空间,也不能在往里面写东西了,系统会提示磁盘空间已满。 ``` [root@test-01 ~]# df -i 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/sda3 16669696 23863 16645833 1% / devtmpfs 232459 365 232...
李超小牛子 发布于 2小时前 阅读 5

爬虫-编码报错

爬虫报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte 解决方案: 删除headers里的: 'accept-encoding': 'gzip, deflate, sdch, br'  
Clover286 发布于 2小时前 阅读 6

染陌的2017年度总结

## 写在前面 看到了[死月](https://github.com/XadillaX)、[doodlewind](https://github.com/doodlewind)、[佳楠](https://github.com/plusmancn)等朋友都写了关于 2017 的年度总结,总觉得自己也应该写点东西来回首过去的一年,顺便展望一下未来的 2018 年。 由于之前忙于撰写[《剖析 Vue.js 内部运行机制》](https://juejin.im/book/5a36661851882538e2259c0f),一直没有抽出时间来写这篇年度总结,借着农历新年穿梭在七大姑八大姨家的喧闹中偷点时间总结一下过去的一年,农历的新年也算是个辞旧迎新的时间,希望不算太晚吧。 ## 牛头山 时间被拉扯回 2017 年的二月份,乘着过年的闲暇跟小伙伴们一起去金华牛头山浪了一波。 毕业以后大家都在不同的地方生活工作,一年见不到几次,但是希望大家的感情就跟小时候一样好永远不变,以后每年过年都要一起出去浪一波。 ## 你好,大搜车 浪完了就要回杭上班了,过完年经过了几个公司的面试最终确定了要接受大搜车的offer,真的很感谢[芋头](https://github.com/xinyu198736)在面试时对我的认可。薪资方面不是当时手上offer中最高的,但是我还是义无反顾地离开了上家来到了大搜车,因为我觉得大搜车是一家技术氛围很好的公司,有...
染陌同学 发布于 2小时前 阅读 3

Java8-Lambda表达式

什么是Lambda?     Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。以前要写的匿名内部类多余的框架代码不再需要了,只关心真正要做操作。 比较Lambda和匿名内部类 package com.jv.java8.lambda; @FunctionalInterface public interface MyFun { public void deal(int x); } public class TestLambda { @Test public void test1() { int age = 10; MyFun mf1 = new MyFun() { @Override public void deal(int x) { System.out.println("使用匿名内部类打印:" + x); } }; mf1.deal(age); MyFun mf2 = (x)->System.out.println("使用Lambda表达式打印:" + x); mf2.deal(age); } } 看了示例瞬间觉得匿名内部类真是弱爆了,要编写不少语法要求的冗余代码,而Lambda值需要简单的一句。感想:对于刚接触的人来说,是不是有点颠覆的感觉,不管你信不信,我反正是信了,代码还可以这样写 OMG。书写真的简单,灵活,Java 666666。 Lambda表达式语法 MyFun mf2 = (x)->Syste...
特拉仔 发布于 2小时前 阅读 3

关于strncpy的小坑

  strncpy是比strcpy更安全的字符串拷贝函数,但在使用中需要注意一点: No null-character is implicitly appended at the end of destination if source is longer than num. Thus, in this case, destination shall not be considered a null terminated C string (reading it as such would overflow).   如果在strncpy后不显式追加'\0',那么你不可直接把它当做字符串使用处理,不然可能会出现乱码,甚至程序奔溃。   追加下strncpy glibc的实现版本 char * STRNCPY (char *s1, const char *s2, size_t n) { char c; char *s = s1; --s1; if (n >= 4) { size_t n4 = n >> 2; for (;;) { c = *s2++; *++s1 = c; if (c == '\0') break; c = *s2++; *++s1 = c; if (c == '\0') break; c = *s2++; *++s1 = c; if (c == '\0') break; c = *s2++; *++s1 = c; if (c == '\0') break; if (--n4 == 0) goto last_chars; } n = n - (s1 - s) - 1; if (n == 0) return s; goto zero_fill; } last_chars: n &= 3; if (n == 0) return ...
coreyggj 发布于 2小时前 阅读 4

stream api相关的用法

    今天在公司的项目里用到了java8中的stream相关的api,原先需要利用guava中的Multimaps.index方法,可以用steam的api完美解决,并且代码量缩小了很多: // guava库 // ImmutableListMultimap<String, OperatorSubscriptionResourceAPIVO> subscriptionApiMap = Multimaps.index(apiVoList, new Function<OperatorSubscriptionResourceAPIVO, String>() { // @Nullable // @Override // public String apply(@Nullable OperatorSubscriptionResourceAPIVO vo) { // return vo.getSubscription(); // } // }); // stream api Map<String, List<OperatorSubscriptionResourceAPIVO>> subscriptionApiMap = apiVoList.stream().collect(Collectors.groupingBy(vo -> vo.getSubscription())); 这种利用pipline的api接口,之前在mongodb里碰到过,当时觉得也没有多优雅,没想到在java里用起来很爽。 还有类似的: //Set<String> resourceGroupSet = new HashSet<>(); //for(OperatorSubscriptionResourceAPIVO vo : voList) { // if(StringUtils.isNotBlank(vo.getResourceGroup())) { // resourceGroupSet.add(vo.g...
梦无涯 发布于 3小时前 阅读 3

用户登陆注册【JDBC版】

前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作为小型数据库,现在使用Mysql数据库,代码究竟要改多少呢?我们拭目以待! 使用C3P0数据库连接池 导入C3P0的开发包和导入配置文件 开发包导入的是这个:c3p0-0.9.2-pre1和mchange-commons-0.2.jar. C3P0不仅性能好,而且配置文件可以使用XML文档来配置! 类似的配置文件可以在官方文档上找得到!     我们来改造一下: <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhongfucheng</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <...
Java3y 发布于 3小时前 阅读 3

图片选择预览 方法

   <div class="form-group ">                                         <fieldset>                                             <div class="form-group ">                                                 <div class="form-group ">                                                     <label for="iconValue">海报图片</label>                                                     <input type="file" id="imageFile" name="imageFile" class="form-control hidden" accept="image/*" autocomplete="off">                                                 </div>                                                 <div>                                                     <a href='javascript:$("#imageFile").click();' id="preview">                                                         <img src="/ass...
nibilly 发布于 3小时前 阅读 4 评论 1

Consul web-ui 8500端口实现公网访问

一 、背景信息 需求 consult server  8500 , 8600 启动时绑定127.0.0.1。 2018/02/23 17:46:11 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp) 2018/02/23 17:46:11 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp) 网络结构   IP地址:  111.2.154.72 (根据实际情况变化)   源端口: 37170 (根据实际情况变化)   源端口: 8500 二 、安装rinetd 1、在服务器Linux上安装rinetd。 yum install -y gcc g++ autoconf make telnet wget http://www.boutell.com/rinetd/http/rinetd.tar.gz tar -xvf rinetd.tar.gz cd rinetd sed -i 's/65536/65535/g' rinetd.c  mkdir -pv /usr/man && make && make install 2、编辑配置文件。  vi /etc/rinetd.conf 3、在配置文件中输入如下内容:  0.0.0.0 37170 127.0.0.1 8500  logfile /var/log/rinetd.log  将所有发往本机37170端口的请求转发到127.0.0.1的8500端口。  命令格式 bindaddress   bindport   connectaddress   connectport 绑定的地址     绑定的端口   连接的地址        连接的端口 或 [Source Address] [Source Port] [Destination Address] [Destin...
飞龙栖息地 发布于 4小时前 阅读 3

Gradle复制文件/目录方法

gradle复制文件/文件夹方法 复制文件 //复制IDE生成的classes.jar文件到build/libs中,并改名为FileUtils.jar. task copyFile(type:Copy) { delete 'build/libs/FileUtils.jar' from('build/intermediates/bundles/release/') into('build/libs/') include('classes.jar') rename('classes.jar', 'FileUtils.jar') } 复制多个文件 //复制E:\src目录下的所有xml和java文件到E:\dst目录中 task copyMutiFiles(type:Copy){ from 'E:\\src' into 'E:\\dst' //若dst不存在,会自动创建 //include '**/*' include '**/*.xml' include '**/*.java' } 复制目录 task copyTaskDir(type: Copy) { from 'E:\\src\\doc' into 'E:\\dst\\doc' include '**/*.html' include '**/*.jsp' // include '**/*' exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') } } 文件同步任务 同步任务(Sync)继承自复制任务(Copy),当执行时会复制源文件到目标目录,然后从目标目录删除所有非复制文件。如下: task libs(type: Sync) { from configurations....
SuShine 发布于 4小时前 阅读 3

puppeteer 爬去数据并自动填入

puppeteer 是 Google Chrome 团队官方的无界面(Headless)Chrome 工具。Chrome 作为浏览器市场的龙头,Chrome Headless 必将成为 web 应用 自动化测试 的行业有力竞争者。这篇文章是简单的使用puppeteer 实现爬去内容并存储,来学习下puppeteer的api。 我们要爬去的对象选择的是https://weekly.75team.com/ 最新的一条周刊,首先你需要安装puppeteer, yarn add puppeteer or npm install puppeteer 然后新建一个spider.js 内容如下 const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false, devtools: true }); const page = await browser.newPage(); const viewConfig = { width: 360, height: 640, isMobile: true }; //设置窗口 page.setViewport(viewConfig); //跳转 await page.goto('https://weekly.75team.com/', { waitUntil: 'networkidle2' }); //处理拿到需要的数据 const result = await page.evaluate(() => { let data = {}; let elements = document.querySelector('.issue-list li'); ...
wyysf 发布于 4小时前 阅读 4

Nginx入门与提高

Nginx入门与提高 Nginx配置文件 主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置),每部分包含若干个指令。main部分设置的指令将影响其它所有部分的设置;server部分的指令主要用于指定虚拟主机域名、IP和端口;upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。 main server upstream location  
开源爱好者DONG 发布于 4小时前 阅读 3

红黑树代码演示

import java.util.NoSuchElementException; public class RedBlackTree<AnyType extends Comparable<? super AnyType>> { public RedBlackTree( ) { nullNode = new RedBlackNode<>( null ); nullNode.left = nullNode.right = nullNode; header = new RedBlackNode<>( null ); header.left = header.right = nullNode; } private int compare( AnyType item, RedBlackNode<AnyType> t ) { if( t == header ) return 1; else return item.compareTo( t.element ); } public void insert( AnyType item ) { current = parent = grand = header; nullNode.element = item; while( compare( item, current ) != 0 ) { great = grand; grand = parent; parent = current; current = compare( item, current ) < 0 ? current.left : current.right; // Check if two red children; fix if so if( current.left.color == RED && current.right.color...
算法之名 发布于 4小时前 阅读 10

1.8.5 访问日志不记录静态文件

### 1.8.5 访问日志不记录静态文件 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 把虚拟主机配置文件改成如下: ```  DocumentRoot "/data/wwwroot/111.com"  ServerName www.111.com  ServerAlias 111.com  ErrorLog "logs/111.com-error_log"  SetEnvIf Request_URI ".*\.gif$" img  SetEnvIf Request_URI ".*\.jpg$" img  SetEnvIf Request_URI ".*\.png$" img  SetEnvIf Request_URI ".*\.bmp$" img  SetEnvIf Request_URI ".*\.swf$" img  SetEnvIf Request_URI ".*\.js$" img  SetEnvIf Request_URI ".*\.css$" img  CustomLog "logs/123.com-access_log" combined env=!img ``` 重新加载配置文件 -t, graceful mkdir /data/wwwroot/www.123.com/images //创建目录,并在这目录下上传一个图片 curl -x127.0.0.1:80 -I 123.com/images/123.jpg tail /usr/local/apache2.4/logs/123.com-access_log **先直接访问图片:** ``` [root@Dasoncheng ~]# ls /data/wwwroot/111.com/ admin.php index.php luds.jpg [root@Dasoncheng ~]# curl www.111.com/admin.php Welcome to the page of admin [root@Dasoncheng ~]# curl www.111.com/l...
脑洞老湿_ 发布于 5小时前 阅读 3

自己手写一个SpringMVC框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课.
liugh_develop 发布于 1天前 阅读 2948 评论 15 点赞 19 打赏 1

Linux配置开机自启动执行脚本的两种方法

开机要启动的脚本qidong.sh [root@c69-01 scripts]# vim /server/scripts/qidong.sh [root@c69-01 scripts]# cat /server/scripts/qidong.sh #!/bin/bash /bin/echo $(/bin/date +%F_%T) >> /tmp/qidong.log 方法一:修改/etc/rc.local /etc/rc.local,该文件为链接文件 [root@c69-01 ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 Feb 5 10:03 /etc/rc.local -> rc.d/rc.local 修改/etc/rc.local文件 [root@c69-01 scripts]# tail -n 1 /etc/rc.local /bin/bash /server/scripts/qidong.sh >/dev/null 2>/dev/null 重启系统,查看结果 [root@c69-01 ~]# cat /tmp/qidong.log 2018-02-19_23:30:56 已开机自启动该脚本 方法二:chkconfig管理 删除掉方法一的配置 [root@c69-01 ~]# vim /etc/init.d/test #!/bin/bash # chkconfig: 3 88 88 /bin/bash /server/scripts/qidong.sh >/dev/null 2>/dev/null [root@c69-01 ~]# chmod +x /etc/init.d/test 添加到chkconfig,开机自启动  [root@c69-01 ~]# chkconfig --add test [root@c69-01 ~]# chkconfig --list test test 0:off 1:off 2:off 3:on 4:off 5:off 6:off 重启系统,查看结果 [root@c69-...
Linux_yk 发布于 3天前 阅读 1478 评论 6 点赞 3

JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的。。。 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开、关闭连接造成系统性能低下 编写连接池 编写连接池需实现java.sql.DataSource接口 创建批量的Connection用LinkedList保存【既然是个池,当然用集合保存、、LinkedList底层是链表,对增删性能较好】 实现getConnetion(),让getConnection()每次调用,都是在LinkedList中取一个Connection返回给用户 调用Connection.close()方法,Connction返回给LinkedList private static LinkedList<Connection> list = new LinkedList<>(); //获取连接只需要一次就够了,所以用static代码块 static { //读取文件配置 InputStream inputStream = Demo1.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); try { properties.load(inputStream); String url = properties.getProperty("url"); String username = properties.getProperty("username"); St...
Java3y 发布于 4天前 阅读 1157 评论 3 点赞 1

SpringBoot项目中使用AOP

## 1.概述 将通用的逻辑用AOP技术实现可以极大的简化程序的编写,例如验签、鉴权等。Spring的声明式事务也是通过AOP技术实现的。 具体的代码参照 [示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-aop](https://github.com/qihaiyan/springcamp/tree/master/spring-aop) Spring的AOP技术主要有4个核心概念: 1. Pointcut: 切点,用于定义哪个方法会被拦截,例如 ```execution(* cn.springcamp.springaop.service.*.*(..))``` 2. Advice: 拦截到方法后要执行的动作 3. Aspect: 切面,把Pointcut和Advice组合在一起形成一个切面 4. Join Point: 在执行时Pointcut的一个实例 5. Weaver: 实现AOP的框架,例如 AspectJ 或 Spring AOP ## 2. 切点定义 常用的Pointcut定义有 execution 和 [@annotation](https://my.oschina.net/annotation) 两种。execution 定义对方法无侵入,用于实现比较通用的切面。[@annotation](https://my.oschina.net/annotation) 可以作为注解加到特定的方法上,例如Spring的Transaction注解。 execution切点定义应该放在一个公共的类中,集中管理切点定义。 示例: ```java public class CommonJoinPointConfig { @Pointcut("ex...
QiHaiYan 发布于 5天前 阅读 945 评论 1

NEO从源码分析看网络通信

### **_0x00 前言_** NEO被称为中国版的Ethereum,支持C#和java开发,并且在社区的努力下已经把SDK拓展到了js,python等编程环境,所以进行NEO开发的话是没有太大语言障碍的。 比特币在解决拜占庭错误这个问题时除了引入了区块链这个重要的概念之外,还引入了工作量证明(PoW)这个机智的解决方案,通过数学意义上的难题来保证每个区块创建都需要付出计算量。然而实践已经证明,通过计算来提供工作量证明,实在是太浪费:全世界所有的完全节点都进行同样的计算,然而只有一个节点计算出的结果会被添加到区块链中,其余节点计算消耗的电力就都白白浪费了。尤其,工作量证明存在一个51%的可能攻击方案,就是说只要有人掌握了世界上超过50%的算力,那么他就可以对比特币这个系统进行攻击,重置区块链。中本聪先生发明这个算力工作量证明方法的时候大概没有料到会有人专门为了挖矿开发出ASIC矿机。 NEO在解决这些问题的时候提出了一个新的共享机制DBFT 全称为 Delegated Byzantine Fault Tolerant。NEO将节点分为两种,一种为普通节点,不参与共识,也就是不进行认证交易签名区块的过程。另一种是则是共识节点。顾名思义,就是可以参与共识的节点,这部分基础概念可以参考[官方...
暖冰 发布于 1周前 阅读 602 点赞 2

JSON入门看这一篇就够了

什么是JSON JSON:JavaScript Object Notation 【JavaScript 对象表示法】 JSON 是存储和交换文本信息的语法。类似 XML。 JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S 为什么需要JSON 提到JSON,我们就应该和XML来进行对比。XML也是一种存储和交换文本信息的手段。那么JSON好在哪里呢?? JSON 比 XML 更小、更快,更易解析。 javaScript原生支持JSON,解析速度会很快 XML解析成DOM对象的时候,浏览器【IE和fireFox】会有差异 使用JSON会更简单     更加容易创建JavaScript对象 var p = {'city':['北京','上海','广州','深圳']}; for(var i=0;i<p.city.length;i++){ document.write(p.city[i]+"<br/>"); } JSON语法 客户端与服务端的交互数据无非就是两种 数组 对象 于是乎,JSON所表示的数据要么就是对象,要么就是数组 JSON语法是javaScript语法的子集,javaScript用[]中括号来表示数组,用{}大括号来表示对象,JSON亦是如此 JSON数组: var employees = [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ]; JSON对象 ...
Java3y 发布于 2周前 阅读 1404 评论 13 点赞 1

你的斗地主能拿多少炸?

最近无聊,想知道一下玩斗地主的话我能有多大的概率拿到炸弹(4张同点数牌 或 集齐大小王)。但是我概率学学得不好,于是想到用统计学来试试,随手写了一个程序模拟一下斗地主的发牌过程 #### 面向对象Card 首先依据OOP思想,我把牌看作是一个对象,点数与花色是其属性,为了处理大小王加入了Type属性 ```java public class Card { Suit suit; Size size; Type type; Card(Suit suit, Size size) { this.suit = suit; this.size = size; this.type = Type.Ordinary; } Card(Type type) { if (type.equals(Type.Ordinary)) { throw new RuntimeException("非法参数"); } this.type = type; } } ``` 三个属性我都用了枚举类来表示,纯粹是因为既然是面向对象,那么就纯粹一点 ```java public enum Size { P3(0), P4(1), P5(2), P6(3), P7(4), P8(5), P9(6), P10(7), J(8), Q(9), K(10), A(11), P2(12); int sequence; Size(int sequence) { this.sequence = sequence; } } ``` Size表示点数的大小,按从小到大排序。加入sequence属性目的是为了在统计时方便处理 ```java public enum Suit { Spade(4), Heart(3), Club(2), Diamond(1); // 权重 int weight; Suit(int weight)...
BekeyChao 发布于 2周前 阅读 803 评论 10 点赞 1

Machine Learning:十大机器学习算法

- 机器学习算法分类:监督学习、无监督学习、强化学习 - 基本的机器学习算法:线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强
RiboseYim 发布于 2周前 阅读 1908 评论 9 点赞 5

你需要Mobx还是Redux?

在过去一年,越来越多的项目继续或者开始使用React和Redux开发,这是目前前端业内很普遍的一种前端项目解决方案,但是随着开发项目越来越多,越来越多样化时,个人又有了不同的感受和想法。是不是因为已经有了一个比较普遍的,熟悉的项目技术栈,我们就一直完全沿用呢,有没有比他更适合的方案呢?恰逢团队最近有一个新项目,于是博主开始思考,有没有可能使用其他可替代技术开发呢?既能提高开发效率,又能拓展技术储备和眼界,经过调研,选择了Mobx,最终使用React+Mobx搭建了新项目,本篇总结分享从技术选型到项目实现的较完整过程,希望共同进步。
熊建刚 发布于 2周前 阅读 793 评论 4 点赞 1

大数据平台Hadoop的分布式集群环境搭建

1 概述 本文章介绍大数据平台Hadoop的分布式环境搭建、以下为Hadoop节点的部署图,将NameNode部署在master1,SecondaryNameNode部署在master2,slave1、slave2、slave3中分别部署一个DataNode节点 NN=NameNode(名称节点) SND=SecondaryNameNode(NameNode的辅助节点) DN=DataNode(数据节点) 2 前期准备 (1)准备五台服务器 如:master1、master2、slave1、slave2、slave3 (2)关闭所有服务器的防火墙 $ systemctl stop firewalld $ systemctl disable firewalld (3)分别修改各服务器的/etc/hosts文件,内容如下: 192.168.56.132 master1 192.168.56.133 master2 192.168.56.134 slave1 192.168.56.135 slave2 192.168.56.136 slave3 注:对应修改个服务器的/etc/hostname文件,分别为 master1、master2、slave1、slave2、slave3 (4)分别在各台服务器创建一个普通用户与组 $ groupadd hadoop #增加新用户组 $ useradd hadoop -m -g hadoop #增加新用户 $ passwd hadoop #修改hadoop用户的密码 切换至hadoop用户:su hadoop (5)各服务器间的免密码登录配置,分别在各自服务中执行一次 $ ssh-keygen -t rsa #一直按回车,会生成公私钥 $ ssh-copy-id hadoop@m...
FEINIK 发布于 2周前 阅读 1525 评论 6 点赞 6

Java可以如何实现文件变动的监听

应用中使用logback作为日志输出组件的话,大部分会去配置 `logback.xml` 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别,不用重启应用就可以生效 那么,这个功能是怎么实现的呢?
小灰灰Blog 发布于 2周前 阅读 1744 评论 12 点赞 3

高并发&高可用系统应对策略的一些思考

**说明:** - 仅仅是自己的一些观点和思考,如有问题欢迎指正 - 文中【】内提到的spring boot starter是自己封装的,地址:https://gitee.com/itopener/springboot #### **解耦神器:MQ** MQ是分布式架构中的解耦神器,应用非常普遍。有些分布式事务也是利用MQ来做的。由于其高吞吐量,在一些业务比较复杂的情况,可以先做基本的数据验证,然后将数据放入MQ,由消费者异步去处理后续的复杂业务逻辑,这样可以大大提高请求响应速度,提升用户体验。如果消费者业务处理比较复杂,也可以独立集群部署,根据实际处理能力需求部署多个节点。需要注意的是: - 需要确认消息发送MQ成功 比如RabbitMQ在发送消息到MQ时,就有发送回调确认,虽然不能够完全避免消息丢失,但也能够避免一些极端情况下消息发送失败的情况了。可以利用MQ的事务来避免更多情况的消息丢失 - 消息持久化 需要注意配置消息持久化,避免MQ集群挂掉的情况下大量丢失消息的情况 - 消息消费的幂等性 正常来说消息是不会重复发送的,但是一些特殊情况也可能会导致消息重复发送给消费者,一般会在消息中加一个全局唯一的流水号,通过流水号来判断消息是否已经消费过 - 注意用户体验 使用异步处理是在提高系统吞吐量...
J猿 发布于 2周前 阅读 3858 评论 24 点赞 20

JSP自定义标签就是如此简单

为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_BODY,EVAL_BODY等等的变量代表着什么,在什么方法中使用。这样实在是太麻烦了! 因此,为了简化标签开发的复杂度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。。 一般来说,实现了SimpeTag接口的标签称之为简单标签 SimpleTag接口 首先我们来看一下它的源码吧: public interface SimpleTag extends JspTag { void doTag() throws JspException, IOException; void setParent(JspTag var1); JspTag getParent(); void setJspContext(JspContext var1); void setJspBody(JspFragment var1); } setParent()和getParent()方法就不多说了,我们来看一下剩下的3个方法: void doTag() throws JspException, IOException; void setJspContext(JspContext var1); void setJspBody(JspFragment var1); 明显地: doTag()就是我们要写代码处理逻辑地方 setJspContext(JspContext var1)是将PageContext对象传递给标...
Java3y 发布于 2周前 阅读 1912 评论 14 点赞 3

如何编写高性能的 RPC 框架

在 [RPC Benchmark Round 1](https://my.oschina.net/u/1014759/blog/1616349) 中,[Turbo](https://github.com/hank-whu/turbo-rpc) 性能炸裂表现强悍,并且在 listUser 这一项目中,取得了 10x dubbo 性能的好成绩。本文将介绍 [Turbo](https://github.com/hank-whu/turbo-rpc) 强悍性能背后的原理,并探讨如何编写高性能的 RPC 框架。 ## 过早的优化是万恶之源? 这句话是 *The Art of Computer Programming* 作者,图领奖得主 Donald Knuth 大神说的。不过对于框架设计者而言,这句话并不正确。在设计一款高性能的基础框架时,必须始终重视性能优化,并将性能测试贯穿于整个设计开发过程中。这方面做到极致的类库有 [Disruptor](https://github.com/LMAX-Exchange/disruptor) [JCTools](https://github.com/JCTools/JCTools) [Agrona](https://github.com/real-logic/agrona) [DSL-JSON](https://github.com/ngs-doo/dsl-json) 等等,这几个高性能类库都坚持一个原则:不了解性能的外部类库坚决不用,如果现有的类库不能满足性能要求,那就重新设计一个。作为 [Turbo](https://github.com/hank-whu/turbo-rpc) 的设计者,我也尽量坚持这一原则,努力做到 Benchmark 驱动...
鲁小憨 发布于 2周前 阅读 4230 评论 51 点赞 17

腾讯技术分享:社交网络图片的带宽压缩技术演进之路

为了进一步降低运营带宽成本,减小用户访问流量及提升页面加载速度,社交网络 CDN运维紧跟行业图片优化趋势,创新引入WebP、SharpP、自适应分辨率、Guetzli等图像压缩技术到现网,经过三年多的多部门联合攻关,已逐渐形成一套覆盖全图片类型(JPEG、JPG、PNG、WebP、GIF)多场景的图片压缩运营体系,适用于各类型终端,每年节约外网带宽几百G。
JackJiang- 发布于 3周前 阅读 3914 评论 7 点赞 5

RabbitMQ 实战(二)Spring Boot 整合 RabbitMQ

这篇文章主要讲基本的整合。先把代码跑起来,再说什么高级特性。 ## RabbitMQ 中的一些术语 如果你打开 RabbitMQ web 控制台,你会发现其中有一个 Exhanges 不好理解。下面简单说明一下。 ![](http://img.nextyu.com/2018-02-04-15177510378323.jpg) ### 交换器(Exchange) 交换器就像路由器,我们先是把消息发到交换器,然后交换器再根据路由键(routingKey)把消息投递到对应的队列。(明白这个概念很重要,后面的代码里面充分体现了这一点) ### 队列(Queue) 队列很好理解,就不用解释了。 ### 绑定(Binding) 交换器怎么知道把这条消息投递到哪个队列呢?这就需要用到绑定了。大概就是:使用某个路由键(routingKey)把某个队列(Queue)绑定到某个交换器(Exchange),这样交换器就知道根据路由键把这条消息投递到哪个队列了。(后面的代码里面充分体现了这一点) ## 加入 RabbitMQ maven 依赖 ``` org.springframework.boot spring-boot-starter-amqp ``` 再加入另外一个依赖(这个依赖可省略,主要是用来简化代码) ``` cn.hutool hutool-all 4.0.2 ``` ## RabbitMQConfig.java 配置 ``` @Configuration public class RabbitMQConfig { public final static Str...
皂白 发布于 3周前 阅读 3737 评论 11 点赞 9

怎样对 RPC 进行有效的性能测试

在 RPC Benchmark Round 1 中 turbo 的成绩一骑绝尘,实力碾压众 rpc 框架。对此,很多人表示不服气,认为作者既是运动员又是裁判员有失公平。所以我认为有必要解释一下 rpc-benchmark 的公正性,以及为什么 turbo 能够如此强悍。 参考对象 rpc-benchmark 灵感源自 techempower-benchmarks,为了能够评测众多服务器框架,techempower-benchmarks 提供了6个测试用例: JSON serialization This test exercises the framework fundamentals including keep-alive support, request routing, request header parsing, object instantiation, JSON serialization, response header generation, and request count throughput. Single database query This test exercises the framework's object-relational mapper (ORM), random number generator, database driver, and database connection pool. Multiple database queries This test is a variation of Test #2 and also uses the World table. Multiple rows are fetched to more dramatically punish the database driver and connection pool. At the highest queries-per-request tested (20), this test...
鲁小憨 发布于 3周前 阅读 2033 评论 22 点赞 4

利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)

![iPhone 5S](http://upload-images.jianshu.io/upload_images/9824247-b8c9f19a9e567080.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) --- 最近被业务折腾的死去活来,实在没时间发帖,花了好多个晚上才写好这篇帖子,后续会加油的! --- 【利用K8S技术栈打造个人私有云系列文章目录】 - [利用K8S技术栈打造个人私有云(连载之:初章) ](https://www.jianshu.com/p/9bc87b5380e8) - [利用K8S技术栈打造个人私有云(连载之:K8S集群搭建)](https://www.jianshu.com/p/7d1fb03b8925) - [利用K8S技术栈打造个人私有云(连载之:K8S环境理解和练手)](https://www.jianshu.com/p/5b0cd99e0332) - 利用K8S技术栈打造个人私有云(连载之:基础镜像制作与实验)(Coming Soon...) - 利用K8S技术栈打造个人私有云(连载之:资源控制研究)(Coming Soon...) - 利用K8S技术栈打造个人私有云(连载之:私有云客户端打造)(Coming Soon...) - 利用K8S技术栈打造个人私有云(连载之:总结与升华)(Coming Soon...) ----- ## 环境介绍 > 玩集群嘛,当然要搞几台机器做节点!无赖自己并没有性能很强劲的多余机器,在家里翻箱倒柜,找出了几台破旧的本子,试试看吧,...
hansonwang 发布于 3周前 阅读 4290 评论 30 点赞 8

RPC Benchmark,Dubbo垫底

rpc-benchmark 说明及答疑 几乎所有的 RPC 框架都宣称自己是“高性能”的, 那么实际结果到底如何呢, 让我们来做一个性能测试吧. 项目地址:   https://github.com/hank-whu/rpc-benchmark   https://gitee.com/hank-whu/rpc-benchmark 测试说明 仅限于Java. 客户端使用JMH进行压测, 32 线程, 10 次预热, 3 次运行. 每次运行前都会执行 killall java, 但没有在每轮测试时重启操作系统. 所有类库版本在发布时都是最新的, 除非存在bug. 所有框架都尽量参考该项目自带的Benchmark实现. 将会一直持续, 不定期发布测试结果. 测试用例 boolean existUser(String email), 判断某个 email 是否存在. boolean createUser(User user), 添加一个 User. User getUser(long id), 根据 id 获取一个用户. Page<User> listUser(int pageNo), 获取用户列表. 运行结果 生成时间: 2018-01-28 14:36:24. 硬件环境: 阿里云 ecs.c4.xlarge, Intel Xeon E5-2667v4, 4CPU 8GB RAM 两台. 软件环境: Ubuntu x64 16.04.5, Java HotSpot(TM) 64-Bit Server VM 9.0.4+11. 启动参数: java -server -Xmx1g -Xms1g -XX:MaxDirectMemorySize=1g -XX:+UseG1GC. existUser 判断某个 email 是否存在 framewor...
鲁小憨 发布于 3周前 阅读 5314 评论 78 点赞 5

大型高并发与高可用的三层缓存架构总结

对于高并发架构,毫无疑问缓存是最重要的一环,对于大量的高并发,可以采用三层缓存架构来实现,nginx+redis+ehcache
高级架构师 发布于 3周前 阅读 4559 评论 4 点赞 4
顶部