BlueXIII's Blog

热爱技术,持续学习

0%

安装JDK8

PPA方式安装OracleJDK

1
2
3
4
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
export JAVA_HOME=/usr/lib/jvm/java-8-oracle

或安装OpenJDK

1
sudo apt-get install default-jdk

创建hadoop用户

1
2
3
sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo adduser hadoop sudo

安装Open SSH Server

1
sudo apt-get install openssh-server

SSH授权:

1
2
3
cd ~/.ssh/
ssh-keygen -t rsa
cat ./id_rsa.pub >> ./authorized_keys

下载Hadoop

http://hadoop.apache.org/releases.html

2018-03-22-16-08-21

选择3.0稳定版的binary下载,并解压

安装Hadoop

1
2
tar -xzvf hadoop-3.0.0.tar.gz
sudo mv hadoop-3.0.0 /opt/hadoop

PATH

export PATH=$PATH:/opt/hadoop/sbin:/opt/hadoop/bin

设置JDK环境变量

readlink -f /usr/bin/java | sed “s:bin/java::”
/usr/lib/jvm/java-8-oracle/jre/

sudo vi ./etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/

运行Hadoop

./bin/hadoop

mkdir ~/input
cp /opt/hadoop/etc/hadoop/*.xml ~/input

./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar grep ~/input ~/grep_example ‘principal[.]*’

伪分布式配置

1
vi /opt/hadoop/etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
1
vi /opt/hadoop/etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/hadoop/tmp/dfs/data</value>
</property>
</configuration>

执行 NameNode 的格式化:
./bin/hdfs namenode -format

开启 NameNode 和 DataNode 守护进程:
./sbin/start-dfs.sh
./sbin/stop-dfs.sh

可以执行jps查看进程

WEB控制台界面:
http://localhost:9870

运行Hadoop伪分布式实例

在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop

将示例xml文件作为输入文件复制到分布式文件系统中
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put /opt/hadoop/etc/hadoop/*.xml input

查看文件列表:
./bin/hdfs dfs -ls input

伪分布式运行 MapReduce 作业:
./bin/hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output ‘dfs[a-z.]+’

查看运行结果:
./bin/hdfs dfs -cat output/*

将文件取回本地:
./bin/hdfs dfs -get output /opt/hadoop/output

启动YARN

vi mapred-site.xml

1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

vi yarn-site.xml

1
2
3
4
5
6
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

启动YARN:

1
2
./sbin/start-yarn.sh      # 启动YARN
./sbin/mr-jobhistory-daemon.sh start historyserver # 开启历史服务器,才能在Web中查看任务运行情况

停止YARN:

1
2
./sbin/stop-yarn.sh
./sbin/mr-jobhistory-daemon.sh stop historyserver

参考文章

https://www.digitalocean.com/community/tutorials/how-to-install-hadoop-in-stand-alone-mode-on-ubuntu-16-04
http://www.powerxing.com/install-hadoop/
http://www.powerxing.com/hadoop-build-project-using-eclipse/

官网文档

https://www.influxdata.com/time-series-platform/telegraf/
https://github.com/influxdata/telegraf
https://docs.influxdata.com/telegraf/v1.7/concepts/data_formats_input/

安装

macOS

1
brew install telegraf

Linux

1
2
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.7.1_linux_amd64.tar.gz
tar xf telegraf-1.7.1_linux_amd64.tar.gz

修改机器名

hostnamectl set-hostname smrz133

安装InfluxDB

不再赘述

修改配置

vi /etc/telegraf/telegraf.conf

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Global tags can be specified here in key="value" format.
[global_tags]
# dc = "us-east-1" # will tag all metrics with dc=us-east-1
# rack = "1a"
## Environment variables can be used as tags, and throughout the config file
# user = "$USER"


# Configuration for telegraf agent
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
debug = false
quiet = false
hostname = ""
omit_hostname = false


### OUTPUT

# Configuration for influxdb server to send metrics to
[[outputs.influxdb]]
urls = ["http://172.172.172.96:8086"]
database = "telegraf_metrics"

## Retention policy to write to. Empty string writes to the default rp.
retention_policy = ""
## Write consistency (clusters only), can be: "any", "one", "quorum", "all"
write_consistency = "any"

## Write timeout (for the InfluxDB client), formatted as a string.
## If not provided, will default to 5s. 0s means no timeout (not recommended).
timeout = "5s"
# username = "telegraf"
# password = "2bmpiIeSWd63a7ew"
## Set the user agent for HTTP POSTs (can be useful for log differentiation)
# user_agent = "telegraf"
## Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes)
# udp_payload = 512


# Read metrics about cpu usage
[[inputs.cpu]]
## Whether to report per-cpu stats or not
percpu = true
## Whether to report total system cpu stats or not
totalcpu = true
## Comment this line if you want the raw CPU time metrics
fielddrop = ["time_*"]


# Read metrics about disk usage by mount point
[[inputs.disk]]
## By default, telegraf gather stats for all mountpoints.
## Setting mountpoints will restrict the stats to the specified mountpoints.
# mount_points = ["/"]

## Ignore some mountpoints by filesystem type. For example (dev)tmpfs (usually
## present on /run, /var/run, /dev/shm or /dev).
ignore_fs = ["tmpfs", "devtmpfs"]


# Read metrics about disk IO by device
[[inputs.diskio]]
## By default, telegraf will gather stats for all devices including
## disk partitions.
## Setting devices will restrict the stats to the specified devices.
# devices = ["sda", "sdb"]
## Uncomment the following line if you need disk serial numbers.
# skip_serial_number = false


# Get kernel statistics from /proc/stat
[[inputs.kernel]]
# no configuration


# Read metrics about memory usage
[[inputs.mem]]
# no configuration


# Get the number of processes and group them by status
[[inputs.processes]]
# no configuration


# Read metrics about swap memory usage
[[inputs.swap]]
# no configuration


# Read metrics about system load & uptime
[[inputs.system]]
# no configuration

# Read metrics about network interface usage
[[inputs.net]]
# collect data only about specific interfaces
interfaces = ["ens192"]


[[inputs.netstat]]
# no configuration

[[inputs.interrupts]]
# no configuration

[[inputs.linux_sysctl_fs]]
# no configuration

添加Dashboard模板

Dashboard 928:
https://grafana.com/dashboards/928

左上加号->Import

Grafana.com Dashboard处,输入928编码

1 简介

F7-VUE-WEBPACK-SCAFFOLD,是一个基于Webpack + Vue + Framework7构建的移动端单页应用脚手架,可内嵌于Cordova等平台中。

2 快速上手

下面介绍一下如何在零基础的情况下,快速搭建好开发环境,并完成代码克隆、编辑、测试、构建、发布等一系列 开发流程。

2.1 安装node.js与npm

node.js是一个基于Chrome V8引擎的JavaScrip运行时,它是前端工程化的基础。npm是node.js的包管理工具。

  • Windows用户

访问 node.js官网 ,并下载安装包进行安装

  • macOS用户
    1
    brew install node
  • Ubuntu用户
    1
    sudo apt install nodejs

    2.2 安装git

  • Windows用户请先下载安装 msysgit 。另外最好安装一个命令行模拟器,例如cygwin。
  • macOS与Ubuntu默认已经安装。

2.3 前端编辑器

提前准备好一个适用于前端开发编辑器或IDE。
推荐 JetBrains的 WebStorm 或 微软的 VSCode

2.4 克隆源码

源码使用git进行版本控制,托管在私有的GitLab上。

使用git clone命令将版本库克隆到本地:

1
git clone https://github.com/xiiiblue/f7-vue-webpack-scaffold.git

2.5 安装依赖

进入到工程目录,执行:

1
npm install

npm会将依赖的模块自动下载并安装到./node_modules目录下。

如果在内网环境中,无法直连,可以加入--proxy参数,使用代理服务器进行连接, 例如: --proxy socks://IP:PORT

2.6 运行开发服务器

安装好依赖之后,在工程目录下执行:

1
npm run dev

会在3000端口上启动一个开发用的HTTP服务器。

接下来访问 http://127.0.0.1:3000 ,就可以看到应用首页了。

2.7 修改代码

修改任意一个文件,如src/pages/mamage/about.vue ,修改完成后保存,会在浏览器上立即看到结果。

2.8 代码构建

开发完成后,如果需要在本机构建工程,则需要执行:

1
npm run build

编译好的文件会生成在dist目录中

2.9 持续集成

正常情况下,不需要在本机进行构建。

将代码push到GitLab上之后,仅需要在工程目录下执行脚本:

1
./pushtag.sh

Jenkins会自动完成构建、老代码备份、发布等一系列操作。

3 应用概述

3.1 技术特性

  • 模块化 - 使用Webpack+Babel将所有资源打包同步加载
  • 组件化 - 使用Vue单页面组件方式开发,降低耦合,并将内容、样式、逻辑3个关注点分离
  • 规范化 - 使用Eslint,强制约束编码规范
  • 自动化 - 使用Jenkins实现前端执续集成,自动完成构建、备份、部署等操作

3.2 主要依赖

  • webpack ^2.2.1 - 资源打包
  • vue ^2.2.2 - 数据-视图绑定,组件化
  • vuex ^2.2.1 - 状态管理
  • framework7 ^1.6.5 - 移动端UI框架
  • framework7-vue ^0.9.4 - f7的vue整合
  • lodash ^4.17.4 - 通用工具库
  • moment ^2.17.1 - 时间工具库
  • axios ^0.15.3 - 网络请求
  • eslint ^3.14.1 - 代码质量管理
  • babel-core ^6.22.1 - ES6转译

3.3 目录及用途

  • src/entry/index.js - 应用入口
  • src/entry/index.html - 空白HTML模板
  • src/routes.js - APP路由
  • src/util.js - 工具封装
  • src/assets/fonts - 图标字体,使用IconFont生成
  • src/assets/style - 样式,使用LESS编写
  • src/components - 存放后缀为.vue的组件
  • src/components/index.html - 基础HTML页面结构,不需要改动
  • src/components/index.vue - 初始化空白页面组件,不需要改动
  • src/components/public - 公共组件
  • src/components/console - 控制台相关组件
  • src/components/home - 主界面
  • src/components/manage - 系统管理
  • src/components/playground - 功能展示
  • src/components/showcase - 组件展示
  • src/store - vuex状态
  • static/img - 图片
  • static/mock/api - 后台服务mock
  • static/mock/localstorage - 原生APP中本地变量(LocalStorage)的mock

4 开发进阶

4.1 模块热替换

模块热替换(HMR)是webpack提供的最有用的功能之一。它允许在运行时更新各种模块,而无需进行完全刷新。

它通过WebSocket等技术实现,当修改完一段代码后,直接保存,就可以立即在浏览器上查看到结果,大幅提升开发效率。

4.2 Vue单文件组件

使用Vue实现数据视图绑定以及组件化。

Vue是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层,易于上手,能够为复杂的单页应用提供驱动。

一个最简单的Vue单文件组件内容如下:

1
2
3
4
5
6
<!-- my-component.vue -->
<template>
<div>This will be pre-compiled</div>
</template>
<script src="./my-component.js"></script>
<style src="./my-component.css"></style>

Vue的单文件组件,解决了复杂项目中的全局定义、字符串模板、不支持 CSS、没有构建步骤等痛点。

在同一个文件中,同时包含了内容、样式和功能。

关注点分离不等于文件类型分离,在现代 UI 开发中,我们已经发现相比于把代码库分离成三个大的层次并将其相互交织起来,把它们划分为松散耦合的组件再将其组合起来更合理一些。

在一个组件里,其模板、逻辑和样式是内部耦合的,并且把他们搭配在一起实际上使得组件更加内聚且更可维护。

4.3 基础工具封装

util.js 中封装了一些基础功能,请直接使用,不要再进行重复开发。

  • 复制到剪贴板 - copyToClipboard(msg)
  • 获取URL参数 - getUrlParam(key)
  • 格式化路由名称 - formatRoute(initPage)
  • 服务调用 - svcInvoke(payload, callback)
  • 调试参数打印 - log(msg)
  • 读取APP本地变量 - getLocalStorage(key, callback)
  • 写入APP本地变量 - setLocalStorage(key, value, callback)
  • 读取Vuex状态 - getState(module, key)
  • 写入Vuex状态 - setState(module, obj)
  • 检查对象中的无效键 - checkUndefined(obj)

4.4 Eslint代码检测

ESLint 是一个开源的 JavaScript 代码检查工具。

代码检查是一种静态的分析,常用于寻找有问题的模式或者代码,并且不依赖于具体的编码风格。

对大多数编程语言来说都会有代码检查,一般来说编译程序会内置检查工具。

JavaScript 是一个动态的弱类型语言,在开发中比较容易出错。因为没有编译程序,为了寻找 JavaScript 代码错误通常需要在执行过程中不断调试。ESLint可以让程序员在编码的过程中发现问题而不是在执行的过程中。

Eslint的规则已经配置好,在WebStorm这样的IDE中可以自动识别,直接使用即可。

4.5 Framework7页面结构

Framework7是一个开源的WEB APP前端框架,用于构建IOS 和 Android 风格的应用,它本身提供了很完善的UI组件和工具。

通过F7-Vue插件,Framework7可以和Vue进行整合,它的基础页面结构如下:

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
32
33
34
35
36
<!DOCTYPE html>
<html>
<head>
<!-- ... metas and styles ... -->
</head>
<body>
<!-- App Root Element -->
<div id="app">
<!-- Status bar overlay for full screen mode (Cordova or PhoneGap) -->
<f7-statusbar></f7-statusbar>
<!-- Views -->
<f7-views>
<!-- Your main view, should have "main" prop -->
<f7-view main>
<!-- Pages container, because we use fixed navbar and toolbar, it has additional appropriate props -->
<f7-pages navbar-fixed toolbar-fixed>
<!-- Initial Page -->
<f7-page>
<!-- Top Navbar-->
<f7-navbar title="Awesome App"></f7-navbar>
<!-- Toolbar-->
<f7-toolbar>
<f7-link>Link 1</f7-link>
<f7-link>Link 2</f7-link>
</f7-toolbar>
<!-- Page Content -->
<p>Page content goes here</p>
<f7-link href="/about/">About App</f7-link>
</f7-page>
</f7-pages>
</f7-view>
</f7-views>
</div>
<!-- ... scripts ... -->
</body>
</html>

在调试过程中,页面结构在在vue-devtools中也可以比较方便的查看。

4.6 Vuex状态管理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

以下是一个表示“单向数据流”理念的极简示意:

但当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

  • 多个视图依赖于同一状态。
  • 来自不同视图的行为需要变更同一状态。

Vuex把组件的共享状态抽取出来,以一个全局单例模式管理。在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为。

Vuex的各模块的代码存放于src/store目录中,如果在Mutation中仅做简单的增删改查,可以参考env.js的写法。

如果应用规模继续扩大,模型与REST调用也可以抽离出来,放在这一层的action中。

4.7 环境变量

使用Vuex的env模块来存放环境变量,下面详细解释一下各个环境变量意义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const state = {
appName: '应用名称', // 应用名称
appVersion: '1.0.0', // 版本号
appCopyright: 'Copyright © 2017 公司名称', // 版权信息
profile: 'dev', // 服务环境,可以传入dev/test/prod,以区分开发、测试、生产
apiBaseUrl: '/path/to/proxy', // 服务调用地址
mockApiUrl: 'static/mock/api/', // API Mock的路径
mockLocalStorageUrl: 'static/mock/localstorage/', // LocalStorage Mock的路径
debugTag: 'off', // DEBUG模式的开关
initPage: null, // 初始化页面,中间以.分割,例如传入manage.about,则首页会渲染成/manage/about/。如果不传入,或路由不存在,则渲染默认首页。
staffId: null, // 工号
eparchyCode: null, // 地市
token: null, // 调用后台服务的token
lastUrl: null, // 原生与HTML5混合功能点中,点击左上角返回按钮,将要返回的UIBOX名
nextUrl: null, // 原生与HTML5混合功能点中,点击下一步将要跳到的UIBOX名
}

4.8 页面路由

页面路由,使用了Framework7中集成的routes。

路由信息配置在src/routes.js中,已经做了简单的封装,配置示例如下:

1
2
3
4
5
6
7
export default [
staticRoute('/home/index', '主页'),
staticRoute('/manage/about', '关于'),
staticRoute('/playground/localstoragesave', 'LocalStorage存取'),
staticRoute('/playground/routeparam', '页面间传值'),
staticRoute('/playground/routeparamsub/:id', '页面间传值接收'),
]

每当新增了一个.vue的单文件组件后,仅需要在routes.js中新增一行,写明路由名称与页面标题即可。

路由名称与真实的文件路径是对应的,建议使用二级目录进行管理。

.vue组件中,节点,不需要手工录入标题、class等信息,直接复制下面的模板即可:

1
2
3
4
5
<template>
<f7-page :name="$route.route.name" :class="$route.route.name">
<navbar :title="$route.route.title"></navbar>
</f7-page>
</template>

4.9 图标字体

页面中的图标,统一封装为字体文件,方便加载。

这里使用了阿里巴巴的iconfont来进行制作,网址为: http://www.iconfont.cn/

使用上比较简单,注册好用户后,将选中的图标添加到购物车,或主动上传图标,然后添加到某一个”工程”中,即可导出生成好的字体文件与CSS样式。

字体文件存放于 src/assets/fonts 目录,直接覆盖即可。

4.10 静态资源

静态资源:例如图片和Mock文件,不会被WebPack打包,需要统一存放在 static 目录。

在CSS等代码中,可以用相对路径来进行引用,打包时会自动修改替换URL。

4.11 LESS样式

使用LESS进行样式的开发,WebPack打包后会转译为CSS。

公共的样式文件位于 src/assets/styles 目录,入口是 app.less

mixins.less中,定义了基础的颜色、相对路径等信息,其它的.less中可以直接引用它。

私有的样式,可以直接写在.vue组件中。

4.12 组件展示


代码存放于 src/pages/showcase/ 目录

演示Framework7的各个组件的用法,方便在开发页面时使用。

4.13 功能展示

代码存放于 src/pages/playground/ 目录

演示服务调用、UIBOX跳转等用法。

5 本机调试

5.1 测试URL

运行npm run dev后,默认的测试URL是:

http://127.0.0.1:3000/

也可以在URL中以键值对的方式传入环境变量,例如:

http://127.0.0.1:3000/?debugTag=on&profile=test

PC调试中,一般都会传入debugTag和profile两个环境变量,前者是默认开启DEBUG模式,后者决定REST服务调用是开发、测试、还是生产环境。

所有传入的参数,都会存入名为env的状态中,作为系统环境变量。

请注意,URL传递环境变量的的优先级最高。例如,已经通过URL方式传入了一个staffId的环境变量,那么通过LocalStorage传入的staffId环境变量则不会生效。

5.2 反向代理

反向代理在本机调试时非常有用,可以将前端页面与后端服务拉到同一个域下,在不开启CORS的情况下,前端可以直接调用到后台服务。

生产环境中,反向代理一般用Nginx实现。 本机调试环境中,由于Express已经自带,可以直接在config/index.js中,开启并修改其配置。

配置示例:

1
proxyTable: {'/reverseproxy': 'http://xxx.xxx.xxx.xxx:xxx'},

此时如果访问 http://127.0.0.1:3000/reverseproxy/whatever ,请求会被转发到后面配置的服务器上,而不是访问本机的文件。

5.3 chrome-devtools

推荐使用Chrome浏览器进行调试。Chrome的DevTools,比Safari等浏览器的功能要完善一些。

篇幅原因,具体使用方法不再赘述。

5.4 vue-devtools

vue-devtools是一个Chrome插件,安装后会集成在原有的chrome-devtools里面。

如果页面是使用vue进行开发,且处于开发环境,vue-devtools则会被激活。

GitHub地址: https://github.com/vuejs/vue-devtools

安装比较简单,直接在Chrome商店中搜索即可。

5.5 API Mock

在前端界面复杂的交互逻辑中,需要大量依赖后端REST服务提供的数据来进行驱动。

真实的开发流程中,前端不可能等待后端服务完全写好之后才开始进行开发。

此时就需要API Mock,后端只要将请求/响应的格式约定好,并提供一个简单的样例给前端,保存成静态的.json文件即可。

每个服务的API mock分为两个.json文件,存放于static/mock/api中。

例如登录服务:
login.req.json - 请求报文
login.resp.json - 响应报文

当profile=dev时,网络请求会自动指向这个.json文件,而不是去请求真实的服务。

请注意:API Mock的触发条件是环境变量中 profile=dev

5.6 LocalStorage Mock

LocalStorage,是移动开发平台原生APP的本地变量的,在PC调试的过程中,是无法获取LocalStorage的,这时就需要进行mock。

与API mock类似,也是将内容保存成静态的.json文件,路径位于mock/localstorage,文件名即变量名。

当框架读取LocalStorage时,且发现当前是PC环境时,会自动模拟读取这个.json文件。

请注意:LocalStorage Mock的触发条件是 非真机环境(PC浏览器)

6 真机联调

6.1 真机样式调整

由于真实手机的WebView上样式呈现,与PC端有很多差异,所以界面开发完成后,需要分别对Android和IOS进行真机调试。

Android手机的调试,可以借助Chrome浏览器的DevTool实现,可以在PC上展示DOM节点,CSS样式等,并可以实时修改CSS并在手机上查看到结果。

IOS手机,也可以借助Safari浏览器的DevTool实现,过程类似,不再赘述。

6.2 DEBUG控制台呼出

代码最终会运行在移动开发平台的Shell(类似Cordova)中,经常会有原生<–>HTML5页面间的互相调用,由于缺乏调试工具,且访问原生能力的API不是很完善,联调会变的异常困难。

目前已经开发了一套DEBUG控制台,包含一系列的工具,方便真机情况下的联调。

3秒钟内,连续点击标题栏右上角10次,会激活DEBUG模式。

这时,标题栏右上角会出现一个齿轮图标,点击图标后会在右侧呼出控制台。

6.3 控制台日志

编码过程中,推荐使用util.log(),代替console.log()进行日志输出。

DEBUG模式中,使用util.log()打印的日志,会出现在此处。

请注意,为保证性能,仅保留最新的100条日志。

点击右侧的”复制到剪贴板”按钮后,可以将内容拷贝出来,方便发送到PC查看。

6.4 系统环境变量

在此页面,可以修改所有的环境变量。

例如可以实时变更开发/测试/生产这3个Profile,以便让APP调用不同环境的后台服务。

6.5 服务模拟调用

该功能点提供了一个简易的REST Client,类似PostMan。
输入一段JSON请求后,点击调用可以获取响应。

6.6 页面变量查询

此功能点,会展示主视图中,Vue组件的所有的Data变量。

点击某个变量后,会展开显示其内容,并可以复制到剪贴板。

对应PC端vue-devtools中的位置如下:

6.7 状态查询

可以查看VueX的各个状态(系统相关的env和console这两个状态不会显示) ,实现PC端vue-devtools类似的功能。

6.8 状态写入

在此界面,可以手工添加/修改/删除某个VueX状态的值。
注意,点击重置按钮后,整个状态节点会被清空。

6.9 LocalStorage查询

LocalStorage,是原生外壳的本地变量的,可用于保存应用的状态,也是原生与HTML5交互的唯一手段。

请注意,这里的LocalStorage,虽然名称一样,但并不是浏览器中的那个本地存储。

6.10 LocalStorage写入

此功能点,用于伪造一个LocalStorage,方便真机测试。

输入键值对,点击写入按钮即可。

请注意,变量值一般是JSON字符串。

6.11 模拟登录

打开一个模拟登录界面,登录后会获取一些环境变量并覆盖到env状态中去。

6.12 打开登录界面


弹出内置的登录界面

6.13 页面强制刷新

强制刷新主视图的组件。 这在某些没有启用下拉刷新的页面中非常有用,可以在修改环境变量或其它状态后使用。

请注意,这里的”刷新”是指Vue组件的刷新,并不是指浏览器中的F5刷新。

7 知识储备

在正式动手开发之前,需要对前端开发语言、工具、流程等有一个大概的了解。

以下简单列举了一些官网及教程,可以有选择性的查看。

7.1 JavaScript

https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000

7.2 ES2015

https://babeljs.io/learn-es2015/
http://yanhaijing.com/javascript/2015/09/11/learn-es2015/

7.3 NPM

https://www.npmjs.com/
http://javascript.ruanyifeng.com/nodejs/npm.html
http://www.runoob.com/nodejs/nodejs-npm.html
http://www.jianshu.com/p/e958a74a0fd7

7.4 Webpack

https://webpack.js.org/
https://segmentfault.com/a/1190000006178770
https://llp0574.github.io/2016/11/29/getting-started-with-webpack2/
https://github.com/vuejs-templates/webpack

7.5 Framework7 & F7-VUE

https://framework7.io/docs/
https://framework7.io/vue/

7.6 vue

https://cn.vuejs.org/v2/guide/

7.7 vuex

https://vuex.vuejs.org/zh-cn/

7.8 lodash

https://lodash.com/docs/4.17.4
http://lodash.think2011.net/

7.9 eslint

https://cn.eslint.org/

安装

macOS:

1
brew install git-flow-avh

Ubuntu:

1
apt-get install git-flow

Windows:

1
wget -q -O - --no-check-certificate https://raw.github.com/petervanderdoes/gitflow-avh/develop/contrib/gitflow-installer.sh install stable | bash

初始化

在一个已有的版本库中执行

1
git flow init

默认有master及develop两个长期分支

分支说明

主要分支:

  • master: 永远处在即将发布(production-ready)状态
  • develop: 最新的开发状态

2018-01-22-11-08-40

辅助分支:

  • feature: 开发新功能的分支, 基于 develop, 完成后 merge 回 develop
  • release: 准备要发布版本的分支, 用来修复 bug. 基于 develop, 完成后 merge 回 develop 和 master
  • hotfix: 修复 master 上的问题, 等不及 release 版本就必须马上上线. 基于 master, 完成后 merge 回 master 和 develop

2018-01-22-11-09-25

Feature 新特性

新特性帮助

1
git flow feature help

增加新特性

1
git flow feature start rss-feed

完成新特性

1
git flow feature finish rss-feed

Publish 推送

此部分为可选。新特性分支可以只存在于本机,不向远程仓库推送

推送新特性

可以使用publish命令将一个feature分支推到远程服务器

1
git flow feature publish rss-feed

或者直接:

1
git push origin feature/rss-feed

取得一个发布的新特性分支

1
git flow feature pull origin rss-feed

Release 发布

release分支是基于develop分支的

准备Release

1
2
git flow release start 1.1.5
Switched to a new branch 'release/1.1.5'

现在,可以在release/1.1.5分支,开始最后的准备工作,例如项目里的某些文件需要记录版本号

完成Release

1
git flow release finish 1.1.5

git-flow自动做了以下事情:

  1. 拉取远程仓库,以确保目前是最新的版本。
  2. release的内容会被合并到 master和develop两个分支中去,这样不仅产品代码为最新的版本,而且新的功能分支也将基于最新代码。
  3. 为便于识别和做历史参考,release提交会被标记上这个release的名字(在我们的例子里是 1.1.5)
  4. 清理操作,版本分支会被删除,并且回到develop

Hotfix 紧急修复

hotfix分支是基于master分支的

开始Hotfix

1
git flow hotfix start missing-link

完成Hotfix

1
git flow hotfix finish VERSION

命令汇总

2018-01-22-11-09-49

参考文档

简介

ELK = Elasticsearch + Logstash + Kibana ,是一套非常流行的分布式日志采集、处理、汇总及展示工具。

  • Logstash - 日志采集、过滤,并转发给Elasticsearch
  • Elasticsearch - 搜索引擎,存储、索引、分析日志
  • Kibana - WEB界面,查询并展示Elasticsearch的数据

本文主要介绍ELK日志平台初步搭建及配置。

Elastic官网

https://www.elastic.co/start

安装Elasticsearch

1
2
3
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.0.tar.gz
tar -zxvf elasticsearch-5.6.0.tar.gz
bin/elasticsearch-plugin install x-pack # 安装XPack(可选)

网络不稳定时,可能需要挂$$代理+Proxifier

安装Kibana

1
2
3
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.0-darwin-x86_64.tar.gz
tar -zxvf kibana-5.6.0-darwin-x86_64.tar.gz
bin/kibana-plugin install x-pack # 安装XPack(可选)

安装Logstash

1
2
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.1.tar.gz
tar -zxvf logstash-5.6.1.tar.gz

配置Logstash

vi logstash.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
input {
file {
path => "/opt/logs/busi/playground.log"
ignore_older => 0
sincedb_path => "/dev/null"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
user => "elastic"
password => "changeme"
}
stdout { codec => rubydebug }
}

注意如果安装了XPack,在output中需要配置elasticsearch的用户名及密码

运行

1
2
3
bin/elasticsearch
bin/kibana
bin/logstash -f logstash.conf

登录Kibana控制台

http://localhost:5601

初始用户名密码: elastic/changeme

简介

report-man:一个轻量级的报表自动化工具

对于中小型企业系统,一般没有配套的报表与经分系统进行支撑,但运维过程中经常会有各种报表的需求,报表一般为Excel格式,且内容经常发生变化,需要一套简单灵活的解决方案。

REPORT-MAN的程序本体只有一个可执行jar包,直接使用Excel模板进行配置,可以自动生成报表并发送邮件。支持3种启动方式,简单易用。

功能特性

  • 支持桌面/命令行/WEB应用3种运行模式
  • 无配置文件,在Excel模板中配置全部参数
  • 可以在模版中定义各种复杂的汇总、公式、图表等
  • 以任务为基本单位,配置灵活,支撑不断变化的需求
  • 支持连接多个数据源
  • 支持邮除发送,可使用代理服务器
  • 丰富的自定义参数

技术特性

  • Java实现,基于SpringBoot
  • 使用Gradle构建
  • 使用ApachePOI-XSSF处理Excel2007文件
  • 使用JavaMailSender发送邮件
  • 支持使用SOCKS5代理服务器
  • 全部参数使用Excel配置
  • 使用JdbcTemplate,动态生成数据源
  • 支持查询/更新/删除及建表、建索引等操作
  • 跨平台,多种运行模式
  • 对外提供REST接口,可以配合其它系统使用

使用简介

report-man针对不同的使用场景,提供了3种启动模式

桌面模式

桌面环境下使用,提供一个Swing界面,用于手工生成报表。

界面中可以选择模板路径、报表输出路径,点击按钮直接运行即可。

桌面模式,一般用于对SQL语句进行微调后(例如修改起止时间),手工执行生成报表的场景。

命令行模式

服务器环境下,提供了一个命令行模式,用于后台静默执行。

一般会配合crontab定时生成报表并发送邮件。

crontab示例:

1
2
3
4
5
每天23:40执行
40 23 * * * cd /foo/bar && ./reportman.sh 模版名称

每周三23:45执行
45 23 * * 3 cd /foo/bar && ./reportman.sh 模版名称

WEB模式

WEB模式对外提供了一个开放的REST接口。可以在其它系统中开发一个简单的界面,调用report-man的REST接口,生成报表并发送邮件。

应用默认端口为19090,内嵌一个Swagger-UI界面可以方便的进行测试。

示例参数:

1
2
3
4
5
6
{
"file.prefix": "demo",
"mail.to.list": "foo@bar.com",
"sql.start_date": "2017-10-1",
"sql.end_date": "2017-10-31"
}

成功响应:

1
2
3
4
{
"code": "0000",
"message": "报表生成中,稍后会发送至您的邮箱。请不要重复点击生成报表。"
}

说明

  1. file.prefix为必填,指定了基础的模板名称
  2. 其它参数可以灵活添加。会追加在Sheet2的参数配置中。如果参数名称相同,则会覆盖Sheet2中的参数。
  3. 接口是异步的,调用后会立即返回成功消息。如果SQL较复杂,可能会后台运行一段时间。

启动脚本

为了方便使用,report-man提供了两个启动脚本

Windows环境 启动脚本

Windows环境下,只提供了一个桌面版本的启动入口,直接点击reportman.cmd即可。

1
./reportman.cmd

Linux/macOS环境 启动脚本

Linux以及macOS下,提供了一个全功能的启动脚本,可以支持3种启动方式。

直接输入./reportman.sh可以查看帮助信息

以下为示例:

1
2
3
4
./reportman.sh gui        #启动桌面版本
./reportman.sh cli demo #启动命令行版本,其中demo为模版名称
./reportman.sh web start #启动WEB版本
./reportman.sh web stop #停止WEB版本

运行流程

程序启动后,会首先载入模板文件,根据模版中提前定义好的各种参数,连接数据库读取结果集,并将结果填充到模板的指定区域。最终生成完整的Excel报表,并发送邮件。

步骤 解释
1 载入模板文件
2 读取Sheet1的任务配置
3 读取Sheet2的参数配置
4 循环执行全部任务
5 删除前2个配置Sheet页
6 刷新Excel公式
7 保存Excel
8 发送邮件

配置详解

模板中的前2个Sheet页为配置专用。
Sheet1任务配置,用于定义需要执行SQL语句,对应的数据源,以及结果集显示的区域等。
Sheet2参数配置,用于定义各种参数,如邮件收件人、代理服务器、数据源的用户名密码等。
从第3个Sheet页开始是内容页面,可以有多个Sheet页,需要提前定义好表头、样式、汇总函数、图表等。将需要填充内容的区域留空。

Sheet1-任务配置

任务配置,存放于Sheet1中

表样截图

字段解释

名称 解释
任务名称 任务的中文说明
生效标识 Y-生效/N-失效。
数据源 数据源名称。数据源的详细参数需要在Sheet2中配置。
SQL 查询SQL语句。
SHEET页 结果集显示的Sheet页。因为前两页是配置专用,所以数值需要从3开始。
横向坐标 结果集起始的横向X轴坐标。数值从1开始。
纵向坐标 结果集起始的纵向Y轴坐标。数值从1开始。
单元格样式 LEFT-左对齐/CENTER-居中对齐

配置示例

任务名称 生效标识 数据源 SQL SHEET页 横向坐标 纵向坐标 单元格样式
预计使用人数 N mobsale select foo from bar 3 3 3 CENTER
累计登录次数 N mobsale select foo from bar 3 5 3 CENTER
累计登录人数 N mobsale select foo from bar 3 6 3 CENTER
本日登录次数 Y mobsale select foo from bar 3 7 3 CENTER
本日登录人数 N mobsale select foo from bar 3 8 3 CENTER
使用清单 N mobsale select foo from bar 4 1 2 LEFT
工号使用情况 N mobsale select foo from bar 5 1 2 LEFT

说明

  1. spider-man会读取所有”生效标识”为Y的任务,并依次执行
  2. 对于select语句,执行后会生成一个x行y列的结果集
  3. 结果集会写入Excel的特定的Sheet页的特定区域,具体可以配置”SHEET页”、”横向坐标”、”纵向坐标”3个参数
  4. 单元格样式可以配置成”LEFT”(左对齐)或”CENTER”(居中对齐)
  5. 支持update/insert/create table/create index等语句,一般用于生成中间表。此类语句不需要指定Sheet页及坐标。
  6. SQL语句中可以插入参数占位符,格式为${param_name}。参数的值可以在Sheet2中定义。

Sheet2-邮箱配置

邮箱配置,存放于Sheet2中

表样截图

配置示例
参数名称|键|值
–|–|–
邮件-发送开关|mail.enable|Y
邮件-收件人|mail.to.list|foo@bar.com
邮件-抄送人|mail.cc.list|yourname@qq.com
邮件-标题|mail.subject|XXX系统业务日报表
邮件-附件名|mail.attachment|业务报表
邮件-正文|mail.message|您好:
邮件-服务器IP|mail.smtp.host|smtp.qq.com
邮件-服务器端口|mail.smtp.port|465
邮件-用户名|mail.sender.username|yourname@qq.com
邮件-密码|mail.sender.password|blablablablabla
邮件-发件人|mail.from|yourname@qq.com
邮件-代理服务器开关|mail.proxy.enable|Y
邮件-代理服务器IP|mail.proxy.host|127.0.0.1
邮件-代理服务器端口|mail.proxy.port|1080

说明

  1. 注意键的命名mail.xxx是固定的,请不要随意增删。
  2. 代理服务器类型必须为SOCKS4/5
  3. 附件名称如果为中文,最好不要超过4个汉字

Sheet2-数据源配置

数据源配置,存放于Sheet2中

MySQL数据源示例

参数名称
数据源类型 db.testdb.driver com.mysql.jdbc.Driver
数据源地址 db.testdb.url jdbc:mysql://127.0.0.1:3306/dbname
数据源用户名 db.testdb.username yourname
数据源密码 db.testdb.password yourpass

Oracle数据源示例

参数名称
数据源类型 db.testdb.driver oracle.jdbc.driver.OracleDriver
数据源地址 db.testdb.url jdbc:oracle:thin:@127.0.0.1:1521:sid
数据源用户名 db.testdb.username yourname
数据源密码 db.testdb.password yourpass

说明

  1. 键的格式为:db.xxx.yyy。xxx是自定义的数据源名称。yyy是固定的,不要随意修改。

Sheet2-SQL参数配置

SQL参数配置,存放于Sheet2中

配置示例
参数名称|键|值
–|–|–
SQL参数|sql.start_date|2010-1-1
SQL参数|sql.end_date|2012-1-1

说明

  1. SQL参数的格式为sql.xxx,其中xxx为参数名。
  2. SQL参数的值,会替换Sheet1中SQL语句中的占位符,从而拼成完整的的SQL语句。
  3. 例如:sql.end_date = 2012-1-1这一行配置,会将Sheet1中SQL语句里的${end_date}这个占位符替换为2012-1-1

Sheet3~SheetN 模版配置详解

表样截图

模版配置非常灵活,可以根据需求配置多个Sheet页。

模版Sheet页中中主要是预先定义好表头、颜色、Excel公式等。数据部分留空,等待程序运行后填入。

一般而言,可以分为详单页、汇总页、函数页这3类。

详单页

展示一个详单,行数不确定。
只需要定义好一个表头即可,从每二行开始,都是自动填充的详单数据。

汇总页

行数、列数是固定的,用于展示SUM出来的汇总数据。

汇总页的提取,如果SQL比较复杂,可以分开配置多个任务,每个任务只填充特定的一列数据。

函数页

与汇总页类似,但本身并没有填充数据,而是填接使用Excel函数,获取其它Sheet页的原始数据,并进行加工与展示。

注意,如果报表中存在SUMPRODUCT函数,POI正常情况下不会计算最终结果,需要打开Excel后手工执行Ctrl+Alt+F9进行刷新。
但可以在函数后面加入+(NOW()*0)参数,强制POI计算结果。
例如: =SUMPRODUCT(('业务发展-按个人'!$A$2:A$9999=O4)*('业务发展-按个人'!$B$2:B$9999="营维经理")*'业务发展-按个人'!H$2:H$9999)+(NOW()*0)

服务器部署

  • 运行环境要求:JRE版本1.7及以上。
  • 在本机执行gradle build构建项目,将生成的build/libs/report-man-1.0.jar上传至服务器。
  • 在jar包所在路径下新建template及report两个目录。其中template中存放模板,report目录用于存放生成的报表。
  • 可以使用crontab -e配置定时执行

关于响应

老的HTTP+JSON RPC接口,无论成功/失败,响应格式一般是固定的,例如:

1
2
3
4
5
6
7
8
{
"code":"000",
"message":"成功",
"data":{
"productId":"123",
"productName":"产品名称"
}
}

REST风格接口中,一般是这样处理:
如果业务处理成功,HTTP STATUS返回2XX,BODY直接返回业务内容:

1
2
3
4
{
"productId":"123",
"productName":"产品名称"
}

如果业务处理失败,HTTP STATUS返回4XX或5XX,这时才会展现报错信息:

1
2
3
4
{
"code":"999",
"message":"失败原因"
}

业务成功和业务失败,会对外使用两套不同的模型。

Swagger中的展示

Swagger中默认只会展示业务处理成功时的模型:

Response Messages中的Response Model不会显示:

如果吹毛求疵的话,我们需要将业务失败时模型的内容展示出来,例如这样:

注解方式配置

使用注解方式,可以单独为一个API配置Response Model

1
2
3
4
5
6
@ApiResponses({
@ApiResponse(code = 400, message = "业务逻辑异常", response = ApiError.class),
@ApiResponse(code = 407, message = "XX异常", response = ApiError.class),
... ...
@ApiResponse(code = 500, message = "服务器内部错误", response = ApiError.class)
})

这样做的缺点显而易见,每个Controller上都会有一大堆的、重复的@ApiResponses注解,以至于把正常的业务代码淹没。

全局配置

通过Swagger的全局配置,可以自定义默认的Response Model。

首先,在任何一个Controller上,添加至少一个@ApiResponses注解,标明response的类。

1
@ApiResponses({@ApiResponse(code = 500, message = "服务器内部错误", response = ApiError.class)})

然后,在Swagger配置类的Docket上加入globalResponseMessage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Bean
public Docket userApi() {
List<ResponseMessage> responseMessageList = new ArrayList<>();
responseMessageList.add(new ResponseMessageBuilder().code(404).message("找不到资源").responseModel(new ModelRef("ApiError")).build());
responseMessageList.add(new ResponseMessageBuilder().code(409).message("业务逻辑异常").responseModel(new ModelRef("ApiError")).build());
responseMessageList.add(new ResponseMessageBuilder().code(422).message("参数校验异常").responseModel(new ModelRef("ApiError")).build());
responseMessageList.add(new ResponseMessageBuilder().code(500).message("服务器内部错误").responseModel(new ModelRef("ApiError")).build());
responseMessageList.add(new ResponseMessageBuilder().code(503).message("Hystrix异常").responseModel(new ModelRef("ApiError")).build());

return new Docket(DocumentationType.SWAGGER_2)

.globalResponseMessage(RequestMethod.GET, responseMessageList)
.globalResponseMessage(RequestMethod.POST, responseMessageList)
.globalResponseMessage(RequestMethod.PUT, responseMessageList)
.globalResponseMessage(RequestMethod.DELETE, responseMessageList)

.build()
.apiInfo(apiInfo());

}

请注意第一条不能省略,new ModelRef(“ApiError”),会查询之前定义@ApiResponse的response中指定的class

简介

Zipkin是一套Twitter开发的开源的APM工具 (Application Performance Management) ,可以用于微服务的调用链监控。

类似的APM系统还有:PinPoint、Google Dapper、淘宝鹰眼等。

相比起PinPoint,Zipkin的优势是语言无关性,但是对代码有一定的入侵。

Zipkin包含4个组件:

  • Collector 收集器
  • Storage 存储,默认是InMemory
  • API 查询接口
  • UI WEB界面

运行示意图:

官网及GitHub

服务端安装及运行

Zipkin服务端提供了多种运行方式,都很简便。使用源码方式可以有更多的可定制性。

Docker方式

Docker方式:

1
docker run -d -p 9411:9411 openzipkin/zipkin

JAR包方式

1
2
wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
java -jar zipkin.jar

源码方式

pom.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
</dependencies>

application.yml:

1
2
server.port: 9411
spring.application.name: zen-zipkin

服务端WEB界面

服务端启动后,以在浏览器中看一下WEB界面是否正常:
http://localhost:9411

微服务端配置

pom.xml:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

application.yml:

1
2
3
4
5
6
7
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
percentage: 1.0

其中percentage是采样率,默认0.1

当微服务启动后,就可以在Zipkin的界面中进行调用链的监控了:

nmtui文本图型界面

全称: NetworkManageTextUser Iterface

推荐做为首选配置方式

1
nmtui

nmcli纯文本界面

全称: NetworkManageCommandLine Interface

查看网络:

1
nmcli d 

常用参数:

1
2
3
4
5
6
7
g[eneral]       NetworkManager's general status and operations
n[etworking] overall networking control
r[adio] NetworkManager radio switches
c[onnection] NetworkManager's connections
d[evice] devices managed by NetworkManager
a[gent] NetworkManager secret agent or polkit agent
m[onitor] monitor NetworkManager changes

配置文件

1
2
3
4
5
6
7
vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=enp3s0
ONBOOT=yes
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1

其它

启停网络

1
2
ifdown enp0s3
ifup enp0s3

ip取代ifconfig

1
ip addr

ip与ifconfig的对应关系:

相关资源

官网

PDF下载

软件部署指南PDF下载

  • 了解产品/Atlas 200 用户指南.pdf
  • 了解产品/华为服务器 安全信息.pdf
  • 安装升级/Atlas 200 DDK安装指南(CentOSX86).pdf
  • 安装升级/Atlas 200 DDK安装指南(UbuntuX86).pdf
  • 安装升级/Atlas 200 源码编译安装指南.pdf
  • 安装升级/Atlas 200 软件开发指南.pdf
  • 参考指南/Atlas 200 IDE-daemon-client命令参考.pdf
  • 二次开发/Atlas 200 DVPP API参考.pdf
  • 二次开发/Atlas 200 GE API参考.pdf
  • 二次开发/Atlas 200 Matrix API参考.pdf
  • 二次开发/Atlas 200 TE API参考.pdf
  • 二次开发/Atlas 200 TE自定义算子开发指导 (命令行方式).pdf
  • 二次开发/Atlas 200 应用软件开发指导书.pdf
  • 二次开发/Atlas 200 模型转换指导.pdf
  • 二次开发/Atlas 200 硬件开发指南.zip
  • 二次开发/Atlas 200 算子清单.pdf
  • 二次开发/Atlas 200 高性能应用编程用户手册.pdf

文章收集

初步了解

Atlas 200 DK

华为Atlas 200 DK AI开发者套件是以昇腾310芯片为核心的一个开发者板形态产品,帮助AI应用的开发者快速熟悉开发环境。

其主要功能是将昇腾310芯片的核心功能通过该板上的外围接口开放出来,方便用户快速简捷的接入并使用昇腾310芯片强大的处理能力。

Atlas 200 DK配备一个核心部件Atlas 200 AI加速模块,通过高速连接器将昇腾310芯片的主要业务接口通过底板扩展出来。

得益于昇腾芯片的全栈全场景能力,基于Atlas 200 DK AI开发者套件开发的程序只需一次开发,即可实现端、边、云全场景部署。

可以运用于平安城市、无人机、机器人、视频服务器、闸机等众多领域的开发。

2019-10-28-15-01-35

昇腾310 AI芯片

华为在全联接大会2018上,首次宣布了华为的AI战略以及全栈解决方案。与此同时,华为发布了自研云端AI芯片“昇腾(Ascend )”系列,基于达芬奇架构,首批推出7nm的昇腾910以及12nm的昇腾310。

昇腾310芯片的最大功耗仅为8W,主打极致高效计算低功耗AI芯片。半精度(FP16)运算能力8TFLOPS,整数精度(INT8)16TOPS,支持16通道全高清视频解码(H.264/265)。

Mind Studio

Mind Studio是一套基于华为昇腾AI处理器开发的AI全栈开发平台,提供了自定义算子的开发,网络层的网络移植、优化和分析等功能,另外在业务引擎层提供了一套可视化的AI引擎拖拽式编程服务,内置了丰富的高性能算子库,极大的降低了AI应用程序的开发门槛。

Mind Studio是基于Eclipse CHE架构的集成开发环境。
其中:
DDK(Device Development Kit),为开发者提供了基于Ascend芯片的算法开发工具包,包括Host侧及Device侧开发编译时所依赖的库,开发机(UI Host)使用的工具及依赖库,以及一些公共头文件、第三方依赖库、DDK样例等

其中:
Host指与Device相连接的X86服务器、ARM服务器或者WindowsPC,会利用Device提供的NN(Neural-Network)计算能力完成业务。

Device指安装了Ascend 310处理器的硬件设备,利用PCIe接口与Host侧连接,为Host提供NN计算能力。

对于Atlas 200 DK,Ascend 310处理器所在硬件设备与与之相连接的ARM服务器合设,统称为Host。

开发机(UI Host):指Mind Studio所在服务器。

Mind Sutdio的IDE Plugins集成了层的各个工具模块(如模型管理工具(OMG/OME)、调试器、性能分析工具、日志工具、性能调优工具等),为用户提供简洁、友好的图形化编码、编译、调试、性能分析平台

2019-10-28-14-57-13

环境搭建准备

教程学习

整体架构

2019-10-30-09-09-59

安装介质及工具下载

MindStudio部署

安装Ubuntu系统

  • MindStudio需要安装在Ubuntu系统下
  • 版本号最好是16.04.3,且与接下来的SD卡中的Ubuntu系统版本号保持一致
  • 可以使用虚拟机方式安装,也可以直接装到PC机上

安装依赖

1
sudo apt-get install gcc g++ cmake curl libboost-all-dev libatlas-base-dev unzip haveged liblmdb-dev python-skimage python3-skimage python-pip python3-pip libhdf5-serial-dev libsnappy-dev libleveldb-dev swig python-enum python-future make graphviz autoconf libxml2-dev libxml2 libzip-dev libssl-dev sqlite3 python

安装JDK

1
sudo apt install openjdk-8-jdk
1
2
3
4
vi ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

注意,必须添加JAVA_HOME和PATH

添加sudoers权限

1
2
3
4
5
6
7
8
su root
chmod u+w /etc/sudoers
vi /etc/sudoers

在`# User privilege specification`下面插入:
yourname ALL=(ALL:ALL) NOPASSWD:SETENV:/usr/bin/apt-get

chmod u-w /etc/sudoers

安装MindStudio

介质准备:

  • mini_mind_studio_Ubuntu.rar
  • MSpore_DDK-1.3.T34.B891-x86_64.ubuntu16.04-aarch64.ubuntu16.04-aarch64.ubuntu16.04.tar.gz

    注意先提前解压mini_mind_studio_Ubuntu.rar
    MSpore_DDK放置到相同目录即可,不要解压

执行安装脚本:

1
2
sudo ./add_sudo.sh yourname
./install.sh

配置交叉编译环境

如果接下来制卡所用到的的Host主机和安装MindStudio的主机是同一台,则可以省略掉此步骤

  1. 解压HuaweiAscend-tools-master.zip
  2. su -到root用户下
  3. 安装依赖并执行make_ui_cross_env.py脚本
    1
    2
    3
    4
    5
    pip3 install pexpect

    apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

    python3 make_ui_cross_env.py

制卡

硬件准备

提前采购:

  • TF卡,16G以上
  • 树霉派兼容摄相头

安装依赖

1
sudo apt-get install qemu-user-static binfmt-support python3-yaml gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

介质准备

  • ubuntu-16.04.3-server-arm64.iso
  • mini_developerkit-1.3.T34.B891.rar
  • HuaweiAscend-tools-master.zip

    放到同一目录下,只解压HuaweiAscend-tools-master.zip

制做SD卡

  1. 解压HuaweiAscend-tools-master.zip,得到make_sd_card.pymake_ubuntu_sd.sh
  2. fdisk -l命令查找SD卡所在的USB设备名称,例如/deb/sdb
  3. 执行制卡脚本
    1
    python3 make_sd_card.py local /dev/sdb`

    USB虚拟网卡方式连接Atlas200DK

  4. 将SD卡插入AtlasDK,上电
  5. 使用USB TypeC链接AtlasDK
  6. 执行IP配置脚本./configure_usb_ethernet.sh,为虚拟网卡分配一个192.168.1.166的IP地址
  7. ping 192.168.1.2 测试

    默认的USB网卡的IP地址为192.168.1.2,NIC网卡的IP地址为192.168.0.2

网线方式连接Atlas200DK

  1. 使用网线连接Atlas DK
  2. 若使用虚拟机,再添加一个虚拟网卡,类型为Bridged,桥接到物理有线网卡上。
  3. 修改/etc/network/interface配置,添加一个192.168.0网段的虚拟IP
    1
    2
    3
    4
    5
    6
    vi /etc/network/interface

    auto enp0s6
    iface enp0s6 inet static
    address 192.168.0.13
    netmask 255.255.255.0
  4. 修改NetworkManager.conf
    1
    2
    vi /etc/NetworkManager/NetworkManager.conf
    managed=true
  5. 重启服务
    1
    2
    service networking restart
    service NetworkManager restart

    SSH登录开发板

    1
    ssh HwHiAiUser@192.168.0.2

    默认密码 Mind@123

使用Mind Studio

启停MindStudio

1
2
~/tools/bin/start.sh
~/tools/bin/stop.sh

Mind Studio

接下来可以在Ubuntu中直接使用Chrome浏览器打开MindStudio Web页面

如果使用虚拟机方式安装的Ubuntu,也可以宿主机中打开页面

MindStudio https://10.211.55.13:8888/

初始用户名密码为: MindStudioAdmin/Huawei123@ ,新密码改为: yourpassword

注意,需要使用Chrome浏览器,不能用FireFox访问
IP地址,端口在~/tools/script/env.conf中配置

Profiling工具

MSVP https://10.211.55.13:8099

初始用户名密码为: msvpadmin/Admin12#$ ,新密码改为: yourpassword

简单编排案例

  1. 新建工程,注意Target选择AtlasDK
    2019-10-31-14-41-39
  2. 拖拉拽
    2019-10-31-14-40-55
  3. Build -> Run
  4. 可以在最后一个节点右键查看结果

图像分类应用

  1. clone示例应用及模型到Host

    1
    2
    git clone https://github.com/Ascend/sample-classification
    git clone https://github.com/Ascend/models/blob/master/computer_vision/classification/alexnet/alexnet.om

    注意在GitHub上下载模型时,由于是大型二进制文件,所以默认启用了Git LFS,不能直接clone

  2. 配置环境变量

    1
    2
    3
    4
    5
    vi ~/.bashrc
    export DDK_HOME=/home/yourname/tools/che/ddk/ddk
    export LD_LIBRARY_PATH=$DDK_HOME/uihost/lib

    source ~/.bashrc
  3. 运行部署脚本

    1
    ./deploy.sh 192.168.0.2 internet

    internet是指在线部署,需要全程联网

  4. 将模型git/models/computer_vision/classification/alexnet/alexnet.om上传到Device的~/models目录
    将Host中的模型/home/yourname/Downloads/Resnet18.om上传到Device的~/models目录

  5. 准备好一张示例图片,分辨率为224*224,上传到Device的~/HIAI_PROJECTS/ascend_workspace/classification/out目录
    sample picture 224x224

  6. SSH到Atlas200DK,并执行示例应用

    1
    2
    3
    4
    5
    6
    7
    ssh HwHiAiUser@192.168.0.2
    # Mind@123

    cd ~/HIAI_PROJECTS/ascend_workspace/classification/out

    ~~python3 run_classification.py -m ~/models/alexnet.om -w 227 -h 227 -i ./sonic.jpg -n 10~~
    python3 run_classification.py -m ~/models/Resnet18.om -w 224 -h 224 -i ./224x224.jpg -n 10

目标检测应用

此示例未验证成功,第3步模型转换失败

  1. clone示例应用及模型到Host
    1
    git clone https://github.com/Ascend/sample-objectdetection
  2. 下载原始网络模型文件及其对应的权重文件
    下载页面
    • test.prototxt
    • faster_rcnn.caffemodel
  3. 模型是基于Caffe的Faster RCNN模型,需要将其转换为Davinci模型
    在Mind Studio操作界面的顶部菜单栏中选择Tool > Convert Model
    模型转换成功后,后缀为.om的Davinci模型放在~/tools/che/model-zoo/my-model/fast_rcnn
  4. 配置环境变量
    1
    2
    export DDK_HOME=/home/yourname/tools/che/ddk/ddk
    export LD_LIBRARY_PATH=$DDK_HOME/uihost/lib
  5. 部署脚本
    1
    ./deploy.sh 192.168.0.2 internet
  6. 上传.om模型到开发板的/home/HwHiAiUser/models
  7. 运行
    1
    2
    3
    4
    ssh HwHiAiUser@192.168.0.2
    # Mind@123
    cd ~/HIAI_PROJECTS/ascend_workspace/objectdetection/out
    python3 run_object_detection_faster_rcnn.py -m ~/models/faster_rcnn.om -w 800 -h 600 -i ./example.jpg -o ./out -c 21