Giter VIP home page Giter VIP logo

base64captcha's Introduction

Greeting 👋

  • 🔭 Gopher TypeScripter
  • 🌱 Open Source Fancier
  • 😄 Fullstack App Creator
  • 👯 I'm an awesome dad and great husband
  • 💬 Pro-democracy, pro-freedom, against dictatorship
  • 🏠 主页 https://zh.mojotv.cn
  • 🤖 Homepage https://mojotv.cn
  • ⚖️ An idiot admires complexity, a genius admires simplicity

base64captcha's People

Contributors

8jiworkitten avatar amzyang avatar bencq avatar dependabot[bot] avatar fuckqqcom avatar jjjjjjjerk avatar lixiangzhong avatar luckyboys avatar mojocn avatar mxey avatar slayercat avatar swork9 avatar xiaobinqt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

base64captcha's Issues

generate函数提示错误

大概的错误信息

invalid argument to Intn
/usr/local/Cellar/go/1.13.8/libexec/src/math/rand/rand.go:169 (0x119266e)
        (*Rand).Intn: panic("invalid argument to Intn")
/usr/local/Cellar/go/1.13.8/libexec/src/math/rand/rand.go:329 (0x119309f)
        Intn: func Intn(n int) int { return globalRand.Intn(n) }
/Users/cpp/golang/pkg/mod/github.com/mojocn/[email protected]/random_math.go:78 (0x1c8c238)
        randIntRange: return rand.Intn(to-from) + from
/Users/cpp/golang/pkg/mod/github.com/mojocn/[email protected]/item_digit.go:165 (0x1c8af62)
        (*ItemDigit).drawDigit: y += randIntRange(-r, r)
/Users/cpp/golang/pkg/mod/github.com/mojocn/[email protected]/driver_digit.go:70 (0x1c84034)
        (*DriverDigit).DrawCaptcha: itemDigit.drawDigit(digitFontData[n], x, y)
/Users/cpp/golang/pkg/mod/github.com/mojocn/[email protected]/captcha.go:33 (0x1c82aee)
        (*Captcha).Generate: item, err := c.Driver.DrawCaptcha(content)


efficiency problem

https://github.com/mojocn/base64Captcha/blob/master/captcha.go#L108
func VerifyCaptchaAndIsClear(identifier, verifyValue string,isClear bool) bool {
if verifyValue == "" {
return false
}
storeValue := globalStore.Get(identifier, false)
if storeValue == "" {
return false
}
result := strings.ToLower(storeValue) == strings.ToLower(verifyValue)
if result {
globalStore.Get(identifier, isClear)
}
return result
}

this function has two destination,one is verity and another is clear the value in the store

why globalStore.Get(identifier, false) called twice,can't run it in one operation?

error : invalid argument to Intn

I encountered a bug while using the Gnerate function.Following is my original code

func newCaptcha ()(string,string,error){
return base64Captcha.NewCaptcha(base64Captcha.NewDriverDigit(230,80,6,0.7,100),captchaStore).Generate()
}

After a little dig, I passby the bug by manually creat a Drive instead of using NewDriverDigit function and it work. This is the code I fixed:

func newCaptcha ()(string,string,error){
	drive := base64Captcha.DriverDigit{Height:80, Width: 230, Length: 6, MaxSkew:0.7, DotCount: 100}
	c := base64Captcha.NewCaptcha(&drive,captchaStore)
	return c.Generate()
}

the generate function cant work well when recived a Drive type that produced by NewDriver. I think this is bug need to be fixed in the next patch.

memoryStore data race

vendor/github.com/mojocn/base64Captcha/store.go:76
s.Lock() s.digitsById[id] = value s.idByTime.PushBack(idByTimeValue{time.Now(), id}) s.numStored++ s.Unlock() if s.numStored > s.collectNum { go s.collect() }
s.numStored read must in lock scope

More breaking API changes

I've run into errors in my code that uses base64Captcha that worked with previous base64Captcha versions. The errors I'm currently getting are

default: src/captcha.go:12:17: undefined: base64Captcha.ConfigCharacter
default: src/captcha.go:24:19: undefined: base64Captcha.ConfigCharacter
default: src/captcha.go:75:17: undefined: base64Captcha.VerifyCaptcha
default: src/captcha.go:103:22: undefined: base64Captcha.CaptchaInterface
default: src/captcha.go:104:31: undefined: base64Captcha.GenerateCaptcha
default: src/captcha.go:105:16: undefined: base64Captcha.CaptchaWriteToBase64Encoding

I know the code in question worked previously, but this is the second time that changes to this package's API have broken my code. Is the API so unstable that I can't reliably use it without having to constantly uninstall and reinstall the package just to make sure that I don't have to rewrite code that shouldn't have to be rewritten? The main.go.md In the root directory of this repo even uses the previous API.

And I'd use a previous version/tag but for compatibility reasons, I'm not (yet) using Go's module feature, and for the record, the suggested go get github.com/mojocn/[email protected] command in README.md fails with the error go: cannot use path@version syntax in GOPATH mode

how to get VerifyValue in cap

image
image
like this, how to get the VerifyValue in cap when i use the func GetCaptcha.i just want to do something in front.but the cap is too large.

runtime error: invalid memory address or nil pointer dereference

2020/01/15 20:02:37 http: panic serving 127.0.0.1:64947: runtime error: invalid memory address or nil pointer dereference
goroutine 36 [running]:
net/http.(*conn).serve.func1(0xc00022e000)
/usr/local/Cellar/go/1.12.4/libexec/src/net/http/server.go:1769 +0x139
panic(0x1309aa0, 0x18b27f0)
/usr/local/Cellar/go/1.12.4/libexec/src/runtime/panic.go:522 +0x1b5
github.com/mojocn/base64Captcha.(*DriverDigit).GenerateIdQuestionAnswer(0x0, 0xbf7fddb76af07a38, 0x10f5c6f9d, 0x4, 0xc0001d4e00, 0xc0000cc030, 0x18be7e0)
/Users/dev/go/src/github.com/mojocn/base64Captcha/driver_digit.go:44 +0x3f
github.com/mojocn/base64Captcha.(*Captcha).Generate(0xc000237be8, 0x13d5c58, 0x18db068, 0x13d1f20, 0xc000084030, 0x0, 0xc000237c80)
/Users/dev/go/src/github.com/mojocn/base64Captcha/captcha.go:32 +0x3d
main.generateCaptchaHandler(0x13d8080, 0xc0000d60e0, 0xc00029c000)
/Users/Desktop/test/capture.go:52 +0x230
net/http.HandlerFunc.ServeHTTP(0x137cfd8, 0x13d8080, 0xc0000d60e0, 0xc00029c000)
/usr/local/Cellar/go/1.12.4/libexec/src/net/http/server.go:1995 +0x44
net/http.(*ServeMux).ServeHTTP(0x18be700, 0x13d8080, 0xc0000d60e0, 0xc00029c000)
/usr/local/Cellar/go/1.12.4/libexec/src/net/http/server.go:2375 +0x1d6
net/http.serverHandler.ServeHTTP(0xc00008c9c0, 0x13d8080, 0xc0000d60e0, 0xc00029c000)
/usr/local/Cellar/go/1.12.4/libexec/src/net/http/server.go:2774 +0xa8
net/http.(*conn).serve(0xc00022e000, 0x13d8680, 0xc000058480)
/usr/local/Cellar/go/1.12.4/libexec/src/net/http/server.go:1878 +0x851
created by net/http.(*Server).Serve
/usr/local/Cellar/go/1.12.4/libexec/src/net/http/server.go:2884 +0x2f4

验证建议

验证码第一次错误,就会把里面的值给清空,导致后面即使输入正确,仍然是验证失败。看代码,是因为验证就清空。建议:提供一个接口,可以根据id,主动清空

go get load model error

➜ go get -u github.com/mojocn/base64Captcha
go: finding github.com/mojocn/base64Captcha latest
go: finding golang.org/x/image v0.0.0-00010101000000-000000000000
go: finding github.com/golang/freetype latest
go: golang.org/x/[email protected]: unknown revision 000000000000
go get: error loading module requirements

我不知道是我电脑问题还是怎么回事,用demo都无法运行

Hello, I found that neither demo nor self configuration can run, and the error has been reported all the time
你好,我发现用demo还是自我配置都是不可以运行的,一直报错

2019/12/13 10:30:39 EOF
2019/12/13 10:30:39 http: panic serving [::1]:61416: runtime error: invalid memory address or nil pointer dereference
goroutine 25728 [running]:
net/http.(*conn).serve.func1(0xc000259360)
D:/use/Go/src/net/http/server.go:1767 +0x140
panic(0x712300, 0xca1940)
D:/use/Go/src/runtime/panic.go:679 +0x1c0
github.com/mojocn/base64Captcha.(*DriverDigit).GenerateIdQuestionAnswer(0x0, 0xc000265d70, 0xc000092000, 0x4, 0xc0000bd800, 0xc000092030, 0xcae360)
D:/path/gopath/pkg/mod/github.com/mojocn/base64![email protected]/driver_digit.go:46 +0x45
github.com/mojocn/base64Captcha.(*Captcha).Generate(0xc000265b10, 0x1, 0x1, 0x7e3480, 0xc000032040, 0x8, 0xc0005af9d0)
D:/path/gopath/pkg/mod/github.com/mojocn/base64![email protected]/captcha.go:42 +0x41
main.generateCaptchaHandler(0x7e90e0, 0xc00015ba40, 0xc0000c1c00)
D:/mywork/web/kongbu/main.go:52 +0x238
net/http.HandlerFunc.ServeHTTP(0x78f920, 0x7e90e0, 0xc00015ba40, 0xc0000c1c00)
D:/use/Go/src/net/http/server.go:2007 +0x4b
net/http.(*ServeMux).ServeHTTP(0xcae320, 0x7e90e0, 0xc00015ba40, 0xc0000c1c00)
D:/use/Go/src/net/http/server.go:2387 +0x1c4
net/http.serverHandler.ServeHTTP(0xc0000520e0, 0x7e90e0, 0xc00015ba40, 0xc0000c1c00)
D:/use/Go/src/net/http/server.go:2802 +0xab
net/http.(*conn).serve(0xc000259360, 0x7e9620, 0xc000a5b840)
D:/use/Go/src/net/http/server.go:1890 +0x87c
created by net/http.(*Server).Serve
D:/use/Go/src/net/http/server.go:2928 +0x38b
exit status 2

增加delete 调用

type Store interface

这个接口目前只有,

	Set(id string, value string)
	Get(id string, clear bool) string

这两个方法,是不是可以考虑增加一个,Delete((id string)方法,

Default Memory Store

in store_memory.go we have defined functionality to get and set values.

It deletes the values from the store after GCLimitNumber has reached and expiration time is over.

Issue:

  1. Captchas are present till GCLimitNumber of captchas are reached, even though captcha has expired and it will stay until garbage collected.
  2. Captchas might be retrieved again even though it might be expired.

**Proposal:**
Proposal 1:
While retrieving, we can check whether expired or not, if expired delete from store.

Proposal 2:
We can create a wrapper structure over go-cache library.

  • Advantage: It will take care of Set, Get, and collect functionality.

设计思路上的一些疑问

我觉得创建验证码传一个配置,只返回一个base64的数据和一个答案就足够了。
其他的比如存储、验证都应该由开发者自己来维护。
想问一下目前是否有提供这种功能呢?

text must not be empty, there is nothing to draw

Text must not be empty, there is nothing to draw
Could you please write a document with full descriptions?
It's hard to find the way to use this library like add more fonts or use fonts?
Thank you.

func (c *Captcha) Create() (map[string]interface{}, error) {
	var (
		driver       base64Captcha.Driver
		driverString base64Captcha.DriverString
	)

	driver = driverString.ConvertFonts()
	
	captcha := base64Captcha.NewCaptcha(driver, store)
	id, b64s, err := captcha.Generate()
	if err != nil {
		return nil, err
	}

	return map[string]interface{}{
		"captcha":   b64s,
		"captchaID": id,
	}, nil
}

don't clear the store when verify is right

前端会验证这个验证码是否正确,然后提交给后台,后台还会再次验证(后台跟验证码服务是分开的两个服务),这个时候已经删掉了。我添加了一个配置项来控制是否需要在验证成功后就删除掉。

@@ -39,6 +39,8 @@ var (
  globalStore = NewMemoryStore(GCLimitNumber, Expiration) 
  //thisPackageDirPath current package path. 
  thisPackageDirPath = "" 
  // ClearWhenVerifyRight default don't clear when verify is right 
  ClearWhenVerifyRight = false 
) 
 
// SetCustomStore sets custom storage for captchas, replacing the default 
@@ -106,7 +108,7 @@ func VerifyCaptcha(identifier, verifyValue string) bool {
  } 
  result := strings.ToLower(storeValue) == strings.ToLower(verifyValue) 
  if result { 
    globalStore.Get(identifier, true) 
    globalStore.Get(identifier, ClearWhenVerifyRight) 
  } 
  return result 
} 

无法在Windows下载代码

Windows上无法创建带特殊符号的文件(28+58=?.png),请改下名字。

grouped write of manifest, lock and vendor: error while writing out vendor tree: failed to write dep tree: failed to export github.com/mojocn/base64Captcha: error: unable to create file C:\Users\admin\AppData\Local\Temp\dep936777486\vendor\github.com\mojocn\base64Captcha\examples/static/28+58=?.png: Invalid argument

我该如何获得验证码正确的数值

目前通过 GenerateCaptcha()VerifyCaptcha() 已经可以正常生成验证码以及验证验证码的准确性

现在需求是 给出 正确答案以及混淆值,让用户选择以达到验证效果,我应该如何获取答案值 61

log.Println(cap)

&{{60+1=? 61 240 60} 0xc4205ba000 0}

Audio noise seems to be nonsensical

Audio should help visually impaired people to hear a captcha they can't see. In this case, they can barely hear that the sound should be a captcha, and its really not understandable anymore - fully masked by the noise. This way, solving the audio captcha is nearly impossible for a human.

如果多台服务器集群,目前的内存方式不合用

项目非常好,谢谢。

提个建议,目前的验证码是保存在内存中,如果多台服务器集群使用时,下次验证时,不一定是之前产生验证码的服务器。

建议修改下生成验证码的函数,可以配置为不保存,返回答案

自己把ID和答案保存到数据库之类,自己验证。

提点小意见

RT,东西是好东西,但是使用各种不方便,环境搭配各种需要用户下载下来自己做处理,完全可以做得更好,一键式下载后直接就可以应用运行。只是提点小建议,不要见怪。

RT,the proejct is good, but not conveniently enough.It need to deal with something when users download the lib. It's absolutly can be done much better than this such as like that:one key finish for using. Just a little tiny advice.Don't be mind.

为什么我不能下载这个包的呢?

F:\go\rainDog\rainDog\src\blog>go get -x -u github.com/mojocn/base64Captcha
# get https://goproxy.io/github.com/mojocn/base64%21captcha/@v/v1.3.0.mod
# get https://goproxy.io/github.com/mojocn/base64%21captcha/@v/v1.3.0.mod: Get https://goproxy.io/github.com/mojocn/base64%21captcha/@v/v1.3.0.mod: Method Not Allowed
go: github.com/mojocn/[email protected]: Get https://goproxy.io/github.com/mojocn/base64%21captcha/@v/v1.3.0.mod: Method Not Allowed

寻求帮助,在新手构建代码时候

代码

package tool

import (
	"github.com/gin-gonic/gin"
	"github.com/mojocn/base64Captcha"
	"image/color"
)

type CaptchaResult struct {
	Id          string `json:"id"`
	Base64Blob  string `json:"base_64_blob"`
	VerifyValue string `json:"code"`
}

// 生成图形化验证码
func GenerateCaptcha(ctx *gin.Context) {
	parameter := base64Captcha.DriverMath{
		Height:          30,
		Width:           30,
		NoiseCount:      0,
		ShowLineOptions: base64Captcha.OptionShowHollowLine,
		BgColor: &color.RGBA{
			R: 3,
			G: 102,
			B: 214,
			A: 125,
		},
		Fonts: nil,
	}

	captcha := base64Captcha.NewCaptcha(&parameter, base64Captcha.DefaultMemStore)
	id, b64s, err := captcha.Generate()
	if err != nil {
		Failed(ctx, err.Error())
	}

	captchaResult := CaptchaResult{
		Id:         id,
		Base64Blob: b64s,
	}

	Success(ctx, gin.H{
		"captcha_result": captchaResult,
	})
}

运行一直报错在 id, b64s, err := captcha.Generate(),但是我想应该是上一行就已经错了,我已经刚搞了一下午了,还是没有明白store怎么用,获取需要一份新手文档,我看过旧版的base64Captcha.ConfigCharacte 以及 base64Captcha.GenerateCaptcha方法,但是在这个版本中,我不会构建了,希望可以帮帮我

请问为什么go test时报错?

./fontBinData_test.go:9: Log arg value is a func value, not called
FAIL	github.com/kpaas-io/base64Captcha [build failed]

但是我看您README页面上都是正常的

fonts.go is wrong

//var fontemoji = loadFontByName("fonts/seguiemj.ttf")
var fontsAll = append(fontsSimple, fontChinese)
var fontChinese = loadFontByName("fonts/wqy-microhei.ttc")
fontChinese 变量放在后面 没有追加进去,提供的example这里报错。

关于验证码的验证方式

目前使用,采用的idkey+输入值的方式验证
但考虑到多服务并行工作时,集群的进行工作,是否有考虑过?

关于自定义id的需求场景

您好,我们除了图片验证码以外,还使用到了短信验证码。我想通过扩展一个smsDriver 来管理验证码,不想将该验证码,独立出来管理。
查看了代码以后,我认为将生成id的接口放到Driver 里面或许会更好
例如:

type Driver interface {
	// EncodeBinary covert to bytes
	GenerateItem(content string) (item Item, err error)
        //在这里生成id 这样更方便扩展者对id 的含义进行扩展
	GenerateQuestionAnswer() (id,q, a string)
}

并且可以增加一个 因子参数的Generate方法,允许Driver 接口:

	GenerateItem(key,content string) (item Item, err error)
	GenerateQuestionAnswer(key string) (q, a string)

对因子进行操作定制化的操作。

比如这样:

//Generate generates a random id, base64 image string or an error if any
func (c *Captcha) GenerateByKey(key string) (id, b64s string, err error) {
	id,content, answer := c.Driver.GenerateQuestionAnswer(key)
	item, err := c.Driver.GenerateItem(key,content)
	if err != nil {
		return "", "", err
	}
	c.Store.Set(id, answer)
	b64s = item.EncodeB64string()
	return
}

这是我自己的一点看法,希望能得到更多的回复解答

文本验证码内容:顺序的词组

hi,@mojocn

感谢审查MR #41

之前提出CaptchaModeUseRunePairs这个模式, 是由于我这边有个特殊的需求,希望验证码的内容在指定的词组中进行随机。(非随机单字,而是词组)

我看到您对这个做了一些修改。应该是我之前的做法会有不妥之处。

请问我能些什么来帮助完成这个工作?

导致程序崩溃的问题

如GenerateCaptcha函数中的config放入的不是ConfigAudio、ConfigCharacter、ConfigDigit时会造成程序的崩溃

完整案例代码运行报空指针,求指教,谢谢

2020/04/07 00:19:01 http: panic serving 127.0.0.1:8414: runtime error: invalid memory address or nil pointer dereference goroutine 48 [running]: net/http.(*conn).serve.func1(0xc0002501e0) D:/Program Files/go/src/net/http/server.go:1767 +0x140 panic(0x704740, 0xc89920) D:/Program Files/go/src/runtime/panic.go:679 +0x1c0 github.com/mojocn/base64Captcha.(*DriverDigit).GenerateIdQuestionAnswer(0x0, 0xc000305d70, 0xc0000b2000, 0x4, 0xc00011e000, 0xc0000b2030, 0xc962e0) D:/Malaysia/code/Go/fx-go/pkg/mod/github.com/mojocn/[email protected]/driver_digit.go:44 +0x45 github.com/mojocn/base64Captcha.(*Captcha).Generate(0xc000305b10, 0x1, 0x1, 0x7d27a0, 0xc000058030, 0x8, 0xc0003059d0) D:/Malaysia/code/Go/fx-go/pkg/mod/github.com/mojocn/[email protected]/captcha.go:34 +0x41

完整示例代码运行一直报这个错误,不知道是哪里问题,求指教,谢谢

gin中使用错误

panic recovered:
runtime error: invalid memory address or nil pointer dereference

当MemoryStore的collectNum没有满,且验证码过期,已过期的验证码似乎不会被自动清理掉

测试用的代码:

package main

import (
    "time"
    "fmt"
    "github.com/mojocn/base64Captcha"
    "github.com/mojocn/base64Captcha/store"
)

// 生成验证码,返回验证码ID
func generate() string {
    var config = base64Captcha.ConfigDigit {
        Width       : 130,
        Height      : 45,
        MaxSkew     : 0.8,
        DotCount    : 85,
        CaptchaLen  : 5,
    }

    captchaID, _ := base64Captcha.GenerateCaptcha("", config)

    return captchaID
}

func now() string {
    return time.Now().Format("15:04:05")
}

func main() {

    fmt.Printf("%s: 设置一个store,存储量:5,有效期:2秒\n", now())
    globalStore := store.NewMemoryStore(5, 2 * time.Second)
    base64Captcha.SetCustomStore(globalStore)

    // 生成一个验证码
    captchaID := generate()

    // 查询刚才生成的验证码
    fmt.Printf("%s: 查询生成的验证码:%s\n", now(), globalStore.Get(captchaID, false))

    // 睡眠5秒钟,让验证码过期
    time.Sleep(5 * time.Second)

    // 再次查询,仍然可以查询到刚才生成的验证码,为什么过期后验证码没有被清理掉呢?
    fmt.Printf("%s: 5秒后,再次查询刚才生成的验证码:%s\n", now(), globalStore.Get(captchaID, false))

    // 生成一些验证码,把存储填满
    generate()
    generate()
    generate()
    generate()
    generate()
    generate()

    // 再次查询,之前生成的验证码不见了
    fmt.Printf("%s: 又创建了一些验证码后,后再次查询之前生成的验证码:%s\n", now(), globalStore.Get(captchaID, false))
}

运行结果:

11:13:21: 设置一个store,存储量:5,有效期:2秒
11:13:21: 查询生成的验证码:70847
11:13:26: 5秒后,再次查询刚才生成的验证码:70847
11:13:26: 又创建了一些验证码后,后再次查询之前生成的验证码:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.