Intellij Idea Plugin 开发

做CPE的时候,常常需要给客户提供hotfix,每次都需要手动把改动的java文件编译后,再把所有的.class文件以及包含.class目录打包成zip包,后再附上hotfix的reademe文件。于是查了Intellij Plugin Dev Document,动手设计了下面的原型,并实现了基本能用的HotfixWorkshop插件。

阅读全文

对Octo主题的整改

找了很久的GitHub Pages博客主题,最终还是Octopress符合我的口味。
用了一段时间,推荐给朋友用,然后由于朋友不是很懂前端的知识,问我是怎么调整文章缩进以及怎么给图片加弹出效果的。所以写在这里分享给有需要的朋友:D

自定义CSS

Octopress写Markdown文档的列表时,列表无法缩进,table不好用,行内代码块难看,quote域难看,有点难以忍受,只需在/sass/custom/_styels.css添加以下代码就能解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
article {
ul {
margin-left: 2em;
}
blockquote {
padding-left: 0.5em;
font-size: 1em;
font-style: normal;
}
code {
color: #c7254e;
background-color: #f9f2f4;
border: none;
border-radius: 4px;
}
table {
th {
border: 1px solid #ddd;
font-weight: 700;
padding: 0.1em 0.5em;
}
td {
border: 1px solid #ddd;
padding: 0.1em 0.5em;
font-size: 0.9em;
}
tr:nth-of-type(even) {
background-color: rgba(102,128,153,.05);
}
}
}

弹出层图片

做这个,我是借助Fancybox来做的。首先需要先把fancybox的js和css文件分别加入到.themes/classic/source/javascripts/libs/source/stylesheets/目录下,
再在head部分引入css,到footer引入js。然后就能用了,使用示例如下:

1
{% img fancybox https://ws4.sinaimg.cn/large/006tKfTcgy1fph3cqu4ghj31kw0mwtbg.jpg %}

具体修改可以看下:这里

集成Travis CI

先去Travis官网开通下你的账号,然后根据以下步骤配置就好了。

阅读全文

读HeadFirst设计模式

以往虽也看过相关设计模式的书籍,但能和与HeadFirt设计模式这本书相比不是缺乏严谨性就是缺乏具体应用实例,还有幽默生动以及引人启发的观点。

设计原则

设计原则并不能光靠死记硬背,我们需要通过具体的设计模式来反思:该模式符合与违背了哪些设计原则。
不过在进入下文讨论之前,让我们先大概看看设计原则都有哪些。

  • 封装变化
  • 针对接口编程,而不是实现
  • 多用组合少用继承
  • 松耦合
  • 对修改关闭,对扩展开放
  • 依赖抽象不依赖具体
  • 最少知识原则:只和亲密对象交谈
  • 好莱坞原则:别打电话给我,我会打给你
  • 单一职责

谈谈模板方法

我们都知道在GoF里面的设计模式含有23种,在HeadFirst设计模式一书中主要介绍了11种常见的设计模式。
本文挑选模板方法这个设计模式着重介绍下,主要是该模式在前后端的开发中经常遇到,也便于理解。

为了探析模板方法,让我们先看看日常生活中我们泡茶与泡咖啡的步骤。

阅读全文

使用Python玩扑克牌

看完廖雪峰的《Python3 零起点》,也用Flask做了一个web application,也做了一些小爬虫来练习Python的使用。但是感觉对里面的一些用法和技巧了解还远远不够,于是Google了下Python的进阶书籍。然后,找到了Fluent Python,看完第一章立马就喜欢上了作者的行文。章一里作者介绍了使用Python来构建一副法国扑克牌,不得不赞叹Python的灵活与优雅。加上最近自己也在琢磨一些牌游戏的规则,故此一记。

其实法国扑克牌就是流传在国内的普通扑克牌,扑克牌的前身为简化成52张卡牌的法国塔罗牌,后来美国商人再加入了德国的Joker的2张鬼牌

52张牌象征了全年52个星期。️黑体♠、红心♥、梅花♣️、方块♦与四季有关。每季13张,表示13个星期,其中13张牌的点数之和为91,所以每季也是91天。此外,全牌的红色代表了白天,黑色表示夜晚。

历史上,18世纪初的时候英国政府曾经征收过扑克牌税,黑桃A由政府印制,当时为了防伪,黑桃A做过各种复杂的设计,后来竟然成为了一种扑克牌传统。还记得小时候玩过:24点吹牛潜乌龟

首先,我们先用namedtuple定义Card,再定义FrenchDeck

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# python 构建一副法国牌
Card = collections.namedtuple('Card', ['rank', 'suit'])

class FrenchDeck:
ranks = [str(i) for i in range(2, 11)] + list('AJQK')
suits = 'spades diamonds clubs hearts'.split(' ')

def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits
for rank in self.ranks]

def __len__(self):
return len(self._cards)

def __getitem__(self, position):
return self._cards[position]

def __setitem__(self, position, card):
self._cards[position] = card

阅读全文

青海游记

古人云:“读万卷书,行万里路。”。乘换工作之机,一者为增长见闻,二者为放松身心。约友,无一人,遂于蚂蜂窝订花儿户外拼车票一张,只身从上海出发。至杭州一宿,与友借单反把玩。及西宁又一宿,翌日清晨与师傅及三位伙伴会合,至此,旅途正式开始。

阅读全文

基于SpringBoot的API Key实现

由于项目需要,需要开放接口并提供SDK给第三方的应用使用,该微服务(以下简称open-api),需要实现的功能如下:

  • 进行签名认证,防止第三方数据被篡改
  • 记录API调用频次,对API调用进行限制
  • 提供RESTFUL的API接口

表的设计

提供一张open_key表作为记录,其中重要的字段为:

  • acccess_key:在redis中记录API的调用频次(相当于用户名),唯一
  • acccess_secret:签名算法中使用(相当于用户密码),随机字符串

签名算法

在网络安全中,永远不要以明文的形式发送密码,以防被恶意截取。笔者的签名算法以较为简单的计算函数实现:md5(accessKey:acccessSecret:cnonce:body)。其中,cnonce为客户端生成的随机字符串,bodyrequest body。客户端生成签名后,以下列的形式发送HTTP请求头:

1
Authorization: accessKey=?;cnonce=?;sign=?

这样子,在服务端,获取到头部信息后便可采用同样的签名算法进行校验了。

为什么签名算法会有效?
主要是因为accessSecret没有在网络进行传输,监听者获取不了。所以当监听者试图篡改内容的时候,无法计算出正确的签名,而导致请求失败。
可以参考:《HTTP权威指南》的摘要认证章节

阅读全文

要优雅,七个Python代码的小技巧

enumerate

1
2
3
4
5
6
7
8
9
cites = ['Shanghai', 'London', 'New York', 'Beijing']
# bag way
i = 0
for city in cites:
print(i, city)
i += 1
# good way
for i, city in enumerate(cites):
print(i, city)

zip

1
2
3
4
5
6
7
8
9
x_list = [1, 3, 5]
y_list = [2, 4, 8]
# bad way
for i in len(x_list):
print(x_list[i], y_list[i])
# good way
zipped = zip(x_list, y_list)
for x, y in zipped:
print(x, y)

swap

1
2
3
4
5
6
7
8
9
10
11
12
13
# bad way
x = 10
y = -10
tmp = x
x = y
y = tmp
print('x = %s, y = %s' % (x, y))

# good way
x = 10
y = -10
x, y = y, x
print('x = %s, y = %s' % (x, y))

阅读全文

Zuul 1.x的工作原理

Zuul简介

Zuul在微服务架构中,可以作为提供动态路由,监控,弹性,安全等边缘服务的框架。在Netflix,被用作所有请求到达streaming application的前门。Zuul使用一系列不同的Filter可以提供各种功能:

  • 安全与认证
  • 监控
  • 动态路由
  • 压测
  • 限流
  • 静态响应
  • 多区域弹性负载均衡

可参考:How We Use Zuul At Netflix

Zuul执行流程

先从github把代码clone下来:git clone https://github.com/Netflix/zuul.git,切换至1.x分支,核心代码为zuul-core模块,几个重要的类清单如下:

类名 描述
RequestContext 继承至ConcurrentHashMap;被保存在ThreadLocal中;单例
ZuulServlet 继承至HttpServlet;核心方法为service()
ZuulFilter 抽象类,实现了Comparable接口,自定义Filter需从它继承
ZuulRunner ZuulServlet中用于代为执行route方法;核心方法为init(),初始化RequestContext中的request, response
FilterProcessor Filter执行器,Filter的runFilter方法再该类的processZuulFilter被调用;单例
FilterRegistry Filter注册器;一个(K, V)的ZuulFilter容器。单例
FilterLoader Filter管理器;主要提供了getFiltersByType(),putFilter()方法和初始化FilterFileManager;单例
FilterFileManager 声明了poller用于监听groovy文件夹的变化并通过FilterLoader.putFilter加入filter到FilterFileManager中。单例

具体执行流程如图所示:

阅读全文

Vim常用命令

本人非Vim党,亦不属于Emacs圣教,平常喜欢与VSCode玩耍。只是,在Linux服务器上配置时,避免不了使用Vi/Vim,记住一些命令,能提高编辑效率,故记之。

基本配置

1
2
3
4
5
6
set nu # 显示行号
syntax on # 启用语法高亮
# tab 4空格
set ts=4
set sw=4
set autoindent # 自动缩进

阅读全文