分类 编程 中的文章
协程解析一 | ucontext
概述
最近在研究协程的实现原理,看了云风的coroutine和腾讯的开源库libco后,原来要实现一个协程库也没那么难。我先来讲讲云风的coroutine库。他使用的是 uncontext来保存程序运行上下文,进而实现协程库,这个库很值深入了解一番,吃透了这个库,协程的原理也就了解了。
Golang | 定时器
概述
golang有三种方式实现定时器:
- ticker
- timer
- select
Ticker
通过 time.NewTicker(d)的方式实现定时器
d := time.Duration(time.Second * 2)
t1 := time.NewTicker(d)
defer t1.Stop()
go func() {
for {
<- t1.C
fmt.Println("NewTicker...")
}
}()
Timer
通过 time.NewTimer(d)的方式实现定时器
……Lua | 解决百元买鸡的问题
问题
编写lua程序求解百鸡百钱问题。公鸡5元一只,母鸡3元一只,小鸡一元3只,问100元钱买100只鸡,可买公鸡、母鸡、小鸡各多少只?
代码
-----------------------------------------------------------------------------
--公鸡5元一只,母鸡3元一只,小鸡一元3只,问100元钱买100只鸡,可买公鸡、母鸡、小鸡各多少只?
-----------------------------------------------------------------------------
local maxprice = 100 --总价
local maxnum = 100 --总数量
local malePrice = 5 --公鸡价格
local femalePrice = 3 --母鸡价格
local smallPrice = 1/3 --小鸡价格
for malenum = 0, 20 do --公鸡的最大数量=100/4
for femalenum = 0, 34 do --母鸡的数量最大值=100/3
for smallnum = 0, 300 do --小鸡的数量最大值=100*3
local tolsum = malenum * malePrice + femalenum * femalePrice + smallnum * smallPrice
local num = malenum + femalenum + smallnum
if tolsum == 100 and num == 100 then
print(string.format("小鸡:%d只,母鸡:%d只,公鸡:%d只\n",smallnum, femalenum, malenum))
end
end
end
end
输出
……Golang | JWT身份认证
概述
最近要在http接口上加一个token认证,但是接口很多,有没有一个省时省力的办法来解决。token的使用流程是:
- 用户使用帐号密码登陆到服务器1. 服务器验证登陆成功,根据帐号密码生成token。把token返回给客户端
- 客户端请求接口时需要带上token。服务器需要验证token。
接口是用golang的
net/http库写的。为了实现目的,还需要添加的功能是: - 生成和解析token的方法;
- 一个中间件,拦截请求,进行token认证,根据认证通是否过来决定是否继续执行请求;
JWT身份认证可以解决第一个问题,mux.Router的Use方法函数可以作为一个中间件, 拦截请求。
func (r *Router) Use(mwf ...MiddlewareFunc) {
for _, fn := range mwf {
r.middlewares = append(r.middlewares, fn)
}
}
JWT 身份认证
下载地址:
……Lua | 调用C/C++的动态库
概述
最近在学习 云风的skynet库,想自定义一个模块,目标是使用lua调用C/C++所编写的库。
当我们需要在Lua里面调用c/c++函数时,所有的函数都必须满足以下函数签名:
typedef int (*lua_CFunction) (lua_State *L);
换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值。因为这个函数使用Lua栈作为参数,所以它可以从栈里面读取任意数量和任意类型的参数。而这个函数的返回值则表示函数返回时有多少返回值被压入Lua栈。(因为Lua的函数是可以返回多个值的)。
……汇编 | C/C++调用汇编
概述
我使用AT&T的规范,在linux上完成 C和汇编的互相调用,并使用gcc编译成可执行文件。
目标:汇编函数提供输出。类似C语言的函数
void hello_world(char* value)
{
printf(value);
}
提供给C语言调用:
int main()
{
hello_world("hello world!\n");
}
搭建AT&T的环境
- ubuntu16.04 或 ubuntu18.04- vscode- 文件后缀: .s- gcc
下载
vscode插件GNU Assembler Language Support
C代码生成为汇编代码
提供一个hello.c
……汇编 | AT&T和Intel规范的区别
概述
常见的指令集以及汇编语言规范: x86(IA-32)、x86-64指令集(常见于PC端),对应有2家公司发布的不同汇编语言规范:
- intel公司发布的汇编语言规范,称
intel 汇编:Windows派系(Microsoft),比较著名的汇编器有微软的masm和开源的nasm。 - AT&T公司发布的汇编语言规范,称
AT&T 汇编:Unix派系(或者说GNU),比如g++编译器等。
AT&T格式 和 Intel格式的区别
表格如下:
……Skynet | lua-protobuf
概述
在最新的skynet中我使用的是云风的pbc库来解析protobuf,该项目中的一个文件protobuf.lua 使用了module语法在lua5.1版本中已经删除,最新的skynet是lua5.4版本,于是我找到了解析protobuf的lua库–lua-protobuf。在最新的skynet中,集成lua-protobuf
……Protobuf | 请求参数为空的案例
参数为空的grpc请求怎么定义
google protobuf已经提供了空参数
//empty.proto
message Empty {<!-- -->}
使用方法,在proto文件中导入empty.proto, 定义一个请求参数和返回值为空的函数emptyfunction, 函数名字可以自定义。
//server.proto
import "google/protobuf/empty.proto";
service pbservice{
rpc emptyfunction(google.protobuf.Empty) return{google.protobuf.Empty}
}
以golang语言为例子,在go中对应的函数为:
……