git-sync同步所有git库

同步指定目录中所有git库的一个简单shell脚本。

$ git sync .
> Found 27 repositories.

> Synching kitex => [#                          ] 3%
Already up to date.
> Synching kitex finish.

> Synching abcoder => [##                         ] 6%
Already up to date.
> Synching abcoder finish.

> Synching fastpb => [###                        ] 9%
Already up to date.
> Synching fastpb finish.

> Synching gopkg => [####                       ] 12%
Already up to date.
> Synching gopkg finish.

TL在Go如何实现oneof语义

TL的Type是一个总类型Class包含不同的结构子类型实例Object,类似于Protubuf中MessageOneof的关系。

Telegram的RPC TL片段1:

peerUser#9db1bc6d user_id:int = Peer;
peerChat#bad0e5bb chat_id:int = Peer;
peerChannel#bddde532 channel_id:int = Peer;

folderPeer#e9baa668 peer:Peer folder_id:int = FolderPeer;

在go库包中包含main包的方式

// file: golang.org/x/tools/go/cfg/cfg.go
package cfg

import (
	"bytes"
	"fmt"
	"go/ast"
	"go/format"
	"go/token"
)

// A CFG represents the control-flow graph of a single function.
//
// The entry point is Blocks[0]; there may be multiple return blocks.
type CFG struct {
	Blocks []*Block // block[0] is entry; order otherwise undefined
	noreturn bool // function body lacks a reachable return statement
}
// ...

使用Test来生成代码

一般我们会起一个main函数的go主文件来写逻辑用于生成代码,但有的时候不太方便在一个包里面有main函数,而生成代码的逻辑又是必须的且最好是就在同一个包内或临近包中,此时,可以利用Test的编译机制,将我们需要的代码生成逻辑写在TestAbc函数中。

辅助脚本

// file: github.com/cloudwego/frugal/internal/reflect/append_gen.sh
#!/bin/bash

FRUGAL_GEN_APPEND_MAP_FILE="append_map_gen.go"
FRUGAL_GEN_APPEND_LIST_FILE="append_list_gen.go"

rm -f $FRUGAL_GEN_APPEND_MAP_FILE
rm -f $FRUGAL_GEN_APPEND_LIST_FILE

exec go test -v -run=TestGenAppend -gencode=true

Kitex: Thrift-HTTP 映射的 IDL 规范

本规范是 ThriftHTTP 接口映射的 IDL 定义标准,包括服务、接口以及请求 requestresponse 参数定义规范和错误码定义规范。Kitex 部分实现了该规范,注解说明有标注支持情况。

规范说明

(1)本规范采用注解方式来描述接口信息,包括接口的 method, path 以及接口请求参数,返回参数位置(如 headercookie )、名称等信息

(2)本规范所述注解采用 api.{key}={value} 的形式,其中key通常用于指定该字段出现的位置如(headercookiequerybody 等), value 用于指定该字段在对应位置的实际名称, 一些功能性注解(如api.none, api.js_conv, api.http_code) 除外

(3)本规范中定义的IDL注解如 api.get, api.header 等,只支持小写,不支持大写或者大小写混用如api.GET, api.Header

文件整体规范

  • 一个服务 service 对应一个 thrift 主文件,主文件里的 method 都是针对当前服务对应接口,主文件可以引用其它 thrift 文件定义
  • 每个 Method 原则上对应一个 RequestResponse 定义
  • 原则上不建议 Request 复用,可以复用 Response

Add commits to another person's PR on Github repo

TLDR;

git push git@github.com:remoteUser/remoteRepo localBranch:remoteBranch

Explanation

The normal git push command usually looks like this:

git push origin branch

Pushing to another developer’s branch follows a similar pattern: origin is the other person’s repo, and branch maps your local branch to the same branch on their remote repo.

origin = git@github.com:remoteUser/remoteRepo

branch = localBranch:remoteBranch

Breaking down each variable:

remoteUser refers to the username of the developer who made the pr on your repo

remoteRepo refers to the name of the repo that the other developer is creating the PR from, usually, this is the same name as your repo.

localBranch refers to the branch name of your local copy of their remote branch

remoteBranch refers to the branch name of that their PR is originating from on their remoteRepo

Keep in mind, that you can only push to PRs from other developers on your repo if that developer selected “Allow edits from maintainers” when they created their PR.

Yesql - Sqlx的好搭挡

Yesql 解析一个SQL文件,提取出查询语句,自动生成对应的Go结构体,实现查询语句与代码分离,方便编写数据库查询逻辑。

安装

go get github.com/alimy/yesql

使用 GoDoc

创建sql文件

-- sql file yesql.sql

-- name: newest_tags@topic
-- get newest tag information
SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin 
FROM @tag t JOIN @user u ON t.user_id = u.id 
WHERE t.is_del = 0 AND t.quote_num > 0 
ORDER BY t.id DESC 
LIMIT ? OFFSET ?;

-- name: hot_tags@topic
-- get get host tag information
SELECT t.id id, t.user_id user_id, t.tag tag, t.quote_num quote_num, u.id, u.nickname, u.username, u.status, u.avatar, u.is_admin 
FROM @tag t JOIN @user u ON t.user_id = u.id 
WHERE t.is_del = 0 AND t.quote_num > 0 
ORDER BY t.quote_num DESC 
LIMIT ? OFFSET ?;

-- name: tags_by_keyword_a@topic
-- get tags by keyword
SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 ORDER BY quote_num DESC LIMIT 6;

-- name: tags_by_keyword_b@topic
SELECT id, user_id, tag, quote_num FROM @tag WHERE is_del = 0 AND tag LIKE ? ORDER BY quote_num DESC LIMIT 6;

-- name: insert_tag@topic
INSERT INTO @tag (user_id, tag, created_on, modified_on, quote_num) VALUES (?, ?, ?, ?, 1);

-- name: tags_by_id_a@topic
-- clause: in
SELECT id FROM @tag WHERE id IN (?) AND is_del = 0 AND quote_num > 0;

-- name: tags_by_id_b@topic
-- clause: in
SELECT id, user_id, tag, quote_num FROM @tag WHERE id IN (?);

-- name: decr_tags_by_id@topic
-- clause: in
UPDATE @tag SET quote_num=quote_num-1, modified_on=? WHERE id IN (?);

-- name: tags_for_incr@topic
-- clause: in
SELECT id, user_id, tag, quote_num FROM @tag WHERE tag IN (?);

-- name: incr_tags_by_id@topic
-- clause: in
UPDATE @tag SET quote_num=quote_num+1, is_del=0, modified_on=? WHERE id IN (?);

醉缘靡梦 (节选)


  很多事情似乎表面看来美丽安详,但这一切不过是虚幻的美丽…
  横世国际地产案,牵涉银行,证券交易,受贿等,而张婉儿的父亲更是首要人物被双规。而我由于涉嫌骗贷违规操作被牵扯在其中。事情我当然十分清楚,横世地产是我一手扶持起来,涉嫌金额十几亿。尽管我自知我没有违法,但追究起责任我实在是脱不了干系,我最少也要在监狱中呆二十年不幸运的话也许会是死刑。警察询问我情况的时候,我什么也没说。只是默默的听这他们拍桌子踢椅子。其实我觉得这样很好笑,但我的表情却也依然如旧,并没有太大变化,冷静,彷徨。最后他们虽然对我用尽了方法,但我依然只有一句:我不知道。刚开始我还是有些担心害怕的,而后来连我自己也相信我是真的不知道,他们也只有放弃。案子从发生到今天也许已经一个月也许已经有两个月,但究竟是多久我已经并不在乎,以后在狱中我有很多时间,那是多漫长的结果。我等待的只能是一个我不愿意见到的判决,一些我不愿意见到的人。十一月三日终于开庭,来了很多人。也包括我的父母,我根本不敢抬头,那是多么羞耻的一件事。张婉儿与几个涉案人员坐在我旁边。
  张婉儿,你在你的认罪书中,承认你所有的罪行对吗?
  是的!张婉儿的声音让我抬起头,她的眼睛温柔的看这我。眼眶中滚滚的眼泪似乎就要崩泻,她苍老了许多。我只能看这她,我用那种哀伤的眼神看这她。
  嫌疑人,还有什么要为自己辩护的吗?自公司成立起,孟云与我们不过是雇佣关系而已……我的眼泪倾泻下来,那一刻是我一生也无法面对的时刻。我看这她,她只是摇了摇头。微微一笑,用手轻轻指了指自己的心。
  张婉儿罪名成立,判处死刑,剥夺政治权利终身,缓刑一年…孟云做为协犯人员判处有期徒刑三年…当离开法庭的时候,我又一次听到那歇斯底里的哭喊声:孟云,我爱你!
  今天的床有些潮湿,也许是因为刚下过雨的原因吧。三年来,看了很多书,也明白了很多道理,知道了自己为什么不成熟,也知道了自己为什么被欺骗,似乎跟我的性格太过与急功尽利有关,也或许我这个对感情的事情无法把握有关。事到如今我也只能这样想而已。
  孟云,有人来看你。

雪中悍刀行 - 恼姜泥青衣相随 (节选)


  一个下午有世子殿下插科打诨,徐脂虎欢声笑语不断,她这样发自肺腑的妩媚笑颜,足以让江南道那帮假道学们神魂颠倒,可惜他们见不着。徐脂虎很钟情木剑温华的几句口头禅。
  “小年,我当下很忧郁啊!”
  “老子能饿得不想吃饭,也是本事嘛。”
  “小年,你瞅瞅,那小娘子还没你长得白,没你好看,你给兄弟笑一个,解解馋呗?”
  徐凤年说起这个曾经一起偷鸡摸狗的哥们,嘴上恼火,眼神却是柔和。而世子殿下说到李子姑娘和王东厢,可以明显察觉到大姐徐脂虎的喜好程度有一个鲜明高下,出乎意料,徐脂虎被《头场雪》勾去不少眼泪,但似乎对胸有锦绣的王初冬并不看好,反而倒是对那个名字古怪的李子姑娘十分喜欢,说这丫头做侧妃是极好的,娇憨可掬福嘛,而王东厢,对女子来说,惊才绝艳不是幸事啊,说不定会难逃薄福短寿的下场。
  这些话徐脂虎都是直言以对,想说什么就说什么,半点不隐瞒,徐凤年笑着说不会的,王丫头既然能引来魁鼋出水,肯定福缘不浅,徐脂虎一听这个解释,点了点头。
  她看了眼窗外天色,临近黄昏,该晚饭了,写意园与退步园在卢府一直特立独行,两个园子都可以不参与家族宴席,徐脂虎嫁到江南后,入乡随俗,逐渐习惯了这边的饮食,但照顾弟弟的口味,专门让二乔请了城中酒楼两位名家厨子来写意园做一桌辣烈北凉菜,不是行家可不敢尝试北凉独有的石烹法与温炝法,做地道了,才是大俗出大雅,做差了,就难登大雅之堂。
  江南道胭脂虎徐寡妇的两百两银子可烫手得很,其中一位听说是要给那当街杀人的北凉世子做菜,临行前赶忙跑回家对着妻儿一顿痛哭流涕,再看那成天就知道唠叨鸡毛蒜皮的媳妇就格外顺眼,许诺若是能活着走出卢府,以后再不去窑子里挥霍银子。
  卢氏府邸气象不大,胜在格局巧妙,深谙藏风聚水的韵味。
  一袭青衫踩踏墙头山头与亭尖,翩然而至,恍若仙人,期间俯视卢府山水楼榭布置,这位青衣略微点头,最终在湖畔落下,脚尖才落地,一人一剑奔袭而至,剑气森寒,青衫文士略皱眉头,身形也不后掠,双足站定,一指敲在剑尖上,硬生生压弯了这柄榜上有名的霸秀古剑,两者之间横着一把弯曲成弧的剑,双鬓白霜点点的儒士单指看似不离霸秀,实则瞬间一敲再敲,指玄一十二次,霸秀剑终于撤离,中年儒士不动如山,身后整座小湖竟掀起巨大波澜,层层推去,将对岸花木冲击得摇晃不止,卢府出面拒敌的当然是棠溪剑仙卢白颉,一剑无功而返,已经猜出眼前儒士身份,立即收剑入鞘,面露惊讶道:“曹官子?”