机械境

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

缘起

Go 语言除了语法精炼、并发支持好外,还有一个优点就是可以调用 C 代码。可以直接在 Go 源代码里写 C 代码,也可以引 C 语言的外部库。这样在性能遇到瓶颈的地方可以重写,或者某些功能 Go 和第三方还缺失,但 C 语言有现成的库就可以直接用了。

官方 Cgo 这块目前有一篇 博客命令行文档。比如 sqlite 的 golang 驱动 go-sqlite3 就是基于 Cgo 的实现。编译本地版本,Go 本身已经支持得非常好,基本不需要额外设置,直接通过 go build 编译即可,但是要想编译其他平台的二进制版本,就需要跨平台的 $(CC), $(CXX) 支持。

方案

按照 Cgo 的编译思路,基本思路就是必须有一个跨平台的 C/C++ 编译器才可能实现交叉编译。

macOS

  • 安装编译器

    1
    2
    brew install FiloSottile/musl-cross/musl-cross
    brew install mingw-w64
  • 编译

    Make 文件中指定 $(CC),$(GCC)musl-cross 提供的编译器,编译安装

注:此方案未验证,有兴趣的可以自行研究

Read more »

需求

编译 Golang 程序时自动更新版本号,主版本号手动指定,子版本号通过 Git rev 和编译时间自动更新

实现方法

Go Linker

go tool link 中有选项可以设置在编译时设置字符串或者未初始化的变量

-X importpath.name=value
Set the value of the string variable in importpath named name to value.
This is only effective if the variable is declared in the source code either uninitialized
or initialized to a constant string expression. -X will not work if the initializer makes
a function call or refers to other variables.
Note that before Go 1.5 this option took two separate arguments.

Read more »

Codereview 中常见的缩写:

  • TL;DR: Too Long; Don’t Read. PR 内容太多,没办法看
  • PR:Pull Request. 拉取请求,给其他项目提交代码
  • PTAL:Please take a look. 请看一看
  • LGTM: Looks Good To Me. 代码已经过 review,可以合并
  • SGTM: Sounds Good To Me. 和上面那句意思差不多,也是已经通过了 review 的意思
  • WIP: Work In Progress. 告诉项目维护者这个功能还未完成,方便维护者前 review 已提交的代码
  • PTAL: Please Take A Look. 提示项目 Owner/contributor review
  • TBR: To Be Reviewed. 提示维护者进行 review
  • TBD: To Be Done (or Defined/Discussed/Decided/Determined). 根据语境不同意义有所区别,但一般都是还没搞定的意思
  • IMO: In My Opinion 在我看来、依我看、依我所见
  • IMHO: In My Humble Opinion IMO 谦虚的说法
  • LGT1: Looks Good To 1. 如果有一个回复 LGTM 则可以添加为 LGT1,1 代表目前有 1 个赞
  • LGT2: Looks Good To 2. 如果有两个回复 LGTM 则可以添加为 LGT2,2 代表目前有 2 个赞
  • DNM: Do not merge. 不要合并

注: 现在 GitHub 已经支持发起 Draft PR,实现了 WIP 的功能

---EOF---

介绍

Zsh 是一个 Linux 下强大的 shell, 由于大多数 Linux 产品安装,以及默认使用 bash shell, 但是丝毫不影响极客们对 zsh 的热衷,几乎每一款 Linux 产品都包含有 zsh,通常可以用 apt-get、urpmi 或 yum 等包管理器进行安装

Zsh 具有以下主要特点:

  • 开箱即用、可编程的命令行补全功能可以帮助用户输入各种参数以及选项
  • 在用户启动的所有 shell 中共享命令历史
  • 通过扩展的文件通配符,可以不利用外部命令达到 find 命令一般展开文件名
  • 改进的变量与数组处理
  • 在缓冲区中编辑多行命令
  • 多种兼容模式,例如使用 /bin/sh 运行时可以伪装成 Bourne shell
  • 可以定制呈现形式的提示符;包括在屏幕右端显示信息,并在键入长命令时自动隐藏
  • 可加载的模块,提供其他各种支持:完整的 TCP 与 Unix 域套接字控制,FTP 客户端与扩充过的数学函数
  • 完全可定制化

虽然说 Zsh 是开箱即用,但是为了更好用,还是需要一些定制化的配置。之前一直使用 oh-my-zsh, oh-my-zsh 把主题、插件等都是一起管理的,但是很多其他的主题和插件,且都是由不同的作者开发的,这样的话,管理起来就比较麻烦。antigen 就是针对此问题,应运而生。

Read more »

介绍

traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持 Docker, Swarm, Mesos/Marathon, Mesos, Kubernetes, Consul, Etcd, Zookeeper, BoltDB, Rest API 等等后端模型。

为什么选择 traefik?

  • Golang 编写,单文件部署,与系统无关,同时也提供小尺寸 Docker 镜像。
  • 支持 Docker/Etcd 后端,天然连接我们的微服务集群。
  • 内置 Web UI,管理相对方便。
  • 自动配置 ACME (Let’s Encrypt) 证书功能。
  • 性能尚可,我们也没有到压榨 LB 性能的阶段,易用性更重要。
  • Restful API 支持。
  • 支持后端健康状态检查,根据状态自动配置。
  • 支持动态加载配置文件和 graceful 重启。
  • 支持 WebSocket 和 HTTP/2。

借用官网的图,一图以蔽之

Read more »

需求

在 Github 有几个私有仓库需要做 CI/DI,由于是私有项目,不能用免费的 travis 处理,所以临时在一台服务器上部署了几个脚本,简单处理一下。GitHub 限制了每个项目都必须用不同的 deploy key,我又不想把我自己的私有 key 部署到服务器上。

目标

在一台机器上通过 deploy 拉取 GitHub 私有仓库的代码,编译后做自动部署。

准备

在做 CI/DI 的机器上分别生成不同的 deploy key,并添加到 GitHub repo 里。具体过程这里就不赘述了,官方 帮助文档 写得特别清楚。

配置

  • 更改 git clone 的地址

    一般地址的格式为为 git@github.com:$user/$repo.git。我们以三个 repo 为例,假定三个 repo 的名字分别为 repo1,repo2,repo3.

    变化后的地址为:

    • git@github.com:$user1/$repo1.git => ssh://git@$repo1.github.com/$user1/$repo1.git
    • git@github.com:$user1/$repo2.git => ssh://git@$repo2.github.com/$user1/$repo2.git
    • git@github.com:$user2/$repo3.git => ssh://git@$repo3.github.com/$user2/$repo3.git
  • 然后在 ~/.ssh/config 中添加下面的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Host repo1.github.com
    User git
    HostName github.com
    IdentityFile ~/.ssh/repo1_rsa

    Host repo2.github.com
    User git
    HostName github.com
    IdentityFile ~/.ssh/repo2_rsa

    Host repo3.github.com
    User git
    HostName github.com
    IdentityFile ~/.ssh/repo3_rsa

拉取代码

git clone ssh://git@$repo1.github.com/$user1/$repo1.git 的方式拉取代码即可。如果是在修改配置前已经拉取下来的代码,可以修改 repo 的 url 为上面修改后的形式也是一样的。

---EOF---

准备工作

VSCode 安装 Debugger for Chrome

配置

在 Debug 试图增加下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [{
"name": "Launch localhost with sourcemaps",
"type": "chrome",
"request": "launch",
"url": "http://localhost:4200",
"sourceMaps": true,
"webRoot": "${workspaceRoot}",
"trace": true,
"userDataDir": "${workspaceRoot}/.vscode/chrome",
// "runtimeExecutable": "/opt/google/chrome/google-chrome"
}]
}

需要注意的是 sourceMaps 一定要设成 true, 如果找不到 chrome 的安装路径,可以手动通过 runtimeExecutable 设置,比如我 Manjarro Linux 下的路径为 /opt/google/chrome/google-chrome

启动

一切配置好之后,在 Angular 工程目录通过 ng serve 启动项目,然后就可以打断点,在 Debug 试图通过 Launch localhost with sourcemaps 这个配置开始调试了。

---EOF---

Manjaro 是一款基于 Arch Linux、对用户友好、全球排名第 1 的 Linux 发行版。(排名数据源于 DistroWatch

在 Linux 圈,Arch 的确是一个异常强大的发行版。它有 3 个无与伦比的优势:

  • 滚动更新可以使软件保持最新;
  • AUR 软件仓库有着世界上最齐全的 Linux 软件
  • 丰富的 wiki 和活跃的社区让所有问题都可以快速得到满意的答案

为了解决 ArchLinux 的复杂安装,Manjaro 应运而生!

准备

下载镜像

可以从 官方 下载镜像,官方支持 Xfore, KDE, GNOME 三种桌面环境,社区版有更多桌面环境支持。根据个人喜好选择,我对 GNOME 版本比较熟悉,所以下载了 GNOME 版。也可以从 清华大学开源镜像 下载。

注: 清华的镜像比官方镜像稍微旧一些。

制作 U 盘启动盘

  • Windows
    Manjaro 官方手册推荐用 Rufus 制作启动盘,可惜一直没成功,最后使用 USBwriter 一步到位。
  • Linux
    sudo dd bs=4M if=/path/to/manjaro.iso of=/dev/sd[drive letter] status=progress [drive letter] 为 U 盘盘符。
Read more »
0%