Giter Site home page Giter Site logo

x12-parser's Introduction

X12 Parser

Quality Gate Status integration Maven Central

A parser for ANSI ASC X12 documents. This project was originally based on the Python project pyx12.

The library takes ANSI X12 claim files and reads the data into a Loop object that replicates the X12 structure described in the standard's specifications. The current supported standards of X12 that are supported are :

  • ANSI 835 5010 X221
  • ANSI 835 4010 X091
  • ANSI 837 4010 X096
  • ANSI 837 4010 X097
  • ANSI 837 4010 X098
  • ANSI 837 5010 X222
  • ANSI 837 5010 X223
  • 999 5010
  • 277 5010 X214
  • 277 5010 X212
  • 270 4010 X092
  • 271 4010 X092

The layouts for these standards are specified in XML mapping files contained in the mapping directory. The structure of the Loop object will match the structure specified in the mapping files for the X12 standard you are processing.

Download

Java 8 is the minimum version required to use the library.

Download the latest JAR or grab via Maven:

<dependency>
    <groupId>com.imsweb</groupId>
    <artifactId>x12-parser</artifactId>
    <version>1.15</version>
</dependency>

or via Gradle:

compile 'com.imsweb:x12-parser:1.15'

An example of how to process an X12 file is shown below

Processing a file

X12Reader reader = new X12Reader(FileType.ANSI837_5010_X222, new File("/path/file.txt"));

Each supported X12 standard has a FileType option that must be passed as the first argument to the X12Reader. In this example, an 837 5010 X222 file is being processed. If there are errors in the document structure you can review them as follows:

List<String> errors = reader.getErrors();

There may be errors in the structure that are severe enough that they prevent proper processing of the file. You can access these as follows:

List<String> errors = reader.getFatalErrors();

Accessing Data

You can access the data from the file using:

List<Loop> loops = reader.getLoops();

Each individual ISA-IEA transaction is one element in the list. If a file contains only a single ISA-IEA transaction then the length of the list is 1. You can access data further down in the X12 structure as follows:

String data = loop.getLoop("ISA_LOOP")
        .getLoop("GS_LOOP")
        .getLoop("ST_LOOP")
        .getLoop("1000A")
        .getSegment("NM1")
        .getElement("NM101")
        .getSubElement(1);

In this example, GS_LOOP is a subloop of ISA_LOOP, ST_LOOP is a subloop of GS_LOOP and so on. NM1 is a segment of loop 1000A. NM101 is the first element of segment NM1, as indicated by the 01 appened to NM1. The fourth element of NM1 would be NM104. This code is grabbing the first sub-element in that element. The loop and segment names are all specified in the mapping files. If an element does not have sub-elements, you can access the element value using:

String data = loop.getLoop("ISA_LOOP")
        .getLoop("GS_LOOP")
        .getLoop("ST_LOOP")
        .getLoop("1000A")
        .getSegment("NM1")
        .getElementValue("NM101");

It's possible for loops and segments to repeat multiple times. Here is an example of how to access a particular repeated loop or segment

Loop loop = loop.getLoop("1000A", 1);
Segment segment = loop.getSegment("NM1", 2);

This gets the first iteration of the 1000A subloop an the second instance of the NM1 segment within the 1000A loop. If no iteration index is specified in getLoop() or getSegment() then the first iteration is grabbed.

You can also search for all loops with a particular ID that is either a subloop of the current loop object or a subloop of on the current loop's subloops.

Loop loop = loop.getLoop("1000A");
List<Loop> loops = loop.findLoop("1000B");

All loops with ID of 1000B that are contained with the 1000A loop structure are returned. The 1000B loops will either be a direct subloop of 1000A or a subloop of one 1000A's subloops. A 1000B will be returned event if it's contained deep within the loop structure. The same can be done for segments.

List<Segment> segments = loop.findSegment("NM1");

Creating and Writing an X12 File

It is also possible to create a loop object and then write the contents to a file. Here is an example of creating a loop with a segment.

Loop isaLoop = new Loop("ISA_LOOP");

Segment segment = new Segment("ISA");
segment.addElement("01", "00");
segment.addElement("02", "          ");
segment.addElement("03", "01");
segment.addElement("04", "SECRET    ");
segment.addElement("05", "ZZ");
segment.addElement("06", "SUBMITTERS.ID  ");
segment.addElement("07", "ZZ");
segment.addElement("08", "RECEIVERS.ID   ");
segment.addElement("09", "030101");
segment.addElement("10", "1253");
segment.addElement("11", "U");
segment.addElement("12", "00501");
segment.addElement("13", "000000905");
segment.addElement("14", "1");
segment.addElement("15", "T");
segment.addElement("16", ":");
isaLoop.addSegment(segment);

segment = new Segment("IEA");
segment.addElement("01", "1");
segment.addElement("02", "000000905");
isaLoop.addSegment(segment);

Subsequent segments and subloops could then be appended to the ISA loop. This data can then be written to a string as follows:

X12Writer writer = new X12Writer(FileType.ANSI837_5010_X222,Collections.singletonList(isaLoop), separators);

String writerResult = writer.toX12String(lineBreak).trim();

The string can also be written to a file if needed.

x12-parser's People

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

x12-parser's Issues

Sample data is not working

I'm building an integration component for my work project using the x12-parser library. I was looking for a decent 837 document example with a lot of data and copied the file x12_many_claims.txt for use.

But when the X12Parser class processes the file, it fails with errors, including:

Unable to find a matching segment format in loop 2310B
NM1 in loop 2310B is required but not found
Unable to find a matching segment format in loop 2320
OI in loop 2320 is required but not found

There are a total of 32 errors, no fatal errors, when X12Reader parses this file.

Is it expected to be a usable example file for testing the parser?

SE Loop

Are the parent loop assignment currently work.
For example, are we able to map the SE segment correctly ..?

Question - rendering human-readable X12 HTML from XML?

I notice we have some XML files in this project that could possibly provide a lookup to create a human readable X12 rendering. These files: https://github.com/imsweb/x12-parser/tree/master/src/main/resources/mapping

They are not XSD, but instead an XML format that describes the schema of the x12 docs.

Has anyone been able to use these or something related to take the X12 XML output and render a human readable HTML form with the data?

While the theJson/toXml functions available make much more readable output than x12 itself, it's still gibberish to most common folk. I'd be interested in an XSLT or something.

Have ya'll done anything like this? Hoping not to re-invent the wheel here.

A new PRV segment Mapper missing after the HI segment

As per our inputs file we need a PRV segment mapper after our HI segment mapper in the mapping/837.5010.X222.A1.xml file. Let us know if we can add our own Mapping in the file and contribute ourselves.

Thanks,
Nikhil Javalkar

Unable to parse huge x12 documents

What is the biggest files you have been able to parse with this parser?

I need to parse 837 files with thousands of claims in them.

To get unblocked, I added a split837 method to the X12Reader which is doing a map reduce to take the huge x12 file and split into chunks. I split at child loops at the DETAIL loop.

Once the 837 is split into chunks, I just operate on those chunks separately using the normal parse method.

Anyone else have anything similar they had to do?

Unable to parse 837 document

New to using x12-parser, this could be a case of user error (no documentation for the project, so I'm winging it).

I have a simple parser app:

package com.outpatientservicesllc.adaptors;

import com.imsweb.x12.Loop;
import com.imsweb.x12.reader.X12Reader;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

@Component
@Log4j2
public class ANSI837DocumentAdaptor {
  public void loadFile(String filename) throws IOException {
    this.log.debug("Loading file: {}", filename);
    X12Reader reader =
        new X12Reader(X12Reader.FileType.ANSI837_5010_X222, new FileInputStream(filename));
    List<Loop> loops = reader.getLoops();

    this.log.debug("Processing {} loop{}", loops.size(), loops.size() == 1 ? "" : "s");

    for (int index = 0; index < loops.size(); index++) {
      this.log.debug("[{}] {}", index, loops.get(index));
    }
  }
}

and the following unit test:

package com.outpatientservicesllc.adaptors;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;

import java.io.IOException;

@RunWith(MockitoJUnitRunner.class)
public class ANSI837DocumentAdaptorTest {
  private static final String TEST_837_FILE = "src/test/resources/ANSI837.txt";

  @InjectMocks private ANSI837DocumentAdaptor adaptor;

  @Test
  public void testLoadDocument() throws IOException {
    adaptor.loadFile(TEST_837_FILE);
  }
}

But when I attempt to load my test document, I get the following output:

15:48:14.601 [main] DEBUG com.outpatientservicesllc.adaptors.ANSI837DocumentAdaptor - Loading file: src/test/resources/ANSI837.txt
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/Users/mcpierce/.m2/repository/com/thoughtworks/xstream/xstream/1.4.11.1/xstream-1.4.11.1.jar) to field java.util.TreeMap.comparator
WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
15:48:15.417 [main] DEBUG com.outpatientservicesllc.adaptors.ANSI837DocumentAdaptor - Processing 0 loops

I don't understand why it says there are 0 loops, which I assume means there is no data (again, no documentation to go by). Am I doing something wrong? I see the file's been loaded, but I don't see any way of getting to the data.

Handling apostrophes in elements in `toX12String()`

I am loading x12 documents, making changes, then writing them back to x12 using X12Writer.toX12String().

I'm having situations where I get x12 documents fail on the source system, and it is due to the fact that the x12 has apostrophes in the element value.

Is there something I should be doing to "escape" apostrophes? How do ya'll handle these?

For example NM103 has "O'Brian" how should that look in x12?

getFinalizedMatch function needs to prioritize child loops over siblings

Let's say you have this 2400 loop:

LX*3~
SV1*HC:12345:12*12*AB*1*12**1**Y~
DTP*472*D8*20000101~
REF*6R*M1~
NM1*82*1*XXXXX*XXXXXX*X**XX*XX*XXXXXXXXXXX~

While this processes through the x12 reader iterator, the NM1 NM1*82*1*XXXXX*XXXXXX*X**XX*XX*XXXXXXXXXXX~ hits the getFinalizedMatch method to see if this indicates a new loop. Which it does.

The getFinalizedMatch will check for

  • 2310B
  • 2420A

In the if check, it checks for sibling first, then parent second.

This results in 2420A never being able to be parsed.

It should prefer the parent relationship above sibling, which would resolve this problem.

Documentation error?

The documentation has the following example:

Loop isaLoop = new Loop("ISA_LOOP");

Segment segment = new Segment("ISA");
segment.addElement("01", "00");
segment.addElement("02", "          ");
segment.addElement("03", "01");

but running that results in:
The method addElement(int, Element) in the type Segment is not applicable for the arguments (String, String)

Has the library changed since that documentation was written?

270/271 5010 support

Is it possible to add support for the 270/271 5010 standard? So far I only see 4010 is supported.
Thanks

Issue when processing 271-5010 file for dependent

Hi, Dev

We are trying to use the update https://github.com/nddipiazza/x12-parser/tree/issue_48_add_271_5010_support to support 271-5010 version.

The following is an example from the x12.org:

ISA*00*          *00*          *ZZ*AV09311993     *01*030240928      *240312*0240*U*00501*000001044*1*T*:~
GS*HB*92-1609342*030240928*20240312*0240*1044*X*005010X279A1~
ST*271*4322*005010X279A1~
BHT*0022*11*10001235*20060501*1319~
HL*1**20*1~
NM1*PR*2*ABC COMPANY*****PI*842610001~
HL*2*1*21*1~
NM1*1P*2*BONE AND JOINT CLINIC*****SV*2000035~
HL*3*2*22*1~
NM1*IL*1*SMITH*JOHN****MI*123456789~
N3*15197 BROADWAY AVENUE*APT 215~
N4*KANSAS CITY*MO*64108~
DMG*D8*19630519*M~
HL*4*3*23*1~
TRN*2*93175-012547*9877281234~
NM1*03*1*SMITH*MARY~
N3*15197 BROADWAY AVENUE*APT 215~
N4*KANSAS CITY*MO*64108~
DMG*D8*19981014*F~
INS*N*19~
DTP*346*D8*20060101~
EB*1**30**GOLD 123 PLAN~
EB*L~
LS*2120~
NM1*P3*1*JONES*MARCUS****SV*0202034~
LE*2120~
EB*1**1^33^35^47^86^88^98^AL^MH^UC~
EB*B**1^33^35^47^86^88^98^AL^MH^UC*HM*GOLD 123 PLAN*27*10*****Y~
EB*B**1^33^35^47^86^88^98^AL^MH^UC*HM*GOLD 123 PLAN*27*30*****N~
SE*28*4322~
GE*1*1044~
IEA*1*000001044~

But the current code cannot identify the dependent section and shows error like:

reader error: [Unable to find a matching segment format in loop 2100C, Unable to find a matching segment format in loop 2100C]
reader fatal error: [Parent loop 2000D is missing and should already exist, Failed to store loop data for 2100D]

ArrayIndexOutOfBoundsException when processing 837 file

I get the following error when processing an 837 file. Any idea why?

java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.ArrayList.elementData(ArrayList.java:418) ~[na:1.8.0_91]
	at java.util.ArrayList.get(ArrayList.java:431) ~[na:1.8.0_91]
	at com.imsweb.x12.Loop.getLoop(Loop.java:285) ~[x12-parser-1.4.jar:1.4]
	at com.imsweb.x12.reader.X12Reader.storeData(X12Reader.java:362) ~[x12-parser-1.4.jar:1.4]
	at com.imsweb.x12.reader.X12Reader.parse(X12Reader.java:214) ~[x12-parser-1.4.jar:1.4]
	at com.imsweb.x12.reader.X12Reader.<init>(X12Reader.java:98) ~[x12-parser-1.4.jar:1.4]

Please see the 837 file attached which causes this exception. st.txt

My code:

        URL url = this.getClass().getResource("/st.txt");
        X12Reader reader = null;
        try {
            reader = new X12Reader(X12Reader.FileType.ANSI837_5010_X222, new File(url.getFile()));
            List<String> errors = reader.getErrors();
            if(errors != null && errors.size() > 0) {
                log.error("Parse errors: {}", errors);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

From some basic debugging the issue is that index is -1 in the code below:

/**
     * Returns the child loop at the specified index of the loop with the corresponding loopID.
     * @param loopId is the loop we are searching for
     * @param index is the child loop index we want.
     * @return loop with corresponding loopId. Returns null if the index is greater than or equal to the number of loops matching the loop ID.
     */
    public Loop getLoop(String loopId, int index) {
        List<Loop> loops = findLoop(loopId);
        if (index < loops.size())
            return findLoop(loopId).get(index);
        return null;
    }

Also, why call findLoop again inside if condition? shouldnt loops.get(index) work the same as it is already processed earlier in the method?

Parser hangs when trying to handle larger files

Moderately large files cause the reader to hang. Is there a memory/time efficient way to load files?
The x12 file below is 22 MB in size and has 25000 claims.

X12Reader reader = new X12Reader(X12Reader.FileType.ANSI837_5010_X222, file);
        Loop loop = reader.getLoop();
        Segment segment = loop.getSegment(0);
        System.out.println(segment.toString());

CLM is never in a 2300 loop but should always be.

According to the 837 technical references such as this [1] the CLM segment should be in the 2300 loop. However, using the X12 parser library I'm consistently seeing it being in the 2400 loop when present.

My code is using the ANSI837_5010_X222 file type.

[1] https://ushik.ahrq.gov/ViewItemDetails?&system=apcd&itemKey=196746000

Below is a sample 837 that I've hopefully correctly scrubbed without damaging the content:

ISA*00*          *00*          *ZZ*133052274      *ZZ*044300001      *210615*0515*^*00501*000001001*0*P*:~GS*HC*133052274*044300001*20210615*051514*1001*X*005010X222A1~ST*837*000000001*005010X222A1~BHT*0019*00*000000D14*20210614*051514*CH~NM1*41*2*VENDOR*****46*133052274~PER*IC*VENDOR CUSTOMER SOLUTIONS*TE*8008456592~NM1*40*2*CLIENT SERVICES*****46*044300001~HL*1**20*1~NM1*85*2*CLIENT IMAGING*****XX*1053386219~N3*123 MAIN STREET~N4*ANYTOWN*NY*123451234~REF*EI*010752765~PER*IC*OPI*TE*4045001658~NM1*87*2~N3*PO BOX 123~N4*ANYTOWN*NY*123451234~HL*2*1*22*0~SBR*P*18**CLIENT SERVICES*****CI~NM1*IL*1*JONES*JANET****MI*D0140~N3*456 UPTOWN ROAD~N4*ANYTOWN*NY*12345~DMG*D8*19590630*F~NM1*PR*2*CLIENT SERVICES*****PI*04430~CLM*OPI56804*2011***11:B:1*Y*A*Y*Y*P~REF*X4*11D2166278~REF*D9*061421748936058~REF*G1*NPR~HI*ABK:M5136~NM1*DN*1*JORDAN*JUDY*W***XX*2342342345~NM1*82*1*NANJANI*RAJESH*D***XX*1231231234~PRV*PE*PXC*2085R0202X~NM1*77*2*CLIENT IMAGING*****XX*1053386219~N3*123 MAIN STREET~N4*ANYTOWN*NY*123451234~LX*1~SV1*HC:72148*2011*UN*1***1~DTP*472*RD8*20210610-20210610~REF*6R*7436591237~SE*37*000000001~GE*3*1001~IEA*1*000001001~

When parsed by the X12 library the patient MRN (OPI56804) is reported as being in the 2400 loop when it should be in the 2300 loop.

X12Reader - getMatchedLoop unable to handle 271 LS and LE segments

Steps to reproduce: from https://github.com/nddipiazza/x12-parser/tree/issue_48_add_271_5010_support

Run the test com.imsweb.x12.reader.X12ReaderTest#test271_5010

This code in

com.imsweb.x12.reader.X12Reader#getMatchedLoop

                // starting a new loop but we aren't quite sure which one yet. Remove loops where the segment is known to be the last segment of that loop - clearly we aren't in a new loop then
                matchedLoops = matchedLoops.stream().filter(lc -> lc.getLastSegmentXid() == null || !(lc.getLastSegmentXid().getXid().equals(tokens[0]) && codesValidatedForLoopId(tokens, lc.getLastSegmentXid()))).collect(
                        Collectors.toList());
                result = matchedLoops.isEmpty() ? null : (matchedLoops.size() == 1 ? matchedLoops.get(0) : getFinalizedMatch(previousLoopID, matchedLoops));

Does not work for the segment LE. It will pick the wrong value in this situation.

I have put in a hack locally and it fixes my problem:

                if ("LE".equals(tokens[0])) {
                    // the below logic doesn't work for the LE segment.
                    // in this case we will just hack around the issue. if the previous loop ID ends with a C such as 
                    // with 2120C, then return the 2110C loop config (index 0). Otherwise return 2110D loop config (index 1).
                    return previousLoopID != null && previousLoopID.endsWith("C") ? matchedLoops.get(0) : matchedLoops.get(1);
                }

what is the intention for that logic? why doesn't it work for this one situation?

Example code

Hi, is there any example code for creating X12 837 5010 data (or anything else really that shows how to use the library)?

Thanks

README.md is pretty incomplete.

In README.md, in the "Creating and Writing an X12 File" section there are numerous lines of the form "addElement(segment, "01", "00");" ... There is no such method (and the object upon which the method is supposed to exist is left off) - may want to fix this, as users of this library will find themselves stuck (as I am).

We found an ending segment but we never stored the first part of the loop!

I have created a custom xml to handle 4010/850 Purchase order. But getting the below error
We found an ending segment but we never stored the first part of the loop!
The Error occurs when the code tried to appendEndingSegment for PO1 loop.
I have verified the xml with the example edi file and looks fine.
Any help would be appreciated

Is it possible to get updated 5010 based 270/271 mapping files?

Where do these mapping files come from? Do they already exist in some form or do you have to create them from scratch?
Based on the error returned from the X12Reader, it looks like we need something like:

ANSI270_5010_X279("mapping/270.5010.X279.A1.xml"),
ANSI271_5010_X279("mapping/271.5010.X279.A1.xml");

Is there anything I can do to help this process along?

Thanks.

Create X12 String Output from Loop

We currently support reading an existing X12 file, modifying it, and outputing the modified data into a string. We now want to send in data Loops and generate an X12 string from the data loop.

Fix method that removes loop ambiguity

Some loops have identical starting segments. When the parser encounters these segments there is an initial ambiguity in what loop the starting segment is for. We need to use what the previous loops that were processed for determining which of the ambiguous loops we are parsing.

If one of the ambiguous loops is a child loop of the previous loop that was processed then that loop is the current loop. Otherwise, if the previous loop and one of the ambiguous loops have the same parent then that is the current loop

If neither condition is satisfied then this is not the start of an actual loop and the segment will be considered as a segment in the loop we are currently processing.

There is a bug where we don't check each of the ambiguous loops first to see if any are a child loop of the previous loop. We should confirm none of the ambiguous loops satisfy that first before the other check is done.

Creating/Writing example from README.md produces IndexOutOfBoundsException

(I am looking into it myself, but I wanted to let you know...)

The README.md example we've been talking about this morning produces IndexOutOfBoundsException when actually run.

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.base/java.util.ArrayList.rangeCheckForAdd(ArrayList.java:788) ~[na:na]
at java.base/java.util.ArrayList.add(ArrayList.java:513) ~[na:na]
at com.imsweb.x12.Segment.addElement(Segment.java:190) ~[x12-parser-1.14.jar:1.14]

no main manifest attribute, in x12-parser-1.6.jar

When I try to run the downloaded jar file I receive the following error:

no main manifest attribute, in x12-parser-1.6.jar

This happens on macOS using java 13.0.2 and on Ubuntu linux using openjdk 11.0.5

X12 270/271

Hi,
Can X12 270/271 format be created/parsed by this? If so, how?

Thanks

Allow for custom mapping files

This issue is to allow users to pass custom mapping files that can be used to parse X12 files with specs that differ from the supported standards.

Make changes to toHtml output so that it supports an Edit form

The toHtml output for the x12 file needs some simple changes to make it easy to use in an application to support an online Edit form.

  1. The id attribute of each loop/segment/element (which is a machine readable "path" to the x12 entity in the document) should include itself. Previously it only included it's parents, which was a bug.
  2. Each loop/segment/element should have a title attribute containing a human readable "path" to the x12 entity.
  3. For supporting multi-claim 837's, need a toHtml method that takes a data loop index.
  4. And each data loop needs to be in a
    container with an ID to identify what data loop it belongs to. This allows a nice paging ability.
  5. Add a class on the input text field for elements for each of css selectors

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.