GitHub不支持相同SSH Key在不同GitHub账户下使用。所以除默认账户外,需要单独为新GitHub账号建立一个SSH Key。注意,使用ssh-keygen生成新key,出现提示输入文件名的时候(Enter file in which to save the key (~/.ssh/id_rsa): id_rsa_new)要输入与默认配置不一样的文件名,比如:我这里填的是 id_rsa_new。否则会覆盖之前生成的默认key。并用ssh-add命令将新创建的Key添加到由ssh-agent 维护的列表中。
Add support for generated columns (Peter Eisentraut)
The content of generated columns are computed from expressions (including references to other columns in the same table) rather than being specified by INSERT or UPDATE commands.
补丁说明
1 2 3 4 5 6 7 8 9 10 11
Generatedcolumns
This is an SQL-standard feature that allows creating columns that are computed from expressions rather than assigned, similarto a viewor materializedview but on a column basis.
This implements one kind ofgeneratedcolumn: stored (computed on write). Another kind, virtual (computed onread), is planned for the future, andsome room is left for it.
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
Caller reports file and line number information about function invocations on the calling goroutine’s stack. The argument skip is the number of stack frames to ascend, with 0 identifying the caller of Caller. (For historical reasons the meaning of skip differs between Caller and Callers.) The return values report the program counter, file name, and line number within the file of the corresponding call. The boolean ok is false if it was not possible to recover the information.
funchash(ingest []byte, cfg *blake2b.Config) []byte { hasher, err := blake2b.New(cfg) if err != nil { // If this happens sth is very wrong. panic(fmt.Sprintf("invalid address hash configuration: %v", err)) // ok } if _, err := hasher.Write(ingest); err != nil { // blake2bs Write implementation never returns an error in its current // setup. So if this happens sth went very wrong. panic(fmt.Sprintf("blake2b is unable to process hashes: %v", err)) // ok } return hasher.Sum(nil) }
对公钥进行一次哈希运算:
1
hash(pub, &blake2b.Config{Size: 20})
原文注释里是这样说的:
PayloadHashLength defines the hash length taken over addresses using the Actor and SECP256K1 protocols.
// Sign signs the given message, which must be 32 bytes long. funcSign(sk, msg []byte) ([]byte, error) { // secp256k1 就是最终的椭圆曲线签名,这个签名可以替换成secp256k1不同语言版本的实现 return secp256k1.Sign(msg, sk) }
原因是Go语言中,interface{}类型的变量包含了2个指针,一个指针指向值的类型,一个指针指向实际的值。MyNamespace实现了Namespace接口,n在传入Show(n)函数时被自动转型成为Namespace。var n *MyNameSpace = nil只是声明了该接口类型的实际值为nil,虽然我们把一个nil值赋值给它,但是实际上interface里依然存了指向类型的指针,所以拿这个interface变量去和nil常量进行比较的话就会返回false。