go从1.11版本开始,实验性的加入了`WebAssembly`的支持。
## `hellow world`程序
```go
package main
import "fmt"
func main() {
fmt.Println("Hello, WebAssembly!")
}
```
设置go编译`WebAssembly`环境变量值,`GOOS=js`和`GOARCH=wasm`。
设置方法有两种:
- 修改默认变量值,执行命令:`go env -w GOOS=js GOARCH=wasm`
- 编译的时候指定值:`cd`到项目根目录,执行命令:`GOOS=js GOARCH=wasm go build -o main.wasm`
这时将生成一个`main.wasm`文件,`.wasm`后缀的文件可以通过`http`设置合适的`Content-Type`http头来使用。
需要注意的一点是,只能编译`main`包,否则是不能在`WebAssembly`里面使用的。
**在浏览器里面运行`main.wasm`**
...
material-ui的官方示例css都是用`makeStyles`创建的,用在`function`组件上。
但是如果我用的是`class`组件该怎么用呢?答案是用不了。
`makeStyles`只能用在`function`组件上,要在`class`组件上使用需要用`withStyles`。
用法如下:
```js
import React, { Component } from 'react';
import { withStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
const styles = {
root: {
background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
border: 0,
borderRadius: 3,
boxShadow: '0 3px 5px 2px rgba(255, 105...
场景是我们在本地电脑上安装了git,并初始化了一个测试仓库,但是并没有安装`gitlab`这种东西,那我们怎么可以通过`url`来`git pull`和`git push`仓库的内容呢。
这里以linux系统为例,在不再多添加其他依赖的情况下操作。
测试仓库路径`/home/dev/git/test`,初始化仓库的时候需要初始化成一个裸仓库`git init --bare`,否则需要做一些其他设置才能正常`push`。
1. 和git仓库在同一台电脑上面
这种情况可以用`file`协议来操作就可以,`git clone file:///home/dev/git/test`。
比如你在本机测试`Jenkins`的时候,配置`Pipeline`的git仓库,就可以这样填写仓库地址:`file:///home/dev/git/test`。
2. 在不同电脑上面操作git仓库
这种情况可以用ssh协议来操作,`git clone ssh://dev@192.168.2.199:/home/dev/git/test`,`dev`是登录用户。
`19...
protocol buffers(简称**protobuf**)是google搞的,是用来序列化数据的一种数据格式,类似于json、xml等这种。
本文其他概念不讲直接讲基本用法了。
首先需要定义数据结构,数据结构定义写在一个扩展名是`.proto`的文本文件里面,这个文件叫做`proto`文件。
protobuf的数据叫`message`,每一个消息都是一系列名值对,我们把他叫做`fields`,当然还有更复杂的结构,这就不在这里讨论了。
例如:
```
syntax = "proto3"; #版本
package tutorial; #包名
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
```
`package`包名是为了避免不同项目的名字冲突。
上面就是我们定义的数据结构,然后用protobuf的编译器`protoc`去生成指定语言的数据访问代码,提供了简便的方法来操作整个结构的二进制数据。
pr...
**editor config**:
```javascript
ClassicEditor
.create( editorElement, {
ckfinder: {
uploadUrl: '/ckfinder/upload.php' #配置上传地址
}
} )
.then( ... )
.catch( ... );
```
`uploadUrl` response format,服务器响应格式:
```json
{
"uploaded ": true,
"error": {
"message": "no error"
},
"url": "https://example.com/upload/images/213432434.png"
}
```
```json
{
"uploaded ": false,
"error": {
"message": "file extension not allow"
...
利用RabbitMQ来做一个RPC的客户端和服务端。
输出斐波那契数列为例子。
rpc_server.php:
```php
...
Routing那一文是日志系统还是有不足的地方,如果我们想既基于选择和发送消息的来源来接收日志呢?
比如像Linux的`syslog`一样,可以基于消息的级别(info/warn..),产生消息的来源(auth/cron)来记录日志。
要实行这样的功能,就需要`topic`类型的exchange了。
`topic`类型的exchange,`routing_key`参数值不能随便设置,需要是一个点(`.`)分隔的词列表,词可以随意设置,一般是使用有意义的内容。比如`stock.usd.nyse`,数据长度是最大是255个字符。
`binding key`也是同样的格式,可以有两个特殊的字符:
- `*`:匹配单个词。
- `#`:匹配0个或多个词。
比如`*.orange.*`、`lazy.#`,这里的词指的是点分隔的完整字符。
生产者:
```php
...
接着上篇发布-订阅的日志记录,如果只订阅消息的子集,比如,只记录错误日志到硬盘,全部的消息打印出来,那么就需要用到这里要讲的内容了。
`exchang`的绑定操作可以传递一个叫`routing_key`的额外参数,这里把它称为`binding key`。
```php
$binding_key = 'black';
$channel->queue_bind($queue_name, $exchange_name, $binding_key);
```
`binding key`依赖于`exchange`的类型,`fanout`类型是会忽略这个值的。
在日志系统里面,如果需要根据消息级别过滤消息,就是不同的订阅者收到不同级别的错误日志消息会有不同的处理方式。
之前用的`fanout`exchange类型就不行了,这个类型只能广播消息,而没有其他的灵活性了。
这里的需求需要用`direct`exchange类型来代替,这种类型的算法是消息会推送到`binding key`和`routing key`相同的队列。
> 这里`binding ke...
一个消息分发给多个消费者,这就叫做发布-订阅模式。
作为示例,这里构建一个日志系统,由两部分组成,一个是发送日志消息,另一个是接收和打印。
**exchange**
`exchange`就是接收生产者的消息,然后推送给队列的一个东西,类似邮局。
`exchange`有几种类型,`direct`, `topic`, `headers` 和`fanout`。
不同的`exchange`类型会有不同的行为,各种类型的使用在后续文章会有介绍,这里我们先只关注最后一种。
`$channel->exchange_declare('logs', 'fanout', false, false, false);`
`fanout`类型是广播消息到所有已知的队列。
创建一个名字是`logs`的`exchange`。
```php
$channel->exchange_declare('logs', 'fanout', false, false, false);
$channel->basic_publish($msg, 'logs');
```
...
我这里说的日志是应用日志,比如Web api 出现的一些异常,错误信息等,收集到一起,方便查询检索。
基本架构是,应用把出现的异常错误信息发送到MQ,再存储到数据库,然后提供一个web前端可以查看和检索。
ELK的主要组件如下:
- elasticsearch:存储数据的地方
- kibana:可视化数据的web前端
- logstash:数据中转的地方,可以收集数据,过滤转换之后存储起来,输入和输出都可配置,默认是elasticsearch,也可以是其他数据库。
- beats:这个是收集特定数据的一组轻量级工具,可以单独安装用来收集特定数据,比如nginx的日志,系统日志,或者是系统监控信息等,这组工具的信息可以直接写入到`elasticsearch`,也可以通过`logstash`写入。和上面三个工具集成度很高,只需要很少的配置就可以完成收集安装。
这里我只是收集应用日志,所以暂时不需要用到`beats`。
数据流向图:
![流向图](/upload/image/2018/cb0e6a6b22865cfa8524b91ca0120407....