GithubHelp home page GithubHelp logo

Comments (25)

juzzlin avatar juzzlin commented on June 18, 2024

Is this the current master? I remember I have already fixed a similar issue by adding #include <QVariant> to database.cpp. I can build against Qt 5.15.2 but that's on Ubuntu.

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

that was with 2.1.0, not master. I see QVariant was added in 8af0bfe but now that i see 2.1.1 was released will recheck with this new version.

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Yes please do as that fix was not included in 2.1.0 :)

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

2.1.1 builds fine on OpenBSD (and yes we build with -DQOpenGLFunctions=OFF, i dont fully remember why exactly though), but segfaults when trying to start a game.. that's probably the same failure i was seeing with 2.0.3, and explains why we still only package 1.13.0.

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000207fb18df0f in MCObject::index() const ()
[Current thread is 1 (process 289236)]
(gdb) bt
#0  0x00000207fb18df0f in MCObject::index() const ()
#1  0x00000207fb1955f3 in MCWorld::removeObjectNow(MCObject&) ()
#2  0x00000207fb18eae9 in MCObject::Impl::removeFromWorldNow() ()
#3  0x00000207fb18fc4f in MCObject::Impl::~Impl() ()
#4  0x00000207fb18e33f in MCObject::~MCObject() ()
#5  0x00000207fb194884 in MCWorld::setDimensions(float, float, float, float, float, float, float, bool, unsigned long) ()
#6  0x00000207fb1320da in Scene::setActiveTrack(std::__1::shared_ptr<Track>) ()
#7  0x00000207fb17a06a in TrackSelectionMenu::selectCurrentItem() ()
#8  0x00000207fb1101ae in EventHandler::handleMenuKeyPressEvent(QKeyEvent*) ()
#9  0x00000207fb12b960 in Renderer::keyPressEvent(QKeyEvent*) ()
#10 0x0000020a01f3c11f in QWindow::event(QEvent*) () from /usr/local/lib/qt5/./libQt5Gui.so.3.0
#11 0x0000020a527b4db6 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Widgets.so.3.0
#12 0x0000020a527b6af1 in QApplication::notify(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Widgets.so.3.0
#13 0x00000207fb0fb9da in Application::notify(QObject*, QEvent*) ()
#14 0x0000020a57a761f5 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#15 0x0000020a57a76fc9 in QCoreApplication::sendSpontaneousEvent(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#16 0x0000020a01f2130a in QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyEvent*) () from /usr/local/lib/qt5/./libQt5Gui.so.3.0
#17 0x0000020a01f1fb81 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () from /usr/local/lib/qt5/./libQt5Gui.so.3.0
#18 0x0000020a01ef1f7a in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Gui.so.3.0
#19 0x0000020a2ee848dd in xcbSourceDispatch(_GSource*, int (*)(void*), void*) () from /usr/local/lib/qt5/libQt5XcbQpa.so.0.0
#20 0x0000020aa357e80f in g_main_context_dispatch () from /usr/local/lib/libglib-2.0.so.4201.5
#21 0x0000020aa357ebd0 in g_main_context_iterate () from /usr/local/lib/libglib-2.0.so.4201.5
#22 0x0000020aa357ecb5 in g_main_context_iteration () from /usr/local/lib/libglib-2.0.so.4201.5
#23 0x0000020a57b5057b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#24 0x0000020a2ee84a70 in QXcbGlibEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/libQt5XcbQpa.so.0.0
#25 0x0000020a57a71183 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#26 0x0000020a57a713d6 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#27 0x0000020a57a76c07 in QCoreApplication::exec() () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#28 0x0000020a01f1f294 in QGuiApplication::exec() () from /usr/local/lib/qt5/./libQt5Gui.so.3.0
#29 0x0000020a527b63e7 in QApplication::exec() () from /usr/local/lib/qt5/./libQt5Widgets.so.3.0
#30 0x00000207fb119f7f in main ()

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Seems to crash when destroying and removing a game object (I suspect it's the area wall).

What do you do when it crashes? You just start the game, select a track and it crashes?

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

yes, it crashes just after selecting a track

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Could you run ctest after build?

Should look like this:

`
$ ctest
Start 1: MCForceRegistryTest
1/5 Test #1: MCForceRegistryTest .............. Passed 0.03 sec
Start 2: MCObjectTest
2/5 Test #2: MCObjectTest ..................... Passed 0.10 sec
Start 3: MCMeshLoaderTest
3/5 Test #3: MCMeshLoaderTest ................. Passed 0.00 sec
Start 4: MCWorldTest
4/5 Test #4: MCWorldTest ...................... Passed 0.05 sec
Start 5: gearboxtest
5/5 Test #5: gearboxtest ...................... Passed 0.00 sec

100% tests passed, 0 tests failed out of 5

Total Test time (real) = 0.19 sec
`

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

looks.. pretty bad here:

Test project /usr/obj/ports/dustrac-2.1.1/build-amd64
    Start 1: MCForceRegistryTest
1/5 Test #1: MCForceRegistryTest ..............Subprocess aborted***Exception:   1.06 sec
    Start 2: MCObjectTest
2/5 Test #2: MCObjectTest .....................Subprocess aborted***Exception:   0.23 sec
    Start 3: MCMeshLoaderTest
3/5 Test #3: MCMeshLoaderTest .................   Passed    0.19 sec
    Start 4: MCWorldTest
4/5 Test #4: MCWorldTest ......................Subprocess aborted***Exception:   0.22 sec
    Start 5: gearboxtest
5/5 Test #5: gearboxtest ......................   Passed    0.03 sec

40% tests passed, 3 tests failed out of 5

Total Test time (real) =   1.83 sec

The following tests FAILED:
          1 - MCForceRegistryTest (Subprocess aborted)
          2 - MCObjectTest (Subprocess aborted)
          4 - MCWorldTest (Subprocess aborted)

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Try ctest --extra-verbose to get some explanation.

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

only the failing ones:

1: Test command: /usr/obj/ports/dustrac-2.1.1/DustRacing2D-2.1.1/unittests/MCForceRegistryTest                                                                                                                                                 
1: Test timeout computed to be: 10000000                                                                                                                                                                                                       
1: ********* Start testing of MCForceRegistryTest *********                                                                                                                                                                                    
1: Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by Clang 10.0.1 ), unknown unknown                                                                                                
1: PASS   : MCForceRegistryTest::initTestCase()                                                                                                                                                                                                
1: PASS   : MCForceRegistryTest::testAddUpdateRemove()                                                                                                                                                                                         
1: QFATAL : MCForceRegistryTest::testAddUpdateRemoveMulti() Received signal 11                                                                                                                                                                 
1:          Function time: 27ms Total time: 66ms                                                                                                                                                                                               
1: FAIL!  : MCForceRegistryTest::testAddUpdateRemoveMulti() Received a fatal error.                                                                                                                                                            
1:    Loc: [Unknown file(0)]                                                                                                                                                                                                                   
1: Totals: 2 passed, 1 failed, 0 skipped, 0 blacklisted, 67ms                                                                                                                                                                                  
1: ********* Finished testing of MCForceRegistryTest *********                                                                                                                                                                                 
1/5 Test #1: MCForceRegistryTest ..............Subprocess aborted***Exception:   0.14 sec       

2: Test command: /usr/obj/ports/dustrac-2.1.1/DustRacing2D-2.1.1/unittests/MCObjectTest                                                                                                                                                        
2: Test timeout computed to be: 10000000                                                                                                                                                                                                       
2: ********* Start testing of MCObjectTest *********                                                                                                                                                                                           
2: Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by Clang 10.0.1 ), unknown unknown                                                                                                
2: PASS   : MCObjectTest::initTestCase()                                                                                                                                                                                                       
2: QFATAL : MCObjectTest::testAddChildren() Received signal 11                                                                                                                                                                                 
2:          Function time: 29ms Total time: 33ms                                                                                                                                                                                               
2: FAIL!  : MCObjectTest::testAddChildren() Received a fatal error.
2:    Loc: [Unknown file(0)]
2: Totals: 1 passed, 1 failed, 0 skipped, 0 blacklisted, 34ms
2: ********* Finished testing of MCObjectTest *********
2/5 Test #2: MCObjectTest .....................Subprocess aborted***Exception:   0.15 sec

4: Test command: /usr/obj/ports/dustrac-2.1.1/DustRacing2D-2.1.1/unittests/MCWorldTest
4: Test timeout computed to be: 10000000
4: ********* Start testing of MCWorldTest *********
4: Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by Clang 10.0.1 ), unknown unknown
4: PASS   : MCWorldTest::initTestCase()
4: QFATAL : MCWorldTest::testAddToWorld() Received signal 11
4:          Function time: 29ms Total time: 33ms
4: FAIL!  : MCWorldTest::testAddToWorld() Received a fatal error.
4:    Loc: [Unknown file(0)]
4: Totals: 1 passed, 1 failed, 0 skipped, 0 blacklisted, 34ms
4: ********* Finished testing of MCWorldTest *********
4/5 Test #4: MCWorldTest ......................Subprocess aborted***Exception:   0.17 sec

and within gdb:

Reading symbols from ../DustRacing2D-2.1.1/unittests/MCObjectTest...(no debugging symbols found)...done.
(gdb) r
Starting program: /usr/obj/ports/dustrac-2.1.1/DustRacing2D-2.1.1/unittests/MCObjectTest 
********* Start testing of MCObjectTest *********
Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by Clang 10.0.1 ), unknown unknown
PASS   : MCObjectTest::initTestCase()
[New thread 208654]

Thread 1 received signal SIGSEGV, Segmentation fault.
0x0000071c610e6e4f in MCObject::index() const ()
(gdb) bt
#0  0x0000071c610e6e4f in MCObject::index() const ()
#1  0x0000071c610ecaa3 in MCWorld::removeObjectNow(MCObject&) ()
#2  0x0000071c610e7a29 in MCObject::Impl::removeFromWorldNow() ()
#3  0x0000071c610e8f9f in MCObject::Impl::~Impl() ()
#4  0x0000071c610e7227 in MCObject::~MCObject() ()
#5  0x0000071c610e0000 in MCObjectTest::testAddChildren() ()
#6  0x0000071eb280b0a7 in QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#7  0x0000071ef8e6b444 in QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const () from /usr/local/lib/qt5/./libQt5Test.so.3.0
#8  0x0000071ef8e61c31 in QTest::TestMethods::invokeTestOnData(int) const () from /usr/local/lib/qt5/./libQt5Test.so.3.0
#9  0x0000071ef8e62c82 in QTest::TestMethods::invokeTest(int, char const*, QTest::WatchDog*) const () from /usr/local/lib/qt5/./libQt5Test.so.3.0
#10 0x0000071ef8e64800 in QTest::TestMethods::invokeTests(QObject*) const () from /usr/local/lib/qt5/./libQt5Test.so.3.0
#11 0x0000071ef8e6516b in QTest::qRun() () from /usr/local/lib/qt5/./libQt5Test.so.3.0
#12 0x0000071ef8e64be5 in QTest::qExec(QObject*, int, char**) () from /usr/local/lib/qt5/./libQt5Test.so.3.0
#13 0x0000071c610e5370 in main ()

note that OpenBSD has a somewhat aggressive memory management, so if you reuse some freed memory you fail hard/etc..

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

For some reason the destruction sequence of MCObject makes it go crazy. I just don't understand why. The funny thing is that deletion only happens once so there shouldn't be any reuse of freed memory.

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

I tried to run the tests under valgrind and it reported:

==3389208== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

Fwiw here's the build options we're using: https://github.com/openbsd/ports/blob/master/games/dustrac/Makefile#L31

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Could you try the current dev branch (ae380b8) ?

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

looks definitely helpful, with that commit backported on top of 2.1.1, the test succeeds:

Reading symbols from unittests/MCWorldTest...(no debugging symbols found)...done.
(gdb) r
Starting program: /usr/obj/ports/dustrac-2.1.1/DustRacing2D-2.1.1/unittests/MCWorldTest 
********* Start testing of MCWorldTest *********
Config: Using QtTest library 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by Clang 10.0.1 ), unknown unknown
PASS   : MCWorldTest::initTestCase()
PASS   : MCWorldTest::testAddToWorld()
PASS   : MCWorldTest::testCollisionEvent_RectRect()
PASS   : MCWorldTest::testCollisionEvent_RectCircle()
PASS   : MCWorldTest::testCollisionEvent_CircleCircle()
PASS   : MCWorldTest::testInstance()
PASS   : MCWorldTest::testSetDimensions()
PASS   : MCWorldTest::testSleepingObjectRemovalFromIntegration()
PASS   : MCWorldTest::cleanupTestCase()
Totals: 9 passed, 0 failed, 0 skipped, 0 blacklisted, 272ms
********* Finished testing of MCWorldTest *********
[Inferior 1 (process 79085) exited normally]

i can start a game, the map & cars are displayed, there's the countdown, but when the countdown reaches zero there's another (different) segfault - i think that matches the failure i was seeing with 2.0.3:

#0  0x0000058b101d958b in MCObject::isPhysicsObject() const ()
[Current thread is 1 (process 525286)]
(gdb) bt
#0  0x0000058b101d958b in MCObject::isPhysicsObject() const ()
#1  0x0000058b101e12a5 in MCWorld::integrate(int) ()
#2  0x0000058b101e1edc in MCWorld::stepTime(int) ()
#3  0x0000058b1017d399 in Scene::updateFrame(InputHandler&, int) ()
#4  0x0000058b10163110 in QtPrivate::QFunctorSlotObject<Game::Game(int&, char**)::$_3, 0, QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) ()
#5  0x0000058d11b43e51 in QtPrivate::QSlotObjectBase::call(QObject*, void**) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#6  0x0000058d11ba5741 in void doActivate<false>(QObject*, int, void**) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#7  0x0000058d11b9d0e1 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#8  0x0000058d11bb644f in QTimer::timeout(QTimer::QPrivateSignal) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#9  0x0000058d11bb63e3 in QTimer::timerEvent(QTimerEvent*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#10 0x0000058d11b9529e in QObject::event(QEvent*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#11 0x0000058dafabddb6 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Widgets.so.3.0
#12 0x0000058dafabfaf1 in QApplication::notify(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Widgets.so.3.0
#13 0x0000058b1014793a in Application::notify(QObject*, QEvent*) ()
#14 0x0000058d11b2c1f5 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#15 0x0000058d11b2cf55 in QCoreApplication::sendEvent(QObject*, QEvent*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#16 0x0000058d11c04125 in QTimerInfoList::activateTimers() () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#17 0x0000058d11c074fe in timerSourceDispatch(_GSource*, int (*)(void*), void*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#18 0x0000058d11c07896 in idleTimerSourceDispatch(_GSource*, int (*)(void*), void*) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#19 0x0000058d39db480f in g_main_context_dispatch () from /usr/local/lib/libglib-2.0.so.4201.5
#20 0x0000058d39db4bd0 in g_main_context_iterate () from /usr/local/lib/libglib-2.0.so.4201.5
#21 0x0000058d39db4cb5 in g_main_context_iteration () from /usr/local/lib/libglib-2.0.so.4201.5
#22 0x0000058d11c0657b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#23 0x0000058dd9438a70 in QXcbGlibEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/libQt5XcbQpa.so.0.0
#24 0x0000058d11b27183 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#25 0x0000058d11b273d6 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#26 0x0000058d11b2cc07 in QCoreApplication::exec() () from /usr/local/lib/qt5/./libQt5Core.so.3.0
#27 0x0000058dc0e19294 in QGuiApplication::exec() () from /usr/local/lib/qt5/./libQt5Gui.so.3.0
#28 0x0000058dafabf3e7 in QApplication::exec() () from /usr/local/lib/qt5/./libQt5Widgets.so.3.0
#29 0x0000058b10165edf in main ()

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Cool! :)

That another problem seems to be even trickier as there's no deletion involved, but still some a corrupted object, I guess. Would be useful to add some debug prints to MCWorld::integrate() perhaps and print the name of the objects it tries to operate on.

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

sure, can try that if you tell me what to add where :) i have zero knowledge in dustrac code / classes :)

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

I added some debug prints to bsd branch (61985b9). Let's see what this reveals.

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

dustrac.log.gz

it integrated ... many things, before blowing (19Mb log)

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

But it eventually crashed? Hmm...I thought that it would crash immediately...damn...

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Would it be possible for you to git bisect the first commit that causes this?

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

that will be .. painful to say the least. Is it supposed to loop so many times on this method ? i saw 'start integration' 270 times in the log before the crash. i thought it was related to the end of the countdown as soon as vehicles start moving...

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

What I meant was to just use git bisect to find out the first breaking commit somewhere near the version 2.0.3. - without any debug prints. Just find out the first commit that crashes when the game is started. Git bisect works so that first you identify some known working commit in the past and then some known failing commit. After each step you'd build and run and mark the current commit good or bad. This process is logarithmic so even if there are hundreds of commits it won't take that many steps to complete. Very cool! :)

from dustracing2d.

juzzlin avatar juzzlin commented on June 18, 2024

Btw, is it possible to run OpenBSD in VirtualBox on Ubuntu so that I could test this?

from dustracing2d.

landryb avatar landryb commented on June 18, 2024

i know git bisect, it will just take me some time to setup an env where i'd build from git that's all. Lots of things (for cmake) are setupped by the ports infrastructure..

and yeah, ofc you can run OpenBSD in Virtualbox (or KVM) with X, you'll probably just need to install cmake/openal via the packages.

then,

git clone
mkdir build
cd build
CMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake cmake .. -DReleaseBuild=ON -DQOpenGLFunctions=OFF
make

from dustracing2d.

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.