开源中国

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

It appears you’re using an unsupported browser

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

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

拯救小容量,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...
编辑部的故事 发布于 14小时前 阅读 783 评论 2

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 发布于 1天前 阅读 455 评论 2 点赞 1

Solidity 智能合约开发语言·数据类型

int/uint:变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8到uint256,以及int8到int256。需要注意的是,uint和int默认代表的是uint256和int256。 有符号整型能够表示负数的代价是其能够存储正数的范围的缩小,因为其约一半的数值范围要用来表示负数。如:uint8的存储范围为0 ~ 255,而int8的范围为-127 ~ 127
neo-chen 发布于 2天前 阅读 103

开源巨献:年度最佳 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 体验变得...
编辑部的故事 发布于 2天前 阅读 2305 评论 5 点赞 4

前端利器,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 偏向于一个发现不良实践的工具,...
编辑部的故事 发布于 2天前 阅读 968 评论 3 点赞 4

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 发布于 2天前 阅读 626 评论 1

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

本文是《Tomcat 源码分析之 doGet方法》的第一篇文章,主要介绍了源码分析的目标以及主要任务有哪些,并对Servlet知识点做了非常细致的介绍,帮助大家更好的了解 Servlet,以及为什么用户自定义的 Servlet 需要继承 HttpServlet。
算法与编程之美 发布于 2天前 阅读 71

JDBC【事务、元数据、改造JDBC工具类】

1.事务 事务指的就是:在一个SESSION中进行的操作要么全部成功,要么全部失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样【A账户的钱没变,B账户的钱也没变】。 事例说明: /* * 我们来模拟A向B账号转账的场景 * A和B账户都有1000块,现在我让A账户向B账号转500块钱 * * */ //JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题 //A账户减去500块 String sql = "UPDATE a SET money=money-500 "; preparedStatement = connection.prepareStatement(sql); preparedStatement.executeUpdate(); //B账户多了500块 String sql2 = "UPDATE b SET money=money+500"; preparedStatement = connection.prepareStatement(sql2); preparedStatement.executeUpdate(); 从上面看,我们的确可以发现A向B转账,成功了。可是**如果A向B转账的过程中出现了问题呢?**下面模拟一下 //A账户减去500块 String sql = "UPDATE a SET money=money-500 "; preparedSt...
Java3y 发布于 2天前 阅读 131 评论 2

以太坊·将自定义数据写入到区块链中

本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 本文作者最近在找工作,有意向致电 13113668890 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com> 文档始创于2018-02-10 版权 © 2018 Netkiller(Neo Chan). All rights reserved.   版权声明 转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。 http://www.netkiller.cn http://netkiller.github.io http://netkiller.sourceforge.net 微信订阅号 netkiller-ebook (微信扫描二维码) QQ:13721218 请注明“读者” QQ群:128659835 请注明“读者”   5.5. 实用例子 5.5.1. 数据写入到区块链中 做一笔交易,并写入数据到区块链中 let Web3 = require("web3"); let fs = require("fs"); let web3 = new Web3("http://localhost:8545"); let log = { time:(new Date).getTime(), type:"info", msg:"Web3 Test!!!" }; let str = JSON.stringify(log); console.log(str); let data = Buffer.from(str).toString('hex'); data = '0x'+data; console.log(data); //将数据写入到交易中 let ...
neo-chen 发布于 2天前 阅读 95

实用又好用,6 款 Python 特殊文本格式处理库推荐

以下是一些 Python 编写的用来解析和操作特殊文本格式的库,希望对大家有所帮助。 1、Tablib Tablib 是一个用来处理与表格格式数据有关的 Python 库,允许导入、导出、管理表格格式数据,并具备包括切片、动态列、标签和过滤,以及格式化导入和导出等高级功能。 Tablib 支持导出/导入的格式包括:Excel 、JSON 、YAML 、HTML 、TSV 和 CSV ,暂不支持 XML 。 >>> data = tablib.Dataset(headers=['First Name', 'Last Name', 'Age']) >>> for i in [('Kenneth', 'Reitz', 22), ('Bessie', 'Monke', 21)]: ... data.append(i) >>> print(data.export('json')) [{"Last Name": "Reitz", "First Name": "Kenneth", "Age": 22}, {"Last Name": "Monke", "First Name": "Bessie", "Age": 21}] >>> print(data.export('yaml')) - {Age: 22, First Name: Kenneth, Last Name: Reitz} - {Age: 21, First Name: Bessie, Last Name: Monke} >>> data.export('xlsx') <censored binary data> >>> data.export('df') First Name Last Name Age 0 Kenneth Reitz 22 1 Bessie Monke 21 2、Openpyxl Openpyxl 是一个用于读写 Excel 2010 xlsx / xlsm / x...
编辑部的故事 发布于 3天前 阅读 1114 点赞 2

里程碑:DTrace 切换到 GPL 许可证

News:dtrace dropped the CDDL and switched to the GPL!
RiboseYim 发布于 4天前 阅读 47

NEO从源码分析看网络通信

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

iOS使用shell脚本注入混淆内容

使用shell脚本简化重复工作,提高工作效率666
aron1992 发布于 6天前 阅读 99

Spring Boot 整合 Shiro 实现登录认证

安全无处不在,趁着放假读了一下 Shiro 文档,并记录一下 Shiro 整合 Spring Boot 在数据库中根据角色控制访问权限 # 简介 Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。 ![Shiro Architecture](http://img.blog.csdn.net/20180123210643079?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RhY2tmaW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 上图是 Shiro 的基本架构 ### Authentication(认证) 有时被称为“登录”,用来证明用户是用户他们自己本人 ### Authorization(授权) 访问控制的过程,即确定“谁”访问“什么” ### Session Management(会话管理) 管理用户特定的会话,在 Shiro 里面可以发现所有的用户的会话信息都会由 Shiro 来进行控制 ### Cryptography(加密) 在对数据源使用加密算法加密的同时,保证易于使用 # Start ### 环境 Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data Jpa Lombok ### 添加依赖 这里只给出主要的 Shiro 依赖 ``` org.apache.shiro shiro-spring-boot-starter 1.4.0-RC2 ``` ### 配置 我们暂时只需要用户表、...
stackfing 发布于 6天前 阅读 158

Ubuntu on Windows10 跨平台开发环境搭建权威指南

程序猿经常争论的一个话题是:日常开发到底 Windows 好还是 Linux 好?进而演化出另一个问题:到底选 MacBook 好还是 SurfaceBook 好? 选择 Linux 系统或者 mac 笔记本的同学最核心的理由是 Linux/Mac 开发、编译工具链比较完善,很多环境或者安装包都系统自带了,写出来的程序可以很方便的通过开发、测试与线上系统对接,开发测试效率比较高,而 Windows 下开发的同学可能需要考虑开发、测试代码的可移植性问题。就拿笔者来说,也曾经遇到过某些 java/python API 不支持 Windows 的问题,这给日常开发带来了不小的麻烦。 在 Windows10 以前,咱们为了解决 Windows 开发环境跨平台的问题,往往会选择 cygwin,这个项目本身已经很成熟了,笔者也用了很多年,它能在 Windows 下模拟一套类 Linux 的环境,用它应付一般的开发测试问题不大。但它的缺点在于组件、包管理器比较弱,对于日后的环境维护相当麻烦,而且一些底层 API 模拟的并不完善,对于一些涉及 Linux 底层的系统调用等场景显得很鸡肋。幸运的是在 2016 年,微软在 Windows10 WSL 里开始内置 Ubuntu,之后又开始在 Microsoft Store 以 UWP APP 的形式发布各个 Linux 系统...
xrzs 发布于 7天前 阅读 4204 评论 5 点赞 1

打造炫酷的通知插件EasyToaster

HTML + CSS + JS 原生实现, 兼容 Chrome, Firefox, IE9 及以上, 兼容 PC,移动端
lonelydawn 发布于 1周前 阅读 40

大话循环神经网络(RNN)

—— 原文发布于本人的微信公众号“大数据与人工智能Lab”(BigdataAILab),欢迎关注。     在上一篇文章中,介绍了 卷积神经网络(CNN)的算法原理,CNN在图像识别中有着强大、广泛的应用,但有一些场景用CNN却无法得到有效地解决,例如: 语音识别,要按顺序处理每一帧的声音信息,有些结果需要根据上下文进行识别; 自然语言处理,要依次读取各个单词,识别某段文字的语义 这些场景都有一个特点,就是都与时间序列有关,且输入的序列数据长度是不固定的。 而经典的人工神经网络、深度神经网络(DNN),甚至卷积神经网络(CNN),一是输入的数据维度相同,另外是各个输入之间是独立的,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立。   而在现实生活中,例如对一个演讲进行语音识别,那演讲者每讲一句话的时间几乎都不太相同,而识别演讲者的讲话内容还必须要按照讲话的顺序进行识别。 这就需要有一种能力更强的模型:该模型具有一定的记忆能力,能够按时序依次处理任意长度的信息。这个模型就是今天的主角“循环神经网络”(Recurrent Neural Networks,简称RNN)。 循环神经网络(RNN),神经元的输出可以在下一个时间戳直接作用到自身(作为输入)...
雪饼 发布于 1周前 阅读 126

AutoML自动化机器学习技术深入

之前发表了一篇介绍AutoML技术的文章,但感觉还不够深入。今天抽出时间来仔细分析了AutoML相关框架的源码,见微知著,希望能更全面准确的把握目前的AutoML技术现状。 这次,我首先拿Auto_ML这块框架作为切入点,分析了框架源码的工作流,以及用到的技术,再与其他框架进行了横向比较,分析记录如下: AutoML 1.首先创建 Predictor 预测器; 一个Predictor预测器支持两种类型的任务:分类和回归 主要设置两个参数 type_of_estimator 和 column_descriptions type_of_estimator 指定了任务类型(classifier 或者 regressor) column_descriptions 指定了字段描述信息,如果为分类任务时,需指定Y所在的列(output)   2.调用Predictor 预测器的train方法训练模型; 一个简单的train方法,却做了很多事情: a. _clean_data_and_prepare_for_training :数据清洗和准备 _prepare_for_training:准备X和Y;删除X中的重复字段;删除Y值缺失的记录;将X中所有字段转换为float类型; 将Y值标准化; b.fit_transformation_pipeline :数据转换并输入管道 如果要使用深度学习组件,这里就会多一步特征学习的过程,调用方法名为:fit_feature_learning_and_transformation_pipeline 适应...
邵可佳 发布于 1周前 阅读 95 打赏 2

Gateway杂谈:Gateway环境的构建和整合

gateway
fagongzi 发布于 1周前 阅读 32

佟刚Spring4.0学习笔记

1. 概述 Spring是一个开源框架,它为简化企业级应用开发而生,可以使简单的JavaBean实现以前只有EJB才能实现的功能。 1.1. 特点 轻量级(非侵入性):基于Spring开发的时候,我们不需要实现Spring提供的任何接口,也不需要继承Spring的任何类,然后我们就可以使用Spring给我们提供的功能 依赖注入(DI-Dependency Injection、IOC) 面向切面编程(AOP-Aspect Oriented Programming) 容器:Spring是一个容器,它可以管理应用对象的生命周期 一站式框架:在IOC和AOP的基础上可以整合各种企业级的开源框架和优秀的第三方类库(实际上Spring自身也提供了展现层的Spring MVC和持久层的Spring JDBC) 组件组合:Spring实现了使用简单的组件组合成一个复杂的应用,在Spring中可以使用XML配置和Java注解组合这些组件 1.2. 模块 1.3. 配置文件 一个典型的Spring项目需要创建一个或多个Bean配置文件,这些配置文件用于配置Spring IOC容器管理的Bean。Bean的配置文件可以放在Classpath下,也可以放在其它目录下。 2. Hello World HelloWorld.java package org.lin.stu.spring; public class HelloWorld { private String name; public void setName(String name) { ...
情话撩人 发布于 1周前 阅读 658 点赞 1

拯救小容量,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...
编辑部的故事 发布于 14小时前 阅读 783 评论 2

【码云周刊第 60 期】红包利器祝你开年大吉!

每周为您推送最有价值的开源技术内参!
码云Gitee 发布于 2周前 阅读 337

NEO从源码分析看数字资产

### _**0x00 引言**_ 比特币是泡沫么?也许是的。毕竟这东西除了用来炒,干什么实事都感觉肉疼。但是有人将比特币泡沫和郁金香泡沫相提并论就很气人了,郁金香什么鬼,长那么一年,开那么几天,泡沫还没破呢,郁金香已经花开花落几个春秋了。比特币就不一样了,不仅每一个区块产出的币都独一无二,而且每一枚币还拥有自己的独一无二的历史。世界上会有两千多万比特币,但是中本聪创世区块的那50枚币什么都替代不了。话说回来,如果当年郁金香泡沫时期开放的郁金香花株能被保存到现在,价值也绝对杠杠的。 但是问题来了,究竟是什么限定了加密货币的总量,我们拥有的“币”又究竟是什么呢?作为NEO源码分析希列的第三篇博客,本文将从源码的角度对[NEO](https://neo.org/)资产部分的源码进行解析。 前两篇文章链接: - [NEO从源码分析看共识协议](https://my.oschina.net/u/2276921/blog/1621870) - [NEO从源码分析看网络通信](https://my.oschina.net/u/2276921/blog/1622015) 注: _在接下来的文章中,英文缩写“NEO”指代NEO网络中使用的管理代币 “NEO Coin", 英文缩写"GAS"指代NEO网络中的燃料代币"NEOGas"._ ### **_0x01 资产总量_** 在讲解NEO网络中具体的资产之前需...
暖冰 发布于 8小时前 阅读 24

数据挖掘入门笔记

最近想学习一下数据挖掘的相关知识,从网上找了本《数据挖掘:概念与技术》来看看。打算写一些笔记,记录一下比较基础又重要的知识点。希望自己能把基础打牢一点,也希望能帮到一些跟我一样打算入门的小白。 1、数据挖掘可以看做信息技术自然进化的结果,它是基于数据库和数据管理产业不断发展的产物。 2、什么是数据挖掘? 通俗来说数据挖掘就是从大量数据中挖掘有趣模式和知识的过程。它是我们从大型数据集中提炼知识的一项基本步骤,全部步骤为:数据清洗(消除噪声和删除不一致数据)、数据集成(多种数据源可以组合在一起)、数据选择(从数据库中提取与分析任务相关的数据)、数据变换(通过汇总或聚集操作,把数据变换和统一成适合挖掘的形式)、数据挖掘(使用智能方式提取数据模式)、模式评估(根据某种兴趣度度量,识别代表知识的真正有趣的模式)、知识表示(使用可视化和知识表示技术,向用户提供挖掘的知识)。 3、数据库和数据仓库的区别 关系数据库是表的汇集,每个表中的数据都是高度结构化的结果,每条数据都由多个相同类型属性构成,因此使用起来可以十分方便的抓住数据的主要特征(是数据挖掘研究的一种主要数据形式)。数据仓库是一个从多个数据源收集...
辣鸡大学生代表 发布于 21小时前 阅读 10

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 发布于 10小时前 阅读 10 评论 2

解析链家小程序 - 请求加密方式

解析链家小程序 - 请求加密方式 数据需求,对链家小程序进行请求抓包,发现每次合法请求都存在 Authorization 授权码,想要成功模拟小程序发送请求,就必须破解Authorization 授权码的生成方式。 目录 1、获取链家微信小程序的 .wxapkg 包文件、解开 .wxapkg 程序包 2、了解.wxapkg文件结构 3、查看程序逻辑,实验生成Authorization 4、验证迭代、实现加密方式 1、获取链家小程序的 .wxapkg 包文件、解开 .wxapkg 程序包 原理:基于 android-sdk\platform-tools\adb工具,通过 root 权限获取小程序安装包 .wxapkg ,通过github 上的wechat-app-unpack 项目,逆向解压获取小程序源码。 获取小程序安装包 手机开启root权限,如何开启依据机型系统而定,这里使用网易MuMu模拟器, 默认开启root权限; 手机开启USB调试功能, 安装微信,打开链家小程序; 电脑安装 android-sdk; 获取小程序安装包: > adb shell # cd /data/data/com.tencent.mm/MicroMsg/70aa34178251376743797472a68c1c6a/appbrand/pkg # ls _-1261323258_6.wxapkg _1079392110_3.wxapkg _1123949441_106.wxapkg # cp _-1261323258_6.wxapkg /sdcard/ # exit > adb pull /sdcard/_-1261323258_6.wxapkg . 注意...
蜉尘 发布于 10小时前 阅读 9

今天发现家用电脑上装了个Apache,竟然还有如此厚颜无耻之徒

今天初五,打开电脑看任务管理器, 里面怎么会有httpd.exe进程???  打开一看位置 差点没有晕过去, 什么时候? 什么人? 什么情况? 索性看看htdocs吧, 就仨文件 那就看看呗,反正也看得懂. . 反正就是被劫持了, 也比较简单, 你访问 以下这些网站:    $name1 = "www.2345.com,2345.com,www.tao123.com,tao123.com";   $name2 = "www.xp519.com,xp519.com,www.xitongzhijia.net,xitongzhijia.net,www.386w.com,386w.com,www.xitong8.com,xitong8.com,www.hyghost.com,hyghost.com,moguxz.com,www.moguxz.com,www.xpxtzj.com,xpxtzj.com";   $name3 = "www.22mm.cc,www.mnsfz.com,www.4493.com,www.7160.com,www.youzi4.com,www.juemei.cc,www.mm131com,www.xiaojiuwo.com,www.tpdq.net,www.920mm.com,www.169pp.com,www.xgmm.cc,www.kmeitu.com,www.qq360x.com,www.123kmm.com,www.09218.com,www.mm3.cc,www.b4mm.com,www.tuku.com,www.xiaomm.cc,www.84420.com,www.gunianger.com,www.ii6i.com,www.mmkaixin.com,www.06324.com,www.6188.net,www.8mei.cc,www.mzitu.com,www.mmlin.com,www.mm588.com,www.meiniu.cc,www.t8a8.com,www.99521.com,www.kmeitu.com,www.909mm.co...
酷酷的就 发布于 6小时前 阅读 7 评论 3

AJAXJS-Base 1.0.8 发布

本人很高兴地宣布 AJAXJS-Base 1.0.8 业已发布。这次更新,主要完成了以下几点: - 重构了 Class Scanner,变为通用的 Java 资源扫描器; - 补充了相当多单元测试,覆盖率达到 74.4% ![输入图片说明](https://static.oschina.net/uploads/img/201802/20113259_XALo.jpg "在这里输入图片标题") 亲们欢迎使用和提交意见与建议,主页:https://framework.ajaxjs.com/framework/base.jsp ``` com.ajaxjs ajaxjs-base 1.0.8 ```
sp42 发布于 10小时前 阅读 7

微服务架构技术栈选型手册【转载】

一、前言 2014 年可以认为是微服务 1.0 的元年,当年有几个标志性事件,一是 Martin Fowler 在其博客上发表了”Microservices”一文,正式提出微服务架构风格;二是 Netflix 微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称 NetflixOSS,Netflix 的成功经验开始被业界认可并推崇;三是 Pivotal 将 NetflixOSS 开源微服务组件集成到其 Spring 体系,推出 Spring Cloud 微服务开发技术栈。 一晃三年过去,微服务技术生态又发生了巨大变化,容器,PaaS,Cloud Native,gRPC,ServiceMesh,Serverless 等新技术新理念你方唱罢我登场,不知不觉我们又来到了微服务 2.0 时代。 基于近年在微服务基础架构方面的实战经验和平时的学习积累,我想总结并提出一些构建微服务 2.0 技术栈的选型思路,供各位在一线实战的架构师、工程师参考借鉴。对于一些暂时还没有成熟开源产品的微服务支撑模块,我也会给出一些定制自研的设计思路。 二、选型准则 对于技术选型,我个人有很多标准,其中下面三项是最重要的: 1.    生产级 我们选择的技术栈是要解决实际业务问题和上生产抗流量的(选择不慎可能造成生产级事故),而不是简单做个 POC 或者 Demo...
wind2012 发布于 2小时前 阅读 12

家庭私有云盘系列教程-本地搭建家庭NAS方案

目前第三方云盘存在速度慢、限制多、取回难、费用高等各方面问题,这里进行本地搭建NAS方案,配置个人私有云盘前置基础,存储个人大量数据及共享分享给朋友使用。
Eller 发布于 23小时前 阅读 6

初探 Autojs ,写了个简单的微信群聊机器人

简单说一下 autojs ,这是一个开源(https://github.com/hyb1996/Auto.js 看账号貌似是个96年的小朋友?)的利用 Android 的无障碍服务实现的自动操作软件。   上代码: "auto"; //设置无障碍模式 fast为启用缓存 auto(); //暂时只支持群聊 toast("打开微信群聊天界面"); /** * a4 : 聊天界面 时间控件 id * apt: 聊天列表页 聊天摘要 * jg:聊天界面 头像 * aec > ae2:聊天界面 聊天图片 * jh : 聊天昵称 * ji: * y:头像和消息的父级 一个消息块 * * aab : 聊天界面 输入框 * hj: 聊天界面 标题栏 */ //console.log(text('微信').find()); //console.log(id('aab').exists()); //console.log(id('aps').findOne()); //log(id('ji').findOnce(id('ji').find().size()-1).parent().children().findOne(id('jh'))); var wait = 0; while(1){ var msg = getMsg(); log(msg); if(msg){ sendMsg(ai(msg[1])); wait = 0; }else{ sleep(1000); //没有新消息 等待1秒 ***这里可以根据情况调整*** wait += 1000; //5秒点击一次 保持屏幕常亮 if(wait > 5000){ if(id('ji').e...
dubox 发布于 7小时前 阅读 7

JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】

1.PreparedStatement对象 PreparedStatement对象继承Statement对象,它比Statement对象更强大,使用起来更简单 Statement对象编译SQL语句时,如果SQL语句有变量,就需要使用分隔符来隔开,如果变量非常多,就会使SQL变得非常复杂。PreparedStatement可以使用占位符,简化sql的编写 Statement会频繁编译SQL。PreparedStatement可对SQL进行预编译,提高效率,预编译的SQL存储在PreparedStatement对象中 PreparedStatement防止SQL注入。【Statement通过分隔符'++',编写永等式,可以不需要密码就进入数据库】 //模拟查询id为2的信息 String id = "2"; Connection connection = UtilsDemo.getConnection(); String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement preparedStatement = connection.preparedStatement(sql); //第一个参数表示第几个占位符【也就是?号】,第二个参数表示值是多少 preparedStatement.setString(1,id); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { System.out.println(resultSet.getString("name"...
Java3y 发布于 4天前 阅读 22

常用的分享源码(含微博、微信、QQ分享...)

生活在大数据互联网时代下的我们,每天都在不停的刷新朋友圈、微博、QQ空间,看到好的文章、图片等都会不由自主的想分享。使用者可以一秒钟完成内容分享,可是开发者要跳过不少坑后,才能开发出这么便捷的分享功能。 ![ 195713gggujro3j2q2h0j3.jpg ](/uploads/attachments/457950/20180119/2aaabede4560a9419e1191e3fb9bc256.jpg) 那么,开发者在开发微博、微信、QQ分享功能时,怎么做才能跳过这些坑,顺利完成分享功能?今天,柚子君直接分享源码给大家,帮你们缩短开发时间。 ------ 这部分可以放在公共的JS里面 ------ var zShare = {}; zShare.dialog = function(title,text,url,img){    var shareItems = [            {text:'微信好友',icon:'widget://image/wxsession.png'},            {text:'微信朋友圈',icon:'widget://image/wxtimeline.png'},            {text:'新浪微博',icon:'widget://image/sinaWb.png'},            {text:'QQ',icon:'widget://image/qq.png'},            {text:'QQ空间',icon:'widget://image/qZone.png'}        ]    var shareColumn = 5;    var dialogBox = api.require('dialogBox'...
API_Cloud 发布于 1个月前 阅读 12

第一个hadoop程序-WordCount

大数据
jackmanwu 发布于 8小时前 阅读 5

mac - Android Studio - Android Device Monitor 打开空白或提示安装 jdk6

今天搞 autojs 的微信自动聊天,想到用Android Device Monitor看看微信的布局。打开Android Device Monitor 后提示安装 jdk6 心想没必要装这么老的版本吧 ,就去官网下了最新的 jdk8 ,装好后打开界面是空白的啥也没有。 网上查了一下发现有人说是最新的 jdk1.8.0_161 版本不行,换 jdk1.8.0_144 就可以了。 这里稍微要注意的是 老版本和新版本可以共存 但默认会使用新版本,所以这里要删除掉新版本,方法是: 然后重启Android Studio就 ok 了。 历史版本 Java 下载页面:http://www.oracle.com/technetwork/cn/java/archive-139210-zhs.html
dubox 发布于 19小时前 阅读 5

目录结构

有好多个: /root:根用户的家目录 /etc:系统主要配置文件 /home:其它用户的家 /dev:系统设备相关文件 /lib:各种库文件,系统或软件程序 /boot:系统核心文件,开机所需文件 /bin:可执行的命令文件 /sbin:root才能执行的命令,文件 /tmp:临时存放数据的文件夹 /srv:服务启动后需要访问的数据,例如web访问需要的网友数据 /opt:第三方软件放置目录 /media:移动设备文件放置目录,如U盘 12个 --------- 简述 对于每一个学习 Linux 的人来说,了解 Linux 文件系统的目录结构至关重要。想要熟练使用 Linux,让 Linux 听命于自己,就必须掌握这些目录。   简述 目录结构 目录说明   目录结构 Linux 和 Windows 的最大不同之处在于目录结构的设计。进入 Windows 系统,打开 C 盘,你会发现一些常见的文件夹;而进入 Linux 后,执行 ls -l / 会发现在“/”(根目录)下包含很多的目录,比如 etc、usr、var、bin 等目录,进入其中一个目录后,看到的还是很多的文件和目录。 Linux 的目录结构类似于树形结构,如下所示: 要认识 Linux 的目录结构,首先要认识目录结构最顶层的“/”,任何目录、文件和设备等都在此目录下。Linux 的文路径与 Windows 不同,Linux 的文件路...
wsdsb 发布于 6小时前 阅读 5

一个基于Keras深度学习实验型情感分类的小玩意

短文本分类,keras
Digimon 发布于 3个月前 阅读 48 点赞 1

java 遍历类路径

``` // public class ClassPathScanner { private static final String PROTOCOL_FILE = "file"; private static final String PROTOCOL_JAR = "jar"; private static final String PREFIX_FILE = "file:"; private static final String JAR_URL_SEPERATOR = "!/"; private static final String CLASS_FILE = ".class"; private final String packageName; private final ClassFilter filter; public ClassPathScanner(String packageName) { this(packageName, null); } public ClassPathScanner(String packageName, ClassFilter filter) { this.packageName = packageName; this.filter = filter; } public List> scan() { List> list = new ArrayList>(); Enumeration en = null; try { en = getClass().getClassLoader().getResources(dotToPath(packageName)); } catch (IOException e) { e.printStackTrace(); } while (en.hasMoreElements()) { URL url = en.nextElement(); if (PROTOCOL_FILE.equals(url.getProtocol())) { File root = new File(url.getFile()); findInDirectory(list, root, root, packageName); } else if (PROTOCOL_JAR.equals(url.getProtoc...
kindcao 发布于 5小时前 阅读 5

影响英语单词拼写的6大因素

小编给你一个美联英语官方试听课申请链接: http://www.meten.com/?tid=16-73374-0 1、外来语的影响 对英语拼写影响较大的三种语言是希腊语(多数词汇通过拉丁语间接进入英语)、拉丁语(英语80%的词汇直接或间接来源于拉丁语)和法语。 1)希腊语: 英语中保留了一些典型的希腊语拼法,如发音为/k/的ch组合(chemistry、orchestra(n. 管弦乐队))等等,因为ch在希腊语中是一个字母,h表示是送气音、词首的rh组合(rhyme、rhetoric)等等,因为希腊语中与英语r对应的字母在词首必须有送气音标志、ps组合(psychology、psychiatrist)等等,因为ps在希腊语中是一个字母、mn组合(mnemonic)等等。此外,部分英语词汇的词尾单复数均遵循希腊语规则,如on→a(phenomenon/phenomena、criterion/criteria)、is→es(crisis / crises、thesis / theses)的变化。 2)拉丁语: 拉丁语对英语拼写的影响非常巨大,我们在3-6条还要涉及到,这里主要介绍对英语词尾的影响。以-us(如alumnus)、-a(如alga)、-um(如referendum、datum)等结尾的很多英语词汇都源于拉丁语,因而在变复数时遵循拉丁语的规则: us→i(alumni)、a→ae(algae)、um→a(referenda、data)等等。...
天蚕宝衣 发布于 1天前 阅读 4

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

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

Ubuntu on Windows10 跨平台开发环境搭建权威指南

程序猿经常争论的一个话题是:日常开发到底 Windows 好还是 Linux 好?进而演化出另一个问题:到底选 MacBook 好还是 SurfaceBook 好? 选择 Linux 系统或者 mac 笔记本的同学最核心的理由是 Linux/Mac 开发、编译工具链比较完善,很多环境或者安装包都系统自带了,写出来的程序可以很方便的通过开发、测试与线上系统对接,开发测试效率比较高,而 Windows 下开发的同学可能需要考虑开发、测试代码的可移植性问题。就拿笔者来说,也曾经遇到过某些 java/python API 不支持 Windows 的问题,这给日常开发带来了不小的麻烦。 在 Windows10 以前,咱们为了解决 Windows 开发环境跨平台的问题,往往会选择 cygwin,这个项目本身已经很成熟了,笔者也用了很多年,它能在 Windows 下模拟一套类 Linux 的环境,用它应付一般的开发测试问题不大。但它的缺点在于组件、包管理器比较弱,对于日后的环境维护相当麻烦,而且一些底层 API 模拟的并不完善,对于一些涉及 Linux 底层的系统调用等场景显得很鸡肋。幸运的是在 2016 年,微软在 Windows10 WSL 里开始内置 Ubuntu,之后又开始在 Microsoft Store 以 UWP APP 的形式发布各个 Linux 系统...
xrzs 发布于 7天前 阅读 4204 评论 5 点赞 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 体验变得...
编辑部的故事 发布于 2天前 阅读 2305 评论 5 点赞 4

Machine Learning:十大机器学习算法

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

前端利器,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 偏向于一个发现不良实践的工具,...
编辑部的故事 发布于 2天前 阅读 968 评论 3 点赞 4

实用又好用,6 款 Python 特殊文本格式处理库推荐

以下是一些 Python 编写的用来解析和操作特殊文本格式的库,希望对大家有所帮助。 1、Tablib Tablib 是一个用来处理与表格格式数据有关的 Python 库,允许导入、导出、管理表格格式数据,并具备包括切片、动态列、标签和过滤,以及格式化导入和导出等高级功能。 Tablib 支持导出/导入的格式包括:Excel 、JSON 、YAML 、HTML 、TSV 和 CSV ,暂不支持 XML 。 >>> data = tablib.Dataset(headers=['First Name', 'Last Name', 'Age']) >>> for i in [('Kenneth', 'Reitz', 22), ('Bessie', 'Monke', 21)]: ... data.append(i) >>> print(data.export('json')) [{"Last Name": "Reitz", "First Name": "Kenneth", "Age": 22}, {"Last Name": "Monke", "First Name": "Bessie", "Age": 21}] >>> print(data.export('yaml')) - {Age: 22, First Name: Kenneth, Last Name: Reitz} - {Age: 21, First Name: Bessie, Last Name: Monke} >>> data.export('xlsx') <censored binary data> >>> data.export('df') First Name Last Name Age 0 Kenneth Reitz 22 1 Bessie Monke 21 2、Openpyxl Openpyxl 是一个用于读写 Excel 2010 xlsx / xlsm / x...
编辑部的故事 发布于 3天前 阅读 1114 点赞 2

【码云周刊第 59 期】你想要的年会抽奖开源项目都在这里!

每周为您推送最有价值的开源技术内参!
码云Gitee 发布于 2周前 阅读 893 评论 5

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个月前 阅读 273839

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个月前 阅读 354489 点赞 1

免费云服务器

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

Nginx日志配置及分割

1. 格式化日志内容 2. 日志文件切割
tianshl 发布于 2个月前 阅读 272366 点赞 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个月前 阅读 271991 点赞 1

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个月前 阅读 338869

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周前 阅读 7763

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个月前 阅读 30635

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个月前 阅读 13866

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个月前 阅读 297566 评论 1

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个月前 阅读 12547

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个月前 阅读 47901

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个月前 阅读 12569

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个月前 阅读 30305

Spring加载resource时classpath*:与classpath:的区别

    Spring可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.classpath*:的出现是为了从多个jar文件中加载相同的文件.classpath:只能加载找到的第一个文件. 一、例子 比如 resource1.jar中的package 'com.test.rs' 有一个 'jarAppcontext.xml' 文件,内容如下: <bean name="ProcessorImplA" class="com.test.spring.di.ProcessorImplA" /> resource2.jar中的package 'com.test.rs' 也有一个 'jarAppcontext.xml' 文件,内容如下: <bean id="ProcessorImplB" class="com.test.spring.di.ProcessorImplB" /> 通过使用下面的代码则可以将两个jar包中的文件都加载进来 ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath*:com/test/rs/jarAppcontext.xml"); 而如果写成下面的代码,就只能找到其中的一个xml文件(顺序取决于jar包的加载顺序) ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/test/rs/jarAppcontext.xml");     classpath*:的使用是为了多个component(最终发布成不同的jar包)并行开发,各自的bean定义文件按照一定的规则:package+filename,而使用这些com...
HarleyZhuge 发布于 1小时前

【工具使用系列】关于 MATLAB 应用编程接口,你需要知道的事

# 如何使用MATLAB应用编程接口
AllenMoore 发布于 2小时前 阅读 2

微服务架构技术栈选型手册【转载】

一、前言 2014 年可以认为是微服务 1.0 的元年,当年有几个标志性事件,一是 Martin Fowler 在其博客上发表了”Microservices”一文,正式提出微服务架构风格;二是 Netflix 微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称 NetflixOSS,Netflix 的成功经验开始被业界认可并推崇;三是 Pivotal 将 NetflixOSS 开源微服务组件集成到其 Spring 体系,推出 Spring Cloud 微服务开发技术栈。 一晃三年过去,微服务技术生态又发生了巨大变化,容器,PaaS,Cloud Native,gRPC,ServiceMesh,Serverless 等新技术新理念你方唱罢我登场,不知不觉我们又来到了微服务 2.0 时代。 基于近年在微服务基础架构方面的实战经验和平时的学习积累,我想总结并提出一些构建微服务 2.0 技术栈的选型思路,供各位在一线实战的架构师、工程师参考借鉴。对于一些暂时还没有成熟开源产品的微服务支撑模块,我也会给出一些定制自研的设计思路。 二、选型准则 对于技术选型,我个人有很多标准,其中下面三项是最重要的: 1.    生产级 我们选择的技术栈是要解决实际业务问题和上生产抗流量的(选择不慎可能造成生产级事故),而不是简单做个 POC 或者 Demo...
wind2012 发布于 2小时前 阅读 12

Centos7安装Solr7.2.1

下载solr7.2.1的压缩包和tomcat的包 wget http://mirrors.hust.edu.cn/apache/lucene/solr/7.2.1/solr-7.2.1.tgz wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.50/bin/apache-tomcat-8.0.50.tar.gz 解压压缩包并放到/opt/目录下 tar -xvf solr-7.2.1.tgz tar -xvf apache-tomcat-8.0.50.tar.gz cp apache-tomcat-8.0.50 /opt/tomcat -rf 创建/opt/solr_home目录 mkdir /opt/solr_home 清空tomcat下没用的项目 rm -rf /opt/tomcat/webapps/* 复制需要的文件到webapps下 cp solr-7.2.1/server/solr-webapp/webapp /opt/tomcat/webapps/solr -rf cp solr-7.2.1/server/lib/ext/* /opt/tomcat/webapps/solr/WEB-INF/lib/ cp solr-7.2.1/server/lib/metrics-*.jar /opt/tomcat/webapps/solr/WEB-INF/lib/ cp solr-7.2.1/dist/solr-dataimporthandler-* /opt/tomcat/webapps/solr/WEB-INF/lib/ 创建classes文件件 mkdir /opt/tomcat/webapps/solr/WEB-INF/classes 复制log4j.properties到classes下 cp solr-7.2.1/server/resources/log4j.properties /opt/tomcat/webapps/solr/WEB-INF/classes/ 修改web.xml # vim /opt/tomcat/webapps/solr/WE...
梁国强-java 发布于 2小时前 阅读 3

js 代码片段2

大概就是只转不看吧。。。 Anagrams of string(带有重复项的全排列) 使用递归。对于给定字符串中的每个字母,为字母创建字谜。使用map()将字母与每部分字谜组合,然后使用reduce()将所有字谜组合到一个数组中,最基本情况是字符串长度等于2或1。 const anagrams = str => { if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; return str.split('').reduce((acc, letter, i) => acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), []); }; // anagrams('abc') -> ['abc','acb','bac','bca','cab','cba'] console.log(anagrams('aaa')); //[ 'aaa', 'aaa', 'aaa', 'aaa', 'aaa', 'aaa' ] abcd 的全排列一共有64项 数组平均数 使用reduce()将每个值添加到累加器,初始值为0,总和除以数组长度。 const average = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length; // average([1,2,3]) -> 2 大写每个单词的首字母 使用replace()匹配每个单词的第一个字符,并使用toUpperCase()来将其大写。\b匹配一个单词的边界 const capitalizeEveryWord = str => str.rep...
阿豪boy 发布于 3小时前 阅读 2

技巧

连字符:- cd -:回到上一个工作目录,不是上层目录。 pwd: cd ~:用户的家目录中  
wsdsb 发布于 3小时前 阅读 3

顺序表实现的源码

#include #include #define MAXSIZE 10 //定义类型 typedef int DataType; //定义结构体 typedef struct { DataType list[MAXSIZE];//d定义DateType类型的数组 int size;//y用于记录数据的个数 } SeqList; void InitList(SeqList *l);//初始化 int length(SeqList l);//线性表的长度 int InsertList(SeqList *l,int i,DataType x);//在第i个元素前插入0<=isize=0; } int length(SeqList l){ return l.size; } int InsertList(SeqList * l,int i,DataType x){ //将i可以理解为将x插入i个元素前插入,也可以理解为将x插入list[i]中 if(i<0||i>MAXSIZE){ printf("输入的位置有误\n"); printf("插入失败\n"); return 0; } if(i==MAXSIZE){ printf("顺序表已满\n"); printf("插入失败\n"); return 0; } int j;//定义循环变量 for(j=l->size;j>i;j--) l->list[j]=l->list[j-1]; l->list[i]=x;//将要插入的元素插入 l->size++;//将书序表的长度加1 printf("插入成功\n"); return 1; } int DeleteList(SeqList *l,int i,DataType *x){ if(i<0||i>=MAXSIZE){ printf("删除位置有误\n"); printf("删除失败\n"); return 0; } if(l->size==0){ printf("表空,无法删除\n"); printf("删除...
南桥北木 发布于 3小时前 阅读 3

响应式微服务 in java 译 <十四> Circuit Breakers

响应式微服务 in java
woshixin 发布于 3小时前 阅读 2

java 遍历类路径

``` // public class ClassPathScanner { private static final String PROTOCOL_FILE = "file"; private static final String PROTOCOL_JAR = "jar"; private static final String PREFIX_FILE = "file:"; private static final String JAR_URL_SEPERATOR = "!/"; private static final String CLASS_FILE = ".class"; private final String packageName; private final ClassFilter filter; public ClassPathScanner(String packageName) { this(packageName, null); } public ClassPathScanner(String packageName, ClassFilter filter) { this.packageName = packageName; this.filter = filter; } public List> scan() { List> list = new ArrayList>(); Enumeration en = null; try { en = getClass().getClassLoader().getResources(dotToPath(packageName)); } catch (IOException e) { e.printStackTrace(); } while (en.hasMoreElements()) { URL url = en.nextElement(); if (PROTOCOL_FILE.equals(url.getProtocol())) { File root = new File(url.getFile()); findInDirectory(list, root, root, packageName); } else if (PROTOCOL_JAR.equals(url.getProtoc...
kindcao 发布于 5小时前 阅读 5

RedHat linux下cvs服务器的配置

RedHat linux下cvs服务器的配置
happyhuangjinjin 发布于 6小时前 阅读 3

今天发现家用电脑上装了个Apache,竟然还有如此厚颜无耻之徒

今天初五,打开电脑看任务管理器, 里面怎么会有httpd.exe进程???  打开一看位置 差点没有晕过去, 什么时候? 什么人? 什么情况? 索性看看htdocs吧, 就仨文件 那就看看呗,反正也看得懂. . 反正就是被劫持了, 也比较简单, 你访问 以下这些网站:    $name1 = "www.2345.com,2345.com,www.tao123.com,tao123.com";   $name2 = "www.xp519.com,xp519.com,www.xitongzhijia.net,xitongzhijia.net,www.386w.com,386w.com,www.xitong8.com,xitong8.com,www.hyghost.com,hyghost.com,moguxz.com,www.moguxz.com,www.xpxtzj.com,xpxtzj.com";   $name3 = "www.22mm.cc,www.mnsfz.com,www.4493.com,www.7160.com,www.youzi4.com,www.juemei.cc,www.mm131com,www.xiaojiuwo.com,www.tpdq.net,www.920mm.com,www.169pp.com,www.xgmm.cc,www.kmeitu.com,www.qq360x.com,www.123kmm.com,www.09218.com,www.mm3.cc,www.b4mm.com,www.tuku.com,www.xiaomm.cc,www.84420.com,www.gunianger.com,www.ii6i.com,www.mmkaixin.com,www.06324.com,www.6188.net,www.8mei.cc,www.mzitu.com,www.mmlin.com,www.mm588.com,www.meiniu.cc,www.t8a8.com,www.99521.com,www.kmeitu.com,www.909mm.co...
酷酷的就 发布于 6小时前 阅读 7 评论 3

初探 Autojs ,写了个简单的微信群聊机器人

简单说一下 autojs ,这是一个开源(https://github.com/hyb1996/Auto.js 看账号貌似是个96年的小朋友?)的利用 Android 的无障碍服务实现的自动操作软件。   上代码: "auto"; //设置无障碍模式 fast为启用缓存 auto(); //暂时只支持群聊 toast("打开微信群聊天界面"); /** * a4 : 聊天界面 时间控件 id * apt: 聊天列表页 聊天摘要 * jg:聊天界面 头像 * aec > ae2:聊天界面 聊天图片 * jh : 聊天昵称 * ji: * y:头像和消息的父级 一个消息块 * * aab : 聊天界面 输入框 * hj: 聊天界面 标题栏 */ //console.log(text('微信').find()); //console.log(id('aab').exists()); //console.log(id('aps').findOne()); //log(id('ji').findOnce(id('ji').find().size()-1).parent().children().findOne(id('jh'))); var wait = 0; while(1){ var msg = getMsg(); log(msg); if(msg){ sendMsg(ai(msg[1])); wait = 0; }else{ sleep(1000); //没有新消息 等待1秒 ***这里可以根据情况调整*** wait += 1000; //5秒点击一次 保持屏幕常亮 if(wait > 5000){ if(id('ji').e...
dubox 发布于 7小时前 阅读 7

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

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

第一个hadoop程序-WordCount

大数据
jackmanwu 发布于 8小时前 阅读 5

NEO从源码分析看数字资产

### _**0x00 引言**_ 比特币是泡沫么?也许是的。毕竟这东西除了用来炒,干什么实事都感觉肉疼。但是有人将比特币泡沫和郁金香泡沫相提并论就很气人了,郁金香什么鬼,长那么一年,开那么几天,泡沫还没破呢,郁金香已经花开花落几个春秋了。比特币就不一样了,不仅每一个区块产出的币都独一无二,而且每一枚币还拥有自己的独一无二的历史。世界上会有两千多万比特币,但是中本聪创世区块的那50枚币什么都替代不了。话说回来,如果当年郁金香泡沫时期开放的郁金香花株能被保存到现在,价值也绝对杠杠的。 但是问题来了,究竟是什么限定了加密货币的总量,我们拥有的“币”又究竟是什么呢?作为NEO源码分析希列的第三篇博客,本文将从源码的角度对[NEO](https://neo.org/)资产部分的源码进行解析。 前两篇文章链接: - [NEO从源码分析看共识协议](https://my.oschina.net/u/2276921/blog/1621870) - [NEO从源码分析看网络通信](https://my.oschina.net/u/2276921/blog/1622015) 注: _在接下来的文章中,英文缩写“NEO”指代NEO网络中使用的管理代币 “NEO Coin", 英文缩写"GAS"指代NEO网络中的燃料代币"NEOGas"._ ### **_0x01 资产总量_** 在讲解NEO网络中具体的资产之前需...
暖冰 发布于 8小时前 阅读 24

JavaScript 有用的代码片段和 trick

浮点数取整 注意:前三种方法只适用于32个位整数,对于负数的处理上和 Math.floor是不同的。 生成6位数字验证码 16进制颜色代码生成 驼峰命名转下划线 url查询参数转json格式 获取URL参数    
wuhaofan_ 发布于 9小时前 阅读 4

reactor-netty中TcpClient的create过程

## 序 本文主要研究一下reactor-netty中TcpClient的create的过程 ## maven ``` io.projectreactor.ipc reactor-netty 0.7.3.RELEASE ``` ## TcpClient reactor-netty-0.7.3.RELEASE-sources.jar!/reactor/ipc/netty/tcp/TcpClient.java ``` protected TcpClient(TcpClient.Builder builder) { ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); if (Objects.nonNull(builder.options)) { builder.options.accept(clientOptionsBuilder); } if (!clientOptionsBuilder.isLoopAvailable()) { clientOptionsBuilder.loopResources(TcpResources.get()); } if (!clientOptionsBuilder.isPoolAvailable() && !clientOptionsBuilder.isPoolDisabled()) { clientOptionsBuilder.poolResources(TcpResources.get()); } this.options = clientOptionsBuilder.build(); } ``` >loopResources和poolResources其实是通过TcpResources创建 >上面loopResources创建完之后,下面的poolResources其实是直接返回 ## clientOptionsBuilder.isLoopAvailable() reactor-netty-0.7.3.RELEASE-sources.jar!/reactor/ipc/netty/options/NettyOptions.java ``` public final ...
go4it 发布于 9小时前 阅读 4

AJAXJS-Base 1.0.8 发布

本人很高兴地宣布 AJAXJS-Base 1.0.8 业已发布。这次更新,主要完成了以下几点: - 重构了 Class Scanner,变为通用的 Java 资源扫描器; - 补充了相当多单元测试,覆盖率达到 74.4% ![输入图片说明](https://static.oschina.net/uploads/img/201802/20113259_XALo.jpg "在这里输入图片标题") 亲们欢迎使用和提交意见与建议,主页:https://framework.ajaxjs.com/framework/base.jsp ``` com.ajaxjs ajaxjs-base 1.0.8 ```
sp42 发布于 10小时前 阅读 7

解析链家小程序 - 请求加密方式

解析链家小程序 - 请求加密方式 数据需求,对链家小程序进行请求抓包,发现每次合法请求都存在 Authorization 授权码,想要成功模拟小程序发送请求,就必须破解Authorization 授权码的生成方式。 目录 1、获取链家微信小程序的 .wxapkg 包文件、解开 .wxapkg 程序包 2、了解.wxapkg文件结构 3、查看程序逻辑,实验生成Authorization 4、验证迭代、实现加密方式 1、获取链家小程序的 .wxapkg 包文件、解开 .wxapkg 程序包 原理:基于 android-sdk\platform-tools\adb工具,通过 root 权限获取小程序安装包 .wxapkg ,通过github 上的wechat-app-unpack 项目,逆向解压获取小程序源码。 获取小程序安装包 手机开启root权限,如何开启依据机型系统而定,这里使用网易MuMu模拟器, 默认开启root权限; 手机开启USB调试功能, 安装微信,打开链家小程序; 电脑安装 android-sdk; 获取小程序安装包: > adb shell # cd /data/data/com.tencent.mm/MicroMsg/70aa34178251376743797472a68c1c6a/appbrand/pkg # ls _-1261323258_6.wxapkg _1079392110_3.wxapkg _1123949441_106.wxapkg # cp _-1261323258_6.wxapkg /sdcard/ # exit > adb pull /sdcard/_-1261323258_6.wxapkg . 注意...
蜉尘 发布于 10小时前 阅读 9

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 发布于 10小时前 阅读 10 评论 2

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 发布于 1天前 阅读 455 评论 2 点赞 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 发布于 2天前 阅读 626 评论 1

NEO从源码分析看网络通信

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

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 发布于 1周前 阅读 1265 评论 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 发布于 1周前 阅读 726 评论 10 点赞 1

Machine Learning:十大机器学习算法

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

你需要Mobx还是Redux?

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

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

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

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

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

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

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

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...
皂白 发布于 2周前 阅读 3564 评论 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周前 阅读 2002 评论 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周前 阅读 4264 评论 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周前 阅读 5282 评论 78 点赞 5

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

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

mybatis-plus思维导图,让mybatis-plus不再难懂

Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
java思维导图 发布于 3周前 阅读 2044 评论 8 点赞 1

Spring Boot中使用LDAP来统一管理用户信息

> 很多时候,我们在构建系统的时候都会自己创建用户管理体系,这对于开发人员来说并不是什么难事,但是当我们需要维护多个不同系统并且相同用户跨系统使用的情况下,如果每个系统维护自己的用户信息,那么此时用户信息的同步就会变的比较麻烦,对于用户自身来说也会非常困扰,很容易出现不同系统密码不一致啊等情况出现。如果此时我们引入LDAP来集中存储用户的基本信息并提供统一的读写接口和校验机制,那么这样的问题就比较容易解决了。下面就来说说当我们使用Spring Boot开发的时候,如何来访问LDAP服务端。 ## LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP 之上的访问协议—LDAP。 LDAP目录中的信息是是按...
程序猿DD 发布于 3周前 阅读 2936 评论 3 点赞 2
顶部