Giter Site home page Giter Site logo

docker-virtuoso's Introduction

Virtuoso docker

Docker for hosting Virtuoso.

The Virtuoso is built from a specific commit SHA in https://github.com/openlink/virtuoso-opensource.

The Docker image tags include the Virtuoso version installed in the container. The following versions are currently available:

  • 1.3.2-virtuoso7.2.5 (or virtuoso7.2.5 for latest)
  • 1.3.2-virtuoso7.2.4 (or virtuoso7.2.4 for latest)
  • 1.3.2-virtuoso7.2.2 (or virtuoso7.2.2 for latest)
  • 1.3.2-virtuoso7.2.1 (or virtuoso7.2.1 for latest)
  • 1.3.2-virtuoso7.2.0 (or virtuoso7.2.0 for latest)

Running your Virtuoso

docker run --name my-virtuoso \
    -p 8890:8890 -p 1111:1111 \
    -e DBA_PASSWORD=myDbaPassword \
    -e SPARQL_UPDATE=true \
    -e DEFAULT_GRAPH=http://www.example.com/my-graph \
    -v /my/path/to/the/virtuoso/db:/data \
    -d tenforce/virtuoso

The Virtuoso database folder is mounted in /data.

The Docker image exposes port 8890 and 1111.

Docker compose

The image can also be configured and used via docker-compose.

db:
  image: tenforce/virtuoso:1.3.1-virtuoso7.2.2
  environment:
    SPARQL_UPDATE: "true"
    DEFAULT_GRAPH: "http://www.example.com/my-graph"
  volumes:
    - ./data/virtuoso:/data
  ports:
    - "8890:8890"

Configuration

dba password

The dba password can be set at container start up via the DBA_PASSWORD environment variable. If not set, the default dba password will be used.

SPARQL update permission

The SPARQL_UPDATE permission on the SPARQL endpoint can be granted by setting the SPARQL_UPDATE environment variable to true.

.ini configuration

All properties defined in virtuoso.ini can be configured via the environment variables. The environment variable should be prefixed with VIRT_ and have a format like VIRT_$SECTION_$KEY. $SECTION and $KEY are case sensitive. They should be CamelCased as in virtuoso.ini. E.g. property ErrorLogFile in the Database section should be configured as VIRT_Database_ErrorLogFile=error.log.

Dumping your Virtuoso data as quads

Enter the Virtuoso docker, open ISQL and execute the dump_nquads procedure. The dump will be available in /my/path/to/the/virtuoso/db/dumps.

docker exec -it my-virtuoso bash
isql-v -U dba -P $DBA_PASSWORD
SQL> dump_nquads ('dumps', 1, 10000000, 1);

For more information, see http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtRDFDumpNQuad

Loading quads in Virtuoso

Manually

Make the quad .nq files available in /my/path/to/the/virtuoso/db/dumps. The quad files might be compressed. Enter the Virtuoso docker, open ISQL, register and run the load.

docker exec -it my-virtuoso bash
isql-v -U dba -P $DBA_PASSWORD
SQL> ld_dir('dumps', '*.nq', 'http://foo.bar');
SQL> rdf_loader_run();

Validate the ll_state of the load. If ll_state is 2, the load completed.

select * from DB.DBA.load_list;

For more information, see http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtBulkRDFLoader

Automatically

By default, any data that is put in the toLoad directory in the Virtuoso database folder (/my/path/to/the/virtuoso/db/toLoad) is automatically loaded into Virtuoso on the first startup of the Docker container. The default graph is set by the DEFAULT_GRAPH environment variable, which defaults to http://localhost:8890/DAV.

Creating a backup

A virtuoso backup can be created by executing the appropriate commands via the ISQL interface.

docker exec -i virtuoso_container mkdir -p backups
docker exec -i virtuoso_container isql-v <<EOF
    exec('checkpoint');
    backup_context_clear();
    backup_online('backup_',30000,0,vector('backups'));
    exit;

Restoring a backup

To restore a backup, stop the running container and restore the database using a new container.

docker run --rm  -it -v path-to-your-database:/data tenforce/virtuoso virtuoso-t +restore-backup backups/backup_ +configfile /data/virtuoso.ini

The new container will exit once the backup has been restored, you can then restart the original db container.

It is also possible to restore a backup placed in /data/backups using a environment variable. Using this approach the backup is loaded automatically on startup and it is not required to run a separate container.

docker run --name my-virtuoso \
            -p 8890:8890 \
            -p 1111:1111 \
            -e DBA_PASSWORD=dba \
            -e SPARQL_UPDATE=true \
            -e BACKUP_PREFIX=backup_ \_
            -v path-to-your-database:/data \
            -d tenforce/virtuoso

Contributing

Contributions to this repository are welcome, please create a pull request on the master branch.

New features will be tested on tenforce/virtuoso:latest first. Once the image is verified, version branches will be rebased on master.

docker-virtuoso's People

Contributors

bertvannuffelen avatar cecton avatar erikap avatar fr0gs avatar jvstein avatar mielvds avatar nvdk avatar rahien avatar sandervd avatar wdullaer 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

Watchers

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

docker-virtuoso's Issues

An error when I want to login

Hi I am new with virtuoso, but I cannot login. I change some things in the docker run

docker run --name my-virtuoso \
    -p 8890:8890 -p 1111:1111 \
    -e DBA_PASSWORD=dba \
    -e SPARQL_UPDATE=true \
    -e DEFAULT_GRAPH=http://www.bigdataocean.eu/graph \
    -v /home/jaimetrillos/Documents/BDO/docker-virtuoso/db:/data \
    -d tenforce/virtuoso

So, when I go to http://localhost:8890/conductor/ and put user: dba and password: dba. It saids "Invalid credentials". And I do not understand why.

Can you please help me?

Automatic backup restore

Hello, I was wandering if there is a way to automatically restore the backup (.bp) files obtained by an online backup automatically on container startup.
Currently, in the README, there is the

docker run --rm  -it -v path-to-your-database:/data tenforce/virtuoso virtuoso-t +restore-backup backups/backup_ +configfile /data/virtuoso.ini

and the user is meant to perform the restore in multiple steps. Also, I see in the virtuoso.sh there is the line in the end to start virtuoso:

exec virtuoso-t +wait +foreground

Wouldn't it be great if there were online backup files in the backups directory for example to be able to already restore the backup? Like, check if backups directory exists and then try to restore from there before running the instance.

VIRT_Parameters_DirsAllowed truncated at comma

When I try to set

VIRT_Parameters_DirsAllowed: "., /usr/local/virtuoso-opensource/share/virtuoso/vad, /models"

It gets truncated at the first comma and the virtuoso.ini ends up with:

DirsAllowed			= .,

I tried to escape it with '' and extra \"\" but it did not help.

Can't set ini keys with underscores via environment variables

The grep/sed commands used in virtuoso.sh make it impossible to set the following parameters.

[Flags]
tn_max_memory=2000000000
hash_join_enable=2

If you try to do it like this:

VIRT_Flags_tn_max_memory=2000000000
VIRT_Flags_hash_join_enable=2

The resulting virtuoso.ini looks like this:

[Flags]
memory=2000000000
enable=2

Compilation error with v7.2.8

I encounter this message while compiling for v7.2.8 (commit 64e6ecd39b03383875b7f2f15ed8070e2ebcd1f0)

#0 394.9 In file included from graphql.h:7:0,
#0 394.9                  from graphql_plugin.c:24:
#0 394.9 ../../libsrc/plugin/plugin.h:67:15: note: 'uv_companyname' declared here
#0 394.9    const char *uv_companyname;  /*!< Plugin's developer, filled by unit */
#0 394.9                ^~~~~~~~~~~~~~
#0 394.9 graphql_plugin.c: In function 'graphql_check':
#0 394.9 graphql_plugin.c:190:33: warning: unused parameter 'in' [-Wunused-parameter]
#0 394.9  graphql_check (unit_version_t * in, void *appdata)
#0 394.9                                  ^~
#0 394.9 graphql_plugin.c:190:43: warning: unused parameter 'appdata' [-Wunused-parameter]
#0 394.9  graphql_check (unit_version_t * in, void *appdata)
#0 394.9                                            ^~~~~~~
#0 394.9 At top level:
#0 394.9 graphql_plugin.c:154:1: warning: 'graphql_plugin_connect' defined but not used [-Wunused-function]
#0 394.9  graphql_plugin_connect ()
#0 394.9  ^~~~~~~~~~~~~~~~~~~~~~
#0 394.9 make[3]: *** [graphql_la-graphql_plugin.lo] Error 1
#0 394.9 make[2]: *** [all] Error 2
#0 394.9 make[1]: *** [all-recursive] Error 1
#0 394.9 make: *** [all-recursive] Error 1
------
Dockerfile:14
--------------------

Strange section values when converting environment variables to ini file

I'm not sure whether the section values deduced from environment variables are good.

Executing step by step what seems to be happening the first time in virtuoso.sh yields section values such as [NumberOfBuffers=170000]...

root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# printenv | grep -P "^VIRT_"
VIRT_NumberOfBuffers=170000
VIRT_MaxDirtyBuffers=130000
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# setting="VIRT_NumberOfBuffers=170000"
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# echo $setting 
VIRT_NumberOfBuffers=170000
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# section=$(echo "$setting" | grep -o -P "^VIRT_[^_]+" | sed 's/^.\{5\}//g')
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# echo $section 
NumberOfBuffers=170000
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# key=$(echo "$setting" | grep -o -P "_[^_]+=" | sed 's/[_=]//g')
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# echo $key
NumberOfBuffers
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# value=$(echo "$setting" | grep -o -P "=.*$" | sed 's/^=//g')
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# echo $value
170000
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# echo "Registering $section[$key] to be $value"
Registering NumberOfBuffers=170000[NumberOfBuffers] to be 170000
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# crudini --set virtuoso.ini "$section" "$key" "$value"
root@0cb539dde5e9:/usr/local/virtuoso-opensource/var/lib/virtuoso/db# grep NumberOfBuffers virtuoso.ini 
;NumberOfBuffers          = 170000
;NumberOfBuffers          = 340000
;NumberOfBuffers          = 680000
;NumberOfBuffers          = 1360000
;NumberOfBuffers          = 2720000
;NumberOfBuffers          = 4000000
;NumberOfBuffers          = 5450000
NumberOfBuffers          = 10000
[NumberOfBuffers=170000]
NumberOfBuffers = 170000

SPARQL_UPDATE=true seems broken

Setting SPARQL_UPDATE=true via docker-compose file works up to tenforce/virtuoso:1.0.0-virtuoso7.2.4, but it seems broken for more recent versions, including tenforce/virtuoso:latest. I found the workaround to run this on the running container:

$ docker exec -ti $CONTAINERID bash -c 'echo "GRANT SPARQL_UPDATE to \"SPARQL\";" | isql-v -U dba -P dba'

But I didn't manage to find a workaround to bake this fix into an image.

recent tags appear to be pegged to the wrong SHA ID

The "latest" image builds a 7.2.4.2 binary, not a 7.2.5.1

$ sudo docker run tenforce/virtuoso:latest virtuoso-t -?
Virtuoso Open Source Edition (Column Store) (multi threaded)
Version 7.2.4.2.3217-pthreads as of Nov  5 2018
Compiled for Linux (x86_64-pc-linux-gnu)
Copyright (C) 1998-2016 OpenLink Software

That should show 7.2.5.3229.

Looks like the dockerfile says --

# Set Virtuoso commit SHA to Virtuoso 7.2.4 release (25/04/2016)
ENV VIRTUOSO_COMMIT 96055f6a70a92c3098a7e786592f4d8ba8aae214

-- where it should say --

# Set Virtuoso commit SHA to Virtuoso 7.2.5.1 release (2018-08-15)
ENV VIRTUOSO_COMMIT 17c4ba1d5825822d8380ef8d9f978e2d57f4768f

Manifest not found for `tenforce/virtuoso:1.3.2-virtuoso7.2.5`

When trying to pull the virtuoso image using docker-compose with the following tag tenforce/virtuoso:1.3.2-virtuoso7.2.5. I get the following error :

ERROR: manifest for tenforce/virtuoso:1.3.2-virtuoso7.2.5 not found

Compose declaration :

database:
    image: tenforce/virtuoso:1.3.2-virtuoso7.2.5
    container_name: my-virtuoso
    environment:
      SPARQL_UPDATE: "true"
      DEFAULT_GRAPH: "http://www.example.com/my-graph"
    ports:
      - "8890:8890"
    restart: on-failure
    volumes:
      - ./data/virtuoso:/var/lib/virtuoso/data

OS : MacOS 10.14.3
Docker desktop version : 2.0.0.3 (31259)
Compose version : 1.23.2
Docker engine version : 18.09.2

VIRT_Parameters_DirsAllowed does not affect init

I set up the environment in the docker-compose.yml to add the directory /tmp to DirsAllowed like:

        environment:
            - VIRT_Parameters_DirsAllowed="., ../vad, /usr/share/proj, /tmp"

Once the container is running I can log in and see that docker-compose ran as expected:

root@eeb0cfd5a23c:/opt/virtuoso-opensource/database# echo $VIRT_Parameters_DirsAllowed
"., ../vad, /usr/share/proj, /tmp"

However, when I log into conductor, the DirsAllowed parameter is unchanged:
imgur screenshot

Remove VOLUME from Dockerfile

Thank you for providing this image.

Lately, I ran into the situation where I was wondering why there are so many anonymous Docker volumes on my server. Then I found that your image has a VOLUME /data instruction, which I find completely unnecessary. If I want to mount /data then I create a volume when I call docker run or docker-compose run.

Could you please remove this instruction?

Cheers,

Adrian

Can't stop and start again

After stopping the docker image, restarting it results in the following:

		Thu Oct 18 2018
10:21:24 OpenLink Virtuoso Universal Server
10:21:24 Version 07.20.3217-pthreads for Linux as of Aug 22 2018
10:21:24 uses parts of OpenSSL, PCRE, Html Tidy
10:21:26 Database version 3126
10:21:26 SQL Optimizer enabled (max 1000 layouts)
10:21:27 Compiler unit is timed at 0.000140 msec
10:21:28 Roll forward started
10:21:28     3 transactions, 185 bytes replayed (100 %)
10:21:28 Roll forward complete
10:21:28 Checkpoint started
10:21:28 Checkpoint finished, log reused
10:21:29 HTTP/WebDAV server online at 8890
10:21:29 Server online at 1111 (pid 1)
chmod: cannot access '/clean-logs.sh': No such file or directory

because the startup script is looking for /clean-logs.sh which it already moved the first time.

How to deactivate plugins?

I want to deactivate loading the plugins in tenforce/docker-virtuoso:latest but none of the following approaches work, what is the correct way to do this?

FROM tenforce/virtuoso:latest
# This will throw an error
ENV VIRT_Parameters_Load1=
# Any of those lines has no effect at all
RUN ["sed", "-i", "s|^Load|;Load|", "/data/virtuoso.ini"]
RUN ["sed", "-i", "s|^Load|;Load|", "/virtuoso.ini"]     
RUN ["sed", "-i", "s|^Load|;Load|", "/usr/local/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.ini"]             
# Just for testing, also no effect
RUN rm /virtuoso.ini    
RUN rm /usr/local/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.ini

The problem seems to be that Virtuoso is always autoregenerating the virtuoso.ini, but any virtuoso.ini that I find in the image via locate seems to be the wrong one.
While ENV VIRT_... allows to overwrite values in virtuoso.ini, I don't see a way to unset a value.

Also, the virtuoso.ini in the root of this repository doesn't have Load1...4 enabled but the one in the image does have it, even thought the file hasn't changed in many months.

Configuration with environment variables does not update

There is a clause in the startup script which checks if there is an existing virtuoso.ini file. If this file exists the environment variables are not inserted into the ini file.
Because the virtuoso.ini file is saved in the same directory as the database files, it is very likely to live in a persistent volume.
This means that configuration variables are not updated when the environment variables change, even when the container is recreated (because the settings are persisted in the volume).

This is not how I would expect configuration variables to behave.

To resolve this we should probably move the virtuoso.ini file to a location outside the current database volume. This would ensure that the configuration is properly updated when recreating the container, while keeping the current existence check on virtuoso.ini in place to allow users to pass in a custom config file.
Users can still bind mount a different file to this new location is they chose not to use environment variables to configure virtuoso.

Allow for a non-root user

I am trying to extend your Virtuoso Docker Image to just include a non-root user to run Virtuoso in a Docker Container.

FROM tenforce/virtuoso:latest

ARG USER_ID=1000
ARG GROUP_ID=1000

RUN groupadd \
		--gid $GROUP_ID \
		my_group; \
	useradd \
		--home-dir /home/my_non_root_user \
		--shell /bin/bash \
		--create-home \
		--uid $USER_ID \
		--gid $GROUP_ID \
		my_non_root_user;

USER my_non_root_user

The purpose of this is to allow for the files generated by the Docker image in the /data directory, which I mount to my host in order to have persistent storage. The above Dockerfile simply created a group and a user inside the Docker Image with the same UID and GID as my user on my host machine and then tells Docker to use that User for any following instructions, which include ENTRYPOINT and CMD Dockerfile instructions, which I don't override. At container start up the parent Docker image's ENTRYPOINT and CMD will be run by my new, non-root User.

Unfortunately, I am having trouble with this because the virtuoso.sh script that is run as the CMD instruction requires and depends on the root user running it to create some files. I figured this out by checking the docker logs. This is my output from docker logs:

mkdir: cannot create directory '/settings': Permission denied
chmod: changing permissions of '/clean-logs.sh': Operation not permitted
Converting environment variables to ini file
Finished converting environment variables to ini file
/virtuoso.sh: line 33: /settings/.config_set: No such file or directory
touch: cannot touch '/sql-query.sql': Permission denied
/virtuoso.sh: line 40: /sql-query.sql: Permission denied
/virtuoso.sh: line 41: /sql-query.sql: Permission denied
OpenLink Virtuoso Interactive SQL (Virtuoso)
Version 07.20.3229 as of Aug 22 2018
Type HELP; for help and EXIT; to exit.
Connected to OpenLink Virtuoso
Driver: 07.20.3229 OpenLink Virtuoso ODBC Driver
SQL> dump_nquads(0) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(1) dump_nquads(2) dump_nquads(2) dump_nquads(3) dump_nquads(3) dump_nquads(2) dump_nquads(2) dump_nquads(2) dump_nquads(2) dump_nquads(3) dump_nquads(3) dump_nquads(3) dump_nquads(3) dump_nquads(4) dump_nquads(4) dump_nquads(4) dump_nquads(3) dump_nquads(3) dump_nquads(3) dump_nquads(3) dump_nquads(2) dump_nquads(2) dump_nquads(1) dump_nquads(1) dump_nquads(2) dump_nquads(2) dump_nquads(2) dump_nquads(2) dump_nquads(3) dump_nquads(3) dump_nquads(3) dump_nquads(2) dump_nquads(2) dump_nquads(2) dump_nquads(1) 
Done. -- 1 msec.
/virtuoso.sh: line 42: /sql-query.sql: No such file or directory

		Wed Apr 24 2019
10:49:10 OpenLink Virtuoso Universal Server
10:49:10 Version 07.20.3229-pthreads for Linux as of Aug 22 2018
10:49:10 uses parts of OpenSSL, PCRE, Html Tidy
10:49:10 Database version 3126
10:49:10 SQL Optimizer enabled (max 1000 layouts)
10:49:11 Compiler unit is timed at 0.000169 msec
10:49:11 Roll forward started
10:49:11 Roll forward complete
10:49:12 Checkpoint started
10:49:12 Checkpoint finished, log reused
10:49:14 HTTP/WebDAV server online at 8890
10:49:14 Server online at 1111 (pid 1)
10:50:41 Incorrect login for dba from IP [127.0.0.1]
10:51:47 Incorrect login for dba from IP [127.0.0.1]
10:51:53 Incorrect login for dba from IP [127.0.0.1]
10:53:00 Incorrect login for dba from IP [127.0.0.1]

While Virtuoso still runs as the non-root user, the actions in the virtuoso.sh script do not behave correctly, so I am losing out on a lot of the functionality you have set up. For example, setting up a DBA_PASSWORD via environment variables to the Docker container and configuring the virtuoso.ini file via environment variables. As you can see, when I try to login with the DBA_PASSWORD I am expecting to work, it doesn't.

It may be as easy as just changing where the /settings directory, /settings/.config_set file, clean-logs.sh script, and sql-query.sql script are made, but that is just a guess based off the logs I provided.

If you have another idea/suggestion, please let me know as I would love to be able to run virtuoso as a non-root user in my environment.

Error loading DBPedia Turtle in Virtuoso

Hi!

I downloaded DBPedia turtle-files with their extraction framework (https://github.com/dbpedia/extraction-framework).

Then I used the docker image tenforce/virtuoso:1.3.2-virtuoso7.2.2 after exctracting all ttl.bz2 to a toLoad file.

After the full load, I checked isql with select * from DB.DBA.LOAD_LIST; and got an error from one of the files:

2 2019.2.2 11:31.43 69876000 2019.2.2 11:31.44 521623000 0 NULL 37000 [Vectorized Turtle loader] SP029: TURTLE RDF loader, line 172395: syntax error

The virtuoso endpoint (http://localhost:8890/sparql) is online, but the queries don't return correct results.

Do you know what I can do to correct this error?

Enabe https in Virtuoso container

Hi guys,

Nice job, thx for this.

A suggestion: would be great to have an option to setup an HTTPS server instead of simply HTTP.
That would require port 4443 (default one) to be configured for the SPARQL endpoint as well as Conductor, URI lookup (/fct) and the describe service.

Franck.

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.