Code Monkey home page Code Monkey logo

thingsboard-udp-loadbalancer's Introduction

ThingsBoard UDP Load Balancer

The Load Balancer is designed to support popular CoAP and LwM2M use-cases, where the main priority is to maintain the route table between clients and servers.

Building from sources

Build scripts require Linux based OS and the following packages to be installed:

  • Ubuntu 16.04+
  • CentOS 7.1+
  • Java 11
  • Maven 3.1.0+

Build

After you've downloaded the code from GitHub, you can build it using Maven:

mvn clean install

Build artifacts

You can find debian, rpm and windows packages in the target folder:

application/target

Build local docker images and publish

  1. Change the repository name in the msa/pom.xml file.
  2. Execute the following command: mvn clean install -Ddockerfile.skip=false -Dpush-docker-image=true

thingsboard-udp-loadbalancer's People

Contributors

ashvayka avatar yevhenbondarenko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

thingsboard-udp-loadbalancer's Issues

.deb systemd service fails to initialize due to logger

When trying to run the load balancer through the systemd service, I am met with a handful of exceptions in my journalctl logs, and the app crashes.

$ sudo systemctl start tb-udp-lb

Nov 30 13:55:31 workhorse04 systemd[1]: Started tb-udp-lb.
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,655 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,656 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,657 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/usr/share/tb-udp-lb/conf/logback.xml]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,795 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,797 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,814 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [fileLogAppender]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,835 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@157456214 - setting totalSizeCap to 3 GB
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,839 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@157456214 - Archive files will be limited to [100 MB] each.
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,884 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@157456214 - No compression will be used
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,886 |-INFO in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@157456214 - Will use the pattern /var/log/tb-udp-lb/tb-udp-lb.%d{yyyy-MM-dd}.%i.log for the active file
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,889 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@62ee68d8 - The date pattern is 'yyyy-MM-dd' from file name pattern '/var/log/tb-udp-lb/tb-udp-lb.%d{yyyy-MM-dd}.%i.log'.
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,889 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@62ee68d8 - Roll-over at midnight.
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,898 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@62ee68d8 - Setting initial period to Fri Nov 12 18:58:10 UTC 2021
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,902 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,928 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[fileLogAppender] - Active log file name: /var/log/tb-udp-lb/tb-udp-lb.log
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,928 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[fileLogAppender] - File property is set to [/var/log/tb-udp-lb/tb-udp-lb.log]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,930 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[fileLogAppender] - openFile(/var/log/tb-udp-lb/tb-udp-lb.log,true) call failed. java.io.FileNotFoundException: /var/log/tb-udp-lb/tb-udp-lb.log (Permission denied)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at java.io.FileNotFoundException: /var/log/tb-udp-lb/tb-udp-lb.log (Permission denied)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/java.io.FileOutputStream.open0(Native Method)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/java.io.FileOutputStream.open(FileOutputStream.java:298)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:237)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.FileAppender.openFile(FileAppender.java:204)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.FileAppender.start(FileAppender.java:127)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:100)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.slf4j.LoggerFactory.bind(LoggerFactory.java:129)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:108)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:302)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:196)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.thingsboard.server.udp.ThingsboardUdpLbApplication.main(ThingsboardUdpLbApplication.java:39)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]:         at         at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,931 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.thingsboard.server.udp] to INFO
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,931 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,931 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [fileLogAppender] to Logger[ROOT]
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,932 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
Nov 30 13:55:31 workhorse04 tb-udp-lb.jar[58721]: 13:55:31,932 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@4520ebad - Registering current configuration as safe fallback point
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]: Exception in thread "main" java.lang.reflect.InvocationTargetException
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]: Caused by: java.lang.IllegalStateException: Logback configuration error detected:
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]: ERROR in ch.qos.logback.core.rolling.RollingFileAppender[fileLogAppender] - openFile(/var/log/tb-udp-lb/tb-udp-lb.log,true) call failed. java.io.FileNotFoundException: /var/log/tb-udp-lb/tb-udp-lb.log (Permission denied)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.logging.logback.LogbackLoggingSystem.reinitialize(LogbackLoggingSystem.java:222)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:73)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:118)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:306)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:281)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:239)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:80)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:342)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.SpringApplication.run(SpringApplication.java:1247)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.springframework.boot.SpringApplication.run(SpringApplication.java:1236)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         at org.thingsboard.server.udp.ThingsboardUdpLbApplication.main(ThingsboardUdpLbApplication.java:39)
Nov 30 13:55:32 workhorse04 tb-udp-lb.jar[58721]:         ... 8 more
Nov 30 13:55:32 workhorse04 systemd[1]: tb-udp-lb.service: Main process exited, code=exited, status=1/FAILURE
Nov 30 13:55:32 workhorse04 systemd[1]: tb-udp-lb.service: Failed with result 'exit-code'.

I'm willing to bet that it's caused by root owning the logs. Not 100% sure how that happened, could be my bad.

wilnil@workhorse04:/var/log/tb-udp-lb$ ls -la
total 48
drwxr-xr-x 1 thingsboard thingsboard    86 Nov 30 13:55 .
drwxrwxr-x 1 root        syslog        698 Nov 30 00:00 ..
-rw-r--r-- 1 thingsboard thingsboard  5651 Nov 30 13:55 gc.log
-rw-rw-r-- 1 thingsboard thingsboard  2148 Nov 12 18:20 gc.log.0
-rw-r--r-- 1 root        root        22709 Nov 12 18:58 gc.log.1
-rw-r--r-- 1 thingsboard thingsboard  5745 Nov 30 13:50 gc.log.2
-rw-r--r-- 1 root        root         1278 Nov 12 18:58 tb-udp-lb.log

chowning the file back to thingsboard:thingsboard seems to resolve the issue.

System info

Linux: Ubuntu 20.04.2 LTS
Version: 1c04689941ee556c359e299dee1099377e36c348

Add build instructions?

I am very much not a Java person, but I'd like to try out this LB. I see that it uses Gradle, but I can't get it to build with a Debian container. I get errors about a specific plugin:

root@72b2178f2f9d:/thingsboard-udp-loadbalancer/packaging/java# gradle

...

FAILURE: Build failed with an exception.

* Where:
Build file '/thingsboard-udp-loadbalancer/packaging/java/build.gradle' line: 30

* What went wrong:
A problem occurred evaluating root project 'java'.
> Failed to apply plugin [class 'com.netflix.gradle.plugins.rpm.RpmPlugin']
   > No signature of method: org.gradle.api.internal.tasks.RealizableTaskCollection.configureEach() is applicable for argument types: (com.netflix.gradle.plugins.rpm.RpmPlugin$1) values: [com.netflix.gradle.plugins.rpm.RpmPlugin$1@4a0fee]

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 6s

Which I think is the fault of the Gradle version that the Debian container can access:

------------------------------------------------------------
Gradle 4.4.1
------------------------------------------------------------

Build time:   2012-12-21 00:00:00 UTC
Revision:     none

Groovy:       2.4.21
Ant:          Apache Ant(TM) version 1.10.9 compiled on December 25 1969
JVM:          11.0.13 (Debian 11.0.13+8-post-Debian-1deb11u1)
OS:           Linux 5.11.0-38-generic amd64

I also tried the official gradle image: https://hub.docker.com/_/gradle
But got another error:

root@1a46cfa0d006:/home/gradle/thingsboard-udp-loadbalancer/packaging/java# gradle

FAILURE: Build failed with an exception.

* Where:
Build file '/home/gradle/thingsboard-udp-loadbalancer/packaging/java/build.gradle' line: 32

* What went wrong:
A problem occurred evaluating root project 'java'.
> Could not get unknown property 'projectBuildDir' for root project 'java' of type org.gradle.api.Project.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 1s

root@1a46cfa0d006:/home/gradle/thingsboard-udp-loadbalancer/packaging/java# gradle --version

------------------------------------------------------------
Gradle 7.2
------------------------------------------------------------

Build time:   2021-08-17 09:59:03 UTC
Revision:     a773786b58bb28710e3dc96c4d1a7063628952ad

Kotlin:       1.5.21
Groovy:       3.0.8
Ant:          Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM:          17.0.1 (Eclipse Adoptium 17.0.1+12)
OS:           Linux 5.11.0-38-generic amd64

Which brings me to my issue:
How are you supposed to build this project?

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.