Git Product home page Git Product logo

semux-core's Introduction

Semux Core

Build Status Build status Crowdin

What is Semux

Semux is an experimental high-performance blockchain platform that powers decentralized application. It's written purely in Java and powered by Semux BFT consensus algorithm.

More info can be found at our Documentation page.

Get started

  1. Download the Latest Release and unpack it to a desired directory.
  2. Run semux-gui.bat if you're on Windows, or ./semux-gui.sh if you're on Linux or macOS.
  3. (Windows user) You may need to install Microsoft Visual C++ 2012 Redistributable Package (x64).

Build from source

Prerequisites:

OpenJDK 11
Apache Maven 3.5.2

Build:

git clone https://github.com/semuxproject/semux-core
cd semux
mvn install -DskipTests

Run:

./dist/linux/semux-cli.sh

Contribute

Anyone is welcome to contribute to this open source project in the form of peer review, testing and patches. Please see the contributing guide for more details.

If you find a bug, please submit it to issues.

Wallet Localization

If you want to add new language, review/update existing translation or help to finish specific translations, you can join and do that by following link: https://crowdin.com/project/semux-core

License

The MIT License

semux-core's People

Contributors

cryptokat avatar dependabot[bot] avatar honeycrypto avatar kaar2 avatar mdodong avatar orogvany avatar pelenthium avatar phash avatar semuxgo avatar testzcrypto avatar victorx716 avatar witoldsz avatar

Stargazers

 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  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  avatar  avatar  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

semux-core's Issues

Allow 'delegating' a delegate or delegate rename

There were old open issues requesting the ability to do more with a delegate.

  1. allow option to rename delegate for lower fee
  2. Allow for 'delegating' a delegate to another address.

This would allow for someone who has done a burn to 'rent out' their validator without key compromise.
It would also permit running a validator safely on commodity hardware without risking the private key of the burn.

However, it does reduce the purpose of the 1k burn, where it should not be done lightly. Being able to delegate to another address or rename would make it more difficult to blacklist malicious validators, or would reduce cost of attack if one could rent validators for purposes of poor use.

Show recent validator stats

As time goes on, the delegates 'rate' column becomes meaningless.

It would be ideal if this allowed validators/voters to see recent statistics, so a validator can tell when they are failing forges, and voters can see recent pool rates.

We should show forging rate over last ~week, either replacing or adding an additional column

Bug with password

System information

Semux version: semux-macos-1.3.0-8b4f140

OS & Version: macOS 10.13.6

Expected behaviour

I have a problem with the purse on the macos wallet, it accepts, it does not accept the password.

Actual behaviour

Sometimes you need to enter your password several times to enter the wallet. Last time I entered the password 6 times. This problem also exists when changing the password

Steps to reproduce the behaviour

  1. Open semux.jar
  2. Entering the password (several times) if it is written that the password is incorrect.

Add support for client VM use

This is mostly a tracking story for what we need to do to support VM development.

It seems like we'll want to support web3j interfaces for compatibility with eth development, so a user can just point at semux for local calls.

Not sure exactly what best path forward is here.

Semux Unicode Folder Problem

I copied my semux folder and put a different name to it with unicode.

2018-07-17_19-23-26

After i started the semux wallet in the new folder, it started to synchronize from the beginning but there was a database folder in it.

So i checked and see, it opened a new folder and create a new database in it.

2018-07-17_19-24-59

Operation system: Windows 10 / 64bit Turkish

Split the `Config` into `Specs` and `Config`

I would suggest we split the Config into specs and configurations.

  • Specs refers to anything that is enforced by protocol and is not allowed to change in order to reach consensus;
  • Config refers to parameters which can be fine-tuned from the client side for local conditions.

API changes backlog

A place holder for any future API changes, which may break compatibility.

Add more possibility for debug.log

Semux.log expecially with a validator account take a lot of space, add a posssibility to select what wallet need to write on debug file.
--logerror = only errors for example
--logauto = auto delete semux.log after a n time
etc etc

ERC20 standard support in wallet

We should support ERC20 or a modified set of that plus the ERC for contract method inspection.

This should work within the UI eventually.

Add context menu for the receive panel

The receive panel is not very user friendly; most of operations take too many steps. We may consider adding context menu to the table cells, so that we can quickly delete/copy/rename accounts.

Add developer tab on semux gui

System information

Semux version: v1.3.0

OS & Version: Windows 10, Windows 7, Ubuntu 16.04, macOS 10.12.6

Expected behaviour

Add dropdown to show devoper/advanced option
this will show tab to enable running on testnet, saving wallet password on semux.properties, setting API user and password

with a save button to update the semux.properties, create semux-cli launcher etc. that will apply the next time semux is launched, offer restart semux using the new saved options

Actual behaviour

Running testnet requires running on cli which many are not comfortable doing,
API and other option on semux.properties requires a bit of editing and not the most convenient option

semux hd wallet

windows 10 64bit
java 64bit

from debug.log

Failed to add PDH Counter: \Memoria\Input pagine/sec, Error code: 0xC0000BB8
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to add PDH Counter: \Memoria\Output pagine/sec, Error code: 0xC0000BB8
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to add PDH Counter: \File di paging(_Total)% In uso, Error code: 0xC0000BB8
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to update counters. Error code: 0x800007D5
2018-10-31T16:05:15+0100 WARN PerfDataUtil Failed to get counter. Error code: 0xC0000BBC
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to update counters. Error code: 0x800007D5
2018-10-31T16:05:15+0100 WARN PerfDataUtil Failed to get counter. Error code: 0xC0000BBC
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to update counters. Error code: 0x800007D5
2018-10-31T16:05:15+0100 WARN PerfDataUtil Failed to get counter. Error code: 0xC0000BBC
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to update counters. Error code: 0x800007D5
2018-10-31T16:05:15+0100 WARN PerfDataUtil Failed to get counter. Error code: 0xC0000BBC
2018-10-31T16:05:15+0100 ERROR PerfDataUtil Failed to update counters. Error code: 0x800007D5
2018-10-31T16:05:15+0100 WARN PerfDataUtil Failed to get counter. Error code: 0xC0000BBC

Support web3j for VM calls

In order to function easily with the wide variety of existing development tools for VM, we should probably support the web3j API for semux.

HD wallet creation should be on welcome screen

HD wallet creation/import should be on welcome screen.

We also need to decide on some text to show what it is, and what to do with it.

It's unclear right now that the HD key password can be different than main wallet password.

Can't open semux_1.3.0 on MacOS

Hi,

i got the error on MacOS 10.13.6

err:
"Main class semux-macos-1.3.0-8b4f140.resources.splash.png could not be found or could not be loaded"
image

Inability to sync without connection to original validator

in semuxBft,

 // Pick 2/3th active validator's height as sync target. The sync will not be
            // started if there are less than 2 active validators.
            OptionalLong target = activeValidators.stream()
                    .mapToLong(c -> c.getRemotePeer().getLatestBlockNumber() + 1)
                    .sorted()
                    .limit((int) Math.floor(activeValidators.size() * 2.0 / 3.0))
                    .max();

            if (target.isPresent() && target.getAsLong() > height) {
                sync(target.getAsLong());
            }

if a user is syncing from scratch and cannot connect directly to one of the main original seed nodes, they cannot sync. We should not need to get the height from one of main validators if we are not ourselves a validator.

Allow configuration of semux.properties file from the client

I tried enabling the API through the properties file but it had no effect. Turns out there was a non readable character which caused an error when this entry was evaluated. Made me thinking it would be nice if there was an option to edit properties from the client, instead of editing the file directly. This would prevent such errors, and we can also add sanity checks to make sure the entered values make sense.

Faster syncing

After PR #4, the main thing that stops us from even faster syncing is bandwidth usage, where the main breakdown is validator signatures.

Proposed changes:

  1. Update the p2p protocol to enable transferring blocks without signatures.
  2. Only store signatures of one block per validator set update.

Semux website/BTT issue

Hi!

It was announced in Semux twitter that ETH airdrops will be closed on 18-Aug-2018. However, in BTT and Semux website ETH airdrop is still in progress. So it should be corrected. It is not a bug but corrective action that should be applied.

Regards,
GFE

Number of connections being miscounted

The seed nodes stopped accepting new connection, and reports TOO_MANY_PEERS error even though there are less than 1024 connections. I suspect active connection set is not properly managed.

h256 native Implementation differs from MessageDigest

creating a raw transaction and having nativ sodium support disabled, will result in hashes, that cannot be verified by the hash#256 method

disabling native support on the node will accept the signed transaction!

Create a raw TX from Hash (composed via swagger ui)

 val raw =  "0x00031409c5f2794d69717d538bfcc150644f7685945cfa00000002540be40000000000004c4b40000000000000000100000165c4f4f54700"
        val key = Key()
        val tx = Transaction.fromEncoded(Hex.decode0x(raw))
tx.verify() //true -

Sending this to a local wallet Swagger UI will result in INVALID_FORMAT

disabling native support in Hash#256 accepts the message

rawTX: 0x20864cf9222ec6bd9930e73da1e03efa2a8e0f85b0accc46b4fdca83270854afd63800031409c5f2794d69717d538bfcc150644f7685945cfa00000002540be40000000000004c4b40000000000000000100000165c4f4f5470060d08289d37d86328282ecce95a4917fe8d6173c9e3990afec88cf59a2d95ab842595d5def3d4d724d2b8326306f622180747c0fee7e03c79c2c8defa14ed73b09db7002d5896e2fa3f53d2ba20602bd5d40980e1b9c1ad6a8b185fc2a8501517d

if you felt this is helpful, my wallet would be happy gaining some SEM :)

Error: Corruption: not an sstable (bad magic number)

Semux/v1.2.0-cba85a7/Windows/amd64
OS: name = Microsoft Windows 10 build 17134
Java: version = 10.0.1, xmx = 10830 MB

2018-06-23T12:26:03-0700 INFO     SemuxSync        Syncing started, best known block = 427568
2018-06-23T12:26:04-0700 ERROR    SemuxGui         Uncaught exception during kernel startup.
org.iq80.leveldb.DBException: Corruption: not an sstable (bad magic number)
	at org.fusesource.leveldbjni.internal.JniDB.get(JniDB.java:90) ~[semux.exe:cba85a7]
	at org.fusesource.leveldbjni.internal.JniDB.get(JniDB.java:77) ~[semux.exe:cba85a7]
	at org.semux.db.LeveldbDatabase.get(LeveldbDatabase.java:119) ~[semux.exe:cba85a7]
	at org.semux.core.BlockchainImpl.getTransaction(BlockchainImpl.java:288) ~[semux.exe:cba85a7]
	at org.semux.core.BlockchainImpl.getTransactions(BlockchainImpl.java:469) ~[semux.exe:cba85a7]
	at org.semux.gui.SemuxGui.updateModel(SemuxGui.java:462) ~[semux.exe:cba85a7]
	at org.semux.gui.SemuxGui.startKernelAndMain(SemuxGui.java:331) ~[semux.exe:cba85a7]
	at org.semux.gui.SemuxGui.setupCoinbase(SemuxGui.java:299) [semux.exe:cba85a7]
	at org.semux.gui.SemuxGui.start(SemuxGui.java:191) [semux.exe:cba85a7]
	at org.semux.gui.SemuxGui.main(SemuxGui.java:103) [semux.exe:cba85a7]
Caused by: org.fusesource.leveldbjni.internal.NativeDB$DBException: Corruption: not an sstable (bad magic number)
	at org.fusesource.leveldbjni.internal.NativeDB.get(NativeDB.java:316) ~[semux.exe:cba85a7]
	at org.fusesource.leveldbjni.internal.NativeDB.get(NativeDB.java:300) ~[semux.exe:cba85a7]
	at org.fusesource.leveldbjni.internal.NativeDB.get(NativeDB.java:293) ~[semux.exe:cba85a7]
	at org.fusesource.leveldbjni.internal.JniDB.get(JniDB.java:85) ~[semux.exe:cba85a7]
	... 9 more
2018-06-23T12:26:04-0700 INFO     Launcher         Shutting down pubsub-default
2018-06-23T12:26:04-0700 INFO     PubSub           PubSub service stopped

Error running semux-cli.sh build version 80cc764.

Error when running semux-cli.sh:

Unrecognized option: --add-opens=java.base/sun.net.dns=ALL-UNNAMED
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Java 1.8
CentOS 7
maven 3.5.2

AtkWrapper not found

Hi there,

System information

Semux version: 1.4.0 (github clone)

OS & Version: Linux Mint 19

Expected behaviour

Gui starts

Actual behaviour

GUI does not start. Error message:
Exception in thread "main" java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper at java.desktop/java.awt.Toolkit.newAWTError(Toolkit.java:472) at java.desktop/java.awt.Toolkit.fallbackToLoadClassForAT(Toolkit.java:488) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1608) 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 java.desktop/java.awt.Toolkit.loadAssistiveTechnologies(Toolkit.java:532) at java.desktop/java.awt.Toolkit.getDefaultToolkit(Toolkit.java:613) at java.desktop/java.awt.Window.getToolkit(Window.java:1375) at java.desktop/java.awt.Window.init(Window.java:518) at java.desktop/java.awt.Window.<init>(Window.java:549) at java.desktop/java.awt.Frame.<init>(Frame.java:423) at java.desktop/java.awt.Frame.<init>(Frame.java:388) at java.desktop/javax.swing.JFrame.<init>(JFrame.java:180) at org.semux.gui.WelcomeFrame.<init>(WelcomeFrame.java:59) at org.semux.gui.SemuxGui.showWelcome(SemuxGui.java:225) at org.semux.gui.SemuxGui.start(SemuxGui.java:192) at org.semux.gui.SemuxGui.main(SemuxGui.java:110) Caused by: java.lang.ClassNotFoundException: org.GNOME.Accessibility.AtkWrapper at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:374) at java.desktop/java.awt.Toolkit.fallbackToLoadClassForAT(Toolkit.java:485)

Steps to reproduce the behaviour

Try to run it on newer Ubuntu distributions with JDK10

stated as a bug here: https://bugs.openjdk.java.net/browse/JDK-8204862

Implement the Kernel-VM facade interface

Depends on #53

To fully integrate EVM into Semux, the database/core layers need to be refactored to implemented the facade interfaces specified in the vm.client package. Thereafter, the VM can read real data from and write data back to the Semux blockchain.

P2P: the FAST_SYNC protocol

It takes too long to do a full sync. I'd propose to introduce a faster syncing protocol:

  • Update the p2p protocol to enable transferring selected parts of block;
  • Prune signatures.

SEMUX HD WALLET

features:
add a button for auto copy on clipboard the phrase seed.
add also a possibility to use the right click of the mouse for copy the seed.
or add a button fo save the seed on a text file

Pick EVM implementations

We need to pick which EVM implementation to integrate into Semux.

Originally, we wanted to link the evmjit via JNI. Great progress has been made; the challenging part is that it takes evmjit a lot of time in compiling the code while execution is much faster.

Alternatively, I'm considering the Java implementation of the EVM as well. Non-trivial work will be required to make it work, because it's not standalone.

"Invalid block header" errors due to incorrect timestamps of previous validator.

Semux version: 1.2.0
OS & Version: Ubuntu 16.04 / 18.04, macOS 10.13.4
Java: 8 or 10

My validator started getting "invalid block header" warnings (errors, really) during a block proposal, resulting in failures to forge blocks. I added some debug messages and found that the cause was the proposed block's timestamp check failure, resulting from an incorrect timestamp of the block forged by the validator before mine.

In SemuxBft.validateBlock(), right before if (!Block.validateHeader()), I added:

logger.info("Time check: prev {}, current {} (delta: {})", latest.getHeader().getTimestamp(), header.getTimestamp(), header.getTimestamp() - latest.getHeader().getTimestamp());

Normally, I would see deltas of about 30 sec, but the validator before me consistently had 60 sec deltas. However, the actual time between his block and the block previous to his was still at the regular 30 sec interval. So for my validator, this resulted in the delta for my block's timestamp to be a small negative value, causing the block validation failure.

There are currently several validators with block timestamp deltas over 30 (+/-) seconds. semux666 is the validator that reports about 60 seconds, and that causes consistent failures to forge for whoever comes after him. Additionally, there are deltas in the range of 40-50 seconds for some other validators. As long as a delta is less than 60 seconds, a validator that follows is still able to forge blocks successfully.

Here's an example log, with bolded lines for the culprit and the victim:


2018-06-10T14:08:47-0400 INFO SemuxBft Entered new_height: height = 390863, # validators = 100
2018-06-10T14:08:50-0400 INFO SemuxBft Entered propose: height = 390863, view = 0, primary = false, # connected validators = 1 + 78
2018-06-10T14:09:02-0400 INFO SemuxBft Entered validate: proposal = true, votes = [4, 0] [0, 0] [0, 0]
2018-06-10T14:09:02-0400 INFO SemuxBft Time check: prev 1528654101516, current 1528654130198 (delta: 28682)
2018-06-10T14:09:08-0400 INFO SemuxBft Entered pre_commit: proposal = true, votes = [98, 0] [3, 0] [0, 0]
2018-06-10T14:09:14-0400 INFO SemuxBft Entered commit: proposal = true, votes = [98, 0] [98, 0] [4, 0]
2018-06-10T14:09:14-0400 INFO SemuxBft Entered finalize: proposal = true, votes = [98, 0] [98, 0] [67, 0]
2018-06-10T14:09:14-0400 INFO SemuxBft Block [number = 390863, view = 0, hash = 6aec8cfa86057310b2a43f8f5fe0925376cf1843759a863734d97c1cec476280, # txs = 0, # votes = 98]
2018-06-10T14:09:17-0400 INFO SemuxBft Entered new_height: height = 390864, # validators = 100
2018-06-10T14:09:20-0400 INFO SemuxBft Entered propose: height = 390864, view = 0, primary = false, # connected validators = 1 + 79
2018-06-10T14:09:32-0400 INFO SemuxBft Entered validate: proposal = true, votes = [3, 0] [0, 0] [0, 0]
2018-06-10T14:09:32-0400 INFO SemuxBft Time check: prev 1528654130198, current 1528654191065 (delta: 60867)
2018-06-10T14:09:38-0400 INFO SemuxBft Entered pre_commit: proposal = true, votes = [98, 0] [2, 0] [0, 0]
2018-06-10T14:09:44-0400 INFO SemuxBft Entered commit: proposal = true, votes = [98, 0] [98, 0] [3, 0]
2018-06-10T14:09:44-0400 INFO SemuxBft Entered finalize: proposal = true, votes = [98, 0] [98, 0] [67, 0]
2018-06-10T14:09:44-0400 INFO SemuxBft Block [number = 390864, view = 0, hash = d4d06b61b845e049f80ece7437135be50341aceb4cac0788fc4c1db9b308da69, # txs = 0, # votes = 98]
2018-06-10T14:09:47-0400 INFO SemuxBft Entered new_height: height = 390865, # validators = 100
2018-06-10T14:09:50-0400 INFO SemuxBft Entered propose: height = 390865, view = 0, primary = true, # connected validators = 1 + 80
2018-06-10T14:10:02-0400 INFO SemuxBft Entered validate: proposal = true, votes = [0, 2] [0, 0] [0, 0]
2018-06-10T14:10:02-0400 INFO SemuxBft Time check: prev 1528654191065, current 1528654190505 (delta: -560)
2018-06-10T14:10:02-0400 WARN SemuxBft Invalid block header
2018-06-10T14:10:08-0400 INFO SemuxBft Entered pre_commit: proposal = true, votes = [0, 98] [0, 4] [0, 0]
2018-06-10T14:10:14-0400 INFO SemuxBft Entered propose: height = 390865, view = 1, primary = false, # connected validators = 1 + 81
2018-06-10T14:10:26-0400 INFO SemuxBft Entered validate: proposal = true, votes = [2, 0] [0, 0] [0, 0]
2018-06-10T14:10:26-0400 INFO SemuxBft Time check: prev 1528654191065, current 1528654214503 (delta: 23438)
2018-06-10T14:10:32-0400 INFO SemuxBft Entered pre_commit: proposal = true, votes = [98, 0] [4, 0] [0, 0]
2018-06-10T14:10:38-0400 INFO SemuxBft Entered commit: proposal = true, votes = [98, 0] [98, 0] [4, 0]
2018-06-10T14:10:38-0400 INFO SemuxBft Entered finalize: proposal = true, votes = [98, 0] [98, 0] [67, 0]
2018-06-10T14:10:38-0400 INFO SemuxBft Block [number = 390865, view = 1, hash = 78e48571d5ffdf4ecba0231a2c2dc7f9e1f12a5fc794f9417f715b5bf11bfc4c, # txs = 0, # votes = 98]
2018-06-10T14:10:41-0400 INFO SemuxBft Entered new_height: height = 390866, # validators = 100

Add "is delegate node" to wallet options

When you are running a delegate node, and you export the key, and import this key to a local wallet, the behaviour of these nodes can be dangerous.

e.g.
Delegate Node running on a server with fixed IP
Local Wallet running on a PC with dynamic IP

both share the same private key (the delegate key)

what exactly happens?
Can we have a switch "delegate node" to be activated, when running a delegate node? Or vice versa, disable being a delegate node on the local wallet?

Add support for VPN/Proxies

Our current IP lookup mechanism is known to fail with proxies or VPNs.

The user is forced to use setting declared_ip.

It would be nice if we could recognize this case and handle it better.

Console window does not support parameters with spaces/quotes

As you can use the API to create/interact with items requiring spaces (signMessage, etc)
The console window should support tokenizing based on quoted blocks of text

We should also support escaped quotes, so signMessage "hello \"world\"" should parse

Mechanism for pruning poor validators

Recreating some of the issues from the old repo.

If a validator with votes currently goes down, this affects the network at some critical mass.

Should we implement a mechanism where if a validator does not forge/vote successively, we remove them from the pool?

Pro
Keep all active validators healthy

Con
They still have stake in network, so removing them may be unfair
Adds an additional abuse vector, if one can cause next validator to fail forge, they can get them removed.

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.