机械境

这里只是我的后花园,随性而写

介绍

之前一直使用使用 antigen 管理 Zsh 配置,由于 antigen 已经很就不更新了,最后一次代码提交为 2019,就切换到了 sheldon

sheldon 是 Rust 编写的 Zsh 包管理器,特性如下:

  • Plugins from Git repositories.
    • Branch / tag / commit support.
    • Submodule support.
    • First class support for GitHub repositories.
    • First class support for Gists.
  • Arbitrary remote scripts or binary plugins.
  • Local plugins.
  • Inline plugins.
  • Highly configurable install methods using templates.
  • Shell agnostic, with sensible defaults for Zsh.
  • Super-fast plugin loading and parallel installation. See benchmarks.
  • Config file using TOML syntax.
  • Clean ~/.zshrc or ~/.bashrc (just add 1 line).

安装

通过 brew install sheldon 一键安装,也有其他安装方式可选。

配置

执行 sheldon init 会生成默认配置 plugins.toml,文件存放在 $XDG_CONFIG_HOME/sheldon,一般这个路径就是 ~/.config/sheldon/plugins.toml。可以直接编辑这个配置,也可以通过 sheldon CLI 来操作。

CLI

sheldon 有三种不同类型的命令:

  • init 初始化一个新的配置文件。
  • locksource 处理插件下载、安装和 shell 源代码的生成。
  • add,edit,remove 会自动更新配置文件

详细使用,可以参考官方说明,常用的就是 sheldon lock --update 更新所有插件。

配置结构

1
2
3
4
5
6
7
8
9
# ~/.config/sheldon/plugins.toml

# ┌─ Unique name for the plugin
# ┌──┴─┐
[plugins.base16]
github = "chriskempson/base16-shell"
# └─────┬────┘ └─────┬────┘
# │ └─ GitHub repository name
# └─ GitHub user or organization

Read more »

缘起

偶尔出差的时候,需要访问家里的网络,办公室已经有一台服务器使用了 Zerotier网络,索性就把家里的路由也加到网络里面,这样的话,就可以同时访问公司和家里的网络了。因为办公室那台是我控制的,所以不会出现其他同事会进入到家庭网络的情况。

ZeroTier 是一款软件定义网络(SDN)解决方案,可以帮助企业快速部署和管理全球虚拟网络。它使用一个分布式的虚拟交换机来连接所有的节点,无需物理交换机或配置复杂的 VPN。ZeroTier 可以在任何地方部署,包括云、数据中心、家庭和办公室。它还可以与其他 SDN 解决方案集成,如 OpenFlow 和 Cisco ACI。ZeroTier 还可以通过多个平台使用,包括 Windows、macOS、Linux、Android 和 iOS。

安装 Zerotier-one-moon

由于 Zerotier 的中转服务器都在国外,访问速度有可能会慢,所以增加一台中转服务器。 使用 zerotier-one-moon 可以快速一键部署自己的中转服务器。我这里就找了一台闲置的阿里云服务器,使用下来速度还可以,基本感受不到卡顿。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: "3.5"

services:
zerotier-moon:
image: ghcr.io/gythialy/zerotier-one-moon:latest
container_name: zerotier-moon
cap_add:
- NET_ADMIN
- SYS_ADMIN
devices:
- /dev/net/tun
ports:
- 9993:9993/udp
command:
- -4 xxx.xxx.xxx.xxx
- -p 9993
volumes:
- ./zerotier-one:/var/lib/zerotier-one

服务正常启动后,会得到 moon id,类似 61941d46d1,已经服务器的公网 IP 和端口,记得在防火墙把响应的端口打开。

配置 Zerotier 账号

账号本身没什么,就是注册登陆后建立一个 Zerotier 网络,这里建议设置成 private network,这样别人就不能随便加入了。

授权自己的接入点

因为设置成了 private network,所以默认是无法加入这个网络的,可以在 Zerotier 的网络管理界面看到哪些点,然后在 auth 上勾选一下,就授权了这个点接入了。

设置分配 IP 的网段

其实不设置根本没问题,你只要设置好路由表保证分配的网段范围都划分到同一个 LAN 就行。我这里设置成了 10.147.17.1~10.147.17.254,保证这个 IP 段不和你两端任意一段路由器的 LAN IP 段冲突就行。

路由设置

在 菜单 VPN/Zerotier 中填入刚才在网页上生成的 Network ID,保存并应用即可,正常情况下 Zerotier 的服务应该就启动起来了。

启动完成后,在 Zerotier 的网络管理界面授权通过,至此路由就应该连接到了 Zerotier 网络。

设置 Zerotier Moon

通过命令行 sudo zerotier-cli orbit 61941d46d1 61941d46d1 添加 Zerotier moon。可以通过 SSH 登录到路由器,或者通过 OpenWRT 提供的 TTYD 终端都可以,看个人习惯。

可以通过 sudo zerotier-cli peers 查看节点的连接情况

1
2
3
4
5
6
7
8
9
200 peers
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
61941d46d1 1.6.5 MOON 10 DIRECT 307 306 139.224.186.142/9993
61d294b8cb - PLANET 168 DIRECT 2593 2431 50.8.73.34/9993
62f845ae71 - PLANET 321 DIRECT 2593 7327 50.8.252.138/9993
748cde7190 - PLANET 232 DIRECT 7640 2361 103.195.108.66/9993
952fcf1db7 - PLANET 247 DIRECT 1628481820060 2346 195.181.174.159/9993
a05acf0233 1.6.4 LEAF 205 DIRECT 2773 2773 34.135.35.67/46781
c8a68837ae - LEAF -1 RELAY

如果出现 <role> 为 MOON 的节点信息,则表示通过 moon 提速完成,上表中的 IP 和 Zerotier Id 都是随机的生成的。

设置 Zerotier 的路由表

在 Zerotier 的网络管理界面中添加路由表,我的路由表如下:

1
2
10.147.17.0/24 (LAN)
192.168.5.0/24 via 10.147.17.151

第一个表示 10.147.17.0/24 这是同一个局域网,分配出来的 IP 在这个范围的直连就行了,不用过别的网关了。

第二条表示,家庭的路由器后网段是 192.168.5.0/24,而 OpenWRT 在 Zerotier 网络得到的 IP 是 10.147.17.151(这个可以在 zerotier 网站查,也可以通过 ifconfig 命令在路由器查),那么 zerotier 局域网内的其他 IP 要访问这个 192.168.5.0/24 网段的话,自然要通过 10.147.17.151 作为网关。

如果有多个网络的话,增加多条路由表即可,不过 Zerotier 免费的版本,最多可以添加 25 个设备,如果超过这个设备的话,可以通过之间 PLANT 来解决。

后记

在 OpenWRT 上配置好 Zerotier 后,路由后的所有设备都可以直接访问 10.147.17.x 段的服务,无需做其他配置。在出差的时候,在本地启动 Zerotier 服务后,也可以直接访问家中的 192.168.5.x 的服务,比如 NAS 之类的。

---EOF---

  • 通过 lsblk 参考分区信息,我这边新加的分区为 /dev/sdb1,后面都以此为例
1
2
3
4
5
6
7
8
9
root@OpenWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 316.5M 0 disk
├─sda1 8:1 0 16M 0 part /mnt/sda1
│ /boot
│ /boot
└─sda2 8:2 0 300M 0 part /rom
sdb 8:16 0 5G 0 disk
└─sdb1 8:17 0 5G 0 part /overlay
  • cfdisk 分区, 具体用法可以参考 cfdisk(8)
1
2
3
4
5
6
7
                                              Disk: /dev/sda
Size: 316.5 MiB, 331874304 bytes, 648192 sectors
Label: dos, identifier: 0x9e16c055

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 33279 32768 16M 83 Linux
>> /dev/sda2 33792 1057791 1024000 500M 83 Linux

注:我这边已经分好区了,所以这里没现实,正常最下面绿色的 Free Space 就是待分区的部分

  • mkfs.ext4 /dev/sdb1: 创建文件系统

  • mount /dev/sdb1 /mnt/sdb1: 挂载格式化好的分区到 /mnt/sdb1 目录

  • cp -r /overlay/* /mnt/sdb1: 复制现有配置到新挂载的分区

  • 检查文件是否复制成功

1
2
3
4
5
6
7
root@OpenWrt:~# ls -al /mnt/sdb1
drwxr-xr-x 5 root root 4096 Oct 9 13:55 .
drwxr-xr-x 1 root root 4096 Oct 9 13:52 ..
lrwxrwxrwx 1 root root 1 Oct 9 2022 .fs_state -> 2
drwxr-xr-x 2 root root 4096 Oct 9 13:55 etc
drwxr-xr-x 10 root root 4096 Oct 9 13:52 upper
drwxr-xr-x 3 root root 4096 Oct 9 13:55 work
  • 系统/挂载点 菜单下配置挂载点

  • 重启系统后,可以在 系统/软件 下面查看剩余空间,正常情况下,就应该是新挂载分区的大小

在后续升级后,只要执行最后一步,重新挂载后就可以恢复原来的配置。

---EOF---

缘起

GitLab 官方提供的镜像,如果是单独部署服务的话,相对而言还是非常简单的,通过 Let’s Encrypt 自动获取 SSL 证书,其他的服务也可以运行在一个容器内,只要把数据库和文件存储放在宿主机中,然后挂载到容器内部即可。但是如果是在 GitLab 之前放置一个反向代理来实现 TLS 和负载均衡的话,默认的配置就不够了,需要额外的配置。

实现

  • 配置 gitlab.local.rb

    gitlab.local.rb
  • 编写 docker-compose.yml

    docker-compose.yml
  • 启动

    • 通过 Docker Compose 启动
      1
      docker-compose up -d
    • 通过 Docker Swarm 启动
      1
      2
      docker stack rm gitlab && \
      docker stack deploy --prune --with-registry-auth --resolve-image=always -c docker-compose.yaml gitlab

参考链接

  • NGINX settings
  • Omnibus gitlab-ce behind nginx reverse proxy – settings for Pages

---EOF---

步骤

  • STEP1: 编写 Dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    FROM golang:1.16 AS build-env

    # Build Delve

    RUN go get github.com/go-delve/delve/cmd/dlv

    COPY . /app
    WORKDIR /app

    RUN go mod download

    EXPOSE 40000

    ENTRYPOINT ["dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "debug", "/app/cmd/"]

    注:这里是把代码全部复制到进行中,也可以只复制编译好的文件。如果是编译好的文件,编译的时候需要设置 -gcflags "all=-N -l"

  • STEP2: 编译 docker 镜像

    1
    docker build -f docker/Dockerfile.debug -t qlcchain/go-qlc:debug  .

Read more »

  1. 安装 CIFS Utils pkg
    1
    sudo apt-get install cifs-utils
  2. 创建一个挂载点
    1
    sudo mkdir /mnt/local_share
  3. 创建文件保存 ~/.smbcredentials 来保存 SMB 用户名和密码
    1
    2
    username=smb_share
    password=share_password
  4. /etc/fstab 最后添加配置实现自动挂载
    1
    2
    # /etc/fstab
    //$smb_server/share /mnt/local_share cifs credentials=/home/$user/.smbcredentials,uid=1000,gid=1000,iocharset=utf8 0 0

    注:$smb_server 为 SMB 服务器地址,$user 为当前用户名,uid/gid 为当前用户的 uidgid,可以通过 id $(whoami) 查看

---EOF---

缘起

区块链是作为一种创新技术,具有三大特点,即 “去中心化”、“集体维护”、“防篡改”。采用区块链技术构建的平台具有极高的数据安全性、集体信任以及数据资产溯源等特性和能力。这些特性和能力为供应链金融搭建可持续运行的安全运营平台提供了可靠的技术支撑环境。

当前区块链技术已经形成了三种类型,即 “公有链”、“私有链” 以及 “联盟链”。

  • 以比特币、以太坊为代表的就是典型的 “公有链” 平台。在公有链平台上,最为典型的特点就是 “匿名性”,在匿名环境下如何确保所有成员的 “诚实”,比特币和以太坊都采用了 PoW 的共识模式。PoW 的本质是你付出足够多的计算资源(也就是算力,或者成本),证明你是诚实的。为了确保 PoW 能正常工作,公有链上的节点需要能够查看所有交易的信息

  • 私有链就是企业内部使用的区块链平台,与当前的企业信息系统一样与外界保持着高度的安全隔离机制

  • 联盟链与公有链最显著的区别是联盟链不采用匿名机制,相反具有严格的成员准入机制。也就是说,所有参与平台的计算节点、业务主体都全部是具名的,并有唯一的身份证书

商业的本质是信息不对称,商业机密是一个企业确立竞争优势的基础。也就是说任何企业不期望自身的商业信息被其它无关企业甚至竞争对手掌握。我们以比特币为例来看,通过区块链浏览器就能查询到区块中交易的一些信息。尽管比特币具有匿名性,但这些信息假如在商业环境中出现,竞争对手有可能分析出来一些商业行为的蛛丝马迹甚至能部分推测出竞争对手的身份和商业策略。区块链技术公开、透明以及分布式存储的特性与商业企业信息保密这一刚性需求产生了矛盾。

Read more »

最近在回顾 2020 的计划的时候,发现有不少任务进展不尽如人意。抛开 COVID-19 的影响,事实上这方面的影响确实也很小。经过反思,比较大的差别,在 2020 年的计划中有几件事情是之前很少涉猎的。但是在处理这些问题时,并没能摆正自己的心态,缺少对行业的敬畏之心。

这让我想起之前很火的 邓宁 - 克鲁格心理效应,其描述的是一种认知偏差。貌似我就属于了这种情况,在新的领域错误地预估了自己的实力,按照过往经验做了一些错误的决策,导致了最终的失败。在反思的过程中,我觉得我就是回到了绝望之谷。

有意思的是,在 《指月录》,卷二十八中有 “见山是山,见山不是山,见山还是山。” 的说法。我觉得这两者有异曲同工之妙。

原文如下:

吉州青原惟信禅师

上堂。老僧三十年前。未参禅时。见山是山。见水是水。及至后来亲见知识。有个入处。见山不是山。见水不是水。而今得个休歇处。依前见山只是山。见水只是水。大众。这三般见解。是同是别。有人缁素得出。许汝亲见老僧 (更参三十年迥无入处在)。

当然了我也不是什么禅宗高手,也没有多深入的研究,姑妄言之:

  • 人生第一重界:看山是山,看水是水。对看到事物的初步感受,因为这时候人没有太多复杂的观念在里面,可谓初识世界,纯洁无瑕。眼睛看见什么就是什么,山就是山,水就是水,没有 “弱水三千,只取一瓢饮” 之说,山水虫鱼,万事万物都是它自己本身。

  • 人生第二重界:看山不是山,看水不是是水。看到世间万物之后,开始对他们进行思考,我们不再停留于简单的第一印象,我们开始探寻事情背后更深层的东西。于是我们说 “白马非马”,“陋室不陋”、“花非花,雾非雾”,山水虫鱼,万事万物都不是它自己本身。经历过见山不是山的阶段,就是经过困惑、怀疑,好像对又好像不对的阶段,要仔细推敲,思考,心中似乎已找到答案,却又不敢肯定的过程。

  • 人生第三重界:看山是山,看水是水。放下一切,万法随缘。这里所说的看山是山,看水是水,已经不是简单的重复,而是经过初识,迷惑之后的大悟,是我们留下好的文化认知,把不好的观念摒除之后的山水,是更有韵味的山水。

其实不管是说开悟之坡,还是第三层的看山是山,看水是水,都不是那么容易到达的境界。对应到编程的阶段,也就是第一阶段,熟练使用某一门语言,会用一些别人写的框架,了解基本的套路和架式。第二阶段,深入理解底层的原理,知其然并知其所以然,能写一些框架 / 库之类的给别人用,第三阶段,不在局限语言本身,能全局把握整个系统的设计,把自己世界观映射到系统,一花一世界吧。一、二阶段应该都属于术,第三阶段才是道。应该大多数人都到不了第三阶段吧,但是如何从第二阶段到第三阶段呢?自觉就是经验和练习,参与更多地实践,但真的如此么?比如软件有设计模式,前人根据经验总结出各种套路,供新手快速入门。看起来就是经验非常重要,很多时候也是高级工程师和初级工程师的差别。在现代医学上,在临床决策的时候,有通过 循证医学(ESB) 辅助决策,其和与传统医学的不同处是,它并不依赖于经验主义或过往案例,提倡使用正式且明确的方法来分析证据,并提供给决策者。详细的细节,可以查看 科普视频。当然了不同的行业有很多差别,不能教条地死搬硬套,这套方法论的核心应该就是把不确定性的东西转化成可回答的问题,然后逐步论证。

一点胡思乱想,记录下,等有新想法了再更新。

---EOF---

0%