gulp 工具简单使用

Gulp 是基于 Node.js 的前端构建工具,可以通过 Gulp 实现前端代码编译,压缩,测试,图片压缩,浏览器自动刷新,等等,Gulp 提供了很多插件

大概可以理解成 makefile 之于 C++, Maven 之于 Java 吧,通过定义任务简化前端代码构建过程中繁琐的过程。

简单使用

全局安装

npm i gulp -g

然后在项目根目录安装一遍

npm i gulp --save-dev

一般在根目录创建 gulpfile.js 文件,用来编写 gulp task。

以压缩图片举例:

gulp.task('images', function() {
  return gulp.src('src/images/**/*')
    .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true }))
    .pipe(gulp.dest('dist/assets/img'))
    .pipe(notify({ message: 'Images task complete' }));
});

再运行 gulp images 就可以将 src/images 文件夹及子文件夹图片压缩,最后存放到 dist 目录。

关于压缩图片其实有很多选择:

reference


2018-11-09 gulp , nodejs , angularjs. npm , sass

使用 nltk 词形还原

今天在用 mdx-server 将 mdx 文件导出 HTTP 接口时发现 mdx-server 项目并不支持类似与 GoldenDict Morphology 构词法一样的规则,所以只能够在 mdx-server 外自行处理英语单词的词形变化,搜索一圈之后发现了 NLTK。

英语中词形还原叫做 lemmatization,是将一个任何形式的单词还原为一般形式的意思。另外一个相关的概念是 stemming 也就是词干提取,抽取单词的词干或者词根。这两种方法在自然语言处理中都有大量的使用。这两种方式既有联系也有很大差异。

  • 两者的目标相似,lemmatization 和 stemming 目标都是将单词的衍生形态简化或者归并为词干 stem 或者原形,都是对相同单词不同形态的还原
  • lemmatization 和 stemming 的结果有交叉,cats 的结果相同
  • 主流实现方法类似,通过语言中存在的规则和词典映射提取
  • 主要应用领域相似,应用于信息检索和文本,自然语言处理等方面

区别

词干提取采用缩减方法,将词转变为词干,cats 变为 cat,将 effective 处理成 effect,而词性还原采用转变的方法,将词还原为一般形态,将 drove 变为 drive,将 driving 变为 drive

Stemming

In linguistic morphology and information retrieval, stemming is the process for reducing inflected (or sometimes derived) words to their stem, base or root form—generally a written word form. The stem need not be identical to the morphological root of the word; it is usually sufficient that related words map to the same stem, even if this stem is not in itself a valid root. Algorithms for stemming have been studied in computer science since the 1960s. Many search engines treat words with the same stem as synonyms as a kind of query expansion, a process called conflation.

Stemming programs are commonly referred to as stemming algorithms or stemmers.

Lemmatization

Lemmatisation (or lemmatization) in linguistics, is the process of grouping together the different inflected forms of a word so they can be analysed as a single item.

In computational linguistics, lemmatisation is the algorithmic process of determining the lemma for a given word. Since the process may involve complex tasks such as understanding context and determining the part of speech of a word in a sentence (requiring, for example, knowledge of the grammar of a language) it can be a hard task to implement a lemmatiser for a new language.

In many languages, words appear in several inflected forms. For example, in English, the verb ‘to walk’ may appear as ‘walk’, ‘walked’, ‘walks’, ‘walking’. The base form, ‘walk’, that one might look up in a dictionary, is called the lemma for the word. The combination of the base form with the part of speech is often called the lexeme of the word.

Lemmatisation is closely related to stemming. The difference is that a stemmer operates on a single word without knowledge of the context, and therefore cannot discriminate between words which have different meanings depending on part of speech. However, stemmers are typically easier to implement and run faster, and the reduced accuracy may not matter for some applications.

NLTK Lemmatization

The NLTK Lemmatization 方法基于 WordNet 内置的 morphy function.

>>> from nltk.stem import WordNetLemmatizer
>>> wordnet_lemmatizer = WordNetLemmatizer()
>>> wordnet_lemmatizer.lemmatize(‘dogs’)
u’dog’
>>> wordnet_lemmatizer.lemmatize(‘churches’)
u’church’
>>> wordnet_lemmatizer.lemmatize(‘aardwolves’)
u’aardwolf’
>>> wordnet_lemmatizer.lemmatize(‘abaci’)
u’abacus’
>>> wordnet_lemmatizer.lemmatize(‘hardrock’)
‘hardrock’
>>> wordnet_lemmatizer.lemmatize(‘are’)
‘are’
>>> wordnet_lemmatizer.lemmatize(‘is’)
‘is’

lemmatize() 方法有第二个 pos 参数,可以传入 n 表示 noun,或者 v 表示 verb,或者其他的形容词等等,提高准确度。

更多的 doc 可以参考 API。

reference


2018-11-08 nltk , lemmatization , stemming , nlp , goldendict , dictionary

AngularJS 学习笔记

如果要说 AngularJS 是什么,那么用这些关键词就能够定义,单页面,适合编写大量 CRUD 操作,MVC

AngularJS 有如下特性:

  • 模板语言
  • 自动刷新
  • 依赖注入
  • 模块测试

AngularJS 安装

安装 AngularJS 之前需要确保 Node.js 和 npm 安装。AngularJS 需要 node.js 的 8.x 或者 10.x 版本。

nodejs npm 安装

以前不熟悉 nodejs 的时候为了简单的使用 npm 所以找了 apt 方式安装的方法,这里如果要学习推荐通过 nvm 来安装,可以类似于 pyenv 一样来安装多个版本的 nodejs,并且可以非常方便的管理不同的环境。安装过程比较简单,直接去官方 repo 即可。

简单使用

nvm install node            # "node" 是最新版本的别名,所以这行命令是安装最新的 node
nvm install v10.13.0

如果要查看可用版本可以使用

nvm ls-remote

启用并使用最新版本

nvm use v10.13.0

这时在查看 npm 的位置 whereis npm 就会发现在 ~/.nvm/versions 目录下了。

安装 Angular CLI

Angular CLI 用来创建项目,创建应用和库代码,并可以执行多种开发任务,测试,打包,发布等等

npm install -g @angular/cli

创建工作空间和初始化应用

在创建开发环境时还会选择一些特外的特性

ng new angularjs-demo

启动开发服务器

Angular 自带一个开发服务器,可以在本地轻松构建和调试,进入工作空间 (angularjs-demo)

cd angularjs-demo
ng serve --open

更加详细的可以参考官网 quickstart

使用

在学完官网的 Hero demo 之后对 AngularJS 有了一个基本印象,对于基本的 MVC,在 AngularJS 中通过学习 Java 中,定义好 Service 通过依赖注入到模板和 Component 中。

angularjs overview

组件和模板定义 Angular 的视图,然后在视图中注入 Service 提供服务。

模块

模块称为 NgModule,存放一些内聚的代码和模板,每个 Angular 都至少有一个 NgModule 类,根模板,习惯上命名为 AppModule,位于 app.module.ts

组件

组件控制屏幕上一小片区域,在类中定义组件的逻辑,为视图提供支持。@Component 装饰器会指出紧随其后的那个类是个组件类,并为其指定元数据。

每一个 Component 由以下部分组成:

  • Template
  • Class
  • Metadata

AngularJS 有一套自己的模板语法,这个需要熟悉一下。

AngularJS 支持双向数据绑定,大致语法如下:

从 Component 到 DOM

  • ``
  • [property]="value"

从 DOM 到 Component

  • (event) = "handler"
  • [(ng-model)] = "property"

服务

Angular 将组件和服务区分,提高模块性和复用性,服务应该提供某一类具体的功能。Angular 通过依赖注入来将逻辑和组件分离。服务可以被多个 Component 共用。

独特的语法

Angular 有一套自己的 HTML 标记语法,比如在 app.component.ts 中定义

title = '这是一个 AngularJS-demo 演示';

那就可以通过类似于模板的语法来访问该变量:

Welcome to !

又比如条件语句 ngIf,后面的 isLogin 是在 class 中定义好的 boolean 变量:

<div *ngIf="isLogin">Hi </div>

或者循环 ngFor,for 后面接一个表达式

*ngFor = "let variable of variablelist"

比如:

<a *ngFor="let nav of navs"></a>

Directive

Directive 一般被叫做指令,Angular 中有三种类型的指令:

  • 组件,是一种特殊的包含模板的指令
  • 结构指令 (structural directives),通过添加和移除 DOM 元素的指令,包括 ngFor, ngIf
  • 属性指令,改变元素显示和行为的指令,ngStyle

Angular2 中,属性指令至少需要一个带有 @Directive 装饰器修饰的控制器类,官网有一个很好的 highlight.directive.ts 例子

本文 demo 源码: https://gitlab.com/einverne/angularjs-demo

reference


2018-11-06 angular , google , javascript , mvc , angularjs

Aviator 轻量 Java 表达式引擎

Aviator 是一个轻量级、高性能的 Java 表达式执行引擎,它动态地将表达式编译成字节码并运行。

使用

<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>{version}</version>
</dependency>

最简单直观的使用:

import com.googlecode.aviator.AviatorEvaluator;
public class TestAviator {
    public static void main(String[] args) {
        Long result = (Long) AviatorEvaluator.execute("1+2+3");
        System.out.println(result);
    }
}

更加复杂的使用方式可以参考 wiki,文档已经足够详细,不在重复。

源码解析

执行表达式

主要接口

aviator-evaluator

AviatorEvaluator 最重要的一个方法

execute(String expression)
execute(String expression, Map<String,Object> env)
execute(String expression, Map<String,Object> env, boolean cached)

用来执行表达式,并获取结果。围绕这个方法也有可以传入变量的 exec 方法

exec(String expression, Object... values)

内置方法和自定义方法

自定义方法

abstract-function

主要可以分为以下几大类,包括数学计算相关,字符串处理相关

数学计算

MathAbsFunction
MathCosFunction
MathLog10Function
MathLogFunction
MathPowFunction
MathRoundFunction
MathSinFunction
MathSqrtFunction
MathTanFunction

字符串相关

StringContainsFunction
StringEndsWithFunction
StringIndexOfFunction
StringJoinFunction
StringLengthFunction
StringReplaceAllFunction
StringReplaceFirstFunction
StringSplitFunction
StringStartsWithFunction
StringSubStringFunction

序列相关方法

SeqCompsitePredFunFunction
SeqCountFunction            # count(list) 长度
SeqFilterFunction           # 过滤
SeqIncludeFunction          # 是否在序列中
SeqMakePredicateFunFunction
SeqMapFunction              # 遍历序列
SeqPredicateFunction
SeqReduceFunction           # 求和
SeqSortFunction
SeqEveryFunction            # 每个都满足
SeqNotAnyFunction           # 不在
SeqSomeFunction             # 序列中一个元素满足

额外的方法

BinaryFunction
BooleanFunction
Date2StringFunction
DateFormatCache
DoubleFunction
LongFunction
NowFunction
PrintFunction
PrintlnFunction
RandomFunction
StrFunction
String2DateFunction
SysDateFunction

表达式语法解析

FakeCodeGenerator

演示将中缀表达式转换为后缀表达式

reference


2018-11-02 aviator , java , expression-engine , expression-evaluator

后知后觉之 iOS 内置字典

用了近两年 iOS,中途也因为学习需要下载了很多的字典,但是没想到的是 iOS 竟然内置有版权的字典。

之前在下拉搜索框 (Spotlight) 中输入单词偶然会见到单词释义,但是也没有多想,可没想到原来长按选中之后的 “Look up” 竟然有查词的功能。后来查了一下原来 iOS 和 Mac 自带 dictionary 的应用。而 iOS 从 iOS 9 开始就已经有了这功能,iOS 9 中是长按高亮之后在弹出的菜单中选择 Define,而更新到 iOS 10 以后有了一些变化。

向 iOS 添加新字典

字典在 “Setting -> General -> Dictionary” 菜单中,然后选择适当的词典下载到设备中就能够使用。iOS 和 Mac 为不同国家不同语言用户提供了非常多的版权字典,虽然有些词典有些瑕疵但是完全不影响使用。系统自带的词典见附录。

查词

查词有两种,第一种比较方便,在选中单词后在弹出的上下文菜单中选择“Look Up”,系统会弹出查词结果。

第二中就是在 HOME 下拉然后在搜索框中输入想要查找的单词,在下面的结果中会有字典的结果。

当然如果想要有自定义更好的字典那就要使用之前提到的 Goldendit 了。

附录字典列表

  • 现代汉语规范词典 / The Standard Dictionary of Contemporary Chinese
    > Copyright © 2010, 2013 Oxford University Press and Foreign Language Teaching and Research Publishing, Co., Ltd. All rights reserved.
  • 牛津英汉汉英词典 / Oxford Chinese Dictionary
    > Copyright © 2010, 2015 Oxford University Press and Foreign Language Teaching and Research Publishing Co., Ltd. All rights reserved.
  • Politikens Nudansk Ordbog / Politikens Modern Danish Dictionary
    > Copyright © 2010 Politikens Forlagshus, under licence to Oxford University Press. All rights reserved.
  • Politikens Nudansk Ordbog / Politikens Modern Danish Dictionary
    > Copyright © 2010 Politikens Forlagshus, under licence to Oxford University Press. All rights reserved.
  • Wörterbuchsubstanz aus: Duden – Wissensnetz deutsche Sprache
    > Copyright © 2011, 2013 Bibliographisches Institut GmbH, under licence to Oxford University Press. All rights reserved.
  • Oxford German Dictionary
    > Copyright © 2008, 2015 Oxford University Press. All rights reserved.
  • С. И. Ожегов «Толковый словарь русского языка» / S.I. Ojegov: Explanatory Dictionary of the Russian Language
    > Copyright © 2012 “Universe and Education” Publishing House Ltd., under licence to Oxford University Press. All rights reserved.
  • Multidictionnaire de la langue française
    > Copyright © 2012, 2014 Les Éditions Québec Amérique Inc., under licence to Oxford University Press. All rights reserved.
  • Oxford-Hachette French Dictionary
    > Copyright © 2007, 2015 Oxford University Press & Hachette Livre. All rights reserved.
  • 五南國語活用辭典 / Wu-Nan Chinese Dictionary
    > Copyright © 1987, 2015 Wu-Nan Book Inc. under licence to Oxford University Press. All rights reserved.
  • 뉴에이스 국어사전 / New Ace Korean Language Dictionary
    > Copyright © 2012 DIOTEK, under licence to Oxford University Press. All rights reserved.
  • 뉴에이스 영한사전 / New Ace English-Korean Dictionary
    > Copyright © 2011, 2014 DIOTEK Co., Ltd., under licence to Oxford University Press. All rights reserved.
  • 뉴에이스 한영사전 / New Ace Korean-English Dictionary
    > Copyright © 2011, 2014 DIOTEK Co., Ltd., under licence to Oxford University Press. All rights reserved.
  • Prisma woordenboek Nederlands
    > Copyright © 2010, 2013 Uitgeverij Unieboek | Het Spectrum bv, under licence to Oxford University Press. All rights reserved.
  • Prisma Handwoordenboek Engels
    > Copyright © 2010, 2013 Uitgeverij Unieboek | Het Spectrum bv, under licence to Oxford University Press. All rights reserved.
  • Norsk Ordbok / Norwegian Monolingual Dictionary
    > Copyright © 2012, 2014 Kunnskapsforlaget ANS, under licence to Oxford University Press. All rights reserved.
  • Dicionário de Português licenciado para Oxford University Press
    > Copyright © 2012 Editora Objetiva, under licence to Oxford University Press. All Rights reserved.
  • スーパー大辞林 / Super Daijirin Japanese Dictionary
    > Copyright © 2010, 2013 Sanseido Co., Ltd., under licence to Oxford University Press. All rights reserved.
  • ウィズダム英和辞典 / The Wisdom English-Japanese Dictionary
    > Copyright © 2007, 2013 Sanseido Company Ltd., under licence to Oxford University Press. All rights reserved.
  • ウィズダム和英辞典 / The Wisdom Japanese-English Dictionary
    > Copyright © 2007, 2013 Sanseido Company Ltd., under licence to Oxford University Press. All rights reserved.
  • NE Ordbok / NE Dictionary
    > Copyright © 2013 Nationalencyklopedin, under licence to Oxford University Press. All rights reserved.
  • พจนานุกรมไทย ฉบับทันสมัยและสมบูรณ์ / Complete Thai Dictionary
    > Copyright © 2009 Se-Education PLC, under licence to Oxford University Press. All rights reserved.
  • Arkadaş Türkçe Sözlük
    > Copyright © 2012 Arkadaş Publishing LTD, under licence to Oxford University Press. All rights reserved.
  • Diccionario General de la Lengua Española Vox
    > Copyright © 2012, 2013 Larousse Editorial, S.L., under licence to Oxford University Press. All rights reserved.
  • Gran Diccionario Oxford – Español-Inglés • Inglés-Español / Oxford Spanish Dictionary
    > Copyright © 2008, 2015 Oxford University Press. All rights reserved.
  • Un dizionario italiano da un affiliato di Oxford University Press
    > Copyright © 2005, 2013 Mondadori Education S.p.A., under licence to Oxford University Press. All rights reserved.
  • Oxford Paravia Il Dizionario inglese – italiano/italiano – inglese / Oxford – Paravia Italian Dictionary
    > Copyright © 2010, 2015 Oxford-Paravia Italian Dictionary, Pearson Italia, Milano – Torino, and Oxford University Press. All rights reserved.
  • राजपाल हिन्दी शब्दकोश / Rajpal Hindi Dictionary
    > Copyright © 2011 Rajpal & Sons, under licence to Oxford University Press. All rights reserved.
  • Oxford Thesaurus of English
    > Copyright © 2009, 2016 by Oxford University Press. All rights reserved.
  • Oxford Dictionary of English
    > Copyright © 2010, 2016 by Oxford University Press. All rights reserved.
  • Oxford American Writer’s Thesaurus
    > Copyright © 2012, 2016 by Oxford University Press, Inc. All rights reserved.
  • New Oxford American Dictionary
    >Copyright © 2010, 2016 by Oxford University Press, Inc. All rights reserved.

reference


2018-11-01 ios , apple , dictionary , goldendict

Drools kie 中的 Assets

Drools Workbench 中有很多的 Assets (资源)类型,每一种类型的 asset 都意味着一种类型的规则模型,下面就记录下学习的过程。

Model

这个是最好理解的概念了,和 Java 的对象一样。可以通过基础类型定义一些抽象的概念。

Data enumerations

枚举,和常见的枚举也没有太大差别,不过在 Drools 中会被下拉菜单用到。

Fact Field Context
Applicant age [20, 25, 30]

然后会生成这样的代码

'Applicant.age' : [20,25,30]

如果想要缩写可以使用等号,比如

'Person.gender' : ['M=Male','F=Female']

guided rules

向导型规则,通过 WHEN ,THEN 语句快速建立规则,相对比较简单的一种。在规则设计器中可以轻松的添加条件和结果规则。

Guided decision tables

向导型决策表是一种以表格形式表现规则的工具,非常适合描述条件判断很多,条件又可以相互组合,有很多决策方案的情况。决策表可以将这些复杂的逻辑以一种精确而简单的表格形式整理出来,通过 Workbench 中直观的表格形式非常清晰。

Drools 中的决策表可以非常轻松的引导用户制作一个基于 UI 的规则,可以定义规则 attributes, metadata, conditions 和 actions。一旦通过 UI 形式定义好规则,那么所有的规则都会编译为 Drools Rule Language(DRL) 规则。

guided rule templates

规则模板,可以使用占位符来生成模板来给其他使用

Spreadsheet decision tables

由用户上传一张 excel 表

Test Scenario

Test Scenario 用来验证规则是否符合预期,当规则发生改变,可以使用 Test Scenario 来回归测试。

reference


2018-10-31 drools , rule-engine , kie

使用 hub 命令来操作 GitHub

hub 命令是 git 命令的扩展,利用 GitHub 的 API 可以轻松的扩展 Git 的能力,比如常见的 pull requests 可以通过命令行来实现。

安装

在官网的文档上,Mac 有一键安装,Fedora 有一键安装,唯独 Ubuntu/Mint 系列没有一键安装的,其实用 hub 的二进制也非常容易,不过没有一键安装,比如 apt install hub 这样的命令还是有些麻烦。

所以有了这个很简单的脚本

VERSION="2.5.1"
wget https://github.com/github/hub/releases/download/v$VERSION/hub-linux-amd64-$VERSION.tgz
tar xzvf hub-linux-amd64-$VERSION.tgz
sudo ./hub-linux-amd64-$VERSION/install

对于 bash,zsh 的自动补全可以参考文末的链接。

Mac 或者 Go 安装可以参考这里

当第一次和 GitHub 有交互时会弹出用户名和密码用来生成 OAuth token,token 保存在 ~/.config/hub 文件中。或者可以提供 GITHUB_TOKEN 环境变量,值是拥有 repo 权限的 access token。

使用

贡献者

如果是开源项目贡献者,hub 可以使用命令来拉取代码,浏览页面,fork repos,甚至提交 pull requests 等等。

这里为了和 git 命令区别开,还是使用 hub 命令,如果熟悉之后可以设置一个别名直接用 hub 替换 git 命令。

hub clone dotfiles      # clone own repo
hub clone github/hub    # clone others
hub browse -- issues    # Open browser and navigate to issue page

贡献者工作流

hub clone others/repo
cd repo
git checkout -b feature
git commit -m "done with feature"
hub fork    # fork repo , hub command will add a remote
hub push YOUR_USER feature
hub pull-request

维护者工作流目前还没有用到先略过。

常用命令介绍

hub push

将本地 branch push 到 remote,和 git 命令类似

hub push REMOTE[,REMOTE2...] [REF]

比如

hub push origin,staging,qa branch_name

hub create

在 GitHub 创建 repo 并且添加 remote.

hub create [-poc] [-d DESC] [-h HOMEPAGE] [[ORGANIZATION/]NAME]

reference


2018-10-30 hub , github , git , version-control

通过 microk8s 使用 Kubernetes

看 Kubernetes 相关书籍的时候都推荐使用 minikube 来在本地安装 Kubernetes 调试环境,但是发现 minikube 安装和使用,都需要使用虚拟化工具,比较麻烦,搜索一下之后发现了 microk8s , microk8s 安装非常简单

snap install microk8s --classic

只需要本地有 snap 环境就可以非常快速一行命令安装成功。

为了不和已经安装的 kubectl 产生冲突,microk8s 有自己的 microk8s.kubectl 命令 o

microk8s.kubectl get services

如果本地没有 kubectl 命令可以增加一个别名

snap alias microk8s.kubectl kubectl

或者取消

snap unalias kubectl

API 服务监听 8080 端口

microk8s.kubectl config view

查看。

Kubernetes Addons

microk8s 只是最精简的安装,所以只有 api-server, controller-manager, scheduler, kubelet, cni, kube-proxy 被安装运行。额外的服务比如 kube-dns, dashboard 可以通过 microk8s.enable 启动

microk8s.enable dns dashboard

禁用

microk8s.disable dns dashboard

可用的扩展

  • dns
  • dashboard
  • storage
  • ingress
  • gpu
  • istio
  • registry
  • metrics-server

停止或重启 microk8s

snap disable microk8s   # 停止
snap enable microk8s    # 重启

移除

microk8s.reset
snap remove microk8s

更多配置参考官网

reference


2018-10-29 kubernetes , microk8s , container , docker

Kubernetes

免责声明:这篇文章只是在了解 Kubernetes 时的一些笔记记录,非常不全面,如果需要全面了解 Kubernetes 那么还请看书或者文档。

Kubernetes 是什么

Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.

Kubernetes 是 Google 开源的容器集群管理系统,为容器化应用提供资源调度,部署运行,服务发现,扩容和缩容等一系列服务。

能够做什么

Kubernetes 最重要的功能就是容器编排(container orchestration),也就是确保所有的容器能够按照预先的设定在物理机或者虚拟机上执行不同的工作流程。容器必须按照约定打包, Kubernetes 会监控所有正在运行的容器,如果容器”死亡“,或者”无响应“,都会被 Kubernetes 处理。

Kubernetes

图片来自 Architecture 101

  • Cluster, A cluster is a collection of hosts storage and networking resources that Kubernetes uses to run the various workloads that comprise your system.
  • Node(除去 Master 的其他机器), single host, a physical or virtual machine. job is to run pods,可以通过 kubectl get nodes 查看 node,或者 kubectl describe node <node_name> 查看详细信息

    • kubelet 负责 Pod 对应容器创建、启动停止等
    • kube-proxy 实现 Kubernetes Service 通信和负载均衡
    • Docker 引擎,负责本机容器创建和管理
  • Master (集群控制节点), is the control plane of Kubernetes, consists of several components, like API server, a scheduler, and a controller manager.

    • kube-apiserver 提供 HTTP Rest 接口
    • kube-controller-manager 资源对象自动化控制中心
    • kube-scheduler 负责资源调度 Pod 调度
  • Pod is the unit of work in Kubernetes. Each pod contains one or more containers.
  • Label (标签),Label 可以附加到各种资源上,node,pod,service,RC 等。
  • Replication Controller(RC),核心概念之一,定义一个期望的场景,声明某种 Pod 的副本数量在任意时刻都符合某个期望值

    • Pod 期待的副本数 replicas
    • 筛选目标 Pod 的 Label Selector
    • 当 Pod 副本数小于预期时,创建新 Pod 的 Pod 模板
  • Replica Sets 和 RC 的区别,在于支持集合的 Label selector,而 RC 只支持基于等式的 Label Selector
  • Horizontal Pod Autoscaler(HPA) 实现 Pod 扩容和缩容。
  • Service 可以理解为一个微服务

为什么要用 Kubernetes

  • 单机走向集群已是必然
  • 设计实现分布式系统
  • Kubernetes 全面拥抱微服务架构
  • Kubernetes 架构有超强的横向扩容能力

分布式系统设计模式

Sidecar Pattern

The Sidecar pattern 是在 pod 中除去 main application 容器之外额外附加的一个容器模式。主要的应用感知不到 sidecar 容器。最好的例子就是中心化的日志收集器,主要的应用容器可以将日志打到 stdout,然后 sidecar 容器收集,然后将所有的日志发送到中心日志服务。

这种方式和在主应用中加入日志系统带来的优势是巨大的,首先,应用可以不被中心日志服务拖累,其次如果想要升级或者改变日志服务,只需要更新 sidecar 容器即可,而不需要修改主应用。

关于更加详细的分析可以参考这篇文章

Ambassador pattern

The Ambassador pattern 可以理解为一个代理层,对于一个远程服务,可以表现为一个本地服务加一些规则来代替提供相同的服务。最常见的使用场景就是,有一个 Redis 集群,master 用来写,而其他 replicas 用来读。

一个 local Ambassador 容器通过代理提供服务,然后暴露 Redis 给主应用容器。主应用容器通过 localhost:6379 来连接 Redis,但是实际上是连接到了同一个 pod 中的 ambassador ,这个代理层会过滤请求,发送写请求给真正的 Redis master,然后读请求会随机的发送给从服务器(replicas)。和 Sidecar 模式中主应用容器一样,主应用是不感知这样的模式的。

这种模式的优点是当 Redis 集群配置发生改变时,只需要 ambassador 做相应的修改即可,主应用不用任何改动。

Adapter pattern

The Adapter pattern 可以理解成将输出标准化。考虑一种模式,一个服务是逐渐发布的,他产生的报告格式可能和之前的格式不相同,但是其他接收输出报告的服务或者应用还没有升级。那么一个 Adapter 容器可以被部署到同一个 pod,将主应用输出的内容转换成老的格式,直到所有的报告消费者都升级完成。Adapter 容器和主应用容器共享一个文件系统,他可以监控本地文件系统,一旦新的应用写入内容,立即将其修改。

Multi-node pattern

单节点 patterns 被 Kubernetes 通过 pod 直接支持。Multi-node 模式,比如 leader election, work queues, 和 scatter-gather 并没有直接支持,但是通过标准接口组合 pods 可以实现。

下载安装

使用 Minikube 快速搭建单节点集群

具体的教程参考官网

使用 microk8s 安装

microk8s 是另外一个用以提供 Kubernetes 快速安装的工具,参考这里

使用

创建 rc 配置

样例文件:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

解释:

  • kind 资源类型
  • spec.replicas Pod 副本期待数量
  • spec.template 基于此模板创建 pod 实例
  • template 下 spec Pod 中容器定义

发布到 Kubernetes

kubectl create -f nginx-rc.yaml

用命令查看

kubectl get rc
kubectl get pods

reference


2018-10-29 kubernetes , container , open-source , automating , scaling , management , docker

Drools Kie 简单使用

Drools 是一个 Java 实现的开源规则引擎 (Rule Engine),或者又被称为 Business Rules Management System(BRMS) 。Drools workbench 被叫做 Drools-WB,KIE-WB(或者也叫 KIE Drools workbench) 组合了 Guvnor, Drools 和 jBPM 插件。1

Kie Server 是一个模块化的,独立的组件,可以用来演示和执行规则和流程。

KIE 全称是 Knowledge Is Everything 2

为什么会产生规则引擎

在企业复杂项目演进过程中随着外部条件复杂化会造成不断变化的业务逻辑,在系统实现时需要考虑将应用开发实现和商业业务决策逻辑剥离。这些规则可以集中管理,也可以在运行时动态管理修改,规则引擎正是基于上面的背景诞生的解决方案。

规则引擎用来处理什么问题

Drools 用来解决复杂规则的问题。现实问题往往会有很多逻辑判断,而如果将这些逻辑判断都编码写死在代码逻辑中,不仅实现混乱,而不易于维护。Drools 可以让应用逻辑和数据逻辑分离,通过直观的规则编排将数据逻辑单独处理。

规则引擎(BRMS)的特点:

  • 业务规则可以嵌入应用程序任何位置
  • 可持久化
  • 依据市场变化,业务规则需要能够快速,低成本更新
  • 测试场景可视化
  • 版本控制
  • 类人语言

可以这么理解规则引擎,是一种在应用程序中课嵌入的组件,将业务逻辑从应用代码中分离,使用行业特定的规则模块编写业务逻辑,接受数据输入,解释业务规则,并根据规则做出业务决策。

规则引擎适用场景

规则引擎并不万能,在业务中使用规则引擎需要预先分析业务的使用场景,规则引擎适用于下面的场景:

  • 业务规则数量有限,如果有成百条规则就明显不太适合使用规则引擎
  • 规则经常发生变动

声明式编程

规则引擎描述做什么,而不是如何去做。规则可以对复杂问题进行简化,规则比编码更易读。

逻辑与数据分离

数据保存在系统对象,逻辑保存在规则,打破了面向对象编程系统中数据和逻辑耦合的问题。

当逻辑跨领域时更为有用,通过将逻辑规则集中在一起维护,取代了分散在代码中的问题。

速度和可测量

Rete 算法,Leaps 算法,提供了系统数据对象有效的匹配。RETE 算法来自 Dr. Charles Forgy 在 1979 年的 《专家系统原理和编程》中 CIS587:The RETE Algorithm

集中化规则

通过规则,可以建立一个可执行的规则库,规则库代表着现实业务策略,理想情况下可读性高的规则还可以作为文档。

类自然语言的规则

通过 DSL 领域特定语言,可以让编码者通过接近自然语言的方式来编写规则。这让非技术人员和领域专家可以使用自己的逻辑来理解和编写规则。

如何使用规则引擎

规则引擎至少应该包括:

  • 加载卸载规则集 API
  • 数据操作 API
  • 引擎执行 API

使用规则引擎遵循五个典型步骤:

  • 创建规则
  • 向引擎添加或者更换规则
  • 向引擎提交数据
  • 引擎执行
  • 导出引擎执行结果,获取数据

一个开放的规则引擎可以被嵌在程序任何位置。

Docker 启动 drools workbench

Google 搜索之后发现 drools-workbench 有下面两个版本,不带 showcase 的版本是设计用来扩展,可以增加自己的的配置的镜像,而如果想要直接使用,那么可以使用 drools-workbench-showcase:latest 这个镜像,这个镜像包含了一些默认的配置。

docker pull jboss/drools-workbench
docker pull jboss/drools-workbench-showcase

拉取镜像后

docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:latest

当应用启动后,可以访问 http://localhost:8080/drools-wb 来体验 workbench 功能。

下面是镜像中默认包含的用户和角色:

USER        PASSWORD    ROLE
*********************************************
admin       admin       admin,analyst,kiemgmt
krisv       krisv       admin,analyst
john        john        analyst,Accounting,PM
sales-rep   sales-rep   analyst,sales
katy        katy        analyst,HR
jack        jack        analyst,IT

如果想要自己扩展用户,那么可以尝试使用不带 showcase 的版本。

Docker 启动 Kie Server

拉取镜像

docker pull jboss/kie-server-showcase

拉取完成后,如下启动:

docker run -p 8180:8080 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:latest

Drools

Drools 大体可以分为两个部分:Authoring 构建 和 Runtime 运行。

Authoring

构建过程涉及到 .drl 规则文件创建,通过上面的 workbench 可以使用界面来创建规则。

Runtime

运行时则是在执行规则的服务,kie 提供了 server 可以用来执行规则。

reference


2018-10-25 drools , rules , java , rule-engine

电子书

Google+

最近文章

  • gulp 工具简单使用 Gulp 是基于 Node.js 的前端构建工具,可以通过 Gulp 实现前端代码编译,压缩,测试,图片压缩,浏览器自动刷新,等等,Gulp 提供了很多插件。
  • 使用 nltk 词形还原 今天在用 mdx-server 将 mdx 文件导出 HTTP 接口时发现 mdx-server 项目并不支持类似与 GoldenDict Morphology 构词法一样的规则,所以只能够在 mdx-server 外自行处理英语单词的词形变化,搜索一圈之后发现了 NLTK。
  • AngularJS 学习笔记 如果要说 AngularJS 是什么,那么用这些关键词就能够定义,单页面,适合编写大量 CRUD 操作,MVC
  • Aviator 轻量 Java 表达式引擎 Aviator 是一个轻量级、高性能的 Java 表达式执行引擎,它动态地将表达式编译成字节码并运行。
  • 后知后觉之 iOS 内置字典 用了近两年 iOS,中途也因为学习需要下载了很多的字典,但是没想到的是 iOS 竟然内置有版权的字典。