Intellij Idea Plugin 开发
做CPE的时候,常常需要给客户提供hotfix,每次都需要手动把改动的java文件编译后,再把所有的.class
文件以及包含.class
目录打包成zip包,后再附上hotfix的reademe文件。于是查了Intellij Plugin Dev Document,动手设计了下面的原型,并实现了基本能用的HotfixWorkshop
插件。
做CPE的时候,常常需要给客户提供hotfix,每次都需要手动把改动的java文件编译后,再把所有的.class
文件以及包含.class
目录打包成zip包,后再附上hotfix的reademe文件。于是查了Intellij Plugin Dev Document,动手设计了下面的原型,并实现了基本能用的HotfixWorkshop
插件。
找了很久的GitHub Pages博客主题,最终还是Octopress
符合我的口味。
用了一段时间,推荐给朋友用,然后由于朋友不是很懂前端的知识,问我是怎么调整文章缩进以及怎么给图片加弹出效果的。所以写在这里分享给有需要的朋友:D
Octopress
写Markdown文档的列表时,列表无法缩进,table不好用,行内代码块难看,quote域难看,有点难以忍受,只需在/sass/custom/_styels.css添加以下代码就能解决。
1 | article { |
做这个,我是借助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
官网开通下你的账号,然后根据以下步骤配置就好了。
以往虽也看过相关设计模式的书籍,但能和与HeadFirt设计模式
这本书相比不是缺乏严谨性就是缺乏具体应用实例,还有幽默生动以及引人启发的观点。
设计原则并不能光靠死记硬背,我们需要通过具体的设计模式来反思:该模式符合与违背了哪些设计原则。
不过在进入下文讨论之前,让我们先大概看看设计原则都有哪些。
我们都知道在GoF
里面的设计模式含有23种,在HeadFirst设计模式
一书中主要介绍了11种常见的设计模式。
本文挑选模板方法
这个设计模式着重介绍下,主要是该模式在前后端的开发中经常遇到,也便于理解。
为了探析模板方法
,让我们先看看日常生活中我们泡茶与泡咖啡的步骤。
看完廖雪峰的《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 | # python 构建一副法国牌 |
古人云:“读万卷书,行万里路。”。乘换工作之机,一者为增长见闻,二者为放松身心。约友,无一人,遂于蚂蜂窝订花儿户外拼车票一张,只身从上海出发。至杭州一宿,与友借单反把玩。及西宁又一宿,翌日清晨与师傅及三位伙伴会合,至此,旅途正式开始。
由于项目需要,需要开放接口并提供SDK给第三方的应用使用,该微服务(以下简称open-api
),需要实现的功能如下:
提供一张open_key
表作为记录,其中重要的字段为:
acccess_key
:在redis中记录API的调用频次(相当于用户名),唯一acccess_secret
:签名算法中使用(相当于用户密码),随机字符串在网络安全中,永远不要以明文的形式发送密码,以防被恶意截取。笔者的签名算法以较为简单的计算函数实现:md5(accessKey:acccessSecret:cnonce:body)
。其中,cnonce
为客户端生成的随机字符串,body
为request body
。客户端生成签名后,以下列的形式发送HTTP请求头:
1 | Authorization: accessKey=?;cnonce=?;sign=? |
这样子,在服务端,获取到头部信息后便可采用同样的签名算法进行校验了。
为什么签名算法会有效?
主要是因为accessSecret没有在网络进行传输,监听者获取不了。所以当监听者试图篡改内容的时候,无法计算出正确的签名,而导致请求失败。
可以参考:《HTTP权威指南》的摘要认证章节
enumerate
1 | cites = ['Shanghai', 'London', 'New York', 'Beijing'] |
zip
1 | x_list = [1, 3, 5] |
swap
1 | # bad way |
Zuul在微服务架构中,可以作为提供动态路由,监控,弹性,安全等边缘服务的框架。在Netflix,被用作所有请求到达streaming application
的前门。Zuul使用一系列不同的Filter
可以提供各种功能:
先从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中。单例 |
具体执行流程如图所示: