inkytonik / atom-sbt Goto Github PK
View Code? Open in Web Editor NEWAn Atom interface to the Scala Build Tool (sbt)
License: GNU General Public License v3.0
An Atom interface to the Scala Build Tool (sbt)
License: GNU General Public License v3.0
Steps to reproduce:
Alt + Shift + O
Expected outcome: SBT panel appears with SBT session
Actual outcome: SBT panel appears with error message "execvp(3) failed.: No such file or directory"
Atom Version: 1.5.3
System: Mac OS X 10.11.3
Thrown From: sbt package, v0.2.0
Currently we assume that we can run sbt as "sbt" but it would be more flexible to have this as the default but have a setting that can override it with a user-specific location.
Terminal-plus package seems to be kind of abandoned. Since Atom 1.7 there are a lot of reports that it doesn't work. What do you think about switching to a more maintained fork?
[Enter steps to reproduce:]
Atom: 1.21.1 x64
Electron: 1.6.15
OS: Microsoft Windows 8.1 Pro
Thrown From: sbt package 0.13.0
Uncaught TypeError: Cannot read property 'statusBarTile' of undefined
At C:\Users\23917\.atom\packages\sbt\lib\project.coffee:46
TypeError: Cannot read property 'statusBarTile' of undefined
at Project.module.exports.Project.isRunning (/packages/sbt/lib/project.coffee:46:14)
at Project.module.exports.Project.togglePanel (/packages/sbt/lib/project.coffee:79:9)
at Project.module.exports.Project.showPanel (/packages/sbt/lib/project.coffee:76:8)
at Project.module.exports.Project.runCommand (/packages/sbt/lib/project.coffee:106:6)
at /packages/sbt/lib/sbt.coffee:88:19)
at CommandRegistry.handleCommandEvent (~/AppData/Local/atom/app-1.21.1/resources/app/src/command-registry.js:381:36)
at CommandRegistry.dispatch (~/AppData/Local/atom/app-1.21.1/resources/app/src/command-registry.js:266:23)
at AtomEnvironment.module.exports.AtomEnvironment.dispatchApplicationMenuCommand (~/AppData/Local/atom/app-1.21.1/resources/app/src/atom-environment.js:1348:34)
at EventEmitter.outerCallback (~/AppData/Local/atom/app-1.21.1/resources/app/src/application-delegate.js:335:31)
at emitThree (events.js:116:13)
at EventEmitter.emit (events.js:194:7)
-9:55.6.0 sbt:toggle-panel (input.hidden-input)
-7:24.8.0 core:confirm (input.hidden-input)
-5:42.2.0 core:delete (input.hidden-input)
-4:12.9.0 sbt:compile (input.hidden-input)
4x -1:09.8.0 linter-ui-default:toggle-panel (atom-workspace.workspace.scrollbars-visible-always.theme-one-dark-syntax.theme-one-dark-ui)
-1:01.3.0 grammar-selector:show (atom-text-editor.editor.has-selection.is-focused)
-0:50 sbt:toggle-panel (input.hidden-input)
-0:38.2.0 sbt:test (input.hidden-input)
-0:30 sbt:compile (input.hidden-input)
atom-pyspark 0.2.6
build-sbt 0.6.0
busy-signal 1.4.3
Hydrogen 2.0.1
language-scala 1.1.9
language-sparkling 0.4.2
linter 2.2.0
linter-ui-default 1.6.10
sbt 0.13.0
If you toggle the panel on so sbt starts, then kill it, the other commands stay enabled. If you run one of them there can be a crash since the command tries to ensure that the terminal is running but it starts slowly enough that the command is sent before it's ready. We need to have some sort of wait before the command is sent.
Very nice plugin!
Right now I find myself fixing errors that the compiler issues and then hitting save to see if I did it right.
Because scala compiles so horribly slowly, I would like to take a look at the other errors that are issued in the meantime.
However after hitting save, the errors immediately disappear and only reappear once compile is done.
Can I do anything about this?
( »)|(\] \$)
(it either ends on »
or on $
).Atom: 1.17.0-beta5 x64
Electron: 1.3.15
OS: Mac OS X 10.11.6
Thrown From: sbt package 0.10.0
Uncaught TypeError: Cannot read property 'length' of undefined
At /Users/laughedelic/github/sbt/lib/project.coffee:254
TypeError: Cannot read property 'length' of undefined
at Project.module.exports.Project.outputToCmd (/packages/sbt/lib/project.coffee:254:26)
at /packages/sbt/lib/project.coffee:238:20
at Project.module.exports.Project.processData (/packages/sbt/lib/project.coffee:163:7)
at /packages/sbt/lib/project.coffee:62:10
at /Applications/Atom Beta.app/Contents/Resources/app/src/task.js:128:1
at Function.module.exports.Emitter.simpleDispatch (/Applications/Atom Beta.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:25:1)
at Emitter.module.exports.Emitter.emit (/Applications/Atom Beta.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:141:1)
at ChildProcess.<anonymous> (/Applications/Atom Beta.app/Contents/Resources/app/src/task.js:80:1)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at process.nextTick (internal/child_process.js:744:12)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
-0:45.1.0 project-folder:add (atom-pane.pane.active)
-0:41.2.0 core:confirm (input.hidden-input)
-0:41.1.0 tree-view:show (atom-workspace.workspace.scrollbars-visible-when-scrolling.theme-base16-syntax.theme-native-ui)
-0:36.7.0 sbt:toggle-panel (input.hidden-input)
-0:35.9.0 tree-view:show (atom-workspace.workspace.scrollbars-visible-when-scrolling.theme-base16-syntax.theme-native-ui)
-0:03.3.0 sbt:compile (input.hidden-input)
advanced-open-file 0.16.6
antialiased 0.1.0
ariake-dark-syntax 0.1.3
atom-busy-unifier-sb 1.0.3
atom-csv-markdown 1.0.2
atom-jade 0.3.0
autoclose-html 0.23.0
autocomplete-emojis 2.5.0
autocomplete-haskell 0.7.2
autocomplete-paths 1.0.5
autoflow-diffable 0.5.0
base16-syntax 1.8.0
busy-signal 1.4.1
cursor-history 0.10.1
factoids 0.1.1
file-icons 2.1.4
file-types 0.5.5
git-plus 7.8.0
git-travel 0.1.4
gl-light-syntax 2.2.0
haskell-ghc-mod 1.19.9
highlight-selected 0.13.1
hyperclick 0.0.40
ide-haskell 1.9.6
intentions 1.1.2
key-peek 0.2.12
language-diff 0.7.0
language-elm 1.5.0
language-fish-shell 1.0.5
language-gitignore 0.3.0
language-haskell 1.12.1
language-hocon 1.1.0
language-latex 1.0.0
language-pfm 0.82.0
language-rdf 0.5.0
language-scala 1.1.8
language-sparql 0.3.0
latex-completions 0.3.2
line-diff-details 1.8.0
linter 2.1.4
linter-annotations 1.0.1
linter-coffeescript 1.0.0
linter-elm-make 0.23.2
linter-markdown 4.0.1
linter-ui-default 1.3.0
markdown-folder 0.5.0
markdown-preview-enhanced 0.12.1
markdown-preview-plus 2.4.9
markdown-table-formatter 2.9.0
mathjax-wrapper 0.1.0
merge-conflicts 1.4.4
minimap 4.28.2
native-ui 0.20.6
package-manager-commands 2.0.3
pdf-view 0.57.0
pen-paper-coffee-syntax 0.14.9
plain-simple 1.1.0
platformio-ide-terminal 2.5.0
plist-converter 0.1.6
pretty-json 1.6.3
preview-inline 1.4.7
project-folder 1.3.0
remember-folds 0.3.0
sbt 0.10.0
simple-align 0.2.0
sort-lines 0.14.0
sparql 0.0.0
swackets 0.26.0
tablr 1.8.3
tabularize 0.2.5
vim-mode-plus 0.91.0
vim-mode-plus-keymaps-for-surround 0.2.1
xml-formatter 0.10.0
Currently the user is required to supply a prompt pattern in order for the prompt detection to work correctly. This is error prone since different projects can have different prompts and it is not always easy to get a single pattern that works reliably for each of them, without also matching non-prompt output. Ideally we should be able to detect which prompt is being used on a per-project basis and use that instead of a more general pattern for all projects.
Could you add a setting to turn off auto-toggle when a command is invoked? I'd like to run compile command and just get the linter errors list updated, without seeing the sbt output every time.
Kind of a dumb question. How do I make linter errors go away after I have fixed the code and it compiles clean? I kind of expected them to go away automatically.
[Enter steps to reproduce:]
Atom: 1.21.1 x64
Electron: 1.6.15
OS: Microsoft Windows 8.1 Pro
Thrown From: sbt package 0.13.0
Uncaught TypeError: Cannot read property 'statusBarTile' of undefined
At C:\Users\23917\.atom\packages\sbt\lib\project.coffee:46
TypeError: Cannot read property 'statusBarTile' of undefined
at Project.module.exports.Project.isRunning (/packages/sbt/lib/project.coffee:46:14)
at Project.module.exports.Project.togglePanel (/packages/sbt/lib/project.coffee:79:9)
at Project.module.exports.Project.showPanel (/packages/sbt/lib/project.coffee:76:8)
at Project.module.exports.Project.runCommand (/packages/sbt/lib/project.coffee:106:6)
at /packages/sbt/lib/sbt.coffee:88:19)
at CommandRegistry.handleCommandEvent (~/AppData/Local/atom/app-1.21.1/resources/app/src/command-registry.js:381:36)
at CommandRegistry.dispatch (~/AppData/Local/atom/app-1.21.1/resources/app/src/command-registry.js:266:23)
at AtomEnvironment.module.exports.AtomEnvironment.dispatchApplicationMenuCommand (~/AppData/Local/atom/app-1.21.1/resources/app/src/atom-environment.js:1348:34)
at EventEmitter.outerCallback (~/AppData/Local/atom/app-1.21.1/resources/app/src/application-delegate.js:335:31)
at emitThree (events.js:116:13)
at EventEmitter.emit (events.js:194:7)
-9:55.6.0 sbt:toggle-panel (input.hidden-input)
-7:24.8.0 core:confirm (input.hidden-input)
-5:42.2.0 core:delete (input.hidden-input)
-4:12.9.0 sbt:compile (input.hidden-input)
4x -1:09.8.0 linter-ui-default:toggle-panel (atom-workspace.workspace.scrollbars-visible-always.theme-one-dark-syntax.theme-one-dark-ui)
-1:01.3.0 grammar-selector:show (atom-text-editor.editor.has-selection.is-focused)
-0:50 sbt:toggle-panel (input.hidden-input)
-0:38.2.0 sbt:test (input.hidden-input)
-0:30 sbt:compile (input.hidden-input)
atom-pyspark 0.2.6
build-sbt 0.6.0
busy-signal 1.4.3
Hydrogen 2.0.1
language-scala 1.1.9
language-sparkling 0.4.2
linter 2.2.0
linter-ui-default 1.6.10
sbt 0.13.0
Would it be hard to support multiple running sbt instances and switch between them based on the open file?
Great package! It's nice to not have to fire up intellij. Will there be support for continuous running (~run
) of a project?
We really need some unit tests to make it easier to be sure thing aren't breaking between releases.
Would be nice to be able to run commands like ~compile
and get errors in the linter cleared every time it's rerun (now if you run ~compile
same errors get accumulated)
This is possibly a dumb question but I would really like to see all errors under the line they belong to and not at the bottom of the file. Is this possible? If so, how?
The atom linter package recently released their 2.0 API, which breaks atom-sbt linter support. Please upgrade the atom-sbt linter support to the 2.0 API. The new API is documented here
and includes a migration guide.
We trap compiler errors and send the errors to the linter package. We should do the same for test failures. The main issue is that ScalaTest at least doesn't give us a good filename to use for this purpose.
There is some code in the package to recognise test errors in one special format that is produced by our Kiama library, but this is not a general solution.
It looks like atom-sbt can't quite grok sbt 1.0 output. It understands when commands are running (the pulsing yellow ball that turns green works) but it doesn't seem to see compilation errors.
If you run some commands (say "foo" and "bar") either via key-bindings or typing them interactively, run-last-command will successfully run the last of them (say "bar"). However, if you use arrow keys to go back in sbt's history (say to "foo") that command will be run, but run-last-command will not know about it, so you'll get the previous last command instead of "foo".
[Enter steps to reproduce:]
Atom: 1.16.0 x64
Electron: 1.3.13
OS: Mac OS X 10.12
Thrown From: sbt package 0.10.0
Uncaught TypeError: this.registerIndie is not a function
At /Users/rnorris/.atom/packages/sbt/lib/sbt.coffee:139
TypeError: this.registerIndie is not a function
at Object.getOrMakeCurrentProject (/packages/sbt/lib/sbt.coffee:139:19)
at /packages/sbt/lib/sbt.coffee:76:22)
at CommandRegistry.module.exports.CommandRegistry.handleCommandEvent (/app.asar/src/command-registry.js:259:29)
at /app.asar/src/command-registry.js:3:59
at KeymapManager.module.exports.KeymapManager.dispatchCommandEvent (/app.asar/node_modules/atom-keymap/lib/keymap-manager.js:599:16)
at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (/app.asar/node_modules/atom-keymap/lib/keymap-manager.js:390:22)
at WindowEventHandler.module.exports.WindowEventHandler.handleDocumentKeyEvent (/app.asar/src/window-event-handler.js:106:36)
at /app.asar/src/window-event-handler.js:3:59)
-2:56.1.0 settings-view:open (atom-pane.pane.active)
-2:44.2.0 core:confirm (input.hidden-input)
-1:12.2.0 core:close (ol.tree-view.full-menu.list-tree.has-collapsable-children.focusable-panel)
2x -1:08.8.0 sbt:toggle-panel (ol.tree-view.full-menu.list-tree.has-collapsable-children.focusable-panel)
activate-power-mode 1.1.0
autocomplete-ctags 0.4.1
browser-plus 0.0.76
copy-as-rtf 0.9.3
hyperclick 0.0.37
intentions 1.1.2
language-fortran 2.0.15
language-scala 1.1.8
linter 1.11.16
platformio-ide-terminal 2.5.0
sbt 0.10.0
select-rectangle 1.0.2
We capture interactive commands so they can be added to the history. Unfortunately, we capture too much. E.g., when the user uses the arrow keys to go back in the editable history in sbt, they arrow keys are captured (well, escape sequences, I think). We should do some filtering before adding the interactive stuff to the history.
At the moment we get an error message from execvp or similar but we should trap that and issue a more meaningful message.
[Enter steps to reproduce:]
Atom: 1.16.0 x64
Electron: 1.3.13
OS: Mac OS X 10.12.3
Thrown From: sbt package 0.10.0
Uncaught TypeError: Cannot read property 'add' of null
At /Users/johndavis/.atom/packages/sbt/lib/project.coffee:49
TypeError: Cannot read property 'add' of null
at Project.module.exports.Project.startTerm (/packages/sbt/lib/project.coffee:49:18)
at /packages/sbt/lib/project.coffee:91:12
at FSReqWrap.oncomplete (fs.js:123:15)
-8:31.9.0 window:toggle-full-screen (input.hidden-input)
2x -8:27.5.0 application:open (input.hidden-input)
-7:53.7.0 fuzzy-finder:toggle-file-finder (input.hidden-input)
-7:42.9.0 core:move-down (input.hidden-input)
-7:41.8.0 core:move-up (input.hidden-input)
-7:40.7.0 core:move-down (input.hidden-input)
-7:40.2.0 core:confirm (input.hidden-input)
-7:33.9.0 grammar-selector:show (atom-text-editor.editor.is-focused)
-7:31.2.0 core:backspace (input.hidden-input)
-6:56.4.0 settings-view:install-packages-and-themes (input.hidden-input)
-6:46.1.0 core:confirm (input.hidden-input)
-5:15 command-palette:toggle (input.hidden-input)
-2:34.7.0 settings-view:install-packages-and-themes (input.hidden-input)
-2:29.7.0 core:confirm (input.hidden-input)
-1:40.4.0 sbt:toggle-panel (input.hidden-input)
busy-signal 1.4.1
intentions 1.1.2
language-elm 1.5.0
language-scala 1.1.8
linter 2.1.4
linter-ui-default 1.2.3
platformio-ide-terminal 2.5.0
sbt 0.10.0
sbt works perfectly from a separate command window. But when I use this plugin, I get an error (see below). It says ANDROID_HOME is not set, yet is is, and other android tools are working.
It says to 'run 'android update project -p /home/bruce/Git/smile/android''
That returns 'android: command not found'
I'm stumped.
[info] Loading global plugins from /home/bruce/.sbt/0.13/plugins
[info] Loading project definition from /home/bruce/Git/smile/project
java.lang.RuntimeException: set ANDROID_HOME or run 'android update project -p /home/bruce/Git/smile
/android'
at scala.sys.package$.error(package.scala:27)
at android.Plugin$$anonfun$allPluginSettings$67$$anonfun$apply$28.apply(rules.scala:350)
at android.Plugin$$anonfun$allPluginSettings$67$$anonfun$apply$28.apply(rules.scala:350)
at scala.Option.getOrElse(Option.scala:120)
at android.Plugin$$anonfun$allPluginSettings$67.apply(rules.scala:350)
at android.Plugin$$anonfun$allPluginSettings$67.apply(rules.scala:342)
at scala.Function2$$anonfun$tupled$1.apply(Function2.scala:54)
at scala.Function2$$anonfun$tupled$1.apply(Function2.scala:53)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.EvaluateSettings$MixedNode.evaluate0(INode.scala:177)
at sbt.EvaluateSettings$INode.evaluate(INode.scala:135)
at sbt.EvaluateSettings$$anonfun$sbt$EvaluateSettings$$submitEvaluate$1.apply$mcV$sp(INode.s
cala:67)
at sbt.EvaluateSettings.sbt$EvaluateSettings$$run0(INode.scala:76)
at scala.Function2$$anonfun$tupled$1.apply(Function2.scala:53)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.EvaluateSettings$MixedNode.evaluate0(INode.scala:177)
at sbt.EvaluateSettings$INode.evaluate(INode.scala:135)
at sbt.EvaluateSettings$$anonfun$sbt$EvaluateSettings$$submitEvaluate$1.apply$mcV$sp(INode.s
cala:67)
at sbt.EvaluateSettings.sbt$EvaluateSettings$$run0(INode.scala:76)
[Enter steps to reproduce below:]
Atom Version: 1.7.2
System: Mac OS X 10.11.3
Thrown From: sbt package, v0.7.0
Uncaught TypeError: Cannot read property 'indexOf' of null
At /Users/francis/.atom/packages/sbt/lib/sbt.coffee:148
TypeError: Cannot read property 'indexOf' of null
at Object.module.exports.Sbt.isRunning (/Users/francis/.atom/packages/sbt/lib/sbt.coffee:148:26)
at Object.module.exports.Sbt.togglePanel (/Users/francis/.atom/packages/sbt/lib/sbt.coffee:297:11)
at atom-workspace.subscriptions.add.atom.commands.add.sbt:toggle-panel (/Users/francis/.atom/packages/sbt/lib/sbt.coffee:68:86)
at CommandRegistry.module.exports.CommandRegistry.handleCommandEvent (/Applications/Atom.app/Contents/Resources/app.asar/src/command-registry.js:260:29)
at /Applications/Atom.app/Contents/Resources/app.asar/src/command-registry.js:3:61
at KeymapManager.module.exports.KeymapManager.dispatchCommandEvent (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/atom-keymap/lib/keymap-manager.js:580:16)
at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/atom-keymap/lib/keymap-manager.js:388:22)
at WindowEventHandler.module.exports.WindowEventHandler.handleDocumentKeyEvent (/Applications/Atom.app/Contents/Resources/app.asar/src/window-event-handler.js:98:36)
at HTMLDocument.<anonymous> (/Applications/Atom.app/Contents/Resources/app.asar/src/window-event-handler.js:3:61)
-0:08.6.0 sbt:toggle-panel (atom-pane.pane.active)
-0:03.1.0 application:add-project-folder (atom-text-editor.editor.is-focused)
-0:00.6.0 sbt:toggle-panel (atom-text-editor.editor.is-focused)
{
"core": {
"disabledPackages": [
"linter-scalac"
],
"themes": [
"atom-material-ui",
"atom-material-syntax"
]
},
"sbt": {}
}
# User
angularjs, v0.3.4
atom-material-syntax, v0.4.3
atom-material-ui, v1.2.6
color-picker, v2.1.1
emmet, v2.4.3
language-scala, v1.1.6
linter, v1.11.4
minimap, v4.20.0
sbt, v0.7.0
scala-format, v0.1.8
terminal-plus, v0.14.5
# Dev
No dev packages
Running alt-shift-O
in my Play application folder throw an exception straight away
Atom Version: 1.5.3
System: Mac OS X 10.11.3
Thrown From: sbt package, v0.1.0
Uncaught TypeError: Cannot read property 'statusBar' of undefined
At /Users/ricardo/.atom/packages/sbt/lib/sbt.coffee:137
TypeError: Cannot read property 'statusBar' of undefined
at Object.module.exports.Sbt.notRunning (/Users/ricardo/.atom/packages/sbt/lib/sbt.coffee:137:12)
at Object.module.exports.Sbt.togglePanel (/Users/ricardo/.atom/packages/sbt/lib/sbt.coffee:249:11)
at atom-workspace.subscriptions.add.atom.commands.add.sbt:toggle-panel (/Users/ricardo/.atom/packages/sbt/lib/sbt.coffee:60:86)
at CommandRegistry.module.exports.CommandRegistry.handleCommandEvent (/Volumes/Storage/usr/local/Caskroom/atom/1.5.3/Atom.app/Contents/Resources/app.asar/src/command-registry.js:260:29)
at /Volumes/Storage/usr/local/Caskroom/atom/1.5.3/Atom.app/Contents/Resources/app.asar/src/command-registry.js:3:61
at KeymapManager.module.exports.KeymapManager.dispatchCommandEvent (/Volumes/Storage/usr/local/Caskroom/atom/1.5.3/Atom.app/Contents/Resources/app.asar/node_modules/atom-keymap/lib/keymap-manager.js:536:16)
at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (/Volumes/Storage/usr/local/Caskroom/atom/1.5.3/Atom.app/Contents/Resources/app.asar/node_modules/atom-keymap/lib/keymap-manager.js:359:22)
at WindowEventHandler.module.exports.WindowEventHandler.handleDocumentKeydown (/Volumes/Storage/usr/local/Caskroom/atom/1.5.3/Atom.app/Contents/Resources/app.asar/src/window-event-handler.js:97:36)
at HTMLDocument.<anonymous> (/Volumes/Storage/usr/local/Caskroom/atom/1.5.3/Atom.app/Contents/Resources/app.asar/src/window-event-handler.js:3:61)
-3:55.1.0 settings-view:open (atom-text-editor.editor.is-focused)
2x -2:52.3.0 core:select-all (div.panels)
2x -2:51.4.0 core:paste (atom-text-editor.editor.mini.is-focused)
-0:31.5.0 application:add-project-folder (atom-text-editor.editor.is-focused)
3x -0:11.1.0 core:backspace (atom-text-editor.editor.is-focused)
-0:02.1.0 sbt:toggle-panel (atom-text-editor.editor.is-focused)
{
"core": {}
}
# User
sbt, v0.1.0
# Dev
No dev packages
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.