Coder Social home page Coder Social logo

xk6-sql's Introduction

xk6-sql

This is a k6 extension using the xk6 system.

Supported RDBMSs: mysql, postgres, sqlite3, sqlserver, azuresql, clickhouse. See the examples directory for usage. Other RDBMSs are not supported, see details below.

Build

To build a k6 binary with this plugin, first ensure you have the prerequisites:

  • Go toolchain
  • If you're using SQLite, a build toolchain for your system that includes gcc or another C compiler. On Debian and derivatives install the build-essential package. On Windows you can use tdm-gcc. Make sure that gcc is in your PATH.
  • Git

Then:

  1. Install xk6:
go install go.k6.io/xk6/cmd/xk6@latest
  1. Build the binary:
xk6 build --with github.com/grafana/xk6-sql

If you're using SQLite, ensure you have a C compiler installed (see the prerequisites note) and set CGO_ENABLED=1 in the environment:

CGO_ENABLED=1 xk6 build --with github.com/grafana/xk6-sql

On Windows this is done slightly differently:

set CGO_ENABLED=1
xk6 build --with github.com/grafana/xk6-sql

Development

To make development a little smoother, use the Makefile in the root folder. The default target will format your code, run tests, and create a k6 binary with your local code rather than from GitHub.

make

Once built, you can run your newly extended k6 using:

 ./k6 run examples/sqlite3_test.js

Example

// script.js
import sql from 'k6/x/sql';

const db = sql.open("sqlite3", "./test.db");

export function setup() {
  db.exec(`CREATE TABLE IF NOT EXISTS keyvalues (
           id integer PRIMARY KEY AUTOINCREMENT,
           key varchar NOT NULL,
           value varchar);`);
}

export function teardown() {
  db.close();
}

export default function () {
  db.exec("INSERT INTO keyvalues (key, value) VALUES('plugin-name', 'k6-plugin-sql');");

  let results = sql.query(db, "SELECT * FROM keyvalues;");
  for (const row of results) {
    console.log(`key: ${row.key}, value: ${row.value}`);
  }
}

Result output:

$ ./k6 run script.js

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: /tmp/script.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)

INFO[0000] key: plugin-name, value: k6-plugin-sql        source=console

running (00m00.1s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m00.0s/10m0s  1/1 iters, 1 per VU

    █ setup

    █ teardown

    data_received........: 0 B 0 B/s
    data_sent............: 0 B 0 B/s
    iteration_duration...: avg=9.22ms min=19.39µs med=8.86ms max=18.8ms p(90)=16.81ms p(95)=17.8ms
    iterations...........: 1   15.292228/s

See also

Support for other RDBMSs

Note that this project is not accepting support for additional SQL implementations and RDBMSs. See the discussion in issue #17 for the reasoning.

There are however forks of this project that add additional support for:

You can build k6 binaries by simply specifying these project URLs in xk6 build. E.g. CGO_ENABLED=1 xk6 build --with github.com/stefnedelchevbrady/xk6-sql-with-oracle. Please report any issues with these extensions in their respective GitHub issue trackers, and not in grafana/xk6-sql.

Docker

For those who do not have a Go development environment available, or simply want to run an extended version of k6 as a container, Docker is an option to build and run the application.

The following command will build a custom k6 image incorporating the xk6-sql extension built from the local source files.

docker build -t grafana/k6-for-sql:latest .

Using this image, you may then execute the examples/sqlite3_test.js script by running the following command:

docker run -v $PWD:/scripts -it --rm grafana/k6-for-sql:latest run /scripts/examples/sqlite3_test.js

For those on Mac or Linux, the docker-run.sh script simplifies the command:

./docker-run.sh examples/sqlite3_test.js

xk6-sql's People

Contributors

200puls avatar andrewslotin avatar hawkup avatar javaducky avatar jbodkin-amphora avatar jt-shippit avatar kempsterc avatar leandrodotec avatar mostafa avatar mstoykov avatar pablochacin avatar samof76 avatar stefnedelchevbrady avatar szkiba avatar tingwei628 avatar woklex avatar ynovytskyy avatar zacharyvoase 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

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

xk6-sql's Issues

Use Go generics

#35 bumps the Go version we use in CI to 1.20, so we can migrate the codebase to use some Go generics features.

The obvious change would be to drop interface{} in favor of any, but it's also worth looking into whether the pointer logic in SQL.Query() could be simplified with some generic type.

git not found error when building k6 via xk6 docker image and including sql extension

Get the following error when building using the xk6 docker image:

go: errors parsing go.mod:
go.mod:5: git init --bare in /go/pkg/mod/cache/vcs/7f51e6d9fcff52165040e226b11ec63a94d49f901bb4063780ffab7eaff6a1ce: exec: "git": executable file not found in $PATH

using the command

docker run --rm -it -e GOOS=darwin -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" \
  grafana/xk6 build v0.51.0 \
  --with github.com/szkiba/[email protected]

able to successfully build k6 without the sql extension using

docker run --rm -it -e GOOS=darwin -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" \
  grafana/xk6 build v0.51.0

Docker version 26.0.0, build 2ae903e
MacOS Sonoma Version 14.4.1 (23E224) - M1 chip

default addr for network '127.0.0.1' unknown

Hello, I met across a problem, could you help me?

My Environment

  • Mac os Catalina
  • xk6_0.4.5_mac_amd64.tar.gz

What I did

// test.js
import sql from 'k6/x/sql';

const db = sql.open('mysql', 'mysql://root:<password>@127.0.0.1/<database>?charset=UTF8MB4');

export function setup() {

}

export function teardown() {
    db.close();
}

export default function () {
    db.exec('SELECT NOW();');
    let result = sql.query(db, 'SELECT NOW();');
    console.log(result);
}
./k6 run test.js

What happened

it returns...

ERRO[0000] default addr for network '127.0.0.1' unknown
        at go.k6.io/k6/js/common.Bind.func1 (native)

What I want to do

connect to mysql successfully

High vulnerability from trivy scan in Docker image

Hi team,

I am finding an image k6 with sql support and get here. I built a docker image myself using your Dockerfile and tried scan vulnerability using trivy. I got this:

usr/bin/k6 (gobinary)

Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 0)

Library Vulnerability Severity Installed Version Fixed Version Title
golang.org/x/net CVE-2022-41721 HIGH v0.0.0-20221002022538-bcab6841153b 0.1.1-0.20221104162952-702349b0e862 request smuggling https://avd.aquasec.com/nvd/cve-2022-41721
CVE-2022-41723 0.7.0 avoid quadratic complexity in HPACK decoding https://avd.aquasec.com/nvd/cve-2022-41723
CVE-2022-41717 MEDIUM 0.4.0 excessive memory growth in a Go server accepting HTTP/2 requests https://avd.aquasec.com/nvd/cve-2022-41717

I proposed a temporary fix on this PR-43

grafana/k6-for-sql doesn't seem to exist

I was trying to run this plugin via docker, but it seems as though the image doesn't exist in dockerhub anymore. Is there a new name or has the image been taken down?

uuid returned as an array of numbers for MS SQL

Hi,

I'm connecting to a MS SQL database, when I query a table, the columns that have an uuid stored are returned as an array of numbers, for example for:

“Id”:“31834ec8-d1b5-48ee-8f2d-36072101aa74”
is returned as:
“Id”:[200,78,131,49,181,209,238,72,143,45,54,7,33,1,170,116]

MySQL values returned as arrays of ASCII integers

Versions

What

On table of 926 rows named filled_table;

SELECT *

export default function () {
  const results = sql.query(db, 'SELECT * FROM filled_table;');
  check(results, {
    'is length 926': (r) => r.length === 926
  });
}
% ./k6 run script.js

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

WARN[0000] Module 'k6/x/sql' is using deprecated APIs that will be removed in k6 v0.38.0, for more details on how to update it see https://k6.io/docs/extensions/guides/create-an-extension/#advanced-javascript-extension
  execution: local
     script: script.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)


running (00m00.0s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m00.0s/10m0s  1/1 iters, 1 per VU

     ✓ is length 926

     checks...............: 100.00% ✓ 1         ✗ 0
     data_received........: 0 B     0 B/s
     data_sent............: 0 B     0 B/s
     iteration_duration...: avg=8.29ms min=8.29ms med=8.29ms max=8.29ms p(90)=8.29ms p(95)=8.29ms
     iterations...........: 1       98.862097/s

SELECT count

export default function () {
  const results = sql.query(db, 'SELECT count(*) FROM filled_table;');
  console.log(JSON.stringify(results))
  check(results, {
    'is length 926': (r) => r.length === 926
  });
}
% ./k6 run script.js

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

WARN[0000] Module 'k6/x/sql' is using deprecated APIs that will be removed in k6 v0.38.0, for more details on how to update it see https://k6.io/docs/extensions/guides/create-an-extension/#advanced-javascript-extension
  execution: local
     script: script.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)

INFO[0000] [{"count(*)":[57,50,54]}]                    source=console

running (00m00.0s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m00.0s/10m0s  1/1 iters, 1 per VU

     ✗ is length 926
      ↳  0% — ✓ 0 / ✗ 1

     checks...............: 0.00% ✓ 0          ✗ 1
     data_received........: 0 B   0 B/s
     data_sent............: 0 B   0 B/s
     iteration_duration...: avg=4.88ms min=4.88ms med=4.88ms max=4.88ms p(90)=4.88ms p(95)=4.88ms
     iterations...........: 1     148.411992/s

SELECT TABLE_ROWS

export default function () {
  const results = sql.query(db, 'SELECT TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_NAME = "filled_table";');
  console.log(JSON.stringify(results))
  check(results, {
    'is length 926': (r) => r.length === 926
  });
}
% ./k6 run script.js

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

WARN[0000] Module 'k6/x/sql' is using deprecated APIs that will be removed in k6 v0.38.0, for more details on how to update it see https://k6.io/docs/extensions/guides/create-an-extension/#advanced-javascript-extension
  execution: local
     script: script.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)

INFO[0000] [{"TABLE_ROWS":[57,50,54]}]                    source=console

running (00m00.0s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m00.0s/10m0s  1/1 iters, 1 per VU

     ✗ is length 926
      ↳  0% — ✓ 0 / ✗ 1

     checks...............: 0.00% ✓ 0          ✗ 1
     data_received........: 0 B   0 B/s
     data_sent............: 0 B   0 B/s
     iteration_duration...: avg=4.88ms min=4.88ms med=4.88ms max=4.88ms p(90)=4.88ms p(95)=4.88ms
     iterations...........: 1     148.411992/s

Observation

Logging the response of both SELECT count(*) and SELECT TABLE_ROWS show us the same responses.

[{"count(*)":[57,50,54]}]
// OR
[{"TABLE_ROWS":[57,50,54]}]

Add integration tests in CI

To ensure the extension keeps working with the supported RDBMSs there should be some integration tests for each, which should be straightforward to do since all have Docker images available (even SQL Server).

Of course we should first setup a basic CI that runs golangci-lint, go mod verify, etc.

Docker Build Error

I build my xk6-sql own image with the Dockerfile you supported. It build sucessfully. However when i started to run with the example scirpts you gave, it turns out with the error.
time="2023-06-05T02:58:43Z" level=error msg="could not initialize '-': could not load JS test 'file:///-': no exported functions in script"

Update for Extensions Compliance

The xk6-sql extension has fallen a bit behind the minimum requirements for extensions to be listed in the registry:

  • needs to be updated to at least v0.41
  • tests directory should be renamed to examples

For Official extensions, we should have linting enabled.

How to compile it under windows

Running CGO_ENABLED=1 go run ./cmd/xk6/main.go build master \ --with github.com/imiric/xk6-sql
'CGO_ENABLED' is not recognized as an internal or external command,
operable program or batch file.

I have installed go, if I run without CGO_ENABLED=1 i'm getting [ERROR] missing flag;

Question: Does xk6-sql support ssl-mode required

Does xk6-SQL support SSL-mode required?

My org recently enforced this on our AWS RDS databases, is this possible?

my connection string:

const db = sql.open( 'mysql',username:password@tcp(mysql.url:3306)/db_name );

the error I get now is:

GoError: Error 3159: Connections using insecure transport are prohibited while --require_secure_transport=ON.

I have tried this connection string:

const db = sql.open( 'mysql',username:password@tcp(mysql.url:3306)/db_name?sslmode=required );

with variations of ssl-mode=required sslMode=REQUIRED

Support for any `database/sql` implementation

Go's database/sql abstraction layer allows for a common API provided by many SQL drivers. At the moment, we are limiting this to 4 specific dialects (mysql, postgres, sqlite, and sqlserver) due to the need to include the driver code for each within our extended k6 build.

Ideally, we provide some sort of build option to allow the inclusion of the desired dialect(s) when creating the extended k6 version. Similar to the process followed by xk6, this would dynamically pull driver code into the source, updating import statements as necessary, then build the project with the new drivers. This would be better than having separate xk6-sql-*, repositories only differing by driver code.

Request to accept the username and password as two different arguments for db.open function.

Hi,

I'm trying to connect to aws rds based postgres instance with a password string containing a good number of special characters.

I did observe an error as net/url: invalid userinfo while building the xk6-sql extension and providing the connection string.

After a bit of research I'm able to fix my issue with a local build of xk6-sql by following the below two suggestions:

I'm pretty new to golang ecosystem so requesting to get the same code changes on the actual repo if it makes sense.

// need to add two more arguments for username and password
func (*SQL) Open(database string, connectionString string, username string, password string) (*dbsql.DB, error) {
	supportedDatabases := []string{"mysql", "postgres", "sqlite3", "sqlserver"}
	if !contains(supportedDatabases, database) {
		return nil, fmt.Errorf("database %s is not supported", database)
	}

   // modified code suggestion start
    connectionUrl, connErr := url.Parse(connectionString)
    if connErr != nil {
         fmt.Errorf("ERROR: %v\n", connErr)
         return nil, connErr
    }
    connectionUrl.User = url.UserPassword(username, password)

	db, err := dbsql.Open(database, connectionUrl.String())
	// modified code suggestion end 
	if err != nil {
		return nil, err
	}

	return db, nil
}

Docker build failing

By running the docker build I get the following error.

image

image

The error has been pretty consistent.
I am running the Docker build from Ubuntu 20.04 and I am not including any modification on the Dockerfile.

Emit query duration metric

The extension currently doesn't emit any SQL-specific k6 metrics. A basic one that would be useful for tracking DB performance would be query_duration. It should be possible to apply thresholds and tags per query, as mentioned in #22.

While this could be implemented in JS as shown in this example, it's a very imprecise method.

Suggested solution

Golang's database/sql doesn't seem to expose any such statistics, but there's an example here that wraps driver.Driver to calculate the value. It's essentially doing what the above JS example does, but in Go, so it's not great, but it's an improvement nonetheless.

PostgreSQL connection string special character issues

Hi I'm having an issue connecting to a PostgreSQL SB where the password contains special characters.

if my password is abc#123, and I create a connection string like:
postgres://myusername:abc%[email protected]/mydb

where # is escaped to be %23 as required by PostgreSQL. I get the following error when I try to connect:

const db = sql.open('postgres', 'postgres://myusername:abc%[email protected]/mydb');

ERRO[0005] GoError: parse "postgres://myusername:abc%!?(MISSING)[email protected]/mydb": invalid port ":abc%!"(MISSING) after host

How should can I connect to PostgreSQL DBs where a password contains a special character? Please help.

tags on sql.query command

for http requests we can add paramaters to our requests.

A parameter that we use often are tags to aid creating threshold for various items

response = http.get(data.helloWorld,
    {tags:{name:'helloWorld'}
  });

however for xk6-sql this doesn't appear to be supported meaning it is difficult to put thresholds on different queries being loaded together

k6/x/sql still unknown after creating binary: GoError: unknown module: k6/x/sql

k6 script, vendor.js:

import http from "k6/http";
import { check, sleep } from "k6";
import jsonpath from "https://jslib.k6.io/jsonpath/1.0.2/index.js"; 
import sql from 'k6/x/sql';

project directory:
image

cmds used to build xk6-sql binary:

xk6 build --with github.com/grafana/xk6-sql
xk6 build master --with github.com/grafana/xk6-sql

both work to create the binary in the working dir, but when running k6 run vendor.js
I get the same error each time:

ERRO[0000] GoError: unknown module: k6/x/sql
at go.k6.io/k6/js.(*requireImpl).require-fm (native)
at file:///C:/repos/.../app/k6_test/vendor.js:4:0(44)  hint="script exception"

Refactor the library to allow database-specific extensions

The current architecture of the extension requires adding each database driver as a dependency, which does not scale well, as adding support for a new database creates the demand for keeping its driver up-to-date and increases the risk of introducing vulnerabilities to the extension code. Adding the db driver as a dependency is needed to make the sql.Open() work due to the design of Go's stdlib package.

As an alternative solution we propose to redesign the API of this extension to allow users to use it as a base for database-specific extensions that can be used depending on the use-case.

Database opened multiple times

I was wondering if there's a preferred way to cleanly close all database connections. When running the sample code, sql.open() will get called twice, but db.close() will only get called once. My understanding is that the k6 lifecycle will run code any init code multiple times. Moving the sql.open() to setup() doesn't work.

It doesn't look like k6 supports a way to only run the init stage once. The db.close() in teardown() will only close one connection. I can't tell if some other mechanism is closing the extra connection, but unneeded connections to the database may degrade load test performance. Is there a recommended approach to this issue?

mssql - use official Microsoft driver

Microsoft has created an official fork of https://github.com/denisenkom/go-mssqldb at https://github.com/microsoft/go-mssqldb in agreement with the original project maintainers denisenkom/go-mssqldb#729

Since then, there have been plenty of fixes and enhancement delivered under the new Microsoft umbrella and many official versioned releases.

The original project is receiving the minimum maintenance effort.

xk6-sql should adopt the new fork of go-mssqldb in favor of the legacy driver.

Cannot connect to Azure Sql Database

I tried running a test vs an Azure Sql Database but I can't seem to connect to it while I'm sure the username and password are ok. I am perfectly able to connect with this connection string in my java application or SquirellSQL query tool.

Here is my test, I blanked out the domain and password in the connection string I can say however the password contains these characters: +$(%

I also url encoded the password in one of my attempts to get it fixed

import http from 'k6/http';
import sql from 'k6/x/sql';
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js";
import { sleep } from 'k6';

export const options = {
  vus: 10,
  duration: '30s'
};

const db = sql.open('sqlserver', 'jdbc:sqlserver://xxxxxxxx-a-sqls-001-trip.database.windows.net:1433;database=XXXXXXX-A-SQLD-001-TRIP-DIENSTREGELINGEN;user=trip-admin@xxxxxxxxx-a-sqls-001-trip;password=xxxxxxxxxxx;encrypt=false;trustServerCertificate=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;');

export default function () {
  const results = sql.query(db, 'SELECT count(*) FROM Trip;');
  sleep(0.3);
}

export function teardown() {
  db.close();
}

export function handleSummary(data) {
  return {
    "summary.html": htmlReport(data),
  };
}

output:

ERRO[0006] GoError: mssql: login error: Login failed for user 'trip-admin@xxxxxxxx-a-sqls-001-trip'.
        at reflect.methodValueCall (native)
        at file:///C:/Tools/k6/jdbctest.js:14:28(6)  executor=constant-vus scenario=default source=stacktrace
ERRO[0006] GoError: mssql: login error: Login failed for user 'trip-admin@xxxxxxxx-a-sqls-001-trip'.
        at reflect.methodValueCall (native)
        at file:///C:/Tools/k6/jdbctest.js:14:28(6)  executor=constant-vus scenario=default source=stacktrace
ERRO[0006] GoError: mssql: login error: Login failed for user 'trip-admin@xxxxxxxx-a-sqls-001-trip'.
        at reflect.methodValueCall (native)
        at file:///C:/Tools/k6/jdbctest.js:14:28(6)  executor=constant-vus scenario=default source=stacktrace`
`

Unrecognized import path "go.buf.build/grpc/go/prometheus/prometheus

We're getting error while running xk6 build --with github.com/grafana/xk6-sql command. It was working fine till yesterday but today it's throwing below error. We didn't make any code change.

I even tried changing the URL to github.com/stefnedelchevbrady/xk6-sql-with-oracle but still getting same error.

Step #1: k6 imports
Step #1: go.k6.io/k6/cmd imports
Step #1: github.com/grafana/xk6-output-prometheus-remote/pkg/remotewrite imports
Step #1: go.buf.build/grpc/go/prometheus/prometheus: unrecognized import path "go.buf.build/grpc/go/prometheus/prometheus": https fetch: Get "https://go.buf.build/grpc/go/prometheus/prometheus?go-get=1": dial tcp: lookup go.buf.build on 169.254.169.254:53: no such host

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.