Skip to main content

toon

image image Build

Description

Additional tools for neuroscience experiments, including:

  • A framework for polling input devices on a separate process.
  • A framework for keyframe-based animation.
  • High-resolution clocks.

Everything should work on Windows/Mac/Linux.

Install

Current release:

pip install toon

Development version:

pip install -i https://test.pypi.org/simple/ toon --pre

Or for the latest commit (requires compilation):

pip install git+https://github.com/aforren1/toon

See the demos/ folder for usage examples (note: some require additional packages).

Overview

Input

toon provides a framework for polling from input devices, including common peripherals like mice and keyboards, with the flexibility to handle less-common devices like eyetrackers, motion trackers, and custom devices (see toon/input/ for examples). The goal is to make it easier to use a wide variety of devices, including those with sampling rates >1kHz, with minimal performance impact on the main process.

We use the built-in multiprocessing module to control a separate process that hosts the device, and, in concert with numpy, to move data to the main process via shared memory. It seems that under typical conditions, we can expect single read() operations to take less than 500 microseconds (and more often < 100 us). See demos/bench_plot.py for an example of measuring user-side read performance.

Typical use looks like this:

from toon.input import MpDevice
from mymouse import Mouse
from timeit import default_timer

device = MpDevice(Mouse())

with device:
    t1 = default_timer() + 10
    while default_timer() < t1:
        res = device.read()
        # alternatively, unpack immediately
        # time, data = device.read()
        if res:
            time, data = res # unpack (or access via res.time, res.data)
            # N-D array of data (0th dim is time)
            print(data)
            # 1D array of times
            print(time)

Creating a custom device is relatively straightforward, though there are a few boxes to check.

from ctypes import c_double

class MyDevice(BaseDevice):
    # optional: give a hint for the buffer size (we'll allocate 1 sec worth of this)
    sampling_frequency = 500

    # this can either be introduced at the class level, or during __init__
    shape = (3, 3)
    # ctype can be a python type, numpy dtype, or ctype
    # including ctypes.Structures
    ctype = c_double

    # optional. Do not start device communication here, wait until `enter`
    def __init__(self):
        pass

    ## Use `enter` and `exit`, rather than `__enter__` and `__exit__`
    # optional: configure the device, start communicating
    def enter(self):
        pass

    # optional: clean up resources, close device
    def exit(self):
        pass

    # required
    def read(self):
        # See demos/ for examples of sharing a time source between the processes
        time = self.clock()
        # store new data with a timestamp
        data = get_data()
        return time, data

This device can then be passed to a toon.input.MpDevice, which preallocates the shared memory and handles other details.

A few things to be aware of for data returned by MpDevice:

  • If there's no data for a given read, None is returned.
  • The returned data is a copy of the local copy of the data. If you don't need copies, set use_views=True when instantiating the MpDevice.
  • If receiving batches of data when reading from the device, you can return a list of (time, data) tuples.
  • You can optionally use device.start()/device.stop() instead of a context manager.
  • You can check for remote errors at any point using device.check_error(), though this automatically happens after entering the context manager and when reading.
  • In addition to python types/dtypes/ctypes, devices can return ctypes.Structures (see input tests or the example_devices folder for examples).

Animation

This is still a work in progress, though I think it has some utility as-is. It's a port of the animation component in the Magnum framework, though lacking some of the features (e.g. Track extrapolation, proper handling of time scaling).

Example:

from math import sin, pi

from time import sleep
from timeit import default_timer
import matplotlib.pyplot as plt
from toon.anim import Track, Player
# see toon/anim/easing.py for all available easings
from toon.anim.easing import LINEAR, ELASTIC_IN

class Circle(object):
    x = 0
    y = 0

circle = Circle()
# list of (time, value)
keyframes = [(0.2, -0.5), (0.5, 0), (3, 0.5)]
x_track = Track(keyframes, easing=LINEAR)

# we can reuse keyframes
y_track = Track(keyframes, easing=ELASTIC_IN)

player = Player(repeats=3)

# directly modify an attribute
player.add(x_track, 'x', obj=circle)

def y_cb(val, obj):
    obj.y = val

# modify via callback
player.add(y_track, y_cb, obj=circle)

t0 = default_timer()
player.start(t0)
vals = []
times = []
while player.is_playing:
    t = default_timer()
    player.advance(t)
    times.append(t)
    vals.append([circle.x, circle.y])
    # sleep(1/60)

plt.plot(times, vals)
plt.show()

Other notes:

  • Non-numeric attributes, like color strings, can also be modified in this framework (easing is ignored).
  • Multiple objects can be modified simultaneously by feeding a list of objects into player.add().

Utilities

The util module includes high-resolution clocks/timers via QueryPerformanceCounter/Frequency on Windows, mach_absolute_time on MacOS, and clock_gettime(CLOCK_MONOTONIC) on Linux. The class is called MonoClock, and an instantiation called mono_clock is created upon import. Usage:

from toon.util import mono_clock, MonoClock

clk = mono_clock # re-use pre-instantiated clock
clk2 = MonoClock(relative=False) # time relative to whenever the system's clock started

t0 = clk.get_time()

Another utility currently included is a priority function, which tries to improve the determinism of the calling script. This is derived from Psychtoolbox's Priority (doc here). General usage is:

from toon.util import priority

if not priority(1):
    raise RuntimeError('Failed to raise priority.')

# ...do stuff...

priority(0)

The input should be a 0 (no priority/cancel), 1 (higher priority), or 2 (realtime). If the requested level is rejected, the function will return False. The exact implementational details depend on the host operating system. All implementations disable garbage collection.

Windows

  • Uses SetPriorityClass and SetThreadPriority/AvSetMmMaxThreadCharacteristics.
  • level = 2 only seems to work if running Python as administrator.

MacOS

  • Only disables/enables garbage collection; I don't have a Mac to test on.

Linux

  • Sets the scheduler policy and parameters sched_setscheduler.
  • If level == 2, locks the calling process's virtual address space into RAM via mlockall.
  • Any level > 0 seems to fail unless the user is either superuser, or has the right capability. I've used setcap: sudo setcap cap_sys_nice=eip <path to python> (disable by passing sudo setcap cap_sys_nice= <path>). For memory locking, I've used Psychtoolbox's 99-psychtoolboxlimits.conf and added myself to the psychtoolbox group.

Your mileage may vary on whether these actually improve latency/determinism. When in doubt, measure! Read the warnings here.

Notes about checking whether parts are working:

Windows

  • In the task manager under details, right-clicking on python and mousing over "Set priority" will show the current priority level. I haven't figured out how to verify the Avrt threading parts are working.

Linux

  • Check mlockall with cat /proc/{python pid}/status | grep VmLck
  • Check priority with top -c -p $(pgrep -d',' -f python)

Metadata

Release files for toon 0.15.9

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for toon 0.15.9
File Size Uploaded
toon-0.15.9.zip 320.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for toon 0.15.9
File
toon-0.15.9-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
toon-0.15.9-cp39-cp39-manylinux2010_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.12+ x86-64 Details
toon-0.15.9-cp39-cp39-manylinux1_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.5+ x86-64 Details
toon-0.15.9-cp39-cp39-macosx_10_9_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.9+ x86-64 Details
toon-0.15.9-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
toon-0.15.9-cp38-cp38-manylinux2010_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.12+ x86-64 Details
toon-0.15.9-cp38-cp38-manylinux1_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.5+ x86-64 Details
toon-0.15.9-cp38-cp38-macosx_10_9_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.9+ x86-64 Details
toon-0.15.9-cp37-cp37m-win_amd64.whl CPython 3.7 CPython 3.7 pymalloc Windows x86-64 Details
toon-0.15.9-cp37-cp37m-manylinux2010_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64 Details
toon-0.15.9-cp37-cp37m-manylinux1_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.5+ x86-64 Details
toon-0.15.9-cp37-cp37m-macosx_10_9_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.9+ x86-64 Details
toon-0.15.9-cp36-cp36m-win_amd64.whl CPython 3.6 CPython 3.6 pymalloc Windows x86-64 Details
toon-0.15.9-cp36-cp36m-manylinux2010_x86_64.whl CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.12+ x86-64 Details
toon-0.15.9-cp36-cp36m-manylinux1_x86_64.whl CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.5+ x86-64 Details
toon-0.15.9-cp36-cp36m-macosx_10_9_x86_64.whl CPython 3.6 CPython 3.6 pymalloc macOS 10.9+ x86-64 Details

Total release size: 4.2 MB

Release files / toon-0.15.9.zip

Download URL toon-0.15.9.zip
Size 320.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b53daedb3896a9f5d01a8c97c1c5361ad627cb717f63456e04c330e11b949001
BLAKE2b-256 checksum
How to use checksums
7338a467485209fbc25f1b37d6fa3a80848244d68321892bf8c210e3a3955fb7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp39-cp39-win_amd64.whl

Download URL toon-0.15.9-cp39-cp39-win_amd64.whl
Size 225.0 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
8565c096ca5b2dee549850fe7ae20fc589559b89cb451df4f426f3078a471fc3
BLAKE2b-256 checksum
How to use checksums
d50b17353f23fd0d510df459efe2dbc794fe80fad0f625cc9df46867ba6c7ff5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp39-cp39-manylinux2010_x86_64.whl

Download URL toon-0.15.9-cp39-cp39-manylinux2010_x86_64.whl
Size 273.5 kB
Tags CPython 3.9 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
e20d16ef3f8c391b9b0ac28be0c80a3c5d14385d622990746e138e54e7376d11
BLAKE2b-256 checksum
How to use checksums
eaeb8b6d88c0a86481c530eb78fcbd8b2f9c4d5c0bcc54a89e249f174448a7be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp39-cp39-manylinux1_x86_64.whl

Download URL toon-0.15.9-cp39-cp39-manylinux1_x86_64.whl
Size 273.5 kB
Tags CPython 3.9 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
b995891465fe87e93681f3ce2a33d92a96bf276fff67b1ded1f63642a0b43140
BLAKE2b-256 checksum
How to use checksums
1c6b5345f94eb5896c3541e804e110c38004d5b96823eb6c76581d615eee6dbc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp39-cp39-macosx_10_9_x86_64.whl

Download URL toon-0.15.9-cp39-cp39-macosx_10_9_x86_64.whl
Size 217.6 kB
Tags CPython 3.9 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
f05dad37d1bc443fdf27b883b07416b9ee131057a52c0e2ef7541c6ead6c8dda
BLAKE2b-256 checksum
How to use checksums
4c27a124b85bc20be6523f7dfe88e8a3241b7dd45f8e3bbb7e01c26f997920e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp38-cp38-win_amd64.whl

Download URL toon-0.15.9-cp38-cp38-win_amd64.whl
Size 224.8 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
2d4c6a7ab2119cb3574ca184a60730a39f01af93cf1b5cf2586aae403209ff50
BLAKE2b-256 checksum
How to use checksums
54e3429aa17b6c7bd3feb4df7de58d448d1a6ccb45420defe152a633cb313515
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp38-cp38-manylinux2010_x86_64.whl

Download URL toon-0.15.9-cp38-cp38-manylinux2010_x86_64.whl
Size 274.1 kB
Tags CPython 3.8 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
5615592cc41d9201e7a6f0b9a06960d054e202ba72f2724b7042180ec3afce4f
BLAKE2b-256 checksum
How to use checksums
cbc86b8b2899c21940923070f9244fe048568bc12919300edc959e401f4beb71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp38-cp38-manylinux1_x86_64.whl

Download URL toon-0.15.9-cp38-cp38-manylinux1_x86_64.whl
Size 274.1 kB
Tags CPython 3.8 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
8b539840dacb18aa9dafee79fe02989d43e41430b57e91e953bb6a31ef921504
BLAKE2b-256 checksum
How to use checksums
12580e5d292253053bcbb7f5a53985ab7ac597efd0bb3691a6e60a9267eedf4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp38-cp38-macosx_10_9_x86_64.whl

Download URL toon-0.15.9-cp38-cp38-macosx_10_9_x86_64.whl
Size 218.3 kB
Tags CPython 3.8 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
68cd3c9e9d6276f935bddc87504d306442bc02586fbee84332a617d214b68d16
BLAKE2b-256 checksum
How to use checksums
4b156e47b244866fb8f8f88a1fd95811d68aae85fdd9b88f28164178e2d9d85a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp37-cp37m-win_amd64.whl

Download URL toon-0.15.9-cp37-cp37m-win_amd64.whl
Size 224.5 kB
Tags CPython 3.7 CPython 3.7 pymalloc Windows x86-64
SHA-256 checksum
How to use checksums
3b7970a9ba17fb212072b7cde5e24aa44abf9ca92ca1c524bfa4be3c8bf85368
BLAKE2b-256 checksum
How to use checksums
54d77e55f63bc18b1d71dca41b0d9c9d099986313cd36d97308b48607977a3c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp37-cp37m-manylinux2010_x86_64.whl

Download URL toon-0.15.9-cp37-cp37m-manylinux2010_x86_64.whl
Size 271.4 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
d08f1413842157822894d8e0f6b84ec0c870852d415676cd29bd733be339c384
BLAKE2b-256 checksum
How to use checksums
ac240a6bc1c0ce0a35f68e21114ac8356b6f2a5e9ebed81ba1997ce7dbe9d131
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp37-cp37m-manylinux1_x86_64.whl

Download URL toon-0.15.9-cp37-cp37m-manylinux1_x86_64.whl
Size 271.4 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
9d93fc9f2803e4999c87bbc5fe20808ff158154684302a5d7e9ba92fc7182ffe
BLAKE2b-256 checksum
How to use checksums
310aad9e4d73917907efe802cb9880e3c0eed476d40b844190c1e954f3c2af0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp37-cp37m-macosx_10_9_x86_64.whl

Download URL toon-0.15.9-cp37-cp37m-macosx_10_9_x86_64.whl
Size 217.8 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
e6e951e18d55e95e79d05f4f8f4e7b2c41b58de18d1e92c9c9e7573e575d4c39
BLAKE2b-256 checksum
How to use checksums
ef2a7c4219c319eb91dcfef8c5c9c1aa1a1e24ed0eed0079c74396da28f39490
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp36-cp36m-win_amd64.whl

Download URL toon-0.15.9-cp36-cp36m-win_amd64.whl
Size 216.0 kB
Tags CPython 3.6 CPython 3.6 pymalloc Windows x86-64
SHA-256 checksum
How to use checksums
a9d6131a9e8876b3b6b02f83294582763be57c20db4bafb7934f94c4254b6695
BLAKE2b-256 checksum
How to use checksums
655322a61663e58387f4953be6cccceb4b3b9a15ea3faf44373679e36a939dba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp36-cp36m-manylinux2010_x86_64.whl

Download URL toon-0.15.9-cp36-cp36m-manylinux2010_x86_64.whl
Size 254.4 kB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
3f8d77939dc38ca30b01607b013bc14a8e251eab55c34452d164d26d3b6e2cab
BLAKE2b-256 checksum
How to use checksums
860e474c3c3d875e1c5ea29e2cd0e75d7600c732da6c15ee2c7baded55f6109f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp36-cp36m-manylinux1_x86_64.whl

Download URL toon-0.15.9-cp36-cp36m-manylinux1_x86_64.whl
Size 254.4 kB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
841f2d4aef5625b1d3e35385183476ff5ee59d9a6782f39f3bd0414747daf1d2
BLAKE2b-256 checksum
How to use checksums
a211c7bf9928ec75ff6536caf70a9c94d3b6a91a15542aa8cc580bf234401338
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release files / toon-0.15.9-cp36-cp36m-macosx_10_9_x86_64.whl

Download URL toon-0.15.9-cp36-cp36m-macosx_10_9_x86_64.whl
Size 210.0 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
f778202edc63afd7b874a0a42d0d7510ae7c802e6da177923deda9909becc64d
BLAKE2b-256 checksum
How to use checksums
3162b67261ef92e5b3878a51ebbaba3e1253e30f40f4cd7cef8ddbd5328866e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.0 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.7

Release history Release notifications | RSS feed

This release

0.15.9 This release

17 release files

0.14.0

2 release files

0.13.2

2 release files

0.13.1

2 release files

0.13.0

2 release files

0.12.8

2 release files

0.12.7

2 release files

0.12.5

2 release files

0.12.4

2 release files

0.12.3

2 release files

0.12.2

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.5

2 release files

0.11.3

2 release files

0.11.2

2 release files

0.10.0

2 release files

0.9.2

2 release files

0.9.0

2 release files

0.8.5

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.0

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page