uportal-project / uportal-start Goto Github PK
View Code? Open in Web Editor NEWCLI tools for implementing uPortal, beginning with version 5.0.0
License: Apache License 2.0
CLI tools for implementing uPortal, beginning with version 5.0.0
License: Apache License 2.0
This feature was entirely removed for uP5.
This issue includes 2 items:
There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.
Error type: Cannot find preset's package (github>whitesource/merge-confidence:beta)
Is your feature request related to a problem? Please describe.
No, not a problem. I am using Docker to package pre-built developer environments. The embedded HSQL database or Tomcat spawn independent child processes, and this presents unique challenges when trying to do process coordination within a Docker container. The default spawn: true
is fine for most situations, but there are circumstances when it would be nice to override this.
To sum it up: define an option for the HSQL or Tomcat tasks to create foreground processes while retaining the existing conveniences of the Gradle task config.
Describe the solution you'd like
Replace spawn: true
for the hsqlStart
and tomcatStart
tasks with (project.findProperty('antNoSpawn') == 'true') ? false : true
Describe alternatives you've considered
Hacky Bash scripting inside the containers. It can work, but emphasis on how hacky it is.
Additional context
Allowing the Gradle tasks to create foreground processes would allow easier process coordination with tools such as Supervisord or Monit (inside or outside of a container environment).
Tested with the following scenarios:
./gradlew --console=plain -PantNoSpawn=true hsqlStart
and./gradlew --console=plain hsqlStart
Is your feature request related to a problem? Please describe.
For a clean, lean Tomcat deployment from these binaries, deployers have to manually remove logs, temp files, and unneeded webapps.
Describe the solution you'd like
Update Gradle tasks that wrap up Tomcat to ignore logs/,work/, temp/, portal/, webapps/docs, webapps/examples, webapps/host-manager, and webapps/manager.
Describe the bug
A clear and concise description of what the bug is.
Waffle-menu has some style problems
Screenshots
see here some screenshots
on chrome when openning the waffle-menu:
and on firefox developper edition + firefox 64.0.2 when accessing only:
Platform:
Also include all required components, as well as ship with a working integration between the two.
Describe the bug
#227 removed CompileLess but without removing tomcatDeploy. So the tomcatDeploy remove and doesn't deploy local/custom used skins and it break the deployed app (the portal serve page without skin)
To Reproduce
Steps to reproduce the behavior:
:overlays:uPortal:tomcatClean
and :overlays:uPortal:tomcatDeploy
Expected behavior
dataImport should not run :overlays:uPortal:tomcatClean
and :overlays:uPortal:tomcatDeploy
or remove #227 commits
Describe the bug
Update lowercase IDs to uppercase on lines 48 and 51 in all-lo.fragment-layout.xml
Additional context
Can cause subtle layout errors in surrounding folders/channels
Is your feature request related to a problem? Please describe.
Sometimes we forget if Tomcat or HSQL are running. Other times Tomcat does not stop after running ./gradlew tomcatStop
.
Describe the solution you'd like
Given the start and stop tasks for Tomcat and HSQL, I would like a two new tasks that report if those services are currently running.
Describe alternatives you've considered
Currently, I run pgrep -f tomcat
and pgrep -f hsql
to check if they are running. This does not work on Windows, however.
None of the Import/Export tasks...
dataDelete
dataExport
dataImport
dataInit
dataList
Have a description
field set, and they should. It gives us an opportunity to document things like "pass -Dfile={path} to import a file" and so forth.
Is your feature request related to a problem? Please describe.
In a new training exercise, several Docker issues surfaced but we came up with solutions. We need to capture these for the community.
Describe the solution you'd like
New document page to cover Docker.
uPortal-start should have a check for the Java version it's running on
Is your feature request related to a problem? Please describe.
Most deployments require IPv4 rather than IPv6. This should be configured as the the default.
Describe the solution you'd like
Add the following to etc/tomcat/bin/setenv.sh and etc/tomcat/bin/setenv.bat:
-Djava.net.preferIPv4Stack=true
-Djava.net.preferIPv4Addresses=true
uPortal-start now runs tasks in parallel by default.
Most of the official Gradle tasks support parallel execution already.
Custom tasks need to implement the Gradle worker API to support parallel execution.
https://docs.gradle.org/current/userguide/custom_tasks.html#worker_api
This is related to uPortal-Project/uPortal#1739 .
Adopters would like to disable JGroups with minimal effort.
Generate documentation on how use the file from uP#1739 to disable JGroups.
Describe the bug
Building on a computer with OSX/Windows/Ubuntu triggers errors if Growl/Snarl/notify-send is not installed for the Gradle build-announcements plugin to use.
To Reproduce
Steps to reproduce the behavior:
./gradlew clean portalInit
on a computer without the above softwareExpected behavior
No errors from build-announcements
when above software is not installed
Platform:
Additional context
Consider using gradle.properties and conditional plugin loading with a default of disabled to address this issue.
See:
https://docs.gradle.org/current/userguide/announce_plugin.html#announce_plugin
https://stackoverflow.com/questions/36039793/android-gradle-conditionally-apply-plugin-based-on-build-type
One of the big themes for uPortal 5 is "reduced learning curve/greater ease of adoption." One way in which we hope to make improvements in this area is by separating the core/internal uPortal source code from the resources you will want to edit or add to as an adopter of uPortal.
As it stands (in uPortal 4.3.x), every ounce of uPortal technology is in a single, ~5000 file Git repository. You are required -- as a uPortal implementer -- to clone this entire repo, to know (somehow) which 20 or 30 files in that immense collection you are supposed to customize, to make those changes, and finally to build the entire uPortal universe every time you want to deploy a change you make.
We can do better.
For uPortal 5, the plan is to split the (large amounts of) core/internal uPortal source code from the (relatively few) items a typical adopter will want to adjust. This plan will allow the community of uPortal developers to publish (within Maven Central) binary releases of uPortal that are actually used by the adopters of uPortal in their deployments. (That is not the way it works currently; the only way to deploy uPortal is to build it -- all of it -- yourself.)
NOTE: You will be able to -- of course -- build & use a custom distribution of the core/internal uPortal technology if you choose to do so; there will be some who do. Even then, your deployments will be remarkably quicker & simpler.
So we plan to split what is core/internal from what is local/custom. The core/internal elements will remain in the (current) uPortal Git repository. And BTW... these elements now have a 100% Gradle-based build! (For those keeping score, that means 0% Ant and 0% Maven -- just 1 build tool!)
We plan to put the (relatively small number of) local/custom elements into a new repo. A "typical" adopter should only ever need to clone this repo, since the core/internal elements will come from Maven Central.
The responsibilities of this component include...
Is your feature request related to a problem? Please describe.
Each time running dataImport task it run the compileLess task as dependency (maybe from prepareSkin task), whereas it's totaly useless
Describe the solution you'd like
remove from dependency task the compileLess task
Describe the bug
Creating and attempting to run a Docker uPortal Demo image when a skin has been generated breaks the demo.
To Reproduce
Steps to reproduce the behavior:
./gradlew skinGenerate -DskinName=test
(any valid name works)./gradlew dockerBuildImages
docker run -it -p 8080:8080 apereo/uportal-demo
Expected behavior
uportal-demo starts successfully.
I hope we're not going to use the GitHub Wiki feature, instead more virtuously using a docs directory so that documentation can be versioned with the software it documents.
But if we are going to use that Wiki, I hope we're going to do so intentionally and thoughtfully.
Turn off the Wiki feature until and unless we're ready to use it intentionally and thoughtfully.
Most uPortal implementors will create a skin, many have more than one.
The process is well documented in https://jasig.github.io/uPortal/implement/frontend/SKINNING_UPORTAL.html.
However it could be a time saver to have a Gradle task that accepts a skin name as a parameter, and automatically generates the appropriate files and folders.
This would enable designers/developers to have a quick, easy, and consistent way to generate skins.
I don't think we're ready to use the GitHub Projects feature with this repository. We may well find opportunities to use that feature in the future, but we're not using it right now, so right now it's adding more UI noise than it is adding value. Turn it off until it needs to be turned on.
Add following to etc/portal/uPortal.properties under example signatureKey prop when uPortal is updated to 5.6.1:
## Signature algorithm option, one of:
## HS256, HS384, HS512, RS256, RS512, ES256, ES384, ES512, PS256, PS384, PS512
##
## See: https://github.com/jwtk/jjwt/blob/master/api/src/main/java/io/jsonwebtoken/SignatureAlgorithm.java
##
#org.apereo.portal.soffit.jwt.signatureAlgorithm=HS512
In the Please Register portlet the "list your deployment of uPortal alongside the many others already registered" link is broken
Is your feature request related to a problem? Please describe.
The skin aggregation script like implemented in uPortal project is missing here for custom skins if we want to use them in a static way.
i.e. only the portlet aggregator can provide an aggregated skin as the skin.aggr.xml is provided from default skin and isn't builded with customizations.
Due to that we can't include into a skin some custom js (we need to load them from a portlet), they are only included into the skin.xml and not into skin.aggr.xml.
On an other way the system property to disable aggregation don't work anymore (due to systme property not read for this property + property name changed at one place and not on lib dependency about the aggregation
Describe the solution you'd like
Adding Esup-Filemanager portlet as overlay and configure it for a demo purpose.
Recent testing shows that these tasks are broken. The tomcat.base value is not available.
The default tomcat context.xml file included with uPortal-start doesn't increase the resource cache size as recommended here: https://github.com/Jasig/uPortal-start/tree/master/docs/en/tomcat
There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.
File: renovate.json
Error type: Invalid JSON (parsing failed)
Message: Syntax error: expecting end of expression or separator near {
Gradle supports re-using up-to-date artifacts to lower the amount of work the build system needs to do by default.
Gradles official tasks already have this feature enabled by default, custom tasks have this feature disabled by default.
uPortal-start implements some custom tasks we should investigate if we can enable incremental build annotations for these tasks.
https://docs.gradle.org/current/userguide/custom_tasks.html#incremental_tasks
https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks
https://github.com/Jasig/uPortal-start/tree/master/buildSrc/src/main/groovy/org/apereo/portal/start/gradle/plugins
We expect more & more adopters to run uPortal in containers, especially Docker. It will be a great help if the community implements a "Standard" way to do Docker.
Is your feature request related to a problem? Please describe.
Most production deployments are in a cluster with a load balancer. Due to session ID generation's dependency on each user's IP, Tomcat must be configured with RemoteIpValve.
Describe the solution you'd like
Configure RemoteIpValve
in server.xml, preferably with a token for internalProxies
that can be set via external configuration.
Is your feature request related to a problem? Please describe.
Each environment needs has different memory constraints and pass different host names for proxy CAS.
Describe the solution you'd like
A file that can be set per environment, similar to uPortal.conf
Describe alternatives you've considered
TBD
Additional context
This was suggested by @jgribonvald, thanks @jgribonvald!
Describe the bug
Portal init fails on latest uPortal 5.3.0 snapshot
To Reproduce
Steps to reproduce the behavior:
./gradle install
in uPortal at version uPortal-Project/uPortal@fb385905.3.0-SNAPHOT
./gradle portalInit portalOpen
Expected behavior
Build succeeds.
Stacktrace
FAIL: profile - defaultTemplateUser_default.profile.xml
--------------------------------------------------------------------------------
org.danann.cernunnos.ManagedException: The Cernunnos Runtime encountered an error:
Origin Document: file:/home/christian/Projects/uPortal/uPortal-start/.gradle/tomcat/webapps/uPortal/WEB-INF/classes/org/jasig/portal/io/import-profile_v3-2.crn
Source: /sql-transaction/with/subtasks/with/subtasks/sql-transaction/sql-upsert
Entity Name: <sql-upsert>
at org.danann.cernunnos.runtime.RuntimeTaskDecorator.perform(RuntimeTaskDecorator.java:93)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:148)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:123)
at org.danann.cernunnos.sql.TransactionTask.access$300(TransactionTask.java:40)
at org.danann.cernunnos.sql.TransactionTask$PerformSubtasksTransactionCallback.doInTransactionWithoutResult(TransactionTask.java:141)
at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.danann.cernunnos.sql.TransactionTask.perform(TransactionTask.java:115)
at org.danann.cernunnos.runtime.RuntimeTaskDecorator.perform(RuntimeTaskDecorator.java:77)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:148)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:123)
at org.danann.cernunnos.core.WithTask.perform(WithTask.java:90)
at org.danann.cernunnos.runtime.RuntimeTaskDecorator.perform(RuntimeTaskDecorator.java:77)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:148)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:123)
at org.danann.cernunnos.core.WithTask.perform(WithTask.java:90)
at org.danann.cernunnos.runtime.RuntimeTaskDecorator.perform(RuntimeTaskDecorator.java:77)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:148)
at org.danann.cernunnos.AbstractContainerTask.performSubtasks(AbstractContainerTask.java:123)
at org.danann.cernunnos.sql.TransactionTask.access$300(TransactionTask.java:40)
at org.danann.cernunnos.sql.TransactionTask$PerformSubtasksTransactionCallback.doInTransactionWithoutResult(TransactionTask.java:141)
at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.danann.cernunnos.sql.TransactionTask.perform(TransactionTask.java:115)
at org.danann.cernunnos.runtime.RuntimeTaskDecorator.perform(RuntimeTaskDecorator.java:77)
at org.danann.cernunnos.runtime.ScriptRunner$TaskDecorator.perform(ScriptRunner.java:436)
at org.danann.cernunnos.runtime.ScriptRunner.run(ScriptRunner.java:288)
at org.danann.cernunnos.runtime.PojoTask.perform(PojoTask.java:202)
at org.apereo.portal.io.xml.crn.CernunnosDataImporter.importDataElement(CernunnosDataImporter.java:50)
at org.apereo.portal.io.xml.crn.AbstractDom4jImporter.importData(AbstractDom4jImporter.java:72)
at org.apereo.portal.io.xml.crn.AbstractDom4jImporter.importData(AbstractDom4jImporter.java:41)
at org.apereo.portal.io.xml.JaxbPortalDataHandlerService.importOrUpgradeData(JaxbPortalDataHandlerService.java:787)
at org.apereo.portal.io.xml.JaxbPortalDataHandlerService.importData(JaxbPortalDataHandlerService.java:726)
at org.apereo.portal.io.xml.JaxbPortalDataHandlerService.importData(JaxbPortalDataHandlerService.java:759)
at org.apereo.portal.io.xml.JaxbPortalDataHandlerService$1.callWithoutResult(JaxbPortalDataHandlerService.java:618)
at org.apereo.portal.concurrency.CallableWithoutResult.call(CallableWithoutResult.java:24)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [
INSERT INTO up_user_profile(user_id, profile_id, profile_fname, profile_name, description, layout_id, structure_ss_id, theme_ss_id)
VALUES(?, ?, ?, ?, ?, ?, ?, ?)
]; integrity constraint violation: NOT NULL check constraint; SYS_CT_10705 table: UP_USER_PROFILE column: USER_ID; nested exception is java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10705 table: UP_USER_PROFILE column: USER_ID
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:85)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:82)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:655)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:937)
at org.danann.cernunnos.sql.UpsertTask.doInsert(UpsertTask.java:180)
at org.danann.cernunnos.sql.UpsertTask.perform(UpsertTask.java:149)
at org.danann.cernunnos.runtime.RuntimeTaskDecorator.perform(RuntimeTaskDecorator.java:77)
... 39 more
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10705 table: UP_USER_PROFILE column: USER_ID
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at sun.reflect.GeneratedMethodAccessor127.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:235)
at com.sun.proxy.$Proxy222.executeUpdate(Unknown Source)
at sun.reflect.GeneratedMethodAccessor127.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:235)
at com.sun.proxy.$Proxy222.executeUpdate(Unknown Source)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:883)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:876)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:639)
... 44 more
Platform:
Describe the bug
Skinning guide refers to files and paths that don't exist in uPortal 5
To Reproduce
Steps to reproduce the behavior:
Visit https://github.com/Jasig/uPortal/blob/master/docs/implement/frontend/SKINNING_UPORTAL.md
Expected behavior
Documentation should include information on new gradle task and files.
Platform:
uPortal Version: uPortal 5.0+
Add a README.md document describing how to setup and use uPortal-start
Add Travis CI and AppVeyor CI to automatically test code.
Describe the bug
When starting tomcat after deploying the bundled tomcat, the following errors appear and tomcat fails to start:
From deployment logs:
08-Oct-2018 11:18:58 | [sshexec] /apps/uportal/tomcat/bin/setenv.sh: line 33: [: missing ']'
...
08-Oct-2018 11:18:58 | [sshexec] /apps/uportal/tomcat/bin/setenv.sh: line 39: [: missing ']'
It looks like a spacing issue in the setenv.sh file on lines 33 and 39. I think there should be a space before the ] on those lines.
To Reproduce
Expected behavior
Tomcat should start without error.
Stacktrace
See snip from log output on running startup.sh.
Platform:
Sometimes when running through the uPortal-start test suite Windows CI will fail due to an inability to delete a log file.
Root cause is currently unknown.
๐ ๐ค The Tomcat process hanging on to log file after it has been closed is a likely candidate for cause.
Example Log
FAILURE: Build failed with an exception.
* Where:
Script 'C:\projects\uportal-start\gradle\tasks\tomcat.gradle' line: 133
* What went wrong:
Execution failed for task ':tomcatClearLogs'.
> Unable to delete file: C:\projects\uportal-start\.gradle\tomcat\logs\catalina.{date}.log
๐ทโโ๏ธ โ ๐ https://ci.appveyor.com/project/ChristianMurphy/uportal-start/build/1.0.57#L2673
Describe the bug
NotificationPortlet attempts to create tables that exceed the Oracle Object Name limit in versions previous to 12.2. Databases need to be configured with COMPATIBLE set to 12.2.
To Reproduce
Steps to reproduce the behavior:
./gradlew portalInit portalOpen
ORA-00972
Expected behavior
Tables successfully created.
Additional context
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Database-Object-Names-and-Qualifiers.html#GUID-75337742-67FD-4EC0-985F-741C93D918DA
When using an older version of uPortal (i.e. uPortalVersion=5.0.5) because milestone, the HSQL libs could be in a state where there are two versions.
$ find -name 'hsql*.jar'
./.gradle/tomcat/webapps/uPortal/WEB-INF/lib/hsqldb-2.3.2.jar
./.gradle/tomcat/webapps/uPortal/WEB-INF/lib/hsqldb-2.4.0.jar
This results in data import/init errors and HsqlExceptions like the following (if one happens to be running HSQL in the foreground)
org.hsqldb.HsqlException: HSQLDB server version is '2.4.0' client version '2.1.0.0' is not compatible.
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.server.ServerConnection.init(Unknown Source)
at org.hsqldb.server.ServerConnection.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
./gradlew portalInit
./gradlew clean tomcatClean portalInit
There appears to be a disagreement between how Gradle on the command line and Gradle in the IDE (at least IntelliJ) evaluate relative paths within buildSrc/gradle.properties.
The command line likes: 'gradle.properties'
But the IDE likes '../gradle.properties'
To find the same file.
The tomcat host startStopThreads setting is currently hard-coded to 4, which is ideal for a 4-core system, but not for any other setup.
Tomcat has a special setting for startStopThreads where if you set it to 0, it will detect how many cores your system has and use that many threads for startup. https://tomcat.apache.org/tomcat-8.5-doc/config/host.html
We should switch the default value of this setting from 4 to 0.
The ESUP file-manager is now on the Welcome tab (quickstart data set) by default.
It's a great addition, but I detect 3 new regressions when the portlet is present:
Switching on parallel mode in gradle has uncovered some previously missed inter-dependencies between tasks, that become apparent when tasks are run in parallel.
tomcatInstall
needs to happen before any tomcatDeploy
taskstomcatInstall
may need to happen before tomcatClean
tasksParallel mode enabled: #60
Visualization generator: #66
Gradle ordering docs: https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:ordering_tasks
Is your feature request related to a problem? Please describe.
New implementers have run into the issue of not setting JAVA_HOME environment variable.
Describe the solution you'd like
This should be called out as a prerequisite.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.