GithubHelp home page GithubHelp logo

oracle / weblogic-deploy-tooling Goto Github PK

View Code? Open in Web Editor NEW
152.0 46.0 88.0 61.66 MB

WebLogic Deploy Tooling

Home Page: https://oracle.github.io/weblogic-deploy-tooling/

License: Universal Permissive License v1.0

ANTLR 0.02% Java 30.67% Python 65.15% Batchfile 1.61% Shell 2.26% HTML 0.01% Groovy 0.02% Mustache 0.26%
python weblogic automation continuous-testing wdt

weblogic-deploy-tooling's Introduction

WebLogic Deploy Tooling

WebLogic Deploy Tooling (WDT) makes it easy to stand up WebLogic environments and perform domain lifecycle operations in a repeatable fashion based on a metadata model that can be treated as source and evolve as the project evolves.

Many organizations use WebLogic Server, with or without other Oracle Fusion Middleware components, to run their enterprise applications. And, as more and more of these organizations move toward Continuous Delivery of their applications, the importance of automated configuration application deployment grows. This automation is often implemented using the WebLogic Scripting Tool (WLST) configuration and deployment scripting language, but this is challenging. Such scripts must be carefully updated as the project evolves or the project is deployed to different environments, such as test to production.

WebLogic Deploy Tooling removes the need for most WebLogic Server deployments to rely on hand-coded WLST scripts for automating routine domain creation and application deployment tasks. It lets you write a declarative, metadata model, describing the domain and applications (with their dependent resources), and provides single-purpose tools that perform domain lifecycle operations based on the content of the model. It also lets you specify simple mutations suitable for moving your model between different environments, such as between test and production.

WDT provides several single-purpose tools, all exposed as shell scripts (for both Windows and UNIX), that can:

  • Create or update a domain.
  • Populate a domain with all the resources and applications specified in a model.
  • Add resources and applications to an existing domain.
  • Introspect an existing domain and create a model file describing the domain and an archive file of the binaries deployed to the domain.
  • Encrypt the passwords in a model (or its variable file).
  • Validate a model as well as provide model usage information.
  • Compare model files.
  • Prepare model files for deploying to the WebLogic Kubernetes Operator environment.
  • Generate a domain resource YAML file for use with the WebLogic Kubernetes Operator.
  • Tokenize a model with variables.
  • Provide information about the folders and attributes that are valid for sections and folders of a domain model.

WebLogic Deploy Tooling version and release information can be found here.


Documentation

Documentation for WebLogic Deploy Tooling is available here.

This documentation includes information for users and for developers.

Related projects

Contributing

This project welcomes contributions from the community. Before submitting a pull request, please review our contribution guide.

Security

Please consult the security guide for our responsible security vulnerability disclosure process.

License

Copyright (c) 2017, 2024, Oracle and/or its affiliates.

Released under the Universal Permissive License v1.0 as shown at https://oss.oracle.com/licenses/upl/.

weblogic-deploy-tooling's People

Contributors

belfo avatar bobdonat avatar carolynrountree avatar ddsharpe avatar dependabot[bot] avatar ganeshs05 avatar gosurya-oracle avatar jshum2479 avatar jwgish avatar lennyphan avatar mriccell avatar mwooten avatar rakillen avatar rjeberhard avatar robertpatrick avatar rosemarymarano avatar rpatrick00 avatar slowy07 avatar spavlusieva avatar streamnsight avatar thefrogpad avatar wszczurek avatar xiancao 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar

weblogic-deploy-tooling's Issues

createDomain fails with coherence attribute in cluster

There is an ordering issue with the creation and configuring of CoherenceSystemResources. When the cluster attribute is used in a Cluster, the create will fail unless the value of that resource has already been created.

Cluster:
    'cluster-1':
        CoherenceTier:
        CoherenceClusterSystemResource: mycache

...
resources:
CoherenceClusterSystemResource:
mycache:
DescriptorFileName: 'coherence/mycache-coherence.xml'
Target: 'cluster-1'

WebLogic Dynamic Server macros conflict with WDT macros/variables

[https://docs.oracle.com/middleware/1212/wls/DOMCF/server_templates.htm#DOMCF222]
The listen address for dynamic servers must allow the following macros to be passed through to the configuration: ${id}, ${serverName}, ${clusterName}, ${domainName}, and ${system-property-name}.

Alias change needed for Partition PartitionWorkManager

Partition.json includes the PartitionWorkManager.json file. However, the wlst_type for PartitionWorkManager is PartitionWorkManager${:s}. This is correct for the global mbean in online wlst - it is /PartitionWorkManagers. For Partitions it is /Partitions/PartitionWorkManager. Remove the include for PartitionWorkManager in Partition.json and add the PartitionWorkManager folder with the correct wlst_type.

Alias change needed for ResourceManager in Partition

Partition.json and ResourceManagement.json both include ResourceManager.json. The wlst_type for ResourceManager is ResourceManager${:s}. The mbean type in online wlst is /ResourceManagement/ResourceManagers and Partition/ResourceManager.

Push from IntelliJ IDEA 2016.3.7 not working

git push origin some-branch is working from command line, but not from the IntelliJ IDE. Not sure if this is because of two-factor authentication or not, but it would be nice if we could somehow get it working.

Adjust tool entry-point python modules to pass sys.argv to main()

It looks like the entry-point python module for each tool, needs to have a slight modification in order to import them using the python imp module. That adjustment is to have the main() method be called with sys.argv, and change the code inside main() to use the passed in parameter, instead of the sys.argv global.

Resource messages from external projects need to be added to wlsdeploy_rb.properties file

It looks like the way that things are currently designed, the new weblogic-deploy-testing project has to use the same wlsdeploy_rb.properties file as the weblogic-deploy-tooling project, in order to use Java or python classes in the weblogic-deploy-tooling project. Currently, it looks like the PlatformLogger python wrapper (wlsdeploy/logging/platform_logger.py) only knows about a single bundle (xxx_rb.properties) file. You can pass the name of that single bundle file to the constructor, but doing that isn't the same as asking PlatformLogger to use multiple bundle files. The way it's currently designed, only the message IDs (e.g. WLSDPLY-09804) contained in that single bundle file, can be used.

This is not a bug. It's more of a design or implementation choice that was made, which can be worked around. Long term, it would be helpful if we could have a directory where the xxx_rb.properties a project needs could be placed. Then the maven build could read/concatenate them all together to create a single bundle file.

enhance model to support inline-ing file contents

I need a way to inline kubernetes secrets (from a file in the pod) into the model during a create operation. For example, the file, "my-pass.txt", contains a simple string "welcome1". Can we have a macro that lets me identify that file in the domain model yaml/json and inlines the contents during create?

Standalone mode validation results simplification

The validation results printed to stdout in standalone mode are organized by validation area (i.e. resources section, topology section, archive file validation, etc.), because the validation messages didn't always contain the model folder path (i.e. topology:/Server/m1/SSL). Now that they do, it would be better if the validation area was removed and the messages were just organized by severity level. That organization would be infos, followed by warnings, followed by errors. For example:

####<Mar 2, 2018 10:21:48 AM> <INFO> <validate> <__perform_model_file_validation> <WLSDPLY-05403> <Validation of D:\u01\paasdtools\sandbox\resources\TestDemoDomain.yaml completed with 4 error(s), 3 warning(s) and 4 info(s) items>

  Infos: 4
    Attribute SourcePath in model location appDeployments:/Application/get-listen-address-app references archive entry wlsdeploy/applications/get-listen-address-app.war but the archive file was not provided
    Attribute SourcePath in model location appDeployments:/Application/simpleear references archive entry wlsdeploy/applications/simpleear.ear but the archive file was not provided
    Attribute CustomIdentityKeyStoreFileName in model location topology:/Server/AdminServer references a relative file location /ORA/dbs01/oracle/product/Middleware/user_projects/domains/base_domain/security/ITDBIdentity.jks.      
    Attribute CustomTrustKeyStoreFileName in model location topology:/Server/AdminServer references a relative file location /ORA/dbs01/oracle/product/Middleware/user_projects/domains/base_domain/security/ITDBTrust.jks.  

  Warnings: 3
    Attribute ArchiveConfigurationCount in folder topology:/ is not supported in WebLogic version 12.2.1.2.0 but is supported in WebLogic version 12.2.1.3 and higher
    Attribute DbPassiveMode in folder topology:/ is not supported in WebLogic version 12.2.1.2.0 but is supported in WebLogic version 12.2.1.3 and higher
    Attribute DbPassiveModeGracePeriodSeconds in folder topology:/ is not supported in WebLogic version 12.2.1.2.0 but is supported in WebLogic version 12.2.1.3 and higher

  Errors: 4
    URLs is not one of the attribute names allowed in model location resources:/JDBCSystemResource/Generic1/JdbcResource/JDBCDriverParams
    KnownTyp is not one of the attribute names allowed in model location resources:/WLDFSystemResource/MyWldfModule/WLDFResource/Harvester/HarvestedType/weblogic.management.runtime.ServerRuntimeMBean
    Prova is not one of the folder names allowed in model location topology:/Server/AdminServer
    ListennnPort is not one of the attribute names allowed in model location topology:/Server/m1/SSL

Add variable file generation to discovery

Discovery should generate a model with variable placeholders for the common attribute values that need to change between environments (e.g., endpoints, user credentials, etc.). Discovery should populate the variable file with the values found in the environment (except for passwords, which should always be populated with a string indicating that they need to be specified).

SingleSignOn name

Hello,
I'm trying to configure the single sign on for the server

I tried in two different way:

SingleSignOnServices:
       AdminServer:
            Name: AdminServer
            WantArtifactRequestsSigned: true

or

SingleSignOnServices:
     Name: AdminServer
     WantArtifactRequestsSigned: true

but the result is always the same:

  <single-sign-on-services>
    <name>NO_NAME_0</name>
  </single-sign-on-services>

SSL listen port

Hello,

I'm having a problem configuring the SSL port for AdminServer (also Managed).

I have something like :

 
 TunnelingEnabled: true
 ListenAddress: wlsadmin
 ListenPort: 8001
 SSL:
     Enabled: true
     ListennnnnnPort: 7002
     ServerPrivateKeyAlias: myalias
     ServerPrivateKeyPassPhraseEncrypted: mypassword
     HostnameVerifier: "weblogic.security.utils.SSLWLSWildcardHostnameVerifier"

Both the validateModel.sh and the createDomain.sh scripts ignore the uncorrect attribute ListennnnnPort.
This happen just with the SSL configuration, infact if I do the same for the http listen port, the scripts complain about the typo.

When I introduce the typo, in the config.xml file under the ssl section there is not listen-port tag.

I'm using the weblogic-deploy 0.7 release. #21

Need to add a writeInputStreamToFile function to FileUtils.java

Right now, the build process puts resource files inside the .jar that get's created. For the new weblogic-deploy-testing project, i'm proposing that JSON/YAML files be used to describe test configuration types (e.g. integration, system, regression, etc.), which means they will end up inside the .jar file.

Adding a writeInputStreamToFile(InputStream inputstream, String fileName) function will allow me to retrieve those JSON/YAML files from the .jar, and write them into java.io.tmpdir. All the existing translator code that operates on physical files (as opposed to streams), can then just be provided the path to the file that was written to java.io.tmpdir.

Create Domain needs to support domains with multiple cluster types

In order to create more complex domains, the Create Domain tool needs to be able to create multiple clusters of different "types." For example, when creating a SOA domain, it is common to create one cluster for SOA and one cluster for OSB. To support this notion, the user needs to be able to influence the targeting of server groups to servers/clusters.

Add messageID to ValidationResults.log_results()

The log messages for validation results in tool mode, are missing the messageID (e.g. 'WLSDPLY-05006'). Enhancing the log_results() to include the messageID, calls for a change to the method signature for 3 methods (add_info, add_warning and add_error), and a slight change to the internal structure used to store the results. There are a couple ways to implement this change, but changing the methods to accept the messageID and arguments for the {n} sequences, seemed to be the cleanest approach. For example:

validation_result.add_error('WLSDPLY-05029', section_dict_key, model_folder_path,
valid_attr_infos.keys())

The second and remaining arguments (appearing in italics) are stored as a tuple, so that later when the log_results() method is called, everything is available to produce the messageID as well as the message.

need implementation of get_model_attribute_name in aliases

Aliases currently has get_wlst_attribute_name(location, model_name) that returns the wlst attribute name for the model attribute name. Add a corresponding get_model_attribute_name(location, wlst_attribute_name) to return the model attribute name for the provided wlst attribute name. This is needed for validation tests.

validation process

Hello,
I tried to add a random string to the AdminServer configuration like this (last line):

 AdminServer:
            TunnelingEnabled: true
            ListenAddress: wlsadmin
            ListenPort: 8001
            WeblogicPluginEnabled: true
            KeyStores: CustomIdentityAndCustomTrust
            CustomIdentityKeyStoreFileName: "/ORA/dbs01/oracle/product/Middleware/user_projects/domains/base_domain/security/ITDBIdentity.jks"
            CustomIdentityKeyStoreType: jks
            CustomIdentityKeyStorePassPhraseEncrypted: linux
            CustomTrustKeyStoreFileName: "/ORA/dbs01/oracle/product/Middleware/user_projects/domains/base_domain/security/ITDBTrust.jks "
            CustomTrustKeyStoreType: jks
            CustomTrustKeyStorePassPhraseEncrypted: linux
            Prova:
                ciao: true

when I run the validateModel.sh, it complains but returns exit code 0.

Validation Area: topology Section
-----------------------------------------------

  Errors: 1
    Message: Prova is not one of the folder names allowed in model location topology:/Server/AdminServer

validateModel.sh completed successfully (exit code = 0)

Probably in order to automate the process would be better to have an exit code with 1 and a different message at the end.

Add missing JMS attributes to aliases

/JMSSystemResource/JmsResource/DistributedTopic attribute SAFExportPolicy
/JMSSystemResource/JmsResource/DistributedQueue attribute SAFExportPolicy
/JMSSystemResource/JmsResource/ForeignServer attribute JNDIPropertiesCredential
/JMSSystemResource/JmsResource/ForeignServer/ForeignConnectionFactory attribute Password
/JMSSystemResource/JmsResource/ForeignServer/ForeignConnectionFactory attribute RemoteJNDIName
/JMSSystemResource/JmsResource/ForeignServer/ForeignDestination attribute RemoteJNDIName
/JMSSystemResource/JmsResource/Queue attribute DestinationKeys
/JMSSystemResource/JmsResource/Queue attribute JMSCreateDestinationIdentifier
/JMSSystemResource/JmsResource/Queue attribute SAFExportPolicy
/JMSSystemResource/JmsResource/SAFErrorHandling attribute SAFErrorDestination
/JMSSystemResource/JmsResource/SAFImportedDestinations/SAFQueue attribute RemoteJNDIName
/JMSSystemResource/JmsResource/SAFImportedDestinations/SAFTopic attribute RemoteJNDIName
/JMSSystemResource/JmsResource/SAFRemoteContext/SAFLoginContext attribute Password
/JMSSystemResource/JmsResource/Template attribute DestinationKeys
/JMSSystemResource/JmsResource/Topic attribute DestinationKeys
/JMSSystemResource/JmsResource/Topic attribute JMSCreateDestinationIdentifier
/JMSSystemResource/JmsResource/Topic attribute SAFExportPolicy
/JMSSystemResource/JmsResource/UniformDistributedQueue attribute DestinationKeys
/JMSSystemResource/JmsResource/UniformDistributedQueue attribute JMSCreateDestinationIdentifier
/JMSSystemResource/JmsResource/UniformDistributedQueue attribute SAFExportPolicy
/JMSSystemResource/JmsResource/UniformDistributedTopic attribute DestinationKeys
/JMSSystemResource/JmsResource/UniformDistributedTopic attribute JMSCreateDestinationIdentifier
/JMSSystemResource/JmsResource/UniformDistributedTopic attribute SAFExportPolicy

Allow ScriptRunner and ProcessHandler to support appending to stdout log

The are use cases where it makes sense to have ScriptRunner append to an existing stdout log, as opposed to always creating a new one. For instance, if you use ScriptRunner with an app that has a start and stop command, it more convenient to have the stdout of both of those commands go to the same stdout log.

This implementation for this enhancement, would involve adding another executeScript() method which accepts an appendFlag parameter. Applications that are already using the existing executeScript() method would still work as expected, because the default behavior is to not append to the specified stdout log file.

WLSDPLY-19028 message key typo

The resource bunlde has a typo in the name of the key for WLSDPLY-19028 that prevents the message from being properly substituted/formatted.

Admin credential logged during validation as plain text

####<Apr 25, 2018 8:34:19 PM> <__validate_domain_info_section>


####<Apr 25, 2018 8:34:19 PM> <__validate_attribute> <> <ENTRY AdminPassword welcome1 {'ServerStartMode': 'string', 'ServerGroupTargetingLimits': 'dict', 'AdminPassword': 'string', 'domainLibraries': 'list', 'AdminUserName': 'string'} [] domainInfo:/ model_folders = [], 'name_tokens' = {}>

try/catch missing a logger.severe()

The try/catch around __perform_model_file_validation() method, in validate.py, is missing a logger.severe line. Need to add one so that the user receives notification of the error, instead of just seeing the return of the command prompt and assuming everything is/was okay.

Discovery of 12.2.1.3 domain includes Cluster ServiceActivationRequestResponseTimeout

When discovering a 12.2.1.3 domain where none of the Cluster parameters were tweaked when creating the domain, the clusters have the ServiceActivationRequestResponseTimeout parameter with a value of zero, which appears to be the default value.

 Cluster:
    mycluster:
        ServiceActivationRequestResponseTimeout: 0
    yourcluster:
        ServiceActivationRequestResponseTimeout: 0
    hiscluster:
        ServiceActivationRequestResponseTimeout: 0

The alias files should be adjusted to try to eliminate this value showing up in the discovered model since it was not specified when the domain was created.

Discovery fails with NumberFormatException

When running discovery on a domain, discovery fails and a NumberFormatException is causing termination of the program:

####<Feb 26, 2018 6:30:47 PM> <get_shared_libraries> <Adding Shared Library transport-pollersdk#[email protected]>
Problem invoking WLST - Traceback (innermost last):
File "D:\demo\weblogic-deploy\lib\python\discover.py", line 421, in ?
File "D:\demo\weblogic-deploy\lib\python\discover.py", line 400, in main
File "D:\demo\weblogic-deploy\lib\python\discover.py", line 174, in __discover
File "D:\demo\weblogic-deploy\lib\python\wlsdeploy\tool\discover\deployments_discoverer.py", line 45, in discover
File "D:\demo\weblogic-deploy\lib\python\wlsdeploy\tool\discover\deployments_discoverer.py", line 73, in get_shared_libraries
File "D:\demo\weblogic-deploy\lib\python\wlsdeploy\tool\discover\discoverer.py", line 87, in _populate_model_parameters
File "D:\demo\weblogic-deploy\lib\python\wlsdeploy\tool\util\alias_helper.py", line 34, in get_model_attribute_name_and_value
File "D:\demo\weblogic-deploy\lib\python\wlsdeploy\aliases\aliases.py", line 800, in get_model_attribute_name_and_value
File "D:\demo\weblogic-deploy\lib\python\wlsdeploy\aliases\alias_utils.py", line 645, in convert_to_type
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
at oracle.weblogic.deploy.aliases.TypeUtils.convertToType(TypeUtils.java:198)
at oracle.weblogic.deploy.aliases.TypeUtils.convertToType(TypeUtils.java:142)
at sun.reflect.GeneratedMethodAccessor911.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

java.lang.NumberFormatException: java.lang.NumberFormatException: For input string: "transport-pollersdk#[email protected]"

Need to add an alias JSON file for Log

There needs to be a Log.json file, because it is possible that someone would want to control the name and attributes of the domain log file. It would be similar to how we have a JTA.json and JMX.json files, for managing the configuration of those, when they are root folders in the topology section of a model.

CreateDomain.sh domain_parent parameter.

Hello,
in the documentation it is mentioned the -domain_parent parameter but when I run :

./createDomain.sh -h

It returns :

./createDomain.sh -h
JDK version is 1.8.0_131-b11
Required argument ORACLE_HOME not provided
Usage: createDomain.sh [-help] [-use_encryption] [-run_rcu]
          -oracle_home <oracle-home>
          -domain_home <domain-home>
          -domain_type <domain-type>
          [-java_home <java-home>]
          [-archive_file <archive-file>]
          [-model_file <model-file>]
          [-variable_file <variable-file>]
          [-wlst_path <wlst-path>]
          [-rcu_db <rcu-database>
           -rcu_prefix <rcu-prefix>
          ]

    where:
        oracle-home     - the existing Oracle Home directory for the domain.

        domain-home     - the domain home directory.

        domain-type     - the type of domain (e.g., WLS, JRF).  This controls
                          the domain templates and template resource targeting.
                          Also used to locate wlst.cmd if wlst-path not specified.

        java-home       - the Java Home to use for the new domain.  If not
                          specified, it defaults to the value of the JAVA_HOME
                          environment variable.

        archive-file    - the path to the archive file to use  Either the
                          archive-file or the model-file is required.  If the
                          model-file is specified, the archive-file will
                          be ignored.

        model-file      - the location of the model file to use.

        variable-file   - the location of the property file containing
                          the variable values for all variables used in
                          the model

        wlst-path       - the Oracle Home subdirectory of the wlst.cmd
                          script to use (e.g., <ORACLE_HOME>/soa).

        rcu-database    - the RCU database connect string (if the domain
                          type requires RCU).

        rcu-prefix      - the RCU prefix to use (if the domain type requires
                          RCU).

    The -use_encryption switch tells the program that one or more of the
    passwords in the model or variables files are encrypted.  The program will
    prompt for the decryption passphrase to use to decrypt the passwords.
    Please note that Java 8 or higher is required when using this feature.

    The -run_rcu switch tells the program to run RCU to create the database
    schemas specified by the domain type using the specified RCU prefix.
    Running RCU will drop any existing schemas with the same RCU prefix
    if they exist prior to trying to create them so be forewarned.

Instead if I run it like this :

./createDomain.sh -oracle_home ~/Downloads/fmw/wls12213/

I got this message :

####<Feb 28, 2018 10:37:24 AM> <SEVERE> <create> <main> <WLSDPLY-20008> <createDomain argument processing failed: createDomain invoked with missing required argument: -domain_parent>

Probably it would be useful add this parameter to the help message.
I'm using the weblogic-deploy 0.7 binaries.

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.