GithubHelp home page GithubHelp logo

utexas-bwi / bwi_common Goto Github PK

View Code? Open in Web Editor NEW
19.0 19.0 32.0 35.54 MB

Common packages and data for BWI projects

Home Page: http://wiki.ros.org/bwi_common

License: Other

CMake 3.59% Shell 0.15% C++ 66.66% Python 16.34% C 0.07% CSS 0.33% HTML 0.71% JavaScript 9.78% Classic ASP 2.37%

bwi_common's People

Contributors

aylish19 avatar bzsinger avatar cottsay avatar fernandezr avatar harely22 avatar jack-oquin avatar jinsoopark-17 avatar jsinapov avatar katiewasnothere avatar kukanani avatar maxsvetlik avatar nickswalker avatar nstiurca avatar pato avatar piyushk avatar rdelfin avatar shihyunlo avatar shiqizhang6 avatar warnellg avatar willxie avatar yuqianjiang avatar zilmano avatar

Stargazers

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

Watchers

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

bwi_common's Issues

bwi_logging: saves log files within the source package

That does not work with binary packages, which are installed read-only.

The usual recommendation for things like this is something like $ROS_HOME/bwi_logging, and if $ROS_HOME is not defined, use ~/.ros instead. The program must check the existence of that directory and create it, if necessary.

Unfortunately, that will cause problems on the robots, with all the users saving log files under their own home directories. I think we'd prefer a single global system directory for them. Relying on every user to define $ROS_HOME appropriately does not seem feasible. So, we probably want to create a directory like /etc/bwi, writeable by the bwi group, in which to store per-robot configuration and logs.

@shiqizhang6: I think you have more important things to do. I'll work on this if you like, although I would need some of your time for explaining how it all fits together. I see the record.launch file that automatically saves the bags, but not when and where frame_recording and get_distance.py are used. There is also an empty src/trajectory_following.cpp, which I plan to delete.

ledcom does not exits

I was having this issue on the fork so I cloned a new bwi common and got this same error

/opt/ros/indigo/share/catkin/cmake/catkin_package.cmake:296 (message):
catkin_package() include dir 'ledcomm' does not exist relative to
'/home/users/nathanforyou/segbot_ws/src/segbot/segbot_led'
Call Stack (most recent call first):
/opt/ros/indigo/share/catkin/cmake/catkin_package.cmake:98 (_catkin_package)
segbot/segbot_led/CMakeLists.txt:14 (catkin_package)

Kinetic: port code base to ROS Kinetic and Ubuntu Xenial

xref: utexas-bwi/bwi#44

The first step is porting bwi_common to the new distro.

The initial problem seems to be a missing dependency, so I'll work on that:

$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
bwi_virtour: Cannot locate rosdep definition for [web_video_server]

Since, web_video_server is not yet released to Kinetic, I'll request that they do that.

fix catkin_lint problems with these packages

Here are the current errors and warnings (ignoring notices):

$ catkin_lint . -W1
bwi_kr_execution: warning: target 'state_tracker' is not installed
bwi_logging: error: build include path 'include' does not exist
bwi_logging: error: unconfigured build_depend on 'nav_msgs'
bwi_logging: error: unconfigured build_depend on 'roscpp'
bwi_logging: error: unconfigured build_depend on 'message_filters'
bwi_logging: error: unconfigured build_depend on 'cv_bridge'
bwi_logging: error: unconfigured build_depend on 'sensor_msgs'
bwi_logging: error: unconfigured build_depend on 'geometry_msgs'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'roscpp'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'sensor_msgs'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'cv_bridge'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'image_transport'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'message_filters'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'nav_msgs'
bwi_logging: CMakeLists.txt(7): error: missing COMPONENTS keyword before 'geometry_msgs'
bwi_msgs: error: message dependency 'std_msgs' is not listed in catkin_package()
bwi_msgs: error: message dependency 'std_msgs' is not listed as run_depend
bwi_rqt_plugins: error: find_package(class_loader) has no REQUIRED option
bwi_rqt_plugins: error: rqt_gui plugin file 'python_plugins.xml' is not installed to ${CATKIN_PACKAGE_SHARE_DESTINATION}
bwi_rqt_plugins: error: rqt_gui plugin file 'cpp_plugins.xml' is not installed to ${CATKIN_PACKAGE_SHARE_DESTINATION}
bwi_rqt_plugins: CMakeLists.txt(31): error: duplicate catkin_package()
bwi_scavenger: CMakeLists.txt(16): warning: use of link_directories() is strongly discouraged
bwi_tasks: warning: target 'simulator_learning_tasks_node' is not installed
bwi_tasks: warning: target 'learning_tasks_node' is not installed
bwi_tools: CMakeLists.txt(15): error: catkin_package() exports non-package include path
stop_base: error: unconfigured build_depend on 'geometry_msgs'
stop_base: error: unconfigured build_depend on 'bwi_msgs'
stop_base: tests/CMakeLists.txt(9): error: duplicate find_package(catkin)
stop_base: tests/CMakeLists.txt(9): error: catkin_package() is called before find_package()
catkin_lint: checked 14 packages and found 29 problems
catkin_lint: 27 notices have been ignored. Use -W2 to see them

bwi_logging: Add ability to log experimental bags

It would be useful if we can add the ability to log extra (experimental and potentially large) topics. Ie: have another parameter to bwi_logging launch file where you can specify an extra set of topics to log, which will be logged with an "extra" prefix, which the upload script can handle accordingly.

This creates a good divide between the small essential logs and any others which may be run on an experiment-basis.

Will also need to update bwi_scripts accordingly

bwi_kr_execution: build failure

[ 27%] Building CXX object bwi_common/bwi_kr_execution/CMakeFiles/kractions.dir/src/actions/LogicalNavigation.cpp.o
In file included from /tmp/test_repositories/src_repository/bwi_common/bwi_kr_execution/src/actions/LogicalNavigation.cpp:1:0:
/tmp/test_repositories/src_repository/bwi_common/bwi_kr_execution/src/actions/LogicalNavigation.h:7:63: fatal error: segbot_logical_translator/LogicalNavigationAction.h: No such file or directory
compilation terminated.

Looks like an add_dependencies() problem.

bwi_scavenger: build fails on Saucy

We don't actually care about Saucy, but it is still supported for ROS Indigo, so the build farm fails as a result. The problem seems to be an incompatible version of yaml-cpp:

/usr/lib/ccache/c++   -DEIGEN_USE_NEW_STDVECTOR -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET -DFLANN_STATIC -DROSCONSOLE_BACKEND_LOG4CXX -DROS_PACKAGE_NAME=\"bwi_scavenger\" -Dqh_QHpointer -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -DNDEBUG -D_FORTIFY_SOURCE=2   -Wno-deprecated -O2 -g -DNDEBUG -I/usr/include/vtk-5.8 -I/usr/include/opencv -I/opt/ros/indigo/include -I/usr/include/eigen3 -I/usr/include/pcl-1.7 -I/usr/include/ni -I/usr/include/qhull    -o CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o -c /tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp: In constructor 'SearchPlanner::SearchPlanner(ros::NodeHandle*, std::string, float)':
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:60:57: error: 'const class YAML::Node' has no member named 'as'
         tmp_pose.pose.position.x = yaml_positions[i][0].as<double>(); 
                                                         ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:60:60: error: expected primary-expression before 'double'
         tmp_pose.pose.position.x = yaml_positions[i][0].as<double>(); 
                                                            ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:60:60: error: expected ';' before 'double'
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:61:57: error: 'const class YAML::Node' has no member named 'as'
         tmp_pose.pose.position.y = yaml_positions[i][1].as<double>(); 
                                                         ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:61:60: error: expected primary-expression before 'double'
         tmp_pose.pose.position.y = yaml_positions[i][1].as<double>(); 
                                                            ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:61:60: error: expected ';' before 'double'
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:62:60: error: 'const class YAML::Node' has no member named 'as'
         tmp_pose.pose.orientation.z = yaml_positions[i][2].as<double>(); 
                                                            ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:62:63: error: expected primary-expression before 'double'
         tmp_pose.pose.orientation.z = yaml_positions[i][2].as<double>(); 
                                                               ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:62:63: error: expected ';' before 'double'
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:63:60: error: 'const class YAML::Node' has no member named 'as'
         tmp_pose.pose.orientation.w = yaml_positions[i][3].as<double>(); 
                                                            ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:63:63: error: expected primary-expression before 'double'
         tmp_pose.pose.orientation.w = yaml_positions[i][3].as<double>(); 
                                                               ^
/tmp/buildd/ros-indigo-bwi-scavenger-0.3.5-0saucy-20150822-2223/src/SearchPlanner.cpp:63:63: error: expected ';' before 'double'
make[4]: *** [CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o] Error 1

Ubuntu Trusty has yaml-cpp 0.5.1, which works. I am still trying to figure out what the problem is with Saucy. It must have an earlier version, but I don't yet know which one.

bwi_kr_execution: broken rosdep on "clingo"

$ rosdep install bwi_kr_execution
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
bwi_kr_execution: Cannot locate rosdep definition for [clingo]

Should this be gringo, instead?

Support other joysticks/button mappings

Unfortunately, joystick_teleop_node is almost unusable with a PS4 controller because axis 3 maps to the left trigger. Also, the emergency stop button maps to X on PS4 controller, although from the comments it seems like it should map to O which is generally PS4's equivalent to Xbox's B button.

I can implement this quickly and easily with an additional ~mapping parameter or such, defaulting to "xbox", but would also accept "ps4".

bwi_scavenger: missing dependency on yaml-cpp

Building the current master on Indigo/Trusty fails:

Linking CXX executable /home/joq/ros/ws/devel/lib/bwi_scavenger/scavenger
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `SearchPlanner::SearchPlanner(ros::NodeHandle*, std::string, float)':
SearchPlanner.cpp:(.text+0xf9): undefined reference to `YAML::LoadFile(std::string const&)'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::memory_holder::create_node()':
SearchPlanner.cpp:(.text._ZN4YAML6detail13memory_holder11create_nodeEv[_ZN4YAML6detail13memory_holder11create_nodeEv]+0x1c): undefined reference to `YAML::detail::memory::create_node()'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::mark_defined()':
SearchPlanner.cpp:(.text._ZN4YAML6detail8node_ref12mark_definedEv[_ZN4YAML6detail8node_ref12mark_definedEv]+0x1c): undefined reference to `YAML::detail::node_data::mark_defined()'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::set_null()':
SearchPlanner.cpp:(.text._ZN4YAML6detail8node_ref8set_nullEv[_ZN4YAML6detail8node_ref8set_nullEv]+0x1c): undefined reference to `YAML::detail::node_data::set_null()'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::set_scalar(std::string const&)':
SearchPlanner.cpp:(.text._ZN4YAML6detail8node_ref10set_scalarERKSs[_ZN4YAML6detail8node_ref10set_scalarERKSs]+0x27): undefined reference to `YAML::detail::node_data::set_scalar(std::string const&)'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node_ref::size() const':
SearchPlanner.cpp:(.text._ZNK4YAML6detail8node_ref4sizeEv[_ZNK4YAML6detail8node_ref4sizeEv]+0x1c): undefined reference to `YAML::detail::node_data::size() const'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::Node::Scalar() const':
SearchPlanner.cpp:(.text._ZNK4YAML4Node6ScalarEv[_ZNK4YAML4Node6ScalarEv]+0x64): undefined reference to `YAML::detail::node_data::empty_scalar'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node& YAML::detail::node_data::get<int>(int const&, boost::shared_ptr<YAML::detail::memory_holder>)':
SearchPlanner.cpp:(.text._ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0xae): undefined reference to `YAML::detail::node_data::convert_to_map(boost::shared_ptr<YAML::detail::memory_holder>)'
SearchPlanner.cpp:(.text._ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data3getIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0x21c): undefined reference to `YAML::detail::node_data::insert_map_pair(YAML::detail::node&, YAML::detail::node&)'
CMakeFiles/scavenger.dir/src/SearchPlanner.cpp.o: In function `YAML::detail::node& YAML::detail::node_data::convert_to_node<int>(int const&, boost::shared_ptr<YAML::detail::memory_holder>)':
SearchPlanner.cpp:(.text._ZN4YAML6detail9node_data15convert_to_nodeIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE[_ZN4YAML6detail9node_data15convert_to_nodeIiEERNS0_4nodeERKT_N5boost10shared_ptrINS0_13memory_holderEEE]+0x56): undefined reference to `YAML::detail::memory_holder::merge(YAML::detail::memory_holder&)'
collect2: error: ld returned 1 exit status
make[2]: *** [/home/joq/ros/ws/devel/lib/bwi_scavenger/scavenger] Error 1
make[1]: *** [CMakeFiles/scavenger.dir/all] Error 2
make: *** [all] Error 2

I believe it needs both build and run dependencies in the package.xml:

  <build_depend>yaml-cpp</build_depend>
  <run_depend>yaml-cpp</run_depend>

In addition, I believe it needs something like this in its CMakeLists.txt:

# Resolve system dependency on yaml-cpp, which apparently does not
# provide a CMake find_package() module.
find_package(PkgConfig REQUIRED)
pkg_check_modules(YAML_CPP REQUIRED yaml-cpp)
find_path(YAML_CPP_INCLUDE_DIR
          NAMES yaml_cpp.h
          PATHS ${YAML_CPP_INCLUDE_DIRS})
find_library(YAML_CPP_LIBRARY
             NAMES YAML_CPP
             PATHS ${YAML_CPP_LIBRARY_DIRS})

I am not absolutely certain about all this. But, the build does fail.

@shiqizhang6, @piyushk: Do you want me to try coming up with a fix?

bwi_logging: need tools to prune captured bags before uploading

The current bag saving interface is documented here. The robot launch scripts will save a few ROS topics (odom, amcl_pose, and diagnostics) to ~/.ros/bwi/bwi_logging for the user running the launch.

These files can get quite large for long runs, which are the ones we are most interested in capturing. Shiqi and I uploaded one yesterday from bender. It was 56MB and had run for only about 12 minutes:

$ rosbag info bwi_2015-12-03-00-00-00.bag 
path:        bwi_2015-12-03-00-00-00.bag
version:     2.0
duration:    12:10s (730s)
start:       Oct 28 2015 15:15:51.96 (1446063351.96)
end:         Oct 28 2015 15:28:02.77 (1446064082.77)
size:        55.9 MB
messages:    76193
compression: none [74/74 chunks]
types:       diagnostic_msgs/DiagnosticArray         [60810da900de1dd6ddd437c3503511da]
             geometry_msgs/PoseWithCovarianceStamped [953b798c0f514ff060a53a3498ce6246]
             nav_msgs/Odometry                       [cd5e73d190d741a2f92e81eda573aca7]
topics:      /diagnostics    2913 msgs    : diagnostic_msgs/DiagnosticArray         (4 connections)
             amcl_pose        195 msgs    : geometry_msgs/PoseWithCovarianceStamped
             odom           73085 msgs    : nav_msgs/Odometry

Most of that is odometry, which is quite a large message published at 100 Hz. I didn't realize it was so frequent. Maybe the amcl_pose, which is a much smaller message at only 0.25 Hz, would suffice for the data we want to gather. That should at least tell us how far the robot went, though maybe not where. If we really need odometry data, we should probably write a node that republishes it on a separate topic once a second or so.

The current upload script copies all the saved bags from its current directory to the ~bwilab/robot/$HOSTNAME directory on nixons-head. By default, it deletes all the files it successfully uploads.

I am somewhat inclined to leave that script alone, and supplement it with tools to remove or mark files as not worth saving on the server. Criteria could include: eliminating data from extremely short runs, checking whether or not the robot actually moved, etc. Changing a file's name prefix from bwi_ to something else would automatically cause the upload script to skip it.

I can think of several ways to go about this, but requirements will probably vary for different users.

@shiqizhang6, @piyushk, @jsinapov, @maxsvetlik: Comments and suggestions?

bwi_scavenger & bwi_kr_execution: broken dependencies on segbot_gui

There are still undeclared dependencies:

$ grep -R segbot_gui bwi_common/
bwi_common/bwi_kr_execution/launch/bwi_turtlebot.launch:  <node name="segbot_gui" pkg="segbot_gui" type="question_dialog_plugin" />
bwi_common/bwi_kr_execution/launch/robot.launch:  <node name="segbot_gui" pkg="segbot_gui" type="question_dialog_plugin" />
bwi_common/bwi_scavenger/src/take_human_input.py:import segbot_gui.srv
bwi_common/bwi_scavenger/src/take_human_input.py:                                segbot_gui.srv.QuestionDialog)
bwi_common/bwi_scavenger/src/take_human_input.py:                                       segbot_gui.srv.QuestionDialog)

These bwi_common packages cannot depend on the segbot repository, because it is packaged at a higher level. Maybe segbot_gui could be moved here (hopefully, with a different name. But, the current packaging is broken.

Related problem, already fixed I think: #29

@piyushk, @shiqizhang6: I am leaving town in the morning and have no more time to work on this. I had already released our four main repositories, but the binary debs are broken until this gets repaired.

bwi_kr_execution: not compatible with newer clingo in Trusty

The Ubuntu Trusty version of clingo no longer supports the --imin and --imax command arguments. That prevents bwi_kr_execution from working on flexo.

There are several possible solutions. Let's use this issue to track work-arounds and solutions.

bwi_virtour: provided scripts need cleanup

For example: serveCertificates.sh assumes the existence of a workspace named ~/catkin_ws_scavenger/ and then goes to a nonexistent subdirectory of bwi_logging, where it attempts to run a python module.

Does that module expect to write files into its current directory? If so, it should be using something like ~/.ros/bwi/bwi_virtour (which it must create, if necessary), similar to the way bwi_logging saves its files.

Also, I have some doubts that startKrExecution.sh is an appropriate way to launch other system components, except maybe as a convenience during development.

bwi_virtour: compile dependency error

/home/travis/catkin_ws/src/bwi_common/bwi_virtour/src/go_to_location_service.cpp:7:32: fatal error: bwi_virtour/Rotate.h: No such file or directory
 #include "bwi_virtour/Rotate.h"
                                ^
compilation terminated.

This looks like an add_dependencies() error. We've been seeing a lot of those.

xref: #63

bwi_kr_execution: upward dependencies on segbot_logical_translator

These are launch file dependencies. They would be caught if the package had a launch check unit test, but it does not. The references are in: bwi_turtlebot_launch and robot.launch.

@piyushk: the segbot_logical_translator appears to be a pure BWI component with no dependency on anything specific to the segbot platform. If so, I recommend moving it to bwi_common and renaming it bwi_logical_translator. The only references I can find are in bwi_launch and here in bwi_kr_execution.

bwi_logging: upload script fails when robot subdirectory on the server does not exist

Instead of copying the logs to the ~bwilab/robot/$HOSTNAME directory on nixons-head, it copies the bag file to the directory name if a directory for that robot does not already exist. It needs to create the directory in that case, then copy the files into it.

Also, the README documentation for that script erroneously calls that directory ~bwilab/host/$HOSTNAME instead of ~bwilab/robot/$HOSTNAME.

cc: @shiqizhang6

bwi_web: unit test failure

On Indigo, I see the following failure:

checking /home/joq/ros/ws/src/bwi_common/bwi_web/launch/webserver.launch
...writing test results to /home/joq/ros/ws/build/bwi_web/test_results/bwi_web/roslaunch-check_launch.xml
FAILURE:
[/home/joq/ros/ws/src/bwi_common/bwi_web/launch/webserver.launch]:
    cannot find node [rosapi] in package [rosapi]

Looks like the node name should be rosapi_node instead of rosapi. That's easy to fix, but I don't know how to test this package.

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.