opsgenie / opsgenie-lamp Goto Github PK
View Code? Open in Web Editor NEWOpsGenie Lamp with Go SDK
License: Apache License 2.0
OpsGenie Lamp with Go SDK
License: Apache License 2.0
command/schedule_cmd.go:4:2: cannot find package "context" in any of:
/home/test/go/src/context (from $GOROOT)
/home/test/src/context (from $GOPATH)
../../urfave/cli/docs.go:11:2: cannot find package "github.com/cpuguy83/go-md2man/v2/md2man" in any of:
/home/test/go/src/github.com/cpuguy83/go-md2man/v2/md2man (from $GOROOT)
/home/test/src/github.com/cpuguy83/go-md2man/v2/md2man (from $GOPATH)
../../../golang.org/x/sys/unix/affinity_linux.go:10:2: cannot find package "math/bits" in any of:
/home/test/go/src/math/bits (from $GOROOT)
/home/test/src/math/bits (from $GOPATH)
Not sure if I am structuring this attachment correctly, the documentation is a little unclear here. This is what happens:
$ lamp attachFile --config /usr/local/etc/lamp.conf --alertId $alert_id --filePath ./test2 --fileName test
2021/03/12 22:36:32 INFO: Logging to file is disabled, To enable Logging to file Please specify logPath in configuration
INFO[2021-03-12T22:36:32.64567004Z] Client is configured with ApiUrl: api.opsgenie.com, LogLevel: trace, RetryMaxCount: 4
DEBU[2021-03-12T22:36:32.645771754Z] Starting to process Request &{BaseRequest:{} IdentifierType:0 IdentifierValue:8e77890b-cdcd-4163-afc8-03ee3b39d6e0 FileName:test FilePath:./test2 User: IndexFile:}: to send: /v2/alerts/8e77890b-cdcd-4163-afc8-03ee3b39d6e0/attachments
ERRO[2021-03-12T22:36:32.799184329Z] Error occurred with Status code: 413, Message: Current request is not a multipart request, Took: 0.000000, RequestId: e966bd4e-864f-45fc-824e-b22cf17d2c78
2021/03/12 22:36:32 ERROR : Error occurred with Status code: 413, Message: Current request is not a multipart request, Took: 0.000000, RequestId: e966bd4e-864f-45fc-824e-b22cf17d2c78
The contents of test2
above:
$ cat test2
one
two
three
Someone else reported a similar issue in #20 but it was closed without being addressed.
recently opsgenie got incident support not so expensive plan. Should this tool get support for managing them ?
When you download version 2.6.0 from docs link, the executable for Linux is still versioned 2.5.1 even thought the file is listed 2.6.0, not sure if that is the right versioning / code-base. Also, the Mac version is 2.2.2? It is very tough to know what I am looking at or which version is even relevant because none of these match releases in github?
Downloads/opsgenie-lamp$ ./opsgenie-lamp help
NAME:
lamp - Command line interface for OpsGenie
USAGE:
opsgenie-lamp [global options] command [command options] [arguments...]
VERSION:
2.2.2
bash-4.4# ./opsgenie-lamp help
NAME:
lamp - Command line interface for OpsGenie
USAGE:
opsgenie-lamp [global options] command [command options] [arguments...]
VERSION:
2.5.1
Binary releases would be really hand for non-gophers and distribution.
An example of adding builds (using Travis) is here.
It seems there is versioning somewhere (no tags or releases here), based on this download URL from here→here→: https://s3-us-west-2.amazonaws.com/opsgeniedownloads/repo/opsgenie-lamp-2.6.0.zip
There's also a separate download for mac, which links to opsgenie-integration.
The tool setup on incidents is pretty limited at this point. It would be appreciated if you could add support to the lamp stack for pulling and updating incidents.
Attempting to attach a file fails repeatedly for me, even with a file that is just 3 characters:
lamp attachFile --id 'pending_ansible_changes_test' --identifier alias --filePath '/Users/jeff/dev/ansible/toolboxglb.txt.zip' --apiKey 'REDACTED' --fileName ./t
INFO[2020-02-10T10:49:56.359621-05:00] Client is configured with ApiUrl: api.opsgenie.com, LogLevel: info, RetryMaxCount: 4
ERRO[2020-02-10T10:49:57.053807-05:00] Error occurred with Status code: 413, Message: The current request is not a multipart request, Took: 0.003000, RequestId: 05561fb5-c5bc-4da3-8e41-5b1525ab01ea
Error occurred with Status code: 413, Message: The current request is not a multipart request, Took: 0.003000, RequestId: 05561fb5-c5bc-4da3-8e41-5b1525ab01ea
This is with the latest OS X client from the docs and on Linux with the same.
If I use countAlerts to return the number of alerts, it does not print out the number of alerts as expected. Changing countAlerts to listAlerts lists the expected alerts.
2024/04/23 14:20:29 INFO: Logging to file is disabled, To enable Logging to file Please specify logPath in configuration
INFO[2024-04-23T14:20:29.2690752+02:00] Client is configured with ApiUrl: api.opsgenie.com, LogLevel: info, RetryMaxCount: 4
2024/04/23 14:20:29 DEBUG : Alert Client created.
2024/04/23 14:20:29 DEBUG : Count alerts request prepared from flags, sending request to Opsgenie..
2024/04/23 14:20:30 INFO :
I installed this tool for the first time and wanted to share some usability issues I had.
Addressing this behavior would significantly improve the utility of this tool, especially for scripting and automation.
Hi,
opsgenie-lamp --version
lamp version 3.2.0
https://docs.opsgenie.com/docs/lamp-command-line-interface-for-opsgenie#configuration
- If none of the methods given above works, Lamp uses the default {{USER_HOME}}/.config/lamp.conf file as configuration
Your sample configuration is here https://github.com/opsgenie/opsgenie-lamp/blob/master/conf/lamp.conf.
I simply put created token into that file {{USER_HOME}}/.config/lamp.conf
and this is result:
opsgenie-lamp listServices
2022/05/18 19:44:20 INFO: Logging to file is disabled, To enable Logging to file Please specify logPath in configuration
INFO[2022-05-18T19:44:20.963764+02:00] Client is configured with ApiUrl: api.opsgenie.com, LogLevel: info, RetryMaxCount: 4
ERRO[2022-05-18T19:44:21.665032+02:00] Error occurred with Status code: 422, Message: Key format is not valid!, Took: 0.000000, RequestId:
2022/05/18 19:44:21 ERROR : Error occurred with Status code: 422, Message: Key format is not valid!, Took: 0.000000, RequestId: ```
I tested using the attachFile command and receive an error:
Status code: 413, Message: Current request is not a multipart request.
I am primarily a JavaScript and .NET programmer but I have done a little bit of Go so I looked and I think this is an issue where the correct Content type is not being set in the code. But I only looked briefly so I could very well be wrong. Let me know if this works for other people.
Hi,
I am working with Lamp to create alerts from a workflow failure. I work with containers to do so and I really would like to be able to configure lamp from environment variables instead of a configuration file.
I do not know GO so I kind of relying on community to develop this feature, but I know there are some existing GO modules that provide this like spf13/viper..
Let me know if I can help our you need more informations.
It's looking in ~/go/bin/conf/lamp.conf
by default on MacOS, presumably Linux, too. This should probably be ~/.lamp.conf
by default.
To get the home directory of a user, you can use os.UserHomeDir()
or os/user.Current()
from stdlib. I would probably lean towards the former.
That's the typical first place to look.
The current implementation looking at where the binary is being executed from, etc - this seems similar to some FHS behaviors as a fallback location if there is no user configuration file, but it should go up one directory, and the directory should be "etc" instead of "conf". There's a bunch of path manipulation there which should use functions like path.Join
instead.
The main reason for this is that the first time you install a program like this, you need to set it up and so it's not great if it doesn't tell you where to set the API token, where the file should be created, and how to set up the file.
As of today, you can't use go-get to get the latest version of opsgenie-lamp:
go get github.com/opsgenie/opsgenie-lamp/...
# github.com/opsgenie/opsgenie-lamp/command
../../go/src/github.com/opsgenie/opsgenie-lamp/command/escalation_cmd.go:15:65: cannot use getConfigurations(c) (type *"github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/client".Config) as type *"github.com/opsgenie/opsgenie-go-sdk-v2/client".Config in argument to escalation.NewClient
../../go/src/github.com/opsgenie/opsgenie-lamp/command/escalation_cmd.go:45:17: cannot use &"github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".OwnerTeam literal (type *"github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".OwnerTeam) as type *"github.com/opsgenie/opsgenie-go-sdk-v2/og".OwnerTeam in assignment
../../go/src/github.com/opsgenie/opsgenie-lamp/command/escalation_cmd.go:83:4: cannot use escalationCondition[index] (type "github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".EscalationCondition) as type "github.com/opsgenie/opsgenie-go-sdk-v2/og".EscalationCondition in field value
../../go/src/github.com/opsgenie/opsgenie-lamp/command/escalation_cmd.go:84:4: cannot use notifyTypes[index] (type "github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".NotifyType) as type "github.com/opsgenie/opsgenie-go-sdk-v2/og".NotifyType in field value
../../go/src/github.com/opsgenie/opsgenie-lamp/command/escalation_cmd.go:85:4: cannot use "github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".Participant literal (type "github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".Participant) as type "github.com/opsgenie/opsgenie-go-sdk-v2/og".Participant in field value
../../go/src/github.com/opsgenie/opsgenie-lamp/command/escalation_cmd.go:168:17: cannot use &"github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".OwnerTeam literal (type *"github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/og".OwnerTeam) as type *"github.com/opsgenie/opsgenie-go-sdk-v2/og".OwnerTeam in assignment
../../go/src/github.com/opsgenie/opsgenie-lamp/command/team_cmd.go:15:53: cannot use getConfigurations(c) (type *"github.com/opsgenie/opsgenie-lamp/vendor/github.com/opsgenie/opsgenie-go-sdk-v2/client".Config) as type *"github.com/opsgenie/opsgenie-go-sdk-v2/client".Config in argument to team.NewClient
Maybe it's related to yesterdays PR: a76dfbc
The current version of the configuration library, github.com/ccding/go-config-reader - has no tests or other descriptions.
My suggestion would be to use a different config library.
Hi,
With version 2.7.0 and older I created and closed alarms with alias.
This is not possible since version 3.X.
Since version 3.x the parameter alias is no longer available in closeAlert
Although it is documented like this:
https://docs.opsgenie.com/docs/lamp-command-line-interface-for-opsgenie#close-alert-command
Example:
opsgenie-lamp closeAlert --apiKey ab5454992-fabb2-4ba2-ad44f-1af65ds8b5c079 --alias appserver3Down
ERROR: "Error occured while executing command: flag provided but not defined: -alias"
Point two:
When I download the latest version (https://s3-us-west-2.amazonaws.com/opsgeniedownloads/repo/opsgenie-lamp-3.8.0.zip) and I display the version, it says: "lamp version 3.2.0".
Hello,
We are using the binary version 2.6 and discovered that there a version binaries version 3.2
We wanted to check to difference between both versions. However, only tag for version 3.1.1 and 3.1.2 are available preventing to get the changes.
Could you please put the corresponding tag or at least ensure tag are available for next version ?
Best Regards.
I cannot get lamp to work with an account on the EU instance, using the macOS ZIP package with the opsgenie.api.url = https://api.eu.opsgenie.com/
configuration variable set. Any request ends up with Client error occurred; Response Code: 401, Response Body: {"message":"Could not authenticate","took":0.0,"requestId":"…"}
error message.
This works if the tool is built with GO with the source code, though.
Besides this discrepancy between the source and ZIP versions, the documentation should be updated to reveal that the configuration variable opsgenie.api.url = https://api.eu.opsgenie.com/
exists for and must be set by European customers.
Documentation says I can use either the name or the id of the policy:
--id value Id of the integration/policy that will be enabled. Either id or name must be provided
But when I use the name of the policy I get this error:
INFO[2019-08-07T12:24:58.5856735+02:00] Client is configured with ApiUrl: api.opsgenie.com, LogLevel: trace, RetryMaxCount: 4
DEBU[2019-08-07T12:24:58.5862319+02:00] Starting to process Request &{BaseRequest:{} Id:rolling_restart_jmbpapp11 TeamId:a2ac9607-3836-45bb-a88e-5a671498e19e Type:alert}: to send: /v2/policies/rolling_restart_jmbpapp11/enable
ERRO[2019-08-07T12:24:58.9699229+02:00] Error occurred with Status code: 404, Message: Policy not found with id [rolling_restart_jmbpapp11] and team id [a2ac9607-3836-45bb-a88e-5a671498e19e], Took: 0.003000, RequestId: 2c48a1b9-9f6c-4dee-bb34-1760029c3f25
Error occurred with Status code: 404, Message: Policy not found with id [rolling_restart_jmbpapp11] and team id [a2ac9607-3836-45bb-a88e-5a671498e19e], Took: 0.003000, RequestId: 2c48a1b9-9f6c-4dee-bb34-1760029c3f25
Same command with the id of the policy does complete successfully:
DEBU[2019-08-07T12:25:47.5706651+02:00] Starting to process Request &{BaseRequest:{} Id:17fede29-b0e9-4c21-a901-8818f891454b TeamId:a2ac9607-3836-45bb-a88e-5a671498e19e Type:alert}: to send: /v2/policies/17fede29-b0e9-4c21-a901-8818f891454b/enable
DEBU[2019-08-07T12:25:48.1805478+02:00] Request processed. The result: &{ResultMetadata:{RequestId:c9db0283-9391-4687-bdb9-e5477b9a5aaa ResponseTime:0.13 RateLimitState:OK RateLimitReason: RateLimitPeriod: RetryCount:0} Result:Enabled}
Policy enabled successfuly
Name of the policy is correct:
{"id":"17fede29-b0e9-4c21-a901-8818f891454b","name":"rolling_restart_jmbpapp11"
Also tried --name
, different error:
Incorrect Usage: flag provided but not defined: -name
CHANEGLOG.md should be renamed to CHANGELOG.md
This project is still using dep
, without checked-in module vendoring, and the command that the instructions list to install it does not work due to either upstream module changes, or perhaps the subtle differences betweenthe alternate approaches to resolving dependencies between dep
and go modules.
$ go get github.com/opsgenie/opsgenie-lamp/...
go: finding github.com/opsgenie/opsgenie-lamp latest
go: downloading github.com/opsgenie/opsgenie-lamp v0.0.0-20190823114531-67ad89ea4143
go: extracting github.com/opsgenie/opsgenie-lamp v0.0.0-20190823114531-67ad89ea4143
go: finding github.com/ccding/go-config-reader latest
go: finding github.com/urfave/cli v1.22.1
go: finding github.com/opsgenie/opsgenie-go-sdk-v2 latest
go: downloading github.com/urfave/cli v1.22.1
go: downloading gopkg.in/yaml.v2 v2.2.1
go: extracting github.com/urfave/cli v1.22.1
go: extracting gopkg.in/yaml.v2 v2.2.1
go: downloading github.com/ccding/go-config-reader v0.0.0-20130817225950-8b6c2b50197f
go: extracting github.com/ccding/go-config-reader v0.0.0-20130817225950-8b6c2b50197f
go: downloading github.com/opsgenie/opsgenie-go-sdk-v2 v0.0.0-20190925114845-8388ea1fcf79
go: extracting github.com/opsgenie/opsgenie-go-sdk-v2 v0.0.0-20190925114845-8388ea1fcf79
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
go: downloading github.com/sirupsen/logrus v0.0.0-20170620144510-3d4380f53a34
go: extracting github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
go: finding github.com/hashicorp/go-retryablehttp v0.6.2
go: downloading github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/hashicorp/go-retryablehttp v0.6.2
go: extracting github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: extracting github.com/shurcooL/sanitized_anchor_name v1.0.0
go: extracting github.com/hashicorp/go-retryablehttp v0.6.2
go: extracting github.com/sirupsen/logrus v0.0.0-20170620144510-3d4380f53a34
go: downloading golang.org/x/sys v0.0.0-20190412213103-97732733099d
go: extracting golang.org/x/sys v0.0.0-20190412213103-97732733099d
go: downloading github.com/hashicorp/go-cleanhttp v0.5.1
go: downloading github.com/hashicorp/go-hclog v0.9.2
go: extracting github.com/hashicorp/go-cleanhttp v0.5.1
go: extracting github.com/hashicorp/go-hclog v0.9.2
go: finding github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
go: finding github.com/sirupsen/logrus v0.0.0-20170620144510-3d4380f53a34
go: finding github.com/hashicorp/go-cleanhttp v0.5.1
go: finding github.com/hashicorp/go-hclog v0.9.2
go: finding github.com/russross/blackfriday/v2 v2.0.1
go: finding github.com/shurcooL/sanitized_anchor_name v1.0.0
# github.com/opsgenie/opsgenie-go-sdk-v2/client
/Users/samv/go/pkg/mod/github.com/opsgenie/[email protected]/client/client.go:177:15: conf.Logger.SetLevel undefined (type *logrus.Logger has no field or method SetLevel)
/Users/samv/go/pkg/mod/github.com/opsgenie/[email protected]/client/client.go:179:14: conf.Logger.SetFormatter undefined (type *logrus.Logger has no field or method SetFormatter)
/Users/samv/go/pkg/mod/github.com/opsgenie/[email protected]/client/client.go:249:23: client.Config.Logger.GetLevel undefined (type *logrus.Logger has no field or method GetLevel)
/Users/samv/go/pkg/mod/github.com/opsgenie/[email protected]/client/config.go:90:14: undefined: logrus.TraceLevel
You can upgrade the project to modules by upgrading go and running go mod init
. Commit your go.mod
and mod.sum
(IIRC) files and start adding dependencies with just go get
within the repo.
go version: go1.13.4 darwin/amd64
macos version: 10.15.1
Attempts to use the compiled binary from opsgenie-integration/opsgenie-lamp/opsgenie-lamp.zip result in the following error:
Failed to execute process './opsgenie-lamp'. Reason:
exec: Bad CPU type in executable
Attempts to go get ...
result in the following errors:
go get github.com/opsgenie/opsgenie-lamp/...
# github.com/opsgenie/opsgenie-lamp
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:17:15: cannot use cli.BoolFlag literal (type cli.BoolFlag) as type cli.Flag in array or slice literal:
cli.BoolFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:21:17: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:25:17: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:29:17: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:37:18: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:41:18: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:45:18: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:49:18: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:53:18: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:57:18: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
../go/src/github.com/opsgenie/opsgenie-lamp/lamp.go:57:18: too many errors
github.com/codegangsta/cli
recently was renamed github.com/urfave/cli
and as such go get opsgenie-lamp
reports an error parsing go.mod
.
go: github.com/opsgenie/opsgenie-lamp imports
github.com/codegangsta/cli: github.com/codegangsta/[email protected]: parsing go.mod: unexpected module path "github.com/urfave/cli"
Fix is to change lamp.go
and other files that import the renamed repo.
Hello,
Could you please provide a changelog for this tool ?
We are using the version 2.6 and we discovered that he version is now 3.2 but there is explantion about the changes either here or at https://docs.opsgenie.com/docs/lamp-command-line-interface-for-opsgenie
Best Regards.
Hello
I'm using the latest version that is named as 3.1.4
, but opsgenie-lamp --version
gives me 3.2.0
.
I've created configuration file at ~/.config/lamp.conf
with following content
apiKey=<MY API KEY>
opsgenie.api.url=https://api.eu.opsgenie.com
But, this URL is ignored, the logs of a tool are giving me:
INFO[2023-02-06T18:51:56.930487813+02:00] Client is configured with ApiUrl: api.opsgenie.com, LogLevel: info, RetryMaxCount: 4
Also, I've tried to pass completely incorrect URL - the result is the same, this setting is not picked up by the tool.
apiKey=<MY API KEY>
opsgenie.api.url=https://qwe.asd
When I run
go get github.com/opsgenie/opsgenie-lamp/...
I get this message:
go: go.mod file not found in current directory or any parent directory.
'go get' is no longer supported outside a module.
To build and install a command, use 'go install' with a version,
like 'go install example.com/cmd@latest'
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.
It would be great to be able to create, delete, list, enable and disable heartbeats to make it easier to maintain a number of endpoints via CLI.
For context, we maintain ~250 heartbeats, one for each cluster we manage, and while we have automated creation/deletion via a Kubernetes operator, sometimes a need comes up to check them and enable/disable for maintenance.
There is currently a heartbeat
command, but it can only send pings to already existing and enabled heartbeat endpoints. It would probably make sense to re-factor it and move functionality into a subcommand like heartbeat ping
in order to be able to add others, e.g. heartbeat create
, heartbeat delete
, etc. Or, what your preference for the UI be?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.