go超级时间轮timewheel(一路向前)github.com/anjieych/timewheel

Anjie 发表了文章 • 0 个评论 • 49 次浏览 • 6 小时前 • 来自相关话题

go超级时间轮timewheel(一路向前)github.com/anjieych/timewheel

有传统时间轮的影子,但又超出传统时间轮:

  1. 非“盘/环”形结构: 一路向前,永... 查看全部

go超级时间轮timewheel(一路向前)github.com/anjieych/timewheel


有传统时间轮的影子,但又超出传统时间轮:



  1. 非“盘/环”形结构:
    一路向前,永不回头,每tick一次,移除一个slot;每个slot中的entity 触发OnExpired来处理到期(或过期)事件;

  2. 超级时间轮:
    他是一个轮或者轮的集合,因为他可以同时处理不同实现了Entity的业务,每个业务有各自OnExpired定义,只要可以遵循相同的时间刻度Interval就可以放入同一个轮来统一计时触发。
    最后,优点或缺点可以作者交流。


[========]


package main

import (
"fmt"
"github.com/anjieych/timewheel"
"time"
)

func main() {
tw := timewheel.NewTimewheel("tw-example", time.Second)
tw.Start()
tick := time.NewTicker(3 * time.Second)
for {
d := &Data{
eid: time.Now().UnixNano(),
data: <-tick.C,
}
d.SetSlotId(tw.Add(d, 5*time.Second))
}
}
// Data must implements timewheel.Entity
type Data struct {
eid int64
slotId int
data interface{}
}

func (d *Data) SetEId(eId int64) {
d.eid = eId
}
func (d *Data) GetEId() (eId int64) {
return d.eid
}
func (d *Data) SetSlotId(slotId int) {
d.slotId = slotId
}
func (d *Data) GetSlotId() (slotId int) {
return d.slotId
}
func (d *Data) OnExpired() {
fmt.Printf("%s\t OnExpired :{slotId: %d\t,eid: %d\t,data: %s}\n", time.Now(), d.GetSlotId(), d.GetEId(), d.data)
}

RobotGo v0.47.0 发布, Go 桌面自动化, 移除 libpng 等依赖

回复

veni 发起了问题 • 1 人关注 • 0 个回复 • 113 次浏览 • 7 小时前 • 来自相关话题

fx 已经支持 Go, Node, Python, Ruby, Java, PHP, Julia 这些语言了

回复

metrue 发起了问题 • 1 人关注 • 0 个回复 • 238 次浏览 • 4 天前 • 来自相关话题

分享一个带 TTL 以及失效回调的 LRU 库. https://github.com/Akagi201/kvcache

Akagi201 发表了文章 • 0 个评论 • 108 次浏览 • 6 天前 • 来自相关话题

https://github.com/Akagi201/kvcache

完美达到我的业务需要的效果. 大家有同样的需求可以测试测试.

...

https://github.com/Akagi201/kvcache


完美达到我的业务需要的效果. 大家有同样的需求可以测试测试.


有问题一定向我反馈. akagi201@gmail.com

tsdump-用于导出数据库表结构的工具(支持导出为text、markdown、csv、json)

voidint 发表了文章 • 0 个评论 • 121 次浏览 • 2017-12-03 20:32 • 来自相关话题

项目地址: https://github.com/voidint/tsdump

特性

  • 支持将数据库(当前仅支持查看全部

项目地址: https://github.com/voidint/tsdump


特性



  • 支持将数据库(当前仅支持MySQL)及其表结构的元数据以textmarkdownjsoncsv形式输出。


安装


$ go get -u github.com/voidint/tsdump

基本使用




  • 全局选项


    GLOBAL OPTIONS:
    -H value, --host value Connect to host. (default: "127.0.0.1")
    -P value, --port value Port number to use for connection. (default: 3306)
    -u value, --user value User for login if not current user. (default: "voidint")
    -p value, --password value Password to use when connecting to server.
    -d value, --db value Database name.
    -V value, --viewer value Output viewer. Optional values: txt|csv|json|md (default: "txt")
    -o value, --output value Write to a file, instead of STDOUT.
    -D, --debug Enable debug mode.
    --help, -h show help
    --version, -v print the version



  • 使用root用户创建一个名为mydb的数据库实例,以及一张student的表。


    CREATE DATABASE IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    USE `mydb`;

    CREATE TABLE `student` (
    `sno` char(8) NOT NULL COMMENT '学号',
    `sname` varchar(255) NOT NULL COMMENT '姓名',
    `gender` char(2) DEFAULT NULL COMMENT '性别',
    `native` char(20) DEFAULT NULL COMMENT '籍贯',
    `birthday` datetime DEFAULT NULL COMMENT '出生日期',
    `dno` char(6) DEFAULT NULL COMMENT '所在院系',
    `spno` char(8) DEFAULT NULL COMMENT '专业代码',
    `classno` char(4) DEFAULT NULL COMMENT '班级号',
    `entime` date DEFAULT NULL COMMENT '入校时间',
    `home` varchar(40) DEFAULT NULL COMMENT '家庭住址',
    `tell` varchar(40) DEFAULT NULL COMMENT '联系电话',
    PRIMARY KEY (`sno`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';



  • 将数据库及其表结构数据以表格形式输出到console


    $ tsdump -H 127.0.0.1 -P 3307 -u root -p "mypassword" --db mydb
    |----------|---------------|--------------------|
    | DATABASE | CHARACTER SET | COLLATION |
    |----------|---------------|--------------------|
    | mydb | utf8mb4 | utf8mb4_general_ci |
    |----------|---------------|--------------------|

    TABLE: student 学生信息表
    |----------|----------|--------------|---------------|--------------------|----------|
    | COLUMN | NULLABLE | DATA TYPE | CHARACTER SET | COLLATION | COMMENT |
    |----------|----------|--------------|---------------|--------------------|----------|
    | sno | NO | char(8) | utf8mb4 | utf8mb4_general_ci | 学号 |
    | sname | NO | varchar(255) | utf8mb4 | utf8mb4_general_ci | 姓名 |
    | gender | YES | char(2) | utf8mb4 | utf8mb4_general_ci | 性别 |
    | native | YES | char(20) | utf8mb4 | utf8mb4_general_ci | 籍贯 |
    | birthday | YES | datetime | | | 出生日期 |
    | dno | YES | char(6) | utf8mb4 | utf8mb4_general_ci | 所在院系 |
    | spno | YES | char(8) | utf8mb4 | utf8mb4_general_ci | 专业代码 |
    | classno | YES | char(4) | utf8mb4 | utf8mb4_general_ci | 班级号 |
    | entime | YES | date | | | 入校时间 |
    | home | YES | varchar(40) | utf8mb4 | utf8mb4_general_ci | 家庭住址 |
    | tell | YES | varchar(40) | utf8mb4 | utf8mb4_general_ci | 联系电话 |
    |----------|----------|--------------|---------------|--------------------|----------|



  • 将数据库及其表结构数据输出到markdown文件


    $ tsdump -H 127.0.0.1 -P 3307 -u root -p "mypassword" --db mydb -V md > ./mydb.md

    output:


    student


    学生信息表







































































































    COLUMN NULLABLE DATA TYPE CHARACTER SET COLLATION COMMENT
    sno NO char(8) utf8mb4 utf8mb4_general_ci 学号
    sname NO varchar(255) utf8mb4 utf8mb4_general_ci 姓名
    gender YES char(2) utf8mb4 utf8mb4_general_ci 性别
    native YES char(20) utf8mb4 utf8mb4_general_ci 籍贯
    birthday YES datetime 出生日期
    dno YES char(6) utf8mb4 utf8mb4_general_ci 所在院系
    spno YES char(8) utf8mb4 utf8mb4_general_ci 专业代码
    classno YES char(4) utf8mb4 utf8mb4_general_ci 班级号
    entime YES date 入校时间
    home YES varchar(40) utf8mb4 utf8mb4_general_ci 家庭住址
    tell YES varchar(40) utf8mb4 utf8mb4_general_ci 联系电话



  • 将数据库及其表结构数据输出到csv文件


    $ tsdump -H 127.0.0.1 -P 3307 -u root -p "mypassword" --db mydb -V csv -o ./mydb.csv


  • 将数据库及其表结构数据输出到JSON文件
    $ tsdump -H 127.0.0.1 -P 3307 -u root -p "mypassword" --db mydb -V json -o ./mydb.json

搭建轻量级的 Docker 容器云管理平台

bobliu0909 发表了文章 • 0 个评论 • 224 次浏览 • 2017-12-02 11:09 • 来自相关话题

什么是 Humpback?

Humpback 可以帮助企业快速搭建轻量级的 Docker 容器云管理平台,若将你的 Docker 主机接入到 Humpback 平台中,就能够为你带来更快捷稳定的容器操作体验。

查看全部

什么是 Humpback?


Humpback 可以帮助企业快速搭建轻量级的 Docker 容器云管理平台,若将你的 Docker 主机接入到 Humpback 平台中,就能够为你带来更快捷稳定的容器操作体验。


humpback架构


Humpback 功能特点


-Web操作,简单易用

-权限分组隔离

-容器升级与克隆

-容器监控

-容器日志

-集群容器调度

-集群弹性伸缩

-私有仓库


Humpback 模式介绍


-Single Mode 单一模式,对单组主机实现容器管理,提供容器创建,容器操作,容器重命名,容器升级与克隆,容器监控,容器日志输出等功能。

-Cluster Mode 容器集群模式,实现按实例数批量创建容器,容器调度,批量操作容器,升级和迁移等功能。


平台采用分组方式(Group)来管理多主机,多组之间权限操作隔离,同时也可以将一台主机加入到多个分组中交叉管理。


系统登录


Single Mode

SingleMode


Cluster Mode

ClusterMode


Container Monitor

ContainerMonitor


Container Logs

Container Logs


Container Detail

ContainerDetail


ContainerDetail


项目地址:https://humpback.github.io/humpback

授权协议:Apache

开发语言:TypeScript、Golang

操作系统:垮平台

riot 搜索引擎 v0.10.0 发布, 优化引擎和分词等

回复

veni 发起了问题 • 2 人关注 • 0 个回复 • 288 次浏览 • 2017-11-21 22:45 • 来自相关话题

改进版glide golang版本控制

xkey 发表了文章 • 0 个评论 • 246 次浏览 • 2017-11-21 12:07 • 来自相关话题

仅对于无法翻墙的情况

由于GFW的原因使用glide get golang.org/x/sys/unix 的时候会出现问题,首先肯定是fetch不下来的。

github上会有所有x包的镜像,glide只要使用glide mir... 查看全部

仅对于无法翻墙的情况


由于GFW的原因使用glide get golang.org/x/sys/unix 的时候会出现问题,首先肯定是fetch不下来的。


github上会有所有x包的镜像,glide只要使用glide mirror set一下即可。


但是当拉取上面的子包的时候会出现目录复制错误的问题:


当你使用某个包下的某个目录时,glide会自动下载这个包。 例如:golang.org/x/net/context 要知道这个在国内是取不到的。 所以使用mirror转到github.com镜像的net/context下,这也取不到,必须指定到net包下面。 但这样他拷贝的文件目录就变了了,会把net包拷贝到net/context下面


针对上述问题 xkeyideal/glide 对glide mirror的代码进行了改进,即添加了 --base参数,让用户能够指定复制的目录。


具体的请参考项目的readme文件。

RobotGo v0.46.6 发布, 大幅度优化 bitmap

回复

veni 发起了问题 • 1 人关注 • 0 个回复 • 320 次浏览 • 2017-11-10 21:53 • 来自相关话题

LiteIDE X33 发布,Go 语言开发工具

visualfc 发表了文章 • 0 个评论 • 547 次浏览 • 2017-11-03 08:15 • 来自相关话题

Go 语言开发工具 LiteIDE X33 正式发布。这个版本优化了编辑器功能,读取文件支持 codec 自动检测,重新加载文件使用 diff 方式进行优化,重新实现 Mark API 并增加了新的 Bookmarks 插件;Go 语言视图和大纲增加了 ... 查看全部

Go 语言开发工具 LiteIDE X33 正式发布。这个版本优化了编辑器功能,读取文件支持 codec 自动检测,重新加载文件使用 diff 方式进行优化,重新实现 Mark API 并增加了新的 Bookmarks 插件;Go 语言视图和大纲增加了 TodoList 显示;修复了 GolangEdit 的 查找使用 偶而无效错误, 代码查询 guru (备份使用内置oracle) 增加了 GOPATH 内查询接口功能。调试和查找插件也有所增强……。


更多的功能实现和错误修复详见更新记录



2017.11.2 Ver X33



  • LiteIDE

    • optimization editor plugin, load file check codec, reload file by diff

    • add astview TodoList

    • add new bookmarks plugin

    • fix liteapp clean plugin order


  • LiteApp

    • filemanager auto reload file default YesToAll

    • fix liteapp clean plugins reverse order

    • fix #832, sidebar change action by combox

    • fix folder sync editor same prefix error


  • LiteEditor

    • reload file use diff to keep state and mark

    • load file check is binary and report

    • load file check codec use libucd if utf8 decode failed.

    • load file check decode error and report

    • load file is readonly set editor widget readonly

    • load and save file support utf8 bom

    • add codec and lineend info on statusbar

    • add copied text into the clipboard as HTML option

    • add Solarized Dark color theme, thanks xgdgsc

    • reimplemented editor mark api

    • fix copy to clipboard tab escape


  • GolangAst

    • add TodoList for classview and outline

    • fix #848, astwidget double clicked index check.


  • GolangCode

    • update pkglist to go1.9


  • GolangEdit

    • add stop source query action

    • add source query action implement_GOPATH for GOPATH scope

    • fix golang lexer parser folding end

    • fix GolangHighlighter fold indent error set

    • fix findUsage wordUnderCursor offset

    • fix find usages findStart signal late


  • GolangFmt

    • load diff check modify current block text


  • GolangCode

    • fix update gopath process stop and wait


  • LiteDebug

    • fix cmd to native separator

    • build target add -a build flag

    • change debug targget name to target.debug (custom by LiteBuild)


  • LiteBuild

    • add custom debug name in build config


  • LiteFind

    • fix memory leak by GolangEdit GolangFileSearch

    • fix findInFiles berore saveAllEditor

    • fix FindEditor replace all


  • Bookmarks

    • new plugin for show open editors bookmarks and jump


  • gotools

    • update stdlib for go1.9.1

    • astview add TodoList support


GoReporter第三版

fiisio 发表了文章 • 0 个评论 • 331 次浏览 • 2017-10-18 15:08 • 来自相关话题

GoReporter第三版重构了展示页面,分类更清晰,展示模型更多。可以作为白盒测试,CodeReview助手或者最佳实践评估工具。

欢迎大家使用和提出改进建议或者帮助完善功能! 查看全部

GoReporter第三版重构了展示页面,分类更清晰,展示模型更多。可以作为白盒测试,CodeReview助手或者最佳实践评估工具。


欢迎大家使用和提出改进建议或者帮助完善功能!
https://github.com/360EntSecGroup-Skylar/goreporter

一个自己实现的Excel as relate db读取库go-excel

yhf_szb 发表了文章 • 0 个评论 • 331 次浏览 • 2017-09-18 17:10 • 来自相关话题

在复杂的系统中(例如游戏),有时候为了便于非专业人员(策划)设置一些配置,会使用Excel作为一种轻量级的关系数据库或者配置文件,毕竟对于很多非开发人员来说,配个Excel要比写json或者yaml什么简单得多。

而且Excel可以写入各种... 查看全部

在复杂的系统中(例如游戏),有时候为了便于非专业人员(策划)设置一些配置,会使用Excel作为一种轻量级的关系数据库或者配置文件,毕竟对于很多非开发人员来说,配个Excel要比写json或者yaml什么简单得多。


而且Excel可以写入各种格式和字体标红单元格,维护成本大大降低。


这种场景下,读取特定格式(符合关系数据库特点的表格)的数据会比各种花式写入Excel的功能更重要,毕竟从编辑上来说微软提供的Excel本身功能就非常强大了,而现在我找到的Excel库的功能都过于强大了,用起来有点浪费,于是写了这个简化库。


这个库的工作参考了tealeg/xlsx的部分实现和读取逻辑。


假设有一个xlsx文件,里边有个Sheet叫“Standard”,它的数据结构如下:










































ID NameOf Age Slice UnmarshalString
1 Andy 1 1|2 {"Foo":"Andy"}
2 Leo 2 2|3|4 {"Foo":"Leo"}
3 Ben 3 3|4|5|6 {"Foo":"Ben"}
4 Ming 4 1 {"Foo":"Ming"}


  • 第0行是标题行。

  • 第1行开始是数据行。


以下是最简单的写法


// defined a struct
type Standard struct {
// use field name as default column name
ID int
// column means to map the column name
Name string `xlsx:"column(NameOf)"`
// you can map a column into more than one field
NamePtr *string `xlsx:"column(NameOf)"`
// omit `column` if only want to map to column name, it's equal to `column(AgeOf)`
Age int `xlsx:"AgeOf"`
// split means to split the string into slice by the `|`
Slice []int `xlsx:"split(|)"`
// *Temp implement the `encoding.BinaryUnmarshaler`
Temp *Temp `xlsx:"column(UnmarshalString)"`
// use '-' to ignore.
Ignored string `xlsx:"-"`
}

// func (this Standard) GetXLSXSheetName() string {
// return "Some other sheet name if need"
// }

type Temp struct {
Foo string
}

// self define a unmarshal interface to unmarshal string.
func (this *Temp) UnmarshalBinary(d []byte) error {
return json.Unmarshal(d, this)
}

func main() {
// will assume the sheet name as "Standard" from the struct name.
var stdList []Standard
err := excel.UnmarshalXLSX("./testdata/simple.xlsx", &stdList)
if err != nil {
panic(err)
}
}

提供一些更复杂的读取逻辑,详细看文档:https://github.com/szyhf/go-excel


时间关系,可能看test目录里的代码更好理解……



欢迎捉虫提bug。


golang版本的curl请求库

mikemintang 发表了文章 • 0 个评论 • 512 次浏览 • 2017-09-15 07:55 • 来自相关话题

Github地址


https://github.com/mikemintang/go-curl


安装


go get github.com/mikemintang/go-curl

使用


package main

import (
"fmt"
"github.com/mikemintang/go-curl"
)

func main() {

url := "http://php.dev/api.php"

headers := map[string]string{
"User-Agent": "Sublime",
"Authorization": "Bearer access_token",
"Content-Type": "application/json",
}

cookies := map[string]string{
"userId": "12",
"loginTime": "15045682199",
}

queries := map[string]string{
"page": "2",
"act": "update",
}

postData := map[string]interface{}{
"name": "mike",
"age": 24,
"interests": []string{"basketball", "reading", "coding"},
"isAdmin": true,
}

// 链式操作
req := curl.NewRequest()
resp, err := req.
SetUrl(url).
SetHeaders(headers).
SetCookies(cookies).
SetQueries(queries).
SetPostData(postData).
Post()

if err != nil {
fmt.Println(err)
} else {
if resp.IsOk() {
fmt.Println(resp.Body)
} else {
fmt.Println(resp.Raw)
}
}

}

接收请求的api.php


<?php  

//echo json_encode($_GET); // 获取url地址中的查询参数
//echo json_encode(getallheaders()); // 获取请求头
//echo json_encode($_COOKIE); // 获取cookies
echo file_get_contents("php://input"); // 获取post提交的数据

function getallheaders() {
$headers = [];
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}

可导出的成员变量和方法



TodoList



  • [x] 以链式操作的方式发起请求

  • [ ] 以函数回调的方式发起请求

  • [ ] 以类Jquery Ajax的方式发起请求

  • [x] 发起GET/POST请求

  • [ ] 发起PUT/PATCH/DELETE/OPTIONS操作

  • [x] 以application/x-www-form-urlencoded形式提交post数据

  • [x] 以application/json形式提交post数据

  • [ ] 以multipart/form-data形式提交post数据

  • [ ] proxy代理设置

grpc-gateway的替代品--Turbo

zzxx513 发表了文章 • 0 个评论 • 384 次浏览 • 2017-09-15 01:06 • 来自相关话题

转载自:https://zhuanlan.zhihu.com/p/29350695

grpc-gateway是一个使用起来很便捷的工具,... 查看全部

转载自:https://zhuanlan.zhihu.com/p/29350695


grpc-gateway是一个使用起来很便捷的工具,可以很方便的把grpc接口用HTTP的方式暴露出去。


但在实际使用过程中,也在grpc-gateway里发现了一些问题,比如:


1,灵活性不够,如果有一些比较特殊的需求,在grpc-gateway中能扩展的余地不大;


2,严重依赖protocol buffer,而且必须是protobuf 3;


3,即使grpc服务的接口不变,只是修改HTTP接口定义,也必须重新生成代码,也就必须重新部署,重启服务;


4,只支持JSON格式的输入,不支持传统的kv格式的参数;


5,只支持grpc,嗯。。好吧,这不算问题,但thrift也很普及,是不是?


6,grpc-gateway在错误处理等方面都不够成熟,而且开发者似乎也不是很活跃。。。


Turbo努力解决了上面提到的问题,这是项目的地址:


vaporz/turbo


这是文档地址,很贴心很详细,中英双语哦~


Turbo Documentation


除了提供基本的与grpc-gateway类似的HTTP代理功能,Turbo还可以做到:


1,高度灵活,提供各种基于切面(不是吃的那个“切面”)思想的组件,可以在各个环节进行定制;


2,只依赖grpc,对protocol buffer没有要求,因此,你既可以使用protobuf2,也可以使用protobuf3;


3,HTTP接口的定义,以及与后端接口之间的映射,可以在运行时直接修改,并且立即生效!


4,不仅支持JSON格式的输入,也支持传统的kv格式的输入!


5,不仅支持grpc,还支持thrift!


6,自带命令行工具,一键创建可运行的项目,一键重新生成代码!


Turbo目前仍处于诞生初期,但现在的代码已经经过了认真的测试,认真细致的测试用例让测试覆盖率达到了98%。


当然,测试覆盖率说明不了多少问题,只有经过实战考验的代码才是可靠的!


因此,欢迎大家多多试用,多多吐槽,有任何建议或想法,请在GitHub上开Issue,坐等。


遇到任何问题,我愿意尽力帮助,尽力解决!


谢谢!

Go 语言编写轻量级网络库,GrapeNet

koangel 发表了文章 • 0 个评论 • 555 次浏览 • 2017-08-20 11:36 • 来自相关话题

简介(Introduction)

Go语言编写轻量级网络库 (grapeNet is a lightweight and Easy Use Network Framework)

可用于游戏服务端、强网络服务器端或其他类似应... 查看全部

简介(Introduction)


Go语言编写轻量级网络库 (grapeNet is a lightweight and Easy Use Network Framework)


可用于游戏服务端、强网络服务器端或其他类似应用场景,每个模块单独提取并且拥有独立的使用方法,内部耦合性较轻。


其实GO语言曾经有过很多强架构的框架,比如GOWOLRD之类的,已经足够了,但是我会将库用于各种轻量级应用不需要过于复杂的内容,所以我设计了GrapeNet,目的是模块独立化。 你可以拆开只使用其中很小的模块,也可以组合成一个服务端,并且在架构中设计也较为轻松,至于热更新的问题,目前脚本数据支持热更新,并且是自动的,只要跑一下UPDATE即可,程序本身稍后测试后发布(仅支持LINUX)。


本库更像是一个日常服务端开发的轻量级工具库集合,用的开心噢。


慢慢更新中,很多坑要填,目前暂不适合用于商业项目。


个人博客:http://grapec.me/



安装


go get -u github.com/koangel/grapeNet...


模块表(Function)



  • Lua脚本绑定管理(可绑定任何类型的函数、线程安全且自动推倒类型)

  • 日志库(底层采用Seelog)

  • 函数管理系统(可以根据任何类型参数将其与函数绑定并互相调用)

  • 流处理

  • Tcp网络

  • Websocket网络 (基础版)

  • Codec(任意类型注册对象并在其他位置动态创建该对象)

  • CSV序列化模块(通过Tag可以直接序列化到对象或对象序列化为CSV)


依赖第三方



  • Seelog (github.com/cihub/seelog)

  • Gopher-lua(github.com/yuin/gopher-lua)

  • Gopher-luar(layeh.com/gopher-luar)


不依赖任何CGO内容,lua本身也是纯GO实现。