开源中国

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

It appears you’re using an unsupported browser

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

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

监听器【第二篇应用】

从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性。如果没有登陆,那么Session的属性就应该为空。 现在,我们想要统计的是网站的在线人数。我们应该这样做:我们监听是否有新的Session创建了,如果新创建了Sesssion,那么在线人数就应该+1。这个在线人数是整个站点的,所以应该有Context对象保存。 大致思路: 监听Session是否被创建了 如果Session被创建了,那么在Context的域对象的值就应该+1 如果Session从内存中移除了,那么在Context的域对象的值就应该-1. 代码 监听器代码: public class CountOnline implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { //获取得到Context对象,使用Context域对象保存用户在线的个数 ServletContext context = se.getSession().getServletContext(); //直接判断Context对象是否存在这个域,如果存在就人数+1,如果不存在,那么就将属性设置到Context域中 ...
zhong1232 发布于 11小时前 阅读 42

Java 二维数组中的孤岛搜索

Java 二维数组中的孤岛搜索
IamOkay 发布于 11小时前 阅读 55

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

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

【干货】快速搭建CDH的yum本地源的详细过程

为了方便在局域网中安装CDH集群,搭建一个CDH的yum本地源,方便局域网内各节点安装。 在Cloudera的官网中给出了CDH本地源的搭建过程(官网说明文档链接),下面是本人亲自搭建的详细过程,首先要找一台能联网的主机来制作本地源,可自动下载必要的安装包(如果全部都无法联网,则手动下载相关的rpm安装包,只是麻烦了一些,过程是一样的),制作好本地源后该主机再断网给本地局域网作为yum源使用即可。 1、关闭防火墙、关闭selinux service iptables stop chkconfig iptables off [root@test001 selinux]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted 2、下载repo文件 根据操作系统下载repo文件(本人使用...
雪饼 发布于 14小时前 阅读 27

Java8 HashMap源码分析

HashMap是基于hash表的map的实现,使用key-value形式存储键值对,并允许使用 null 值和 null 键,但是key只能有一个为null. Map不保证映射的顺序,其内部是根据hash值去模运算去排列的。HashMap内部使用entry数组作为存储的介质.
EumJi 发布于 17小时前 阅读 59 评论 2

一篇文章看懂Java并发和线程安全(一)

一、前言     长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章。 二、导读     1、为什么有多线程?     2、线程安全描述的本质问题是什么?     3、Java内存模型(JMM)数据可见性问题、指令重排序、内存屏障 三、揭晓答案 1、为什么有多线程     谈到多线程,我们很容易与高性能画上等号,但是并非如此,举个简单的例子,从1加到100,用四个线程计算不一定比一个线程来得快。因为线程的创建和上下文切换,是一笔巨大的开销。     那么设计多线程的初衷是什么呢?来看一个这样的实际例子,计算机通常需要与人来交互,假设计算机只有一个线程,并且这个线程在等待用户的输入,那么在等待的过程中,CPU什么事情也做不了,只能等待,造成CPU的利用率很低。如果设计成多线程,在CPU在等待资源的过程中,可以切到其他的线程上去,提高CPU利用率。     现代处理器大多含有多个CPU核心,那么对于运算量大任务,可以用多线程的方式拆解成多个小任务并发的执行,提高计算的效率。     总结起来无非两点,提高CPU的利用率、...
冷血狂魔 发布于 1天前 阅读 158 评论 1

spring cloud eureka server 集群配置 要点

翻看了不少网上的教程   千篇一律 那些该配置 不该配置很模糊 很多都是入门教程  经过个人实践 总结了eureka server 几个要点: springcloud 版本  Dalson.SR4 # eureka server 高可用 配置 要点 eureka.instance.prefer-ip-address 不建议设置为true # eureka.client.registerWithEureka、 eureka.client.fetchRegistry 都要设置为true 默认值都为true # eureka.instance.appname =spring.application.name # 重要 defaultZone 高可用 不要使用ip 应该使用相应的域名DNS来配置 也就是 eureka.instance.hostname 指定DNS   每个分片必须指定hostname  不然当前分片显示不可用 eureka: instance: hostname: cluster1 最后一条很重要 分片是否成功的关键 一定要用dns来配置 windows 下 改host文件  linux 或者其他环境一样 样例配置   采用 3个实例集群  8761->8762->8763->8761     application.yml 如下: 运行指定配置文件spring.profiles.active=配置项   例如在springboot 可执行jar路径下 命令行执行  java -jar discovery-server-1.0-SNAPSHOT.jar --spring.profiles.active=master 启动了master 配置    红字换cluster1 对应启...
NotFound403 发布于 1天前 阅读 66

JVM你必须知道的那些事儿

一:写在前面 以前从不感觉jvm内部的这一块领域是必须掌握的知识点,大概了解一下就行,甚至可以说是只是知道一些概念化的东西,似乎跟我没有多大关系,但是随着工作年限的不断增加,发现在这件事情真是错了,特别是在当在乞丐环境下跑项目的时候,从代码优化到莫名其妙的错误排查,总归能找到这样那样的原因,回过头来想想,才发现,jvm这块真的很重要,很重要,很重要,重要的事情说三遍,但是依然哪天想起来总是没有好好的深入的去学习,好了伤疤忘了疼。。。。 如今跨入大数据开发领域,却发现调优这块工作无处不在,计算、分析、算法、模式等等似乎总是欠缺点什么东西,得,长痛不如短痛,下功夫深入的了解了一段时间,收货不少,很多东西也就想开了,记录一些核心的部分。 二:初识 不想上来就讲解jvm构成以及组成部分,百度一搜一大堆,没什么心意,先从实际的干饭说起,我们从第一天搞java开发,从来没有想过new了一个对象或者其他的东西后,需要我们手动去管理过他的内存空间释放,因为我们知道java有GC垃圾回收器这哥们的存在,他会帮我们处理好一切,这就好比我是皇帝,我想在哪建个行宫就在哪建,至于打扫战场的事儿,跟我没有关系,有总管专门去处理这件事情,...
寒冰蓝血 发布于 1天前 阅读 109

Spring事务管理(一)-三种配置方式

当项目的数据需要持久化存储时,不可避免要和数据库交互。在交互过程中,对事务的支持则是尤为重要。JDBC规范支持对事务的操作,在[深入浅出JDBC(一) - Connection与事务介绍](https://my.oschina.net/u/2377110/blog/1601409)一章中简要介绍了JDBC事务相关的概念。JDBC将对不同数据库的交互规范化,包括事务的操作,让开发者可以屏蔽不同数据库的差异使用接口编程。但事务的开启和关闭,以及事务的控制和配置还是需要手动编码控制,未免繁琐且易出错。Spring基于此之上,开放出一套事务管理机制,将开发者从繁琐的事务控制中解脱出来,可以便捷地执行事务控制。然而作为开发者,便捷之后的原理也需要了解,才能更好地把控程序。接下来,我将从Spring事务管理的配置到原理逐步介绍其运行机制,本篇先介绍三种从原始到简化的配置方式。 以mybatis+mysql为基础,基本的xml配置如下 ``` ``` 这里对mybatis的配置就不过多介绍了,事务定义在UserManager层,UserManager中定义一个批量操作的方法,来验证事务。 ``` @Slf4j public class UserManager { @Getter @Setter private UserMapper userMapper; public void batchOperator(){ User user = new User("lily", 25); // 插入...
青离 发布于 1天前 阅读 71

Vue(二)header组件开发

#### 一、 header 组件开发 之数据的传递 ##### 1. App.vue 引入组件 ``` import header from './components/header/header' ``` ##### 2. App.vue 中注册组件 ``` export default { components:{ v-header:header } } ``` ##### 3. 使用组件 ``` ``` ##### 解释::sell="sellerObj",这里就像一个函数传参一样把sell当成形参,sellerObj就是实参,那么父组件实参是怎么传给子组件的,通过什么传 ##### 4. 父组件向子组件传递数据 ##### 在父组件中需要将sellerObj作为数据导出,子组件通过props从父组件中获得数据,且要指定数据类型 ``` export default { props:{ // 子组件获取 父组件 数据 sell:{ type:Object // 传递的类型 } } } ``` #### 小结: - 子组件在props中创建一个属性,用以接收父组件传过来的值 - 父组件中注册子组件 - 在子组件标签中添加子组件props中创建的属性 - 把需要传给子组件的值赋给该属性 ##### 5. 调用数据 ``` {{sell.name}} {{sell.description + '/' + sell.deliveryTime + '分钟送达'}} ``` 细节问题: ##### support 绑定数据时 加 v-if ='sell.supports' ##### 理由 : 在我们通过axios获取数据前在父组件中创建了一个空的对象sellerObj...
张麻麻 发布于 1天前 阅读 59

以太坊私链入门

区块链是什么?一句话,它是一种特殊的(非关系型)分布式数据库,这种数据库只能做插入和查找操作,并且没有管理员。
neo-chen 发布于 1天前 阅读 114 评论 1 点赞 1

Android 广播优先级研究

Android 广播优先级研究
IamOkay 发布于 1天前 阅读 30

SpringBoot集成JPA

idea工具,框架springboot,数据库mysql 可根据实体类自动生成数据表 更方便的执行CRUD操作
千里明月 发布于 1天前 阅读 72 评论 1

Nodejs内存控制详解(上篇)

剖析Nodejs的内存模型以及内存控制、垃圾回收
sunangie 发布于 1天前 阅读 32

为Hexo博客添加LiveRe评论系统

最近有些网友问我,我的个人博客中的评论系统是怎么添加的,说实话我都有点忘了,毕竟搞了有好长一段时间了,唉不得不说这个遗忘得真是很快。 今天正好有时间,我就把如何为自己的Hexo博客添加评论系统写一篇水文好了。
hansonwang 发布于 1天前 阅读 24

分布式事务 TCC-Transaction 源码分析 —— 调试环境搭建

摘要: 原创出处 http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 TCC-Transaction 1.2.3.3 正式版** - [1. 依赖工具](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [2. 源码拉取](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [3. 初始化数据库](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [4. 启动 capital 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [5. 启动 redpacket 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [6. 启动 order 项目](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) - [666. 彩蛋](http://www.iocoder.cn/TCC-Transaction/build-debugging-environment/) ------- ![](https://user-gold-cdn.xitu.io/2018/1/20/161107247d2b37b4?w=750&h=330&f=jpeg&s=78520) > 🙂🙂🙂关注**微信公众号:【芋道源码】**有福利: > 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列...
芋道源码 发布于 1天前 阅读 60

深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

    本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和Java实现,以及效果测试。
echov 发布于 1天前 阅读 45

Jmockdata3.0.0全新发布,使用说明

Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架。单元测试的利器。
寻觅一只耳朵 发布于 1天前 阅读 54

Activiti 5.22.0 之自由驳回任务实现(亲测)

​ 上篇博文,我们完成一个任务SKIP的实现,说好要给各位看官带来驳回实现的现在,就奉上具体实现和讲解。(其实我感觉我的注释写的已经非常清楚了,哈哈) ​ 依旧是,先说我们的需求和思路。 PS: ​ 从6.0.0降到5.22.0版本的原因因为项目中有一个版本冲突,导致的降级。后期还是以新版本为主。6.0版本的驳回有时间再来搞。 需求: 流程中的审批任务节点可以驳回到之前的任意任务节点 驳回到指定节点的任务之后的轨迹不需要显示 嗯,大致上就是这样的一个需求,根据这个需求,其实我走了很多弯路,但都离不开两点。 思路: 1. 将当前的任务节点的下一个任务节点指定为指定的驳回任务节点 2. 将指定任务(目标任务)节点之后的流程轨迹,清空。 根据这个思路,我追了源码,看了各种Service,Manager等等。因为别人的驳回流程我拿下来发现是有错的,所以就自己研究了起来。现在就直接上代码吧。呸。先上图,没图谁会信你成功了呢? 启动报销流程 返回的是下个任务编号 启动后查询流程轨迹 查询流程中历史任务节点信息 驳回任务到指定任务节点 驳回后查询流程轨迹图 查询驳回的历史任务信息 启动一个新的流程实例 查询新的流程实例的轨迹 完成新的流程实例任务,模拟审批通过 ...
叶云轩 发布于 1天前 阅读 26

Spring Boot 与 Kotlin 验证web表单信息

《Spring Boot 与 kotlin 实战》 系列之验证web表单信息
quanke_ 发布于 1天前 阅读 47

bboss实现elasticsearch聚合查询案例

bboss 实现elasticsearch聚合查询案例 1.案例介绍 统计特定时间范围内每个应用的总访问量、访问成功数、访问失败数 2.准备工作  参考文档《高性能elasticsearch ORM开发库使用介绍》中的第1章节和第2章节,在自己的工程中导入bboss es依赖包和配置es  参数  3.定义统计dsl 在源码目录下新建文件esmapper/estrace/ESTracesMapper.xml,内容如下 <properties> <!-- 应用汇总统计:总访问量,成功数,失败数 bboss es dao通过名称applicationSumStatic引用脚本 --> <property name="applicationSumStatic"> <![CDATA[ { "query": { "bool": { "filter": [ {"range": { "startTime": { "gte": #[startTime],##统计开始时间 "lt": #[endTime] ##统计截止时间 } } } ] } }, "size":0, ...
bboss 发布于 2天前 阅读 129

ORACLE表赋权,存储过程赋权

  把一个表的查询,插入,修改,删除.....赋给另一个用户 grant select, insert, update, delete, references, alter, index on  表名  to 用户名   grant select, insert, update, delete, references, alter, index on O_C_ZHSB_GRYHZH to EAST_MODEL   把一个存储过程赋权给另一个用户 grant execute on  存储过程名字  to 用户名; 例: grant execute on PROC_VALIDATE_EXAMINER to EAST_MODEL
毕加索5481 发布于 3小时前 阅读 8

OpenCV + VTK + WebCam 采集和显示图像

#include <iostream> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteractionStyle) ; VTK_MODULE_INIT(vtkRenderingFreeType); #include <opencv2/opencv.hpp> #include <vtkImageActor.h> #include <vtkImageImport.h> #include <vtkImageData.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkCommand.h> //Function prototypes void Ipl2VTK(cv::Mat& src, vtkImageData *dst); //!Class vtkTimerCallback /** * This class add support for timing events */ class vtkTimerCallback : public vtkCommand { public: vtkTimerCallback(){} ~vtkTimerCallback(){} public: static vtkTimerCallback *New() { vtkTimerCallback *cb = new vtkTimerCallback; cb->TimerCount = 0; return cb; } virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId, void *vtkNotUsed(callData)) { if (vtkCommand::TimerEvent == eventId) { ++this->TimerCount; } ...
IOTService 发布于 3小时前 阅读 4

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

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

hive(01)、基于hadoop集群的数据仓库Hive搭建实践

hive(01)、基于hadoop集群的数据仓库Hive搭建实践
MaxBill 发布于 2周前 阅读 195

Siduction 2018.1.0:提供SSH处理

导读 基于Debian的siduction Linux操作系统今天已经更新到了2018.1.0版本,它是新一年的第一个ISO映像,带来了不少新功能和改进。 从2017年12月29日开始,与Debian Sid(Unstable)软件库同步,siduction 2018.1.0在新的一年发布了最新的组件,包括最新发布的Linux 4.14.10内核,systemd 236 init系统和X.Org Server 1.19.5显示服务器,以及一些增强功能。 它有不少于八种风格的桌面环境,包括KDE,GNOME,Xfce,LXDE,LXQt,Cinnamon,MATE,Xorg和noX。 siduction 2018.1.0附带最新版本的KDE Plasma 5.10.5,GNOME 3.26,Xfce 4.12.4,LXQt 0.12.0,Cinnamon 3.4.6和MATE 1.18.3桌面环境。 “令人遗憾的是,现在,GNOME,MATE和LXDE在很大程度上还没有得到维护,如果没有人能够将它们保持在可释放的状态,那么我们可能不得不在下一个版本中放弃这些风格。 但相应的软件包还将保留在档案中。”详情阅读今天的发布公告。 以下是siduction 2018.1.0中的新功能 siduction 2018.1.0的新功能包括实现日志轮转,以及日志的最大大小限制,以防止它变得太大,使得SSH(Secure Shell)开启和关闭的新脚本更容易实时安装系统,新的粘贴脚本以及完整的UEFI安装支持。 但是,似乎在C...
linuxprobe16 发布于 13小时前 阅读 3

复盘linux积蓄:构架搭建lamp二

apache和php结合、用户认证、域名跳转、访问日志不记录静态文件、防盗链、访问控制、限制php解析
历经35天的选择 发布于 3小时前 阅读 3

共享单车行业首起并购:永安行子公司收购哈罗单车

10月24日晚间, 常州永安公共自行车系统股份有限公司(永安行,603776)在官网披露,该公司的参股公司江苏永安行低碳科技有限公司(以下简称“低碳科技”),与上海钧正网络科技有限公司(以下简称“钧正科技”)签署了协议,约定低碳科技受让上海钧正网络科技有限公司100%股权,未来低碳科技与钧正科技双方业务将进行合并。
软件达人 发布于 3个月前 阅读 11

金矿数

const int max_n = 10;//程序支持的最多金矿数 const int max_people = 10000;//程序支持的最多人数 int n;//金矿数 int peopleTotal;//可以用于挖金子的人数 int[] peopleNeed = new int[max_n];//每座金矿须要的人数 int[] gold = new int[max_n];//每座金矿可以挖出来的金子数 int[,] maxGold = new int[max_people, max_n];//maxGold[i][j]保存了i个人挖前j个金矿可以得到的最大金子数,等于-1时表示未知 private void button2_Click(object sender, EventArgs e) { peopleTotal = 2500; n = 8; for (int i = 0; i <= peopleTotal; i++) for (int j = 0; j < n; j++) maxGold[i,j] = -1;//等于-1时表示未知 [相应动态规划中的“做备忘录”] peopleNeed = new int[] { 300, 200, 400, 240, 500, 310, 900, 560, 400 }; gold = new int[] { 20, 20, 30, 25, 40, 80, 100, 55, 25 }; for (int i = 0; i < n; i++) { System.Console.WriteLine( (float)gold[i] / peopleNeed[i]); } int max = GetMaxGold(peopleTotal, n - 1); textBox1.Text = max.ToString(); for (int j = 0; j < n; j++) { for (int i = 0; i <= peopleTotal; i++) { if (maxGold[i, j] != -1) { //Sy...
max佩恩 发布于 1个月前 阅读 7

Cookie+cession

一.会话技术     会话: 为了实现某一个功能, 浏览器和服务器之间可能会产生多次的请求和响应, 从浏览器访问服务器开始, 到最后浏览器关闭, 这期间产生的多次请求和响应就称之为浏览器和服务器之间的一次会话!     如何来保存会话中产生的数据???         ~request太小了         ~ServletContext域太大了 二.Cookie     1.Cookie概述         Cookie是将会话中产生的数据保存在客户端, 是客户端的技术.         浏览器访问服务器, 服务器获取到要保存的数据后, 会通过Set-Cookie响应头将数据再响应给浏览器, 浏览器收到后会保存在内部.         当浏览器再次访问服务器, 会通过Cookie请求头带着上次保存的数据, 服务器可以通过Cookie请求头获取数据, 通过这种方式可以保存会话中产生的数据!!         由于Cookie技术是将数据保存在客户端, 每个客户端都持有自己的数据, 需要时会带给服务器, 因此不会发生混乱          2.Cookie使用         SUN为了简化Cookie的操作, 提供了一套Cookie的API:         (1)创建Cookie             Cookie cookie = new Cookie(name, value);            ...
architect刘源源 发布于 13小时前 阅读 2

Selenium

Selenium笔记
anlve 发布于 5小时前 阅读 2 评论 1

社区给了PSI哪些帮助

PSI是一款基于SaaS模式(Software as a Service软件即服务)的企业管理软件。PSI以商贸企业的核心业务:采购、销售、库存(进销存)为切入点,最终目标是行业化的ERP解决方案。 PSI官网:https://gitee.com/crm8000/PSI 一个开源项目,越开放越能从社区获得力量。这是PSI这几年实践中获得的最大的感受。 那么PSI到底从社区中获得了哪些帮助和成长的力量呢? 1、被吐槽代码写得太垃圾。 吐槽也是生产力,被吐槽之后,就不断地改进代码的写法。 老司机都是从小白和翻车开始的起步的。 写的垃圾代码还能被人关注和鼓励,其实是说明PSI的代码很有价值,让人又爱又恨。 2、发现bug 虽然PSI的官方研发团队很小,但是依靠社区却拥有一只庞大的测试人员队伍。 3、反馈需求 https://gitee.com/crm8000/PSI/issues 上有堆积成山的新需求! 依靠社区,PSI同样拥有一只庞大的产品经理助理队伍。 4、允许他人完全私有化PSI的代码 常常有PSI用户告诉我,他又用PSI的代码为自己或者公司完成了什么新的功能和赚了钱。 一个开源项目被他人使用就已经创造了社会价值,能让他人赚钱更是实现了极好的客户价值。 似乎是PSI官方吃了大亏,其实不然。这里有一个商业逻辑:他人赚钱的市场,其实是PSI...
PSI 发布于 3个月前 阅读 97

ceph集群搭建对象存储

### 最低限度机器: > 1.osd1 192.168.1.2 > > 2.osd2 192.168.1.3 > > 3.monitor + radosgw 192.168.1.4 > > 4.admin 192.168.1.5 ### 前期准备: 0.所有机器初始化完毕,更改hostname,ntp校验时间,关闭selinux,关闭防火墙 1.所有机器创建普通用户 ceph_deploy (ceph新版必须使用普通用户启动)并确保所有机器的新建用户都有sudo权限 ``` useradd ceph_deploy echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username} sudo chmod 0440 /etc/sudoers.d/{username} ``` 2.所有机器hosts解析相互添加上 ``` vim /etc/hosts osd1 192.168.1.2 osd2 192.168.1.3 monitor 192.168.1.4 admin 192.168.1.5 ``` 3.所有机器ceph_deploy用户秘钥相互免密 ``` ssh-keygen && ssh-copy-id ceph_deploy@{hostname} ``` 4.admin机器 下载安装ceph-deploy程序 ``` sudo subscription-manager repos --enable=rhel-7-server-extras-rpms sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm cat >/etc/yum.repos.d/ceph.repo [ceph-noarch] name=Ceph noarch packages baseurl=https://download.ceph.com/rpm/el7/noar...
cookieY 发布于 1个月前 阅读 2

Window下编译OpenSSL

在Window下编译OpenSSL需要安装perl、vs等软件,本教程将以VS2010+Activeperl为示例。 ### 安装ActivePerl 到官网下载对应的运行版本安装即可。 ### 下载并解压OpenSSL源码 到官网下载自己需要的版本,并解压到任意目录,比如 c:\openssl-src ### 设置VS2010编译环境 打开命令行,执行如下命令: **32位:** ``` cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin vcvars32.bat ``` **64位:** ``` cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 vcvars64.bat ``` 其中 C:\Program Files (x86)\Microsoft Visual Studio 10.0 是我VS2010安装目录,读者需要把路径修改为本机实际路径。 ### 进入OpenSSL源码目录 ``` cd c:\openssl-src ``` ### 配置编译文件 ``` perl Configure debug-VC-WIN32 no-asm --prefix="c:\openssl" ``` 其中: **debug-VC-WIN32** 表示windows 32位系统,64位系统请换成 **debug-VC-WIN64A** **Relase **版本去掉debug,改为VC-WIN32或者VC-WIN64A **no-asm** 表示不用汇编,不设置此属性会导致编译不过 **prefix** 表示需要安装的目录 ### 生成编译文件 **32位:** ``` ms\do_ms.bat ``` **64位:** ``` ms...
Jathon 发布于 3小时前 阅读 3

redis 常用语句

打开redis : $ redis-cli 设置默认1区: $ set db_number 1 进入1区: $ select 1 查看所有 key: $ keys * 返回列表中指定区间内的元素:  LRANGE KEY_NAME START END 列如:lrange mails 0 -1 删除: $ del key
罗培海 发布于 3个月前 阅读 10

【微服务】网关Kong整合SpringBoot和Consul设计

前面的博客已经整理了SpringBoot整合Consul以及Kong的相关文章。这次讲讲对于这套微服务架构如何实施我的理解。 先上图,整体架构图如下: ![整体架构](http://olgkbo9hh.bkt.clouddn.com/md/2018/1/11/1515641914844.jpg) 模块说明: * Client: 外部访问应用 * Api-GateWay-Cluster:网关集群,外部调用统一入口; * Consul-Server-Cluster:Consul服务端集群,用于管理服务注册发现; * Monitor-Cluster:服务监控集群,用于拉取Consul上的可用服务,注册到服务网关Kong上; * Service1-3:对外服务能力提供方 * ConsulClient1-3:服务能力提供方服务器上部署的Consul客户端; * 另外,如果使用自定义服务注册的话可以再加入监测脚本,注册到Consul上 其实图一画,整体架构也七七八八了,另外需要说明一点,如果服务仅内部调用,比如基础的用户服务等不用注册在Kong上,直接Service从Consul发现进行调用即可。
Tree 发布于 1周前 阅读 13

Eclipse Memory Analyzer tool 工具的使用

记一次内存溢出解决思路
freeli 发布于 3个月前 阅读 6

python3 pythonic 技巧

列表推导  # 闰年 t = [i for i in range(2017) if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0] # 生成1-100的奇数 odd = [i for i in range(1, 100) if i % 2 == 1] # 列表推导 t = [i for i in range(2017) if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0] print(t) # 生成1-100的奇数 odd = [i for i in range(1, 100) if i % 2 == 1] # 集合a,b分别去一个数,找出和大于100的所有组合 # result = [(x, y) for x in a_set for y in b_set if x + y > 100] # zip的使用, 构建字典 # 1、构建字典的 2 个列表相同 # # >>> a = [1,2,3,4] # >>> b = ['ab','ac','ad'] # >>> dict(zip(a,b)) # {1: 'ab', 2: 'ac', 3: 'ad'} # >>> # # 2、构建字典的 2 个列表不同(key比value多) # # >>> a = [1,2,3,4] # >>> c = ['aa','ss'] # >>> dict(zip(a,c)) # {1: 'aa', 2: 'ss'} # >>> # # 3、构建字典的 2 个列表不同(key比value少) # # >>> a = [1,2,3,4] # >>> d = ['fa','fb','fc','fd','fe'] # >>> dict(zip(a,d)) # {1: 'fa', 2: 'fb', 3: 'fc', 4: 'fd'} # 字典推导 t = { i: i ** 2 for i in range(10) } print(t) a = 1 b = 2 # 交换变量 a, b =...
阿豪boy 发布于 2个月前 阅读 7

dubbo源码解读系列之一dubbo项目组成

  dubbo是阿里巴巴开源的一款基于Java的RPC通信框架,目前在国内众多公司在使用,随着近期阿里巴巴重启对dubbo的维护,dubbo势必会得到进一步发展。本系列文章主要是对dubbo源码解读学习dubbo的架构设计。   dubbo被重启维护后更新了许多bug以及对一些jar包的升级,目前dubbo项目主要有以下模块构成。
Jack-Shen 发布于 2个月前 阅读 12

VMware安装win7后,没有网络解决方案

1.使用官方win7系统,cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso 2.wmware 编辑  -虚拟网络编辑器--恢复默认设置
vshcxl 发布于 4天前 阅读 4

2017总结

2017个人工作总结
Martin_Luo 发布于 3周前 阅读 9

【小记】批处理FOR循环中的参数/F

### 官方说明 ``` FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters] ``` ## file-set > fileset为一个或多个文件名。继续到fileset中的下一个文件之前,每份文件都被打开、读取并经过处理。 怎么理解这句话?首先每份文件都会被“打开、读取并进行处理”,说明括号中的参数SET在不加引号的情况下,这个参数代表文件。并且循环命令是对文件的内容进行操作而不是文件名(即当作字符串)来操作。 同时,命令可以针对多个文件进行操作。 > 处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For循环。 第二段话怎么理解?命令会将文件中的每一行当成一个循环变量进行循环操作,注意这里是每一行,而不是每行中的单个变量。 > 以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。 这段话的意思是,虽然将每行当作一个循环变量,但是默认在读到空格或者Tab的时候会结束当前行内容的读取。 > 那如何才...
iBazinga 发布于 3周前 阅读 8

javacsv读写csv文件

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

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 发布于 2个月前 阅读 341670 点赞 1

Python库打包到PyPI

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

免费云服务器

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

java递归删除文件或文件夹

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

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 发布于 1个月前 阅读 259120 点赞 1

xxx is not in the sudoers file

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

Python 计算器

### 运行截图 ![这里写图片描述](http://img.blog.csdn.net/20171017222741550?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2J1ZGluZzAwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ### 源码 ```python # -*- coding: utf-8 -*- from tkinter import * __author__ = 'tianshl' __date__ = '2017/10/16' class Application(Frame): def __init__(self): Frame.__init__(self) self.grid() self.mem = '' # 内存中的数据 self.opt = '' # 操作符 self.display = StringVar() # 显示的数据 self.display.set('0') # 初始值 self.need_cls = False # 是否需要清屏 self.create_widgets() # 清空 def clear(self): self.mem = '' self.display.set('0') # 取反 def negative(self): self.display.set(eval('-' + self.display.get())) # 四则运算 def option(self, opt): if not self.need_cls: self.calculate() self.opt = opt self.need_cls = True self.mem = self.display.get() # 计算结果 def calculate(self): if self.opt: try: self.display.set(eval(self.mem + self.opt + self.display.get())) except Exception: ...
tianshl 发布于 3个月前 阅读 657784 点赞 1

image not recognized

image not recognized
tianshl 发布于 3个月前 阅读 606503 点赞 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 发布于 2个月前 阅读 284873 评论 1

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 发布于 1个月前 阅读 260975

Nginx日志配置及分割

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

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

谈谈ali与Google的Java开发规范

  无规矩不成方圆,编码规范就如同协议,有了Http、TCP等各种协议,计算机之间才能有效地通信,同样的,有了一致的编码规范,程序员之间才能有效地合作。道理大家都懂,可现实中的我们,经常一边吐槽别人的代码,一边写着被吐槽的代码,究其根本,就是缺乏遵从编码规范的意识!多年前,Google发布`Google Java Style`来定义Java编码时应遵循的规范;今年年初阿里则发布`阿里巴巴Java 开发手册`,并随后迭代了多个版本,直至9月份又发布了pdf终极版。这两大互联网巨头的初衷,都是希望能够统一标准,使业界编码达到一致性,提升沟通和研发效率,这对于我们码农无疑是很赞的一笔福利呀。笔者将两份规范都通读了一遍,其中列举的不少细则跟平时的编码习惯基本是符合的,不过还是有不少新奇的收获,忍不住记录在此,供日后念念不忘~ # Java开发规范总览 ## 一、Google Java Style   Google的java开发规范主要分为6大部分:源文件基本规范、源文件结构、代码格式、命名、编程实践和Javadoc,各部分概要如下: >1、源文件基本规范(source file basics):文件名、文件编码、特殊字符的规范要求 >2、源文件结构(source file structure):版权许可信息、package、import、类...
sherlockyb 发布于 2周前 阅读 5178 评论 28 点赞 20

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 发布于 7天前 阅读 17542

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 发布于 7天前 阅读 17749

火车票抢票代码公开揭秘

火车票抢票代码公开揭秘
闵开慧 发布于 1周前 阅读 7009 评论 52 点赞 13

SQL优化-第二章-从解释计划层面让SQL飞

# 前言 在第一章,我们谈到加强数据库的设计层面认知可以让SQL的跑得更快,这章我们就谈论下如何从语言层面来提供优化SQL。如果说有一把钥匙能打开SQL优化的大门,那么解释计划就是这样的一把钥匙。什么是解释计划--数据根据统计信息生成的代码执行计划,了解释计划,理解解释计划就能帮助我们理解代码的瓶颈,问题的所在,有的放矢进行优化。Oracle提供了多种解释计划,hive,mongodb,mysql等数据库都提供相似的工具。在第一章的时候,举例子的时候也用到解释计划,刚好借这个机会也来说说解释计划。 # 如何获取解释计划 ## 方式一:explain plan for 用法) 步骤1:explain plan for "你的SQL" 步骤2:select * from table(dbms_xplan.display()); 例子) ``` explain plan for SELECT * FROM t1, t2 WHERE t1.id = t2.t1_id AND t1.n in(18,19); select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------- Plan hash value: 3532430033 ------------------------------------------------------------------------------------------- | Id | Operation | Name | ...
osenlin 发布于 3周前 阅读 1886 点赞 8

股票分仓软件,股票资管软件,股票在线交易系统,股票点买系统

股票分仓软件,股票资管软件,股票在线交易系统,股票点买系统,联系电话:13564123143,QQ:653714026
阿拉丁金融软件产品 发布于 3个月前 阅读 4012

ORACLE表赋权,存储过程赋权

  把一个表的查询,插入,修改,删除.....赋给另一个用户 grant select, insert, update, delete, references, alter, index on  表名  to 用户名   grant select, insert, update, delete, references, alter, index on O_C_ZHSB_GRYHZH to EAST_MODEL   把一个存储过程赋权给另一个用户 grant execute on  存储过程名字  to 用户名; 例: grant execute on PROC_VALIDATE_EXAMINER to EAST_MODEL
毕加索5481 发布于 3小时前 阅读 8

OpenCV + VTK + WebCam 采集和显示图像

#include <iostream> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteractionStyle) ; VTK_MODULE_INIT(vtkRenderingFreeType); #include <opencv2/opencv.hpp> #include <vtkImageActor.h> #include <vtkImageImport.h> #include <vtkImageData.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkCommand.h> //Function prototypes void Ipl2VTK(cv::Mat& src, vtkImageData *dst); //!Class vtkTimerCallback /** * This class add support for timing events */ class vtkTimerCallback : public vtkCommand { public: vtkTimerCallback(){} ~vtkTimerCallback(){} public: static vtkTimerCallback *New() { vtkTimerCallback *cb = new vtkTimerCallback; cb->TimerCount = 0; return cb; } virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId, void *vtkNotUsed(callData)) { if (vtkCommand::TimerEvent == eventId) { ++this->TimerCount; } ...
IOTService 发布于 3小时前 阅读 4

使用pyinstaller打包,subprocess报“句柄无效”错误的解决方法

使用pyinstaller打包python程序,使用-w参数,去掉console,发现执行命令行的subprocess相关语句报“[ERROR] [WinError 6] 句柄无效”的错误。 去掉-w参数,将console显示的话,就正常。 我原本的语句是: #用 subprocess.check_output获取adb devices命令运行的输出 deviceInfo = subprocess.check_output('adb devices').decode().split("\r\n") 这里需要获得命令的运行输出,试了好多方案,最终可行的方案是用subpross.Popen来替代subprocess.check_output,Popen函数加入如下参数:shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE Popen方法执行命令,父进程不会等待子进程。这个时候需要用wait()方法来等待运行的结果。 这里用自己写的subprocess_check_output来替代subprocess.check_output 代码如下: def subprocess_check_output(*args): p = subprocess.Popen(*args,shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) msg = '' for line in p.stdout.readlines(): msg += line.decode() status = p.wait() return msg deviceInfo = subprocess_check_ou...
乐_然 发布于 3小时前

复盘linux积蓄:构架搭建lamp二

apache和php结合、用户认证、域名跳转、访问日志不记录静态文件、防盗链、访问控制、限制php解析
历经35天的选择 发布于 3小时前 阅读 3

Window下编译OpenSSL

在Window下编译OpenSSL需要安装perl、vs等软件,本教程将以VS2010+Activeperl为示例。 ### 安装ActivePerl 到官网下载对应的运行版本安装即可。 ### 下载并解压OpenSSL源码 到官网下载自己需要的版本,并解压到任意目录,比如 c:\openssl-src ### 设置VS2010编译环境 打开命令行,执行如下命令: **32位:** ``` cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin vcvars32.bat ``` **64位:** ``` cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 vcvars64.bat ``` 其中 C:\Program Files (x86)\Microsoft Visual Studio 10.0 是我VS2010安装目录,读者需要把路径修改为本机实际路径。 ### 进入OpenSSL源码目录 ``` cd c:\openssl-src ``` ### 配置编译文件 ``` perl Configure debug-VC-WIN32 no-asm --prefix="c:\openssl" ``` 其中: **debug-VC-WIN32** 表示windows 32位系统,64位系统请换成 **debug-VC-WIN64A** **Relase **版本去掉debug,改为VC-WIN32或者VC-WIN64A **no-asm** 表示不用汇编,不设置此属性会导致编译不过 **prefix** 表示需要安装的目录 ### 生成编译文件 **32位:** ``` ms\do_ms.bat ``` **64位:** ``` ms...
Jathon 发布于 3小时前 阅读 3

安装JDK、Tomcat

第十六章 Tomcat配置 16.1 Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。java程序写的网站用Tomcat+JDK来运行,Tomcat是一个中间件,真正起作用的,解析Java脚本的是JDK。JDK(Java development kit)是整个Java的核心,它包含了Java运行环境和一堆Java相关的工具以及Java基础库。 最主流的JDK是由sun公司发布的JDK,除此之外,IBM公司也有发布JDK,centos上也可以使用yum安装openjdk。 16.2 安装JDK 目前jdk版本1.6,1.7,1.8 在JDK官网(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html )选择相应的版本(jdk-8u144-linux-x64.tar.gz)进行下载到物理机,然后使用xftp传输到虚拟机中/usr/local/src目录。  [root@cham002 ~]# cd /usr/local/src/ [root@cham002 src]# ls apr-1.6.3 httpd-2.4.29 nginx-1....
Champin 发布于 3小时前

红-黑树

# 基本概念 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 红黑树的特性: (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] (4)如果一个节点是红色的,则它的子节点必须是黑色的。 (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 注意: (01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。 (02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。 # R-B Tree时间复杂度 ``` 红黑树的时间复杂度为: O(lgn) ``` 下面通过“数学归纳法”对红黑树的时间复杂度进行证明。 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1). 证明: "一棵含有n个节点的红黑树的高度至多为2log(n+1)" 的逆否命题是 "高度为h的红黑树,它的包含的内节点...
qq948939246 发布于 4小时前 阅读 1

bboss平台部门管理员配置指南

bboss平台部门管理员配置指南 第一部分 为部门分配管理员以及为部门管理员设置权限  1.超级管理员登录系统 admin/123456      2.进入组织管理界面,进入部门列表  选择部门,进行管理员设置  3.设置部门管理员权限  进入角色管理为部门管理员模板角色orgmanagerroletemplate设置管理权限  授予用户管理、部门管理菜单权限      授予用户管理和部门管理、角色授予权限     选择部门管理员可以授予的角色  第二部分 部门管理管理用户,为其管理的用户设置角色   1 以部门管理员11登录系统    2.新增用户   3.为用户设置角色   相关资料   bboss新版开发平台开发环境搭建和代码生成工具使用视频教程  bboss快速开发平台介绍  bboss自动代码生成工具使用指南  bboss平台开发交流群:154752521  微信公众号:bbossgroups 
bboss 发布于 4小时前 阅读 3

pinpoint源码分析

个人阅读
ihuotui 发布于 4小时前 阅读 4

spring boot初体验(三)Spring AOP

简介 什么是AOP,AOP用处:     在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(copy自 百度百科https://baike.baidu.com/item/AOP/1332219?fr=aladdin) 简单明了的解释:http://blog.csdn.net/u010926964/article/details/51538348 个人体验:         在之前工作参与的ASP.NET MVC的开发中,微软提供了Filter过滤器,通过继承AuthorizeAttribute重写4个方法可以对Controller不同时期的插入操作。这个Filter就是对AOP思想的一种实现。之前工作里利用Filter拦截请求进行 授权验证、任务埋点、错误/行为日志记录、跨域设置等功能实现。 但是在之前工作里很少用到AOP在BLL和DAL层的实现,也没有深入了解。 现在先Spring boot中的AOP写个demo了解一下在Spring boot中AOP的应用方式和实现。 实现步骤 在之前的两篇文章里...
刘昌鑫 发布于 4小时前 阅读 4

vue生命周期简介

vue生命周期 beforeCreate:data数据和el没有初始化,可以在加载loading事件 created:data数据初始化,el没有初始化,loading结束,初始化,触发自定义函数 beforeMount:完成了data,el初始化; mounted:完成了挂在,向后端发送请求,接收数据; beforeDestroy:判断确认删除吗? destroyed:清空数据,组件  
学无止境68 发布于 4小时前 阅读 3

解决连接本地oracle无监听的问题

将下面标红的位置替换成本地计算机的名称 tnsnames.ora listener.ora 修改完成之后,重启oracle的服务,就可以连接了
名侦探柯南 发布于 4小时前 阅读 1

【25】比较并交换

Jakob Jenkov 并发指南翻译:Compare and Swap
秋雨霏霏 发布于 4小时前 阅读 4

Android 应用换肤功能(白天黑夜主题切换)

Android 应用换肤功能(白天黑夜主题切换)
极地冰雨 发布于 4小时前 阅读 4

vue-router

vue-router 基本使用   路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射. 所以在页面上有两个部分,一个是点击部分,一个是点击之后,显示内容的部分。    点击之后,怎么做到正确的对应,比如,我点击home 按钮,页面中怎么就正好能显示home的内容。这就要在js 文件中配置路由。   路由中有三个基本的概念 route, routes, router。     1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容, 这是一条route,  about按钮 => about 内容, 这是另一条路由。     2, routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]     3, router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 ...
木叶杀手 发布于 4小时前 阅读 1

博客的架构2

经过小组讨论,所有技术类博文总共分为这么几大类: 关于技术怎样分类可以参考这篇文章: http://blog.sina.com.cn/s/blog_14ecc0b640102x2i9.html 安全 收录一些常见的网络攻防技术,系统安全技术. 应用层 应用层的技术,包括常用app的使用和互联网服务 网络技术 底层网络建设,关于网络层和传输层的一些协议 编译原理 比较冷门的一个分类,包括汇编和x86/ARM指令集 云计算 底层虚拟化技术,服务器集群,包括大数据,分布式算法,转载的比较多 游戏 探讨一些游戏大作,市场,游戏引擎等等 硬件技术 就是物理层的一些技术,通信原理和计算机组成原理 操作系统 这是比较热门的一类,主要是linux内核和发行版的作文比较多 高级语言 这个不用说了,主流语言和算法收集 多媒体技术 包含各种媒体格式,外设,以及字符编码的知识 web技术 小编最喜欢的和将要从事的领域:前后端开发 数据库 各种数据库的设计,开发和优化 设计模式 包括各种语言,网站框架,甚至交互式风格的,架构,设计,美工与实现 新领域 比较前沿的IT领域,比如AI,IPv6,物联网,区块链,甚至量子计算机等区别于传统行业的技术 其他 除了分类,还有一个’标签’机制用来实现可扩展的分类方式,因为一篇文章可以拥有多个标签,但只属于一个类,...
失败人士 发布于 4小时前 阅读 4

[case3]聊聊系统设计中的trade-off

## 序 本文主要小结一下系统设计当中的trade-off ## trade-off trade-off翻译过来大致是折中的意思,也就是说系统设计通常牵扯的点比较多,有的设计方案这个方面比较好,但是又有其他缺点,没有十全十美的方案,只是在特定的上下文,特定的约束条件下,权衡选取比较合适的方案。但是一旦这个上下文或约束条件随着业务变化,基础设施变化等等,原来的折中的方案可能也就不合适了。于是就需要重新架构。 ## 常见的trade-off - 缓存 >以空间换取时间,牺牲内存来加快读取速度,但同时也带来一致性维护问题 - 数据库三范式 >以时间换取空间,数据库的范式设计,有些表仅仅有主键,但是业务查询经常需要带上姓名等其他字段,这个时候就得在展示层去根据用户id再去获取用户姓名去组装数据,在持久层保持了一致性,但是对于展示层来说得额外再去关联表或查询姓名,牺牲了时间。 - CAP >比如nosql大多是选择以AP为主,牺牲C - 微服务 >将单体架构拆分为微服务,则在部署成本上可能比单体架构要多一些,但是带来的是服务的拆分隔离之后的相对稳定性和可维护性,但是同时也可能带来诸多一致性问题。 - 高级语言vs汇编语言 >高级语言比汇编语言更容易让人掌握,但是最后还是要转为机器...
go4it 发布于 4小时前 阅读 4

解决 dva 注销退出系统后再点击登入,state 数据未清空的问题?

> 使用 dva 开发的后管系统,当退出系统时数据容器 models 中的 state 值并不会清空,造成重新登入系统仍然可以看到上一次登入系统时的数据。下面举例其中一种场景进行说明。 ## 一、问题 使用 `admin` 用户登入系统,进入 `用户管理` 菜单。 表格中总共有三条数据: ![表格中总共有三条数据](http://upload-images.jianshu.io/upload_images/6693922-b221c799a0cfb968.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 通过名称进行过滤查询,查的一条数据: ![用户列表](http://upload-images.jianshu.io/upload_images/6693922-c17e3ca941fde3a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 现在退出系统,使用 `guest` 用户再次登入系统,进入 `用户管理` 菜单,会发现竟然还是一条数据,也就是之前 `admin` 用户过滤查询之后的数据。 不同用户之间数据竟然无意间进行了共享,这是不被允许的。 ## 二、分析原因 使用 `admin` 用户登入,通过名称过滤查询得到一条数据,该数据被放在一个叫做 `数据容器` (models 目录下的 state 里面)中,只要 `数据容器` 值变了,页面也就相应改变。所以页面由三条数据变成了一条数据。 当 `admin` 用户退出系...
dkvirus 发布于 5小时前 阅读 4

用Kcptun给SS加速!看YouTube1080P一点都不卡!

这次来说说如何让翻墙速度更快,用起来就像墙内一样。这里介绍一个免费的工具Kcptun,它是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。(效果可见下图,YouTube上1080P流畅)   工作原理是这样滴:   那么下面就开始喽! 首先我们得下载XShell,为什么要下载这个?你可以想象VPS就是一个放在大洋彼岸永不关机的电脑,而VPS上影梭一般都装在CentOS这样的linux系统上,如果我们想安装软件,就需要XShell这样的工具登录VPS后台linux去操作。 XShell5下载:http://rj.baidu.com/soft/detail/15201.html?ald 安装完新建会话属性,点击连接,填入你搬瓦工后台main controls的IPaddress和SSH port.   然后点击用户身份验证,用户名为root,密码在搬瓦工后台的root password modification里面随机生成。   弄好后就可以连接服务器了,开始安装Kcptun。 首先在xshell登录后的Linux页面一段一段的粘贴下面代码,毎粘贴一段要回车一下再粘贴下一段。   wget https://raw.githubusercontent.com/kuoruan/kcptu...
JungleKing 发布于 5小时前 阅读 6

java对象创建

一、写在前面 在说垃圾回收之前,必须的先说说对象的创建及内存的分配问题,因为java对象的内存分配如果搞不明白是怎么回事儿,后面说垃圾回收就会断层,开门就写内存分代原理讲解的文章,感觉实际对于理解意义不是很大,很少有人会去死记硬背这些东西,知其然,知其所以然,不想记都能铭刻于心了,就这么简单。 二、java对象的创建 2.1:new的过程-开始:当new一个对象实例时,jvm并没有直接去调相关类加载器直接去层层加载该类信息,而是先会去常量池中查找是否有该类的符号标识引用,如果有,并且该类有效,则直接为该对象分配内存,如果没有,则启动一系列类加载器执行加载过程,加载完毕之后为该对象分配内存。 2.2:内存空间分配-发生故事:那么这块给对象分配的空间会在“堆”上分配,而具体分配多大是根据实际确定的大小,那么问题来了,是按什么方式方法分配的?这个时候,jvm会根据当前堆内存中 空闲空间块 和 已使用空间块的分布情况来确定用什么方式分配, 如果空闲空间块和已使用空间块都各自连续、规整,并且远大于要使用的分配大小,优先使用“指针碰撞”方式分配,反之,则使用“空闲列表”方式分配。 “指针碰撞”翻译之--标准山东话:空闲空间块站成一排...
寒冰蓝血 发布于 5小时前 阅读 5

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

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

五年架构师讲述RESTful架构风格

在移动互联网的大潮下,随着docker等技术的兴起,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓RESTful API总会貌合神离,不够规范。 本文是我对RESTful 架构风格的一些理解,和大家分享一下,如果有问题,欢迎讨论。   Outline 1. RESTful架构风格 1.1.1 资源 1.1.2 统一接口 1.1.3 URI 1.1.4 无状态 1.1 RESTful架构风格的特点 1.2 ROA、SOA、REST与RPC 1.3 本真REST与hybrid风格 2. 认证机制 2.1 Basic Auth 2.2 Token Auth 2.3 OAuth 3. 总结   1. RESTful架构风格 RESTful架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出。HTTP就是该架构风格的一个典型应用。从其诞生之日开始,它就因其可扩展性和简单性受到越来越多的架构师和开发者们的青睐。一方面,随着云计算和移动计算的兴起,许多企业愿意在互联网上共享自己的数据、功能;另一方面,在企业中,RESTful API(也称RESTful Web服务)也逐渐超越SOAP成为实现SOA的重要手段之一。时至今日,RESTful架构风格已成为企业级服务的标配。 REST即Representat...
Java架构分享 发布于 2天前 阅读 1603 评论 2 点赞 4

为什么说Web开发和Vue.js是如此的有趣?

![Web Vue.js](http://upload-images.jianshu.io/upload_images/145564-b44a324d5fd42693?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 我想告诉你,我开始享受使用Vue.js和进行前端开发的故事。这不应该被理解为一篇关于为什么Vue.js可能比React,Angular或任何你正在考虑的其他Web框架更好的文章。Vuejs是令人惊叹的,但我们生活在一个作为前端开发人员同样令人惊叹的时代。 如果你几年前和我交谈过,我会把自己定位为一个后端开发人员,掌握服务器和数据库管理。面向对象的语言,java和c #,我想找到一种自己需要交付程序时使用的唯一的开发语言,我逐渐了解到更多关于.NET和SQL服务器的堆栈技术。当时我有这样一个概念,前端开发者只是使用右脑的附庸风雅的人,并不是“真正的”编程。 但是,在我最后一次求职,选择很少。特别是工作面试,我看到了自己是如何失败的。那次失败非常令人沮丧,但我从中吸取了不少教训。我获得了一个职位,利用了我在SharePoint的经验。我在SharePoint的经验并不特别:用GUI、工作流等设计页面这个不是我理想中的工作,而是为了生活不得不做的工作。 当我刚开始的时候,我接触过像我过去做过的任何类似的项目。我依靠GUI设计用户...
笔阁 发布于 3天前 阅读 2509 评论 10 点赞 2

使用Heapster和Splunk监控Kubernetes运行性能

Kubernetes已经成为容器编排的事实上的王者,连Docker都已经向K8s女王大人低头。对于Kubernetes的cluster的数据收集和监控已经成为IT运维的一个重要话题。我们今天来看一看如何利用Splunk最新的Metrics Store来对Kubernetes的集群进行性能监控。 部署架构 下图是该方案的部署架构,主要包括: 利用Heapster收集K8s的性能数据,包含CPU,Memory,Network,File System等 利用Heapster的Statsd Sink,发送数据到Splunk的Metrics Store 利用Splunk的搜索命令和仪表盘功能对性能数据进行监控 前期准备 前期主要要准备好两件事: 编译最新的Heapster的镜像,并上传到某个公共的Docker镜像仓库,例如docker hub 在Splunk中配置Metrics Store和对应的网络输入(Network Input UDP/TCP) 这里主要要做的选择是Statsd的传输协议用UDP还是TCP。这里我推荐使用TCP。 最新的Heapster代码支持不同的Backend,包含了log, influxdb, stackdriver, gcp monitoring, gcp logging, statsd, hawkular-metrics, wavefront, openTSDB, kafka, riemann, elasticsearch等等。因为Splunk的Metrics Store支持statsd协议,所以可以很容易的和Heapster集成。 首先我们需要利用最新的heapster代码,编译...
naughty 发布于 4天前 阅读 1502 评论 2 点赞 1

Nginx+SSL+Tomcat+CDN部署总结,已实践有效~

之前在度娘搜索资料,无意间看到一些个人站点的博客都用了https协议,在浏览器地址栏中被标记为绿色的“安全”,前些天特地给自己负责的小项目升级成https协议,其优点这里不再赘述,小伙伴们可以自行百度,今天把整合部署分享在这里,希望小伙伴们少走弯路~ 效果如下: 软件版本如下: System Centos 6.5 Nginx Tengine/2.1.2 (nginx/1.6.2) SSL证书 Let's Encrypt 免费SSL证书 Tomcat Apache-tomcat-8.0.47 CDN Cloudflare.com   一、生成SSL证书 首先我们创建一个用来存放letsencrypt生成证书项目的路径并进入: cd /usr/local/letsencrypt 接下来我们克隆letsencrypt项目: git clone https://github.com/letsencrypt/letsencrypt 开始生成SSL证书: ./letsencrypt-auto certonly --standalone --email test@qq.com -d www.test1.com -d www.test2.com --agree-tos 这里一定注意: (1). 域名绑定在国内DNS服务器无法生成,需要先将DNS服务器切换到DNS服务商,例如ClouldFlare、Godaddy、Dnsever后才能正常生成! (2). web服务需要处于关闭状态,注意关闭nginx和80端口的占用!(不间断服务方式生成可以自行百度) (3). -d 代表domain 可以同时生成多个域名对应证书,生...
lu54977212 发布于 6天前 阅读 3062 评论 22 点赞 6

火车票抢票代码公开揭秘

火车票抢票代码公开揭秘
闵开慧 发布于 1周前 阅读 7009 评论 52 点赞 13

使用Java 8 Optional避免空指针异常

> Optional可以让你的代码具有可读性,且会避免出现空指针异常。 都说没有遇到过空指针异常的程序员不是Java程序员,`null`确实引发过很多问题。Java 8中引入了一个叫做`java.util.Optional`的新类可以避免`null`引起的诸多问题。 我们看一下`null`引用能导致哪些危害。首先创建一个类`Computer`,结构如下图所示: ![输入图片说明](https://static.oschina.net/uploads/img/201801/11143707_99mL.gif "在这里输入图片标题") 当我们调用如下代码会怎样? ``` java String version = computer.getSoundcard().getUSB().getVersion(); ``` 上述代码看似是没有问题的,但是很多计算机(比如,树莓派)其实是没有声卡的,那么调用`getSoundcard()`方法可定会抛出空指针异常了。 一个常规的但是不好的的方法是返回一个null引用来表示计算机没有声卡,但是这就意味着会对一个空引调用`getUSB()`方法,显然会在程序运行过程中抛出控制异常,从而导致程序停止运行。想想一下,当你的程序在客户端电脑上运行时,突然出现这种错是多尴尬的一件事?  伟大计算机科学Tony Hoare曾经写到:"我认为null引用从1965年被创造出来导致了十亿美元的损失。当初使用null引用对我最大的诱...
刘亚涛 发布于 2周前 阅读 3680 评论 30 点赞 5

Elastic Search搜索引擎在SpringBoot中的实践

## 实验环境 - ES版本:5.3.0 - spring bt版本:1.5.9 首先当然需要安装好elastic search环境,最好再安装上可视化插件 elasticsearch-head来便于我们直观地查看数据。 当然这部分可以参考本人的帖子: 《centos7上elastic search安装填坑记》 https://www.jianshu.com/p/04f4d7b4a1d3 我的ES安装在http://113.209.119.170:9200/ 这个地址(该地址需要配到springboot项目中去) --- ## Spring工程创建 这部分没有特殊要交代的,但有几个注意点一定要当心 - 注意在新建项目时记得勾选web和NoSQL中的Elasticsearch依赖,来张图说明一下吧: ![创建工程时勾选Nosql中的es依赖选项](http://upload-images.jianshu.io/upload_images/9824247-785048db3dca0957.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 项目自动生成以后pom.xml中会自动添加`spring-boot-starter-data-elasticsearch`的依赖: ``` org.springframework.boot spring-boot-starter-data-elasticsearch ``` - 本项目中我们使用开源的基于restful的es java客户端`jest`,所以还需要在pom.xml中添加`jest`依赖: ``` io.searchbox jest ``` - 除此之外还必须添加`jna`的依赖: ``` net.java.dev.jna...
hansonwang 发布于 2周前 阅读 2144 评论 13 点赞 4

前后端分离实践有感

前后端分离并不是什么新鲜事,到处都是前后端分离的实践。然而一些历史项目在从一体化 Web 设计转向前后端分离的架构时,仍然不可避免的会遇到各种各样的问题。由于层出不穷的问题,甚至会有团队质疑,一体化好好的,为什么要前后端分离?
边城 发布于 2周前 阅读 3087 评论 36 点赞 28

再见,Netty!你好,smart-socket!

## 再见,Netty Netty,当前最流行的NIO框架,通信领域开发的不二之选。经过多年的发展,已在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。目前市面上几乎找不到同类型可以与之媲美的通信框架,但是作为通信技术的爱好者,却向来无法对其产生亲近感。 我并不否认Netty的确是一款优秀的框架,曾经我也自己写过[NIO框架](https://gitee.com/smartdms/smart-socket),深知其实现难度有多大,最终选择了放弃。Netty的出现为广大程序员提供了便利,大大降低了开发高效、稳定服务的难度。至于本人对其无好感,究其原因有以下几点(首先申明一下,本人仅曾经简单使用过netty,并未深入研究): - 复杂;以下代码摘录自[Netty官网](http://netty.io/wiki/user-guide-for-5.x.html),初看代码,应该大部分人对于run方法比较费解。`EventLoopGroup`是干嘛的?`bossGroup`和`workerGroup`是什么关系?`childHandle`入参如此复杂!`ch.pipeline().addLast(new DiscardServerHandler())`实现的是什么功能?等等...。总之,这一个方法会引发你诸多疑惑。 ``` public class DiscardServer { private int p...
三刀蜀黍 发布于 2周前 阅读 5850 评论 69 点赞 10

谈谈ali与Google的Java开发规范

  无规矩不成方圆,编码规范就如同协议,有了Http、TCP等各种协议,计算机之间才能有效地通信,同样的,有了一致的编码规范,程序员之间才能有效地合作。道理大家都懂,可现实中的我们,经常一边吐槽别人的代码,一边写着被吐槽的代码,究其根本,就是缺乏遵从编码规范的意识!多年前,Google发布`Google Java Style`来定义Java编码时应遵循的规范;今年年初阿里则发布`阿里巴巴Java 开发手册`,并随后迭代了多个版本,直至9月份又发布了pdf终极版。这两大互联网巨头的初衷,都是希望能够统一标准,使业界编码达到一致性,提升沟通和研发效率,这对于我们码农无疑是很赞的一笔福利呀。笔者将两份规范都通读了一遍,其中列举的不少细则跟平时的编码习惯基本是符合的,不过还是有不少新奇的收获,忍不住记录在此,供日后念念不忘~ # Java开发规范总览 ## 一、Google Java Style   Google的java开发规范主要分为6大部分:源文件基本规范、源文件结构、代码格式、命名、编程实践和Javadoc,各部分概要如下: >1、源文件基本规范(source file basics):文件名、文件编码、特殊字符的规范要求 >2、源文件结构(source file structure):版权许可信息、package、import、类...
sherlockyb 发布于 2周前 阅读 5178 评论 28 点赞 20

操作系统级虚拟化概述

本文简要介绍了操作系统级虚拟化的概念,并简要阐述了实现操作系统虚拟化所用到的技术Namespace及cgroups的原理及使用方法。
宅蓝三木 发布于 2周前 阅读 1010 评论 3 点赞 3

源码级别解读 mybatis 插件

简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 摘自官网。。 为什么要使用mybatis,相信看这篇文章的童鞋都有所了解,俺这里就多废话几句。在orm框架中,有轻量级的dbutils与mybatis,重量级的有hibernate。 为什么要选择mybatis呢?原因如下: 1.简单,这个无需我多废话。肯定的啊,使用过的童鞋都知道,在dao层定义一个接口,然后定义一个对应的xml(xml中namespace的值对应接口的全限定名就ok。因为mybatis是通过namespaceid去和接口类进行映射,然后使用动态代理创建接口类的实例方法,参见动态代理).   2.结果集映射,我认为这是mybatis做的最牛的一点,也是选择他最大的一个理由 3.完善的缓存机制(mybatis有1级缓存和2级缓存),1级缓存是基于会话的(Session),2级缓存是基于应用级别。这里不做过多阐述,有兴趣的可以参考文章 http://www.iteye.com/topic/1112327/ 4.强大的插件机制。它可以在运行过程中动态...
Autorun 发布于 2周前 阅读 2345 评论 6 点赞 6 打赏 2

前端性能优化(三) 移动端浏览器前端优化策略

前端性能优化是一个很宽泛的概念,本书前面的部分也多多少少提到一些前端优化方法,这也是我们一直在关注的一件重要事情。配合各种方式、手段、辅助系统,前端优化的最终目的都是提升用户体验,改善页面性能,我们常常竭尽全力进行前端页面优化,但却忽略了这样做的效果和意义。先不急于探究前端优化具体可以怎样去做,先看看什么是前端性能,应该怎样去了解和评价前端页面的性能。
ouven 发布于 3周前 阅读 1762 评论 3 点赞 5

Spring Boot缓存实战 Redis + Caffeine 实现多级缓存

在前文我们介绍了如何使用Redis或者Caffeine来做缓存。 - [Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2](http://www.jianshu.com/p/e53c1b60c6e1) - [Spring Boot缓存实战 Caffeine](http://www.jianshu.com/p/c72fb0c787fc) # 问题描述: 通过使用redis和Caffeine来做缓存,我们会发现一些问题。 - 如果只使用redis来做缓存我们会有大量的请求到redis,但是每次请求的数据都是一样的,假如这一部分数据就放在应用服务器本地,那么就省去了请求redis的网络开销,请求速度就会快很多。但是使用redis横向扩展很方便。 - 如果只使用Caffeine来做本地缓存,我们的应用服务器的内存是有限,并且单独为了缓存去扩展应用服务器是非常不划算。所以,只使用本地缓存也是有很大局限性的。 至此我们是不是有一个想法了,两个一起用。将热点数据放本地缓存(一级缓存),将非热点数据放redis缓存(二级缓存)。 # 缓存的选择 - 一级缓存:Caffeine是一个一个高性能的 Java 缓存库;使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率。[Caffeine 缓存详解](http://www.jianshu.com/p/9a80c662dac4) - 二级缓存:redis是一高性能、高可用的key-value数据库,支持多...
xiaolyuh 发布于 3周前 阅读 3246 评论 24 点赞 7

spring boot redis分布式锁

> 随着现在分布式架构越来越盛行,在很多场景下需要使用到分布式锁。分布式锁的实现有很多种,比如基于数据库、 _zookeeper_ 等,本文主要介绍使用 _Redis_ 做分布式锁的方式,并封装成spring boot starter,方便使用 #### 一. _Redis_ 分布式锁的实现以及存在的问题 锁是针对某个资源,保证其访问的互斥性,在实际使用当中,这个资源一般是一个字符串。使用 _Redis_ 实现锁,主要是将资源放到 _Redis_ 当中,利用其原子性,当其他线程访问时,如果 _Redis_ 中已经存在这个资源,就不允许之后的一些操作。spring boot使用 _Redis_ 的操作主要是通过 _RedisTemplate_ 来实现,一般步骤如下: 1. 将锁资源放入 _Redis_ (注意是当key不存在时才能放成功,所以使用 _setIfAbsent_ 方法): ``` redisTemplate.opsForValue().setIfAbsent("key", "value"); ``` 2. 设置过期时间 ``` redisTemplate.expire("key", 30000, TimeUnit.MILLISECONDS); ``` 3. 释放锁 ``` redisTemplate.delete("key"); ``` 一般情况下,这样的实现就能够满足锁的需求了,但是如果在调用 _setIfAbsent_ 方法之后线程挂掉了,即没有给锁定的资源设置过期时间,默认是永不过期,那么这个锁就会一直存在。...
J猿 发布于 3周前 阅读 3945 评论 10 点赞 11

SQL优化-第二章-从解释计划层面让SQL飞

# 前言 在第一章,我们谈到加强数据库的设计层面认知可以让SQL的跑得更快,这章我们就谈论下如何从语言层面来提供优化SQL。如果说有一把钥匙能打开SQL优化的大门,那么解释计划就是这样的一把钥匙。什么是解释计划--数据根据统计信息生成的代码执行计划,了解释计划,理解解释计划就能帮助我们理解代码的瓶颈,问题的所在,有的放矢进行优化。Oracle提供了多种解释计划,hive,mongodb,mysql等数据库都提供相似的工具。在第一章的时候,举例子的时候也用到解释计划,刚好借这个机会也来说说解释计划。 # 如何获取解释计划 ## 方式一:explain plan for 用法) 步骤1:explain plan for "你的SQL" 步骤2:select * from table(dbms_xplan.display()); 例子) ``` explain plan for SELECT * FROM t1, t2 WHERE t1.id = t2.t1_id AND t1.n in(18,19); select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------- Plan hash value: 3532430033 ------------------------------------------------------------------------------------------- | Id | Operation | Name | ...
osenlin 发布于 3周前 阅读 1886 点赞 8

手把手教你用1行Python代码实现FTP服务器 -- Pyftpdlib

当你想快速共享一个目录的时候,这是特别有用的,只需要1行代码即可实现。
kangvcar 发布于 3周前 阅读 3452 评论 12 点赞 5

为什么43%前端开发者想学Vue.js

根据[JavaScript 2017前端库状况调查](https://stateofjs.com/2017/front-end/results/) **Vue.js**是开发者最想学的前端库。我在这里说明一下我为什么认为这也是和你一起通过使用Vue构建一个简单的App应用程序的原因。 我最近曾与Evan You,Chris Fritz,Sarah Drasner,和Adam Jahr做了一个介绍视频,而现在你可以在http://vuejs.org首页找到它。以下是该视频的文字版本。 # 伟大的JavaScript迁移 如你所知,**JavaScript**在过去的10年中已经成熟了很多,而且服务器端正常运行的大部分代码已经迁移到浏览器中了。随着这变得越来越复杂,框架也变得越来越有组织性。 ![为什么43%前端开发者想学Vue.js](http://upload-images.jianshu.io/upload_images/145564-47adf719c305dab3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 我不打算告诉你为什么一个比另一个更好的,虽然在官方网站有一个详细的比较。 **Vue.js**旨在成为一个平易近人,多功能,高性能,可维护性,可测试的JavaScript框架。Vue的目也是为了进步,意思就是如果你有一个现有的应用程序存在只占一个部分的前端,你需要更多的互动体验那么就可以使用Vue。 或者,您也可以从一开始就在前端构建更多的...
笔阁 发布于 3周前 阅读 5204 评论 31 点赞 7

十个实用MySQL函数

十个实用MySQL函数,你要不要进来领走...
andyqian 发布于 3周前 阅读 2672 评论 6 点赞 6

J2EE分布式框架--开发环境部署

环境搭建: 1.环境准备 1.开发工具: Eclipse IDE(建议使用高一点的版本) 2.JDK版本:JDK1.7 3.项目管理: Maven3.1.1 2.安装步骤 1.安装jdk1.7并配置环境变量(相信大家都会做,这里不再做重复的说明) 2.安装maven:maven安装过程就是解压缩的过程(我已经帮大家解压了, 目录:E:\myprj\jeesz-maven\apache-maven-3.1.1),为了方便大家,这边已经提供了相关的安装包,会在打包的目录下共享。
windywindy 发布于 4周前 阅读 1981 点赞 3
顶部