#554 使用 git push --force-with-lease 替代 git push --force

2021-07-05

今天注意到了 git push 的一个参数 --force-with-lease,可以在 Remote 有更新的时候不执行强推。
我之前考虑过会有这样的情况发生:我准备强推之前,会做最后一次拉代码检查,无误之后 force push。但是这个检查和 push 之间有一个时间差,会不会在这期间有别的小可爱提交了代码呢?
这种情况是完全可能存在的,就像是线程安全问题,只是团队的规模消减了我对这种情况的担心。
但是 --force-with-lease 参数可以彻底化解我的这种担忧,我决定以后就改用这个参数了。

#553 Lua (5): 数据库

2021-07-05

之前安装了 sqlite,mysql 的客户端。这里用 mysql 做示例,跑跑看。

require "luasql.mysql"

dbParam = {
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    pass = '123456'
    db = 'test'
}

my = luasql.mysql()
conn = my:connect(dbParam.db, dbParam.user, dbParam.pass, dbParam.host, dbParam.port)

conn:execute("SET NAMES UTF8")
cur = conn:execute("select * from user")
print(cur:numrows())
repeat
    row = cur:fetch({}, "a")
    print(row)
until(not row)

conn:close()
my:close()

#552 Lua (4): 包

2021-07-04

由于想了解一下 OpenResty, 先看看 Lua 的语法。
这是第四篇,Lua 包的概念以及包管理工具 luarocks。

#549 Lua (3): 面向对象

2021-07-03

由于想了解一下 OpenResty, 先看看 Lua 的语法。
这是第三篇,关于 Lua 面向对象的一些简单例子。

#548 Lua (2): 其他姿势

2021-07-03

由于想了解一下 OpenResty, 先看看 Lua 的语法。
这是第二篇,接着说 Lua 基础语法。

#547 吊炸天的 GitHub Copilot

2021-07-02

一个月前看到了微软通过 OpenAI 独家授权的 GPT-3 弄了一个低代码编程语言 Power Fx,可以直接通过简单的自然语言来完成数据的各种复杂操作。
我看到演示,当时就非常惊讶。不过当时我觉得,估计也就只能到这个地步了(弄弄 Excel 公式),想要真的生成可用代码,可能还得等几年。
今天有看到了 GitHub 搞的这个 Copilot,我是真的惊了。
看网上的演示,就根据一点点注释,可以生成各种语言的代码,还可以提供多种选择。
Your AI pair programmer,真是此言不虚!
除非是从 GitHub 已有仓库中拿出来的,然后人工标注其用途(可能性非常小),否则这真是逆天了,超出了我对现阶段人工智能水平的认知。
不过现在是技术预览阶段,我已提交申请,不过不知道什么时候可以通过,我是真的想试试,要是用上这等神器,必定可以省不少事。
话说回来,老码农的价值肯定是会被压缩了一些些。
首先,还是得看看 Copilot 的水平,再说。
我现在真是太激动了,虽然可能会让程序员变得更卷,但是看到这样的技术进步,我还是非常开心。

Update @ 2021-11-01

Copilot 已经支持 neovim 和 JetBrains IDE (IDEA, PyCharm, WebStorm, PphStorm, Goland...) 了。

Update @2022-06-23

GitHub Copilot 宣布免费到 08/22,今后要收费,每个月 8 美元。我已经非常习惯 Copilot 了,但是这个价格对我来说还是不可接受的。

我搜索了一下 VSCode 的拓展商店,看到有一个新的 GitHub Copilot Nightly 版本,估计是给免费用户使用的。
另外还发现一个 GitHub Copilot Labs 拓展,可能是更加完善的版本,应该也是收费。

Update @2022-06-27

#545 Lua (1): 基础语法

2021-07-02

由于想了解一下 OpenResty, 先看看 Lua 的语法。

Lua 是啥

  • 开源
  • 嵌入式
  • 脚本语言引擎 (由标准 C 编写,非常容易和 C/C++ 相互调用)
  • 语法简单
  • 没有强大的标准库

我的理解是,给 C 项目嵌入 lua 语言支持,然后通过 lua 来实现上层业务逻辑的快速开发,或者系统的灵活拓展。

除了官方 Lua 之外,还有这两个实现:

  • LuaJIT OpenResty 当前采用的就是这个玩意(之前是标准 Lua) 重点!
  • Lupa Python 模块,实现了对 Lua 脚本的解析

安装

sudo apt install -y lua5.4

命令行输入 lua 可以启动一个交互 SHELL。

语法

  1. 不像 Python 用缩进区分代码段,也不像 C 用花括号,而是用 end
  2. 约定:下划线打头的大写字母组成的标识符作为 Lua 内部全局变量

关键字

and or
do while for repeat until break
if then else elseif end
true false nil
function return
in
local
goto

数据类型

  • nil
  • boolean
  • number11.11e2
  • string 单引号,双引号,或 [[ + ]]
  • table 数组(和 PHP 类似)
  • userdata C 语言结构
  • function 函数被视为一种数据结构
  • thread
-- type 返回字符串
type(a) -- nil

字符串

  • 字符串连接:..
  • 计算长度:一元操作符 #,也用于计算数组长度
常见操作
  • string.upper, string.lower, string.reverse, string.len
  • string.format
  • 模式匹配:
  • string.match
  • string.gmatch
  • string.sub
  • string.gsub(mainString, findString, replaceString, num)
  • string.find(str, substr, )
  • string.rep(str, n) 重复
  • string.char(arg), string.byte(arg[,int]) 整形和字符的转换

数组

  • 除了 nil 之外的所有值都可以用作索引
  • 方括号,和小数点取值都支持
    小数点取值的话,要求必须是合法标识符
常见操作
  • table.concat(table[, sep[, start[, end]]]) join
  • table.insert(table[, pos], value)
  • table.remove(table[, pos])
  • table.sort(table[, comp])

类型转换

数字 字符串

变量

  1. 默认为全局变量(和 Python 类似)
  2. 本地变量需要用 local 声明
  3. 没有初始化的变量为 nil
  4. 删除变量:x = nil,删除数组中的元素也是赋值 nil

函数

function average(...)
   result = 0
   local arg = {...}
   for i, v in ipairs(arg) do
      result = result + v
   end
   print("总共传入 " .. select("#",...) .. " 个数")
   return result / select("#", ...)
end
  1. 三个点 ... 表示可变参数,固定参数需要放到可变参数前面
  2. select('#', ...) 可变参数长度
  3. select(n, ...) 可变参数切片

异常处理

assert

error(message[, level]) -- 相当于抛出异常
-- level 0, 1, 2 分别表示没有附加信息,错误位置(文件 + 行号),调用函数

pcall(func, ...) -- 调用函数,返回是否有错误(boolean),错误信息
xpcall(func, error_callback, ...) -- 增加了异常处理

debug 模块

这里面有好多内容。

debug.debug -- 进入交互模式
debug.trackback -- 调用栈

其他

  1. lua 会先计算左值,再赋值,所以支持和 Python 一样的 a, b = b, a 这种变量交换。
  2. 注释:
  3. 单行 --
  4. 多行 --[[ ]]
  5. 逻辑运算中不等于:~=,不是常见的 !=,需要注意
  6. 自动垃圾回收,手动的话调用 collectgarbage