
架构
文章平均质量分 65
__HelloWorld__
这个作者很懒,什么都没留下…
展开
-
Java异常处理的九个最佳实践
确保在Finally程序块中完成资源释放或者使用Try-With语句比如对于InputStream,当我们使用完毕,我们要确保资源被正确关闭,比如下面我们常见的错误用法,不要在try模块中关闭资源,因为一旦try语句块中的其他方法发生异常,很有可能无法执行到inputStream.close()方法的。public void doNotCloseResourceInTry() { Fi...原创 2019-11-21 22:09:12 · 793 阅读 · 0 评论 -
Java中抽象类与接口区别
抽象类:抽象类是无法实例化的特殊类。所以问题是为什么我们需要一个不能被实例化的类,抽象类只能是子类(继承自)。换句话说,它只允许其他类继承它,但不能实例化。优点是它为所有子类执行特定的层次结构。简而言之,它是一种契约,它强制所有子类执行相同的层次或标准。 接口:接口不是类,由Interface关键词定义,接口只有方法签名,没有方法实现(8之后支持默认方法)。与抽象类类似,它也是一种契约,用原创 2017-12-20 09:18:19 · 5049 阅读 · 0 评论 -
使用BeautifulSoup爬取优快云博客文章
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库 Requests is an elegant and simple HTTP library for Python, built for human beings. 通过Requests发起请求获取博客信息,然后再通过BeautifulSoup的基本应用,当然这里我们选取的是排名靠前的博客,注意如果是在内网原创 2017-12-12 20:41:57 · 835 阅读 · 0 评论 -
Python词云图绘制—看博客大佬们的写作热点
在《Python可视化展现》中,我们使用了Matplotlib可视化了一些博客大佬们的博客发表年份与数量的关系,接下来我们再看下这些博客文章的热点都有哪些。 我们仅对文章的标题进行分词处理,然后统计分词结果,并绘制出博客文章词云,我们使用了jieba和thulac进行中文分词,结果总体差不多,但thulac速度更显得慢。重新定义walk_treedef walk_tree_j(html, num)原创 2017-12-13 20:26:54 · 943 阅读 · 0 评论 -
Java 8系列之重新认识HashMap
Java 8系列之重新认识HashMap摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 简介Java为数据结构中的映射定义了转载 2017-12-22 21:28:40 · 350 阅读 · 0 评论 -
JDK中的设计模式之观察者模式
The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usu原创 2017-12-06 20:17:31 · 592 阅读 · 0 评论 -
动态规划之最少硬币找零问题
假设有几种硬币,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。 private static final int MAX_VALUE = Integer.MAX_VALUE - 2; public static int coinChange(int[] coins, int change) { int[] seq = new int[change + 1];原创 2017-12-14 20:15:11 · 2711 阅读 · 0 评论 -
JDK中的设计模式之装饰者模式
The decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class原创 2017-12-07 20:20:47 · 953 阅读 · 0 评论 -
Java之反射详解
Java反射技术提供了一种用以检查或者修改程序在运行的状态或者行为的一种机制。反射用途:可扩展性:你可以通过名字匹配的方式来创建用户自定义实例 提供类管理功能和可视化开发上下文:类管理器可以用来枚举类中的成员变量,而可视化的开发环境可以帮助开发人员书写准确的代码提供调试与测试工具:调试人员可以借助反射检查类中的私有变量,测试人员可以利用反射获取类提供的接口集合,提高代码覆盖率反射的缺点反射虽原创 2017-12-26 13:23:20 · 334 阅读 · 0 评论 -
Flask Web开发入门(九)之表单处理
本章我们介绍Flask Web开发中的表单处理application/json类型请求前台请求代码: $.ajax({ url: '/add' , type: 'POST' , data: JSON.stringify(data.field)原创 2018-01-10 19:47:07 · 16951 阅读 · 22 评论 -
2018开年第一篇:equals()与hashCode()
equals()和hashcode()是java.lang.Object中提供的用以对象比较的两个重要方法,下面是其定义及默认实现:public boolean equals(Object obj) { return (this == obj); }:用以判断变量参数与当前实例是否相等,JDK默认实现是基于对象内存地址是否相同,如果两个对象内存地址相同,则表示两个对象相同。public nativ翻译 2018-01-02 19:51:57 · 1724 阅读 · 2 评论 -
Java并发编程之ThreadLocal
This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@code get} or {@code set} method) has its own, ind原创 2017-12-27 14:20:29 · 439 阅读 · 0 评论 -
Flask Web开发入门(十)之图片上传(使用Flask-Upload)
在Flask Web开发入门(八)之文件上传中,我们探讨了Flask框架下的文件上传,本章我们将使用Flask插件Flask-Uploads示例说明的图片上传与展现如何实现开始之前,我们先简单看下Flask-Uploads源码实现:类UploadSet:文件上传配置集合,包含三个参数:name:文件上传配置集合的名称,默认files,一般不用修改,只是一个标识,要求数字、字母或两原创 2018-01-11 19:42:46 · 18378 阅读 · 8 评论 -
Python中类的JSON序列化
这肯定是个老生常谈的问题,在此记录下。在Python中,当在我们使用sqlalchemy.orm来对数据库对象进行存取,并将这些数据展现到前台页面时,我们就面临如何将Python中的类对象进行JSON序列化。简单起见,我们从代码说起:首先,我们定义一个用户类,用以存储用户信息class User(object): def __init__(self, id, name, p原创 2018-01-11 20:30:12 · 1664 阅读 · 1 评论 -
Flask Web开发入门(七)之SQLAlchemy
上一章中,我们简单介绍了使用 SQLAlchemy ORM框架来访问MySQL数据库,本章我们将继续就此话题进行展开。 SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQ原创 2018-01-09 20:03:37 · 1159 阅读 · 0 评论 -
Flask Web开发入门(十一)之图片展现
在Flask Web开发入门(十)之图片上传(使用Flask-Uploads)我们介绍了使用Flask插件Flask-Uploads上传图片,本章就此话题继续展开。我们知道,我们可以通过UPLOADS_DEFAULT_DEST参数来指定文件上传的默认路径,假如我们指定的路径是upload目录,那么文件实际保存的路径为: upload/files/xxx注意,files为Uploa原创 2018-01-11 20:05:55 · 6050 阅读 · 0 评论 -
Flask Web开发入门(十二)之图片下载与展现(使用send_from_directory)
在Flask Web开发入门(十一)之图片展现,我们介绍了Flask框架下我们通过file.open与make_response结合运用实现了图片的下载与展现功能,这略显复杂,其实Flask本身已经帮我们提供了相应的功能:即send_from_directory函数。首先,我们来看下send_from_directory函数定义: Send a file from a given di原创 2018-01-12 11:31:14 · 10845 阅读 · 5 评论 -
Flask Web开发入门(十三)之构建REST API
关于REST API,我们先看一个比较形象的图: 在我们之前的章节中,我们其实已经涉及到了Flask框架下REST API接口的构建,比如,文件下载接口:# 文件下载@app.route('/download/')def send_html(filename): logger.debug("download file, path is %s" % filename)原创 2018-01-12 13:56:03 · 3790 阅读 · 0 评论 -
Java 内存模型(Java Memory Model)
JVM内存模型定义的是Java虚拟机(JVM)如何在计算机内存(RAM)中工作机理。深入理解JVM内存模型对于多线程下编写正确的并发程序至关重要。Java内存模型指定了不同线程在什么时候、以什么样的方式访问其他线程写入到共享变量的值,以及如何同步访问共享变量。 最初版本的Java内存模型相对不够完善,JDK 1.5对此进行了完善,并一直沿用至Java 8The Internal Java Me翻译 2017-12-27 20:00:30 · 521 阅读 · 0 评论 -
Java并发编程之ReentrantLock
public class ReentrantLock extends Object implements Lock, Serializable A reentrant mutual exclusion Lock with the same basic behavior and semantics as the implicit monitor lock accessed using synchro原创 2018-01-03 19:49:48 · 455 阅读 · 0 评论 -
Java Memory Model
The Java memory model specifies how the Java virtual machine works with the computer’s memory (RAM). The Java virtual machine is a model of a whole computer so this model naturally includes a memory mo原创 2017-12-28 19:49:15 · 420 阅读 · 0 评论 -
Thread.run or Thread.start
Common Pitfall: Calling run() Instead of start()When creating and starting a thread a common mistake is to call the run() method of the Thread instead of start(), like this:Thread newThread = new Threa原创 2017-12-28 20:56:15 · 273 阅读 · 0 评论 -
Java并发编程之Callable与Future
java.util.concurrent.Callable是JDK1.5引入的线程接口,与Runnable类似,但可以返回一个对象,也可以抛出异常。@FunctionalInterfacepublic interface Callable { /** * Computes a result, or throws an exception if unable to do原创 2018-01-04 20:12:21 · 510 阅读 · 0 评论 -
Java并发编程之Executors与Thread Pool
上一章,我们谈到了JDK1.5引入的多线程编程框架Executors,其通过工作线程的方式对外提供线程池服务。一个ExecutorService实例就可以表示一个线程池,通过Executors,你可以创建以下集中类型线程池:Single Thread Executor:仅包含一个线程的线程池,所有提交的任务顺序执行,创建方法: Executors.newSingleThreadExe原创 2018-01-04 20:21:17 · 778 阅读 · 0 评论 -
改版后的优快云-markdown编辑器确实有点难用
就是这个:还有这个:Firefox点击上传图片没有反应每次发表完成之后,点击操作按钮都要弹框,啥意思?改版效果,差评!!!原创 2018-01-05 08:47:59 · 1543 阅读 · 2 评论 -
Flask Web开发入门(十四)之使用蓝图(Blueprints)
Flask uses a concept of blueprints for making application components and supporting common patterns within an application or across applications. Blueprints can greatly simplify how large applications原创 2018-01-15 10:04:15 · 1521 阅读 · 0 评论 -
Flask Web开发入门(二)之Flask-Login使用
上一章我们介绍了使用Flask开发基本的Web应用,并使用session来进行基本的登录授权验证,接下来我们将使用Flask-Login来进行会话管理,来处理我们的“登入、登出”问题 Flask-Login provides user session management for Flask. It handles the common tasks of logging in, loggi原创 2018-01-08 20:18:59 · 9823 阅读 · 0 评论 -
Flask Web开发入门(一)之简单的登录验证
Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. 我们的目标是通过Flask实现一个简单的web系统,系统需要用户登录,未登录用户无法访问授权页面,因此,我们定义页面如下:index.html默认首页,需要登录授权访问login.html登录页,输入用户名和密码e原创 2018-01-08 19:47:42 · 22311 阅读 · 2 评论 -
Flask Web开发入门(三)之使用 Request Loader 定制登录
在上一章中,我们介绍了使用Flask-Login进行会话管理,实现基本的登入、登出功能,在实际的业务运用中,不仅要求基本的登录登出授权管理,还要求对外暴漏API接口服务,当然暴漏的服务接口不可能随意访问,还需要一定的授权信息,这时,我们需要Request Loader来进行定制登录,简单期间,我们使用HTTP Header中的Authorization作为查询参数的API密钥,只有请求Header原创 2018-01-08 20:37:17 · 2949 阅读 · 1 评论 -
Flask Web开发入门(四)之错误处理
在我们上一章中,我们介绍了使用 Request Loader 定制登录,在我们的逻辑分支中,错误处理我们使用了abort函数:当我们使用abort函数时,它表示放弃请求并返回错误代码,默认情况业务不友好,那么我们可以使用errorhandler() 装饰器来进行定制错误页面,errorhandler装饰器使用如下:@app.route('/error')@app.errorhan原创 2018-01-08 20:47:19 · 1936 阅读 · 0 评论 -
Flask Web开发入门(五)之日志
作为码农,在开发功能中记录日志是必要且必须的,因为事情往往不像你想象的那样理想完美,就像你开发的代码那样,良好的日志习惯能助你快速排查定位问题,从 Flask 0.3 开始,Flask 就已经预置了日志系统。以下是Flask日志的运用示例:import osimport loggingimport sysLOG_PATH = 'logs'LOG_FILE = 'text.t原创 2018-01-08 21:05:02 · 3158 阅读 · 0 评论 -
Flask Web开发入门(六)之访问数据库
我们介绍两种访问MySQL数据库的方式,一种是使用mysql.connector直连,另一种是使用sqlalchemy ORM框架。mysql.connector直连方式# get database connectiondef get_connection(): try: conn = mysql.connector.connect(**config)原创 2018-01-08 21:20:19 · 1619 阅读 · 2 评论 -
Flask Web开发入门(八)之文件上传
本章我们介绍Flask Web开发中涉及的文件上传模块定义后台接收处理逻辑# http://flask.pocoo.org/docs/0.12/patterns/fileuploads/@app.route('/upload', methods=['POST'])def upload_file(): if request.method == 'POST':原创 2018-01-10 19:30:23 · 15074 阅读 · 12 评论 -
微服务实践(五):微服务的事件驱动数据管理
微服务实践(五):微服务的事件驱动数据管理【编者的话】本文是使用微服务创建应用系列的第五篇文章。第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点;第二和第三篇描述了微服务架构模块间通讯的不同方面;第四篇研究了服务发现中的问题。本篇中,我们从另外一个角度研究一下微服务架构带来的分布式数据管理问题。 1.1 微服务和分布式数据管理问题单体式应用一般都会有一个关系型数据库,...转载 2018-03-15 08:39:16 · 352 阅读 · 0 评论 -
微服务实战(六):选择微服务部署策略
微服务实战(六):选择微服务部署策略【编者的话】这篇博客是用微服务建应用的第六篇, 第一篇 介绍了微服务架构模板,并且讨论了使用微服务的优缺点。随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理。这篇文章,我们将讨论部署微服务的策略。 动机部署一个单体式应用意味运行大型应用的多个副本,典型的提供若干个(N)服务器(物理或者虚拟),运行若干个(M)...转载 2018-03-15 08:52:40 · 446 阅读 · 0 评论 -
微服务实践(七):从单体式架构迁移到微服务架构
微服务实践(七):从单体式架构迁移到微服务架构【编者的话】这是用微服务开发应用系列博客的第七篇也是最后一篇。第一篇中介绍了微服务架构模式,并且讨论了微服架构的优缺点;接续文章讨论了微服务架构不同方面:使用API网关,进程间通信,服务发现,事件驱动数据管理以及部署微服务。本篇,我们将探讨将应用从单体式架构迁移到微服务架构需要考虑的策略。 希望读者通过本系列文章对微服务优缺点有一个比较好的理...转载 2018-03-15 08:58:55 · 304 阅读 · 0 评论 -
JDK语法糖之switch字串与枚举支持
在JDK1.7之前,switch只支持byte,short,char,int,注意1.5之后的自动拆箱,对应的这四种基础类型的封装类也同样支持Byte,Short,Character,Integer,比如,对于代码: switch (new Integer(5)) { case 5: System.out.println("5");...原创 2018-03-12 14:52:42 · 4045 阅读 · 1 评论 -
常见设计模式代码实现
以前学设计模式的时候,有点模模糊糊的感觉,不知道为什么是这样子,经过这些年的“浸淫”,现在再看,发现还真有点感觉了,于是,我决定将其记录下来,一来是为了巩固记忆,二来也为以后查阅方便,所有代码都是根据我自己的理解实现,我不敢贸然说已经打通了任督二脉,但至少已经知其然了,后续,也会随着自己的理解逐步补充,知其然更要知其所以然。 愿不负光阴,没有翅膀的孩子只能努力奔跑。github 地址...原创 2018-03-05 16:52:29 · 708 阅读 · 0 评论 -
微服务实战(二):使用API Gateway
微服务实战(二):使用API Gateway【编者的话】本系列的第一篇介绍了微服务架构模式。它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选择。 当你决定将应用作为一组微服务时,需要决定应用客户端如何与微服务交互。在单体式程序中,通常只有一组冗余的或者负载均衡的服务提供点。在微服务架构中,每一个微服务暴露一组细粒度的服务提供点。在本篇文章中,我们来看它如何...转载 2018-03-13 21:32:50 · 1126 阅读 · 0 评论 -
微服务实战(三):深入微服务架构的进程间通信
微服务实战(三):深入微服务架构的进程间通信【编者的话】这是采用微服务架构创建自己应用系列第三篇文章。第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使用微服务架构的优缺点。 第二篇 描述了采用微服务架构应用客户端之间如何采用APIGateway方式进行通信。在这篇文章中,我们将讨论系统服务之间如何通信。 简介在单体式应用中,各个模块之间的调用是通过编程语言级别的方法或...转载 2018-03-13 21:52:19 · 440 阅读 · 0 评论