Comments (14)
Falko has an interesting work around here (see the 'Standalone' section at the end of the README):
https://github.com/friemen/async-ui
from fn-fx.
Also Nightcode seems to compile to an uberjar without the process hanging but this may be due to using boot rather than Leiningen.
from fn-fx.
I managed to get the application starting correctly with lein run
and from an uberjar with the approach described here: https://gist.github.com/dfletcher/441295a027b8c983192f
However, when I close the (last) window of the application, the Java process does not quit but hangs and needs to be killed. This only happens when I require a fn-fx
namespace, once I remove that require the process exits as expected.
Is anyone aware of a solution to that or know what might be causing it?
Looking at the threads, I found a ScheduledService Delay Timer
which is present when requiring fn-fx
and not when removing the require
. Not sure if this has anything to do with the misbehavior.
from fn-fx.
@paulrd are you referring to the compilation or running the Uberjar? My issues is only when running it (I managed to get the compilation working).
from fn-fx.
Here is a threaddump from VisualVM:
2017-01-18 17:03:18
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode):
"RMI TCP Connection(8)-10.3.200.152" #27 daemon prio=9 os_prio=31 tid=0x00007fd8cb213000 nid=0x9f33 in Object.wait() [0x000070000755e000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000772ba5830> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer)
at com.sun.jmx.remote.internal.ArrayNotificationBuffer.fetchNotifications(ArrayNotificationBuffer.java:449)
- locked <0x0000000772ba5830> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer)
at com.sun.jmx.remote.internal.ArrayNotificationBuffer$ShareBuffer.fetchNotifications(ArrayNotificationBuffer.java:227)
at com.sun.jmx.remote.internal.ServerNotifForwarder.fetchNotifs(ServerNotifForwarder.java:274)
at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1270)
at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1268)
at javax.management.remote.rmi.RMIConnectionImpl.fetchNotifications(RMIConnectionImpl.java:1274)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$106/1328257420.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- <0x000000076bd71848> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"JMX server connection timeout 26" #26 daemon prio=9 os_prio=31 tid=0x00007fd8cb215000 nid=0xda1f in Object.wait() [0x000070000745e000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076bcdde30> (a [I)
at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168)
- locked <0x000000076bcdde30> (a [I)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"RMI TCP Connection(7)-10.3.200.152" #22 daemon prio=9 os_prio=31 tid=0x00007fd8caa9d000 nid=0xfa07 runnable [0x000070000735a000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
- locked <0x000000076ae48da0> (a java.io.BufferedInputStream)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:550)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$106/1328257420.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- <0x0000000772ba4a08> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"RMI Scheduler(0)" #20 daemon prio=9 os_prio=31 tid=0x00007fd8ca395000 nid=0x1207 waiting on condition [0x00007000070d2000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000772bfaf48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"RMI TCP Accept-0" #18 daemon prio=9 os_prio=31 tid=0x00007fd8ca3a6800 nid=0x100b runnable [0x0000700005984000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:400)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:372)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"Attach Listener" #17 daemon prio=9 os_prio=31 tid=0x00007fd8caa5f800 nid=0xf547 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JavaFX-Launcher" #16 prio=5 os_prio=31 tid=0x00007fd8c6b54800 nid=0xcb03 waiting on condition [0x0000700006dc9000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000772b94390> (a java.util.concurrent.CountDownLatch$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:873)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
at com.sun.javafx.application.LauncherImpl$$Lambda$93/1642360923.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"ScheduledService Delay Timer" #15 daemon prio=5 os_prio=31 tid=0x00007fd8c62d8000 nid=0xb91b in Object.wait() [0x0000700006cc6000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000772ba3b60> (a java.util.TaskQueue)
at java.lang.Object.wait(Object.java:502)
at java.util.TimerThread.mainLoop(Timer.java:526)
- locked <0x0000000772ba3b60> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)
Locked ownable synchronizers:
- None
"Thread-3" #13 daemon prio=5 os_prio=31 tid=0x00007fd8c5964800 nid=0x9003 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JavaFX Application Thread" #12 prio=5 os_prio=31 tid=0x00007fd8c611e800 nid=0x307 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Thread-1" #11 daemon prio=5 os_prio=31 tid=0x00007fd8c713a800 nid=0x6207 waiting on condition [0x0000700006a3a000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c000c138> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:492)
at com.sun.glass.ui.InvokeLaterDispatcher.run(InvokeLaterDispatcher.java:108)
Locked ownable synchronizers:
- None
"QuantumRenderer-0" #9 daemon prio=5 os_prio=31 tid=0x00007fd8c590c000 nid=0x4d03 waiting on condition [0x0000700006937000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c000c2f0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- None
"Service Thread" #8 daemon prio=9 os_prio=31 tid=0x00007fd8c7060800 nid=0x4903 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007fd8c7060000 nid=0x4703 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007fd8c705f000 nid=0x4503 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007fd8c7068000 nid=0x4303 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007fd8c7055000 nid=0x4103 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fd8c5801000 nid=0x3103 in Object.wait() [0x0000700006222000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c0013248> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x00000006c0013248> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fd8c5800000 nid=0x2f03 in Object.wait() [0x000070000611f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c000dd30> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000006c000dd30> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Locked ownable synchronizers:
- None
"main" #1 prio=5 os_prio=31 tid=0x00007fd8c6801000 nid=0x1c03 waiting on condition [0x0000700005b0a000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000772b945d8> (a java.util.concurrent.CountDownLatch$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:200)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:143)
at javafx.application.Application.launch(Application.java:191)
at fn_fx_ui.javafx_init$_main.invokeStatic(javafx_init.clj:17)
at fn_fx_ui.javafx_init$_main.doInvoke(javafx_init.clj:16)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at fn_fx_ui.javafx_init.main(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=31 tid=0x00007fd8c6000800 nid=0x2d03 runnable
"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fd8c7008000 nid=0x2503 runnable
"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fd8c7009000 nid=0x2703 runnable
"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fd8c7009800 nid=0x2903 runnable
"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fd8c6803800 nid=0x2b03 runnable
"VM Periodic Task Thread" os_prio=31 tid=0x00007fd8c6806800 nid=0x4b03 waiting on condition
JNI global references: 501
from fn-fx.
I figured out a workaround by force closing the application:
(defn -start [app stage]
(let [exit (reify javafx.event.EventHandler
(handle [this event]
(println "Closing application")
(javafx.application.Platform/exit)))]
(doto stage
(.setOnCloseRequest exit)
(.setTitle "FOO")
(.show))))
The important part is the EventHandler
that calls Platform/exit
.
from fn-fx.
In response to your inquiry, yes, it was only hanging during compilation via 'lein uberjar' if I recall correctly. I haven't tried this library since then, so perhaps the hanging issue is no longer a problem? I'll have to give it a try some time.
from fn-fx.
Hi,
I am facing the same problem that "lein uberjar" hangs.
Then I tried using boot for my project and that works without a problem.
I would just like to know if there's something wrong with my setup (project.clj and java version is below) or a problem with leiningen.
Thanks,
Anuj.
java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
(defproject fn-fx-simple "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.9.0-alpha16"]
[fn-fx/fn-fx-javafx "0.5.0-SNAPSHOT"]]
:main fn-fx-simple.javafx-init
:aot [fn-fx-simple.javafx-init]
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})
from fn-fx.
@anuj-seth OpenJDK 1.8 isn't supported by fn-fx
since it doesn't come bundled with JavaFX and there's no readily available build of OpenJFX for that version of the JRE. I added some more text on this topic to the Usage section of the README yesterday, and would love it if you were able to give that text a review.
Other than that your sample project.clj
file looks fine, with a couple of (minor) comments:
- Depending on which JRE you choose to resolve the issue of no support for OpenJDK 1.8, you may need to change the
fn-fx
dependency. This is also documented in the README (feedback welcome!). - I'd suggest updating the version of
org.clojure/clojure
to"1.9.0"
- the GA release has been out for a while. - I don't think you need
:aot [fn-fx-simple.javafx-init]
, unless you're doing something unusual in that namespace that's unrelated tofn-fx
. - I think
:target-path "target/%s"
is redundant. Though it's not causing any harm, I'm a KISS fan so try to remove things like that where I can.
from fn-fx.
Hi,
Sorry for the late reply on this.
I updated my system to openjdk11 (also updated my ubuntu to 18.10 along the way).
I still have the same problem that "lein uberjar" hangs though "lein run" works fine.
On the same code when I use "boot" to create the uberjar then it works fine, hence for fn-fx related projects I have decided to move to boot.
I have also uploaded sample projects on github - one that uses lein and hangs and second that uses boot and is able to create an uberjar.
Maybe someday someone with better knowledge of javafx and lein can solve the problem.(https://github.com/anuj-seth/fn-fx-experiments.git)
Thanks for your support.
from fn-fx.
Issue #25 has some information in it that may be related to this, specifically the use of *compile-files*.
from fn-fx.
I merged pull request #83 which should make fn-fx work with aot, and implicitly with an uberjar. Can you check if it works for you?
from fn-fx.
Yes it works.
AOT compilation works, uberjar creation does not hang and I can work on the repl after calling init-javafx!.
Thanks for your effort in making this work.
from fn-fx.
👍
from fn-fx.
Related Issues (20)
- CompilerException org.reflections.ReflectionsException: Couldn't find subtypes of Object. HOT 4
- Standardise how examples are run
- Auto generate and deploy API docs from master HOT 3
- Use HTML as frontend HOT 2
- Direct support for loading FXML files HOT 3
- Support for WebView HOT 2
- Special handling of :shown property prevents on-showing/on-shown events being triggered.
- Doesn't seem to work with Ubuntu out of the box HOT 14
- Remove sudo:false from TravisCI config file HOT 1
- fn-fx doesn't work on OpenJDK 1.8 HOT 4
- using alternate hiccup syntax for defining dom HOT 10
- UI not updating even though the model differs
- How do you get the selected value from a choice-box HOT 1
- Endless changeloop for sliders HOT 6
- bind functionality HOT 2
- table-cell with button
- (ui/text :fill (ui/color ...)) does not set fill property to said color
- lein uberjar gives an error ClassNotFoundException HOT 1
- Event stop propagation
- Unable to open DISPLAY HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fn-fx.