Code Monkey home page Code Monkey logo

processing-library-template's Introduction

The following describes how to set up a Processing Library project in Eclipse and build it successfully, and to make your Library ready for distribution.

Import to Eclipse

There are three options to import the template project into Eclipse: using it as a template, using a Git fork or using a downloaded package. If you are not familiar with Git or GitHub, you should opt for the downloaded package.

Option A: Use this template

  1. Use the repository as a template.
  1. Clone your new repository to your Eclipse workspace.
  • Open Eclipse and select the File → Import... menu item.
  • Select Git → Projects from Git, and click "Next >".
  • Select "URI" and click "Next >".
  • Enter your repository's clone URL in the "URI" field. The remaining fields in the "Location" and "Connection" groups will get automatically filled in.
  • Enter your GitHub credentials in the "Authentication" group, and click "Next >".
  • Select the master branch on the next screen, and click "Next >".
  • The default settings on the "Local Configuration" screen should work fine, click "Next >".
  • Make sure "Import existing projects" is selected, and click "Next >".
  • Eclipse should find and select the processing-library-template automatically, click "Finish".
  1. Rename your Eclipse project.
  • In the Package Explorer, right-click (ctrl-click) on the folder icon of the processing-library-template project, and select Refactor → Rename... from the menu that pops up.
  • Give the project the name of your Library, and click "OK".

Option B: GitHub

  1. Fork the template repository to use as a starting point.
  • Navigate to https://github.com/processing/processing-library-template in your browser.
  • Click the "Fork" button in the top-right of the page.
  • Once your fork is ready, open the new repository's "Settings" by clicking the link in the menu bar on the right.
  • Change the repository name to the name of your Library and save your changes.
  • NOTE: GitHub only allows you to fork a project once. If you need to create multiple forks, you can follow these instructions.
  1. Clone your new repository to your Eclipse workspace.
  • Open Eclipse and select the File → Import... menu item.
  • Select Git → Projects from Git, and click "Next >".
  • Select "URI" and click "Next >".
  • Enter your repository's clone URL in the "URI" field. The remaining fields in the "Location" and "Connection" groups will get automatically filled in.
  • Enter your GitHub credentials in the "Authentication" group, and click "Next >".
  • Select the master branch on the next screen, and click "Next >".
  • The default settings on the "Local Configuration" screen should work fine, click "Next >".
  • Make sure "Import existing projects" is selected, and click "Next >".
  • Eclipse should find and select the processing-library-template automatically, click "Finish".
  1. Rename your Eclipse project.
  • In the Package Explorer, right-click (ctrl-click) on the folder icon of the processing-library-template project, and select Refactor → Rename... from the menu that pops up.
  • Give the project the name of your Library, and click "OK".

Option C: Downloaded Package

  1. Download the latest Eclipse template from here. Don't unzip the ZIP file yet.
  2. Create a new Java project in Eclipse.
  • From the menubar choose File → New → Java Project.
  • Give the project the name of your Library.
  • Click "Finish".
  1. Import the template source files.
  • Right-click (ctrl-click) onto the folder icon of your newly created project in the Package Explorer and select "Import..." from the menu that pops up.
  • Select General → Archive File, and click "Next >".
  • Navigate to the ZIP file you downloaded earlier in step 1, and click "Finish".

Set Up and Compile

  1. Add Processing to the project build path.
  • Open your project's "Properties" window.
  • Under "Java Build Path", select the "Libraries" tab and then "Add External JARs...".
  • Locate and add Processing's core.jar to your build path. It is recommended that a copy of core.jar is located in your Eclipse workspace in a libs folder. If the libs folder does not exist yet, create it. Read the section below regarding where to find the core.jar file.
  • Confirm the setup with "OK".
  1. Edit the Library properties.
  • Open the resources folder inside of your Java project and double-click the build.properties file. You should see its contents in the Eclipse editor.
  • Edit the properties file, making changes to items 1-4 so that the values and paths are properly set for your project to compile. A path can be relative or absolute.
  • Make changes to items under 5. These are metadata used in the automatically generated HTML, README, and properties documents.
  1. Compile your Library using Ant.
  • From the menu bar, choose Window → Show View → Ant. A tab with the title "Ant" will pop up on the right side of your Eclipse editor.
  • Drag the resources/build.xml file in there, and a new item "ProcessingLibs" will appear.
  • Press the "Play" button inside the "Ant" tab.
  1. BUILD SUCCESSFUL. The Library template will start to compile, control messages will appear in the console window, warnings can be ignored. When finished it should say BUILD SUCCESSFUL. Congratulations, you are set and you can start writing your own Library by making changes to the source code in folder src.
  2. BUILD FAILED. In case the compile process fails, check the output in the console which will give you a closer idea of what went wrong. Errors may have been caused by
  • Incorrect path settings in the build.properties file.
  • Error "Javadoc failed". if you are on Windows, make sure you are using a JDK instead of a JRE in order to be able to create the Javadoc for your Library. JRE does not come with the Javadoc application, but it is required to create Libraries from this template.

After having compiled and built your project successfully, you should be able to find your Library in Processing's sketchbook folder, examples will be listed in Processing's sketchbook menu. Files that have been created for the distribution of the Library are located in your Eclipse's workspace/yourProject/distribution folder. In there you will also find the web folder which contains the documentation, a ZIP file for downloading your Library, a folder with examples as well as the index.html and CSS file.

To distribute your Library please refer to the Library Guidelines.

Source code

If you want to share your Library's source code, we recommend using an online repository available for free at GitHub.

The core.jar file contains the core classes of Processing and has to be part of your classpath when building a Library. On Windows and Linux, this file is located in the Processing distribution folder inside a folder named lib. On Mac OS X, right-click the Processing.app and use "Show Package Contents" to see the guts. The core.jar file is inside Contents → Resources → Java. For further information about the classes in core.jar, you can see the source here and the developer documentation here.

If you created a libs folder as described above, put the libraries you need to add to your classpath in there. In the "Properties" of your Java project, navigate to Java Build Path → Libraries, and click "Add External JARs...". Select the .jar files from the libs folder that are required for compiling your project. Adjust the build.xml file accordingly.

The libs folder is recommended but not a requirement, nevertheless you need to specify where your .jar files are located in your system in order to add them to the classpath.

In case a Library depends on system libraries, put these dependencies next to the .jar file. For example, Processing's opengl.jar Library depends on JOGL hence the DLLs (for Windows) or jnilibs (for OS X) have to be located next to the opengl.jar file.

What is the difference between JDK and JRE?

JDK stands for Java Development Kit whereas JRE stands for Java Runtime Environment. For developers it is recommended to work with a JDK instead of a JRE since more Java development related applications such as Javadoc are included. Javadoc is a requirement to properly compile and document a Processing Library as described on the guidelines page.

You can have both a JDK and a JRE installed on your system. In Eclipse you need to specify which one you want to use.

The JRE System Library

This primarily affects Windows and Linux users (because the full JDK is installed by default on Mac OS X). It is recommended that you use the JDK instead of a JRE. The JDK can be downloaded from Oracle's download site. Also see the Java Platform Installation page, which contains useful information.

To change the JRE used to compile your Java project:

  1. Open the properties of your project from the menu Project → Properties. Select "Java Build Path" and in its submenu, click on the "Libraries" tab.
  2. A list of JARs and class folders in the build path will show up. In this list you can find the JRE System Library that is used to compile your code. Remove this JRE System library.
  3. Click "Add Library...". In the popup window, choose "JRE System Library" and press "Next".
  4. Select an alternate JRE from the pull-down menu or click and modify the "Installed JREs". Confirm with "Finish" and "OK".

Compiling with Ant and javadoc

Ant is a Java-based build tool. For more information visit the Ant web site. Ant uses a file named build.xml to store build settings for a project.

Javadoc is an application that creates an HTML-based API documentation of Java code. You can check for its existence by typing javadoc on the command line. On Mac OS X, it is installed by default. On Windows and Linux, installing the JDK will also install the Javadoc tool.

processing-library-template's People

Contributors

benfry avatar guilhermesilveira avatar jeremydouglass avatar prisonerjohn avatar reas avatar sableraf avatar zedseven avatar zeroisnan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

processing-library-template's Issues

fyi: dead link

hey,
the link to the instructions on how to fork one repo multiple times is dead..

marcel

Github Pages integration

In case anyone wants to host their library page on github...

I created a fork, that does exactly that:
https://github.com/bitcraftlab/processing-library-template

Here's what the library page looks like:
https://bitcraftlab.github.io/processing-library-template/

Right now the approach is to publish YourLibrary.zip and YourLibrary.txt files using GitHub releases. To make sure they are always accessible at the same URL, you need to create a release labeled “latest” which needs to be manually updated:
https://github.com/bitcraftlab/processing-library-template/releases/tag/latest

To host the page on github.io you need to activate github pages, and configure it to serve the page from the master:docs folder.

  • If you setproject.dist.platform=GitHub in the build.properties file, the docs folder is created upon build, and index.html will link the zip file on github.
  • If you set project.dist.platform=Webyou get default behaviour

Question:

@prisonerjohn could you check if YourLibrary.txt can be harvested by the processing.org script that checks for updates? There's some redirection going on, but if this is resolved it should work:

curl -L https://github.com/bitcraftlab/processing-library-template/releases/download/latest/YourLibrary.txt

Taglet blocks javadoc generation with ClassNotFoundException

When I run the Processing template targeting Java SE-1.8, the

[javadoc] Constructing Javadoc information...
[javadoc] Standard Doclet version 10.0.1
[javadoc] Building tree for all the packages and classes...
[javadoc] javadoc: error - Error - Exception java.lang.ClassNotFoundException thrown while trying to register Taglet ExampleTaglet...

In the Processing Library template there is a file

resources > code > ExampleTaglet.java

It begins with

import com.sun.tools.doclets.Taglet;

I think that in Java 8+ that would instead would be:

import java.jdk.Taglet;

...I'm not sure if there are other changes that would need to be made.

I am not familiar with doclets and Taglets -- looking over the code, it isn't clear to me why ExampleTaglet would actually be used -- although is referenced in Ant's build.xml:

<taglet name="ExampleTaglet" path="resources/code" />

Anyway, when it fails the documentation as a whole fails to build.

Assuming this is a problem for others, it seems like either ExampleTaglet should be fixed or it should be removed from build.xml to not block javadoc generation.

My solution was to remove the above line from build.xml.

warning: [options] bootstrap class path not set in conjunction with -source 8

When following the eclipse setup instructions for the Processing Library Template, it mentions that "the full JDK is installed by default on Mac OS X" -- so the instructions do not recommend installing JDK in that case.

However, now that MacOS has moved on to JDK 10, both Eclipse and the ant build are generating warnings.

From the build log:

[javac] Compiling 2 source files to /Users/[...]/bin
[javac] warning: [options] bootstrap class path not set in conjunction with -source 8
[javac] 1 warning
[copy] Copying 1 file to /Users/[...]

This seems like a harmless warming (small test builds still work just fine) but:

It might make sense to have standard instructions in the README for everyone be to just install the correct JDK (8) and add it to the Eclipse project.

That would also avoid subtle errors -- especially ones that might become increasingly likely once MacOS JDK moves to 11+. It would also reduce the amount of red warning text in the logs!

Related discussion of the warning:

https://stackoverflow.com/questions/7816423/warning-options-bootstrap-class-path-not-set-in-conjunction-with-source-1-5

Error fetching URL

The library template seems to have a default configuration set that is pointed at a bad URL. Or perhaps I've accidentally left it unconfigured in some way that isn't covered by Library Basics. Everything works, but it generates warning messages.

Here is the warning on Ant compile:

[javadoc] Constructing Javadoc information...
[javadoc] Registered Taglet ExampleTaglet ...
[javadoc] Standard Doclet version 1.8.0_51
[javadoc] Building tree for all the packages and classes...
[javadoc] javadoc: warning - Error fetching URL: http://processing.org/reference/javadoc/core/

That url is 404.

Using the fork method to create more than one library projects

I realized one potential issue with the Github method to create new library projects, which consists in forking the processing-library-template repo.

I applied this method once to create a new library called planetarium (https://github.com/codeanticode/planetarium), and everything went fine. Now I'd like to start a new library, but when I click the Fork button in the processing-library-template page, it takes me to the planetarium repo, instead of allowing me to start with a new one from scratch.

Javadoc html warning when running against JDK 10

Processing library template projects are written against Java 1.8 -- when compiling against JDK 10 javadoc gives a warning about the html format not being specified.

  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [...]
  [javadoc] Constructing Javadoc information...
  [javadoc] javadoc: warning - You have not specified the version of HTML to use.
  [javadoc] The default is currently HTML 4.01, but this will change to HTML5
  [javadoc] in a future release. To suppress this warning, please specify the
  [javadoc] version of HTML used in your documentation comments and to be
  [javadoc] generated by this doclet, using the -html4 or -html5 options.
  [javadoc] Standard Doclet version 10.0.1 

This happens when building on OS X 10.12.6 (default JDK 10). There is a related issue here that lists a fix (for gradle, not ant): gradle/gradle#5891

That fix:

  1. check the java version
  2. set the html flag if it the version > 9.

License too restrictive

hi!

this is a formality, but i think it would be very cool if the libraries template came with a much more liberal license than the gpl (*). people who want could still narrow it down to the (l)gpl, but i just started working on a library (a wrapper around the edsdk to allow access to canon slrs) that i want to release under the wtfpl.
i understand that this is not really a problem because you probably won't sew me over swapping the license, but it'd be nice to have the libraries template as broadly available as possible.

(*) mit, apache, bsd and wtfpl come to mind. (the last is my favorite because of it's clarity)

best, hansi.

Build Library with core Processing 4 with Java 8 failed and almost work with Java 11

Hello,
I try to build a library with Processing 4 core, but that's failed. Need change
#java.target.version=1.8 to java.target.version=11 in the build.properties and that's work, but not all the time, to be precise It works one out of two times and to be more precise the first build failed and the second work like a charm.

Et voilà

BEFORE

BUILD FAILED
/Users/stanislasmarcais/EN_COURS/CODE/github/ROPE_PROJECT/Rope_p5/resources/build.xml:111: The following error occurred while executing this line:
/Users/stanislasmarcais/EN_COURS/CODE/github/ROPE_PROJECT/Rope_p5/resources/build.xml:132: Unable to delete directory /Users/stanislasmarcais/Documents/Processing/libraries/Rope

AFTER

BUILD SUCCESSFUL
Total time: 9 seconds

@example Taglet not working.

Problem

The @example Taglet in the javadoc is not working for me. The example is not included and the build output of ANT shows me:

  [javadoc] Javadoc execution
  [javadoc] Loading source file /home/m/.eclipseworkspace/processing-library-template/tmp/YourLibrary/src/template/library/HelloLibrary.java...
  [javadoc] Constructing Javadoc information...
  [javadoc] Registered Taglet ExampleTaglet ...
  [javadoc] Standard Doclet version 1.6.0_27
  [javadoc] Building tree for all the packages and classes...
  [javadoc] Generating /home/m/.eclipseworkspace/processing-library-template/tmp/YourLibrary/reference/template/library/HelloLibrary.html...
  [javadoc] java.io.FileNotFoundException: ../examples/Hello 
  [javadoc]  
  [javadoc]  (the tag @example followed by the name of an example included in folder 'examples' will
  [javadoc]  automatically include the example in the javadoc.)/Hello

Something in ExampleTaglet.javas readFile() seems to be off with the path. I tried to fix it but apparently the ANT script does not compile ExampleTaglet.java.

If you tell me how you compiled it I can try to fix it.

Steps to reproduce:

  • Clone the template
  • Import to Eclipse
  • Set classpath for core.jar
  • Set minimal build.properties to get it to compile
  • Execute ANT

warning: [path] bad path element

Hi, I'm getting some warnings when exporting a library. I attach it as PDF to keep the colors, which may help find the relevant parts in the long text:

ant-warnings.pdf

My library needs jna-X.X.X.jar and jna-platform-X.X.X.jar. What I've done so far is to drop the two files inside the lib/ folder in my Eclipse project, and added them to the build path.

I believe the resulting library works (it's a Windows specific issues which I can't test, but others tell me it works).

Is there any way to get rid of those warnings?

Problem with ant in Kepler

Hi, I just installed the processing-library-template following the instructions you provided. Everything went great until I tried to run the ant-build. This failed even though I had entered everything correctly.

I found this http://stackoverflow.com/questions/20702626/javac1-8-class-not-found which explains the problem. As soon as I moved ant-home to the current version on my system everything worked as described. You should update the install instructions to point out this eclipse problem.

build.xml AddExamples fails on example subfolders, broken "by following the links below" in index.html

Currently the build.xml AddExamples auto-generates a list of linked example pde files in the index.html, based on the subfolder names under /examples.

Broken links are generated if the examples are grouped into subfolders, e.g. for

  • examples/foo/bar/bar.pde
  • examples/foo/baz/baz.pde

...it lists a single example "foo" (with a broken link to the non-existant foo.pde).

This is the style used by libraries with larger example sets, e.g. Camera3D, ControlP5, minim et cetera.

One solution might be to recurse or add a deeper pattern in AddExamples. Another might be to just link into the top level directories and allow directory browsing -- although that might create issues for e.g. needing to set browsing access, e.g. .htaccess et cetera.

Multiple authors

It would be useful if build.properties allowed for multiple authors - the generated library.properties does but there's no way to generate more than one author/url pair from build.properties.

Making Processing Library Templates Fit For Collaboration

Problem

When several people work on a Processing library or tool via git, they usually have different operating systems, classpaths, sketchbook locations etc. These things are configured in build.properties, and are under version control (which is a bad thing).

Solution

  • Create custom config files named local.properties that are excluded from version control.
  • Provide template files: local.properties.tmpl that the developers need to copy and customize to their needs.
  • Modify the build process to use both local.properties and build.properties

Implementation

I already implemented a solution and opened a pull-request for the old repo, which you can find here:
processing/processing-templates#1

Prevent massive import lines?

When I create a library with this template and lots of source code I end up with the Processing IDE to generate lots of import statements. How can I prevent these, as they are not needed!

import de.quippy.javamod.io.*;
import de.quippy.javamod.io.wav.*;
import de.quippy.javamod.main.*;
import de.quippy.javamod.main.applet.*;
import de.quippy.javamod.main.gui.*;
import de.quippy.javamod.main.gui.components.*;
import de.quippy.javamod.main.gui.playlist.*;
import de.quippy.javamod.main.gui.tools.*;
import de.quippy.javamod.main.playlist.*;
import de.quippy.javamod.main.playlist.cuesheet.*;
import de.quippy.javamod.mixer.*;
import de.quippy.javamod.mixer.dsp.*;
import de.quippy.javamod.mixer.dsp.iir.*;
import de.quippy.javamod.mixer.dsp.iir.filter.*;
import de.quippy.javamod.mixer.dsp.pitchshift.*;
import de.quippy.javamod.multimedia.*;
import de.quippy.javamod.multimedia.ape.*;
import de.quippy.javamod.multimedia.flac.*;
import de.quippy.javamod.multimedia.midi.*;
import de.quippy.javamod.multimedia.mod.*;
import de.quippy.javamod.multimedia.mod.loader.*;
import de.quippy.javamod.multimedia.mod.loader.instrument.*;
import de.quippy.javamod.multimedia.mod.loader.pattern.*;
import de.quippy.javamod.multimedia.mod.loader.tracker.*;
import de.quippy.javamod.multimedia.mod.mixer.*;
import de.quippy.javamod.multimedia.mod.mixer.interpolation.*;
import de.quippy.javamod.multimedia.mp3.*;
import de.quippy.javamod.multimedia.mp3.id3.*;
import de.quippy.javamod.multimedia.mp3.id3.exceptions.*;
import de.quippy.javamod.multimedia.mp3.streaming.*;
import de.quippy.javamod.multimedia.ogg.*;
import de.quippy.javamod.multimedia.ogg.metadata.*;
import de.quippy.javamod.multimedia.sid.*;
import de.quippy.javamod.multimedia.wav.*;
import de.quippy.javamod.system.*;
import de.quippy.javamod.test.*;
import de.quippy.jflac.*;
import de.quippy.jflac.frame.*;
import de.quippy.jflac.io.*;
import de.quippy.jflac.metadata.*;
import de.quippy.jflac.util.*;
import de.quippy.jmac.decoder.*;
import de.quippy.jmac.info.*;
import de.quippy.jmac.prediction.*;
import de.quippy.jmac.tools.*;
import de.quippy.mp3.decoder.*;
import de.quippy.ogg.jogg.*;
import de.quippy.ogg.jorbis.*;
import de.quippy.sidplay.libsidplay.*;
import de.quippy.sidplay.libsidplay.common.*;
import de.quippy.sidplay.libsidplay.common.mos6510.*;
import de.quippy.sidplay.libsidplay.components.mos6526.*;
import de.quippy.sidplay.libsidplay.components.mos656x.*;
import de.quippy.sidplay.libsidplay.components.sidtune.*;
import de.quippy.sidplay.libsidplay.components.xsid.*;
import de.quippy.sidplay.libsidplay.mem.*;
import de.quippy.sidplay.resid_builder.*;
import de.quippy.sidplay.resid_builder.resid.*;
import procmod.*;

For reference the lib is located here: https://github.com/sphaero/procmod

I guess it's caused by a package source being included in the src folder?

Any pointers really appreciated.

How to use the same import with multiple libraries ?

It seems inside the Processing editor (PDE) one can use a single library that uses an underlying java library. Here’s an example:

multiple import

One workaround would be for one of these Processing libraries to use the JBox2D underlying java library and the other two Processing libraries to use the first as a dependency, however coordinating something like this sounds unlikely.

What would be the elegant solution ?

Thank you so much,
George

P.S. I've posted the same question on the Processing forum

Using downloaded package

I started a new empty library project following the steps in Option B, and downloaded the latest Eclipse template zip package (0.5.3). When I use it to import the source files, I get a subfolder named processing-library-template-0.5.3 inside the root of my new library project in Eclipse:

zip_import

The resources are located inside this subfolder, but shouldn't they be placed directly inside the root of the Eclipse project?

I'm using Eclipse 4.2.2 on OSX 10.8.4

Is it lib or libs?

Hi, I see the repo includes a lib folder, but the readme mentions creating a libs folder. Is it one, the other or both? Cheers!

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.