Giter Club home page Giter Club logo

geoserver-geonode-ext's Introduction

geoserver-geonode-ext

GeoNode extends GeoServer with certain JSON, REST, and security capabilities.

Security

GeoServer delegates authentication and authorization to GeoNode.

When the GeoServer plugin sees a request, it attempts to authorize with GeoNode:

  • If the request has a valid sessionid cookie (this links to a user in GeoNode), GeoNode looks up the user's permissions and replies.

  • If there are HTTP credentials in the request (via the HTTP_AUTHORIZATION header) and they match those configured in the OGC_SETTINGS, GeoNode replies that this user is a super-user.

  • Uploads is a special case: here, GeoNode makes the original request using the OGC_SETTINGS credentials.

JSON

TODO

.. todo:: Document GeoServer GeoJSON extensions

REST

TODO

.. todo:: Document GeoServer REST extensions

geoserver-geonode-ext's People

Contributors

afabiani avatar berrydaniel avatar capooti avatar cspanring avatar dependabot[bot] avatar etj avatar francbartoli avatar garnertb avatar giohappy avatar groldan avatar ingenieroariel avatar ischneider avatar jean avatar jj0hns0n avatar kalxas avatar lgtm-migrator avatar lpasquali avatar matthewhanson avatar mattiagiupponi avatar mweisman avatar randomorder avatar sharon-tickell avatar simod avatar taba90 avatar

Stargazers

 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

geoserver-geonode-ext's Issues

Enable local and disk-quota in-process lock

Locking was disabled because of the issues encountered with GWC disk quota in the past.
However, as suggested in geosolutions-it/geoserver#347, locking must be enabled. Since, apparently, the old issue is mainly related to NIO locks. in-process locking should work fine as an alternative mechanism.

in-process (memoryLock) locking will be re-enabled both in global.xml and geowebcache-diskquota.xml.

Blacklisted Processes

I just found in my Docker setup logs:

geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process geonode:BatchDownload as the input LAYERS of type class org.geonode.process.batchdownload.LayerReference cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process geonode:BatchDownload as the input map of type class org.geonode.process.batchdownload.MapMetadata cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process geonode:BatchDownload as the output ZippedFile of type interface org.geonode.process.storage.Resource cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Found 0 bindable processes in Batch Downloader
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process ras:ConvolveCoverage as the input kernel of type class javax.media.jai.KernelJAI cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process ras:RasterZonalStatistics2 as the input zones of type class java.lang.Object cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process ras:RasterZonalStatistics2 as the input nodata of type class it.geosolutions.jaiext.range.Range cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process ras:RasterZonalStatistics2 as the input rangeData of type class java.lang.Object cannot be handled
geoserver4geonode | 02 Apr 13:28:08 INFO [geoserver.wps] - Blacklisting process ras:RasterZonalStatistics2 as the output zonal statistics of typeinterface java.util.List cannot be handled

I do not know if those processes are critical?

AuthCache: make the timeout configurable

This issue is referencing a request reported in #30.

[...] it is normal practice to cache credentials upon login for a certain period of time. 2 secs for
GeoNode is an overkill since re-checking means having geonode pushing to GeoServer the entire
list of layers and when you have a large number of layers this kills GeoServer performances.

HTTPClient auth issue in multiple threads

This issue is referencing the problem reported in #30.

The problem [...] was related to wrong usage of Apache HTTP Commons [...].
Sharing the same multithreaded HTTP connection pool at the GeoServer level when per session
cookies are involved and you have multiple users calling GeoServer itself in parallel has proven to
be problematic in the past and infact we noticed that in some cases cookies from different users got
messed up resulting in intermittent pink tiles and requiring a restart to fix the situation.

mapfish-print-v2 no longer buildable due to time and neglect

I am at the foss4g 2023 code sprint looking at upgrading things for the cross-project opengis harmonization thing.

I have found is that the https://github.com/mapfish/mapfish-print-v2 project is no longer buildable using a modern environment (Java 11, Gradle, Jetty) etc...

  • I have some experience with this project last year with "Switch from iText to OpenPDF module" activity because it left my employer and customers vulnerable.

  • In this case the gradle 3 environment does not support Java 11, and then upgrading to an appropriate gradle environment 5, the plugin for jetty (local testing) and maven (publishing to nexus repo) no longer functions. Upgrading from jetty plugin to getty plugin, and from maven to maven-publish plugin is more effort than I wish to consider.

The current gradle environment is version 8 (so you can see how unmaintained the above is).

Discussion:

  • Can you confirm that GeoNode cares about this functionality?

    If so can you supply resources to update or replace mapfish-print-v2. You have a budget from OSGeo both as a project team, and as part of the above OpenGIS Harmonization project.

  • If this was me doing this I would remove gradle and add a maven pom.xml file, or start new gradle project with modern/supported environment

I would of course love to see a standalone geoserver-print module created that meets your needs, as depending on the inactive is poor risk management.

Oauth Client ID not conifugred correctly in Geoserver memory until manually saved

It already happened a few times to me with three different GeoNode 4.1.x projects (Geoserver 2.23.0) run with Docker compose.

  1. The Oauth2 client id and secret that are configured inside the .env file are correctly set automatically in Geoserver, I can see it from the usual geonode-oauth2 authentication filter page.
  2. Try to login in Geoserver with the GeoNode button (oauth2 login). it fails because of an invalid client id. Indeed, the wrong id is visible in the URL(maybe a default value from Geoserver?).
  3. Save the authentication configuration in Geoserver (clicking s both ave inside the geonode-oauth2 filter page, and the parent page).
  4. The oauth2 login uses the expected Client id and succeeds

Notice that doing a Reload of Geoserver catalog doesn't solve the problem.

Apparently, the configuration of Geoserver happening when the Docker services are run for the first time brings to an inconsistent state of the Geoserver catalog, which can only be resolved with the Save action.

Review builds for unwanted jars

This happened with a GeoServer 2.19.7:

 java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/geoserver] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]

causing a bootloop.

TL;DR; Full stacktrace
03-Mar-2023 09:27:04.647 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/apache-tomcat-9.0.31/web
apps/geoserver.war]
03-Mar-2023 09:27:08.332 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/opt/apache-tomcat-9.
0.31/webapps/geoserver.war]
        java.lang.IllegalStateException: Error starting child
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:720)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
                at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1849)
                at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
                at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576)
                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
                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.catalina.startup.Bootstrap.start(Bootstrap.java:343)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/geoserver]]
                at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
                ... 37 more
        Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/geoserver] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
                at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2186)
                at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2124)
                at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2070)
                at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:2040)
                at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1993)
                at org.apache.catalina.startup.ContextConfig.processClasses(ContextConfig.java:1243)
                at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1142)
                at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:774)
                at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5051)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                ... 38 more

It turned out we have a bit too many bouncycastle jars, so a race condition popped up when the wrong jar got loaded first; here some involved jars:

geoserver-geonode-ext/geoserver/web-app$ ll target/geoserver/WEB-INF/lib/bc*
-rw-rw-r-- 1 geosol geosol  192035 feb  6 20:01 target/geoserver/WEB-INF/lib/bcmail-jdk14-138.jar
-rw-rw-r-- 1 geosol geosol   93894 feb  6 20:01 target/geoserver/WEB-INF/lib/bcmail-jdk14-1.64.jar
-rw-rw-r-- 1 geosol geosol  738270 feb  6 20:01 target/geoserver/WEB-INF/lib/bcpkix-jdk14-1.64.jar
-rw-rw-r-- 1 geosol geosol 1551468 feb  6 20:01 target/geoserver/WEB-INF/lib/bcprov-jdk14-138.jar
-rw-rw-r-- 1 geosol geosol 4189874 feb 10 16:51 target/geoserver/WEB-INF/lib/bcprov-jdk15on-1.60.jar
-rw-rw-r-- 1 geosol geosol   39985 feb  6 20:01 target/geoserver/WEB-INF/lib/bctsp-jdk14-1.46.jar

As a first try, bcprov-jdk14-138.jar was removed, and this made GeoServer boot properly.

mvn dependency:tree reports these dependencies:

[INFO] +- org.xhtmlrenderer:flying-saucer-pdf:jar:9.1.20:compile
[INFO] |  +- org.bouncycastle:bcmail-jdk14:jar:1.64:compile
[INFO] |  |  \- org.bouncycastle:bcpkix-jdk14:jar:1.64:compile
[INFO] |  \- org.bouncycastle:bctsp-jdk14:jar:1.46:compile
[INFO] +- com.lowagie:itext:jar:2.1.5:compile
[INFO] |  +- bouncycastle:bcmail-jdk14:jar:138:compile
[INFO] |  \- bouncycastle:bcprov-jdk14:jar:138:compile

The only other bouncycastle dep, that is org.bouncycastle:bcprov-jdk15on:jar:1.60:compile is imported by gs-web-core.

in this project we have:

        <dependency>
          <groupId>org.xhtmlrenderer</groupId>
          <artifactId>flying-saucer-core</artifactId>
          <version>9.1.20</version>
          <exclusions>
            <exclusion>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk14</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
        <dependency>
          <groupId>org.xhtmlrenderer</groupId>
          <artifactId>flying-saucer-pdf</artifactId>
          <version>9.1.20</version>
          <exclusions>
            <exclusion>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk14</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.5</version>
        </dependency>

so the bcprov-jdk14 is already excluded from the xhtmlrenderer, but not from itext.

  • exclude bcprov-jdk14 from itext
  • rebuild and re-deploy the artifact
  • investigate to find out if the added dependencies are really needed, and either remove them, or find a more recent version that does not include jdk14 related libs
  • perform this check on the various deployed GeoServer versions

update readme

Hi !

Would it be possible to update the readme (which is 4 years old), to explain in details what feature this extensions provides ?

Currently it's quite a black box if not digging in the code (which is not easy for non-java/geoserver devs).

  • it seems to provide the /rest/printng/render.png endpoint, but it's not documented at all. From first investigations, it seems this endpoint is called from geonode with username and password in the get parameters (which is more or less giving away root account to anyone if geonode calls geoserver through unencrypted request)
  • the current readme talks about authentication, but I thought this was taken care of by authkey plugins

Thanks !

2.12.x fail to start

Apparently they weren't changed but now the start is broken. Verified into a tomcat container running in docker and also standalone.

Reported errors are:

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
16-Oct-2018 10:40:00.223 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
16-Oct-2018 10:40:00.227 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [/geoserver-2.12.x] startup failed due to previous errors
16-Oct-2018 10:40:00.240 INFO [localhost-startStop-1] org.geoserver.GeoserverInitStartupListener.contextDestroyed Beginning GeoServer cleanup sequence 

The first one about log4j2 seems to be that it can be ignored as it still appears from 2.13.x and 2.14.x which are starting well.

More detailed logs are:

docker-compose up -d brings up an error for Geonode 4.1.0

Expected Behavior

Install Geonode with Docker

Actual Behavior

When executing docker-compose up -d I get an error:

ERROR: for django Container "c3f210cb7cb0" is unhealthy
ERROR: Encountered errors while bringing up the project

Steps to Reproduce the Problem

1.cd /opt
2.sudo git clone https://github.com/GeoNode/geonode.git -b 4.1.0 —depth 1
3. cd geonode
4. docker-compose up -d

Specifications

  • GeoNode version:4.1.0
  • Installation type (vanilla, geonode-project):vanilla
  • Installation method (manual, docker):docker
  • Platform:Ubuntu 22.04 on VirtualBox
  • Additional details:

Oauth2 login is broken

The Geoserver Oauth2 login through GeoNode is broken in Geoserver 2.23.1.
This is due to a security patch in Spring Security Core that was introduced in the latest version of Geoserver, which fixes a critical CVE.

Of course, the upgrade of Spring security cannot be reverted. BTW we cannot downgrade GeoNode to GS 2.23.0 since it was affected by a critical bug in the backup and restore extension that was fixed in GS 2.23.1.

We must investigate what must be changed inside Geoserver Oauth2 extensions to make them work with the updated Spring security.

Issue with "Connection information for the geogig security logs database."

An issue with "Connection information for the geogig security logs database." is preventing GeoServer from starting properly. It looks like the url wasn't properly configured for production and still pointing to jdbc\:sqlite\:F\:\\work...

https://github.com/GeoNode/geoserver-geonode-ext/blob/master/src/main/webapp/data/geogig/config/security/logstore.properties#L18

--

04 Jan 22:14:15 ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'geogigSecurityLogStore' defined in URL [jar:file:/var/lib/tomcat8/webapps/geoserver/WEB-INF/lib/gs-geogig-2.9-SNAPSHOT.jar!/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: java.sql.SQLException: opening db: 'F:\work\code\java\geonode\geoserver-geonode-ext.GeoNode\src\main\webapp\data\geogig\config\security\securitylogs.db': Permission denied
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact

extra processes blacklisted in 2.3.x

The output in the logs looks like:

03 Jul 10:38:19 INFO [geoserver.wps] - Blacklisting process geonode:BatchDownload as the input LAYERS of type class org.geonode.process.batchdownload.LayerReference cannot be handled
03 Jul 10:38:19 INFO [geoserver.wps] - Blacklisting process geonode:BatchDownload as the input map of type class >org.geonode.process.batchdownload.MapMetadata cannot be handled
03 Jul 10:38:19 INFO [geoserver.wps] - Blacklisting process geonode:BatchDownload as the output ZippedFile of type interface >org.geonode.process.storage.Resource cannot be handled
03 Jul 10:38:19 INFO [geoserver.wps] - Found 0 bindable processes in Batch Downloader

two guava jars causing homepage error

There are two guava jars in the WEB-INF/lib directory that seem to be causing an error on the geoserver homepage, although geoserver seems to operate normally. Removing the older guava jar fixes the problem.

Error in GWC access

TMS getCapa is not working and asks for basic auth.

Some tests have been performed.

Responses using GeoServer 2.23.0 vanilla:

$ curl -si  http://localhost:8080/geoserver/gwc | head -n 1
HTTP/1.1 200 
$ curl -si  http://localhost:8080/geoserver/gwc/rest | head -n 1
HTTP/1.1 401 

Responses in development (gn 4.1.x, gs 2.23.0)

$ curl  -si 'https://development.demo.geonode.org/geoserver/gwc' | head  -n 1
HTTP/1.1 401 

Responses in stable (gn 4.0.x, gs 2.20.7)

$ curl  -si 'https://stable.demo.geonode.org/geoserver/gwc' | head  -n 1
HTTP/1.1 200
$ curl  -si 'https://stable.demo.geonode.org/geoserver/gwc/rest' | head  -n 1
HTTP/1.1 200

relation "security_genericobjectrolemapping" does not exist

After a fresh installation of GeoNode 2.4 I have tried the "Security Integration Optimization" [1] and it
works fine for authenticated user.
Unfortunately, for anonymous user it does not work due to a DB error.
"""
ERROR: relation "security_genericobjectrolemapping" does not exist
at character
"""

(geonode.security.models no longer contain the GenericObjectRoleMapping model)

[1] http://docs.geonode.org/en/dev/deploy/production.html#security-integration-optimization

Typo for gs-printing dependency

The pom includes what seems to be a typo for the GeoServer printing extension (gs-printing).

https://github.com/GeoNode/geoserver-geonode-ext/blob/master/pom.xml#L218-L223:

    <dependency>
        <groupId>org.opengeo.geoserver</groupId>
        <artifactId>printng</artifactId>
        <version>${geoserver.version}</version>
        <scope>runtime</scope>
    </dependency>

The section above pulls in a printng artifact from the geosolutions Maven repository that looks very much like the gs-printing artifact already being pulled in here:
https://github.com/GeoNode/geoserver-geonode-ext/blob/master/pom.xml#L112-L122:

    <dependency>
      <groupId>org.geoserver.extension</groupId>
      <artifactId>gs-printing</artifactId>
      <version>${geoserver.version}</version>
      <exclusions>
        <exclusion>
          <groupId>xerces</groupId>
          <artifactId>xercesImpl</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

I suspect we can get rid of the printng dependency declaration on lines 218-223, unless it has something in it that is needed that is not in the official gs-printing extension.

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.