Giter VIP home page Giter VIP logo

Comments (30)

nebiljabari avatar nebiljabari commented on July 24, 2024 4

"Victoire Sean" ! ;-)
I put aside the firebase errors Ive received (unless it help you)

pi@raspberrypi:~/matrix-os $ START_APP=clock node index.js

... some lines skipped ...
Installed Apps: clock
Local Apps: [ 'clock.matrix' ]
Local / Installed Δ 0
MXSS Connected: http://rc-mxss.admobilize.com
=<[^\/^]>= [dcee3305c1be] ready
 _  _ ____ ___ ____ _ _  _ 
 |\/| |__|  |  |__/ |  \/   [o__o]
 |  | |  |  |  |  \ | _/\_  v0.5.4
==== Application clock started! ==== 

img_1900

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024 1

OK! Awesome! It's pointing to our production server. That isn't right. :) It should be pointing to our RC server.

Please run with NODE_ENV=rc flag

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024 1

Also, please git pull on the matrix repo, we've updated master. It should point to RC automatically.

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024 1

Great! I love to see that!

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024 1

clock5 isn't showing up under local apps, did you deploy it?

maybe change the name of the folder to clock5.matrix on your device in the apps folder

from matrix-os.

brianofrokk3r avatar brianofrokk3r commented on July 24, 2024

Hey @nebiljabari, there's got to be something missing, maybe sudo is the culprit. I just ran the following steps:

Local Machine:

  • npm install matrix-cli -g
  • matrix set env rc
  • matrix register
  • matrix login
  • matrix list devices
  • matrix use xyz

Raspberry Pi:

  • git clone https://github.com/matrix-io/matrix-os.git
  • git submodule update --init
  • npm install // need node and initial packages installed
  • malos // separate window
  • cd matrix-os // set env vars of course
  • NODE_ENV=rc node index.js

I was able to connect, deploy apps, and so forth. By the way what system are you running this on for the CLI, and what version of NodeJS (node -v) are you using? @eighteyes @diegoribero any thoughts here on that device error?

from matrix-os.

diegoribero avatar diegoribero commented on July 24, 2024

Hey @nebiljabari, in addition to what @brianofrokk3r says, please post the whole output or a few more lines right before that part (make sure to remove any info you don't want to share publicly), we've been unable to reproduce it so far

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Hey @brianofrokk3r , @diegoribero

  • Node = v6.7.0
  • Linux raspberrypi 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST 2016 armv7l GNU/Linux
  • Matrix CLI = 1.1.20
  • matrix-os = 0.5.0 (cloned from master branch)

If I don't sudo :

Configuration save error:  { Error: EACCES: permission denied, open '/usr/lib/node_modules/matrix-cli/lib/../store.json'
    at Error (native)
  errno: -13,
  code: 'EACCES',
  syscall: 'open',
  path: '/usr/lib/node_modules/matrix-cli/lib/../store.json' }

Here is the full output on ~/matrix-os with node index.js or NODE_ENV=rc node index.js (same thing)

Loading Core Matrix Files
Loading...  device
Loading...  event
Loading...  service
DEVICE { info: 
   [ { driver_name: 'IMU',
       base_port: 20013,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides yaw/pitch/roll. Check Imu message (protocol buffer)' },
     { driver_name: 'Humidity',
       base_port: 20017,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides humidity and temperature. Check Humidity message (protocol buffer)' },
     { driver_name: 'Everloop',
       base_port: 20021,
       provides_updates: false,
       delay_between_updates: 1000,
       needs_pings: false,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Write-only. There are 35 leds. Values range from 0 to 255. Check message EverloopImage (protocol buffer)' },
     { driver_name: 'Pressure',
       base_port: 20025,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides barometer/altimeter and temperature. Check Pressure message (protocol buffer)' },
     { driver_name: 'UV',
       base_port: 20029,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides UV index. Check UV index message (protocol buffer). Also provides a string with the UV risk according to the OMS. See: https://www.epa.gov/sunsafety/uv-index-scale-0' } ] }
Device Error undefined

If it can help, the output when I kill:

^CMatrix -- CRTL+C kill detected
Matrix -- Uncaught exception:  TypeError: Cannot read property 'child' of undefined
    at Object.goOffline (/home/pi/matrix-os/node_modules/matrix-firebase/lib/device.js:46:16)
    at process.<anonymous> (/home/pi/matrix-os/index.js:329:34)
    at emitNone (events.js:86:13)
    at process.emit (events.js:185:7)
    at Signal.wrap.onsignal (internal/process.js:199:44) TypeError: Cannot read property 'child' of undefined
    at Object.goOffline (/home/pi/matrix-os/node_modules/matrix-firebase/lib/device.js:46:16)
    at process.<anonymous> (/home/pi/matrix-os/index.js:329:34)
    at emitNone (events.js:86:13)
    at process.emit (events.js:185:7)
    at Signal.wrap.onsignal (internal/process.js:199:44)
UNKNOWN ERROR! TypeError: Cannot read property 'child' of undefined
    at Object.goOffline (/home/pi/matrix-os/node_modules/matrix-firebase/lib/device.js:46:16)
    at process.<anonymous> (/home/pi/matrix-os/index.js:329:34)
    at emitNone (events.js:86:13)
    at process.emit (events.js:185:7)
    at Signal.wrap.onsignal (internal/process.js:199:44)
Unable to clean, exitting...

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Ok maybe a good clue, In MATRIX CLI Header :

API: https://rc-api.admobilize.com Streaming: https://rc-mxss.admobilize.com 
User: <my-mail> Device: <my-new-device-id> Locale: en

sudo matrix list devices

Device ID | Name | Description | ok | Last Online
my-old-device-id | my-old-name | my-old-desc | ok | 21 hours ago
my-new-device-id | my-new-name | my-new-desc | no | 47 years ago

No matter what I do with the CLI command and the order I do it. It refuse to ok = ok on my new registration (yes I have received the crypted key) (all the words of the device line are green and "no" is yellow)

sudo matrix reboot
{"channel":"register-ok","payload":{"ok":true}}
Register ok
Device rebooting...

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

@nebiljabari can you run the matrix os with DEBUG=sdk flag? that output will have your secrets in it, so please edit it appropriately before posting. we're looking for the last endpoint. i believe it should be /v2/device/token. there might be an issue we can resolve on our side. there should be something that looks like [post]>. i am very curious what that shows.

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Here it is @eighteyes

pi@raspberrypi:~/matrix-os $ DEBUG=sdk node index.js
Loading Core Matrix Files
Loading...  device
Loading...  event
Loading...  service
  sdk 🔓  [ MATRIX ] Auth SDK v0.1.6 +0ms
DEVICE { info: 
   [ { driver_name: 'IMU',
       base_port: 20013,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides yaw/pitch/roll. Check Imu message (protocol buffer)' },
     { driver_name: 'Humidity',
       base_port: 20017,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides humidity and temperature. Check Humidity message (protocol buffer)' },
     { driver_name: 'Everloop',
       base_port: 20021,
       provides_updates: false,
       delay_between_updates: 1000,
       needs_pings: false,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Write-only. There are 35 leds. Values range from 0 to 255. Check message EverloopImage (protocol buffer)' },
     { driver_name: 'Pressure',
       base_port: 20025,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides barometer/altimeter and temperature. Check Pressure message (protocol buffer)' },
     { driver_name: 'UV',
       base_port: 20029,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides UV index. Check UV index message (protocol buffer). Also provides a string with the UV risk according to the OMS. See: https://www.epa.gov/sunsafety/uv-index-scale-0' } ] }
  sdk secret-> +754ms my-new-crypted-key
  sdk [post] +8ms { url: 'http://api.admobilize.com/v2/device/token',
  form: 
   { device_id: 'my-new-device-id',
     device_secret: 'my-new-crypted-key',
     jwt_token: true },
  json: true }
  sdk [post] +407ms undefined
Device Error undefined
  sdk <3-> +8s { detections: [], sensors: [] }

I checked the my-new-device-id and my-new-crypted-key upper, they match. Meaning the crypted key is the one I received after the new ID when I re-registered my Matrix

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

"Bravo" @eighteyes !
I git pull the repo and NODE_ENV=rc node index.js or just node index.js init my Matrix

Installed Apps: 
Local Apps: [ 'clock.matrix' ]
Local / Installed Δ 1
MXSS Connected: http://rc-mxss.admobilize.com
=<[^\/^]>= [my-device-id] ready
 _  _ ____ ___ ____ _ _  _ 
 |\/| |__|  |  |__/ |  \/   [o__o]
 |  | |  |  |  |  \ | _/\_  v0.5.2

next fight... the clock example ! ;-)

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

PS: Copy the clock to your desktop, remove the .matrix name from the folder, and deploy it to your device. That will register it.

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

@eighteyes just to be clear, when you say desktop you mean ~/Desktop/clock right ?
Here is my output after several tries :

pi@raspberrypi:~/Desktop $ sudo matrix deploy clock
? Deploy version 1.0.0? Yes
Reading  /home/pi/Desktop/clock/
Writing  /usr/lib/node_modules/matrix-cli/bin/../clock.zip
 App registration formed...
 App registration in progress...
 App registered in appstore
 Installation progress:
Awaiting installation on Device...
 Unable to reach device, the application will be installed as soon as your device is available

node is running in background :

pi@raspberrypi:~/matrix-os $ nohup node index.js > mos.out 2>&1 &
[1] 1787

what did I missed ? :-/

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

Hmm, that error from the CLI should have been resolved. Can you DEBUG=* on the deploy command and paste the version numbers here

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Is that the info you want @eighteyes ?

sudo DEBUG=* matrix deploy clock

sdk 🔓  [ MATRIX ] Auth SDK v0.1.6 +0ms
app-config 📐  [ MATRIX ] App Config Helper v0.1.4 +1s
cli Env:  +12ms rc
firebase 🔥  [ MATRIX ] Firebase v1.0.17 +633ms

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

Hmm, that seems very reasonable.

Please run Matrix OS with DEBUG=*,-engine*,-Component* Ignore everything until the ready.

Run the matrix commands with DEBUG=* to give us more info about what is going on from the cli side. I'm not exactly sure where the error is happening, I suspect it's having trouble on the matrix os side.

matrix uninstall clock

about 10 lines of messages should write to the MatrixOS console CLI-COMMAND

matrix install clock

again, about 10 lines should write. if there is an error writing to the device, it will show here.

thanks!

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Ok Sean here is the thing. If I read well your package.json any of your scripts target NODE_ENV=rc
"debug": "DEBUG=*,-engine*,-Component* NODE_ENV=dev node index.js"

  • Do you want me to switch in dev mode ?

So, when I try in ~/matrix-os : DEBUG=*,-engine*,-Component* node index.js
-bash: -engine* : command not found

When I DEBUG=* node index.js

Ignore everything until the ready

=<[^\/^]>= [my-device-id] ready
 _  _ ____ ___ ____ _ _  _ 
 |\/| |__|  |  |__/ |  \/   [o__o]
 |  | |  |  |  |  \ | _/\_  v0.5.2
  sdk <3-> +911ms {}
  sdk <3-> +1s {}
  ... // skipped 9 similar print // ...
  engine.io-client:socket writing ping packet - expecting pong within 450000ms +477ms
  engine.io-client:socket flushing 1 packets in socket +2ms
  stream socket flush +4ms WDby5hi17EnIoLLFAFK7
  engine.io-client:socket socket receive: type "pong", data "undefined" +156ms
  sdk <3-> +363ms {}
  sdk <3-> +1s {}
^CMatrix -- CRTL+C kill detected

I think it would be better that I email you the rest of the output you ask
"author": "Sean Canton <[email protected]>"

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

Don't put spaces in the debug value. It needs to be a single string after the =

The scripts are for development purposes, not really intended for end users.

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Fine @eighteyes here is the output after ready

pi@raspberrypi:~/matrix-os $ DEBUG=*-engine*-Component* node index.js

... // bunch of lines skipped // ...

=<[^\/^]>= [my-device-id] ready
 _  _ ____ ___ ____ _ _  _ 
 |\/| |__|  |  |__/ |  \/   [o__o]
 |  | |  |  |  |  \ | _/\_  v0.5.2
  sdk <3-> +911ms {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  sdk <3-> +1s {}
  stream socket flush +862ms 8JzjOkzZLXipPU9dAADr
  sdk <3-> +138ms {}
  sdk <3-> +1s {}
^CMatrix -- CRTL+C kill detected
pi@raspberrypi:~/matrix-os $ 

I email you the full output just in case

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

No that's good. That means the system is solid. Those empty objects are just the heartbeat. If you just start it normally, there should be a line that says Installed Apps:. That is the apps registered to that device. If clock doesn't show up on there, then do matrix deploy clock.

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Ok @eighteyes what do you think of this output. It seems like a progress? :
Config Validation Error configuration has no keywords

~/matrix-os $ git pull // an hour ago
sudo npm update matrix-cli -g // v 1.1.25 rc

Here the full story :

pi@raspberrypi:~/matrix-os $ START_APP=clock node index.js
Environment Selected: rc
Loading Core Matrix Files
Loading...  device
Loading...  event
Loading...  service
DEVICE { info: 
   [ { driver_name: 'IMU',
       base_port: 20013,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides yaw/pitch/roll. Check Imu message (protocol buffer)' },
     { driver_name: 'Humidity',
       base_port: 20017,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides humidity and temperature. Check Humidity message (protocol buffer)' },
     { driver_name: 'Everloop',
       base_port: 20021,
       provides_updates: false,
       delay_between_updates: 1000,
       needs_pings: false,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Write-only. There are 35 leds. Values range from 0 to 255. Check message EverloopImage (protocol buffer)' },
     { driver_name: 'Pressure',
       base_port: 20025,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides barometer/altimeter and temperature. Check Pressure message (protocol buffer)' },
     { driver_name: 'UV',
       base_port: 20029,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides UV index. Check UV index message (protocol buffer). Also provides a string with the UV risk according to the OMS. See: https://www.epa.gov/sunsafety/uv-index-scale-0' } ] }
Installed Apps: clock
Local Apps: [ 'clock.matrix' ]
Local / Installed Δ 0
MXSS Connected: http://rc-mxss.admobilize.com
=<[^\/^]>= [my-device-id] ready
 _  _ ____ ___ ____ _ _  _ 
 |\/| |__|  |  |__/ |  \/   [o__o]
 |  | |  |  |  |  \ | _/\_  v0.5.3
Config Validation Error configuration has no keywords
^CMatrix -- CRTL+C kill detected

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

Awesome, thanks for updating. You shouldn't need sudo matrix anymore.

Ok! I know what the issue is. The config.yaml isn't passing the validator because it doesn't have keywords. You can add keywords: clock, led into the config file, or wait for an update to matrix-app-config-helper (today some time), because that restriction has annoyed me too, and I want to make it just an alert, not a reason to bail.

You'll have to uninstall and deploy clock again to refresh the saved config though.

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Maybe it's coming from me but I don't succeed to pass throw the error :-/

✓ uninstall and deploy clock again

config.yaml

name: clock
version: 1
configVersion: 2
description: Matrix stats
keywords: clock, led

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

Hmm. Uninstalling should remove the configuration. I've fixed the validator, if you update matrix-app-config-helper on the device it should not throw that error anymore.

If nothing else, you could rename the folder, and app.name to clock2 and try again. That will upload the new configuration.

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Im actually working on it! ;-)
I have already ~/matrix-os $ git pull and sudo apt-get update && upgrade but your npm page still indicate 0.1.3

ps: I don't know if it's relevant but from my Mac or my Pi I can't deploy without sudo

update: sorry, just checked-it ~/matrix-os/node_modules/matrix-app-config-helper version: 0.1.4

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

i didn't publish a new version number, i can do that. i thought it would update. ;(

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

Ok Sean after many try I call for help. I used several variation but this error still beat me

Config Read Error
Config Validation Error configuration has no name, configVersion, description

I tried to put the values as string like I saw online. No effect - config.yaml

name: "clock5"
version: 1
configVersion: "2"
description: "Matrix stats"
keywords: "clock5, led"

The full story :

pi@raspberrypi:~/matrix-os $ START_APP=clock5 node index.js
Environment Selected: rc
Loading Core Matrix Files
Loading...  device
Loading...  event
Loading...  service
DEVICE { info: 
   [ { driver_name: 'IMU',
       base_port: 20013,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides yaw/pitch/roll. Check Imu message (protocol buffer)' },
     { driver_name: 'Humidity',
       base_port: 20017,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides humidity and temperature. Check Humidity message (protocol buffer)' },
     { driver_name: 'Everloop',
       base_port: 20021,
       provides_updates: false,
       delay_between_updates: 1000,
       needs_pings: false,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Write-only. There are 35 leds. Values range from 0 to 255. Check message EverloopImage (protocol buffer)' },
     { driver_name: 'Pressure',
       base_port: 20025,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides barometer/altimeter and temperature. Check Pressure message (protocol buffer)' },
     { driver_name: 'UV',
       base_port: 20029,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Provides UV index. Check UV index message (protocol buffer). Also provides a string with the UV risk according to the OMS. See: https://www.epa.gov/sunsafety/uv-index-scale-0' },
     { driver_name: 'ZigbeeBulb',
       base_port: 20033,
       provides_updates: true,
       delay_between_updates: 1000,
       needs_pings: true,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Zigbee bulb driver. In development' },
     { driver_name: 'MicArray_Alsa',
       base_port: 20037,
       provides_updates: false,
       delay_between_updates: 1000,
       needs_pings: false,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Simple ALSA Driver for MATRIX Creator\'s Microphone Array' },
     { driver_name: 'Lirc',
       base_port: 20041,
       provides_updates: false,
       delay_between_updates: 1000,
       needs_pings: false,
       timeout_after_last_ping: 5000,
       notes_for_human: 'Write-read. Get list remotes and send commands via IR. In development' } ] }
Installed Apps: clock5
Local Apps: [ 'clock.matrix' ]
Local / Installed Δ 0
MXSS Connected: http://rc-mxss.admobilize.com
=<[^\/^]>= [dcee3305c1be] ready
 _  _ ____ ___ ____ _ _  _ 
 |\/| |__|  |  |__/ |  \/   [o__o]
 |  | |  |  |  |  \ | _/\_  v0.5.4
Config Read Error
Config Validation Error configuration has no name, configVersion, description
^CMatrix -- CRTL+C kill detected

matrix-cli : 1.1.25
matrix-os : 0.5.4
matrix-app-config-helper : 0.1.5

from matrix-os.

eighteyes avatar eighteyes commented on July 24, 2024

Wooot! Awesome! Thanks for your email to our team. Your comments are very important to us!

from matrix-os.

nebiljabari avatar nebiljabari commented on July 24, 2024

"Merci Sean". Im pleased you appreciate it ! :-)

from matrix-os.

Related Issues (20)

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.