vizee 发布的文章

不用采集卡在 PS4 上直播

不用采集卡在 PS4 上直播

开始之前

我在 Ubuntu 16.04 和 Raspbian Stretch 上都成功实现了劫持 PS4 自带的 twitch 推流并转推到 bilibili.

主要参考了

这里我以树莓派举例, 我的是 Raspberry 2 Model B. 主要思路是通过劫持 DNS 来欺骗 PS4 推流.

1. 安装 Raspbian Stretch 到闪存卡

如果不是使用树莓派, 这一步可以跳过.

...

- 阅读全文 -

go compile 支持 _ 作为零值

go compile 支持 _ 作为零值

起因

很久以前就有类似的 proposal, 并且官方也有回复, 以下是链接:

个人认为官方还是太过于保守了, 至少目前 go1 的语法下, 在 return 表达式中引入 _ 用于返回错误上还是有一些编写上的方便的(小声 bb).


DIY compile

我的 go 版本 1.10.2, 修改 $GOROOT/src/cmd/compile/internal/gc 下 3 个文件:

  • 增加 hackgc.go
  • 修改 subr.go
  • 修改 typecheck.go

1. 增加 hackgc.go:

...

- 阅读全文 -

grpc 一致性 hash 负载均衡

grpc 一致性 hash 负载均衡

go-grpc 库只提供了一个默认的轮询负载均衡器 grpc.RoundRobin,通过实现 grpc.Balancer 可以实现自定义规则的 Balancer,所以实现一个一致性 hash 的 grpc.Balancer。

Implement

这篇文章的基础上,增加 grpclb 包实现一致性 hash 负载均衡器。

...

- 阅读全文 -

grpc 使用 consul 服务发现

grpc 使用 consul 服务发现

grpc 可以自定义 Balancer,而在 Balancer 基础上可以通过实现自定义的 naming.Resolver 来达到使用 consul 等服务发现组件来发现服务的功能。

大概流程如下:

  1. grpc 在 Dial 的时候通过 WithBalancer 传入 Balancer
  2. Balancer 会通过 naming.Resolver 去解析(Resolve) Dial 传入的 target 得到一个 naming.Watcher
  3. naming.Watcher 持续监视 target 解析到地址列表的变更并通过 Next 返回给 Balancer

implement

提供一个简单实现,目录结构如下:

...

- 阅读全文 -

go get 代理

go get 代理

代理服务端

要把 go get 请求转发别的 repo 上,需要利用 go get 的 discovery 特性去动态查找 repo。

首先要知道 go get 做了什么,定位到 repoRootForImportDynamic 函数(源文件 go/src/cmd/go/internal/get/vcs.go),可以知道命令将 ImportPath 作为 url 发起了一次请求(web.GetMaybeInsecure),并且将获取的到结果使用 parseMetaGoImports 函数(源文件 go/src/cmd/go/internal/get/discovery.go)解析。
根据 parseMetaGoImports 函数可以得知,结果作为 xml 解析,并且在查找所有 meta 元素是否存在 name 属性值为 go-import,如果存在则解析 content 属性值,拆分为 PrefixVCSRepoRoot

那我们可以明确知道了,我们需要返回一个 xml,内容格式可能是这样的

...

- 阅读全文 -