Jump to Navigation

脚本编程

脚本语言,ruby/python/php/shell

golang CGO FAQ & TIPS : cgo 从 C 传递 slice 到 go

cgo 从 C 传递 slice 到 go

这里一般会用在c的callback中。

需要加一个wrapper,比直接调用go函数中间多了一个转换步骤,但方便了许多。

执行流程为,c调用发起 -> c wrapper -> go export

.go:

//export a_function_callback
 func a_function_callback(args []C.astruct) {}

.c:

基于网络的准实时服务监控

基于网络的准实时服务监控

服务作为一个操作系统进程,可能由于程序本身的bug或者停机原因而退出服务。

对于OP系统来说,监控可以达到有效的知识及报警目的。

对于DEV来说,有时根本不需要,查找原因并重启一般人工介入。

但是对于一个更自动化了的完整系统来说,除了OP提供的监控与协助诊断之外,

也许可以实现DEV才能够实现的一种浸入式的监控,并在有监控事件时做精细准确的处理。

常用服务进程监控方式

一般采用第三方服务来监控服务进程的存活状态,并且一般使用OP的系统,如puppet,chef等。

这种方式的特点是一般运行运行在每个服务节点上,确保进程退出时能够通过操作系统API/命令检测到。

这种方式使用可靠成熟应用范围广泛的系统支持,一般还是非常可靠的。

浸入式服务进程监控方式

相比第三方监控工具,这种是把监控代码嵌入服务代码中,与服务共生联系紧密的。

这种不但能够检测进程退出问题,而且还能检测进程的异常假死情况,并且在出现这些情况时做出更精细准确的响应。

但这种方式是有些缺点的,开发稍微复杂,要对异常情况做出更精细准确的响应也是很大挑战。

PHP扩展动态回调函数的实现

PHP扩展动态回调函数的实现 PHP扩展回调函数中获取当前类/方法/函数

获取当前的执行状态,是语言的一种自省能力。对于编译动态灵活的代码非常有帮助。

一般在实现PHP扩展的时候,采用的是指定固定的扩展函数的对应C函数名的方式。

这种静态指定的方式,虽然对使用C语言简化编写扩展PHP扩展有所帮助,

但对于要求更高动态实现扩展回调函数的场景,则不是一种非常好的方式,

而应该是能够动态灵活的指定回调的C函数,甚至是运行时的切换。

如果希望能够灵活地实现回调扩展函数/方法,一个需求就是能够动态获取PHP解释器当前的执行状态,包括类名、方法名、参数名信息。

本文从动态灵活的需求,分析并总结常用模式的指定回调C函数指针,以及动态指定回调C函数指针的两种不同的实现方式。

常用指定扩展C函数方式

声明C扩展函数:

golang/Go中HTTP2.0协议的应用

http2协议: tls or non-tls

http2协议的安全问题,实际上与http1协议一样,同样可选择http/https两种,一种是明文传输,另一种是加密传递。

只不过在google设计http2协议的时候,偏向了加密传输,以至于golang 1.6中默认支持的http2协议包,现在却没有办法实现非加密http2通信了。

在实现中,http2分为两个类型,普通的加密称称为http2/h2,非加密的称为http2/h2c。

在使用中,http2/h2一般都有官方标准的实现,而http2/h2c则支持力度次之。

而由于加密http2/h2由于在TLS握手阶段,可能消耗约~10ms时间,在有些场合是非常大的开销,所以还可能要用到http2/h2c实现方式。

比如在grpc中,服务器之间通信要求更高,就自带了一个http2/h2c的实现。

1、http2/h2类型server实现

看这段示例代码:

Category:

从.proto扩展到API发布:Big Plus

从.proto扩展到API发布:Big Plus

从.proto描述到API发布与发现

从.proto文件到API发布与发现

关键词

  • protobuf
  • gRPC
  • 客户端
  • 服务端
  • 注册中心,registry
  • 注册器,register
  • 发现,discovery
  • 发布,publisher
  • 服务化,service
  • 服务端发现代理
  • 服务端注册代理,这两个来进一步简化客户端与服务端的使用。

概述

上节提到的大多数关键词,已经出现在前面几篇文章当中,在此不再重述。

本文将从.proto API描述文件开始,逐步展开形成一个完整系统。

.proto文件作为简单的API描述语言,能够依赖其提供的相关工作,生成不同语言的API实现封装代码,很大程度上实现了自动化工作,减少接下来的编码工作,从很多角度来说是个不错的开始。

golang中使用mock测试API

golang中使用mock测试API

注:本文转自 - 网络

Mock的英文意思是模拟,假的,虚幻的。在程序员的世界里指在单元测试中模拟某个类的方法返回一直想要的值。这是为了只测试单元测试的目标方法内的逻辑,而对该方法调用的其他方法的逻辑置之不理,只对他们进行模拟。

mock测试

就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
mock对象

这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。

Mock的英文意思是模拟,假的,虚幻的。在程序员的世界里指在单元测试中模拟某个类的方法返回一直想要的值。这是为了只测试单元测试的目标方法内的逻辑,而对该方法调用的其他方法的逻辑置之不理,只对他们进行模拟。
mock测试

就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
mock对象

这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。
mock对象使用范畴

API服务中的mock server

mocking机制

调用端与被调用端并行开发的机制。

在被调用端(服务端)未完成开发时,可以提供模拟响应接口API,供调用端(客户端)测试使用。

API mocking模型

  • 客户端mocking,客户端测试代码中模拟server端API接口功能,不执行网络请求。
  • 服务端 mocking,客户端测试代码中发送真实网络请求,server端API接口返回模拟结果。

支持服务端mocking,并不影响客户端mocking的使用。

mocking类型

  • 预设值mocking,被调用端预先设定要返回的值。预设值又分为编译时与运行时两类
  • 0值mocking,返回值为语言提供的0值,如0, "", nil
  • 随机值mocking,返回值为语言提供的相应的随机值,随机整数,随机字符串

调用端想参数设置应该怎么办?

也许可以在服务程序目录再放个预设值json文件好了。

mocking实现

mocking类型,在服务端启动时指定。

单行命令-

iso => dmg

hdiutil convert file.iso -format UDRW -o file.dmg

EFI shell添加菜单项

bcfg boot add fs0:\EFI\refind\refind_x64.efi

grub2 efi

 grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch --recheck --debug
 efibootmgr -v

virtualbox EFI

默认路径(坑):\EFI\BOOT\bootx64.efi

virtualbox共享目录内无法使用链接

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

golang容器循环时的修改

golang容器循环时的修改

golang中的原生容器有,slice/map/array

它们都支持range循环遍历,而在遍历时,有可能有修改当前容器的需要。

虽然一般不建议这么使用,但是golang也没有禁止这么使用,还是了解一点它的真实情况好些。

map测试

添加key时的测试

 var m1 = make(map[int]int, 0)
 for n := 0; n < 5; n++ {
      m1[n] = 100 + n
 }

 idx := 0
 for key, val := range m1 {
      log.Println(idx, key, val)
      m1[key+10] = m1[key] + 1000
      idx += 1
 }

 log.Println("============")
 idx = 0
 for key, val := range m1 {
      log.Println(idx, key, val)
      idx += 1
 }

得到的结果为:

golang vendor基本使用

golang vendor基本使用

vendor特性的引入

vendor的作用是维护第三方包的另一种形式。

vendor特性的引入会影响import语义。

vendor特性在go1.5中实验性引入,通过GO15VENDOREXPERIMENT=1/0环境变量控制是否启用。

vendor特性在go1.6中正式默认启用,但保留了GO15VENDOREXPERIMENT环境变量。

go1.7中将移除GO15VENDOREXPERIMENT环境变量。

vendor特性的诠释

设计基础

  • 不rewrite gopath
  • go tool来解决
  • go get兼容
  • 可可reproduce building process

诠释原文

頁面

訂閱 RSS - 脚本编程


Main menu 2

by Dr. Radut