咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

环境和实现效果:

  1. 两台阿里云服务器做集群

    服务器 1 (主):内网(10.0.0.1)外网(118.0.0.1)
    服务器 2 (从):内网(10.0.0.2)外网(118.0.0.2)

  2. 安装emq

    1
    2
    $ wget https://www.emqx.io/static/brokers/emqttd-ubuntu16.04-v2.3.11.zip
    $ unzip emqttd-ubuntu16.04-v2.3.11.zip
  3. 配置

    1
    2
    3
    4
    $ vim emqttd/etc/emq.conf

    node.name = emq@内网IP
    mqtt.allow_anonymous = false
  4. 系统调优

    切换到root账号操作比较方便

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ vim /etc/security/limits.conf
    ubuntu soft nofile 65535
    ubuntu hard nofile 65535
    root soft nofile 65535
    root hard nofile 65535
    * soft nofile 65536
    * hard nofile 65536
    * soft nproc 102400
    * soft memlock unlimited
    * hard memlock unlimited
    1
    2
    3
    4
    $ sysctl -w fs.file-max=2097152
    $ sysctl -w fs.nr_open=2097152
    $ echo 2097152 > /proc/sys/fs/nr_open
    $ ulimit -n 1048576
    1
    2
    3
    4
    $ vim /etc/sysctl.conf
    fs.file-max = 1048576
    $ vim /etc/systemd/system.conf
    DefaultLimitNOFILE=1048576
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sysctl -w net.core.somaxconn=32768
    sysctl -w net.ipv4.tcp_max_syn_backlog=16384
    sysctl -w net.core.netdev_max_backlog=16384
    sysctl -w net.ipv4.ip_local_port_range='1000 65535'
    sysctl -w net.core.rmem_default=262144
    sysctl -w net.core.wmem_default=262144
    sysctl -w net.core.rmem_max=16777216
    sysctl -w net.core.wmem_max=16777216
    sysctl -w net.core.optmem_max=16777216
    sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
    sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'
  5. 加入集群

    1
    2
    3
    4
    5
    # 以root账号运行
    $ ./bin/emqttd start

    # 在节点运行
    $ ./bin/emqttd_ctl cluster join emq@10.0.0.1
  6. 退出集群

    1
    2
    3
    4
    5
    #本节点退出集群
    $ ./bin/emqttd_ctl cluster leave

    #从集群删除其他节点
    $ ./bin/emqttd_ctl cluster remove emq@s2.emqtt.io
  7. 负载均衡

    省略

环境和实现效果:

  1. 一台虚拟机安装Kafka
  2. 本地基于SpringBoot使用Kafka Client

安装zookeeper

1
2
3
4
5
root@bogon:~# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
root@bogon:~# tar zxf zookeeper-3.4.13.tar.gz
root@bogon:~/zookeeper-3.4.13/conf# cp zoo_sample.cfg zoo.cfg
root@bogon:~/zookeeper-3.4.13/conf# cd ../bin/
root@bogon:~/zookeeper-3.4.13/bin# ./zkServer.sh start

安装Kafka

阅读全文 »

环境和实现效果:

  1. 两台服务器安装EMQ实例监听1883端口(两个EMQ节点要做集群)
  2. 一台负载均衡服务器NGINX监听1883端口
  3. 客户端连接负载均衡服务器,连接分配到EMQ服务器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#TCP负载均衡
stream {
upstream mqtt1883{
server 192.168.0.223:1883 weight=1;
server 192.168.0.224:1883 weight=1;
}
server {
listen 1883;
#proxy_send_timeout 2h;
#proxy_read_timeout 2h;
#proxy_connect_timeout 150s;
#proxy_timeout 150s;
proxy_pass mqtt1883;
proxy_buffer_size 3M;
tcp_nodelay on;
}
}

节点加入集群:$ ./bin/emqttd_ctl cluster join emq@192.168.0.88

2018年9月25日 JDK 11 发布,LTS 版本。

新特性: http://openjdk.java.net/projects/jdk/11/

  • 181: Nest-Based Access Control
  • 309: Dynamic Class-File Constants
  • 315: Improve Aarch64 Intrinsics
  • 318: Epsilon: A No-Op Garbage Collector
  • 320: Remove the Java EE and CORBA Modules
  • 321: HTTP Client (Standard)
  • 323: Local-Variable Syntax for Lambda Parameters
  • 324: Key Agreement with Curve25519 and Curve448
  • 327: Unicode 10
  • 328: Flight Recorder
  • 329: ChaCha20 and Poly1305 Cryptographic Algorithms
  • 330: Launch Single-File Source-Code Programs
  • 331: Low-Overhead Heap Profiling
  • 332: Transport Layer Security (TLS) 1.3
  • 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
  • 335: Deprecate the Nashorn JavaScript Engine
  • 336: Deprecate the Pack200 Tools and API

中文

  • 181: 基于嵌套的访问控制
  • 309: 动态类文件常量
  • 315: 改进 Aarch64 Intrinsics
  • 318: Epsilon: 一个无操作的垃圾收集器
  • 320: 删除 Java EE and CORBA Modules
  • 321: HTTP Client (Standard)
  • 323: 用于 Lambda 参数的局部变量语法
  • 324: 新增 Curve25519 and Curve448 算法的密钥协议
  • 327: Unicode 10
  • 328: 飞行记录器 Flight Recorder
  • 329: ChaCha20 and Poly1305 加密算法
  • 330: 启动单一文件的源代码程序
  • 331: 低开销的 Heap Profiling
  • 332: 支持 TLS 1.3
  • 333: ZGC: 可伸缩低延迟垃圾收集器
  • 335: 弃用 the Nashorn JavaScript Engine
  • 336: 弃用 the Pack200 Tools and API
阅读全文 »

环境和实现效果:

  1. 两个Tomcat实例监听8081和8083端口
  2. NGINX监听80端口,通过负载均衡将请求转发到Tomcat实例
  3. 客户端访问80端口,结果是Tomcat响应的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#负载均衡
http {
upstream tomcattest.com {
server localhost:8081;
server localhost:8083;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcattest.com;
}
}
}

配置解析:

  1. tomcattest.com是我随便填的,应该只是内部用的。
  2. upstream有多种负载均衡模式,默认是按照顺序轮询。
阅读全文 »

ERC20:Ethereum Request for Comments 20,是一个基于以太坊代币的接口标准(协议)。所有符合 ERC-20 标准的代币都能立即兼容以太坊钱包,它能让用户和交易所,都能非常方便的管理多种代币,转账、存储、ICO 等等。

StandardToken.sol

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
pragma solidity ^0.4.24;

import "./BasicToken.sol";
import "./ERC20.sol";

/**
* @title 标准 ERC20 token
*
* @dev 实现基础的标准token
* @dev https://github.com/ethereum/EIPs/issues/20
* @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;

/**
* @dev 从一个地址向另外一个地址转token
* @param _from 转账的from地址
* @param _to address 转账的to地址
* @param _value uint256 转账token数量
*/
function transferFrom(
address _from,
address _to,
uint256 _value
)
public
returns (bool)
{
// 做合法性检查
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
//_from余额减去相应的金额
//_to余额加上相应的金额
//msg.sender可以从账户_from中转出的数量减少_value
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
// 触发Transfer事件
emit Transfer(_from, _to, _value);
return true;
}

/**
* @dev 批准传递的address以代表msg.sender花费指定数量的token
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender 花费资金的地址
* @param _value 可以被花费的token数量
*/
function approve(address _spender, uint256 _value) public returns (bool) {
//记录msg.sender允许_spender动用的token
allowed[msg.sender][_spender] = _value;
//触发Approval事件
emit Approval(msg.sender, _spender, _value);
return true;
}

/**
* @dev 函数检查所有者允许的_spender花费的token数量
* @param _owner address 资金所有者地址.
* @param _spender address 花费资金的spender的地址.
* @return A uint256 指定_spender仍可用token的数量。
*/
function allowance(
address _owner,
address _spender
)
public
view
returns (uint256)
{
//允许_spender从_owner中转出的token数
return allowed[_owner][_spender];
}

/**
* @dev 增加所有者允许_spender花费代币的数量。
*
* allowed[_spender] == 0时approve应该被调用. 增加allowed值最好使用此函数避免2此调用(等待知道第一笔交易被挖出)
* From MonolithDAO Token.sol
* @param _spender 花费资金的地址
* @param _addedValue 用于增加允许动用的token牌数量
*/
function increaseApproval(
address _spender,
uint _addedValue
)
public
returns (bool)
{
//在之前允许的数量上增加_addedValue
allowed[msg.sender][_spender] = (
allowed[msg.sender][_spender].add(_addedValue));
//触发Approval事件
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}

/**
* @dev 减少所有者允许_spender花费代币的数量
*
* allowed[_spender] == 0时approve应该被调用. 减少allowed值最好使用此函数避免2此调用(等待知道第一笔交易被挖出)
* From MonolithDAO Token.sol
* @param _spender 花费资金的地址
* @param _subtractedValue 用于减少允许动用的token牌数量
*/
function decreaseApproval(
address _spender,
uint _subtractedValue
)
public
returns (bool)
{
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
//减少的数量少于之前允许的数量,则清零
allowed[msg.sender][_spender] = 0;
} else {
//减少对应的_subtractedValue数量
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
//触发Approval事件
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}

}

BasicToken.sol

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
pragma solidity ^0.4.24;

import "./ERC20Basic.sol";
import "../../math/SafeMath.sol";


/**
* @title 实现ERC20基本合约的接口
* @dev 基本的StandardToken,不包含allowances.
*/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;

mapping(address => uint256) balances;

uint256 totalSupply_;

/**
* @dev 返回存在的token总数
*/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}

/**
* @dev 给特定的address转token
* @param _to 要转账到的address
* @param _value 要转账的金额
*/
function transfer(address _to, uint256 _value) public returns (bool) {
//做相关的合法验证
require(_to != address(0));
require(_value <= balances[msg.sender]);
// msg.sender余额中减去额度,_to余额加上相应额度
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
//触发Transfer事件
emit Transfer(msg.sender, _to, _value);
return true;
}

/**
* @dev 获取指定address的余额
* @param _owner 查询余额的address.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}

}
阅读全文 »

Android Studio 下载 gradle 一直很慢,或者是根本下载不了,而通过手动下载,则快很多。

一、使用镜像服务器 (20240121新增)

1
2
3
4
5
distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"

改为

distributionUrl = "https://mirrors.cloud.tencent.com/gradle/gradle-$gradleVersion-all.zip"

备注:这个设置可能是Gradle Java 项目的,创建Android项目没生效。但还是可以手动修改的 gradle-wrapper.properties 文件的。

阅读全文 »

为什么要验证合约?

源代码验证为与智能合约交互的用户提供了透明性。通过上传源代码,Etherscan将编译后的代码与区块链上的代码匹配。就像合同一样,“智能合约”应该为最终用户提供更多关于他们“数字签名”的信息,并让用户有机会审计代码,以独立地验证代码实际上做了应该做的事情。

ABI文件公开?目前我的Dapp做法需要将编译的合约 json 文件和WebApp放在一起,通过ajax读取 json 文件初始化合约。

如何验证?

具体就是将代码上传到etherscan.io,只需几步操作。

阅读全文 »

在前面我们知道可以通过 truffle init 来初始化项目,但是这个只是一个智能合约相关的项目,如果我们要开发Dapp Web 应用,还得做一些配置之类的工作,所以truffle带了unbox功能,直接初始化一个集成各种配置环境的项目,如react、vue等。

在空目录下通过命令 truffle unbox [name of box] 就能生成一个开箱即用的项目。

[name of box] 的都在 github或者truffleframework 可以找到。

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# MetaCoin 智能合约实例
$ truffle unbox metacoin-box

# 包含所有 OpenZeppelin 的教程ls
$ truffle unbox tutorialtoken-box

# 宠物商店DApp的完整项目代码
$ truffle unbox pet-shop

# 使用Webpack的前端项目,包含合约、迁移、测试、用户界面和webpack构建流水线
$ truffle unbox webpack

# 使用vue框架进行dapp开发
$ truffle unbox DOkwufulueze/eth-vue
阅读全文 »

1. keytool

JDK中keytool是一个证书管理工具,可以生成“自签名证书”,多用于Java应用,如:Tomcat。

1
2
3
4
5
6
7
8
$ keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

***
*** (输入详细信息)
***

$ ls
keystore.p12 (生成p12格式证书)

2. openssl

数字证书管理工具openssl和keytool的区别: keytool没办法签发证书,而openssl能够进行签发和证书链的管理。

阅读全文 »

502错误修复

服务器断电关机,再开机时一般会导致 gitlab 502错误

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
$ gitlab-ctl status
run: gitaly: (pid 1072) 689s; run: log: (pid 1071) 689s
run: gitlab-monitor: (pid 1101) 689s; run: log: (pid 1090) 689s
run: gitlab-workhorse: (pid 1092) 689s; run: log: (pid 1078) 689s
run: logrotate: (pid 1115) 689s; run: log: (pid 1097) 689s
run: nginx: (pid 1091) 689s; run: log: (pid 1077) 689s
run: node-exporter: (pid 1111) 689s; run: log: (pid 1096) 689s
run: postgres-exporter: (pid 1113) 689s; run: log: (pid 1098) 689s
run: postgresql: (pid 1114) 689s; run: log: (pid 1095) 689s
run: prometheus: (pid 14267) 0s; run: log: (pid 1089) 689s
run: redis: (pid 1110) 689s; run: log: (pid 1094) 689s
run: redis-exporter: (pid 1075) 689s; run: log: (pid 1074) 689s
run: sidekiq: (pid 1076) 689s; run: log: (pid 1073) 689s
run: unicorn: (pid 14244) 1s; run: log: (pid 1079) 689s
# 尝试重启
$ gitlab-ctl restart
ok: run: gitaly: (pid 14454) 0s
ok: run: gitlab-monitor: (pid 14465) 1s
ok: run: gitlab-workhorse: (pid 14469) 0s
ok: run: logrotate: (pid 14482) 1s
ok: run: nginx: (pid 14508) 0s
ok: run: node-exporter: (pid 14514) 0s
ok: run: postgres-exporter: (pid 14519) 1s
ok: run: postgresql: (pid 14532) 0s
ok: run: prometheus: (pid 14544) 0s
ok: run: redis: (pid 14549) 0s
ok: run: redis-exporter: (pid 14558) 0s
ok: run: sidekiq: (pid 14575) 0s
ok: run: unicorn: (pid 14587) 0s

# 按照官网的建议
# 如果所有服务都正常(没有down掉)还是502错误的话,重启sidekiq
$ gitlab-ctl restart sidekiq

# 或者
$ gitlab-ctl hup unicorn

500错误修复

记录一次500错误,是由于强制关掉宿主机导致的,用502错误的修复方法无效果。

阅读全文 »

配置指南 ,这是有官方给的各种邮箱的配置示例。

阿里云企业邮箱

1
2
3
4
5
6
7
8
9
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qiye.aliyun.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "username@your domain"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_domain'] = "your domain"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true

默认使用ssl,如果不用就要加入以下配置

1
2
3
4
5
6
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
gitlab_rails['smtp_ssl'] = false
gitlab_rails['smtp_force_ssl'] = false

阅读全文 »

要把库放在Jitpack使用,一般引用是这样子:

1
2
3
4
5
6
7
8
9
10
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}

dependencies {
implementation 'com.github.username:libraryname:version'
}

所以最好这样:

  • 仓库名称:小写,如:myview,如果名称太长,用中线分割,如:core-ktx
  • 包名:和域名一样com.github.username,如:com.github.kevinvane
    最后jitpack生成依赖引用是:
    1
    implementation 'com.github.kevinvane:myview:version'
    这样别人引用你的库,就知道是在com.github.kevinvane包下,名称为myview。

Android6.0以上才支持修改状态栏字体颜色(亮色)

1
2
3
4
5
6
7
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
this.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
);//亮色
getWindow().setStatusBarColor(Color.WHITE);//设置状态栏背景色为白色
}

如果要适配4.4以上的,推荐用ImmersionBar

参考:

  1. AndroidStuio快速发布开源项目到Jcenter/Bintray
  2. 创建并发布一个 Android 库
  3. Android Library上传到GitHub并一键发布到Bintray或JCenter

** 本文只记录操作步骤 **
** 本文只记录操作步骤 **
** 本文只记录操作步骤 **

apikey

登录 bintray 拿到apikey,不需要创建仓库,默认已有maven/nuget等7个仓库,我们用maven就可以,当然也可以创建一个属于自己的maven仓库。

创建库项目

阅读全文 »

备份

1
$ gitlab-rake gitlab:backup:create

备份文件在 /var/opt/gitlab/backups 目录下,如:1528882180_2018_06_13_10.5.5_gitlab_backup.tar。

备份过程中此目录会生成很多临时文件,比如数据库,如果由于空间不足导致备份失败,这个目录下的文件都可以删除释放空间,当然备份成功后,临时文件都会被清除。

迁移/恢复

阅读全文 »

后来看到这篇文章 合约交互 摘录:

标准的与以太坊网络交互的方法是通过以太坊官方构建的Web3库。尽管这个库非常有用,但使用其提供接口与合约交互有些困难,特别是以太坊的新手。为降低学习曲线,Truffle使用Ether Pudding库,它也是基于Web3的基础之上,目的是为了让交互更简单。

环境

基于《6.1、基于truffle框架部署完整合约(发布Token代币).md》的环境,启动Ganache-Gui,并且用truffle编译和部署好合约。

拷贝出 abi合约地址 生成 合约实例,就可以通过 web3.js 调用合约的函数。

阅读全文 »