开源中国

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

It appears you’re using an unsupported browser

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

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

java基础(一) 深入解析基本类型

### 一、基本类型的简介 **基本类型的两条准则:** - Java中,如果对整数不指定类型,默认时int类型,对小数不指定类型,默认是double类型。 - 基本类型由小到大,可以自动转换,但是由大到小,则需要强制类型转换。 **所占的字节数:** byte: 1个字节; char: 2个字节; short: 2个字节; int: 4个字节; long: 8个字节; float: 4个字节;(6位小数,指数是:10^-38~10^38; 范围:) double: 8个字节; char:Java中用 "\u四位十六进制的数字 (即使在注释中出现\u,后面如果 跟的不是4个16进制的数字,也会报错)"表示将字符转换成对应的unicode编 码;也可以用字符来赋值如: char c="\u0000" ,char的默认初始化值,unicode的null字符 **基本类型的后缀:** long : l 或 L float: f 或 F; double: d 或 D ### 二、类型转换   正如前面所说的,类型由大到小,是必需强制转换。但这并不意味着需要用户手动强制转换 —— 也就是 隐式转换。隐式转换 说的透彻点就是由编译器来进行强制转换,不需要用户再去写强制转换的代码。下面的前两个小点所说的便是特殊的隐式类型转换。 本小节所讨论的类型转换是不包括 类型由小到大的转换,讨论的是其他比较容易让人迷惑...
sihailoveyan 发布于 2天前 阅读 392

Python标准库笔记(8) — pprint模块

> `struct`模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串。   该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换。 这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源。 ### 1. 模块函数和Struct类   它除了提供一个`Struct`类之外,还有许多模块级的函数用于处理结构化的值。这里有个格式符(Format specifiers)的概念,是指从字符串格式转换为已编译的表示形式,类似于正则表达式的处理方式。通常实例化`Struct`类,调用类方法来完成转换,比直接调用模块函数有效的多。下面的例子都是使用`Struct`类。 ### 2. Packing(打包)和Unpacking(解包)   `Struct`支持将数据packing(打包)成字符串,并能从字符串中逆向unpacking(解压)出数据。   在本例中,格式指定器(specifier)需要一个整型或长整型,一个两个字节的string,和一个浮点数。格式符中的空格用于分隔各个指示器(indicators),在编译格式时会被忽略。 ```python import struct import binascii values = (1, 'ab'.encode('utf-8'), 2.7) s = struct.Struct('I 2s f') packed_data = s.pack(*values) print('原始值:', val...
j_hao104 发布于 2天前 阅读 215

你离BAT之间,只差这一套Java面试题

最近,各大公司开始了春招,很多人已经开始在准备面试了,特地来总结下初中级程序员应该掌握的面试题目。这篇面试指南,只适用于初中级程序员,其中不涉及分布式等问题。关于中高级的程序员问题,我后面可能再出一篇文章。 对于一个初中级程序员来说,面试问题不仅仅涉及到Java语言,还会包括很多其他知识,比如计算机基础知识(数据结构、计算机网络、操作系统等)、C语言基础、Java底层知识以及一些框架相关知识等。本文几乎覆盖到了所有领域。 计算机基础知识 C语言基础 Java基础 Java高级 Java Web 设计模式 知识的综合能力 工具使用 项目相关 技术热情 表达能力 思考方式 其他 推荐阅读 还有,我知道很多人会问关于这些题目的答案问题。答案我都有,由于篇幅有限没办法直接贴上来。这些题目的答案我会在我的公众号及知识星球中给出,感谢关注。 为了方便,我把他们分了类,有一些是必看的,我用!标注,有一些进阶型的我用%标注,有一些需要了解的,我用?标注。 必会关键字 void byte int long char short float double String StringBuffer StringBuilder Array CollectionCollections List ArrayList LinkedList Vector Set HashMap TreeMap L...
Java工程师-Distance 发布于 2天前 阅读 547 点赞 2

Python中的迭代器、生成式、生成器及装饰器

1.迭代器 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 生成一个迭代器:   >>> a = iter([1,2,3,4,5]) >>> a <list_iterator object at 0x101402630> >>> a.__next__() 1 >>> a.__next__() 2 >>> a.__next__() 3 >>> a.__next__() 4 >>> a.__next__() 5 >>> a.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration   2.生成式和生成器 列表生成式格式: [exp for val in collection if condition] [x*x for x in xrange(10) if x*x%2 == 0] 生成...
枫叶云 发布于 3天前 阅读 165 点赞 1

java基础(八) 深入解析常量池与装拆箱机制

### 引言   本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体,给初学者带来不少困扰,我就是过来的。同时,也因为包装类的缓存 与 字符串常量池的思想是一样的,很容易混淆,但是实现方式是不一样的。 ### 一、常量池 在介绍常量池前,先来介绍一下常量、字面常量、符号常量的定义。 **常量** 可分为 **字面常量**(也称为直接常量)和 **符号常量**。 **字面常量**: 是指在程序中无需预先定义就可使用的数字、字符、boolen值、字符串等。简单的说,就是确定值的本身。如 10,2L,2.3f,3.5,“hello”,'a',true、false、null 等等。 **符号常量**: 是指在程序中用标识符预先定义的,其值在程序中不可改变的量。如 `final int a = 5`; **常量池**   常量池引入的 **目的** 是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。这是一种 享元模式 的实现。 ## 二、 java常量池 Java的常量池可以细分为以下三类: - 量池,编译阶段) - 运行时常量池(又称动态常量池,运行阶段) - 字符串常量池(全局...
sihailoveyan 发布于 3天前 阅读 327

深入理解 Java 多线程核心知识:跳槽面试必备

多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。 本文从基础概念开始到最后的并发模型由浅入深,讲解下线程方面的知识。 概念梳理 本节我将带大家了解多线程中几大基础概念。 并发与并行 并行,表示两个线程同时做事情。 并发,表示一会做这个事情,一会做另一个事情,存在着调度。单核 CPU 不可能存在并行(微观上)。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。 此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程在操作系统层面被挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。 非阻塞则允许多个线程...
Java工程师-Distance 发布于 5天前 阅读 953 评论 2 点赞 2

Java集合总结【面试题+脑图】,将知识点一网打尽!

前言 声明,本文用的是jdk1.8 花了一个星期,把Java容器核心的知识过了一遍,感觉集合已经无所畏惧了!!(哈哈哈....),现在来总结一下吧~~ 回顾目录: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMap就这么简单【源码剖析】 TreeMap就这么简单【源码剖析】 ConcurrentHashMap基于JDK1.8源码剖析 Set集合就这么简单! Java容器可分为两大类: Collection List ArrayList LinkedList Vector(了解,已过时) Set HashSet LinkedHashSet TreeSet Map HashMap LinkedHashMap TreeMap ConcurrentHashMap Hashtable(了解,,已过时) 着重标出的那些就是我们用得最多的容器。 其实,我也不知道要怎么总结好,因为之前写每一篇的时候都总结过了。现在又把他们重新罗列出来好像有点水,所以,我决定去回答一些Java容器的面试题! 当然了,我的答案未必就是正确的。如果有错误的地方大家多多包含,希望不吝在评论区留言指正~~ 一、ArrayList和Vector的区别 共同点: 这两个类都实现了List接口,它们都是有序的集合(存储有序),底层是数组。我们可以按位置索引号取出某个元素,允许元素重复和为null。 区别...
Java3y 发布于 5天前 阅读 817 点赞 1

centos7 mini 系统openjdk9源码编译

根据GNU协议又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。Richard Stallman最早是在net.unix-wizards新闻组上公布该消息,并附带《GNU宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。即“反版权”(或称Copyleft)概念。
骰子红豆豆 发布于 5天前 阅读 246

Python3中的函数

Python3中的函数介绍: 1.函数的定义 , 2.函数的调用, 3.函数的参数, 4.函数的返回值, 5.函数的变量, 6.匿名函数, 7.高阶函数
枫叶云 发布于 6天前 阅读 291 点赞 1

动态规划 最长公共字符子序列

动态规划的应用题目求解解析过程
xpbob 发布于 6天前 阅读 81 点赞 1

2018年微服务架构沿着这5个趋势发展必炸裂

在2017年,DevOps领域中增加了大量的生态系统玩家,那么2018年会有哪些变化呢?本文展望了微服务在2018年可能的5个发展趋势,并对各个趋势进行了详细的介绍。 对于DevOps来说,2017年是重要的一年,不仅生态系统玩家的数量大幅增加,而且CNCF项目增加了两倍。展望未来一年,我们期待创新和市场变化进一步加速。以下是我们对2018年微服务趋势的看法:服务网格、事件驱动架构、容器本地安全、GraphQL和混沌工程。 我们将关注这些趋势,以及未来一年将围绕它们建立业务的公司。你看到了什么趋势?在下面留言让我们知道哪些被遗漏了,或者如果你同意/不同意我们概述的内容。 1. 服务网格非常热门 服务网格是一个用于改进服务与服务之间的通信的基础架构层,也是目前最流行的原生云类别。随着容器变得越来越普遍,服务拓扑变得越来越动态,需要更先进的网络功能。服务网格可以通过服务发现、路由、负载均衡、健康检查和可观察性来帮助管理流量。服务网格试图驯服难以控制的容器复杂性。 随着像HAProxy、Træfik和NGINX这样的负载均衡器开始重新定位为数据平面,它的服务网格变得越来越受欢迎。我们还没有看到广泛的部署,但确实知道在生产环境中运行服务网格的业务。此外,服务网...
烂猪皮 发布于 7天前 阅读 253

阿里资深架构师私下峰会:了解这几点,人人皆是优秀架构师

前言: 最近有好多人问我说:“George,怎样才能成为公司里的前线主力架构师,我现在在公式已经干了快五年了,现在还是一个默默无闻的程序员,我也通过很多种渠道来突破我现在瓶疾,但就是走不出来,技术也一直没有突破上去,我真的是没有办法了,通过朋友推荐介绍,说您这里可以解决我的技术瓶疾,所以我想请你帮我突破一下技术方面上的瓶疾。” 你们是否有也有类似这样的问题——“天天写业务代码的程序员,怎么成为技术大牛,开始写技术代码?” 今天,我和我之前一起共事的朋友,一起探讨出了这么一个结论:要怎样努力才可以成为公司主力架构师。 不管是开发、测试、运维,每个技术人员心里多多少少都有一个成为技术大牛的梦,毕竟“梦想总是要有的,万一实现了呢”!正是对技术梦的追求,促使我们不断地努力和提升自己。 然而“梦想是美好的,现实却是残酷的”,很多同学在实际工作后就会发现,梦想是成为大牛,但做的事情看起来跟大牛都不沾边,例如,程序员说“天天写业务代码还加班,如何才能成为技术大牛”,测试说“每天都有执行不完的测试用例”,运维说“扛机器接网线敲shell命令,这不是我想要的运维人生”。 我也是一位程序员,所以我希望通过以下基于程序开...
James- 发布于 7天前 阅读 340 评论 1 点赞 4

JVM 学习之垃圾回收

## 什么是“垃圾”? 对我们已经没有使用价值的东西就称为“垃圾”。在 JVM 中无用的对象就称为“垃圾”,因为它占用了我们宝贵的内存资源。 ## 哪里有“垃圾”? 前面我们已经了解过了 JVM 的内存,现在复习一下。我们知道程序计数器、虚拟机栈、本地方法栈都是线程私有的,这几个区域随着线程消亡而消亡,可以达到自动清理的效果。Java 堆、方法区则是共享区域,各种对象的实例保存在 Java 堆中。所以这两个区域会出现“垃圾” ## 谁是“垃圾”? 怎么确定谁是垃圾,这里提供了两种算法,分别是:引用计数算法、可达性分析算法 ### 引用计数算法 引用计数算法的思路是这样的: 每当有一个地方引用它时,计数器的值就加 1;当引用失效的时候,计数器就减 1。任何时刻计数器为 0 的对象就是不可能被再次使用的。 这种方法效率高,但是会出现无法回收的情况,请看下面的代码: ``` public class Main { public static void main(String[] args) { MyObject object1 = new MyObject(); MyObject object2 = new MyObject(); object1.object = object2; object2.object = object1; object1 = null; object2 = null; } } class MyObject{ public Object object = null; } ``` 这...
stackfing 发布于 7天前 阅读 171

微服务开发中的数据架构设计

前言 微服务是当前非常流行的技术框架,通过服务的小型化、原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合、业务的灵活调整组合以及系统的高可用性。为业务创新和业务持续提供了一个良好的基础平台。本文分享在这种技术架构下的数据架构的设计思想以及设计要点,本文包括下面若干内容。 微服务技术框架中的多层数据架构设计 数据架构设计中的要点 要点1:数据易用性 要点2:主、副数据及数据解耦 要点3:分库分表 要点4:多源数据适配 要点5:多源数据缓存 要点6:数据集市 为了容易理解,本文用一个简化的销售模型来阐述,如下图。图1显示了客户、卖家、商品、定价、订单的关系(这里省略支付、物流等其他元素)。 图1 销售模型 在这个销售模型中,卖家提供商品、制定价格,客户选择产品购买、形成销售订单。根据微服务的理念设计,可以划分为客户服务、卖家服务、商品服务、定价服务、订单服务,以及公共服务(比如认证、权限、通知等),如图2所示。 图2 微服务功能 微服务架构中的多层数据架构设计 分布式架构一般把系统分为 Saas(Software-as-a-Service)、Paas(Platform-as-a-Service)、Iaas(Infrastructure as a Service )三层。其中 Sa...
烂猪皮 发布于 1周前 阅读 764 评论 3 点赞 2

十年大厂开发经验讲述对分布式锁的技术选型及思考

锁和分布式锁 在计算机中,锁的作用是解决在并发状态下的共享资源互斥问题,保证在同一时间只有一个进程/线程可以掌握资源的控制权。 例如以下几种情况: 文件锁的实现是为了解决不同用户同时读写同一文件的并发问题而出现的,防止导致文件的内容被破坏。 使用数组实现的队列,在 push 操作的地方一般需要加锁来解决槽位的争夺问题,防止出现多次 push 冲突从而导致数据丢失问题。 对于12306来说,火车票就是他的资源,最终放票的时候需要锁来保证票、人、座位唯一对应。 …… 上面的例子中其实就包含了我们通常讲的传统单机锁和我要讲的分布式锁。 单机环境下,资源竞争者都是来自机器内部((进程/线程),那么实现锁的方案只需要借助单机资源就可以了,比如借助磁盘、内存、寄存器来实现。 但是对于分布式环境下,资源竞争者生存环境更复杂了,原有依赖单机的方案不再发挥作用,这时候就需要一个大家都认可的协调者出来,帮助解决竞争问题,那这个协调者称之为分布式锁。 上面这个例子就像两个职员产生的矛盾,只要公司的领导出面就可以解决。而当两个公司产生竞争矛盾的时候,就需要司法机关出面,是同一个道理。 简单的说,分布式锁就是解决分布式环境下资源竞争问题的...
权律二啊- 发布于 1周前 阅读 683 评论 4

TreeMap就这么简单【源码剖析】

前言 声明,本文用得是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMap就这么简单【源码剖析】 本篇主要讲解TreeMap~ 看这篇文章之前最好是有点数据结构的基础: Java实现单向链表 栈和队列就是这么简单 二叉树就这么简单 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、TreeMap剖析 按照惯例,我简单翻译了一下顶部的注释(我英文水平渣,如果有错的地方请多多包涵~欢迎在评论区下指正)     接着我们来看看类继承图:     在注释中提到的要点,我来总结一下: TreeMap实现了NavigableMap接口,而NavigableMap接口继承着SortedMap接口,致使我们的TreeMap是有序的! TreeMap底层是红黑树,它方法的时间复杂度都不会太高:log(n)~ 非同步 使用Comparator或者Comparable来比较key是否相等与排序的问题~ 对我而言,Comparator和Comparable我都忘得差不多了~~~下面就开始看TreeMap的源码来看看它是怎么实现的,并且回顾一下Comparator和Comparable的用法吧! 1.1TreeMap的域     1.2TreeMap构造方法 TreeMap的构造方法有4个:     可以发现,T...
Java3y 发布于 1周前 阅读 440 点赞 1

LinkedHashMap就这么简单【源码剖析】

前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合以及散列表、Map集合、红黑树还有HashMap基础了: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 本篇主要讲解LinkedHashMap~ 看这篇文章之前最好是有点数据结构的基础: Java实现单向链表 栈和队列就是这么简单 二叉树就这么简单 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、LinkedHashMap剖析 LinkedHashMap数据结构图:     ps:图片来源网络,侵删~ 首先我们来看看类继承图:     我简单翻译了一下顶部的注释(我英文水平渣,如果有错的地方请多多包涵~欢迎在评论区下指正)     从顶部翻译我们就可以归纳总结出HashMap几点: 底层是散列表和双向链表 允许为null,不同步 插入的顺序是有序的(底层链表致使有序) 装载因子和初始容量对LinkedHashMap影响是很大的~ 同时也给我带了几个疑问: access-ordered和insertion-ordered具体的使用和意思 为什么说初始容量对遍历没有影响? 希望可以在看源码的过程中可以解决掉我这两个疑问~ 那接下来就开始吧~ 1.1LinkedHashMap的域     1.2LinkedHashMap...
Java3y 发布于 1周前 阅读 359 点赞 2

Python3典型小实例和乱码问题

五个小典型小实例和python中出现的字符编码乱码问题
枫叶云 发布于 1周前 阅读 269

使用Gradle 将Library module 发布到本地 maven 仓库

# 将module发布到本地maven仓库 1. 在本地准备一个目录,当做maven仓库 2. 在项目的 `gradle.properties` 配置仓库信息(主要是POM文件信息) 3. 在module的 `build.gradle` 配置插件,任务,及代码信息 4. 执行发布任务 5. 本地 `maven` 查看 6. 引用本地仓库中的包 ## 1. 准备目录 Example: ```` E:\libs\localMaven ```` ## 2. 配置仓库信息 在项目的 `gradle.properties` 中配置属性信息 Example: ``` # 包信息 PROJ_GROUP= 一般为公司域名 PROJ_VERSION=版本 # 项目的描述 PROJ_WEBSITEURL= 项目地址 PROJ_ISSUETRACKERURL= 提 issue 地址 PROJ_DESCRIPTION= 项目介绍 # Licence信息 这部分是固定的 PROJ_LICENCE_NAME=The Apache Software License, Version 2.0 PROJ_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt PROJ_LICENCE_DEST=repo # Developer 信息 这里是开发者信息 DEVELOPER_ID=mxc DEVELOPER_NAME=孟祥超 DEVELOPER_EMAIL=skymxc@foxmail.com ```` ## 3. 为 `module` 配置插件,任务,代码信息 为了优雅,在 `module` 下创建一个 `gradle.properties` 文件设置属性 ``` PROJ_NAME=依赖名字 localrepo PROJ_ARTIFACTID=所属分类 LOCAL_REPO...
sky-mxc 发布于 2周前 阅读 114

惠普资深技术架构师总结出这几种常见的微服务架构方案

第一:Zero CIceGrid 微服务架构 Zero CIceGrid 也是一种微服务架构,好多人都清楚他的存在,它基于RPC框架发展而来,具体有良好的性能与分布式能力,如下图是它的整体示意图。 Icegrid具备微服务架构的如下明显特征。 首先,微服务架构需要一个集中的服务注册中心,以及某种服务发现机制。 Icegrid服务注 册采用XML文件来定义,其服务注册中心就是 Ice Registry,这是一个独立的进程,并且提供 了HA高可用机制;对应的服务发现机制就是命名查询服务,即 Locatorservice提供的API,可 以根据服务名查询对应的服务实例可用地址。 首先,微服务架构需要一个集中的服务注册中心,以及某种服务发现机制。 Icegrid服务注 册采用XML文件来定义,其服务注册中心就是 Ice Registry,这是一个独立的进程,并且提供 了HA高可用机制;对应的服务发现机制就是命名查询服务,即 Locatorservice提供的API,可 以根据服务名查询对应的服务实例可用地址。 然后,微服务架构中通常都需要内嵌某种负载均衡机制。在 Icegrid里是通过客户端AF 内嵌的负载均衡算法实现的,相对于采用中间件 Proxy转发流量的方式, Icegrid的做法更加高 效,但增加了平台开发的工作量与难度,因为采用各种语言的客户端都需要实现一遍负载...
烂猪皮 发布于 2周前 阅读 327

菜鸟学Python之django-simple-captcha使用

### 环境的准备 前端框架semantic ui Python 3.6.4 ``` pip install django pip install django-simple-captcha ``` django-simple-captcha官方文档地址 http://django-simple-captcha.readthedocs.io/en/latest/ ### 目标展示 ![输入图片说明](https://static.oschina.net/uploads/img/201802/24233654_fkCn.gif "在这里输入图片标题") ### 配置settings.py ``` # django_simple_captcha 验证码配置其他配置项查看文档 # 默认格式 CAPTCHA_OUTPUT_FORMAT = '%(image)s %(text_field)s %(hidden_field)s ' CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null', # 没有样式 # 'captcha.helpers.noise_arcs', # 线 # 'captcha.helpers.noise_dots', # 点 ) # 图片中的文字为随机英文字母,如 mdsh # CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' # 图片中的文字为数字表达式,如2+2= CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge' # 超时(minutes) CAPTCHA_TIMEOUT = 1 ``` ### 配置form.py ``` class LoginForms(forms.Form): email = forms.CharField(label="邮箱", max_length=128) password = forms.CharField(label="密码"...
红焖鲤鱼 发布于 2个月前 阅读 284 点赞 1

简单工厂设计模式

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 简单工厂设计模式 设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活。 架构模式比设计模式大,架构模式是战略,设计模式是战术。 设计模式分为3种:创建型,行为型,结构型 简单工厂设计模式属于创建型设计模式,但不属于23种设计模式范围内,属于23种设计模式中工厂方法的入门模式,又叫静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 简单工厂设计模式的好处是隐藏对象创建,不用依赖对象,可以随意更换对象。在工厂模式中,工厂类中的所有方法返回同一个抽象产品类,代码的升级和扩张只需要在这个工厂类中注入新的功能方法返回抽象产品类即可,或是另外写接口,将这个抽象产品类强制转换成这个接口,让具体产品类去实现。 售票员例题: 解开Jfreechart压缩包--打开lib--打开chart文件夹--找到ChartFactory.class文件--拖拽到IDEA中进行反编译--点击structure查看结构 Jfreechart是典型的工厂模式做出来的。Jfreechart就是工程模式中的产品,在所有creat方法中返回的全部都是同一个J...
凯哥学堂 发布于 12小时前 阅读 3

Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)

概述 ConcurrentHashMap常用于并发编程,这里就从源码上来分析一下ConcurrentHashMap数据结构和底层原理。 在开始之前先介绍一个算法, 这个算法和Concurrent的实现是分不开的。 CAS算法: CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。 CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。 更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B 从思想上来说,Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。 ConcurrentHashMap是一个线程安全的Map集合,可以应对高并发的场景,保证线程安全。相比较HashTable,它的锁粒度更加的细化,因为HashTable的方法都是用Synchronized修饰的,效率灰常的底下。 1.8之前ConcurrentHashMap使用锁分段技术,将数据分成一段段的存储,每一个数据段配置一把锁,相互之间不影响,而1.8之后摒弃了Segment(锁段)的概念,启用了全新的实现,也就是利用CAS+Synchronized来保证并发更新的安全,底层采用的依然是数组+链表+红黑树。 ...
郑加威 发布于 2个月前 阅读 40

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

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

Gradle配置国内镜像

使用阿里云国内镜像 # 单个项目配置,在项目中的build.gradle修改内容 ``` buildscript { repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} } } ``` # 全局配置,对所有项目生效,在USER_HOME/.gradle/下创建init.gradle文件 ``` allprojects{ repositories { def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public' def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.star...
Os_yxguang 发布于 1个月前 阅读 79

Spring的编程式事务管理和声明式事务管理的一些简单写法

Spring将事务管理分成了两类: 1.编程式事务管理:   需要手动在SERVICE层相关的方法上编写代码transactionTemplate.execute() 2.声明式事务管理   (a)基于TransactionProxyFactoryBean的方式(比较原始)   (b)基于AspectJ的xml方式      优点:一旦配置好了之后,不需要在相关的类上编写任何的代码,结构很清晰   (c)基于注解的方式      优点:配置简单,但是需要在业务层的类上添加一个@Transactional的注解 上面4种无论哪种方式,都需要在spring配置文件中 配置实物管理器:transactionManager   代码示例: 共同部分: DAO层: public interface AccountDao { /** * * @Title: outMoney 转出金额的方法 * @param out 转出账号 * @param money 转出的金额 */ public void outMoney(String out,Double money); /** * * @Title: inMoney 转入金额的方法 * @param in 转入账号 * @param money 转入金额 */ public void inMoney(String in,Double money); } public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{ @Override public void outMoney(String out, Double money) { String sql = "UPDATE ACCOUNT...
文文1 发布于 1个月前 阅读 17

系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式

系统的各种性能指标的概念简单理解,本内容来源于网络博客,如果存在不准确的地方,还请大家多多提出来,因为我也不是专门的测试人员,作为一名码农,还是需要了解一下这些概念.
一只努力的码农 发布于 1个月前 阅读 33

Golang 中new和make的区别简单分析

So people can, is convinced that can. 人之因此能,是坚信能。    new(  )  能为引用类型分配内容,但不是完整的创建。以map为例,仅仅是分配了类型本身(将类型的指针包装起来)所需的内存。并没有分配键值所存储需要的内存,也没有初始化hash桶等内部属性,因此一下案例是panic的。 func main(){ a:= new(map[int]int) b := *a b[1] = 1 // 此处panic了信吗?! }  
90design 发布于 3个月前 阅读 40

Golang关于channel传递引用引发的坑

 Time won't go back I won't turn back. 时光不会倒着走,我也不会再回头。  其实这个问题其实是出现在引用类型( 此处是slice )上, 这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。  结构图解1 每次cap改变的时候指向array内存的指针都在变化, 在实际使用中,我们最好事先预期好一个cap,这样在使用append的时候可以避免反复重新分配内存复制之前的数据,减少不必要的性能消耗。 现在上实例,来看看坑所在: package main import "fmt" import "time" func main() { ch := make(chan []byte, 10) go func() { for { select { case data := <-ch: fmt.Println(string(data)) } } }() data := make([]byte, 0, 32) data = append(data, []byte("bbbbbbbbbb")...) ch <- data // fmt.Printf("%p\n", data) data = data[:0] // fmt.Printf("%p\n", data) data = append(data, []byte("aaa")...) ch <- data time.Sleep(time.Second * 5) } 预测的运行结果: bbbbbbbbbb aaa   但是肯定是有坑的: 前面新起了一个协程来等待通道接受信息, 主进程继续执行,...
90design 发布于 3个月前 阅读 55

Micropython TPYBoard读取芯片上的温度传感器

STM32 内部温度传感器概要 STM32 芯片内部一项独特的功能就是内部集成了一个温度传感器, 因为是内置, 所以测试的是芯片内部的温度, 如果芯片外接负载一定的情况下, 那么芯片的发热也基本稳定, 相对于外界的温度而言, 这个偏差值也是基本稳定的. 也就是说用 STM32 内部传感器来测量外界环境的温度。 在一些恶劣的应用环境下面, 可以通过检测芯片内部而感知设备的工作环境温度, 如果温度过高或者过低了 则马上睡眠或者停止运转. 可以保证您的设备工作的可靠性。   STM32内部温度传感器参数 1.STM32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量。 2.测量范围–40~125℃,精度±1.5℃。 3.温度传感器产生一个随温度线性变化的电压,转换范围在2V < VDDA < 3.6V之间。转换公式如下图所示: 手册中对于公式中的参数说明: 读取温度的实现原理 写代码的时候, 在测量要求不怎么高的情况下, 公式可以简化。简化的公式:   Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25 程序编写:   1.初始化ADC , 初始化DMA   注意:内部温度传感器是使用了 ADC1 的第 16 通道哦   2.ADC_TempSensorVrefintCmd(ENABLE); 使能温度传感器和内部参考电压通道   3....
bodasisiter 发布于 3周前 阅读 10

归并排序算法

归并排序算法的时间复杂度为O(NlogN) /** * Created by Administrator on 2018-04-05. */ public class Merge { static final int SIZE = 15; static void mergeOne(int a[],int b[],int n,int len) { int i,j,k,s,e; s = 0; while (s + len < n) { e = s + 2 * len - 1; if (e >= n) { e = n - 1; } k = s; i = s; j = s + len; while (i < s + len && j <= e) { if (a[i] <= a[j]) { b[k++] = a[i++]; }else { b[k++] = a[j++]; } } while (i < s + len) { b[k++] = a[i++]; } while (j <= e) { b[k++] = a[j++]; } s = e + 1; } if (s < n) { for (;s < n;s++) { b[s] = a[s]; } } } static void mergeSort(int a[],int n) { int h,c...
算法之名 发布于 2周前 阅读 16

Linux 汇编语言 HelloWorld

什么都不说了,先上代码(有 AT&T 和 Intel 两种格式,我还是习惯用后者): ; hello.asm section .data ; 数据段声明 msg db "Hello, world!", 0xA ; 要输出的字符串 len equ $ - msg ; 字串长度 section .text ; 代码段声明 global _start ; 指定入口函数 _start: ; 在屏幕上显示一个字符串 mov edx, len ; 参数三:字符串长度 mov ecx, msg ; 参数二:要显示的字符串 mov ebx, 1 ; 参数一:文件描述符(stdout) mov eax, 4 ; 系统调用号(sys_write) int 0x80 ; 调用内核功能 ; 退出程序 mov ebx, 0 ; 参数一:退出代码 mov eax, 1 ; 系统调用号(sys_exit) int 0x80 ; 调用内核功能 然后是工具: 因为用的是Intel的格式,需要安装nasm。 $ sudo apt install nasm 然后是编译: nasm -f elf helloworld.asm 连接时遇到一个问题,当前操作系统是64位的,而我写的是32位的代码: $ ld -s -o hello helloworld.o ld: i386 archit...
千面人 发布于 2个月前 阅读 21

Dart语言指南(二)

Dart语言指南(二)
scooplol 发布于 2周前 阅读 17

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 发布于 2个月前 阅读 2456 评论 3 点赞 3

install boost lib ubuntu 16.04

sudo apt-get install libboost-all-dev # version is 1.58 setting lib search directory and lib for boost, for example -I/usr/lib/x86_64-linux-gnu/ -lboost_filesystem -lboost_system  
仪山湖 发布于 7天前 阅读 10

在VS中使用万能头文件#include <bits/stdc++.h>编译错误的解决方法

codeforces已经有过说明。我这里只是把它翻译地更加浅显一点:   solution to include bits/stdc++.h in visual c++   By Tensor, 2 years ago, , This is just a method i used to make me able to include bits/stdc++.h in visual c++. for those had minGW installed on PC : C:\MinGW\mingw32\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits copy this folder and then go to this adress C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include paste your folder. go to your visual studio project type bits you will see the auto-complete for the library and then choose stdc++.h for those don't have minGW: you should write your own header file and include all libraries in it then go to C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include make new folder name it "bits" and name the header file stdc++.h then paste it in "bits" folder. Hope this helps! Happy coding     就是说 1.如果安装了MinGW的直接在文件夹里面找到bits这个文件夹(注意里面一定要包含stdc++.h,貌似我的版本有两个bits文件夹),把...
LoSingSang 发布于 7天前 阅读 13

淘宝npm镜像安装命令

npm install -g cnpm --registry=https://registry.npm.taobao.org npm install cnpm -g;
笑丶笑 发布于 2个月前 阅读 13

Python函数声明以及与其他编程语言数据类型的比较

1、函数声明 与其它大多数语言一样 Python 有函数,但是它没有像 C++ 一样的独立的头文件;或者像 Pascal 一样的分离的  interface / implementation 段。在需要函数时,像下面这样声明即可:   def buildConnectionString(params):   首先,函数声明以关键字  def 开始,接着为函数名,再往后为参数,参数放在小括号里。多个参数之间 (这里没有演示)用逗号分隔。   其次,函数没有定义返回的数据类型。Python 不需要指定返回值的数据类型;甚至不需要指定是否有返回值。实际上,每个 Python 函数都返回一个值;如果函数执行过  return 语句,它将返回指定的值,否则将返回  None (Python 的空值)。 Python vs. Visual Basic  的返回值 在 Visual Basic 中,函数 (有返回值) 以  function 开始,而子程序 (无返回值) 以sub 开始。在 Python 中没有子程序。只有函数,所有的函数都有返回值 (尽管可能为  None ),并且所有的函数都以  def 开始。 最后需要指出的是,在 Python 中参数, params 不需要指定数据类型。Python会判定一个变量是什么类型,并在内部将其记录下来。 Python vs.  Java  的返回值 在 Java、C++ 和其他静态类型语言中,必须要指定函数返回...
光明辉煌 发布于 1小时前 阅读 1

java虚拟机面试总结

作者:刘金辉 战斗民族就是干 转自:http://www.cnblogs.com/prayers/p/5515245.html   一.运行时数据区域    Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、堆、本地方法栈、程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区。    1.1程序计数器    程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法(native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。JNI是Java本机接口(Java Native Interface),JNI允许Java代码使用以其他语言编写的代码和代码库),这个计数器则为空。此内存区域是唯一 一个在Java虚拟机规范中没...
117 发布于 1个月前 阅读 35

Java Money与Currency API浅谈

**一、概述** JSR 354 - “金钱和货币”解决了Java中货币和货币金额的标准化问题。 它的目标是为Java生态系统添加一个灵活的可扩展的API,并使货币量更简单,更安全。 JSR没有进入JDK 9,而是未来JDK版本的候选人。虽然在Java9有Currency类简单实现但是实际开发中满足不了需求 **二、引入** 在maven的pom.xml中做如下引入 org.javamoney moneta 最新版本 在gradle中 compile group: 'org.javamoney', name: 'moneta', version: '最新版本' 最新版本依赖,可以查看,[点击这里](https://mvnrepository.com/artifact/org.javamoney/moneta) **三、JSR-354功能** “货币和金钱”API的目标: 1.提供处理和计算货币金额的API 2.定义货币和货币金额的类别,以及货币四舍五入 3.处理汇率 4.处理货币和货币金额的格式化和解析 **四、API分析与使用** 1.规范中提到的类及接口都在javax.money.*包下面。 2.先从核心的两个接口CurrencyUnit与MonetaryAmount开始剖析 3.CurrencyUnit及MonetaryAmount CurrencyUnit 代表的是货币。它有点类似于现在的java.util.Currency类,不同之处在于它支持自定义的实现。从规范的定义来看,java.util.Currency也是可以实现该接口的。CurrencyUnit的实...
ville 发布于 3个月前 阅读 363

spring boot 禁用数据源

spring boot 禁用数据源
jingshishengxu 发布于 3个月前 阅读 50

JHipster修改JDL中的entity

## 更新model #### 需求 ``` 概览表增加"创建时间,修改时间,软删除" ``` #### 以往的方式 ###### 1. 修改model.jh, 在实体 Overview 中增加三个属性 ``` /** * 数据概览 -- 概览 */ entity Overview { id Long, ... /* 以下属性为新增的属性 */ /* 创建时间 */ createTime ZonedDateTime, /* 更新时间 */ updateTime ZonedDateTime, /* 是否删除 */ delFlag Boolean, } ``` ###### 2. 生成配置文件 ``` jhipster import-jdl model.jh ``` ###### 3. 运行项目使配置生效 ``` 运行项目时提示"Validation Failed",原因是配置文件的MD5值不同, 此时需要以下操作 1. 修改 DATABASECHANGELOG 表中相关记录的 MD5SUM 2. 在overview表中手动新增三个属性. ``` #### 现在的方式 ###### 1. 修改model.h, 在实体 Overview 中增加三个属性 ###### 2. 生成配置文件 ###### 3. 修改生成的配置文件 ``` src/main/resources/config/liquibase/changelog/20180302095615_added_entity_Overview.xml 将 changeSet中新增的三个column提取至新的changeSet中, 如下: 注意: changeSet的id不能与之前的相同 ``` ###### 4. 运行项目使配置生效 ``` 不需要手动修改MySQL,自动生效 ```...
tianshl 发布于 2个月前 阅读 21655

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

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

Java下载CSV文件

```java @GetMapping("/download") public void download(HttpServletResponse response, @RequestParam String path) throws Exception { // 让servlet用UTF-8转码,默认为ISO8859 response.setCharacterEncoding("UTF-8"); File file = new File(path); if (!file.exists()) { // 让浏览器用UTF-8解析数据 response.setHeader("Content-type", "text/html;charset=UTF-8"); response.getWriter().write("文件不存在或已过期,请重新生成"); return; } String fileName = URLEncoder.encode(path.substring(path.lastIndexOf("/") + 1), "UTF-8"); response.setContentType("text/csv"); response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", fileName)); InputStream is = null; OutputStream os = null; try { is = new FileInputStream(path); byte[] buffer = new byte[1024]; os = response.getOutputStream(); int len; while((len = is.read(buffer)) > 0) { os.write(buffer,0, len); } }catch(Exception e) { throw new RuntimeException(e); }finally { try { if (is != null) is.close(); if (os != null) os.close(); } c...
tianshl 发布于 1周前 阅读 3939

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

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

深入理解 Java 多线程核心知识:跳槽面试必备

多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。 本文从基础概念开始到最后的并发模型由浅入深,讲解下线程方面的知识。 概念梳理 本节我将带大家了解多线程中几大基础概念。 并发与并行 并行,表示两个线程同时做事情。 并发,表示一会做这个事情,一会做另一个事情,存在着调度。单核 CPU 不可能存在并行(微观上)。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。 此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程在操作系统层面被挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。 非阻塞则允许多个线程...
Java工程师-Distance 发布于 5天前 阅读 953 评论 2 点赞 2

Java集合总结【面试题+脑图】,将知识点一网打尽!

前言 声明,本文用的是jdk1.8 花了一个星期,把Java容器核心的知识过了一遍,感觉集合已经无所畏惧了!!(哈哈哈....),现在来总结一下吧~~ 回顾目录: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMap就这么简单【源码剖析】 TreeMap就这么简单【源码剖析】 ConcurrentHashMap基于JDK1.8源码剖析 Set集合就这么简单! Java容器可分为两大类: Collection List ArrayList LinkedList Vector(了解,已过时) Set HashSet LinkedHashSet TreeSet Map HashMap LinkedHashMap TreeMap ConcurrentHashMap Hashtable(了解,,已过时) 着重标出的那些就是我们用得最多的容器。 其实,我也不知道要怎么总结好,因为之前写每一篇的时候都总结过了。现在又把他们重新罗列出来好像有点水,所以,我决定去回答一些Java容器的面试题! 当然了,我的答案未必就是正确的。如果有错误的地方大家多多包含,希望不吝在评论区留言指正~~ 一、ArrayList和Vector的区别 共同点: 这两个类都实现了List接口,它们都是有序的集合(存储有序),底层是数组。我们可以按位置索引号取出某个元素,允许元素重复和为null。 区别...
Java3y 发布于 5天前 阅读 817 点赞 1

你离BAT之间,只差这一套Java面试题

最近,各大公司开始了春招,很多人已经开始在准备面试了,特地来总结下初中级程序员应该掌握的面试题目。这篇面试指南,只适用于初中级程序员,其中不涉及分布式等问题。关于中高级的程序员问题,我后面可能再出一篇文章。 对于一个初中级程序员来说,面试问题不仅仅涉及到Java语言,还会包括很多其他知识,比如计算机基础知识(数据结构、计算机网络、操作系统等)、C语言基础、Java底层知识以及一些框架相关知识等。本文几乎覆盖到了所有领域。 计算机基础知识 C语言基础 Java基础 Java高级 Java Web 设计模式 知识的综合能力 工具使用 项目相关 技术热情 表达能力 思考方式 其他 推荐阅读 还有,我知道很多人会问关于这些题目的答案问题。答案我都有,由于篇幅有限没办法直接贴上来。这些题目的答案我会在我的公众号及知识星球中给出,感谢关注。 为了方便,我把他们分了类,有一些是必看的,我用!标注,有一些进阶型的我用%标注,有一些需要了解的,我用?标注。 必会关键字 void byte int long char short float double String StringBuffer StringBuilder Array CollectionCollections List ArrayList LinkedList Vector Set HashMap TreeMap L...
Java工程师-Distance 发布于 2天前 阅读 547 点赞 2

java基础(一) 深入解析基本类型

### 一、基本类型的简介 **基本类型的两条准则:** - Java中,如果对整数不指定类型,默认时int类型,对小数不指定类型,默认是double类型。 - 基本类型由小到大,可以自动转换,但是由大到小,则需要强制类型转换。 **所占的字节数:** byte: 1个字节; char: 2个字节; short: 2个字节; int: 4个字节; long: 8个字节; float: 4个字节;(6位小数,指数是:10^-38~10^38; 范围:) double: 8个字节; char:Java中用 "\u四位十六进制的数字 (即使在注释中出现\u,后面如果 跟的不是4个16进制的数字,也会报错)"表示将字符转换成对应的unicode编 码;也可以用字符来赋值如: char c="\u0000" ,char的默认初始化值,unicode的null字符 **基本类型的后缀:** long : l 或 L float: f 或 F; double: d 或 D ### 二、类型转换   正如前面所说的,类型由大到小,是必需强制转换。但这并不意味着需要用户手动强制转换 —— 也就是 隐式转换。隐式转换 说的透彻点就是由编译器来进行强制转换,不需要用户再去写强制转换的代码。下面的前两个小点所说的便是特殊的隐式类型转换。 本小节所讨论的类型转换是不包括 类型由小到大的转换,讨论的是其他比较容易让人迷惑...
sihailoveyan 发布于 2天前 阅读 392

java基础(八) 深入解析常量池与装拆箱机制

### 引言   本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体,给初学者带来不少困扰,我就是过来的。同时,也因为包装类的缓存 与 字符串常量池的思想是一样的,很容易混淆,但是实现方式是不一样的。 ### 一、常量池 在介绍常量池前,先来介绍一下常量、字面常量、符号常量的定义。 **常量** 可分为 **字面常量**(也称为直接常量)和 **符号常量**。 **字面常量**: 是指在程序中无需预先定义就可使用的数字、字符、boolen值、字符串等。简单的说,就是确定值的本身。如 10,2L,2.3f,3.5,“hello”,'a',true、false、null 等等。 **符号常量**: 是指在程序中用标识符预先定义的,其值在程序中不可改变的量。如 `final int a = 5`; **常量池**   常量池引入的 **目的** 是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。这是一种 享元模式 的实现。 ## 二、 java常量池 Java的常量池可以细分为以下三类: - 量池,编译阶段) - 运行时常量池(又称动态常量池,运行阶段) - 字符串常量池(全局...
sihailoveyan 发布于 3天前 阅读 327

Python3中的函数

Python3中的函数介绍: 1.函数的定义 , 2.函数的调用, 3.函数的参数, 4.函数的返回值, 5.函数的变量, 6.匿名函数, 7.高阶函数
枫叶云 发布于 6天前 阅读 291 点赞 1

Python标准库笔记(8) — pprint模块

> `struct`模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串。   该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换。 这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源。 ### 1. 模块函数和Struct类   它除了提供一个`Struct`类之外,还有许多模块级的函数用于处理结构化的值。这里有个格式符(Format specifiers)的概念,是指从字符串格式转换为已编译的表示形式,类似于正则表达式的处理方式。通常实例化`Struct`类,调用类方法来完成转换,比直接调用模块函数有效的多。下面的例子都是使用`Struct`类。 ### 2. Packing(打包)和Unpacking(解包)   `Struct`支持将数据packing(打包)成字符串,并能从字符串中逆向unpacking(解压)出数据。   在本例中,格式指定器(specifier)需要一个整型或长整型,一个两个字节的string,和一个浮点数。格式符中的空格用于分隔各个指示器(indicators),在编译格式时会被忽略。 ```python import struct import binascii values = (1, 'ab'.encode('utf-8'), 2.7) s = struct.Struct('I 2s f') packed_data = s.pack(*values) print('原始值:', val...
j_hao104 发布于 2天前 阅读 215

Python中的迭代器、生成式、生成器及装饰器

1.迭代器 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 生成一个迭代器:   >>> a = iter([1,2,3,4,5]) >>> a <list_iterator object at 0x101402630> >>> a.__next__() 1 >>> a.__next__() 2 >>> a.__next__() 3 >>> a.__next__() 4 >>> a.__next__() 5 >>> a.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration   2.生成式和生成器 列表生成式格式: [exp for val in collection if condition] [x*x for x in xrange(10) if x*x%2 == 0] 生成...
枫叶云 发布于 3天前 阅读 165 点赞 1

阿里云错误:进程异常行为-Linux异常文件下载

问题发生的原因: 因为redis没有设置密码或者密码让别人知道了,然后通过redis发送病毒过来   top -c  查询占用CPU最高的进程   PS:CPU高的是病毒,ddgs.3010应该是一个病毒的重启程序 现在就需要同时对这2个进行操作: kill -9 KID    停止进程 cd /tmp rm -rf KID    删除 所以删除和停止了,但是有可能会有定时任务,所以要查看定时任务,停止 crontab -l    查看定时任务 crontab -r    关闭定时任务 top -c 查询是否解决,需要等待几分钟,应为病毒重启也是需要时间的 这样的话应该就能解决问题了  
Z-向上 发布于 2周前 阅读 212

总结:JDK1.5-JDK1.8各个新特性

引用: 此文章意在借鉴前人经验,留作日后查看。如有侵犯,实属无意。我以后会注意,谢谢博友的提醒。也愿各大博友们能够共同学习和努力。 https://my.oschina.net/91jason/blog/309821
iwen-J 发布于 4周前 阅读 5236 评论 1 点赞 32

Java开发者不会这些永远都只能是三流程序员,细数一下你是不是?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手分析Mybatis源码实现 高手进阶之手写Mybatis框架 高可用/分布式/高性能 实践一个高并发转盘抽奖 构建无切入性业务系统监控平台 Netty+websocket实现及时同通信 写一个数据库动态扩容方案以及MyCat实践 SOA架构及微服务架构的原理 redis/zookeeper/kafka原理 Netty通信及异步化技术剖析 基于Spring Cloud微服务实战 数据库动态扩容方案实战演练 本地队列及分布式队列技术分析 性能调优 深入分析JVM底层实现原理 如何设定调优目标及调优手段 数据库及web容器调优常见手段 垃圾回收器的选择及差异化分析 高性能反向代理服务器Nginx调优 关系型数据库分库分表扩容策略 MySql数据库调优及扩容 JVM常用优化及内存监控 Nginx+lua实现系统分流流控 企业级动静分离实战及DNS缓存 Java开发工具系列 手写Maven archetype 手写Maven插件 搭建大型企业级Git服务器 敏捷开发团队协作Git flow 利用Jenkins整合maven/git 搭建Maven+Nexus私服环境 Jenkins/git/maven自动化构建 手写swagger文档自动生...
美的让人心动 发布于 5天前 阅读 96 评论 5

Time To Upgrade Your Python

今年Mac os用户必须要更新,系统自带的python版本了。因为pypi将停止对TLS 1.0和1.1的支持, MacOS附带的系统Python在任何MacOS版本中都不支持TLSv1.2。
kangxin1234 发布于 1周前 阅读 157 点赞 1

关于elasticsearch中更新数据的几种方式

作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式。 (一)更新文档 (1)部分更新: java api: ```` ` HashMap data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.execute().actionGet(); System.out.println("update ok......"); ```` 注意部分更新功能,前提是索引和该条数据已经存在,否则会抛出对应的异常,只要任何一个不满足,都会更新失败。 curl: ```` curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" } } ```` (2)使用detect_noop java api: ```` ` HashMap data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.setDetectNoop(false);//默认是true urb.execute().actionGet(); System.out.println("update ok......"); ```` curl方式: ```` curl -XPOST 'localhost:9200...
九劫散仙 发布于 1个月前 阅读 2497 评论 5

资深架构师谈Java——最牛逼的编程语言

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。 Java超越了所有咒骂它的“动态语言” 也许是因为年轻人的逆反心理,人们都不把自己的入门语言当回事。很早的时候,计算机系的学生用Scheme或者Pascal入门,现在大部分学校用Java。这也许就是为什么很多人恨Java,瞧不起用Java的人。提到Java,感觉就像是爷爷那辈人用的东西。大家都会用Java,怎么能显得我优秀出众呢?于是他们说:“Java老气,庞大,复杂,臃肿。我更愿意探索新的语言……” 某些Python程序员,在论坛里跟初学者讲解Python有什么好,其中一个原因竟然是:“因为Python不是Java!” 他们喜欢这样宣传:“看Python多简单清晰啊,都不需要写类型……” 对于Java的无缘无故的恨,盲目的否认,导致了他们看不到它很重要的优点,以至于迷失自己的方向。虽然气势上占上风,然而其实Python作为一个编程语言,是完全无法和Java抗衡的。 在性能上,Python比Java慢几十倍。由于缺乏静态类型等重要设施,Python代码有bug很不容易发现,发现了也不容易debug,所以Python无法用于构造大规模的,复杂的系统。你也许发现某些startup公司的主要代码是...
美的让人心动 发布于 3天前 阅读 88 评论 2 点赞 1

面试必看!2018年4月份阿里最新的java程序员面试题目

目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java IO流的层次结构? 2.请说出常用的异常类型? 3.SKU的全称是什么,SKU与SPU的区别及关系? 4.FileInputStream在使用完以后,不关闭流,想二次使用可以怎么操作? 5.设计一个分步式登录系统? 6.Spring加载过程? 7.自己有没有写过类似Spring这样的AOP事务? 8.Java中 try..catch关闭流的语法糖? 9.如何设计一个秒杀系统?要考虑什么? 10.有没有遇到进线上GC,出现的症状是什么样的,怎么解决的? 11spring的加载过程? 12.atomic与 volatile的区别? 13.Thread的 notify给notifyAll的区别? 14.notifiy是唤醒的那一个线程? 15.Thread.sleep唤醒以后是否需要重新竞争? 16.单例有多少种写法?有什么区别?你常用哪一种单例,为什么用这种? 17.问一个Thread.join相关的问题? 18.商品相关模块系统怎么设计数据模型? 19.写一个JAVA死锁的列子? 20.如何解决死锁? 21.GC回收算法,及实现原理? 22.HashMap数据存储结构? key重复了怎么办?是如何解决的? 23.Spring AOP的实现原理,底层用什么实现的? 阿里技术面...
美的让人心动 发布于 5天前 阅读 88 评论 2

以太坊·代币开发详解

这一部关于区块链开发及运维的电子书。 为什么会写区块链电子书?因为2018年是区块链年。 这本电子书是否会出版(纸质图书)? 不会,因为互联网技术更迭太快,纸质书籍的内容无法实时更新,一本书动辄百元,很快就成为垃圾,你会发现目前市面的上区块链书籍至少是一年前写的,内容已经过时,很多例子无法正确运行。所以我不会出版,电子书的内容会追逐技术发展,及时跟进软件版本的升级,做到内容最新,至少是主流。 这本电子书与其他区块链书籍有什么不同?市面上大部分区块链书籍都是用2/3去讲区块链原理,只要不到 1/3 的干货,干货不够理论来凑,通篇将理论或是大谈特谈区块链行业,这些内容更多是头脑风暴,展望区块
netkiller- 发布于 2个月前 阅读 1737 评论 2 点赞 1

Python函数声明以及与其他编程语言数据类型的比较

1、函数声明 与其它大多数语言一样 Python 有函数,但是它没有像 C++ 一样的独立的头文件;或者像 Pascal 一样的分离的  interface / implementation 段。在需要函数时,像下面这样声明即可:   def buildConnectionString(params):   首先,函数声明以关键字  def 开始,接着为函数名,再往后为参数,参数放在小括号里。多个参数之间 (这里没有演示)用逗号分隔。   其次,函数没有定义返回的数据类型。Python 不需要指定返回值的数据类型;甚至不需要指定是否有返回值。实际上,每个 Python 函数都返回一个值;如果函数执行过  return 语句,它将返回指定的值,否则将返回  None (Python 的空值)。 Python vs. Visual Basic  的返回值 在 Visual Basic 中,函数 (有返回值) 以  function 开始,而子程序 (无返回值) 以sub 开始。在 Python 中没有子程序。只有函数,所有的函数都有返回值 (尽管可能为  None ),并且所有的函数都以  def 开始。 最后需要指出的是,在 Python 中参数, params 不需要指定数据类型。Python会判定一个变量是什么类型,并在内部将其记录下来。 Python vs.  Java  的返回值 在 Java、C++ 和其他静态类型语言中,必须要指定函数返回...
光明辉煌 发布于 1小时前 阅读 1

简单工厂设计模式

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 简单工厂设计模式 设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活。 架构模式比设计模式大,架构模式是战略,设计模式是战术。 设计模式分为3种:创建型,行为型,结构型 简单工厂设计模式属于创建型设计模式,但不属于23种设计模式范围内,属于23种设计模式中工厂方法的入门模式,又叫静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 简单工厂设计模式的好处是隐藏对象创建,不用依赖对象,可以随意更换对象。在工厂模式中,工厂类中的所有方法返回同一个抽象产品类,代码的升级和扩张只需要在这个工厂类中注入新的功能方法返回抽象产品类即可,或是另外写接口,将这个抽象产品类强制转换成这个接口,让具体产品类去实现。 售票员例题: 解开Jfreechart压缩包--打开lib--打开chart文件夹--找到ChartFactory.class文件--拖拽到IDEA中进行反编译--点击structure查看结构 Jfreechart是典型的工厂模式做出来的。Jfreechart就是工程模式中的产品,在所有creat方法中返回的全部都是同一个J...
凯哥学堂 发布于 12小时前 阅读 3

C 语言指针的强制装换

#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int num=8; #mov dword ptr [num],8 #汇编说明: 将值8 赋给 双字num的地址内, int *q=(int*)num; #mov eax,dword ptr [num] #汇编说明: 将双字类型 num中的值 赋给 eax 寄存器中, #mov dword ptr [q],eax #汇编说明: 将eax寄存器中的值 赋给 双字类型 q 的地址内, int *m= (int*)# #lea eax,[num] #将num 的地址 赋给 eax 寄存器中, #mov dword ptr [m],eax #将 eax寄存器中的值付给 双字类型 m 的地址内, char *p = (char*)# #lea eax,[num] #将num 的地址 赋给 eax 寄存器中, #mov dword ptr [p],eax #将eax寄存器中的值付给 双字类型 p 的地址中, /* 汇编说明: lea 指令传递的是地址. mov 指令传递的是值. */ printf("num: %x\r\n",&num); printf("p :%x\r\n",p); printf("*p :%d\r\n",*p); # 这个取地址中的值得操作是失败的,非法访问了一个的地址. return 0; }  ...
小张525 发布于 14小时前 阅读 2

基于Spring Cloud的微服务落地

微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务。但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持。 在Java生态圈,目前使用较多的微服务框架就是集成了包括Netfilix OSS以及Spring的Spring Cloud。它包括: Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,可以实现应用配置的外部化存储,支持客户端配置信息刷新、加密/解密配置内容等。 Spring Cloud Netflix:对Netflix OSS进行了整合。其中又包括: Eureka:服务治理组件,包含服务注册中心、服务注册与发现。 Hystrix:容器管理组件,实现断路器模式,倘若依赖的服务出现延迟或故障,则提供强大的容错功能。 Ribbon:客户端负载均衡的服务调用组件。 Feign:基于Ribbon和Hystrix的声明式服务调用组件。 Zuul:网关组件,提供智能路由、访问过滤等功能。 Archaius:外部化配置组件。 Spring Cloud Bus:事件、消息总线。 Spring Cloud Cluster:针对ZooKeeper、Redis、Hazelcast、Consul的选举算法和通用状态模式的实现。 Spring Cloud Cloudfoundry:与Pivotal Cloudfoundry的整合支持。 Spring Cloud Consul:服务发现与配置管理...
烂猪皮 发布于 14小时前 阅读 5

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

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

Jeesite使用requests模拟登录

使用Python的requests对jeesite模拟用户登录。
大灰狼时间 发布于 15小时前 阅读 2

rust-计算象棋马在棋盘上任意一点步数的两种方法

简述 路径计算又两种方法,一种通过迭代,另一种通过队列实现。 迭代方案 从起始点开始遍历,一个点周围又八个next_point,去除超出棋盘的点后,选择遍历的点满足,该点未被遍历或该点之前遍历路径所需的步数大于当前路径对于的步数。 队列方案 将起始点push到队列中。当队列不为空时,每次循环从队列中pop一个点。如果那八个next_point满足条件:1. 点不超出棋盘;2. 该点未被遍历或该点之前遍历路径所需的步数大于当前路径对于的步数。 实现 lib.rs pub mod checkerboard; pub mod checkerboardq; #[cfg(test)] mod tests { use super::*; #[test] fn for_horse() { let mut board = super::checkerboard::CheckerBoard::new(); board.calculate((2,3)); println!("{}",board.get_count()); assert_eq!(board.get(&(2,3)),0); } #[test] fn for_horse_query() { let mut board = super::checkerboardq::CheckerBoardQ::new(); board.calculate((2,3)); board.print_board(); println!("{}",board.get_count()); assert_eq!(board.get(&(2,3)),0); } } checker...
zhnxin 发布于 16小时前 阅读 22

Python中的类

类的属性,类的方法,类的继承
枫叶云 发布于 17小时前 阅读 2

UWP 向指定的Dns服务器请求域名解析 --简单的解决方案

  笔者近期做的UWP项目需要实现的一个小的功能模块--对指定Dns服务器发起域名解析的请求。刚开始的时候遇到了很多坑,翻阅了dalao们的文章,回答,查阅了官方文档,最终找到了合适的Nuget包得以解决,特此摘记下这个过程:   先是UWP System.Net命名空间下暂时不能做到对指定的Dns服务器发起这样的请求([System.Net.Dns](http://) 仅支持用户使用本地选择的Dns服务器进行域名解析)。上一段在StackOverFlow上dalao关于Dns类的[描述](https://stackoverflow.com/questions/1315758/specify-which-dns-servers-to-use-to-resolve-hostnames-in-net): >No this cannot be done with the .Net Framework. The Dns.Resolve method relies on the internal Win32 APIs which in turn go through the DNS servers associated with the network connection. > >In order to get this to work, you'd have to change the DNS servers associated with the network adapter's address.   OK,然后笔者尝试了在UWP中调用cmd进行nslookup查询([nslookup](https://blog.csdn.net/violet_echo_0908/article/details/52033725) 是用于查询DNS的记录的命令)。但是!但是!但是,U...
孤独的岛_Bin 发布于 17小时前 阅读 1

注册中心 Eureka 源码解析 —— 应用实例注册发现(一)之注册

摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-register/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 Eureka 1.8.X 版本** - [1. 概述](http://www.iocoder.cn/Eureka/instance-registry-register/) - [2. Eureka-Client 发起注册](http://www.iocoder.cn/Eureka/instance-registry-register/) - [2.1 应用实例信息复制器](http://www.iocoder.cn/Eureka/instance-registry-register/) - [2.2 刷新应用实例信息](http://www.iocoder.cn/Eureka/instance-registry-register/) - [2.3 发起注册应用实例](http://www.iocoder.cn/Eureka/instance-registry-register/) - [3. Eureka-Server 接收注册](http://www.iocoder.cn/Eureka/instance-registry-register/) - [3.1 接收注册请求](http://www.iocoder.cn/Eureka/instance-registry-register/) - [3.2 Lease](http://www.iocoder.cn/Eureka/instance-registry-register/) - [3.3 注册应用实例信息](http://www.iocoder.cn/Eureka/instance-registry-register/) - [666. 彩蛋](http://www.iocoder.cn/Eureka/instance-registry-register/) --- ![](http://www.iocoder.cn/images/common/wec...
芋道源码 发布于 17小时前 阅读 2

UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的

UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。 项目属性: 目标版本 16299 最低版本 14393 解决方法:目标版本 15063 最低版本 14393 The issue is a bug in the Windows SDK that is causing an incompatible MSBuild tasks assembly to remain in the msbuild process and the tasks in this assembly don't work correctly with the MSBuild targets in the project file. This bug is being investigated for an upcoming release of the Windows 10 SDK. Meanwhile, the workaround is to close all running Visual Studio and MSBuild processes and the restart Visual Studio....
孤独的岛_Bin 发布于 18小时前

一个帐号同一时间只能一个人登录

对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现: 1 .在用户登录时,把用户添加到一个ArrayList中 2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录 3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况 ① 使用注销按钮正常退出 ② 点击浏览器关闭按钮或者用Alt+F4退出,可以用javascript捕捉该页面关闭事件, 执行一段java方法删除ArrayList中的用户 ③ 非正常退出,比如客户端系统崩溃或突然死机,可以采用隔一段时间session没活动就删除该session所对应的用户来解决,这样用户需要等待一段时间之后就可以正常登录。 在LoginAction中定义: // 用来在服务器端存储登录的所有帐号 public static List logonAccounts; login() 登录方法中: // 设置session不活动时间为30分 request.getSession().setMaxInactiveInterval(60*30); if(logonAccounts==null){ logonAccounts = new ArrayList(); } // 查看ArrayList中有没有该用户 for (int i = 0; i < logonAccounts.size(); i++) { Account existAccount = (Account)logonAccounts.get(i); if(account.getAccountId(...
郑加威 发布于 19小时前 阅读 5

Python基础-迭代器和生成器

## 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 > 迭代器是一个可以记住遍历的位置的对象。 > > 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 > > 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器: **字符串、列表、元组、字典、集合、文件对象 都不是可迭代对象** ## 示例 ### \_\_inter__() 转换为可迭代对象 ``` l = [1,2,3] a = l.__iter__() print(a) ``` ``` ``` ### \_\_next__() 根据迭代层级输出迭代元素 ``` l = [1,2,3] a = l.__iter__() print(a.__next__()) print(a.__next__()) print(a.__next__()) ``` ``` 1 2 3 ``` ### 创建迭代对象 ``` l = [1,2,3] a = iter(l) print(next(a)) print(next(a)) print(next(a)) ``` ``` 1 2 3 ``` ## 生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator)。 > 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 > > 在调用生成器运行的过程中,每次遇到 yield时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次...
ZHAO_JH 发布于 20小时前 阅读 4

Java并发:隐藏的线程死锁

许多程序员都熟悉Java线程死锁的概念。死锁就是两个线程一直相互等待。这种情况通常是由同步或者锁的访问(读或写)不当造成的。   Found one Java-level deadlock: ============================= "pool-1-thread-2":   waiting to lock monitor 0x0237ada4 (object 0x272200e8, a java.lang.Object),   which is held by "pool-1-thread-1" "pool-1-thread-1":   waiting to lock monitor 0x0237aa64 (object 0x272200f0, a java.lang.Object),   which is held by "pool-1-thread-2"   好消息是最新的JVM通常会帮你检测到这种死锁现象,但它真的做到了吗?最近一个线程死锁问题影响了Oracle Service Bus的生产环境,这一消息使得我们不得不重新审视这一经典问题,并找出“隐藏”死锁存在的情况。本文将通过一个简单的Java程序向大家讲解一种非常特殊的锁顺序死锁问题,这种死锁在最新的JVM 1.7中并没有被检测到。文章末尾的视频讲解了这段Java示例代码以及问题的解决方法。   犯罪现场   通常,我习惯将出现严重Java并发问题的情况称之为犯罪现场,在这里你扮演一个侦查员的角色来解决问题。在这篇文章中,犯罪行为来源于客户端IT环境运行中断。你需要完成如下工作...
美的让人心动 发布于 21小时前 阅读 4

JAVA常用集合总结 ArrayList

ArrayList HashMap Set
AustinYe 发布于 21小时前 阅读 4

WebService的实现与调用的几种方案

2018-04-20首次构建
KevinBruce 发布于 21小时前 阅读 2

基于golang的爬虫实战

Go语言实现的小型爬虫,基于selenium实现,功能比较简单,新人练手用,轻喷~
Raphael_Zhang 发布于 22小时前 阅读 19

centos6部署gitlab环境

centos6部署gitlab环境
蜗牛奔跑 发布于 22小时前 阅读 4

Java实现定时任务的几种方案

2018-04-20首次整理发布
KevinBruce 发布于 23小时前 阅读 5

java基础(四) java运算顺序的深入解析

### 1. 从左往右的计算顺序 **与C/C++不同的是,在Java中,表达式的计算与结果是确定的,不受硬件与环境的影响**如: ``` int i = 5; int j = (i++) + (i++) +(i++); ```   在C/C++中,这个例子的运算结果将会根据不同的开发环境而不同。Turbo C下,j的值是15;在VC下,j的值是 18。   在Java中,表达式的计算顺序是从左往右的,也就是先计算左侧的结果,再计算右侧的结果。上面的例子计算结果就一定是 18。也就是说,右侧`(i++)`表达式使用的 i 的值 就是 左侧`(i++)`表达式计算完后 i 的值,即左侧比右侧先进行运算。 看下面几个例子 **@ Example 1** ``` int a[] = new int[]{0,0,0,0}; int i = 1; a[i++] = i++; System.out.println("i="+i); System.out.println(Arrays.toString(a)); ``` **运行结果:** >i=3 [0, 2, 0, 0] **@ Example 2** ``` int a[] = new int[]{0,0,0,0}; int i = 1; a[i++] = i = 4; System.out.println("i="+i); System.out.println(Arrays.toString(a)); ``` **运行结果:** >i=4 [0, 4, 0, 0] **@ Example 3** ``` int a[] = new int[]{0,0,0,0}; int b[] = new int[]{1,2,3,4,5}; int cc[] = a; int i = 1; a[++i] = (a=b)[i]; System...
sihailoveyan 发布于 23小时前 阅读 2

Kotlin基础讲解

这是一个Kotlin基础讲解课程,为今后做安卓(Android)APP开发课程准备基础知识。
小马视频 发布于 1天前 阅读 3

如何用Nginx搭建一个安全的、快速的微服务架构

本文改编自Chris Stetson发表在nginx.conf 上的一个有关如今的微服务以及如何使用Nginx构建一个快速的、安全的网络系统的演讲,大家可以在YourTube上回看此次演讲。 自我介绍 Chris Stetson:Hi,我的名字是Chris Stetson,我在Nginx带领专业服务部门,同时也领导微服务实践。 今天我们要谈论微服务以及如何使用Nginx构建一个快速的、安全的网络系统。在我们谈话的最后,我们将与我们在Zokets的合作伙伴向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo。 在我们探讨Fabric模式之前,我想谈一谈微服务并且从Nginx的角度来看这意味着什么。 0:56 - 大转变 微服务已经引起了应用程序架构的重大转变。 当我第一次开始构建应用程序时,他们都是差不多的。幻灯片中所展示的单体架构也象征了应用程序的构造方式。 目前存在着某种类型的虚拟机(VM),对我来说,就是通常的Java。在虚拟机中应用的功能组件以对象的形式存在,这些对象是在内存中相互通讯的,它们将来来回回处理并进行方法调用。偶尔,你会采用诸如通知等机制来接触到其他系统以便获取数据或传递信息。 有了微服务之后,应用程序如何构建的范式是完全不同的了。你的功能组件会从在同一个主机的...
烂猪皮 发布于 2周前 阅读 3621 评论 11 点赞 4

List集合就这么简单【源码剖析】

前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识。 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组。线程不安全 LinkedList 底层数据结构是链表。线程不安全 Vector 底层数据结构是数组。线程安全 这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~ 看这篇文章之前最好是有点数据结构的基础:Java实现单向链表,栈和队列就是这么简单,二叉树就这么简单         当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、ArrayList解析     首先,我们来讲解的是ArrayList集合,它是我们用得非常非常多的一个集合~ 首先,我们来看一下ArrayList的属性:     根据上面我们可以清晰的发现:ArrayList底层其实就是一个数组,ArrayList中有扩容这么一个概念,正因为它扩容,所以它能够实现“动态”增长 1.2构造方法 我们来看看构造方法来印证我们上面说得对不对:     1.3Add方法 add方法可以说是ArrayList比较重要的方法了,我们来总览一下:     1.3.1add(E e) 步骤: 检查是否需要扩容 插入元素 首先,我们来看看这个方法: ...
Java3y 发布于 2周前 阅读 2326 评论 4 点赞 6

约瑟夫环的几种实现方式

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 [1] 结果+1即为原问题的解。
珂jack 发布于 2周前 阅读 2191 评论 18

深入浅出设计模式——从球赛中悟代理模式

代理模式提供了通过代理对象访问目标对象的访问方式。
珂jack 发布于 3周前 阅读 1648 评论 8 点赞 5

总结:JDK1.5-JDK1.8各个新特性

引用: 此文章意在借鉴前人经验,留作日后查看。如有侵犯,实属无意。我以后会注意,谢谢博友的提醒。也愿各大博友们能够共同学习和努力。 https://my.oschina.net/91jason/blog/309821
iwen-J 发布于 4周前 阅读 5236 评论 1 点赞 32

关于elasticsearch中更新数据的几种方式

作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式。 (一)更新文档 (1)部分更新: java api: ```` ` HashMap data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.execute().actionGet(); System.out.println("update ok......"); ```` 注意部分更新功能,前提是索引和该条数据已经存在,否则会抛出对应的异常,只要任何一个不满足,都会更新失败。 curl: ```` curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" } } ```` (2)使用detect_noop java api: ```` ` HashMap data=new HashMap<>(); data.put("name","woshigcs"); data.put("age",25); UpdateRequestBuilder urb= client.prepareUpdate("active2018-03-21", "active", "18"); urb.setDoc(data); urb.setDetectNoop(false);//默认是true urb.execute().actionGet(); System.out.println("update ok......"); ```` curl方式: ```` curl -XPOST 'localhost:9200...
九劫散仙 发布于 1个月前 阅读 2497 评论 5

Lucene就是这么简单

什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。 Lucene是根据关健字来搜索的文本搜索工具,只能在某个网站内部搜索文本内容,不能跨网站搜索 既然谈到了网站内部的搜索,那么我们就谈谈我们熟悉的百度、google那些搜索引擎又是基于什么搜索的呢....         从图上已经看得很清楚,baidu、google等搜索引擎其实是通过网络爬虫的程序来进行搜索的... 为什么我们要用Lucene? 在介绍Lucene的时候,我们已经说了:Lucene又不是搜索引擎,仅仅是在网站内部进行文本的搜索。那我们为什么要学他呢??? 我们之前编写纳税服务系统的时候,其实就已经使用过SQL来进行站内的搜索.. 既然SQL能做的功能,我们还要学Lucene,为什么呢??? 我们来看看我们用SQL来搜索...
Java3y 发布于 1个月前 阅读 2493 评论 14 点赞 9

泥瓦匠聊并发编程基础篇:线程中断和终止

原文:[www.spring4all.com](http://www.spring4all.com) ### 1 线程中断 #### 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 `interrupt()` 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,到底该线程生命周期是去终止,还是继续运行,由线程根据标志位属性自行处理。 #### 1.2 线程中断操作 调用线程的 `interrupt()` 方法,根据线程不同的状态会有不同的结果。 下面新建 InterruptedThread 对象,代码如下: ```java /** * 一直运行的线程,中断状态为 true * * @author Jeff Lee @ bysocket.com * @since 2018年02月23日19:03:02 */ public class InterruptedThread implements Runnable { @Override // 可以省略 public void run() { // 一直 run while (true) { } } public static void main(String[] args) throws Exception { Thread interruptedThread = new Thread(new InterruptedThread(), "InterruptedThread"); interruptedThread.start(); TimeUnit.SE...
SpringForAll 发布于 2个月前 阅读 2109 评论 2 点赞 4

如何优雅的设计 Java 异常

导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。 由于本文只作一些经验之谈,不涉及到基础知识部分,如果读者对异常的概念还很模糊,请先查看基础知识。 如何选择异常类型 异常的类别 正如我们所知道的,java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.lang.Exception(后文省略为Exception)和java.lang.Error(后文省略为Error),其中Error由JVM虚拟机进行管理,如我们所熟知的OutOfMemoryError异常等,所以我们本文不关注Error异常,那么我们细说一下Exception异常。 Exception异常有个比较重要的子类,叫做RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称为非受检异常(unchecked Exception),其他继承自Exception异常的子类称为受检异常(checked Exception)。本文重点来关注一下受检异常和非受检异常这两种异常。 如何选择异常 从笔者的开发经验来看,如果在一个应用中,需要开发一个方法(如某个功能的service方法),这个方法如果中间可能出现异常,那么你需要考虑这个异常出现之后是否调...
美的让人心动 发布于 2个月前 阅读 6162 评论 26 点赞 11

分布式事务 TCC-Transaction 源码分析 —— 事务恢复

摘要: 原创出处 http://www.iocoder.cn/TCC-Transaction/transaction-recovery/ 「芋道源码」欢迎转载,保留摘要,谢谢! **本文主要基于 TCC-Transaction 1.2.3.3 正式版** - [1. 概述](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [2. 事务重试配置](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [3. 事务重试定时任务](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4. 异常事务恢复](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4.1 加载异常事务集合](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [4.2 恢复异常事务集合](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) - [666. 彩蛋](http://www.iocoder.cn/TCC-Transaction/transaction-recovery/) ------- ![](https://user-gold-cdn.xitu.io/2018/2/22/161bc087b2b30dd1?w=750&h=330&f=jpeg&s=78520) > 🙂🙂🙂关注**微信公众号:【芋道源码】**有福利: > 1. RocketMQ / MyCAT / Sharding-JDBC **所有**源码分析文章列表 > 2. RocketMQ / MyCAT / Sharding-JDBC **中文注释源码 ...
芋道源码 发布于 2个月前 阅读 1833 评论 2 点赞 1

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 发布于 2个月前 阅读 2456 评论 3 点赞 3

JSON入门看这一篇就够了

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

你的斗地主能拿多少炸?

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

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

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

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个月前 阅读 1979 评论 14 点赞 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个月前 阅读 4075 评论 13 点赞 9

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

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

京东活动系统--亿级流量架构应对之术

背景 京东活动系统 是一个可在线编辑、实时编辑更新和发布新活动,并对外提供页面访问服务的系统。其高时效性、灵活性等特征,极受青睐,已发展成京东几个重要流量入口之一。近几次大促,系统所承载的pv已经达到数亿级。随着京东业务的高速发展,京东活动系统的压力会越来越大。急需要一个更高效,稳定的系统架构,来支持业务的高速发展。本文主要对活动页面浏览方面的性能,进行探讨。 活动页面浏览性能提升的难点: 1. 活动与活动之间差异很大,不像商品页有固定的模式。每个页面能抽取的公共部分有限,可复用性差。 2. 活动页面内容多样,业务繁多。依赖大量外部业务接口,数据很难做到闭环。外部接口的性能,以及稳定性,严重制约了活动页的渲染速度、稳定性。 经过多年在该系统下的开发实践,提出“页面渲染、浏览异步化”的思想,并以此为指导,对该系统进行架构升级改造。通过近几个月的运行,各方面性能都有显著提升。在分享"新架构"之前,先看看我们现有web系统的架构现状。 一、web架构发展与现状 1.开发阶段 以京东活动系统架构的演变为例,这里没有画出具体的业务逻辑,只是简单的描述下架构:   2.第二步,一般是在消耗性能的地方加缓存,这里对部分查库操作...
高级架构师 发布于 3个月前 阅读 4167 评论 12 点赞 8

五年架构师讲述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架构分享 发布于 3个月前 阅读 3593 评论 6 点赞 9

再见,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...
三刀蜀黍 发布于 3个月前 阅读 6360 评论 73 点赞 11
顶部