Akawa

ETY001的博客

天天盯盘实在是有点吃不消了,有些工作还是需要用机器来完成。
由于已经习惯了靠 Docker 部署,所以先把基础工作做好,把火币
的 python sdk 环境封装个 Docker 基础包。

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
FROM alpine:3.9
WORKDIR /app
ARG TAG=1.0.5
RUN apk --no-cache add git python3 && \
git clone https://github.com/HuobiRDCenter/huobi_Python.git && \
cd huobi_Python && \
git checkout ${TAG} && \
python3 setup.py install && \
cd .. && \
rm -rf huobi_Python
CMD ["pwd"]

编译的时候,可以通过 ARG 来控制你要使用的版本。

1
docker build --build-arg TAG=1.0.5 -t ety001/huobi-lib:1.0.5 .

测试一下

在当前目录创建个测试文件 a.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from huobi import SubscriptionClient
from huobi.model import *
from huobi.exception.huobiapiexception import HuobiApiException
from huobi import RequestClient

request_client = RequestClient()

# Get the timestamp from Huobi server and print on console
timestamp = request_client.get_exchange_timestamp
print(timestamp)

# Get the latest btcusdt‘s candlestick data and print the highest price on console
candlestick_list = request_client.get_latest_candlestick("btcusdt", CandlestickInterval.DAY1, 20)
for item in candlestick_list:
print(item.high)

启动一个临时容器,测试一下我们的 SDK 是否安装正确

1
docker run -it --rm -v $(pwd):/app ety001/huobi-lib:1.0.5 python3 /app/a.py

如果环境正确,则会正常输出数据。

OVER!接下来就要去研究下火币的各个 API 了。

今天完成了我第一个 Flutter App —— 网络剪切板
当我满怀激动的编译出 Release 版本后,发现程序并不能联网。

经过搜索发现,原来要想联网需要自己手动去 AndroidManifest.xml 里添加下面的权限

1
<uses-permission android:name="android.permission.INTERNET"/>

我觉得 Flutter 的这种方式,让人觉得很恶心,这些工作不应该是 Flutter 自身的工具集
来完成的事情吗?为什么需要用户再去手动配置权限?不可思议。

由于最近需要在模拟器里搞事情,Genymotion 是个很好用的模拟器,
然而初始状态下,并不好用,需要安装很多必备软件。
这篇会简述下大致的步骤。

1. 安装 Genymotion

具体安装过程请去 Genymotion 的官网查看。
安装好以后,安装 Google Nexus 5X 8.0-API26 这个版本。

2. 安装 OpenGapps

安装 OpenGapps 的目的是为了使用 Google Play Store 来安装浏览器。
在 Genymotion 的 3.0.3 版本中,已经自带了 OpenGapps 的安装途径,
就在模拟器的控制栏上,如图所示

点击后,按照提示即可完成安装,重启后,就可以登录 Google Play Store 来安装个浏览器了。

3. 安装 Genymotion ARM Translation

由于 Genymotion 的模拟器是 x86 架构编译的 Android 系统,有一些 App 是不支持 X86 的,
所以我们需要安装一个翻译器。

访问 https://github.com/m9rco/Genymotion_ARM_Translation 这里,
找到 Android 8.0 版本的下载包,下载后直接把 zip 包拖拽进模拟器里,
按照提示信息安装即可,完成后重启模拟器。

4. 安装 XPosed 框架

访问 https://forum.xda-developers.com/showthread.php?t=3034811
在这个页面,下载 XposedInstaller_*.apk

然后访问 https://dl-xda.xposed.info/framework/
依次打开 sdk26 / x86 目录,下载最新的 zip 包。下载完成后,拖拽入模拟器安装。

安装完重启模拟器,再拖入 XposedInstaller_*.apk 进行安装,完成后,重启模拟器。

这样一些基础软件就都完成了安装,再使用起来就方便了很多。

具体的比赛贴子:https://bitsharestalk.org/index.php?topic=29665.0

使用我之前开发的机器人参赛非常简单。这里是之前发布机器人时的贴子:https://akawa.ink/2019/05/22/bts-trade-bots.html

本教程是在Linux下运行。

首先,需要有Docker环境,具体Docker安装方法请参考Docker官方网站。

然后,创建一个环境变量文件,用于配置你的机器人,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 节点地址
API_URL=wss://bts.open.icowallet.net/ws
# 账号名
ACCOUNT=
# 账号active私钥
PRIV_KEY=
# 钱包密码
PASSWD=123456
# 做市市场 Quote:Base
MARKET=GDEX.BTC:BTS
# 买单价格比率
BUY_RATE=0.01
# 卖单价格比率
SELL_RATE=0.01
# 花费base的数量
BUY_AMOUNT=100
# 得到base的数量
SELL_AMOUNT=100
# base货币最大持有量
BASE_MAX=2000
# quote货币最大持有量
QUOTE_MAX=2000

假设该文件名为 bts_bts

启动机器人的命令如下:

1
2
3
4
5
docker run -itd \
--name bot1 \
--restart always \
--env-file btc_bts \
ety001/btsbots-cli:latest

启动之后,可以用 docker logs -f --tail 100 bot1 来查看机器人的运行状态。

如果想要停止并删除机器人,执行 docker stop bot1 && docker rm bot1 即可。

继上篇文章《重写了我的bitshares-elasticsearch的docker-compose》之后,经过一天的调试,我又增加了 Kibana 的配置到 docker-compose.yml 文件中。

使用方法很简单,首先停止所有容器

1
docker-compose down

然后备份下你之前的密码,再更新代码仓库到最新。

之后,修改 kibana.yml 文件中的 elasticsearch.password 为你的 elastic 密码。

如果你想要直接暴露 Kibana 的管理端口,可以修改 docker-compose.yml 文件,

1
2
3
4
5
6
7
8
9
10
kibana:
container_name: kibana
image: docker.elastic.co/kibana/kibana:7.4.0
volumes:
- ./kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
esnet:
ipv4_address: 172.22.0.5
#ports: # 去掉这里的注释即可直接暴露端口
# - 5601:5601 # 去掉这里的注释即可直接暴露端口

最后,启动所有容器即可,

1
docker-compose up -d

目前,我已经在我的节点上配置了开放用户,

URL: https://bts-es.liuye.tech/
Username: bts
Password: btsbts

OlGLOj5UsS2Ms4mf4wfRQMZWWQwmD2Uoeu6lIuaj.png

之前在《用 docker compose 搭建 bitshares elastic search》中已经介绍了如何使用docker-composer搭建 Bitshares Elastic Search 服务

最近有些时间,就对之前的部署进行了优化,并且升级了 elastic search 的版本和 Bitshares 的版本。

仓库地址(Repository) => https://github.com/ety001/dockerfile/tree/master/bts-es

Manual in English => https://github.com/ety001/dockerfile/blob/master/bts-es/README.md

如何部署

1. 克隆代码库

1
2
$ git clone https://github.com/ety001/dockerfile.git
$ cd dockerfile/bts-es

2. 修改 docker-composer.yaml 中的部分参数

  • ES_JAVA_OPTS=-Xms3g -Xmx3g 这里可以调整 es 的内存占用
  • ELASTIC_PASSWORD 这是你的es密码. 请同时修改 --elasticsearch-basic-auth 的值
  • #ports: - 9200:9200, 如果你想直接让http服务可以被访问,可以取消这个地方的注释

3. 生成证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ docker run \
-it --rm \
-v $(pwd)/ssl:/usr/share/elasticsearch/config/certs \
docker.elastic.co/elasticsearch/elasticsearch:7.4.0 \
/bin/bash

-- 进入临时容器 --

# elasticsearch-certutil ca
ENTER ENTER (两次回车)

# elasticsearch-certutil cert --ca elastic-stack-ca.p12
ENTER ENTER ENTER (三次回车)

# mv *.p12 config/certs/
# chown 1000:1000 config/certs/*.p12

# exit

4. 增加 vm.max_map_count 配置

1
$ sudo sysctl -w vm.max_map_count=262144

如果想要永久修改这个配置值,在 /etc/sysctl.conf 中增加 vm.max_map_count 设置。
配置好需要重启,执行 sysctl vm.max_map_count 检查是否配置成功。

5. 启动

1
$ docker-compose up -d

其他常用命令

1. 检查运行日志

1
$ docker-compose logs -f --tail 100

2. 停止所有容器

1
$ docker-compose down

3. 检查es是否成功运行

1
$ curl -u elastic:123456 -X GET 'http://172.22.0.2:9200/_cat/health'

123456 是你在 docker-compose.yml 中配置的密码.

4. 把 es01 加入到 nginx 的容器网络中

如果你同时使用 docker 来部署 nginx,你可以把 es01 容器加入到 nginx 容器
所在的网络里,这样可以方便 nginx 做反向代理到 eshttp 服务并加上证书。

假设你的 nginx 容器所在网络名为 lnmp

1
docker network connect --ip 172.20.0.3 lnmp es01

任何问题?

如果有任何问题,欢迎提 issue。

My bitshares account: ety001
My witness account: liuye

最近 GBAC 计划参与 Bitshares 的见证人竞选,而我负责见证人服务节点等一系列服务的搭建。

一个见证人,最好是配备2台节点服务器(主备),1台测试节点服务器,1个API节点服务器,1个喂价程序。

其中像API和测试节点为了省成本,可以跟备机一块。最让我头疼的就是喂价程序了。

找了两个老的开源的喂价程序,折腾了一整天,总是各种各样的报错,最后@abit 提供了一个 https://github.com/Zapata/bitshares-pricefeed ,最终终于打包成可用的 docker 镜像了。

目前已经提交 PR 给原库了,不过还没有合并。目前想要使用的话,可以先用我的库,

1
2
3
4
git clone https://github.com/ety001/bitshares-pricefeed.git
cd bitshares-pricefeed
git checkout develop
docker build -t bitshares-pricefeed .

打包好以后,镜像大约在250MB左右,比原作者的1G多的镜像小了很多。

使用前,先生成默认配置文件

1
docker run -it --rm -v /path/to:/app bitshares-pricefeed:latest bitshares-pricefeed create

执行后,在 /path/to 目录下会有一个 config.yml 的配置文件,里面的注释解释的比较清楚,自己看一下就好。

然后执行下面的命令即可启动喂价程序

1
docker run -v /path/to/config.yml:/config/config.yml bitshares-pricefeed:latest bitshares-pricefeed --configfile /config/config.yml --node wss://ws.gdex.top update --active-key=XXXXXXX

其中 active-key 就是你的见证人账号的 active 权限的私钥

简单来说,就是简单的两步,创建配置文件,启动喂价程序。

不得不说,现在我对于docker的依赖越来越严重了。。。

怕是这是第一篇中文说如何部署 bitshares elastic search 的文章吧。

前置知识

  • docker
  • elastic search

准备工作

安装 docker 和 docker-compose

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
# 这里只给出centos7的安装步骤
# 其他系统请参考docker的官方文档 [https://docs.docker.com/install/]

# 安装 docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
&& yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 \
&& yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo \
&& yum install -y docker-ce \
&& systemctl enable docker \
&& systemctl start docker

# 安装 docker-compose
yum install epel-release \
&& yum install -y python-pip \
&& pip install docker-compose \
&& yum upgrade python*

拉取dockerfile

1
2
3
4
git clone https://github.com/ety001/dockerfile.git

# 切换到相关目录
cd dockerfile/bts-es

这是我自己用来存储常用的 dockerfile 的库

编译 Bitshares 内核

1
2
# 编译 3.1.0,如果编译其他版本,自行更换版本号即可
docker-compose build --build-arg TAG=3.1.0

编译速度取决于你的网速和机器配置。

  • 如果在国内,可以打开该目录下的 Dockerfile,把其中的替换 sources.list 的步骤取消注释,这样更新系统软件的时候,可以使用国内163的源。
  • 另外 Dockerfile 文件中也可以调整编译参数利用多核性能提高编译速度。

修改系统配置

/etc/sysctl.conf 中增加 vm.max_map_count = 262144elasticsearch要求 max_map_count 最低 262144。添加后,重新载入 sysctl --system

启动

启动前,需要修改docker-compose.yml中的 XmsXmx环境变量,代表 es 的最小内存和最大内存占用。我的文件默认配置的是 6G

1
docker-compose up -d

需要在 docker-compose.yml 文件所在目录执行该命令。

停止

1
docker-compose down

需要在 docker-compose.yml 文件所在目录执行该命令。

验证es是否启动成功

1
curl http://127.0.0.1:9200/_cat/health

验证是否有数据

1
2
3
4
5
6
curl -X GET 'http://localhost:9200/bitshares-*/data/_count?pretty=true' -H 'Content-Type: application/json' -d '
{
"query" : {
"bool" : { "must" : [{"match_all": {}}] }
}
}'

已知问题

  • 默认用户密码未修改

相关链接


UPDATE

  • 修改密码的话,只需要在 docker-compose.ymlelasticsearch 中增加 ELASTIC_PASSWORD=123456 环境变量,这样启动后,密码就是 123456

最近家里的服务器的 cloudflareDDNS 更新功能总是不灵验,估计问题是跟墙有关吧。

不得不说这种基础设施还是得自己开发。

考虑到有墙的原因,所以实现更新IP的思路就是,本地获取公网IP,然后发送到墙外的服务器。
然后墙外的服务器拿到IP后再更新 cloudflare

获取并转发公网IP的代码:

https://github.com/ety001/dockerfile/tree/master/transfer_ip

获取到IP并更新的代码:

https://github.com/ety001/dockerfile/tree/master/update-ip-to-cloudflare

为了方便使用,我还封装成了 Docker 镜像,分别是: ety001/transfer_ipety001/update-ip-to-cloudflare

使用方法如下:

假如你要更新的域名是 abc.ppp.com,先在墙外的服务器(1.1.1.1)上部署,命令是

1
2
3
4
5
docker run -itd --name update-cloudflare --restart always \
-p 8888:80
-e "[email protected]" \
-e "AUTH_KEY=xxxxxxxxxxxxxxxx" \
ety001/update-ip-to-cloudflare:latest

其中环境变量 EMAILcloudflareemailAUTH_KEYcloudflareAPI KEY

部署好这个后,你就可以通过 http://1.1.1.1:8888/?domain=ppp.com&record=abc.ppp.com&ip= 地址更新IP地址了。

然后在墙内的服务器上执行

1
2
3
4
docker run -itd --name send-ip --restart always \
-e "TO_URL=http://1.1.1.1:8888/?domain=ppp.com&record=abc.ppp.com&ip=" \
-e "IP_URL=https://api.ipify.org/" \
ety001/transfer_ip:latest

这里面的两个环境变量,TO_URL 就是墙外服务器的更新IP的地址,IP_URL 是可以返回你公网IP的网址。

这样两个容器跑起来以后,你就可以本地获取公网IP传到墙外服务器,然后再更新DNS了。

如果你想再更新一个新的地址,只需要在本地再启动一个容器,然后手动修改下 TO_URL 参数配置即可。

有很多人在问薪水高低的事情,我个人觉得每个人对于高薪的定义不同,有些人觉得 20k/月很多了,有些人觉得 20k/月也就一般般。所以我也没有办法给出高薪的标准是多少,因为这个不存在标准。真正的标准在自己的心里。你自己觉得挣的钱够花,应该就算是符合自己的标准了吧。

我只能给出我所知道的数据给大家作为参考。目前我接触过的、看到的远程外包团队,能给出的薪水在 6k–12k 的范围,多数是 8k 上下,能给到 10k 往上的相对较少。20k 往上的凤毛麟角,有的话,也需要你的技能点很牛逼或者是个全栈什么都干(所谓全栈就是你一个人完成好几个人的活,意味着会比较累)。

目前远程团队有能盈利养活团队的产品的很少,几乎大部分远程团队都是外包。因此如果你准备开始一份远程工作,请做好心理准备,尤其是之前没有跟甲方打过交道的。这里面扯皮的事情很多。做一段时间后,你可能会想,同样是做外包,为什么不自己去揽活自己干,而是要加入别人的团队之类的问题。

另外就是关于远程外包团队,你需要互相适应。不过一般远程外包团队也没有几个人,通常就是一个全栈开发负责一整个项目的样子,最多给你配个设计师或者外包一个临时的设计师。我这里说的适应,其实主要就是跟负责揽活的团队boss之间的默契问题。举个小例子,之前我曾经在一个团队里面工作,项目出点小问题,自己的boss就跟甲方站在一条战线上批斗我,最后,我没有干满两周,就果断辞掉了这份工作,因为实在是给的少,还干的太不爽了。总之,这是个双向选择。

还有很多问从哪里找远程工作。我这里直接给出远程圈里的一个朋友总结的库吧,我觉得里面的资料已经足够全面了,地址是: https://github.com/greatghoul/remote-working 。目前 greathoul 在维护豆瓣的一个小组,以及在telegram上有个机器人,你们在 github 的库能找到相关的链接。我个人的经历来看,如果口语不错,可以尝试去找一下国外的远程岗位,可能唯一就是时差是个问题。

接下来就说一些细碎的问题。首先是社保。目前我是自己注册了一个公司来给自己缴社保,这种方式我不推荐。之前也是没有经验,觉得注册个公司不是什么问题。经过四年的时间洗礼,注册的确很快很方便,但是运营维护公司是个很蛋疼的事情。即使公司没有进出账,也要每月和每季度进行税务报账,每年上半年需要进行出工商年报,每年7月省人社局出社保缴费基数后,打印各种表单跑人社局改社保基数,每年经济普查要填各种表,每年去税务缴残保金之类的,等等一系列很琐碎的事情。并且注册公司后,你注册公司的手机号基本上就是被各种机构打爆的节奏。

注册公司目前对我来说唯一的好处就是:需要注册微信公众号之类需要公司资质的时候,很轻松就搞定了;学到了很多以前没有接触过的税务、公司方面的知识;面向创业者的政府贴息贷款也有资质去申请。然并卵。【画外音:也是因为自己弄公司,才有对税这种东西有直观深刻的体悟。依法纳税很重要】【再补充:没注册公司之前,五险一金对我来说就是个名词,我也不关注这个,自己弄公司之后,才知道是哪五险哪一金。如果你要注册公司,看看能不能只缴三险,生育险和失业险没有什么缴的必要。目前我是只缴五险。】

那么不注册公司的话,你可以选择找一家当地公司代缴,或者是直接去人社局个人缴费,具体我也没有办理过,不是很清楚,去当地人社局问一下就知道了。不过,除了国家的这些社保医保之类的,还是建议自己给自己买一些合适的商业保险作为二重保障。

关于一边旅行一边远程工作。这个事情很美好,也是很多没有远程工作的人很向往的,但是实际是很蛋疼的。你在旅行过程中会遇到各种各样未知的情况,这会导致你的工作时间和效率大幅降低。如果你真的想一边旅行一边远程工作,我能给出的建议就是,一个目的地的时间跨度在两周到一个月比较好,另外就是旅行期间的工作繁忙度不高。如果你已经成家有孩子了,请放弃这种不切实际的想法!!!

关于上升空间,远程工作也无法保障。这包括了你的人脉、薪水、能力,都很难在远程工作中获得上升空间。这也是由你所在的工作性质决定的。就像我上面提到的,目前多数远程工作团队是外包团队,所以能力想要提升很难,因为外包的目的是完成任务,所以就是各种copy – paste。人脉你也很难接触到客户。薪水基本上就是固定的。

因此你要选择远程工作这条路,只能是奔着自由开发者的目标去的。也就是需要在某个圈子里建立自己的品牌和口碑,这有助于你获取人脉。能力上自己push自己去学习。这两点做到了,薪水就是水到渠成的事情了。

就先补充这么多,如果再有想到的,再补充!

0%