Giter VIP home page Giter VIP logo

pimcore-webhooks's Introduction

WebHookBundle Plugin

Compile and Tests CodeFactor

This extention provide an easy way to send dataobjects to an external sites via json, whenever a pimcore event occurs on a specified class. This bundle installs the webHook class through which it is possible to define, from the UI, which dataObjects to listen for sending data to an external website, whenever a pimcore event occurs on the specified dataobject.

How to Install WebHookBundle

1. download and install the bundle from composer

For installig WebHookBundle, the first step is to open your terminal and type:

docker-compose exec php bash
composer require sintra/pimcore-webhooks:dev-main

After you have installed the Toolbox Bundle via composer, open pimcore backend and go to Tools => Extension:

  • Click the green + Button in Enable / Disable row
  • Click the green + Button in Install/Uninstall row

2. Configure the bundle

Now that the bundle is installed you can start creating your webhooks!. Follows the next stesp.

  1. create a folder called Webhooks. Although this is not mandatory and you can name it as you want.
  2. create a webhook object in it:
  • In setting panel you can specify the name of the classes to monitor, the events to listen to, and the URL of the site to send the json object
  • In the security panel, you can set an api-key to provie to the specified URS, an a pair of public/private key to generate a signature

The following video shows how this can be done in seconds. Now you are ready to use the Webhok bundle!

Webook configuration

Availbale options

You can specify:

  • The class to monitor
  • The URL to send data to
  • The event to listen

The aviable event are:

  • preAdd
  • postAdd
  • postAddFailure
  • preUpdate
  • postUpdate
  • postUpdateFailure
  • deleteInfo
  • preDelete
  • postDelete
  • postDeleteFailure
  • postCopy
  • postCsvItemExport

Once the event occurs, the json represtantion of you data is sent to the specified url. In the header it is specified which event was launched.

Each event will trigger a request like this:

  • headers
    • x-listen-event: contain the name of the event launched
    • x-apikey: contain a random generated key for autentication porpouse
    • x-signature: contain the data signature created with OPENSSL_ALGO_SHA1; public key is store in website settings
  • body contains two main parts:
    • dataObject: json representation of your dataObject
    • argumentrs: exception code and message throws if a failure occurs

Security settings

To ensure the authenticity and security of the information transmitted, in the header there are a randomly generated api-key, and a signature generated through a pair of keys (public / private), stored in the Pimcore website setting. These are created automatically when the bundle is installed, but you can use your own.

To run the tests you don't need to create any webhooks or classes, these will be created automatically, you just have to initialize the testURL attribute with a valid url.

pimcore-webhooks's People

Contributors

marcomisiani avatar zeppaman avatar christophluehr avatar ngeleedst avatar

Stargazers

 avatar Lukas Huppertz avatar Foxx avatar Jeroen Desloovere avatar Goes Arik avatar  avatar Der Melchior avatar Giovanni Ugolini avatar  avatar Andrea Grassi avatar Luca Innocenti avatar  avatar Francesco Minà avatar  avatar  avatar  avatar Riccardo Gai avatar Leonard Hirja avatar Damiano Bianchi avatar Leonardo Marcucci avatar Marco Guiducci avatar Paolo Simi avatar Michael Bazzanti avatar Alessio Felicioni avatar

Watchers

James Cloos avatar  avatar Federico Stendardi avatar  avatar  avatar

pimcore-webhooks's Issues

Aggiungere tipo di oggetto negli headers

Ad oggi l'unico modo per sapere quale oggetto stiamo modificando bisogna entrare nel merito del contenuto.

Valutare di aggiungere un header (esempio: aggiungere X-Pimcore-Object: Webhook) così da sapere quale è l'oggetto che stiamo trattando.

I can't install the plugin - SQLSTATE[42S02]: Base table or view not found: 1932 Table 'pimcore.object_query_wb_webhook' doesn't exist in engine

Hello,
I can enable the plugin but not to install it, when I try to install it I get the following error:

Timestamp: Tue Dec 07 2021 12:40:26 GMT+0100 (Ora standard dell’Europa centrale)
Status: 400 | Bad Request
URL: /admin/extensionmanager/admin/install
Method: POST
Message: An exception occurred while executing 'ALTER TABLE object_query_WB_WebHook ALTER COLUMN oo_className SET DEFAULT 'WebHook';':

SQLSTATE[42S02]: Base table or view not found: 1932 Table 'pimcore.object_query_wb_webhook' doesn't exist in engine

Thank you

Serializing delle immagini molto pesante

Nel caso ci sia un'immagine nell'oggetto la serializzazione dell'immagine si porta dietro tantissimi dati probabilmente superflui.

Valutiamo se semplificarlo e/o disabilitare la serializzazione profonda delle immagini tramite un flag nel webhook.

Allego un esempio

{"dataObject":{"general":{"o_classId":"STKIT_BLOG_ARTICLE","o_className":"Article","o_published":true,"o_id":7,"o_parentId":2,"o_type":"object","o_key":"Demo","o_creationDate":1620119550,"o_userOwner":2},"data":{"Slug":"slug1","Metatitle":"da","Metadescription":"da","Showinlist":1,"Publishedfrom":null,"Publishedto":null,"Title":null,"Subtitle":null,"Abstract":null,"Body":null,"Image":{"type":"image","id":5,"parentId":2,"parent":null,"filename":"florence.jpg","path":"\/_default_upload_bucket\/","mimetype":"image\/jpeg","creationDate":1620119582,"modificationDate":1620119582,"stream":null,"userOwner":2,"userModification":2,"properties":null,"versions":null,"metadata":[],"locked":null,"customSettings":{"imageDimensionsCalculated":true,"imageWidth":5676,"imageHeight":3193,"embeddedMetaData":{"FileSize":"6.1 MB","FileModifyDate":"2021:05:04 09:13:01 00:00","FileAccessDate":"2021:05:04 09:13:01 00:00","FileInodeChangeDate":"2021:05:04 09:13:01 00:00","FilePermissions":"rw-rw-r--","FileType":"JPEG","FileTypeExtension":"jpg","MIMEType":"image\/jpeg","ExifByteOrder":"Little-endian (Intel, II)","Make":"NIKON CORPORATION","Model":"NIKON D5200","Orientation":"Horizontal (normal)","XResolution":240,"YResolution":240,"ResolutionUnit":"inches","Software":"Adobe Photoshop Lightroom 6.0 (Windows)","ModifyDate":"2015:07:05 14:28:03","Artist":"Ma\u00eblick Claes","Copyright":"This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License. To view a copy of this \\ license, visit http:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/ or send a \\ letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.","ExposureTime":1.6,"FNumber":8,"ExposureProgram":"Aperture-priority AE","ISO":100,"SensitivityType":"Recommended Exposure Index","ExifVersion":"0230","DateTimeOriginal":"2015:05:13 21:20:05","CreateDate":"2015:05:13 21:20:05","ShutterSpeedValue":1.6,"ApertureValue":8,"ExposureCompensation":-3,"MaxApertureValue":5.7,"MeteringMode":"Multi-segment","LightSource":"Unknown","Flash":"No Flash","FocalLength":"105.0 mm","SubSecTimeOriginal":3,"SubSecTimeDigitized":3,"FocalPlaneXResolution":2558.641205,"FocalPlaneYResolution":2558.641205,"FocalPlaneResolutionUnit":"cm","SensingMethod":"One-chip color area","FileSource":"Digital Camera","SceneType":"Directly photographed","CFAPattern":"[Red,Green][Green,Blue]","CustomRendered":"Normal","ExposureMode":"Auto","WhiteBalance":"Auto","DigitalZoomRatio":1,"FocalLengthIn35mmFormat":"105 mm","SceneCaptureType":"Standard","GainControl":"None","Contrast":"Normal","Saturation":"Normal","Sharpness":"Normal","SubjectDistanceRange":"Unknown","SerialNumber":4512318,"LensInfo":"18-105mm f\/3.5-5.6","LensModel":"18.0-105.0 mm f\/3.5-5.6","Compression":"JPEG (old-style)","ThumbnailOffset":1384,"ThumbnailLength":9311,"XMPToolkit":"Adobe XMP Core 5.6-c011 79.156380, 2014\/05\/21-23:38:37 ","License":"http:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/","Format":"image\/jpeg","CreatorTool":"Adobe Photoshop Lightroom 6.0 (Windows)","Label":"Blue","MetadataDate":"2015:07:05 14:28:05 02:00","Lens":"18.0-105.0 mm f\/3.5-5.6","ImageNumber":43517,"ApproximateFocusDistance":4294967295,"IsMergedHDR":true,"DocumentID":"xmp.did:1295ef11-b771-2248-8754-365f8bdb80ad","OriginalDocumentID":"B686FCA25B761E394C2680564F39741D","InstanceID":"xmp.iid:e57957c8-960e-4246-82c7-afb8b33b4e05","Version":9,"ProcessVersion":6.7,"AutoWhiteVersion":134348800,"ColorTemperature":3850,"Tint":" 3","LuminanceSmoothing":45,"ColorNoiseReduction":49,"VignetteAmount":0,"ShadowTint":0,"RedHue":0,"RedSaturation":0,"GreenHue":0,"GreenSaturation":0,"BlueHue":0,"BlueSaturation":0,"Vibrance":" 12","HueAdjustmentRed":0,"HueAdjustmentOrange":0,"HueAdjustmentYellow":0,"HueAdjustmentGreen":0,"HueAdjustmentAqua":0,"HueAdjustmentBlue":0,"HueAdjustmentPurple":0,"HueAdjustmentMagenta":0,"SaturationAdjustmentRed":0,"SaturationAdjustmentOrange":0,"SaturationAdjustmentYellow":0,"SaturationAdjustmentGreen":0,"SaturationAdjustmentAqua":0,"SaturationAdjustmentBlue":0,"SaturationAdjustmentPurple":0,"SaturationAdjustmentMagenta":0,"LuminanceAdjustmentRed":0,"LuminanceAdjustmentOrange":0,"LuminanceAdjustmentYellow":0,"LuminanceAdjustmentGreen":0,"LuminanceAdjustmentAqua":0,"LuminanceAdjustmentBlue":0,"LuminanceAdjustmentPurple":0,"LuminanceAdjustmentMagenta":0,"SplitToningShadowHue":0,"SplitToningShadowSaturation":0,"SplitToningHighlightHue":0,"SplitToningHighlightSaturation":0,"SplitToningBalance":0,"ParametricShadows":0,"ParametricDarks":0,"ParametricLights":0,"ParametricHighlights":0,"ParametricShadowSplit":25,"ParametricMidtoneSplit":50,"ParametricHighlightSplit":75,"SharpenRadius":" 1.8","SharpenDetail":52,"SharpenEdgeMasking":0,"PostCropVignetteAmount":-21,"PostCropVignetteMidpoint":50,"PostCropVignetteFeather":50,"PostCropVignetteRoundness":0,"PostCropVignetteStyle":1,"PostCropVignetteHighlightContrast":0,"GrainAmount":0,"LuminanceNoiseReductionDetail":50,"ColorNoiseReductionDetail":50,"LuminanceNoiseReductionContrast":0,"ColorNoiseReductionSmoothness":50,"LensProfileEnable":1,"LensManualDistortionAmount":0,"PerspectiveVertical":0,"PerspectiveHorizontal":0,"PerspectiveRotate":0,"PerspectiveScale":100,"PerspectiveAspect":0,"PerspectiveUpright":0,"AutoLateralCA":1,"Exposure2012":" 0.71","Contrast2012":0,"Highlights2012":-69,"Shadows2012":" 60","Whites2012":" 29","Blacks2012":-12,"Clarity2012":" 26","DefringePurpleAmount":10,"DefringePurpleHueLo":30,"DefringePurpleHueHi":70,"DefringeGreenAmount":0,"DefringeGreenHueLo":40,"DefringeGreenHueHi":60,"ConvertToGrayscale":false,"ToneCurveName":"Linear","ToneCurveName2012":"Medium Contrast","CameraProfile":"Adobe Standard","LensProfileSetup":"LensDefaults","LensProfileName":"Adobe (Nikon AF-S DX NIKKOR 18-105mm f\/3.5-5.6G ED VR)","LensProfileFilename":"NIKON D90 (Nikon AF-S DX NIKKOR 18-105mm f3.5-5.6G ED VR) - RAW.lcp","LensProfileDigest":"8847EED06ACB4C4D69619E80785F6CDC","LensProfileDistortionScale":100,"LensProfileChromaticAberrationScale":100,"LensProfileVignettingScale":100,"HasSettings":true,"CropTop":0.041625,"CropLeft":0.051839,"CropBottom":0.83473,"CropRight":1,"CropAngle":-0.211813,"CropConstrainToWarp":1,"HasCrop":true,"AlreadyApplied":true,"RawFileName":"20150513_212005_00-HDR.jpg","Creator":"Ma\u00eblick Claes","Rights":"This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License. To view a copy of this \\ license, visit http:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/ or send a \\ letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.","HistoryAction":"saved | derived | saved | derived | saved | saved","HistoryInstanceID":"xmp.iid:516bcce3-e6a8-974d-8f5d-8e66ae5debff | xmp.iid:8be55542-71b8-e646-af6f-af66ce908337 | xmp.iid:1295ef11-b771-2248-8754-365f8bdb80ad | xmp.iid:e57957c8-960e-4246-82c7-afb8b33b4e05","HistoryWhen":"2015:05:27 08:30:40 02:00 | 2015:07:05 12:20:07 02:00 | 2015:07:05 14:28:03 02:00 | 2015:07:05 14:28:05 02:00","HistorySoftwareAgent":"Adobe Photoshop Lightroom 6.0 (Windows) | Adobe Photoshop Lightroom 6.0 (Windows) | Adobe Photoshop Lightroom 6.0 (Windows) | Adobe Photoshop Lightroom 6.0 (Windows)","HistoryChanged":"\/metadata | \/ | \/ | \/metadata","HistoryParameters":"saved to new location | converted from image\/dng to image\/jpeg, saved to new location","DerivedFromInstanceID":"xmp.iid:8be55542-71b8-e646-af6f-af66ce908337","DerivedFromDocumentID":"xmp.did:8be55542-71b8-e646-af6f-af66ce908337","DerivedFromOriginalDocumentID":"B686FCA25B761E394C2680564F39741D","ToneCurve":"0, 0 | 255, 255","ToneCurveRed":"0, 0 | 255, 255","ToneCurveGreen":"0, 0 | 255, 255","ToneCurveBlue":"0, 0 | 255, 255","ToneCurvePV2012":"0, 0 | 32, 22 | 64, 56 | 128, 128 | 192, 196 | 255, 255","ToneCurvePV2012Red":"0, 0 | 255, 255","ToneCurvePV2012Green":"0, 0 | 255, 255","ToneCurvePV2012Blue":"0, 0 | 255, 255","DisplayedUnitsX":"inches","DisplayedUnitsY":"inches","CurrentIPTCDigest":"efd5376aca1ab90109e6f04235538d8d","CodedCharacterSet":"UTF8","ApplicationRecordVersion":4,"DateCreated":"2015:05:13","TimeCreated":"21:20:05","DigitalCreationDate":"2015:05:13","DigitalCreationTime":"21:20:05","By-line":"Ma\u00eblick Claes","CopyrightNotice":"This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) Licen","PhotoshopThumbnail":"(Binary data 9311 bytes, use -b option to extract)","IPTCDigest":"efd5376aca1ab90109e6f04235538d8d","ProfileCMMType":"Linotronic","ProfileVersion":"2.1.0","ProfileClass":"Display Device Profile","ColorSpaceData":"RGB ","ProfileConnectionSpace":"XYZ ","ProfileDateTime":"1998:02:09 06:49:00","ProfileFileSignature":"acsp","PrimaryPlatform":"Microsoft Corporation","CMMFlags":"Not Embedded, Independent","DeviceManufacturer":"Hewlett-Packard","DeviceModel":"sRGB","DeviceAttributes":"Reflective, Glossy, Positive, Color","RenderingIntent":"Perceptual","ConnectionSpaceIlluminant":"0.9642 1 0.82491","ProfileCreator":"Hewlett-Packard","ProfileID":0,"ProfileCopyright":"Copyright (c) 1998 Hewlett-Packard Company","ProfileDescription":"sRGB IEC61966-2.1","MediaWhitePoint":"0.95045 1 1.08905","MediaBlackPoint":"0 0 0","RedMatrixColumn":"0.43607 0.22249 0.01392","GreenMatrixColumn":"0.38515 0.71687 0.09708","BlueMatrixColumn":"0.14307 0.06061 0.7141","DeviceMfgDesc":"IEC http:\/\/www.iec.ch","DeviceModelDesc":"IEC 61966-2.1 Default RGB colour space - sRGB","ViewingCondDesc":"Reference Viewing Condition in IEC61966-2.1","ViewingCondIlluminant":"19.6445 20.3718 16.8089","ViewingCondSurround":"3.92889 4.07439 3.36179","ViewingCondIlluminantType":"D50","Luminance":"76.03647 80 87.12462","MeasurementObserver":"CIE 1931","MeasurementBacking":"0 0 0","MeasurementGeometry":"Unknown","MeasurementFlare":"0.999%","MeasurementIlluminant":"D65","Technology":"Cathode Ray Tube Display","RedTRC":"(Binary data 2060 bytes, use -b option to extract)","GreenTRC":"(Binary data 2060 bytes, use -b option to extract)","BlueTRC":"(Binary data 2060 bytes, use -b option to extract)","DCTEncodeVersion":100,"APP14Flags0":"[14], Encoded with Blend: 1 downsampling","APP14Flags1":"(none)","ColorTransform":"YCbCr","ImageWidth":5676,"ImageHeight":3193,"EncodingProcess":"Baseline DCT, Huffman coding","BitsPerSample":8,"ColorComponents":3,"YCbCrSubSampling":"YCbCr4:4:4 (1 1)","Aperture":8,"DateTimeCreated":"2015:05:13 21:20:05","DigitalCreationDateTime":"2015:05:13 21:20:05","ImageSize":"5676x3193","Megapixels":18.1,"ScaleFactor35efl":1,"ShutterSpeed":1.6,"SubSecCreateDate":"2015:05:13 21:20:05.3","SubSecDateTimeOriginal":"2015:05:13 21:20:05.3","ThumbnailImage":"(Binary data 9311 bytes, use -b option to extract)","CircleOfConfusion":"0.030 mm","DOF":"inf (45.87 m - inf)","FOV":"19.5 deg","FocalLength35efl":"105.0 mm (35 mm equivalent: 105.0 mm)","HyperfocalDistance":"45.87 m","LensID":"AF-S DX VR Zoom-Nikkor 18-105mm f\/3.5-5.6G ED","LightValue":5.3},"embeddedMetaDataExtracted":true},"hasMetaData":false,"siblings":null,"hasSiblings":null,"scheduledTasks":null,"_dataChanged":false,"versionCount":1,"_temporaryFiles":[],"dependencies":null,"__dataVersionTimestamp":1620119582,"dao":null,"_fulldump":false,"o_dirtyFields":null},"Tag":[],"Category":null},"metaData":{"Slug":{"objectid":7,"inherited":false},"Metatitle":{"objectid":7,"inherited":false},"Metadescription":{"objectid":7,"inherited":false},"Showinlist":{"objectid":7,"inherited":false},"Publishedfrom":{"objectid":7,"inherited":false},"Publishedto":{"objectid":7,"inherited":false},"Title":{"objectid":7,"inherited":false},"Subtitle":{"objectid":7,"inherited":false},"Abstract":{"objectid":7,"inherited":false},"Body":{"objectid":7,"inherited":false},"Image":{"objectid":7,"inherited":false},"Tag":{"objectid":7,"inherited":false},"Category":{"objectid":7,"inherited":false}}},"arguments":[]}

Segnalare errore se l'endpoint ritorna un codice HTTP di errore

Il modulo segnala errore solamente se ci sono problemi di connessione.
Qualora la connessione vada in porto ma l'endpoint ritorna errore (404, 503, etc) non viene considerato tale, ma può essere sia indice di malconfigurazione che di problemi lato server.

Valutare di introdurre questa tipologia di errore loggando, in caso di status di errore, la risposta.

Wrong content-type header during sending json request

WebHookListener :: handleChange sets wrong content-type header when sending json request. It is set application/x-www-form-urlencoded instead of application/json due to incorrect use of the HttpClient::request method.

It is: $ response = $ client-> request ($ method, $ url, ['headers' => $ headers, 'body' => $ jsonContent]);

Should be: $ response = $ client-> request ($ method, $ url, ['headers' => $ headers, 'json' => $ arrayData]);

Notifiche degli errori webhook

In caso si verifichi un errore Webhook non viene segnalato nell'interfaccia il problema, ma potrebbe essere di interesse per l'utenze amministratore saperlo (magari tramite notifiche pimcore)

Class "Pimcore\Extension\Bundle\Installer\MigrationInstaller" not found while loading "WebHookBundle\Installer\WebHookBundleInstaller

Hello, I've tried to install your extension by documentation.

composer require sintra/pimcore-webhooks:dev-main

part was successful, but installation from the admin panel ("Bundles & Bricks") gives me an error:

Please don't forget to clear the cache and reload pimcore after your modifications!

4
BE RESPECTFUL AND HONOR OUR WORK FOR FREE & OPEN SOURCE SOFTWARE BY NOT REMOVING OUR LOGO. WE OFFER YOU THE POSSIBILITY TO ADDITIONALLY ADD YOUR OWN LOGO IN PIMCORE'S SYSTEM SETTINGS. THANK YOU!

Please don't forget to clear the cache and reload pimcore after your modifications!

Failed to run assets:install command. Please run command manually.

The command "'/usr/local/bin/php' '/var/www/html/bin/console' 'assets:install' '--symlink' '--relative' '/var/www/html/public'" failed.

Exit Code: 255(Unknown error)

Working directory: /var/www/html

Output:
================
ReflectionException {#7671
  #message: "Class "Pimcore\Extension\Bundle\Installer\MigrationInstaller" not found while loading "WebHookBundle\Installer\WebHookBundleInstaller"."
  #code: 0
  #file: "./vendor/symfony/symfony/src/Symfony/Component/Config/Resource/ClassExistenceResource.php"
  #line: 74
  trace: {
    ./vendor/symfony/symfony/src/Symfony/Component/Config/Resource/ClassExistenceResource.php:74 { ?}
    ./vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/ContainerBuilder.php:348 { ?}
    ./vendor/pimcore/pimcore/bundles/CoreBundle/DependencyInjection/Compiler/ServiceControllersPass.php:60 { ?}
    ./vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Compiler/Compiler.php:91 { ?}
    ./vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/ContainerBuilder.php:736 { ?}
    ./vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:541 { ?}
    ./vendor/pimcore/pimcore/lib/Kernel.php:223 { ?}
    ./vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:780 { ?}
    ./vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:121 { ?}
    ./vendor/pimcore/pimcore/lib/Kernel.php:202 { ?}
    ./vendor/pimcore/pimcore/lib/Bootstrap.php:256 { ?}
    ./vendor/pimcore/pimcore/lib/Bootstrap.php:60 { ?}
    ./bin/console:44 {
      ? /** @var \Pimcore\Kernel $kernel */
      ? $kernel = \Pimcore\Bootstrap::startupCli();
      ? $application = new \Pimcore\Console\Application($kernel);
    }
  }
}

Error Output:
================

pimcore/demo:10.0.6

Class MigrationInstaller is not provided

In class WebHookBundleInstaller your extendig a non existing MigrationInstaller class.
Please provide this class or specify the correct dependencies in order to be able to use your bundle.

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.