分类 编程 中的文章

协程解析二 | 云风的coroutine

概述

云风的coroutine是通过ucontext来控制程序运行时上下文的,我们来根据该库提供的几个接口,和一个demo来解释协程的运行原理。如果不了解ucontext的,建议先了解ucontxt

环境

下载代码 & 编译

……

阅读全文

协程解析一 | 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. 用户使用帐号密码登陆到服务器1. 服务器验证登陆成功,根据帐号密码生成token。把token返回给客户端
  2. 客户端请求接口时需要带上token。服务器需要验证token。 接口是用golang的net/http库写的。为了实现目的,还需要添加的功能是:
  3. 生成和解析token的方法;
  4. 一个中间件,拦截请求,进行token认证,根据认证通是否过来决定是否继续执行请求; JWT身份认证可以解决第一个问题,mux.RouterUse方法函数可以作为一个中间件, 拦截请求。
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中对应的函数为:

……

阅读全文