白话解释spacevim作为IDE该怎么用

界面相关

  • 菜单 toggle: SPC f t
  • 关闭打开的某个buffer(文件): SPC b d
  • outline界面
    • SPC 2切到菜单
    • SPC w s 把菜单切成上下两部分
    • f2 切出outline界面,
    • SPC window需要 进入原始window,
    • SPC w M 选择要进行交换的目标window
  • diff两个文件, 假设有a,b两个文件,想要比较,如下操作
    • 先在菜单中选择a文件打开, 再在菜单选中b文件, 按 a 选 diff,或者 手动敲 diff 就可以了

文本操作

  • 复制行到系统剪切板
    ~yy SPC b Y~~ 先进入编辑模式,然后鼠标选择进行复制到系统剪切板
  • 多行复制: shift v 然后按方向键,选择多行文本直到结束的字符处,然后按y, 光标移动到要粘贴的地方按p, 可以跨文件粘贴,但必须在spacevim内部

调试

  • 一键运行脚本:
    • python !python %SPC L R
    • 其他:SPC LR

在工程中搜索文件

  • SPC p f 在当前工程中查找文件
  • SPC p / 在当前工程中搜索文本内容
  • SPC p k 关闭当前工程的所有缓冲区
  • SPC p t 自动查找工程根目录
  • SPC p p 显示所有工程

要装的插件:

其他:https://spacevim.org/cn/layers/

USE SpaceVim as IDE

-vim原生: https://spacevim.org/use-vim-as-ide/#files-and-windows
-spacevim: SPC L R


参考配置文件:

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
[options]
enable_neomake = false
enable_ale = true
enable_tabline_filetype_icon_the_fly = true
filetree_direction = "left"
# set spacevim theme. by default colorscheme layer is not loaded,
# if you want to js-beautify js-beautify use more colorscheme, please load the colorscheme
# layer
#colorscheme = "material"
#colorscheme_bg = "dark"
# Disable guicolors in basic mode, many terminal do not support 24bit
# true colors
#enable_guicolors = true
# Disable statusline separator, if you want to use other value, please
# install nerd fonts
#statusline_separator = "nil"
#statusline_inactive_separator = "bar"
#buffer_index_type = 4
#windows_index_type = 3
#enable_tabline_filetype_icon = false
#enable_statusline_mode = false
#statusline_unicode_symbols = false
# Enable vim compatible mode, avoid changing origin vim key bindings
vimcompatible = true
# Enable autocomplete layer
automatic_update = true

[[custom_plugins]]
name = 'SpaceVim/vim-markdown'
merged = false

[[layers]]
name = "colorscheme"

[[layers]]
name = 'autocomplete'
auto-completion-return-key-behavior = "complete"
auto-completion-tab-key-behavior = "cycle"

[[layers]]
name = 'shell'
default_position = 'bottom'
default_height = 30

[[layers]]
name = "format"

[[layers]]
name = "lang#typescript"

[[layers]]
name = "denite"

[[layers]]
name = "lang#javascript"
auto_fix = true
enable_flow_syntax = true

[[layers]]
name = "lang#python"

[[layers]]
name = "checkers"

[[layers]]
name = "lang#go"

[[layers]]
name = "lang#markdown"

harbor基于helm和k8s的高可用方案

harbor基于helm和k8s的高可用方案,趟坑而来,结果经过验证。

Harbor高可用方案

现状: 为实现高可用,当前产线harbor部署在多个虚机上, 虚机之间通过harbor内建的机制保持镜像同步, 但数据同步使用我们自己的业务代码来进行。 不是很方便,将来扩展也麻烦。

思路:

  • 若能基于K8S部署Harbor的话,可以享受到K8S上水平扩展灵活的福利。
  • 由于Harbor内组件众多,在K8s上部署,用helm这样的部署工具会更高效。

技术选型

基于上述原因,方案基本确定, 就是在k8s上使用helm方式部署harbor。对应的github地址: https://github.com/goharbor/harbor-helm

以下内容以此方案为线索进行配置。

测试环境

  • system: aws 东京 ubuntu 18.04 2core 4G 个人名下云实例
  • k8s: microk8s v1.15
  • helm: 2.14

步骤

  1. 安装好helm 环境, 参考这里
  2. 去 helm 仓库寻找 harbor 的chart:Helm Chart for Harborgithub 按步骤安装

选项

通过在value.yaml文件中编辑, 测试部署采用了以下配置:

  • export.type : ingress #使用ingress暴露服务到外界, 其他可选包括nodePorts, clusterIP等,详情参考github
  • persistent.enable : true #使用持久化卷
  • database.type : internal #数据库使用harbor内建的postgresql数据库容器服务, 如果选external,需在k8s外面单独维护一个postgresql进程

此外:

persistentvolume 的实现,可以采用nfs或storage类, 比如hostpath, 这两者二选一即可。

1. 若使用nfs
  • a. 编辑value.yaml, 将所有的persistence.persistentVolumeClaim.XXX.storageClass 都设置为 “-“,代表禁用storageClass
  • b. 需注意nfs服务配置类似如下:
1
2
# /etc/exports
/nfs/data *(rw,sync,no_subtree_check,no_root_squash)

权限不够可能会让数据库无法正常运行

  • c. helm install 之前,需提前创建可用的persistentvolume, 类似下面代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for i in {1..5}; do
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv00${i}
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /nfs/k8s/nfs${i}
server: 172.31.38.131
EOF
done
2. 若使用storage
  • a. 编辑value.yaml, 将所有的persistence.persistentVolumeClaim.XXX.storageClass 都设置为 “”,代表使用默认的storageClass
  • b. 确认在k8s里已经删掉了相关的persistentvalume,且没有空闲的

安装

现在正式开始安装

  • 在 harbor-helm 文件夹下执行 helm install . --debug --name my-release
  • 如果正常的话,过 3分钟左右所有部署都可用
  • 为了方便使用, 可以配置一个域名到当前chart的ingress:
1
kubectl edit ingress/my-release-ingress-name

验证

在上面对yaml文件进行编辑,将host属性设置为希望的域名,编辑保存后直接生效,如果这个域名是全网有效的,可以在任何地方直接用浏览器访问此harbor部署; 如果是仅需要对本机有效,在/etc/hosts里增加设置,让域名设置成本机有效。

如何扩缩容

使用k8s提供的能力进行扩缩容, 包括但不限于:

1
kubectl scale --replicas 2 deployment/my-release-harbor-portal

问题

  • Helm Chart for Harbor 一定使用1.0.0分支 , 而不是master分支,否则会有不可预料的错误
  • 一定使用root用户安装。
  • 2如果是国内环境,helm安装的时候可能需要解决拉取墙外镜像的问题
    2

ubuntu 18.04下搭建go开发编译环境 和配置spacevim作为开发工具

ubuntu18.04下建议使用snap安装go, 多说一句, 其实只要是能用snap安装的程序,可以尽量使用snap。

1. 安装

1
sudo snap install go  --classic

2. 设置环境变量

假设用户的Home目录是/root,且~/go目录作为我们日常开发使用的根目录。那么可配置如下,如果是aws环境,Home目录是 /home/ubuntu/

1
2
3
4
5
6
7
8
# /etc/profile
.
.
.
#加入以下内容
export GOPATH=/root/go
export GOROOT=/snap/go/current
export PATH=$PATH:$GOPATH/bin:$GOROOT/

然后执行

1
source  /etc/profile

激活配置

以上设置了使用/${用户HOME目录}/go作为用户目录下go的根路径,根据开发惯例,相关go源码都放到此目录 src/ 子目录下

3. 设置开发环境

个人推荐使用spacevim开发调试go,可参考spacevim官网配置go开发环境

开发环境安装好后, 在编辑go文件的时候,spacevim会报错下

1
vim-go could not found gopls

手动安装依赖,需在spacevim中执行

1
:GoInstallBinaries

如果本机是在墙内环境,但由于众所周知的原因,安装会失败的。于是我们需要在墙外某云实例上把环境配好,把缺失的二进制文件拷贝回来即可。

比如, 在 aws上,ubuntu实例,可以把$GOPATH/bin 目录,比如/home/ubuntu/go/bin目录打包下来,在墙内的本机解包覆盖对应的$GOPATH/bin目录即可。

4 . 尝试

我们创建一个目录:~/go/src/yourname/hello

1
2
3
4
mkdir -p ~/go/src/yourname/hello
cd ~/go/src/yourname/hello
touch hello.go
vim .

在spacevim中编辑hello.go, 写入内容

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Printf("Hello, World\n")
}

然后在spacevim使用快捷键执行上述代码,SPC就是空格

1
SPC L R

我们将看到脚本执行的输出:

1
2
3
4
5
[Running] go run hello.go 
--------------------
Hello, World

[Done] exited with code=0 in 0.591906 seconds

5. 写在最后

如果使用spacevim 作为 go 的准IDE开发工具, 可以额外安装以下插件, 和配置以下选项:

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
#.Spacevim.d/init.toml
[options]
enable_neomake = false
enable_ale = true
enable_tabline_filetype_icon_the_fly = true
automatic_update = true


[[layers]]
name = "colorscheme"

[[layers]]
name = 'autocomplete'
auto-completion-return-key-behavior = "complete"
auto-completion-tab-key-behavior = "cycle"

[[layers]]
name = 'shell'
default_position = 'bottom'
default_height = 30

[[layers]]
name = "format"

[[layers]]
name = "denite"

[[layers]]
name = "lang#javascript"
auto_fix = true
enable_flow_syntax = true

[[layers]]
name = "checkers"

[[layers]]
name = "lang#go"

[[layers]]
name = "core#statusline"
enable = true

[[layers]]
name = "tags"

[[layers]]
name = "ui"
enable_sidebar = true

[[layers]]
name = "git"

Lede 17.01 shadowsocks设置

随着lede应用库的升级,文中有些地方该改一改了,我是在在原文上直接调整的,懒得单独再开个帖子 (最后更新2019-09-28)

目标:

在TP-Link TL-WR841N上,使用lede17.0x版,shadowsocks的透明代理能力,结合chinadns和dns forward,实现:

  • 路由器下的国内请求直接连接,国外请求走内置ss-redir代理到shadowsocks服务端。

背景:

论定期更新ChinaDNS忽略列表的重要性

论定期更新ChinaDNS忽略列表的重要性

shadowsock+ChinaDNS成功实现科学上网之后,为了防止对国内IP和国外IP的误判。还需要定期更新忽略列表

  • Shadowsock的ss-redir服务的TCP转发能力,将ip段不符合 /etc/shadowsocks/ignore.list描述的请求进行
  • redirect。同时,ChinaDns服务所需配置文件 /etc/chinadns_chnroute.txt (或者是其他名字) 为解决DNS污染问题,也需要保持内容的更新。

这两个文件内容是一致的。

如果长时间不更新的话,可能就会出现某些国内网站反应很慢,甚至打不开,比如优酷或者其他视频网站。而国外网站反倒还好。

继续阅读全文 »

rabbitmq tutorial Hello World

This tutorials is based on the official document in RabbitMQ

prerequisites: RabbitMQ is installed and running on localhost:5672

Work Queues

work_queues

Targets:

  1. In first tutorials we wrote pragrams to send and recieve messages from a named queues.
  2. In this one we will create a Work queues that will be used to distribute time-consuming tasks amount multiple workers.

When should I use it?

doing a resource-intensive task immediately and having to wait for it to complete. Instead, we schedule the task to be done later

继续阅读全文 »

openwrt基本设置

TP-link路由器 openwrt下的基础设置

以下内容将介绍 TP-link路由器安装的OpenWRT 15.05后,如何进行基础设置,以完成基本的PPPoE上网,Wifi密码设置,以及shadowSocks帐号密码设置。

首先: 在开始前,先确认:

  • 外网网口必须插到此路由器左数第4个lan口上,而不是wan口上!
  • 剩下的几个网口全是lan口,是的,你没看错。
  • 此无线路由器wifi默认节点是 openwrt 没有密码,或者密码是 “rootroot”,在后面的所有步骤完成>之前,请务必按照下面 设置Wifi密码的步骤,自行修改wifi密码。

    继续阅读全文 »