GithubHelp home page GithubHelp logo

Comments (20)

nielsbasjes avatar nielsbasjes commented on June 6, 2024

I just did some initial tests and I'm including the fallback that if no timezone is present in the logformat a default timezone is used.
I'm going to look at the problem with the space later (which should have worked).

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

Thank you! My question would have been if this default timezone can be overriden. AFAICS it's
Locale.UK - but I might be misinterpreting this

private Locale locale = Locale.UK; // The default Locale that follows the ISO-8601 WeekFields

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

I found the root cause of the 'spaces' problem to be in the expression of the %u just before the timestamp.

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

I fixed both issues just now.
This first fix fixes it to UTC.
Can you please check if this works for you?

Next on my list is to make the default timezone/locale settable.

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

I can check this, since the current master does not build for me.

Tests in error:
  testBasicParsing(nl.basjes.parse.httpdlog.JsonLogFormatTest): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeFormatBegin(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testAllStrfFieldsHighValues(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  missingTimeZone(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testMultipleSpecialTime(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeLeadingSpaces2a(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeFormatMultiFields1(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeFormatMultiFields2(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testAllStrfFieldsLowValues(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeFormat(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testStrftimeStampDissectorPossibles(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeLeadingSpaces1(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testSpecialTimeFormatEnd(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  ensureUnsupportedFields(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testHandlingOfNotYetImplementedSpecialTimeFormat(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testReportedSpecialTime(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
  testAllFieldsAvailability(nl.basjes.parse.httpdlog.ApacheHttpdAllFieldsTest): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)

I can skip tests for now to build it, but mvn package without tests feels wrong

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

When skipping tests, building 4.1-SNAPSHOT and including it - the following NoClassDefFoundError is thrown for the above example

java.lang.NoClassDefFoundError: nl/basjes/parse/strftime/StrfTimeParser$PaContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PAContext)

	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at nl.basjes.parse.httpdlog.dissectors.StrfTimeToDateTimeFormatter.convert(StrfTimeToDateTimeFormatter.java:62)
	at nl.basjes.parse.httpdlog.dissectors.StrfTimeToDateTimeFormatter.convert(StrfTimeToDateTimeFormatter.java:53)
	at nl.basjes.parse.httpdlog.dissectors.StrfTimeStampDissector.setDateTimePattern(StrfTimeStampDissector.java:57)
	at nl.basjes.parse.httpdlog.dissectors.StrfTimeStampDissector.initializeFromSettingsParameter(StrfTimeStampDissector.java:62)
	at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenParser.addCustomDissector(TokenParser.java:233)
	at nl.basjes.parse.httpdlog.dissectors.tokenformat.ParameterizedTokenParser.getNextToken(ParameterizedTokenParser.java:103)
	at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenParser.getTokens(TokenParser.java:214)
	at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenFormatDissector.parseTokenLogFileDefinition(TokenFormatDissector.java:303)
	at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenFormatDissector.setLogFormat(TokenFormatDissector.java:129)
	at nl.basjes.parse.httpdlog.ApacheHttpdLogFormatDissector.setLogFormat(ApacheHttpdLogFormatDissector.java:88)
	at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenFormatDissector.<init>(TokenFormatDissector.java:104)
	at nl.basjes.parse.httpdlog.ApacheHttpdLogFormatDissector.<init>(ApacheHttpdLogFormatDissector.java:48)
	at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.addLogFormat(HttpdLogFormatDissector.java:125)
	at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.addLogFormat(HttpdLogFormatDissector.java:101)
	at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.addMultipleLogFormats(HttpdLogFormatDissector.java:96)
	at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.<init>(HttpdLogFormatDissector.java:56)
	at nl.basjes.parse.httpdlog.HttpdLoglineParser.setupDissectors(HttpdLoglineParser.java:108)
	at nl.basjes.parse.httpdlog.HttpdLoglineParser.<init>(HttpdLoglineParser.java:49)
	at nl.basjes.parse.httpdlog.ApacheHttpdLoglineParser.<init>(ApacheHttpdLoglineParser.java:27)
	at ch.localsearch.dataintel.logfiles.formats.ch.common.TestTelParser.testParser(TestTelParser.java:39)
	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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

The CI build works ( https://travis-ci.org/nielsbasjes/logparser ) so I suspect a problem with old stuff on your machine.
Please do a clean build mvn clean package.

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

Did that (mvn clean package) - when running the tests, the error is the same - example:

testAllStrfFieldsLowValues(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector)  Time elapsed: 0.014 sec  <<< ERROR!
java.lang.NoClassDefFoundError: nl/basjes/parse/strftime/StrfTimeParser$PaContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PAContext)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at nl.basjes.parse.httpdlog.dissectors.StrfTimeToDateTimeFormatter.convert(StrfTimeToDateTimeFormatter.java:62)
        at nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector.checkStrfField(TestTimeStampDissector.java:478)
        at nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector.testAllStrfFieldsLowValues(TestTimeStampDissector.java:395)
        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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        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 org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

Hmm, in what directory do you do that? It must be the top level directory of the project.

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

I deleted the directory and checked it out again, the error persists :/ could you upload the compiled JAR somwhere maybe?

[tobi@tobmbp ~/github] git clone [email protected]:nielsbasjes/logparser.git
Cloning into 'logparser'...
remote: Counting objects: 11911, done.
remote: Compressing objects: 100% (309/309), done.
remote: Total 11911 (delta 170), reused 440 (delta 90), pack-reused 11310
Receiving objects: 100% (11911/11911), 1.85 MiB | 2.10 MiB/s, done.
Resolving deltas: 100% (4616/4616), done.
[tobi@tobmbp ~/github] cd logparser
[tobi@tobmbp ~/github/logparser:master] mvn package

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

Hmm, perhaps you have old things in ~/.m2/repository/... ?

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024
  1. Clear mvn dependencies:
    mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end
  2. mvn clean package
    -> same errors
java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

Are you building it locally with Docker and Java 7 maybe?

RUN yum install -y curl tar java-1.7.0-openjdk-devel expect rpm-build rpm-sign vim-enhanced

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

Oops .. that Docker image is out of date and should be updated.
Nope, I build it just plain on my machine.
I just build and deployed a 4.1-SNAPSHOT version to https://oss.sonatype.org/content/repositories/snapshots/
so you can download it.

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

Fixed the docker image. That should allow you to build the software.

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

I just realized that the error you have is an uppercase/lowercase error. Are you perhaps trying to build on Windows (which breaks anything case sensitive)?

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

I'm running on MacOS 10.13.2, the underlying filesystem is APFS. The uppercase/lowercase was something I investigated, but I thought it might be present in the source and maybe not triggered on the build server.

I can confirm that the 4.1-SNAPSHOT fixes this whitespace bug, after downloading it! However, it does not fix the usec_frac problem (#43):

Given the following logline:

192.168.85.3 - - 2017-12-25 00:00:00.000000 "GET /up.html HTTP/1.0" 203 8 "-" "HTTP-Monitor/1.1" "-" t=4920

and the following configuration:
%a %l %u %{%F %H:%M:%S.%usec_frac}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" t=%D

The following exception is thrown:

nl.basjes.parse.core.exceptions.DissectionFailure: Text '2017-12-25 00:00:00.000000' could not be parsed at index 21

ParseCaseSensitive(false)Value(Year,4)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(ClockHourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)'.'Value(DayOfWeek[WeekFields[MONDAY,4]],1)'s''e''c''_''f''r''a''c'

	at nl.basjes.parse.httpdlog.dissectors.TimeStampDissector.dissect(TimeStampDissector.java:391)
	at nl.basjes.parse.httpdlog.dissectors.StrfTimeStampDissector.dissect(StrfTimeStampDissector.java:69)
	at nl.basjes.parse.core.Parser.parse(Parser.java:687)
	at nl.basjes.parse.core.Parser.parse(Parser.java:649)
	at ch.localsearch.dataintel.logfiles.formats.ch.common.TestTelParser.testParser(TestTelParser.java:40)
	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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.time.format.DateTimeParseException: Text '2017-12-25 00:00:00.000000' could not be parsed at index 21
	at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
	at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
	at nl.basjes.parse.httpdlog.dissectors.TimeStampDissector.dissect(TimeStampDissector.java:386)
	... 26 more

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

I think I fixed this and I just uploaded a new snapshot version to https://oss.sonatype.org/content/repositories/snapshots/
Please verify

from logparser.

tkaymak avatar tkaymak commented on June 6, 2024

@nielsbasjes works! :) thank you!

from logparser.

nielsbasjes avatar nielsbasjes commented on June 6, 2024

Great!
Note that you did %{%usec_frac}t instead of what I documented %{usec_frac}t (without the %).
In this fix I also added support for both forms of this (so both will work).

from logparser.

Related Issues (20)

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.