GOLANG 的交叉编译以及 strip

交叉编译需要知道支持的 GOOS 以及 GOARCH,我们运行 go tool dist list 就可以得到支持的OS 以及硬件平台的组合

$ go tool dist list|paste - - - - -
aix/ppc64       android/386     android/amd64   android/arm     android/arm64
darwin/386      darwin/amd64    darwin/arm      darwin/arm64    dragonfly/amd64
freebsd/386     freebsd/amd64   freebsd/arm     js/wasm linux/386
linux/amd64     linux/arm       linux/arm64     linux/mips      linux/mips64
linux/mips64le  linux/mipsle    linux/ppc64     linux/ppc64le   linux/s390x
nacl/386        nacl/amd64p32   nacl/arm        netbsd/386      netbsd/amd64
netbsd/arm      openbsd/386     openbsd/amd64   openbsd/arm     plan9/386
plan9/amd64     plan9/arm       solaris/amd64   windows/386     windows/amd64
windows/arm

检查当前的环境变量设置:

$ go env GOOS GOARCH

编译时把 -s -w 传递进 ldflags 我们就可以得到 strip 的二进制文件,以下是 aliyun-cli 项目的编译

$ go build -ldflags "-s -w -X 'github.com/aliyun/aliyun-cli/cli.Version=3.0.37'" -o out/aliyun main/main.go

香橙派上,只要 export GOARCH=arm64 就可以编译成功 aliyun cli 了。 然后就可以通过命令行来自动注册香橙派的 DNS 了。

关于代码开发中的 Changelog

因为我们在做一个项目的自动版本更新(让用户手动点击更新 SaaS 软件的版本),开发中混乱的版本管理和 Commit 注释,有时候让人抓狂。

这里有两个链接或许值得阅读:
https://keepachangelog.com/en/1.0.0/
https://co-pilot.dev/changelog#best-practices-release-dates-apply

  • Changelog 的正式文件名就叫 CHANGELOG.md
  • 必须是倒排序的
  • 用 ISO 格式(YYYY-MM-DD)来写日期,并和版本号一起写在每个 Change 的开头
  • 对不同的修改进行归类
  • 高亮重大的修改和功能废弃

这篇文章里有比较好的例子: https://depfu.com/blog/what-makes-a-good-changelog
另外可以参考 github 上 MD 写作指引: https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax

git tag 的理解和版本管理的自动整合

微博中有很多 hash tag,其实来源于 Twitter,部分微信用户也会在自己的朋友圈文章中打 Hash tag,当然只是自己搜索有用,没有其他用处。

开发里有个说法:代码即文章,文章即代码;那当然是要把代码写得非常优雅才可以。 本文旨在通过 git tag 相关命令 ,对版本打标签的做法予以自动化集成到代码的 Web 界面,并能在 SaaS 情形下,让客户自己决定是否更新版本,一个鼠标点击即可完成版本升级。

先来讲一下 git 里面的两种 tag,一个叫 Annotation, 一个叫 Lightweight,我们姑且称为注释标签和轻量标签,前者带有很多 MetaData,后者则没有任何 MetaData,是跟随当前 commit 而来的。 我们先讲这个简单,也在刚开始把我们弄糊涂的轻量标签。

简单而言, 打标签是需要在代码 commit 完, push 之前做的一个步骤。 git tag -a TAGNAME 就是注释标签,没有 -a 就是轻量标签。举例

$ git commit README.md -m "先 commit 再  git tag v2.0.11"
$ git tag v2.0.11  // 添加轻量标签
$ git show v2.0.11  // 验证
commit 9cc9c4a32d581e1aed98b2378104f2d5e29c02bd (HEAD -> edu1.1, tag: v2.0.11)
$ git describe
v2.0.10-1-g9cc9c4a3
$ git show-ref --tags v2.0.11
9cc9c4a32d581e1aed98b2378104f2d5e29c02bd refs/tags/v2.0.11
$ git describe --tags
v2.0.11
$ git push  // push 代码 
$ git push origin tag v2.0.11  // push 标签

这里有一个困惑的地方就是 git describe 的输出, 没有 –tags 参数的时候,输出的其实是 v2.0.10-1-g9cc9c4a3,这是从上一个注释标签开始以来的标签。我们看下 git describe 的解释

The command finds the most recent tag that is reachable from a commit. If the tag points to the commit, then only the tag is shown. Otherwise, it suffixes the tag name with the number of additional commits on top of the tagged object and the abbreviated object name of the most recent commit. The result is a “human-readable” object name which can also be used to identify the commit to other git commands.

By default (without –all or –tags) git describe only shows annotated tags. For more information about creating annotated tags see the -a and -s options to git-tag(1).

有了对以上命令的理解,注释标签就很好解释了, 添加注释标签类似对代码 commit ,就是需要 -m 用来添加对标签的注释。 其他就是 push 的时候需要把标签一起 push 出去。

如果我们在以上一个完整的周期完成后,继续提交代码,但是遗忘了打标签,我们用 git describe 加和不加 --tags 可以看到区别:
$ git describe // 针对注释标签
v2.0.10-2-g54a3d4ca
$ git describe --tags  // 针对任意类型标签
v2.0.11-1-g54a3d4ca

我们可以用 $ git tag -l -n 3 列出所有的标签 ,3 表示输出最多3行注释
在 git 的新版本里,支持 sort
我们可以使用

git tag -l -n --sort="v:refname"

来对 v2.01 之类的版本号标签,根据版本号排序。在 sort 后面的变量前面加一个 减号,我们可以倒排序,这样,我们就可以自动生成 Release Notes 了

git tag -l -n --sort=-"v:refname"

删除远程标签:

$ git push --delete origin tagname

Vuejs 的版本管理, 可以直接用 npm version v1.x.x -m “版本注释” 直接推送, npm 会直接管理 git 版本号,然后用 $ git push origin master –follow-tags 就可以把代码和版本一并推送到代码库,然后在相应的代码文件里,直接调用 config.version 即可读取到 package.json 文件里,自定义的软件包的版本号了。

同样的对于小程序项目,没有 package.json 文件,我们可以手工创建一个:

然后,我们用同样的 npm version v1.2.3 -m “注释” 之类的打标签,然后用 git push origin master –follow-tags 把所有标签都 push 出去

后记, 每次打完标签, 要打很多字,而且 branch 的名字各不相同,写了一个 alias,放到 profile 里, 以后每次 commit 好代码,打完标签,只要敲 .push 就可以推送带标签的代码了:

alias .push='git push $(git remote|tail -1) $(git branch|awk '"'"'/^\*/ {print $NF}'"'"') $(git describe --tags)'
另外如果要查找当前目录下的版本库的顶层目录用:
$ git rev-parse --show-toplevel 

Go 语言动态追踪 git 的版本号,需要在编译时,传入版本号的变量:

ver=$(git describe --tags)
go install -ldflags "-X main.file_v=$ver" myprog.go
这里 file_v 是 main 函数里定义的变量 

Issue Tracker 开源软件 Trac 在 Ububtu 18 上的安装

$ sudo apt install libmariadbclient-dev python-pymysql
$ sudo pip install trac mysql-python
创建 MySQL 数据库:
MariaDB [(none)]> create database trac_k12 default charset utf8mb4 default collate utf8mb4_bin;
当然接下来是 grant all on … ; flush privileges;
建立项目目录: $ mkdir /opt/trac/k12 (当然你可以任意指定自己想运行的目录)
$ /usr/local/bin/trac-admin /opt/trac/k12 initenv
输入项目名称
输入 MySQL String: mysql://mysql_username:mysql_pass@localhost:3306/trac_k12
成功后就可以看到如下截图了:

添加管理员:
trac-admin /opt/trac/k12 permission add admin TRAC_ADMIN

先看下 nginx 的一个配置,我们姑且写为 /etc/nginx/conf.d/trac.conf
这个 chrome 是干么用的? 不解? 然后 后面整个的是一堆 404

1 server {
2 listen 80;
3 server_name trac.local;
4 access_log /var/log/nginx/trac.log;
5 error_log /var/log/nginx/trac.err;

 6    location ~ /chrome/(.*) {
 7               alias /opt/trac/k12/htdocs/$1;
 8    }

 9    location ~ / {
10              auth_basic "trac realm";
11              auth_basic_user_file /opt/trac/.trac.pass;

12              # socket address
13              fastcgi_pass   unix:/opt/trac/run/k12.sock;

14              # python - wsgi specific
15              # fastcgi_param HTTPS on;

16              ## WSGI REQUIRED VARIABLES
17              # WSGI application name - trac instance prefix.
18              # (Or ``fastcgi_param  SCRIPT_NAME  /some/prefix``.)
19              fastcgi_param  SCRIPT_NAME        "";
20              fastcgi_param  PATH_INFO          $1;

21              ## WSGI NEEDED VARIABLES - trac warns about them
22              fastcgi_param  REQUEST_METHOD     $request_method;
23              fastcgi_param  SERVER_NAME        $server_name;
24              fastcgi_param  SERVER_PORT        $server_port;
25              fastcgi_param  SERVER_PROTOCOL    $server_protocol;
26              fastcgi_param  QUERY_STRING       $query_string;

27              # For Nginx authentication to work - do not forget to comment these
28              # lines if not using Nginx for authentication
29              fastcgi_param  AUTH_USER          $remote_user;
30              fastcgi_param  REMOTE_USER        $remote_user;

31              # for ip to work
32              fastcgi_param REMOTE_ADDR         $remote_addr;

33              # For attchments to work
34              fastcgi_param    CONTENT_TYPE     $content_type;
35              fastcgi_param    CONTENT_LENGTH   $content_length;
36          }
37  }
$ nl /usr/local/lib/python2.7/dist-packages/trac.py

    1  #!/usr/bin/env python
     2  import os
     3  sockaddr = '/opt/trac/run/k12.sock'
     4  os.environ['TRAC_ENV'] = '/opt/trac/k12'

     5  try:
     6       from trac.web.main import dispatch_request
     7       import trac.web._fcgi

     8       fcgiserv = trac.web._fcgi.WSGIServer(dispatch_request,
     9            bindAddress = sockaddr, umask = 7)
    10       fcgiserv.run()

    11  except SystemExit:
    12      raise
    13  except Exception, e:
    14      print 'Content-Type: text/plain\r\n\r\n',
    15      print 'Oops...'
    16      print
    17      print 'Trac detected an internal error:'
    18      print
    19      print e
    20      print
    21      import traceback
    22      import StringIO
    23      tb = StringIO.StringIO()
    24      traceback.print_exc(file=tb)
    25      print tb.getvalue()

然后我们用普通用户手工运行这个 trac.py ,然后重启 Nginx , 就可以通过浏览器 http://trac.local 进入 Trac 了。

Vue.JS 项目用 Cordova 打包成 App

CSDN 上的这篇文章已经解释得比较清楚了。
但是 Cordova 的环境其实要先准备好,检查的办法是运行命令:cordova requirements
其实是先要安装 Android Studio ,然后运行 studio.sh , 进入 Tools->SDK Manager 安装 SDK。
SDK 安装在 $HOME/Android/Sdk 下, 设置ANDROID_SDK_ROOT=$HOME/Android/Sdk
ANDROID_HOME= $HOME/Android/Sdk
JAVA_HOME=/opt/android-studio/jre
export PATH=$PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools

最核心的遇到多版本 Java, cordova build android 会报告 “Requirements check failed for JDK 8 (‘1.8.*’)! Detected version: 11.0.4″, 这个时候,我们需要运行 sudo update-alternatives --config javac 来设置正确的 Java 版本。

把 CSDN 上面提到的那篇文章,重新简写一遍:
1. sudo npm install -g cordova
2. cordova create sampleapp_name com.sample.package_name sampleapp_title
3. $ mv www www.orig; 然后 copy Vue 项目下的 dist 文件夹的 index.html 以及 static 目录到 www 文件夹下
4. cordova platforms add android –save (然后可以运行 cordova run android 需要真机或者模拟器)
5. cordova build android 生成 apk 文件,此时生成为 debug 目录下的 debug apk 文件
6. 生成签名证书, keytool -genkey -v -keystore sampleapp.keystore -alias sampleapp -keyalg RSA -validity 36500
7. 项目根目录创建 build.json 文件如下:

{
“android”: {
“release”: {
“keystore”: “sampleapp.keystore”,
“alias”: “sampleapp”,
“storePassword”: “123456”,
“password”: “123456”
}
}
}

8. 运行 cordova build android –release 就生成一个带签名的apk文件





prettier 美化代码

# cnpm install -g prettier
# 对于 yaml 文件的美化, 编辑 .prettierrc 或者 .prettierrc.yaml

# .prettierrc or .prettierrc.yaml
trailingComma: "es5"
tabWidth: 4
semi: false
singleQuote: true

运行 prettier –write –config ~/. prettierrc hello.yml 即可直接做美化修改,把 –write 替换成 –check 就是只检查
原文: https://prettier.io/docs/en/configuration.html

curl POST 数据接口调试方法

原文: http://osxdaily.com/2017/01/30/curl-post-request-command-line-syntax/
1. 无数据 POST
curl -X POST http://URL/example.php

2. 带参数 POST
curl -d "data=example1&data2=example2" http://URL/example.cgi

3. 表单 POST
curl -X POST -F "name=user" -F "password=test" http://URL/example.php

4. 上传文件
curl -X POST -F "image=@/path/example.gif" http://URL/uploadform.cgi

5. 发送 JSON 数据
curl -H "Content-Type: application/json" -X POST -d '{"user":"bob","pass":"123"}' http://URL/

以上这几个看完,什么 Postman, 什么 Apizza 都是浮云了。