noam-dori / ros-integrate Goto Github PK
View Code? Open in Web Editor NEWExtends IntelliJ-Based IDEs with ROS specific development tools
License: Apache License 2.0
Extends IntelliJ-Based IDEs with ROS specific development tools
License: Apache License 2.0
Feature:
Document how to install the development version
Background
Good documentation on how people can help can increase their interactivity and as a result improve the quality of the project. Helping people who want to install the "development" versions of a plugin for testing, and possibly contribution is a critical part of that.
Details
Feature:
Annotate package.xmls without buildtool_depend tags
Background
at least one buildtool is required in each manifest, and ROS will not work unless this is satisfied.
Details
Example: I tried cloning the velodyne respoitory into my test catkin_ws, and the sub-packages in it were not colored correctly.
The same issue happens with directly cloning packages via git: dynamic_reconfigure used as example.
After restarting the IDE the icons work fine. This is clearly an issue with the processing of VFileCreateEvent.
Feature:
Support for the "compatibility" attribute in version tags.
Background
Format 3 introduces the "compatibility" tag which is used to guarantee support for packages built against older versions of the package.
Details
Feature:
full support of the <export> tag.
Background
an important feature even in the first ROS format, this tag allows freely adding additional metadata with some already having built-in functionality. It is critical that support for the tag itself is added (and potentially sub-features like plugins, package marking, etc.)
Details
Feature:
Support package.xml format 2.
Background
I've some format 2 packages, and any time I want package suggestions in <depend>
or <exec_depend>
tags, CLion tells there is nothing to suggest. <build_depend>
works as it is also a format 1 tag.
Details
Version 0.1.5., CLion 2020.1 Beta
What I did - I renamed a method in a source file within a package. However, this may happen because of indexing.
What this does is cause ROS Support to crash.
Stack trace:
java.lang.NullPointerException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598)
at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677)
at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:735)
at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:583)
at ros.integrate.workspace.ROSPackageManagerImpl.doBulkFileChangeEvents(ROSPackageManagerImpl.java:52)
at ros.integrate.workspace.ROSPackageManagerImpl.access$000(ROSPackageManagerImpl.java:18)
at ros.integrate.workspace.ROSPackageManagerImpl$1.after(ROSPackageManagerImpl.java:35)
Describe the bug
Error popup appears for projects without ROS Path
To Reproduce
Steps to reproduce the behavior:
Expected behavior
The popup should not appear at all
Environment Information:
Stack Trace
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at ros.integrate.pkg.ROSCompiledPackageFinder.getROSRoot(ROSCompiledPackageFinder.java:49)
at ros.integrate.pkg.ROSCompiledPackageFinder.inFinder(ROSCompiledPackageFinder.java:134)
at ros.integrate.pkg.ROSPackageFinderBase.lambda$investigate$1(ROSPackageFinderBase.java:98)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at ros.integrate.pkg.ROSPackageFinderBase.investigate(ROSPackageFinderBase.java:101)
at ros.integrate.pkg.ROSPackageManagerImpl.lambda$applyChangesToOrphans$3(ROSPackageManagerImpl.java:96)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:201)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:802)
at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:322)
at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84)
at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:132)
at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:47)
at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:188)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:971)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:841)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:452)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:744)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:451)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:802)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:499)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)=
new structure:
Environment -----------------------------------------
ROS Path: [ ] [...]
Workspace: [ ] [...]
Additional Package Repositories: [ ] [...]
[*] Sync with $ROS_PACKAGE_PATH
If possible, make Additional Package Repositories something that can open up to a list of paths.
Feature:
license tags should support the "file" attribute in format 3.
Background
A less prominent format 3 feature but important for legality, this feature allows directly referencing the added license file.
Details
more details on the new tag are available in REP 149
Recently, I don't use ROS anymore, so I uninstall this plugin.
Unfortunately, the ROS directory is still left inside "External Libraries". As in the below image
I tried everything, include uninstall and removing all of pycharm's config, log, cache. But it didn't work well.
~/.config/JetBrains/PyCharm2020.1
~/.cache/JetBrains/PyCharm2020.1
~/.local/share/JetBrains/PyCharm2020.1
~/.cache/JetBrains/PyCharm2020.1/log
Do you know how to solve this?
Feature:
document the technical behavior of ROS condition attributes.
Background
Being a very useful and lesser known, it is good to let users know it exists. For this, documentation on how it works is needed. Add some documentation here.
Details
In the wiki, under a "ROS Features" category, describe conditions. Also explain how they look in the plugin.
Describe the bug
Packages found in distribution ROSDep source lists are not properly found. Autocomplete does not function on them either.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Dependency is properly found, and autocomplete works just as it would on packages found in the base.yaml dependency list.
Environment Information:
Stack Trace
N/A
Screenshots
Note: roscpp
is a distribution package. eigen
is from the base yaml.
Additional context
Issue persists even if the distribution is added directly.
To be more clear, rosdep itself gets the location from index.yaml but assuming this plugin cannot do what rosdep does, the plugin does not work even when adding the distribution itself (in my case https://raw.githubusercontent.com/ros/rosdistro/master/melodic/distribution.yaml) to the "Online ROSDep Source Lists".
If you encountered any NullPointerExceptions, IllegalStateExceptions that were raised in the log, please report them here, along with a stack trace and the action you were doing.
If your IDE happens to freeze, please use this guide to get a thread dump (like a stack trace, but for freezes), and if it is caused by this plugin, please report it here as well (with your thread dump attached).
Feature:
add support for group dependencies
Background
The driver behind format 3, this feature allows grouping dependencies in an extendable manner, better than what meta-packages offer. A good example for this is message generators, where if you would want java generators, you would add them to a group called "message_generation". Then a package that needs this group could say that it uses it. Note that groups are not physical objects, they "act like namespaces". Since they are metaphysical, you can depend on a group without declaring it.
Details available on REP 149
Details
Feature:
Tags should be added according to REP order.
Background
It can be very annoying that tags are added in the beginning of the file and than having to sort them.
Details
When an intention or a call to add a tag is made, instead of putting the new tag at the top, it will find the last appearance of a tag from the same order group or if none exist. If none exist, it will run the same check with the previous order group, and so on. If the search reaches the end with no previous result, it will be added first.
Feature:
add conditon attribute to build_type
Background
like dependencies, build_type also can be conditional (for example, catkin in ROS1, ament in ROS2). Thus, support for the conditional attribute should be added.
Details
When I ran catkin_make in a console (which can change some of the files monitored by CLion), my IDE froze. And CLion marked ROS Support as the problematic plugin.
Freeze in EDT for 182 seconds
IDE KILLED! Sampled time: 165200ms, sampling rate: 100ms, GC time: 421ms (0%), Class loading: 0%
com.intellij.diagnostic.Freeze
at [email protected]/java.lang.Object.wait(Native Method)
at [email protected]/java.util.concurrent.ForkJoinTask.externalAwaitDone(ForkJoinTask.java:330)
at [email protected]/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:412)
at [email protected]/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
at [email protected]/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
at [email protected]/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
at [email protected]/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at [email protected]/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at [email protected]/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:661)
at ros.integrate.workspace.ROSPackageManagerImpl.doBulkFileChangeEvents(ROSPackageManagerImpl.java:119)
at ros.integrate.workspace.ROSPackageManagerImpl.access$300(ROSPackageManagerImpl.java:28)
at ros.integrate.workspace.ROSPackageManagerImpl$1.after(ROSPackageManagerImpl.java:52)
at jdk.internal.reflect.GeneratedMethodAccessor151.invoke(Unknown Source)
at [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at [email protected]/java.lang.reflect.Method.invoke(Method.java:566)
at com.intellij.util.messages.impl.MessageBusImpl.invokeListener(MessageBusImpl.java:513)
at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:142)
at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:438)
at com.intellij.util.messages.impl.MessageBusImpl.pumpWaitingBuses(MessageBusImpl.java:398)
at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:388)
at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:370)
at com.intellij.util.messages.impl.MessageBusImpl.lambda$createTopicHandler$1(MessageBusImpl.java:241)
at com.intellij.util.messages.impl.MessageBusImpl$$Lambda$312/0x000000080046c840.invoke(Unknown Source)
at com.sun.proxy.$Proxy43.modificationCountChanged(Unknown Source)
at com.intellij.psi.impl.PsiModificationTrackerImpl.fireEvent(PsiModificationTrackerImpl.java:70)
at com.intellij.psi.impl.PsiModificationTrackerImpl.incCountersInner(PsiModificationTrackerImpl.java:75)
at com.intellij.psi.impl.PsiModificationTrackerImpl.incOutOfCodeBlockModificationCounter(PsiModificationTrackerImpl.java:65)
at com.jetbrains.cidr.lang.symbols.symtable.FileSymbolTablesCache$1.incModificationCount(FileSymbolTablesCache.java:130)
at com.jetbrains.cidr.lang.symbols.symtable.FileSymbolTablesCache$3.done(FileSymbolTablesCache.java:205)
at com.jetbrains.cidr.VirtualFileChangeListener.after(VirtualFileChangeListener.kt:76)
at jdk.internal.reflect.GeneratedMethodAccessor151.invoke(Unknown Source)
at [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at [email protected]/java.lang.reflect.Method.invoke(Method.java:566)
at com.intellij.util.messages.impl.MessageBusImpl.invokeListener(MessageBusImpl.java:513)
at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:142)
at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:438)
at com.intellij.util.messages.impl.MessageBusImpl.pumpWaitingBuses(MessageBusImpl.java:398)
at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:388)
at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:370)
at com.intellij.util.messages.impl.MessageBusImpl.lambda$createTopicHandler$1(MessageBusImpl.java:241)
at com.intellij.util.messages.impl.MessageBusImpl$$Lambda$312/0x000000080046c840.invoke(Unknown Source)
at com.sun.proxy.$Proxy43.modificationCountChanged(Unknown Source)
at com.intellij.psi.impl.PsiModificationTrackerImpl.fireEvent(PsiModificationTrackerImpl.java:70)
at com.intellij.psi.impl.PsiModificationTrackerImpl.incCountersInner(PsiModificationTrackerImpl.java:75)
at com.intellij.psi.impl.PsiModificationTrackerImpl.incOutOfCodeBlockModificationCounter(PsiModificationTrackerImpl.java:65)
at com.jetbrains.cidr.lang.symbols.symtable.FileSymbolTablesCache$1.incModificationCount(FileSymbolTablesCache.java:130)
at com.jetbrains.cidr.lang.symbols.symtable.FileSymbolTablesCache$3.done(FileSymbolTablesCache.java:205)
at com.jetbrains.cidr.VirtualFileChangeListener.after(VirtualFileChangeListener.kt:76)
at jdk.internal.reflect.GeneratedMethodAccessor151.invoke(Unknown Source)
at [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at [email protected]/java.lang.reflect.Method.invoke(Method.java:566)
at com.intellij.util.messages.impl.MessageBusImpl.invokeListener(MessageBusImpl.java:513)
at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:142)
at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:438)
at com.intellij.util.messages.impl.MessageBusImpl.pumpWaitingBuses(MessageBusImpl.java:398)
at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:388)
at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:370)
at com.intellij.util.messages.impl.MessageBusImpl.lambda$createTopicHandler$1(MessageBusImpl.java:241)
at com.intellij.util.messages.impl.MessageBusImpl$$Lambda$312/0x000000080046c840.invoke(Unknown Source)
at com.sun.proxy.$Proxy43.modificationCountChanged(Unknown Source)
at com.intellij.psi.impl.PsiModificationTrackerImpl.fireEvent(PsiModificationTrackerImpl.java:70)
at com.intellij.psi.impl.PsiModificationTrackerImpl.incCountersInner(PsiModificationTrackerImpl.java:75)
at com.intellij.psi.impl.PsiModificationTrackerImpl.incOutOfCodeBlockModificationCounter(PsiModificationTrackerImpl.java:65)
at com.jetbrains.cidr.lang.symbols.symtable.FileSymbolTablesCache$1.incModificationCount(FileSymbolTablesCache.java:130)
at com.jetbrains.cidr.lang.symbols.symtable.FileSymbolTablesCache$3.done(FileSymbolTablesCache.java:205)
at com.jetbrains.cidr.VirtualFileChangeListener.after(VirtualFileChangeListener.kt:76)
at jdk.internal.reflect.GeneratedMethodAccessor151.invoke(Unknown Source)
at [email protected]/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at [email protected]/java.lang.reflect.Method.invoke(Method.java:566)
at com.intellij.util.messages.impl.MessageBusImpl.invokeListener(MessageBusImpl.java:513)
at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:142)
at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:438)
at com.intellij.util.messages.impl.MessageBusImpl.pumpWaitingBuses(MessageBusImpl.java:398)
at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:388)
at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:372)
at com.intellij.util.messages.impl.MessageBusImpl.lambda$createTopicHandler$1(MessageBusImpl.java:241)
at com.intellij.util.messages.impl.MessageBusImpl$$Lambda$312/0x000000080046c840.invoke(Unknown Source)
at com.sun.proxy.$Proxy129.after(Unknown Source)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.processEvents(PersistentFSImpl.java:983)
at com.intellij.openapi.vfs.newvfs.AsyncEventSupport.processEvents(AsyncEventSupport.java:124)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.fireEventsInWriteAction(RefreshSessionImpl.java:193)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.lambda$fireEvents$1(RefreshSessionImpl.java:180)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl$$Lambda$3391/0x0000000801ab3040.run(Unknown Source)
at com.intellij.openapi.application.WriteAction.run(WriteAction.java:98)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.fireEvents(RefreshSessionImpl.java:180)
at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.lambda$tryProcessingEvents$5(RefreshQueueImpl.java:152)
at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl$$Lambda$779/0x0000000800963040.run(Unknown Source)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:107)
at com.intellij.openapi.application.TransactionGuardImpl$$Lambda$561/0x00000008006fa040.run(Unknown Source)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:441)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:424)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:407)
at [email protected]/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at [email protected]/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at [email protected]/java.awt.EventQueue$4.run(EventQueue.java:727)
at [email protected]/java.awt.EventQueue$4.run(EventQueue.java:721)
at [email protected]/java.security.AccessController.doPrivileged(Native Method)
at [email protected]/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at [email protected]/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:906)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:779)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:422)
at com.intellij.ide.IdeEventQueue$$Lambda$532/0x00000008006a1840.compute(Unknown Source)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:421)
at [email protected]/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at [email protected]/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at [email protected]/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at [email protected]/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at [email protected]/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at [email protected]/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Feature:
highlighting and evaluation of dependency "conditional" attribute.
Background
A prominent feature in Format 3 packages, it allows toggling dependencies based on the evaluated value of the conditional. In contract to the version restriction attributes, this feature actually relaxes the rules rather than making them more strict.
Details
Is there somewhere that you list all the currently supported features(ex. what filetypes there's parsing for, what ros things the plugins support, etc.)?
Does this plugin currently support the build process or is that something that needs to be done outside of Clion? If it does, is it compatible with catkin_tools
or is it only compatible with catkin_make
?
Have you seen https://github.com/paoloach/ROS-JetBrains-Plugin and https://github.com/duckietown/hatchery? How will this plugin differ from those? What featureset will it have compared to those?
Plugin Version
0.1.6
Describe the bug
After CLion is started and loading a previous project, all project files are reported as not belonging to the project.
To Reproduce
Expected behavior
The project files should be recognized as project files. Sometimes, the non-recognized project files get a weird yellowis-brownish background in the project view, sometimes they have normal background. When I press the "reload cmake project" button, project files are recognized correctly.
Environment Information:
Additional context
Add any other context about the problem here.
for example, if you add in the end of the file
tf/tfMessage
(perfectly valid type, though not PascalCased)
the inspection will appear correctly but will not offer a supression fix. This probably happens because of a misuse of the ROSPktField class (should be ROSPktFieldBase)
Hi
I am using intellij for java, and all the junit test case button had been replace by your plugin , when I click on it ,it create a test run with the cute icon , which actually I want to run my test case via junit. please help fix it, it is really boring.
BR
Xavier
Feature:
documentation on "License Details Preference" option in ROS Settings tab.
Background
This plugin specific option does not come with any explanation as to what the options lead to and what advantages each choice offers. This is left to the wiki
Details
Add documentation in the ROS Settings page on the wiki on this site.
Hi,
I'm trying to use your plugin to add rospy to my work environment but it's kinda hard to figure out what to do with it ^^ It's basically the same issue as #3
When I add it to PyCharm, it leads to an inspection of my home directory, which is not where my ROS package is located, and which also leads to "every line of your code is duplicated from another source" because, my repo is basically scans 2 times.
I think that I have to add some paths in .xml files from the .idea folder but I do not know which field I should fill ... ๐
Can you help on that ? Maybe, you could do a tutorial ?
Cheers
Just wondering, is this project related to hatchery? If not, I think it would be great to team up to improve ROS support in IntelliJ more quickly.
I'm using CLion with the Hatchery plugin so far, but what I'm missing is catkin build support. roslaunch support would be nice as well.
In here all planned stuff for package.xml will be written:
see REP 140 for more details
<name />
<version />
<description />
<maintainer />
<license />
<url />
<author />
general
dependency stuff is far more complex and thus will be another issue.
Dear Noam
Do you a have a simple example to start using the plugin?
thanks,
com.intellij.diagnostic.PluginException: Incorrect name specified in <fileType>, should be ROSAct, actual ROS Action [Plugin: ros-integrate]
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.instantiateFileTypeBean(FileTypeManagerImpl.java:491)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.instantiatePendingFileTypes(FileTypeManagerImpl.java:464)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.initializeComponent(FileTypeManagerImpl.java:666)
at com.intellij.configurationStore.ComponentStoreImpl.initComponent(ComponentStoreImpl.kt:97)
at com.intellij.configurationStore.ComponentStoreWithExtraComponents.initComponent(ComponentStoreWithExtraComponents.kt:49)
at com.intellij.serviceContainer.PlatformComponentManagerImpl.initializeComponent(PlatformComponentManagerImpl.kt:259)
at com.intellij.serviceContainer.ServiceComponentAdapter.createAndInitialize(ServiceComponentAdapter.kt:56)
at com.intellij.serviceContainer.ServiceComponentAdapter.doCreateInstance(ServiceComponentAdapter.kt:39)
at com.intellij.serviceContainer.BaseComponentAdapter.getInstanceUncached(BaseComponentAdapter.kt:110)
at com.intellij.serviceContainer.BaseComponentAdapter.getInstance(BaseComponentAdapter.kt:72)
at com.intellij.serviceContainer.BaseComponentAdapter.getInstance$default(BaseComponentAdapter.kt:65)
at com.intellij.serviceContainer.PlatformComponentManagerImpl$preloadServices$future$1.run(PlatformComponentManagerImpl.kt:623)
at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:222)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:30)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:201)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:193)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
add an intention for entire package.xml file that will reorder itself according to the sorting in REP 140 example
order:
for example, try to fix the type ros/ROSMessage
suggests the parent directory of the original file instead of /opt/ros/$ROS_DISTRO/share/ros.
something seems to fail in the dialog popup.
As pointed out in #18, The default ROS installation path should not be a part of the additional workspace packages setting. However, this setting gets pre-filled with ROS_PACKAGE_PATH, which in many cases does contain this path. I think the plugin should remove it automatically, or at least warn the user that he should do that.
Feature:
A "one click" fix for missing tags in package.xml files
Background
Often package.xml files are missing a lot of tags. It can be especially annoying to Alt+Enter each and every one of them, even more so when you just created a new package.xml file. Granted, they do make creating a package.xml file a lot easier, but it can be much easier, and most importantly, "in one click".
Another big issue is that there are just too many intentions making the intention option bar hard to look at
Details
Feature:
Autocompletion for version dependency, with additional inspections
Background
Sometimes a package depends on specific versions of another package. The attributes version_COMP specify that.
Details
Feature:
I would like PyCharm to not index files when Workspace (Langugages & Framworks > ROS) is not filled
Background
The plugin always want to index. It starts to index my whole computer as soon as I create a project because initially, the workspace is empty which corresponds to the PC's root (I guess)
As it is not possible to enable/disable plugins for one specific project, ROS Support is always enable on my PyCharm and each time I create a new project, my computer almost freeze because PyCharm is indexing everything
Details
Can you add an option/condition which will allow set a new external library only if the user set one :) ?
Cheers
java.lang.NullPointerException
at java.util.TreeMap.rotateLeft(TreeMap.java:2224)
at java.util.TreeMap.fixAfterInsertion(TreeMap.java:2291)
at java.util.TreeMap.put(TreeMap.java:582)
at com.intellij.util.containers.SortedList.addToMap(SortedList.java:49)
at com.intellij.util.containers.SortedList.add(SortedList.java:57)
at ros.integrate.workspace.ROSPackageManagerImpl.sortToLists(ROSPackageManagerImpl.java:125)
at ros.integrate.workspace.ROSPackageManagerImpl.lambda$doBulkFileChangeEvents$1(ROSPackageManagerImpl.java:52)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291)
at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool.helpComplete(ForkJoinPool.java:1870)
at java.util.concurrent.ForkJoinPool.externalHelpComplete(ForkJoinPool.java:2467)
at java.util.concurrent.ForkJoinTask.externalAwaitDone(ForkJoinTask.java:324)
at java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:405)
at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:734)
at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:583)
at ros.integrate.workspace.ROSPackageManagerImpl.doBulkFileChangeEvents(ROSPackageManagerImpl.java:52)
at ros.integrate.workspace.ROSPackageManagerImpl.access$000(ROSPackageManagerImpl.java:18)
at ros.integrate.workspace.ROSPackageManagerImpl$1.after(ROSPackageManagerImpl.java:35)
at sun.reflect.GeneratedMethodAccessor162.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:114)
at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:393)
at com.intellij.util.messages.impl.MessageBusImpl.pumpWaitingBuses(MessageBusImpl.java:354)
at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:343)
at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:318)
at com.intellij.util.messages.impl.MessageBusImpl.access$100(MessageBusImpl.java:29)
at com.intellij.util.messages.impl.MessageBusImpl$1.invoke(MessageBusImpl.java:192)
at com.sun.proxy.$Proxy27.beforeFileContentReload(Unknown Source)
at sun.reflect.GeneratedMethodAccessor386.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.multiCast(FileDocumentManagerImpl.java:142)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.lambda$new$0(FileDocumentManagerImpl.java:122)
at com.sun.proxy.$Proxy27.beforeFileContentReload(Unknown Source)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.fireBeforeFileContentReload(FileDocumentManagerImpl.java:733)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.reloadFromDisk(FileDocumentManagerImpl.java:633)
at com.intellij.openapi.fileEditor.impl.FileDocumentManagerImpl.contentsChanged(FileDocumentManagerImpl.java:622)
at sun.reflect.GeneratedMethodAccessor380.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.util.EventDispatcher.dispatchVoidMethod(EventDispatcher.java:132)
at com.intellij.util.EventDispatcher.access$000(EventDispatcher.java:26)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:90)
at com.sun.proxy.$Proxy23.contentsChanged(Unknown Source)
at com.intellij.openapi.vfs.impl.BulkVirtualFileListenerAdapter.fireAfter(BulkVirtualFileListenerAdapter.java:65)
at com.intellij.openapi.vfs.impl.BulkVirtualFileListenerAdapter.after(BulkVirtualFileListenerAdapter.java:56)
at sun.reflect.GeneratedMethodAccessor162.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.util.messages.impl.MessageBusConnectionImpl.deliverMessage(MessageBusConnectionImpl.java:114)
at com.intellij.util.messages.impl.MessageBusImpl.doPumpMessages(MessageBusImpl.java:393)
at com.intellij.util.messages.impl.MessageBusImpl.pumpWaitingBuses(MessageBusImpl.java:354)
at com.intellij.util.messages.impl.MessageBusImpl.pumpMessages(MessageBusImpl.java:343)
at com.intellij.util.messages.impl.MessageBusImpl.sendMessage(MessageBusImpl.java:320)
at com.intellij.util.messages.impl.MessageBusImpl.access$100(MessageBusImpl.java:29)
at com.intellij.util.messages.impl.MessageBusImpl$1.invoke(MessageBusImpl.java:192)
at com.sun.proxy.$Proxy21.after(Unknown Source)
at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.processEvents(PersistentFSImpl.java:903)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.fireEventsInWriteAction(RefreshSessionImpl.java:199)
at com.intellij.openapi.application.WriteAction.run(WriteAction.java:92)
at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.fireEvents(RefreshSessionImpl.java:186)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:88)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:111)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:435)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:419)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:403)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:741)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:690)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:385)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
I am getting the following error when I attempt to run a Python module
sh -c "echo 'ROS workspace directory: /home/nbro' &&
cd /home/nbro &&
catkin_make &&
echo 'Sourcing /home/nbro:devel:setup.sh' &&
. /home/nbro:devel:setup.sh &&
echo 'Available nodes:' &&
rosnode list &&
echo 'Available topics:' &&
rostopic list &&
echo 'Available services:' &&
rossrv list &&
echo 'Available parameters:' &&
rosparam list &&
roslaunch /home/nbro/Desktop/my_project/my_file.py "
ROS workspace directory: /home/nbro
Base path: /home/nbro
The specified source space "/home/nbro/src" does not exist
which states that the ROS workspace is at /home/nbro
, but it is not there, it is under /home/nbro/catwin_ws
. How can I change these configurations? I know I can change the location of the ROS distribution (in the settings).
Of course, I can solve this issue by simply editing the run configurations in PyCharm so that it uses a Python template and not a ROS Launch file. But is it possible to change this PyCharm default behavior after having installed the ROS Support plugin, so that Python modules are executed as Python modules and not ROS Launch files?
While module dependencies and many other things work very well, For some reason the libraries created do not appear in the project view tab. This is very annoying.
any cought NPEs and IllegalArgumentExceptions in ROS support 0.1.3 will be posted here. Keep in mind that some of them were already solved in preperations for 0.1.4
while upgrading from 0.1.2 to 0.1.3, the file types ROSSrv and ROSAct caused annoying log errors.
While CLion manages fairly well, its a good idea to remove those error logs somehow. Stack trace for the two (and possibly ROSMsg):
ROSAct:
java.lang.Throwable: Incorrect name specified in <fileType>, should be ROSAct, actual ROS Action
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.instantiateFileTypeBean(FileTypeManagerImpl.java:493)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.instantiatePendingFileTypes(FileTypeManagerImpl.java:467)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.getRegisteredFileTypes(FileTypeManagerImpl.java:1262)
at com.intellij.psi.impl.cache.impl.id.IdIndexImpl.getVersion(IdIndexImpl.java:25)
at com.intellij.util.indexing.FileBasedIndexImpl.registerIndexer(FileBasedIndexImpl.java:342)
at com.intellij.util.indexing.FileBasedIndexImpl.access$5300(FileBasedIndexImpl.java:107)
at com.intellij.util.indexing.FileBasedIndexImpl$FileIndexDataInitialization.lambda$initAssociatedDataForExtensions$0(FileBasedIndexImpl.java:2431)
at com.intellij.util.indexing.IndexInfrastructure$DataInitialization.executeNestedInitializationTask(IndexInfrastructure.java:173)
at com.intellij.util.indexing.IndexInfrastructure$DataInitialization.runParallelNestedInitializationTasks(IndexInfrastructure.java:161)
at com.intellij.util.indexing.IndexInfrastructure$DataInitialization.call(IndexInfrastructure.java:122)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:222)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:30)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:201)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:221)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:190)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
ROSSrv:
java.lang.Throwable: Incorrect name specified in <fileType>, should be ROSSrv, actual ROS Srv
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.instantiateFileTypeBean(FileTypeManagerImpl.java:493)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.instantiatePendingFileTypes(FileTypeManagerImpl.java:467)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.getRegisteredFileTypes(FileTypeManagerImpl.java:1262)
at com.intellij.psi.impl.cache.impl.id.IdIndexImpl.getVersion(IdIndexImpl.java:25)
at com.intellij.util.indexing.FileBasedIndexImpl.registerIndexer(FileBasedIndexImpl.java:342)
at com.intellij.util.indexing.FileBasedIndexImpl.access$5300(FileBasedIndexImpl.java:107)
at com.intellij.util.indexing.FileBasedIndexImpl$FileIndexDataInitialization.lambda$initAssociatedDataForExtensions$0(FileBasedIndexImpl.java:2431)
at com.intellij.util.indexing.IndexInfrastructure$DataInitialization.executeNestedInitializationTask(IndexInfrastructure.java:173)
at com.intellij.util.indexing.IndexInfrastructure$DataInitialization.runParallelNestedInitializationTasks(IndexInfrastructure.java:161)
at com.intellij.util.indexing.IndexInfrastructure$DataInitialization.call(IndexInfrastructure.java:122)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:222)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:30)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:201)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:221)
at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:190)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
easy fix via plugin.xml I think
use the langCodeStyleSettingsProvider extension point instead of the simple configurable one.
the markdown navigator plugin has an example for an implentation to base the settings impl off from.
This is a severe bug that causes the main component of the plugin, the package manager (class ROSPackageManager
) to fail in either indexing or in loading the packages it finds.
Please report any instances you encounter this bug, what product you were using (for example CLion 2019.3.4), what version of the plugin you were using, and if possible, the steps you took to get the bug.
In future version of the plugin a tool to detect and report this bug will be added to help solve it.
Information so far:
as expected, some rosdep keys are not packages (for example, cmake, eigen). These need to be tracked using the ROS git, preferably automatically and without relying on commands. If a dependency links to one of these rosdep keys, it should not mark it as an error, somehow.
This is the list of rosdep keys and what they resolve to:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
You can read files directly from the internet or download them per version and read them there,
or try to decipher the .pickle files available on the computer in ~/.ros/rosdep/sources.cache
caching could also be possible.
Feature:
field label snake_case inspection
Background
the standard for ROS message field names (or labels in plugin terms) is snake_case
. Thus, it should be enforced via inspections.
The fix for it would be to convert the name to snake_case
Details
Describe the bug
When autocompleting in a .msg file by choosing an external package then a message in the package, no dependency tag is added the the original .msg file's package.xml.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
in the package's package.xml, a new build dependency tag should be added.
Environment Information:
Describe the bug
Changing workspace/ROS path settings does not modify the respective libraries.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
when the settings for either the workspace or ROS path are changed, the index should update the external libraries with additional roots.
Environment Information:
Additional context
See PR #41 ,Issue #39 , and pre-release v0.1.6b2 as those fixed the model but failed to fix the "change settings" part of the model.
Like the pre-release says, this issue can be solved by deleting the .idea folder and restarting the IDE. Deleting lib files wasn't enough, so figuring out the responsible file could help.
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.