mchr3k / org.intrace Goto Github PK
View Code? Open in Web Editor NEWJava tracing agent and live trace client
Home Page: http://mchr3k.github.com/org.intrace/
Java tracing agent and live trace client
Home Page: http://mchr3k.github.com/org.intrace/
see this post, please http://stackoverflow.com/a/18315074
The "Classes to Instrument" dialog box won't allow you to type or paste the underscore (_) character, which is a legal character for a java class name.
I'm constructing UML sequence diagram out of the recorded InTrace data using PlantUML. Having the objects' [more or less unique and constant] id would help tremendously in navigating complex code creating multiple instances of certain classes.
java.lang.NullPointerException
at org.intrace.client.gui.helper.IncludeExcludeWindow$PatternInput$PatternList.parsePattern(IncludeExcludeWindow.java:358)
at org.intrace.client.gui.helper.IncludeExcludeWindow$PatternInput$PatternList.parsePatternSet(IncludeExcludeWindow.java:348)
at org.intrace.client.gui.helper.IncludeExcludeWindow$PatternInput$PatternList.(IncludeExcludeWindow.java:339)
at org.intrace.client.gui.helper.IncludeExcludeWindow$PatternInput$PatternList.(IncludeExcludeWindow.java:313)
at org.intrace.client.gui.helper.IncludeExcludeWindow$PatternInput.(IncludeExcludeWindow.java:188)
at org.intrace.client.gui.helper.IncludeExcludeWindow.fillCTabs(IncludeExcludeWindow.java:137)
at org.intrace.client.gui.helper.IncludeExcludeWindow.(IncludeExcludeWindow.java:106)
at org.intrace.client.gui.helper.InTraceUI$MainBar$3.widgetSelected(InTraceUI.java:421)
i get this exception when i run my program:
run:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:
no swt-gtk-3659 in java.library.path
no swt-gtk in java.library.path
Can't load library: C:\Users\quique\AppData\Local\Temp\swtlib-64\swt-gtk-3659.dll
Can't load library: C:\Users\quique\AppData\Local\Temp\swtlib-64\swt-gtk.dll
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
at org.eclipse.swt.internal.C.<clinit>(Unknown Source)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Unknown Source)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Unknown Source)
at org.eclipse.swt.widgets.Display.<clinit>(Unknown Source)
at dupin.VisualVM.client.gui.InTraceStandaloneUI.main(InTraceStandaloneUI.java:25)
Java Result: 1
I am using Netbeans and windows 8 (64bits)
Why Java is trying to load a gtk library for windows?
In the UI, it is nice to add a feature, whereby you check the checkbox "ignore repeated methods", and it will start storing all the method names in a set. If a method name is repeated, it won't output that same method name again..
Thereby, you are filtering out all methods that were previously displayed.
This is great for reverse engineering, allowing one to capture noisy methods that aren't part of the application, and then only display new methods based on some user action, etc..
I did an initial implementation here:
Branch trace must be enabled to get Exceptions.
Expose a set of interfaces that allows a programmer to write a program (called the Implementor) that receives all InTrace trace events.
The classes java.util.Observable and java.util.Observer could be used as a model for some, but not all, of the interaction between InTrace and an Implementor.
Each Implementor would run in the same JVM as the InTrace GUI.
Some kind of configuration would store class names of all Implementors. -D parameters would be acceptable for a "first attempt." Once InTrace has all the configuration for a single Implementor, that Implementor will be considered "registered"
The interface must allow the InTrace GUI to ask the Implementor for a human-friendly name that will be used for display in the InTrace GUI.
The interface must allow the InTrace GUI to ask the Implementor for an Icon unique for that Implementor. If none is provided, a default (but unique one) will be used.
At GUI startup time, InTrace will ask each registered "Implementor" for a list of
-- classes to be instrumented. Include/exclude functionality should be incorporated.
-- Filters to be used. Include/exclude functionality should be incorporated.
Once the above and any other initialization is complete, InTrace GUI should invoke some kind of "startup" method on each Implementor.
When the end user closes the GUI, InTrace should notify each Implementor of the shutdown request.
Each implementor will have its own "section" in the InTrace GUI.
When InTrace UI starts, the end user will need a menu option to open a particular Implementor with a particular host/port.
Each of these ideas imitates functionality found in commercially offered APM (Application Performance Monitoring) tools, like CompuWare DynaTrace and CA Introscope.
Option 1), above, could be expanded to show the following for each SOA request:
a) input xml
b) response xml
c) all SQL requests made during the request
d) all exceptions thrown during the request.
So TraceExample.java is working fine.
I've moved on to hooking up InTrace to our SOA and having some problems.
The initial connection is made and InTrace reports the number of classes being traced. (42837).
However, about a minute or so after initial connection, I'm getting a "Connection timed out: connect" message out of this source:
org.intrace\src\org\intrace\client\gui\helper\InTraceUI.java
{
outputTabs.textOutputTab.filterThread
.addSystemTraceLine("Failed to setup network trace: "
+ ex.toString());
}
This potentially could be a firewall issue...but need more help from the code to diagnose.
Perhaps the values of the following InTraceUI#setSocket() local variables could be logged somewhere, along with a stack trace?
remoteAddress, networkTracePortStr, networkTracePort, networkTraceThread
--Erik
Add an Include and an Exclude item, remove the exclude item, remove the include item, the "Include:" header is still visible.
Given a class name, InTrace provides all events for that class.
If that class has 100 methods and you want events for just 1 -- you'll also receive events for the other 99 you're not interested in.
To minimize the amount of network traffic and other processing, would like to specify both a class and a method name (and probably method parameters) so InTrace only provides events for that specific method.
Thanks,
--Erik
Vendors who make tools rely in java interfaces.
WebServers servers like tomcat rely on interfaces in the package javax.servlet.http.
Performance monitoring tools rely on javax.sql, javax.jms and many others.
If vendors could instrument the interfaces, they could use InTrace to track method invocations, regardless of the implementation. For example, they could instrument java.sql.PreparedStatement, and get notified of method invocation events regardless of which JDBC driver was in use.
This would be invaluable for comparing functionality and performance of various implementations of any spec/interface.
Details: Enable user to click on the "Classes" button in the InTrace UI and enter the name of an interface. InTrace agent would "instrument" all classes (and subclasses and subinterfaces) that implemented the given interface.
Intended usage:
This allows the collection of trace which happens after a certain event
EXTRA: Allow reverse event matching. When a trigger is hit, expose the previous N lines of trace.
Hi,
First things first, thanks for this wonderful tool. We have an issue to use this tool more effectively. The reason for this is
the class name for instrument has length restriction of 50 characters. In other words any class which has length more than 50 is not accepted.
Due to this limitation, our instrumentation becomes slow and we need to search a lot to get our results.
Hence, if you can increase the number of characters to 100 it would help us a lot.
Thanks
Qsaxffo
Caught Throwable when trying to instrument: dcl.mwp.shsoap.ShSOAPCommandError
java.lang.NullPointerException
at org.intrace.agent.ClassAnalysis.visitLocalVariable(ClassAnalysis.java:142)
at org.intrace.internal.objectweb.asm.ClassReader.accept(ClassReader.java:1469)
at org.intrace.internal.objectweb.asm.ClassReader.accept(ClassReader.java:425)
at org.intrace.agent.ClassTransformer.getInstrumentedClassBytes(ClassTransformer.java:109)
at org.intrace.agent.ClassTransformer.transform(ClassTransformer.java:275)
at sun.instrument.TransformerManager.transform(Unknown Source)
at sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
I am a fanatic about avoiding unnecessary overhead by tracing tools....especially for performance monitoring.
End users therefore need help finding just the right set of classes to instrument -- enough classes to show the info they need, but not so many as to cause excessive overhead.
I can think of two algorithms that will help an end user discover the names of helpful classes.
I'm sure others can think of more.
Here is the feature request: Allow programmers to write algorithms that will "suggest" the names of classes that can be helpful.
a) InTrace will allow end users to chose an algorithm.
b) InTrace will run the algorithm against the app being traced.
c) The algorithm will return to InTrace a list of suggested classes to instrument.
d) InTrace will display the list to the end user, with a check mark box (or similar) next to each class name.
e) End users will place check marks next to certain class names...then click a button labled "Intrumented all checked classes" (or similar).
f) InTrace will add instrumentation for all classes with check marks.
Here are two example algorithms:
Consider SOA systems that use JDBC.
Capture a stack trace (without throwing a java.lang.Throwable) from inside certain methods in the JDBC driver. Here is one such method:
http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#executeQuery()
Each class name referenced in the stack trace is a class that would be helpful (IMHO) for understanding application performance.
Say that we've instrumented just a single class in a JVM. If one particular method shows a performance problem, the next performance troubleshooting step for me is to look at performance of all classes/methods invoke from the initial one.
The import statements for the original class contains a super set of all possible methods invoked.
Wouldn't it be possible to further trim down the list to show just those classes invoked from a single method?
Using SWT Jar: swt-osx64-3.6.2.jar
Launching InTrace UI ...
Launch failed: (UnsatisfiedLinkError: Could not load SWT library. Reasons:
no swt-gtk-3659 in java.library.path
no swt-gtk in java.library.path
Can't load library: /var/folders/g+/g+FUZTUwGMqBgKDTw59l2U+++TM/-Tmp-/swtlib-64/libswt-gtk-3659.jnilib
Can't load library: /var/folders/g+/g+FUZTUwGMqBgKDTw59l2U+++TM/-Tmp-/swtlib-64/libswt-gtk.jnilib
)
Try adding '-d32' to your command line arguments
The Eclipse Enhancement 344422 referenced on the "InTrace Roadmap" page talks about archiving/replaying events.
If archiving is ever implemented, can I suggest that a "Round Robin" db is used?
Maintaining large trace files on disk is a royal pain.
A Round Robin DB allows data to "age off" once it is older than a specified number of days.
Here is one example: http://code.google.com/p/rrd4j/
Also, rrd4j (and other rrd impls) provides some nice graphing functionality of performance data.
Hi, I tried using InTrace, both the command line and the Eclipse plug-in. I can get the plug-in working on the command line:
D:\dewan_backup\Java\WarmupProject\bin>java -javaagent:D:\dewan_backup\Java\lib
intrace-agent.jar warmup.AGreeter
Hello World
null
However, the Eclipse Plug-In gives the message:
Error occurred during initialization of VM
agent library failed to init: instrument
Error opening zip file or JAR manifest missing : D:\Program
It seems it cannot find the jar file(s). Do they have to be included in every project? It seems to be looking for the file D:\Program which does not seem to make sense.
Any help would be appreciated as InTrace seems like the perfect tool for my needs.
Prasun
Main thread attempts to add a trace line to network output queue while holding a lock.
Network output thread attempts to grab the same lock as the main thread.
Deadlock!
Main thread needs to add trace to an unbounded queue and then sleep for a time which depends on the length of the queue.
We need to enhance InTrace so that all people (developers, analysts, testers, etc..) submitting requests to a single test server can view all trace activity.
Use case: Developer1 and Developer2 both deploy their finished code to a single server.
A Business Analyst and a QA tester both need to review the newly completed code.
All of these four people have InTrace GUI running on their desktops at the same time throughout the business day while exercising and testing the new code.
InTrace's OS X version requires the legacy Java SE 6, which it's not supported starting from OS X Yosemite 10.10.
It would be great if you could re-package the UI for Mac.
Thanks,
Luca
I just got the InTrace agent to crash again....I'm still working on exact steps to reproduce.
The control thread is alive and will display the names of the classes that are instrumented. The UI can connect and disconnect.
When healthy, there is a continuous stream of events from the trace class (example.FirstTraceExample -- here is the URL: https://github.com/eostermueller/headlessInTraceClient/blob/master/src/main/java/example/FirstTraceExample.java).
But when in this broken condition, if you log onto the server agent and the instrumented class is full dialed in, then there are no events logged.
Oddly enough, this situation persists even after restarting FirstTraceExample.java.
Twice, I have fixed this problem by cleaning/compiling FirstTraceExample.java. I have even rebooted my laptop and can start FirstTraceExample.java and the error still shows up.
I got a thread dump of this process in the 'broken' state. I'm working on attaching the logs.
--Erik
I made a jar with this enhancement:
#31 (comment)
...and performance of iterating/transforming on the agent side is significantly slower.
Still need to quantify the time it takes with/without this enhancement...but its real noticeable.
--Erik
64-bit W7 system 12 core, 6G mem
Eclipse Indigo SR2 Win32-x86_64
Eclipse JDK 7 set for 1.6 compliance with JRE6 installed and checked to be added to build path.
Clean my app & rebuild.
The program ends with a "dong"
It does not seem to want to see the class files I have listed.
'My Classes...' box (from log below) is : [MainXFoil, JFoil, ca.rbh.xfoil.JPolar, Foil, ca.rbh.xfoil.Complex, ca.rbh.util.log.Logger] and Instrumented/Total Classes says 0/793.
If I add a file and 'Apply Changes' it still says 0/793.
Should it accept a package wild card such as ca.rbh.xfoil.* ??
If then add a class spec *, I then get 771/796 Java classes and none of my (about
22) classes although 5 are listed in 'Classes...'.
Is something not working or do I just not understand what I am supposed to
do? My classes are all side-by-side in the same package and run fine
without InTrace, thus:
(ordinary log output follows)
INFO JFoil: mrcl()
INFO JFoil: comset()
etc,etc
------- Log --------------------------------------------------------------
*** Instructions
*** - Select Classes you want to Trace
*** Full help available on the Help tab
*** Latest Settings Received
[21:30:47.522]:[11]:DEBUG: Class Regex : [MainXFoil, JFoil, ca.rbh.xfoil.JPolar, Foil, ca.rbh.xfoil.Complex, ca.rbh.util.log.Logger]
Exclude Class Regex : []
Tracing Enabled : true
Save Traced Class Files : false
*** Latest Settings Received
*** Latest Settings Received
*** No instrumented classes
*** Latest Settings Received
[21:31:18.675]:[1]:DEBUG: Ignoring class not matching the active include regex: sun.launcher.LauncherHelper
[21:31:18.675]:[1]:DEBUG: Ignoring class not matching the active include regex: sun.misc.URLClassPath$FileLoader$1
[21:31:18.706]:[1]:DEBUG: Ignoring class not matching the active include regex: ca.rbh.util.log.SystemOutLogger
[21:31:18.706]:[1]:DEBUG: Ignoring class not matching the active include regex: java.lang.VerifyError
[21:32:28.476]:[1]:DEBUG: Ignoring class not matching the active include regex: java.lang.Throwable$WrappedPrintStream
[21:32:28.476]:[1]:DEBUG: Ignoring class not matching the active include regex: java.lang.Throwable$PrintStreamOrWriter
[21:32:28.476]:[1]:DEBUG: Ignoring class not matching the active include regex: java.util.IdentityHashMap$KeySet
[21:32:28.476]:[17]:DEBUG: Ignoring class not matching the active include regex: java.util.IdentityHashMap$KeyIterator
[21:32:28.476]:[17]:DEBUG: Ignoring class not matching the active include regex: java.util.IdentityHashMap$IdentityHashMapIterator
then crash..
---------- Console ---------------------------------------
Exception in thread "main" java.lang.VerifyError: Expecting a stack map frame in method ca.rbh.xfoil.MainXFoil.analysisAlphaRe(Lca/rbh/xfoil/Conditions;Lca/rbh/xfoil/Foil;Lca/rbh/xfoil/JFoil;)V at offset 121
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
The following stack trace comes from the intrace-agent.jar and happens when requesting to instrument a class, one other than the Log4JLogger seen below.
The intrace code I used was from the patch for this enhancement:
#31
I built the intrace-agent.jar file myself so I could add the "exception transforming" error message.
Log4JLogger comes from commons-logging-1.1.1.jar.
In this particular instance, the error is just a nuissance. I have a hunch this is causing problems in other tough-to-reproduce situations.
--Erik
exception transforming [org.apache.juli.logging.impl.Log4JLogger]
java.lang.InternalError
at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
at org.intrace.agent.ClassTransformer.instrumentKlasses(ClassTransformer.java:702)
at org.intrace.agent.ClassTransformer.getResponse(ClassTransformer.java:575)
at org.intrace.agent.server.AgentClientConnection.runMethod(AgentClientConnection.java:118)
at org.intrace.output.InstruRunnable.run(InstruRunnable.java:18)
at java.lang.Thread.run(Thread.java:744)
My Eclipse happened to be installed in c:Program files/...
Also, in the page "http://mchr3k.github.com/org.intrace/eclipse.html", it is not at all clear ( if you have never done it) just what has to done to make InTrace work. A blow-by-blow explanation would help.
It seems the ordinary Run configuration is shared with InTrace, so ..
Edit the usual run configuration to add the VM argument
-javaagent:C:/fullpathto/intrace-agent.jar
Ensure there is no space after the colon else it won't work!
Also probably won't work if spaces in the path
Select either the Package or the actual class to be traced. This action will cause the
InTrace Run menu to have non-grey 'Java Application'. Click this. Then it should work.
The InTrace javaagent throws an exception and fails to start with an IBM JDK.
Some of this is documented here:
Here is the JVM that was used:
java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxa6460sr7ifix-20100220_02(SR7+IZ69890+IZ70326))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Linux amd64-64 jvmxa6460sr7-20100219_54097 (JIT enabled, AOT enabled)
J9VM - 20100219_054097
JIT - r9_20091123_13891
GC - 20100216_AA)
JCL - 20091202_01
Here is the full exception, which is also at the above link:
Buildfile: build.xml
init:
run:
[java] ## Loaded InTrace Agent.
[java] Exception in thread "main" java.lang.UnsupportedOperationException: cannot get the capability, performing dispose of the retransforming environment
[java] at sun.instrument.InstrumentationImpl.isRetransformClassesSupported0(Native Method)
[java] at sun.instrument.InstrumentationImpl.isRetransformClassesSupported(InstrumentationImpl.java:124)
[java] at sun.instrument.InstrumentationImpl.addTransformer(InstrumentationImpl.java:79)
[java] at org.intrace.agent.AgentInit.initialize(AgentInit.java:41)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[java] at java.lang.reflect.Method.invoke(Method.java:600)
[java] at org.intrace.agent.Agent.initialize(Agent.java:66)
[java] at org.intrace.agent.Agent.premain(Agent.java:26)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[java] at java.lang.reflect.Method.invoke(Method.java:600)
[java] at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:335)
[java] at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:350)
[java] Exception in thread "main" java.lang.reflect.InvocationTargetException
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[java] at java.lang.reflect.Method.invoke(Method.java:600)
[java] at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:335)
[java] at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:350)
[java] Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
[java] at org.intrace.agent.Agent.initialize(Agent.java:70)
[java] at org.intrace.agent.Agent.premain(Agent.java:26)
[java] ... 6 more
[java] Caused by: java.lang.reflect.InvocationTargetException
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
[java] at java.lang.reflect.Method.invoke(Method.java:600)
[java] at org.intrace.agent.Agent.initialize(Agent.java:66)
[java] ... 7 more
[java] Caused by: java.lang.UnsupportedOperationException: adding retransformable transformers is not supported in this environment
[java] at sun.instrument.InstrumentationImpl.addTransformer(InstrumentationImpl.java:80)
[java] at org.intrace.agent.AgentInit.initialize(AgentInit.java:41)
[java] ... 12 more
[java] Fatal error: processing of -javaagent failed
BUILD SUCCESSFUL
Total time: 0 seconds
java.lang.NullPointerException
at intrace.ecl.ui.launching.ShowInTraceOutputAction.isInTraceLaunchAvailable(ShowInTraceOutputAction.java:420)
at intrace.ecl.ui.launching.ShowInTraceOutputAction.isEnabledFor(ShowInTraceOutputAction.java:410)
at intrace.ecl.ui.launching.ShowInTraceOutputAction.getEnableStateForSelection(ShowInTraceOutputAction.java:319)
at intrace.ecl.ui.launching.ShowInTraceOutputAction.update(ShowInTraceOutputAction.java:135)
at intrace.ecl.ui.launching.ShowInTraceOutputAction.initialize(ShowInTraceOutputAction.java:235)
at intrace.ecl.ui.launching.ShowInTraceOutputAction.selectionChanged(ShowInTraceOutputAction.java:111)
I often keep a text list of several (perhaps 20) class names that need to be instrumented for one specific purpose -- say tracing the response time of all requests in a particular SOA.
I'd like to "Ctrl-V" this list of 20 class names into the InTrace "Classes to Instrument" dialog.
Seems reasonable to use some kind of a CR/LF as a delimiter.
The text box currently doesn't accept multi-line input.
I tried using the "pipe" character to say "this class OR that class OR the other class" (this|that|other) but the text input box wouldn't accept the |.
Thanks,
--Erik
At the above link, mchr3k gives a good description of the two TCP connections in InTrace.
The 2nd port, the "trace" port, is opened on a random port on the "agent."
In one of our environments, we need to add a firewall rule so the InTrace client can access the trace port.
But we can't do it because a different port is randomly selected on each restart of the agent's JVM.
--Erik
If InTrace is monitoring a remote application, it seems that a separate
network request is made for every trace event. Is that right? -- I haven't
looked closely enough at the code to see. If that is the case, I don't
think that kind of model will scale when medium-to-large amounts of load is applied.
Perhaps we could consider some kind of burst mode where trace events
collect in a queue and are sent to the GUI every X seconds?
CA Introscope, for instance, has a 15 second delay. I'd be happy with 5, but it should be configurable.
We should do some load testing to measure InTrace overhead.
Compare results from the above test with and without InTrace with instrumentation.
We should have multiple Load tests with InTrace.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.