Sayi
Sayi
本篇文章我们尝试探讨多线程带来的问题,多个线程对共享数据的访问可能会产生多线程干涉和内存一致性问题,同步操作引起的竞争可能会带来新的病态行为,死锁、活锁、饿死等。 **所有这些问题我们都必须仔细对待,透彻的理解,因为它将影响你程序的正确性。** 这篇文章只能算作一个浅浅的导引,因为每次重新理解多线程机制,我总会有新的认识。 ## 多线程干涉 当 **多个线程访问同一个对象**,那么在这个对象上的操作对单线程来说,顺序是一定的,但是多线程之间可能会相互交错重叠。比如线程A希望某个对象执行ABC三个步骤,而线程B希望这个对象执行CDE步骤,最终这个对象的操作顺序可能会交错执行。 > NOTE:多个线程对同一个对象操作出现交错是步骤交错,而不是语句交错,即如果线程A执行c++,而线程B执行c--,看似单条语句不会交错,但是他们会被虚拟机翻译成多个步骤,在这些步骤中就会出现交错。 ```java class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; }...
> Restful是一种设计风格,很有优秀的API都采用了这种风格。 本文介绍一个简单的Android APP:[RestClient](https://github.com/Sayi/RestClient)。得益于自己对美和简洁有着天生的洁癖,也得益于对Volley源码的了如指掌,花了几天的时间,简单的用了所谓的MVP架构,功能是差不多了,凌乱的代码也懒得再花时间重构了(毕竟很多时候,我觉得漂亮就够了)。 ## 功能和UI Design > 我一直坚信,简洁可以产生美。 按照极简的设计,APP核心只有三个功能:Add Rest、Rest Testing、Preview Response。 * Add Rest 在增加一个Restful接口时,需要包含Rest的各种元素,请求URL、请求Method、请求参数、请求Header、对于POST和PUT请求,还有请求体等。对于参数、请求头、请求体需要有增删改的功能,这一切,都将在一个页面内渲染完成。  * Rest Testing 核心的模拟请求功能放在页面的右上角,点击后开始计时,可以随时终止请求。请求结束后,显示响应信息,包含请求耗时。  * Preview Response 对于rest接口的响应,我们首先最关心的是成功与否,所以Response Code直接展现在toolbar上,绿色背景的toolbar表示成功,红色则表示错误。其次,我们关心的是响应内容,预览不同格式的响应内容将是很重要的一个功能。  ##...
编写代码,离不开命名。 在阅读源码前,不如阅读一下所有的命名。我们对两个流行的Java Library进行了简单的命名分析,以期能了解这些库的一点知识和找到一点命名趋势。 ### **guava**  可以看到,这些命名体现了guava的侧重点。 命名中大多数含有Map、Set、List、Collection,同时拥有61个Immutable字符的名字,体现了guava对集合操作进行了大量的扩展。 62次Abstract表明了Guava中有着大量的抽象类。 173次Test排首位,可以看出测试用例覆盖广泛(我相信一个好的库,Test出现的频率一定也是最高的)。 ### **spring-framework**  1804次Test验证了**一个好的库,Test出现的频率一定也是最高**。 370次Factory说明用了大量的工厂,330次Abstract有着不少的抽象类。 Resolve和Annotation表明默认自带了很多注解。 Message、Transaction、Converter、Resource、Interceptor等则体现了某方面的一些特性。 我们通常会考虑什么样的名字才是能准确表达含义,什么样的名字才是业界标准,什么样的名字能反应设计,什么样的名字才是好的名字? 我相信,好名字一定是好设计的前提。 > NameTrending提供了简要统计命名趋势的功能 > 源码:[GitHub NameTrending](https://github.com/Sayi/NameTrending)
> 最初看到这些机器人是在bearychat上,后来钉钉也做了类似的机器人,自己也写了点代码,聊当无聊至极之随便写写。[GitHub代码地址](https://github.com/Sayi/Hooks) 本文简单的实现了机器人简单的功能,通过webhook接受平台的事件,从而触发机器人执行SAP(storage、analysis、push)等功能。 文末讲了一种典型的应用场景:**基于WebSocket的浏览器实时推送**。 ## 从GitHub Hook说起 > Webhooks允许您构建或设置GitHub应用程序,该应用程序订阅GitHub.com上的某些事件。 当其中一个事件被触发时,我们会发送一个HTTP POST负载到webhook配置的URL。 Webhook可用于更新外部问题跟踪器,触发CI构建,更新备份镜像,甚至部署到生产服务器。 关于**每个平台的WebHook的设置,hook的事件类型,事件的数据结构,都可以在文档中找到**。GitHub WebHook的文档地址[https://developer.github.com/webhooks/](https://developer.github.com/webhooks/) Hook机器人实现的就是这样的一个应用,聚合不同平台的事件,存储,分析,消息通知等。在GitHub项目的Setting中可以配置自己的hook url,如下图。  下文,重点介绍下SAP功能。 ## Storage 框架使用SpringMVC,因为每个平台的事件结构不同,所以存储采用了文档型数据库Mongo db的方案。一个典型的GitHub push 事件接受服务如下: ```java package com.deepoove.hooks.web.controller; import org.springframework.beans.factory.annotation.Autowired; import...
Swagger围绕着OpenAPI规范,提供了一套设计、构建、文档化rest api的开源工具,在实践中,它也是前后端沟通的桥梁。 当我们服务多次发布,Swagger API Doc也随之变化,我们称之为接口的升级。 swagger-diff致力于输出这些变化,本文对基本原理作个介绍,使用文档[参见官网Document](http://deepoove.com/swagger-diff/) ## swagger-diff 基本原理其实很简单,Swagger API Doc是以JSON格式组织的,我们先看看一个接口的JSON结构: ```json "/pet/findByStatus": { "get": { "tags": [ "pet" ], "summary": "Finds Pets by status", "description": "Multiple status values can...
> 程序员是有趣的,他们喜欢简简单单的字母,有时候也想变得好玩点,他们使用emoji,并且为他们的项目加上了徽章。  徽章就是如上图的东西,每个徽章通过色彩和数字简要的说明了项目的某种特征,更加直观的多维度了解这个项目。 ## Travis CI徽章 [Travis CI](https://travis-ci.org/)是一个持续集成平台,通过CI我们可以第一时间知道我们的项目有没有打包成功,获得徽章,我们参照官网的指南就可以了。 1. 使用GitHub登录,激活github 仓库 2. 在项目根目录下,编写.travis.yml文件 3. 提交代码会自动触发build 接下来我们就可以在travis-ci上获得这个徽章,我们可以选择Markdown语法,然后写到项目的Readme里。 ## Sonar 徽章 打开[https://sonarcloud.io/](https://sonarcloud.io/),同样使用GitHub登录,按照说明我们获取到token,然后在Github项目根目录下执行命令: ``` mvn sonar:sonar \ > -Dsonar.organization=sayi-github \ > -Dsonar.host.url=https://sonarcloud.io...
今年来我一直在思考一个问题:作为工程师,你一直在忍受着什么? 是公司流程冗余,每个人的利益各不相同?是产品功能复杂到越来越不满意,缺乏内心的满足感?忍受着每个人的埋怨,经济给你带来的压力?... 当我不断的思考我们忍受的事情,我发现我忽略了问题中重要的一点:**作为工程师**。是的,我们是工程师,工程师遇到的问题得用工程师思维去解决。 > 有趣的灵魂终会相遇 和吉米商量这件事情的时候,我们一拍即合,通过一次团队周会,我们明确了beta版本中的功能。 ## Good Game  前端技术:[Ant-Design-Pro](https://pro.ant.design/) 服务端:sslb(三十六变,基于公司框架开发) 项目开始的时候,我起了个名字,叫做Good Game,简称GG,寓意无论何时,我们应该热爱我们所从事的事业,并且commit了第一行信息:`Of course i still love this game`。 我们选用了蚂蚁金服的ant-design为前端框架,因此我花了一丢丢时间更新了整个前端技术栈(对于年轻人来人,学习一门新技术根本算不上挑战)。 ### 代码质量  工程师应该关注自己的代码质量,并且正视那些潜在的问题,我们基于sonar做了一个大屏,对代码中的bugs、坏味道、重复行数进行展示。 ### 开发者数据   吉米负责了整个Git数据的分析,最终呈现的效果也很有趣,我们可以通过周视图看到每个人提交的代码量和提交次数,如果不是排第一的小伙子那周最后时刻改了几个BUG,我相信我会勇夺第一。...
### 1. 关于Dubbo、原理、负载均衡 > Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 >官网地址 [http://dubbo.io](http://dubbo.io) >GitHub地址 [https://github.com/alibaba/dubbo](https://github.com/alibaba/dubbo) >Dubbo 是阿里巴巴的一个开源产品,淘宝内部使用的HSF并未开源。 >关于Dubbo的架构可以参考官网的示例图  当整个系统越来越庞大的时候,基础的分布式服务越来越多,这些基础服务的负载均衡,服务URL配置管理,服务的协调都显得复杂,dubbo就是这样一个分布式服务的协调和治理框架。 与Hessian比较,dubbo具有如下优势: * 服务URL地址的管理,服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者 * Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。 * Dubbo提供了多种均衡策略,缺省为random随机调用。 > Random LoadBalance随机,按权重设置随机概率。 > RoundRobin LoadBalance轮循,按公约后的权重设置轮循比率。。 > LeastActive LoadBalance最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。...
> Markdown,一种易读易写的书写语言。更多标记语法,参考[Markdown 语法说明 (简体中文版) ](http://www.appinn.com/markdown/) > 本文所述的markdown语法基于[GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown). 本文讨论如何在Android平台实现一个具有简单功能(代码也是极其简单)的Markdown编辑器,界面效果如下图,Android应用参见[GitHub博客 APP](http://deepoove.com/github-blog/):  ## Layout布局 直接进入主题,从截图中可以看出,这是一个带有标题、标签、内容的编辑器。整体布局构造如下: ``` appbar(含有保存功能的菜单) titlezone(标题区域) -----|- titleEdit(标题输入框) -----|- labelView(标签View,点击进入标签选择视图) toolbar(工具栏) contentzone(内容区) -----|- contentEdit(编辑区) -----|- previewView(预览区) ``` ####...
### Volley是一个由Google开发的Http网络库,让Android的网络操作更简单,更快。具有以下特点: > * 自动调度网络请求 > * 并发请求 > * 与HTTP缓存头一致性的透明缓存机制 > * 支持请求的优先级 > * 支持取消请求 > * 重试机制 > * Android异步更新UI > > 本文将尝试从这些特性入手,去理解Volley的设计以及实现。 ### 底层网络请求 设计网络库,首先要确定底层HTTP请求的处理方式。Volley提供了接口`HttpStack`,接口只有一个方法,就是处理请求,获得响应值。 根据sdk版本不同,Volley提供了不同的实现,基于HttpURLConnection的类`HurlStack`(sdk>=9)和基于httpclient的`HttpClientStack`(sdk