====================
== Hi, I'm Vimiix ==
====================
Practice makes perfect (ง •̀_•́)ง

Golang的并行模式实践

concurrency golang goroutine
Goroutine C#、Lua、Python 的用户可能会发现 Go 的 goroutine 和协程之间有很多相似之处,没错,从命名上也可以看出二者具有相似性。 但二者之间也有些区别: goroutine 隐含了并行的特性,一切交给 go 的 runtime 来实现调度,而协程需要应用自己来编写并行代码 goroutine 通过信道(Channel)进行通信;协程通过 yield 和 next操作进行通信 一般来说,goroutine 比协程更强大。而且,我们可以很容易地将协程的逻辑移植到 goroutine 来获得更好的并行效果。 Generators 在 python 中,要实现一个生成器,需要通过 yield 生成数据,通过 next 获取数据: def integers(): i = 1 while True: yield i i+=1 integerGenerator = integers() next(integerGenerator) # 1 next(integerGenerator) # 2 next(integerGenerator) # 3 同样的,生成器也可以在 Go 中实现,只是使用了 channel 来代替 yield: func integers () chan int { yield := make (chan int); count := 0; go func () { for { yield <- count; count++; } } (); return yield } next := integers(); func generateInteger () int { return <-next } generateInteger() // 0 generateInteger() // 1 generateInteger() // 2 Iterators go 的 channel 在语法层面就是天然的迭代器。 Read more...

Golang实现Windows系统用户和密码校验

note windows golang
本质上是通过调用 windows 的一个 API —— LogonUserW ,来实现对于用户密码的校验。 仅适用于在本地校验,不支持远程连接校验 用一个示例代码来进行说明,下面是目录结构中,main.go 是程序入口文件,auth 包中,我们仅实现 windows 系统的校验代码,其他平台不属于本文介绍内容,就直接返回 nil 即可。 目录结构 . ├── auth │ ├── auth.go │ └── auth_windows.go ├── go.mod └── main.go 源代码 [src] main.go package main import ( "flag" "fmt" "os" "github.com/vimiix/authDemo/auth" ) func main() { user := flag.String("u", "", "username") password := flag.String("p", "", "password") flag.Parse() if *user == "" || *password == "" { fmt.Println("Both user and password should be specify") fmt. Read more...

beanstalkd消息队列

beanstalkd note Python MQ
beanstalkd 是一个简单快速的分布式工作队列系统,协议基于 ASCII 编码运行在 tcp 上。其最初设计目的是通过后台异步执行耗时任务方式降低高容量 Web 应用的页面延时。而其简单、轻量、易用等特点,和对任务优先级、延时/超时重发等控制,以及众多语言版本的客户端的良好支持,使其可以很好的在各种需要队列系统的场景中应用。 Beanstalk 的应用场景主要有: 消息异步处理(消息队列的基本需求) 消息延迟处理,实现循环队列 beanstalkd 核心组件 job : 任务,队列中的基本单元 tube : 一个有名称的任务队列,用来存储统一类型的 job ,beanstalkd 通过 tube 来实现多任务队列 producer : job 生产者,通过put命令来创建一个job放到一个tube中 comsumer : job 消费者,通过 reserve、release、bury、delete命令来获取或改变 job 的状态 job 的生命周期 在整个生命周期中 job 可能有四种工作状态:READY、RESERVED、DELAYED、BURIED. 只有处于 READY 状态的 job 才能被消费。 put with delay release with delay -------------> [DELAYED] <---------. | | | (time passes) | | | put v reserve | delete --------------> [READY] -------> [RESERVED] ------> *poof* ^ ^ | | | \ release | | | `-------------' | | | | kick | | | | bury | [BURIED] <---------------' | | delete `--------> *poof* Producer 创建 job 的时候可以选择两种方式:put , put with delay。 Read more...

[译]Richardson成熟度模型

translation Richardson
原文链接:https://martinfowler.com/articles/richardsonMaturityModel.html 迈向 REST 的荣耀之巅 Leonard Richardson 提出的一个模型,将实现 REST 方法的主要元素分解为三个步骤,分别包括:资源(Resources)、HTTP 动词(HTTP Verbs,如GET、POST等)和超媒体控制(Hypermedia Controls)。 在Rest In Practice一书中,解释了如何使用 Restful Web Service 来处理企业面临的许多集成问题。本书的核心观点是,Web 就是一个大规模可扩展的分布式系统存在、并可以很好的工作的证明,而我们可以根据这一观点更容易地构建集成系统。 为了说明一个“Web 风格”系统的特定属性,作者使用了由 Leonard Richardson 提出的“RESTful 成熟度模型”,该模型在一次QCon Talk中被谈到。通过这一模型,可以很好的思考如果使用 REST,所以我也会尝试添加一些自己的解释。(本文中所使用协议示例只是为了更好的说明,并不建议在实际生产中编码实现或测试,因为其在细节上可能会存在问题) Level 0 该模型的出发点是使用 HTTP 作为远程交互的传输系统,但不使用 Web 的任何机制。基本上就是使用 HTTP 作为你远程交互机中的隧道机制,通常基于“远程过程调用”(RPC,Remote Procedure Invocation)。 例如,我想预约我的医生。预约软件首先需要知道在指定日期内医生什么时间有空位,所以它需要向医院预约系统发送请求以获取该信息。在 Level 0 级场景中,医院会将某个 URI 做为一个公共服务点。然后,我就可以向该服务点发送一个文档请求。 POST /appointmentService HTTP/1.1 [various other headers] <openSlotRequest date="2010-01-04" doctor="mjones" /> 然后,服务器会返回一个我所需信息的文档: HTTP/1.1 200 OK [various headers] <openSlotList> <slot start="1400" end="1450"> <doctor id="mjones" /> </slot> <slot start="1600" end="1650"> <doctor id="mjones" /> </slot> </openSlotList> 在本例中我使用了 XML 做为内容格式,实现可以格式的,如:JSON、YAML、键-值对、或其它自定义格式。 Read more...

Golang实现Google在RTB广告中价格加密方案

solution golang rtb
RTB RTB 广告是一种实时竞价广告,就是在针对每个广告位有展示机会的时候,会实时多方竞价,价格最有优势的广告主会竞得这次展示机会,在媒体测在拿到素材的时候,需将本次成交的价格,上报给指定的监控服务器,这时就需要将实时价格按照指定的加密方案加密后,替换 GET 链接中的请求参数中的价格宏来上报。 官方给出的源代码有 Java 和 C++ 版本, 下载地址: https://code.google.com/archive/p/privatedatacommunicationprotocol/source/default/source 本文主要通过 golang 来实现的 google 的价格加密方案。 Source Code package main /* golang 实现 google 的rtb 价格加密方案 https://developers.google.com/authorized-buyers/rtb/response-guide/decrypt-price#encryption-scheme */ import ( "crypto/hmac" "crypto/md5" "crypto/sha1" "encoding/base64" "encoding/binary" "encoding/hex" "fmt" "hash" "math" "strings" ) const ( PayloadSize = 8 InitVectorSize = 16 SignatureSize = 4 EKey = "" IKey = "" UTF8 = "utf-8" ) func AddBase64Padding(base64Input string) string { var b64 string b64 = base64Input if i := len(b64) % 4; i ! Read more...

Mac 升级10.12.6 mvim 打开文件报错

solution mac mvim
当昨天把 Mac 升级了 10.12.6 Sierra 以后,mvim 打开文件的时候就开始报错,使用该方法已解决~ 报错信息 dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib Referenced from: /usr/local/Cellar/macvim/8.0-146/MacVim.app/Contents/bin/../MacOS/Vim Reason: image not found [1] 33114 abort mvim -v 解决方法 这个错误是 macvim 报的错,并非 vim. ➜ vimiix ~ type vim vim is an alias for mvim -v 我这里使用的 vim 指令是对 mvim 的一个别名。 使用一条指令可以解决上面的报错问题: sudo install_name_tool -change /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib /usr/local/Cellar/macvim/8.0-146/MacVim.app/Contents/bin/../MacOS/Vim 注意点 需要注意的是,指令最后指定的 vim 路径,一定是上面报错中 Referenced from 后面的路径。参考 相关解答 https://stackoverflow.com/questions/47278449/vim-ruby-mismatch-on-mac-high-sierra

Golang如何确保一个类型实现了某个interface

note interface golang
在 golang 中,接口(interface)代表一种『协议』存在,它是一个声明了多个方法的集合。 接口是被隐式实现的,也就是说,我们在开发中定义一个类型(type)的时候,不需要声明这个类型实现了哪个接口。在使用的时候往往通过断言来的 ok-idom 来进行类型判断该类型是否实现了目标接口,放置调用方法失败抛出 panic: if value, ok := AType.(BInterface) { fmt.Println("ok") } else { fmt.Println("no") } 如果断言失败,那么 ok 的值将会是 false,但是如果断言成功 ok 的值将会是 true,同时 value 将会得到所期待的正确的值。 但是,在某些情况下,我们可能希望明确地检查接口中哪些方法没有被实现。最好的方法就是借助编译器地检查功能。 假设定义了一个 Programmer 接口,一个 Human 类型: »> 试一下 package main type Programmer interface { Code() string } type Human struct {} func main() {} 这段代码没有做任何操作,可以正常地执行。 假设我们希望 Human 类型实现了 Programmer 接口,可以在代码中定义一个 _ (下划线表示忽略这个变量)变量来实现检测效果 package main type Programmer interface { Code() string } type Human struct {} // 利用编译器检查接口实现 var _ Programmer = (*Human)(nil) func main() {} 当再次执行这段代码地时候,就会报出如下编译错误: Read more...

HLS视频加密

note video encrypt ffmpeg hls

最近在做视频管理后台,主要提供点播服务,涉及到需要对视频进行加密处理以防止视频被随意下载。

调研了一番之后确定使用 HLS(HTTP Live Streaming) 基于 HTTP 的流媒体网络传输协议技术来处理视频。

所以本文主要记录关于学习 HLS 视频加密技术的笔记

为什么要加密?

简单的说就是:增加获取被加密资源的代价。对于视频这种资源来说,绝对的加密就是不要上线给人看,但那是不可能的,因为提供的服务就是给人看视频,只要上线,别人就可以通过各种手段解密或者简单的录屏的方式来传播,所以目前俩看,不存在绝对的加密。只要让恶意的人获取源视频的代价很大,就可以阻挡绝大多数的不法分子。这样,加密的目的也就基本达到了。

Read more...

获取存储在又拍云CDN中视频的时长

note video CDN 又拍云

前置条件

  • 可用的账户

  • 安装又拍云 Python 版本的 SDK:

pip install upyun

(官方代码开源地址:https://github.com/upyun/python-sdk/ )

Read more...

快速切换本地Git用户记录

git tool bash

现在大部分的科技公司开发模式,都是基于 Git 进行多人协作开发。所以,对于我们每一个开发者来说,Git 的操作就是必不可少的技能了(不是锦上添花,而是必不可少)。对于 Git 的操作,不是本次记录的内容,网上的教程可以在官网找到。

今天我想记录一下我本机多用户管理的一点小操作。

当每进入一家新公司的时候,总会在新公司领到一个新的公司邮箱,基本上这个邮箱也就是你在公司期间进行代码开发的 git 账户。这时候,加上我们平时在 GitHub 的账户,就会有两个账户需要切换使用。

下面是我个人的一点小技巧记录,不一定是最好的,但只要自己用着方便就 OK,如果此时看文章的你有好的方法的话,可以请在讨论区交流。

Read more...
1 of 8 下一页