Giter Club home page Giter Club logo

corelyzer's People

Contributors

astrotuna201 avatar daoane avatar joshareed avatar sorghumking avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

corelyzer's Issues

Windows scenegraph DLL must be built in ancient, non-free Visual Studio 2008

The problem:
We need to get scenegraph building in a modern, free version of VS like Visual Studio Community 2019 or, better yet, in a non-Visual Studio toolset like MinGW again.

Background:
When I inherited Corelyzer in 2010, the scenegraph DLL was built with MinGW. Somewhere along the line, this broke. I've forgotten the details in the ensuing decade, but I believe at some point the resulting DLL caused Corelyzer to crash at launch. I couldn't figure out why, and ultimately gave up and started building the DLL in Visual Studio 2008. Because we rarely need to modify scenegraph, this sufficed and I never revisited the MinGW issue.

In 2019, I managed to create a 64-bit build of the scenegraph DLL. Most of the effort was building supporting libraries (libtiff, libjpeg, etc.). This was all still done in VS2008. The project can be imported into modern versions of VS e.g. Community 2019, and the DLL builds without issue. However, it always crashes Corelyzer at launch. I believe this is somehow related to the supporting libraries' DLLs, which were built in VS2008.

Update corelyzer/README.md for Linux

The information in README.md files of master and linux_build branches are slightly different.

The optimum solution would be to also have Linux in the masters branch, that it doesn't lag behind and requires extra attention.

If this is not practical, I suggest to remove Linux-related information from the README.md in masters and have it only in linux_build, and there keep it updated.

  • mention in README.md of masters that Linux users have to check out the linux_build branch (this isn't mentioned anywhere at the moment!) and that they can find all required build information there.
  • in README.md of linux_build remove "and copy SceneGraph" from "This will build Java components, create corelyzer/working_dir, and copy SceneGraph and other resources to working_dir.", because it doesn't (it's specified when calling the programme).
  • remove Win and Mac information from README.md in linux_build

Trim by default extends to not selected sections, which is not safe

The trim dialogue is preset on "selected and deeper sections". This is not safe, because the user expects to work with the selection. Thus, "selected section only" should be the default and "selected and deeper sections" an option that is actively chosen by the user. This would prevent the accidental trim of a large number of sections, possibly without the user noticing it. As Corelyzer does not implement an undo-function, such a mistake, if discovered, cannot be reverted. To trim in the opposite direction is not a solution because it will not reverse the action when a maximum/minimum value is encountered by any of the sections. Undo functionality is not available - thus, the default option in the trim dialogue has to be safe: "selected section only".

Core Archive (CAR) Export only includes image and datafiles for the selected session

  1. Create a session with at least one section image and datafile. Save session file. Close the session.
  2. Create another such session with different image(s) and datafile(s). Save session file.
  3. Open the session file created in step 1; you should see two sessions in the main window's session list.
  4. Note which session is currently selected.
  5. Choose File > Core Archive > Export..., name and save the .car file
  6. Close both sessions.
  7. Choose File > Core Archive > Import... and select the .car file created in Step 4.

Errors about missing image and datafiles will appear. Click "Ignore" through all of these. When import completes, images and datafiles for the session that was selected at export-time (Step 5) will be loaded. Images and datafiles for the non-selected session will be missing.

Navigating the hierarchy while loading a project results if failed loading procedure

Corelyzer 2.1 Linux

  • I open a project with two sessions, "Televiewer" and "Core".

  • The "Televiewer" session is quickly loaded and I navigate to the depth where I left off before. For this, I click on "Televiewer" in the "Session" panel while the "Core" session is still loading and proceed via "Slices" in the "Track" panel to my target section.

  • The next track of the "Core" session after I navigated to "Televiewer" appears then as track in the "Televiewer" session and not under "Core", where it belongs to. This track is empty and no more data are loaded at all, i.e. the loading procedure failed.

How it should look like for "Televiewer" and "Core", respectively:
Screenshot from 2020-11-05 14-04-03
Screenshot from 2020-11-05 14-04-16
How it looks like after user navigation to "Televiewer" while "Core" is loading:
Screenshot from 2020-11-05 13-39-36

Two possible solutions:

A) Make loading independent from the UI.

B) Block the UI while a project is loading, i.e. allow no user interaction until the last section is loaded.

On track delete, section list doesn't update correctly and track list doesn't respond to right-clicks

Steps:

  1. Open/create a session with at least three tracks.
  2. Select the topmost track in the Track list.
  3. Select the topmost section in the Sections list.
  4. Right-click the selected track, choose Delete, and confirm the deletion.
  5. The track beneath the deleted track moves to the top of the list, and is selected.
  6. However: notice that the Sections list is empty...it should contain the sections of the currently selected track!
  7. Furthermore: right-click the selected track and choose Delete. Notice that nothing happens!

Selected core is not highlighted

Steps:

  1. Create two tracks, each with two core images.
  2. Select the first core in the upper track.
  3. Select the first core in the lower track.
  4. Notice that the selected core in the main window's track and section lists have updated to indicate the change in selection, but no highlight is drawn around this core in the canvas.

Unfortunately, we trigger canvas redraws on changes to the main window's section list. If the newly-selected section happens to have the same list index as the previous selection, no list change is detected and thus no redraw occurs.

In the above steps, select the second core of the upper track, then the first of the lower, then second lower, then first upper. Selection draws properly in all cases. Problems only occur when selecting the core of the same index in the other track.

Core Archive (CAR) export can include wrong information in session.cml

The origin of the problem: I have a cml file that includes multiple sessions. Now I want to export each session to a separate core archive. The apparently easiest way to achieve this to

  • load the original cml file
  • remove all but the first session
  • export this session to core archive
  • reload the original cml file
  • remove all but the second session
  • export this session to core archive
  • and so on

The created core archives contain

  • the image files from the remaining session (as expected)
  • the original cml file renamed to session.cml (including also the deleted session)

Corelyzer apparently assumes that the user has saved the session just before the export to core archive. In the workflow above, but also in other situations, this could lead to unwanted results. I suggest to change the export to core archive by either A) explicitly asking the user to save the session before export in a separate dialogue or B) always saving the session to a temporary cml file that then is included in the archive. Preferably B), as it is more flexible (could be extended with a dialogue that lets the user choose the sessions to be included in the core archive).

Linux build for 2.1.2 fails

I can successfully build the linux_build branch, but not the master branch after the linux_build was merged with it. So it's not an issue with my java. The build procedure terminates with the following error:

2021-06-08T16:18:30.760+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-06-08T16:18:30.760+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
2021-06-08T16:18:30.760+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-06-08T16:18:30.760+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Where:
2021-06-08T16:18:30.760+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Build file '/ ... /corelyzer/build.gradle' line: 33
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Execution failed for task ':package-check'.
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] > Error: javaRuntimeFile var is null.
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   To resolve, update javaRuntimeFile var with your Java 11 runtime in build.gradle.
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Try:
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Run with --stacktrace option to get the stack trace.  Run with --scan to get full insights.
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
2021-06-08T16:18:30.761+0200 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Get more help at https://help.gradle.org
2021-06-08T16:18:30.762+0200 [WARN] [org.gradle.internal.featurelifecycle.LoggingDeprecatedFeatureHandler] 

The key seems to be "To resolve, update javaRuntimeFile var with your Java 11 runtime in build.gradle.", which would be line 15 in build.gradle:
def javaRuntimeFile = null // replace with your Java 11 runtime

If I replace with the Java 11 runtime, i.e. not with the symbolic link in /usr/bin, then this should work:
def javaRuntimeFile = /usr/lib/jvm/java-11-openjdk-amd64/bin/java

But it does not. I tried various other things, no success.

What path is required to make this work, and why can't it be preset for java 11, like in the build.gradle for scenegraph? This should be documented in the READEME.md.

If the selected session changes while opening a session/CML file, loading halts

Steps:

  1. Clear image cache with the Edit > Clear Image Cache... menu item. (In most cases, loading cached images happens too quickly to do step 4 while loading is still in progress.)
  2. Open an existing session and let it complete loading.
  3. Open a second session that contains at least two tracks.
  4. While the first track's data is loading, select the first session.
  5. The next track to be loaded will incorrectly be added to the first session.
  6. At that point, loading stops. No sections are added to the track.

In most cases, it is correct for Corelyzer to add a new track to the currently-selected session. However, that is not the case when loading data from a file!

No error displayed when trying to import an Excel file

The File > Import Data > Convert Tabular Data to XML... dialog does not support Excel (.xls, .xlsx) files. However, no error appears when a user selects an Excel file to import. The dialog still appears, in an empty state (no current file, no data in spreadsheet).

When a user attempts to import an Excel file, display a meaningful error, and don't show the dialog.

Crash when Image Listing destination track doesn't match selected track in main window

Steps:

  1. Create a session, add two tracks.
  2. Select the second track.
  3. File > Load Images > Open Image Listing...
  4. Click Select Images... button and choose an image file.
  5. In the "Load images into track:" list, select the first track.
  6. Click OK.
  7. After the progress bar indicates the first core is being loaded, Corelyzer freezes.

This freeze occurs whenever the selected track in the Image Listing dialog and main window don't match when the user clicks OK to load the current image listing.

Annotation markers outside of parent core's horizontal range cannot be selected

Steps:

  1. Import a core image into a session (or open an existing session that contains core images).
  2. Use Create Annotation mode to add an annotation to a core image.
  3. Use Modify annotation marker mode to move the annotation marker (the "sticky note") to the left or right of the parent core image.
  4. Return to normal mode.
  5. Click on the annotation marker. It should display the annotation, but there is no response. In Modify annotation marker mode, click the marker. It should be selected for movement, but does not respond.

At this point, there is no way to interact with the marker.

Annotation won't display when marker is clicked if top of parent core image is hidden

Clicking the "post-it note" marker for an annotation should display the annotation. However, if the core's top/"Begin" Visible Interval is modified, the click won't be detected.

Steps:

  1. In a new session, import a single image.
  2. Change to Create Annotation Mode, then click on the image and create any type of annotation.
  3. Click the "post-it" marker to show annotation details. Close the annotation details window.
  4. Right-click the core, choose "Properties...".
  5. Modify the "Visible Interval" "Begin" field to 5cm and click OK. The first 5cm of the core should now be hidden.
  6. Click the "post-it" marker again. Annotation details are no longer displayed.
  7. Now click 5cm to the right of the marker. Annotation details should appear.

When detecting clicks on annotation markers, it appears Corelyzer isn't accounting for the offset resulting from hiding the top of a core image.

images with same session/segment/filename but different path don't reflect changes unless you clear image cache

Dear @sorghumking

Thank you for maintaining this excellent software!
Version 2.1.2 built from source for Ubuntu 20.01
The building process was not too difficult.

However I have found a problem which confused me for a while.

I made a session and imported my images.
Then I used imagemagick to attach a ruler to rescale all my core images, since they were not photographed with one though the lengths were recorded(it makes things easier to pinpoint when using corelyzer).
I resaved these new images in a new folder. Then I treid both adding them to my new session and creating a new session with them.

The images have the same filenames as images already used for another corelyzer session, but in a different folder so with different paths. Basically Corelyzer will not reflect any changes in the images, unless you change the filenames or until you delete the image cache within corelyzer and reload the images!

i tried loading from subdirectory where the first images were, and also a subdirectory in /tmp, i tried resaving them with gimp, exporting them, etc. The only thing that made a difference was saving under a new filename not already used by corelyzer in a previous session, or by erasing the image cache from within corelyzer.

It seems like corelyzer image cache doesn't consider paths, only filenames or session/sectuib names.

STEPS TO REPRODUCE:

  1. Take an image of a core, call it TEST1-1.jpg for example. Now open corelyzer without any sessions loaded
  2. load TEST1-1.jpg in corelyzer via Ctl + M command
  3. go through the dialogs view it in corelyzer
  4. Now close the session
  5. in gimp/photoshop, make some scribbles over the TEST1-1.jpg core image and resave it.
  6. Repeat steps 2-3
  7. Observe that the image does not reflect the changes you made
  8. Clear image cache from the corelyzer edit menu
  9. repeat steps 2-3
  10. Observe that the image does reflect the changes.

Mac: Directory file chooser for missing images/datafiles does not appear

Steps:

  1. Create a new session. Import an image and a datafile (they don't need to be related).
  2. Save the session with File > Save Session.
  3. Close the session by right-clicking and choosing "Close".
  4. Change the location of the image file imported in step 1.
  5. Re-open the session. The image will not be found. Click "Select..." to choose its new location. No chooser dialog appears, and app becomes unresponsive. Force quit.
  6. Return the image file to its original location, repeat steps 4-5 with the data file. Same result.

Tie start point is incorrect if user mouses away from context menu

Steps:

  1. Right-click on a core section image so the context menu appears
  2. Move the mouse cursor off of the menu.
  3. Now select the "Create Visual Tie" menu item.
  4. The tie does start not from the original right-click position. It starts from the cursor's last position over the canvas.

Java 11 build error in iCores FeedTreeNode.java

The TreeNode method public Enumeration children() was generified to public Enumeration<TreeNode> children() in Java 10, causes a compile-time error since Corelyzer's migration to Java 11:

./corelyzer/plugin/iCores/ui/tree/FeedTreeNode.java:146: error: children() in FeedTreeNode cannot override children() in DefaultMutableTreeNode public Enumeration<FeedTreeNode> children() { ^ return type Enumeration<FeedTreeNode> is not compatible with Enumeration<TreeNode>

This StackOverflow answer explains the error.

Add "Save project" button to tools menu

It would be very helpful to have way to quickly save the project from the workspace, without the need to first to "Show" the main window, then save and "Hide" the main window again. This could be achieved by adding a "Save botton" to the tools menu (to the left of the "Minimize Corelyzer" button.

Sections trim incorrectly

Section images that are vertically oriented at import-time behave badly when trimmed via Trim Sections. Both ends of the section are trimmed, and the Trim Sections dialog sometimes displays "???" in the trim length field.

Build scenegraph DLL in Visual Studio Community Edition

As of c920ecc, the scenegraph DLL can be cross-built (including on Windows, via the Windows Subsystem for Linux).

Even so, users uncomfortable with the command-line would prefer to build the scenegraph DLL in the Visual Studio IDE.

Scenegraph builds in VS 2008 (an ancient, paid product), but the project has never been modernized. It would be great to get it building in VS 2022 Community Edition.

Section Tie Dialog pops on any click on a core image

Steps:

  1. Right-click a core image and choose Create Visual Tie.
  2. Click on a core image to complete the tie.
  3. When the Edit Section Tie dialog pops up, click Cancel.
  4. Click a core image in a position far from the tie line.
  5. The Edit Section Tie dialog incorrectly pops up.

Windows: cached images are sometimes reprocessed for no apparent reason

This is a long-standing, extremely slippery issue that's exclusive to Windows.

The first time core images are loaded, they're processed into S3TC tiles at various zoom levels for use in the software. This can be quite slow, especially with many images. Thus the processed data are cached in Corelyzer's cache directory, which load very quickly in comparison.

However, sometimes Windows re-processes images that are already cached. I say "sometimes" because this behavior is difficult to consistently reproduce. Sometimes it happens, sometimes it doesn't. Attempts to reproduce the behavior in a Debug build have failed.

This is a serious problem for very large projects, which can take 30+ minutes to load if the cache is unused.

file URI schema dereferencing messes up in DISLoader

Corelyzer 2.10 on Ubuntu Linux 20.04 LTS
(the spelling 'Corelizer' (below) is a mistake in the new mDIS exporter and, thus, correct in the context and not the cause for error)

I try to import core scans that were exported from the mDIS. XML file and images are in the same directory. The XML file contains the correct full path to the image of each core section. I open the XML file by File => DIS => Import

In the terminal I see the following

---> [DISLoader] Read DIS file: '/home/hl/Desktop/CorelizerXmlExport_COSC-2B/ICDP_5054_2_B.xml' with DIS-Prefix: ''
EXP> name: Collisional Orogeny in the Scandinavian Caledonides, id: 1
SITE> name: COSC-2, id: 2
HOLE> name: B, id: 5
CORE> name: 1Z, id: 2174, topDepth: 6.08, mcd_depth: 6.08, length: 2.52
SECTION> name: 1, id: 6124, topDepth: 6.08, mcdDepth: 6.08, length: 0.91
IMAGE> name: CS_5054_2_B_1_1.jpg, id: 15204, url: file:/home/hl/Desktop/CorelizerXmlExport_COSC-2B/CS_5054_2_B_1_1.jpg
imageUrl is: file:/home/hl/Desktop/CorelizerXmlExport_COSC-2B/CS_5054_2_B_1_1.jpg
[URL OK] the path is: /home/hl/Desktop/CorelizerXmlExport_COSC-2B/CS_5054_2_B_1_1.jpg
[URL OK] the file is: /home/hl/Desktop/CorelizerXmlExport_COSC-2B/CS_5054_2_B_1_1.jpg
[DISLoader] !Mac's imageUrl: file://///hl/Desktop/CorelizerXmlExport_COSC-2B/CS_5054_2_B_1_1.jpg

Obviously, the URL is interpreted correctly until the second line from below. When the DISLoader comes in, something strange happens - too me it looks like a functionality that is intended to work on a Mac, although I can't see the difference to Linux. A full path is a full path. In any case, it results in the Corelyzer error "File could not be found: '/hl/Desktop/CorelizerXmlExport_COSC-2B/CS_5054_2_B_1_1.jpg'"

Custom Data Import fails with blank cell in last selected column of first row of data

A blank cell in the last selected column/cell in the first row of data (as specified in the Data Start Line field) throws an ArrayIndexOutOfBoundsException.

Blank cells elsewhere don't appear to be a problem, nor do blank cells anywhere in subsequent rows of data.

Steps using the attached XLSX file:

  1. Save the only sheet in the XLSX file as CSV
  2. File > Load Data... > Custom Data Import..., select CSV file created in step 0
  3. Use default settings, click Next
  4. Select all fields from Laser Profiler through 740, click Finish
  5. Choose location to save file
  6. Dialog doesn't close, error message has popped behind CDI dialog and main Corelyzer window, data won't be imported.

"Stack sections" needs confirmation box!

The stack sections command has the potential to destroy work as it moves all deeper sections without further confirmation, which could be 1 or hundreds of sections. Its easy to trigger by mistake instead of trim (just above in the menu) and there is no undo function. It would be really good to have a pop-up box that requests confirmation or allows to cancel the command.

Section Tie Dialog pops in wrong position in multi-canvas environment

Steps:

  1. Prepare a multi-canvas/display environment in Edit > Preferences > Displays.
  2. Import a core image and create a tie on it.
  3. Pan the scene such that the core image is in a canvas/display that isn't the topmost or leftmost.
  4. Click the tie. The Section Tie dialog should pop up near the click point. Instead, it pops a significant distance above and/or left of the click point.

macOS: Session tracks aren't loaded when Corelyzer is launched through CML session file

When a CML session file is used to invoke Corelyzer (via double-click, right-click + Open, or dragging CML file onto Corelyzer app), the session loads incompletely. Data files are added correctly, but tracks and sections don't appear.

CorelyzerAppController.doAssociatedFile() calls loadStateFile(). This eventually leads to CorelyzerAppController.createTrack(), where the SceneGraph.addTrack() call returns -1 instead of a valid, non-negative ID.

However, if I create a Runnable with Thread.sleep(2000) before calling loadStateFile(), everything works correctly.

So it appears the problem is a race condition: we try to add a track before SceneGraph is ready.

To fix, ensure app initialization is complete, then load the CML file.

Corelyzer 2.1.0 Mac: To open "Corelyzer.app" you need to install the legacy Java SE 6 runtime

Hi,

Am trying to install Corelyzer 2.1.0 on a macOS (Catalina 10.15.7) but am repeatedly failing to do so.

When I open the Corelyzer.app, the message "To open 'Corelyzer.app' you need to install the legacy Java SE 6 runtime" appears with a link to the "Download Java for OS X 2017-001" webpage (https://support.apple.com/kb/DL1572?locale=en_US). Unfortunately, this Java version is intended for macOS 10.7 to 10.13...and cannot be installed on my system...

I have the recommended Java Version 8 Update 271 (filesize: 80.75 MB) installed on my system but it seems not sufficient...the same message appears and the Corelyzer.app won't open.

Very best,

walt

On click of overlapping graph and section image, graph is selected

Steps:

  1. Import two core section images into different tracks.
  2. Import and graph data on one of the cores, such that it overlaps the other core image.
  3. Click on the overlapping area of graph and core image.
  4. The graph's parent section is selected.

Desired behavior is to always prefer the section image in an overlap. The topmost section image will be selected in the case of overlapping section images.

corelyzer for linux?

Hi! I'm trying to build corelyzer on my 4.10.6-1-ARCH linux machine from the source code, but I see no list of required dependencies. (on this presentation it lists the app as cross-platform)

After running sh gradlew clean package I get the following error:

Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true


FAILURE: Build failed with an exception.

* Where:
Build file '/home/japhir/Downloads/corelyzer-2.0.4_rc4/corelyzer-2.0.4_rc4/app/build.gradle' line: 14

* What went wrong:
A problem occurred evaluating project ':app'.
Cause: You must specify a urls for a Maven repo.

* Try:
Run with -s or -d option to get more details. Run with -S option to get the full (very verbose) stacktrace.

BUILD FAILED

Total time: 1.826 secs

I look forward to hearing from you! :-)

Preferences dialog always pops at startup

When Corelyzer is launched, the Preferences dialog always appears. It should only appear on a first launch (if no Corelyzer prefs are found) for the user to establish initial settings.

Java 11 build errors: "package is accessible from more than one module"

Build errors when gradle.build sourceCompatibility and targetCompatibility values are changed from 1.8 to 1.11:

"The package org.xml.sax is accessible from more than one module"
"The package org.w3c.dom is accessible from more than one module"
[associated type resolution fallout errors]

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.