http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/921d6861/docs/manual/build/community/contribute-sdk/index.html ---------------------------------------------------------------------- diff --git a/docs/manual/build/community/contribute-sdk/index.html b/docs/manual/build/community/contribute-sdk/index.html new file mode 100644 index 0000000..086f35d --- /dev/null +++ b/docs/manual/build/community/contribute-sdk/index.html @@ -0,0 +1,130 @@ +<!DOCTYPE html><html><head><title>Contribute a SDK</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta class="swiftype" name="title" data-type="string" content="Contribute a SDK"/><link rel="canonical" href="https://docs.prediction.io/community/contribute-sdk/"/><link href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet"/><link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"/><link href="/stylesheets/application-3a3867f7.css" rel="stylesheet" type="text/css"/><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script><script src="//cdn.mathjax.org/mathjax/latest/MathJax. js?config=TeX-AMS-MML_HTMLorMML"></script><script src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: true });}catch(e){}</script></head><body><div id="global"><header><div class="container" id="header-wrapper"><div class="row"><div class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a href="#"></a><a href="http://predictionio.incubator.apache.org/"><img alt="PredictionIO" id="logo" src="/images/logos/logo-ee2b9bb3.png"/></a></div><div id="menu-wrapper"><div id="pill-wrapper"><a class="pill left" href="/gallery/template-gallery">TEMPLATES</a> <a class="pill right" href="//github.com/apache/incubator-predictionio/">OPEN SOURCE</a></div></div><img class="mobile-search-bar-toggler hidden-md hidden-lg" src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div id="search-bar-row-wrapper"><div class="container-fluid" id="search-bar-row"><div class="row"><div class="col-md-9 col-sm-11 col-xs-11"><div class="hidden-md hidd en-lg" id="mobile-page-heading-wrapper"><p>PredictionIO Docs</p><h4>Contribute a SDK</h4></div><h4 class="hidden-sm hidden-xs">PredictionIO Docs</h4></div><div class="col-md-3 col-sm-1 col-xs-1 hidden-md hidden-lg"><img id="left-menu-indicator" src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img src="/images/icons/search-glass-704bd4ff.png"/><input type="text" id="st-search-input" class="st-search-input" placeholder="Search Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div class="mobile-left-menu-toggler hidden-md hidden-lg"></div></div></div></div><div id="page" class="container-fluid"><div class="row"><div id="left-menu-wrapper" class="col-md-3"><nav id="na v-main"><ul><li class="level-1"><a class="expandible" href="/"><span>Apache PredictionIO (incubating) Documentation</span></a><ul><li class="level-2"><a class="final" href="/"><span>Welcome to Apache PredictionIO (incubating)</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Started</span></a><ul><li class="level-2"><a class="final" href="/start/"><span>A Quick Intro</span></a></li><li class="level-2"><a class="final" href="/install/"><span>Installing Apache PredictionIO (incubating)</span></a></li><li class="level-2"><a class="final" href="/start/download/"><span>Downloading an Engine Template</span></a></li><li class="level-2"><a class="final" href="/start/deploy/"><span>Deploying Your First Engine</span></a></li><li class="level-2"><a class="final" href="/start/customize/"><span>Customizing the Engine</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Integrating with Your App</span></a><ul><li class="level-2" ><a class="final" href="/appintegration/"><span>App Integration >Overview</span></a></li><li class="level-2"><a class="expandible" >href="/sdk/"><span>List of SDKs</span></a><ul><li class="level-3"><a >class="final" href="/sdk/java/"><span>Java & Android SDK</span></a></li><li >class="level-3"><a class="final" href="/sdk/php/"><span>PHP >SDK</span></a></li><li class="level-3"><a class="final" >href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a >class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li >class="level-3"><a class="final" href="/sdk/community/"><span>Community >Powered SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a >class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li >class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web >Service</span></a></li><li class="level-2"><a class="final" >href="/cli/#engine-commands"><span>Engine Command-line >Interface</span></a></li><li class="level-2"><a class="final" href="/deploy/monitoring/"><span>Monitoring Engine</span></a></li><li class="level-2"><a class="final" href="/deploy/engineparams/"><span>Setting Engine Parameters</span></a></li><li class="level-2"><a class="final" href="/deploy/enginevariants/"><span>Deploying Multiple Engine Variants</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Customizing an Engine</span></a><ul><li class="level-2"><a class="final" href="/customize/"><span>Learning DASE</span></a></li><li class="level-2"><a class="final" href="/customize/dase/"><span>Implement DASE</span></a></li><li class="level-2"><a class="final" href="/customize/troubleshooting/"><span>Troubleshooting Engine Development</span></a></li><li class="level-2"><a class="final" href="/api/current/#package"><span>Engine Scala APIs</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Collecting and Analyzing Data</span></a><ul><li class="level-2"><a class="final" href="/datacollection /"><span>Event Server Overview</span></a></li><li class="level-2"><a class="final" href="/cli/#event-server-commands"><span>Event Server Command-line Interface</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventapi/"><span>Collecting Data with REST/SDKs</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li class="level-2"><a class="final" href="/datacollection/webhooks/"><span>Unifying Multichannel Data with Webhooks</span></a></li><li class="level-2"><a class="final" href="/datacollection/channel/"><span>Channel</span></a></li><li class="level-2"><a class="final" href="/datacollection/batchimport/"><span>Importing Data in Batch</span></a></li><li class="level-2"><a class="final" href="/datacollection/analytics/"><span>Using Analytics Tools</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Choosing an Algorithm(s)</span></a><ul><li class="level-2"><a class="final" href="/algorithm/"><span>Built-in Algorithm Libraries</span></a></li><li class="level-2"><a class="final" href="/algorithm/switch/"><span>Switching to Another Algorithm</span></a></li><li class="level-2"><a class="final" href="/algorithm/multiple/"><span>Combining Multiple Algorithms</span></a></li><li class="level-2"><a class="final" href="/algorithm/custom/"><span>Adding Your Own Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a class="final" href="/evaluation/"><span>Overview</span></a></li><li class="level-2"><a class="final" href="/evaluation/paramtuning/"><span>Hyperparameter Tuning</span></a></li><li class="level-2"><a class="final" href="/evaluation/evaluationdashboard/"><span>Evaluation Dashboard</span></a></li><li class="level-2"><a class="final" href="/evaluation/metricchoose/"><span>Choosing Evaluation Metrics</span></a></li><li class="level-2"><a class= "final" href="/evaluation/metricbuild/"><span>Building Evaluation Metrics</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>System Architecture</span></a><ul><li class="level-2"><a class="final" href="/system/"><span>Architecture Overview</span></a></li><li class="level-2"><a class="final" href="/system/anotherdatastore/"><span>Using Another Data Store</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li class="level-2"><a class="final" href="/gallery/template-gallery/"><span>Browse</span></a></li><li class="level-2"><a class="final" href="/community/submit-template/"><span>Submit your Engine as a Template</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Demo Tutorials</span></a><ul><li class="level-2"><a class="final" href="/demo/tapster/"><span>Comics Recommendation Demo</span></a></li><li class="level-2"><a class="final" href="/demo/community/">< span>Community Contributed Demo</span></a></li><li class="level-2"><a class="final" href="/demo/textclassification/"><span>Text Classification Engine Tutorial</span></a></li></ul></li><li class="level-1"><a class="expandible" href="/community/"><span>Getting Involved</span></a><ul><li class="level-2"><a class="final" href="/community/contribute-code/"><span>Contribute Code</span></a></li><li class="level-2"><a class="final" href="/community/contribute-documentation/"><span>Contribute Documentation</span></a></li><li class="level-2"><a class="final active" href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li class="level-2"><a class="final" href="/community/contribute-webhook/"><span>Contribute a Webhook</span></a></li><li class="level-2"><a class="final" href="/community/projects/"><span>Community Projects</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Help</span></a><ul><li class="level-2"><a class="final" href="/res ources/faq/"><span>FAQs</span></a></li><li class="level-2"><a class="final" href="/support/"><span>Support</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" href="/resources/intellij/"><span>Developing Engines with IntelliJ IDEA</span></a></li><li class="level-2"><a class="final" href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li class="level-2"><a class="final" href="/resources/glossary/"><span>Glossary</span></a></li></ul></li></ul></nav></div><div class="col-md-9 col-sm-12"><div class="content-header hidden-md hidden-lg"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><a href="/community/">Getting Involved</a><span class="spacer">></span></li><li><span class="last">Contribute a SDK</span></li></ul></div><div id="page-title"><h1>Contribute a SDK</h1></div></div><div id="table-of-content-wrapper"><h5>On this page</h5><aside id="table-of-contents"><ul> <li> <a href="#event-client">Event Client</a> </li> <li> <a href="#engine-client">Engine Client</a> </li> <li> <a href="#testing-your-sdk">Testing Your SDK</a> </li> </ul> </aside><hr/><a id="edit-page-link" href="https://github.com/apache/incubator-predictionio/tree/livedoc/docs/manual/source/community/contribute-sdk.html.md"><img src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div class="content-header hidden-sm hidden-xs"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><a href="/community/">Getting Involved</a><span class="spacer">></span></li><li><span class="last">Contribute a SDK</span></li></ul></div><div id="page-title"><h1>Contribute a SDK</h1></div></div><div class="content"><p>A SDK should provide convenient methods for client applications to easily record users' behaviors in Apache PredictionIO (incubating)'s Event Server and also query recommendations from the ML Engines. Therefore, a SDK typically has 2 corresponding clients: <co de>Event Client</code> and <code>Engine Client</code>.</p><p>The following guideline bases on the REST API provided by Apache PredictionIO (incubating)'s Event Client which details can be found <a href="http://docs.prediction.io/datacollection/eventapi/">here</a>.</p><h2 id='event-client' class='header-anchors'>Event Client</h2><p>Because the Event Server has only 1 connection point, the <code>Event Client</code> needs to implement this core request first. The core request has the following rules.</p> <ul> <li><p><strong>URL</strong>: <code><base URL>/events.json?accessKey=<your access key></code> (e.g. <a href="http://localhost:7070/events.json?accessKey=1234567890">http://localhost:7070/events.json?accessKey=1234567890</a>)</p></li> <li><p><strong>Request</strong>: <code>POST</code> + JSON data. Please refer to the <a href="http://docs.prediction.io/datacollection/eventapi/">Event Creation API</a> for the details on the fields of the JSON data object.</p></li> <li> <p><strong>Response</strong>:</p> <ul> <li><strong>Success</strong>: status code <code>201</code> with a JSON result containing the <code>eventId</code>.</li> <li><strong>Failure</strong>: a JSON result containing a <code>message</code> field describing the error. <ul> <li>Status code <code>401</code>: invalid access key.</li> <li>Status code <code>400</code>: fail to parse the JSON request e.g. missing required fields like <code>event</code>, or invalid <code>eventTime</code> format.</li> </ul></li> </ul></li> </ul> <p>Other convenient methods are just shortcut. They could simply build the event's parameters and call the core request. <code>Event Client</code> should support the following 7 shorthand operations:</p> <ul> <li><p><strong>User entities</strong></p> <ul> <li><p><strong>Sets properties of a user</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno" >1 +2 +3 +4 +5 +6</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$set"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><user_ID></span><span class="p">,</span><span class="w"> + </span><span class="s2">"properties"</span><span class="p">:</span><span class="w"> </span><span class="err"><properties></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> <li><p><strong>Unsets some properties of a user</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$unset"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><user_ID></span><span class="p">,</span><span class="w"> + </span><span class="s2">"properties"</span><span class="p">:</span><span class="w"> </span><span class="err"><properties></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> <li><p><strong>Delete a user</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$delete"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><user_ID></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> </ul></li> <li><p><strong>Item entities</strong></p> <ul> <li><p><strong>Sets properties of an item</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$set"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"item"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><item_ID></span><span class="p">,</span><span class="w"> + </span><span class="s2">"properties"</span><span class="p">:</span><span class="w"> </span><span class="err"><properties></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> <li><p><strong>Unsets some properties of an item</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$unset"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"item"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><item_ID></span><span class="p">,</span><span class="w"> + </span><span class="s2">"properties"</span><span class="p">:</span><span class="w"> </span><span class="err"><properties></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> <li><p><strong>Delete an item</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$delete"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"item"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><item_ID></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> </ul></li> <li><p><strong>Others</strong></p> <ul> <li><p><strong>Record a user's action on some item</strong>: with the JSON object</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="err"><event_name></span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"user"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"entityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><user_ID></span><span class="p">,</span><span class="w"> + </span><span class="s2">"targetEntityType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"item"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"targetEntityId"</span><span class="p">:</span><span class="w"> </span><span class="err"><item_ID></span><span class="p">,</span><span class="w"> + </span><span class="s2">"properties"</span><span class="p">:</span><span class="w"> </span><span class="err"><properties></span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> </ul></li> </ul> <p>Again, please refer to the <a href="http://docs.prediction.io/datacollection/eventapi/">API documentation</a> for explanations on the reversed events like <code>$set</code>, <code>$unset</code> or <code>$delete</code>.</p><div class="alert-message info"><p>The <code>eventTime</code> is optional but it is recommended that the client application should include time in the request. Therefore, it is best that the <code>Event Client</code> includes the time field if missing, before sending the event to the server.</p></div><h2 id='engine-client' class='header-anchors'>Engine Client</h2><p><code>Engine Client</code>'s main job is to retrieve recommendation or prediction results from Apache PredictionIO (incubating)'s Engines. It has only a few rules on the request and response type.</p> <ul> <li><p><strong>URL</strong>: <code><base URL>/queries.json</code> (e.g. <a href="http://localhost:8000/queries.jso n">http://localhost:8000/queries.json</a>)</p></li> <li><p><strong>Request</strong>: <code>POST</code> + JSON data. For example,</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"user"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> + </span><span class="s2">"num"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> <li><p><strong>Response</strong>:</p> <ul> <li><p><strong>Success</strong>: status code <code>200</code> with a JSON result object. For example,</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"itemScores"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> + </span><span class="p">{</span><span class="w"> + </span><span class="s2">"item"</span><span class="p">:</span><span class="w"> </span><span class="mi">39</span><span class="p">,</span><span class="w"> + </span><span class="s2">"score"</span><span class="p">:</span><span class="w"> </span><span class="s2">"6.177719297832409"</span><span class="w"> + </span><span class="p">},</span><span class="w"> + </span><span class="p">{</span><span class="w"> + </span><span class="s2">"item"</span><span class="p">:</span><span class="w"> </span><span class="mi">79</span><span class="p">,</span><span class="w"> + </span><span class="s2">"score"</span><span class="p">:</span><span class="w"> </span><span class="s2">"5.931687319083594"</span><span class="w"> + </span><span class="p">},</span><span class="w"> + </span><span class="err">...</span><span class="w"> + </span><span class="p">]</span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div></li> <li><p><strong>Failure</strong>: status code <code>400</code> e.g. fail to parse the query.</p></li> </ul></li> </ul> <p>The formats of JSON objects in both the request and response must be defined by the Apache PredictionIO (incubating)'s Engine and are different across applications. The above examples are taken from the Recommendation Engine template in which the query and prediction results are defined as following.</p><div class="highlight scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8</pre></td><td class="code"><pre><span class="k">case</span> <span class="k">class</span> <span class="nc">Query</span><span class="o">(</span> + <span class="n">user</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> + <span class="n">num</span><span class="k">:</span> <span class="kt">Int</span> +<span class="o">)</span> <span class="k">extends</span> <span class="nc">Serializable</span> + +<span class="k">case</span> <span class="k">class</span> <span class="nc">PredictedResult</span><span class="o">(</span> + <span class="n">itemScores</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">ItemScore</span><span class="o">]</span> +<span class="o">)</span> <span class="k">extends</span> <span class="nc">Serializable</span> +</pre></td></tr></tbody></table> </div> <h2 id='testing-your-sdk' class='header-anchors'>Testing Your SDK</h2><p>You can set up a local host Apache PredictionIO (incubating) environment to test your SDK. However, it is hard to set it up online to test your SDK automatically using services like Travis CI. In that case, you should consider using these lightweight <a href="https://github.com/minhtule/PredictionIO-Mock-Server">mock servers</a>. Please see the instructions in the repo how to use it. It takes less than 5 minutes!</p><p>That's it! We are looking forward to see your SDK!</p></div></div></div></div><footer><div class="container"><div class="seperator"></div><div class="row"><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Community</h4><ul><li><a href="//docs.prediction.io/install/" target="blank">Download</a></li><li><a href="//docs.prediction.io/" target="blank">Docs</a></li><li><a href="//github.com/apache/incubator-predictioni o" target="blank">GitHub</a></li><li><a href="mailto:[email protected]" target="blank">Subscribe to User Mailing List</a></li><li><a href="//stackoverflow.com/questions/tagged/predictionio" target="blank">Stackoverflow</a></li></ul></div></div><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Contribute</h4><ul><li><a href="//predictionio.incubator.apache.org/community/contribute-code/" target="blank">Contribute</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">Source Code</a></li><li><a href="//issues.apache.org/jira/browse/PIO" target="blank">Bug Tracker</a></li><li><a href="mailto:[email protected]" target="blank">Subscribe to Development Mailing List</a></li></ul></div></div></div></div><div id="footer-bottom"><div class="container"><div class="row"><div class="col-md-12"><div id="footer-logo-wrapper"><img alt="PredictionIO" src="/images/logos/logo-w hite-d1e9c6e6.png"/></div><div id="social-icons-wrapper"><a class="github-button" href="https://github.com/apache/incubator-predictionio" data-style="mega" data-count-href="/apache/incubator-predictionio/stargazers" data-count-api="/repos/apache/incubator-predictionio#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star apache/incubator-predictionio on GitHub">Star</a> <a class="github-button" href="https://github.com/apache/incubator-predictionio/fork" data-icon="octicon-git-branch" data-style="mega" data-count-href="/apache/incubator-predictionio/network" data-count-api="/repos/apache/incubator-predictionio#forks_count" data-count-aria-label="# forks on GitHub" aria-label="Fork apache/incubator-predictionio on GitHub">Fork</a> <script id="github-bjs" async="" defer="" src="https://buttons.github.io/buttons.js"></script><a href="//www.facebook.com/predictionio" target="blank"><img alt="PredictionIO on Twitter" src="/images/icons/twitter-ea9dc152.png"/>< /a> <a href="//twitter.com/predictionio" target="blank"><img alt="PredictionIO on Facebook" src="/images/icons/facebook-5c57939c.png"/></a> </div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){ +(w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t); +e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e); +})(window,document,'script','//s.swiftypecdn.com/install/v1/st.js','_st'); + +_st('install','HaUfpXXV87xoB_zzCQ45');</script><script src="/javascripts/application-f819cf19.js"></script></body></html> \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/921d6861/docs/manual/build/community/contribute-sdk/index.html.gz ---------------------------------------------------------------------- diff --git a/docs/manual/build/community/contribute-sdk/index.html.gz b/docs/manual/build/community/contribute-sdk/index.html.gz new file mode 100644 index 0000000..d7547df Binary files /dev/null and b/docs/manual/build/community/contribute-sdk/index.html.gz differ http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/921d6861/docs/manual/build/community/contribute-webhook/index.html ---------------------------------------------------------------------- diff --git a/docs/manual/build/community/contribute-webhook/index.html b/docs/manual/build/community/contribute-webhook/index.html new file mode 100644 index 0000000..f1ef5bb --- /dev/null +++ b/docs/manual/build/community/contribute-webhook/index.html @@ -0,0 +1,255 @@ +<!DOCTYPE html><html><head><title>Contribute a Webhooks Connector</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta class="swiftype" name="title" data-type="string" content="Contribute a Webhooks Connector"/><link rel="canonical" href="https://docs.prediction.io/community/contribute-webhook/"/><link href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet"/><link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"/><link href="/stylesheets/application-3a3867f7.css" rel="stylesheet" type="text/css"/><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script><script src="//cdn.m athjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: true });}catch(e){}</script></head><body><div id="global"><header><div class="container" id="header-wrapper"><div class="row"><div class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a href="#"></a><a href="http://predictionio.incubator.apache.org/"><img alt="PredictionIO" id="logo" src="/images/logos/logo-ee2b9bb3.png"/></a></div><div id="menu-wrapper"><div id="pill-wrapper"><a class="pill left" href="/gallery/template-gallery">TEMPLATES</a> <a class="pill right" href="//github.com/apache/incubator-predictionio/">OPEN SOURCE</a></div></div><img class="mobile-search-bar-toggler hidden-md hidden-lg" src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div id="search-bar-row-wrapper"><div class="container-fluid" id="search-bar-row"><div class="row"><div class="col-md-9 col-sm-11 col -xs-11"><div class="hidden-md hidden-lg" id="mobile-page-heading-wrapper"><p>PredictionIO Docs</p><h4>Contribute a Webhook</h4></div><h4 class="hidden-sm hidden-xs">PredictionIO Docs</h4></div><div class="col-md-3 col-sm-1 col-xs-1 hidden-md hidden-lg"><img id="left-menu-indicator" src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img src="/images/icons/search-glass-704bd4ff.png"/><input type="text" id="st-search-input" class="st-search-input" placeholder="Search Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div class="mobile-left-menu-toggler hidden-md hidden-lg"></div></div></div></div><div id="page" class="container-fluid"><div class="row"><div id="left-menu -wrapper" class="col-md-3"><nav id="nav-main"><ul><li class="level-1"><a class="expandible" href="/"><span>Apache PredictionIO (incubating) Documentation</span></a><ul><li class="level-2"><a class="final" href="/"><span>Welcome to Apache PredictionIO (incubating)</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Started</span></a><ul><li class="level-2"><a class="final" href="/start/"><span>A Quick Intro</span></a></li><li class="level-2"><a class="final" href="/install/"><span>Installing Apache PredictionIO (incubating)</span></a></li><li class="level-2"><a class="final" href="/start/download/"><span>Downloading an Engine Template</span></a></li><li class="level-2"><a class="final" href="/start/deploy/"><span>Deploying Your First Engine</span></a></li><li class="level-2"><a class="final" href="/start/customize/"><span>Customizing the Engine</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Integrating with Your App</span></a><ul><li class="level-2"><a class="final" href="/appintegration/"><span>App Integration Overview</span></a></li><li class="level-2"><a class="expandible" href="/sdk/"><span>List of SDKs</span></a><ul><li class="level-3"><a class="final" href="/sdk/java/"><span>Java & Android SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/php/"><span>PHP SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/community/"><span>Community Powered SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web Service</span></a></li><li class="level-2"><a class="final" href="/cli/#engine-commands"><span>Engine Command-line Interface</span></a></l i><li class="level-2"><a class="final" href="/deploy/monitoring/"><span>Monitoring Engine</span></a></li><li class="level-2"><a class="final" href="/deploy/engineparams/"><span>Setting Engine Parameters</span></a></li><li class="level-2"><a class="final" href="/deploy/enginevariants/"><span>Deploying Multiple Engine Variants</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Customizing an Engine</span></a><ul><li class="level-2"><a class="final" href="/customize/"><span>Learning DASE</span></a></li><li class="level-2"><a class="final" href="/customize/dase/"><span>Implement DASE</span></a></li><li class="level-2"><a class="final" href="/customize/troubleshooting/"><span>Troubleshooting Engine Development</span></a></li><li class="level-2"><a class="final" href="/api/current/#package"><span>Engine Scala APIs</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Collecting and Analyzing Data</span></a><ul><li class="level-2"> <a class="final" href="/datacollection/"><span>Event Server Overview</span></a></li><li class="level-2"><a class="final" href="/cli/#event-server-commands"><span>Event Server Command-line Interface</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventapi/"><span>Collecting Data with REST/SDKs</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li class="level-2"><a class="final" href="/datacollection/webhooks/"><span>Unifying Multichannel Data with Webhooks</span></a></li><li class="level-2"><a class="final" href="/datacollection/channel/"><span>Channel</span></a></li><li class="level-2"><a class="final" href="/datacollection/batchimport/"><span>Importing Data in Batch</span></a></li><li class="level-2"><a class="final" href="/datacollection/analytics/"><span>Using Analytics Tools</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Choosing an Algorithm(s) </span></a><ul><li class="level-2"><a class="final" href="/algorithm/"><span>Built-in Algorithm Libraries</span></a></li><li class="level-2"><a class="final" href="/algorithm/switch/"><span>Switching to Another Algorithm</span></a></li><li class="level-2"><a class="final" href="/algorithm/multiple/"><span>Combining Multiple Algorithms</span></a></li><li class="level-2"><a class="final" href="/algorithm/custom/"><span>Adding Your Own Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a class="final" href="/evaluation/"><span>Overview</span></a></li><li class="level-2"><a class="final" href="/evaluation/paramtuning/"><span>Hyperparameter Tuning</span></a></li><li class="level-2"><a class="final" href="/evaluation/evaluationdashboard/"><span>Evaluation Dashboard</span></a></li><li class="level-2"><a class="final" href="/evaluation/metricchoose/"><span>Choosing Evaluation Metrics</span> </a></li><li class="level-2"><a class="final" href="/evaluation/metricbuild/"><span>Building Evaluation Metrics</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>System Architecture</span></a><ul><li class="level-2"><a class="final" href="/system/"><span>Architecture Overview</span></a></li><li class="level-2"><a class="final" href="/system/anotherdatastore/"><span>Using Another Data Store</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li class="level-2"><a class="final" href="/gallery/template-gallery/"><span>Browse</span></a></li><li class="level-2"><a class="final" href="/community/submit-template/"><span>Submit your Engine as a Template</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Demo Tutorials</span></a><ul><li class="level-2"><a class="final" href="/demo/tapster/"><span>Comics Recommendation Demo</span></a></li><li class="level-2"><a c lass="final" href="/demo/community/"><span>Community Contributed Demo</span></a></li><li class="level-2"><a class="final" href="/demo/textclassification/"><span>Text Classification Engine Tutorial</span></a></li></ul></li><li class="level-1"><a class="expandible" href="/community/"><span>Getting Involved</span></a><ul><li class="level-2"><a class="final" href="/community/contribute-code/"><span>Contribute Code</span></a></li><li class="level-2"><a class="final" href="/community/contribute-documentation/"><span>Contribute Documentation</span></a></li><li class="level-2"><a class="final" href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li class="level-2"><a class="final active" href="/community/contribute-webhook/"><span>Contribute a Webhook</span></a></li><li class="level-2"><a class="final" href="/community/projects/"><span>Community Projects</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Help</span></a><ul><li class ="level-2"><a class="final" href="/resources/faq/"><span>FAQs</span></a></li><li class="level-2"><a class="final" href="/support/"><span>Support</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" href="/resources/intellij/"><span>Developing Engines with IntelliJ IDEA</span></a></li><li class="level-2"><a class="final" href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li class="level-2"><a class="final" href="/resources/glossary/"><span>Glossary</span></a></li></ul></li></ul></nav></div><div class="col-md-9 col-sm-12"><div class="content-header hidden-md hidden-lg"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><a href="/community/">Getting Involved</a><span class="spacer">></span></li><li><span class="last">Contribute a Webhook</span></li></ul></div><div id="page-title"><h1>Contribute a Webhooks Connector</h1></div></div><div id="table-of-content-wrapper"><h5 >On this page</h5><aside id="table-of-contents"><ul> <li> <a >href="#example">Example</a> <ul> <li> <a >href="#1-implement-webhooks-connector">1. Implement Webhooks Connector</a> ></li> <li> <a href="#2-integrate-the-connector-into-event-server">2. >Integrate the Connector into Event Server</a> </li> </ul> </li> </ul> ></aside><hr/><a id="edit-page-link" >href="https://github.com/apache/incubator-predictionio/tree/livedoc/docs/manual/source/community/contribute-webhook.html.md"><img > src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div >class="content-header hidden-sm hidden-xs"><div id="breadcrumbs" >class="hidden-sm hidden xs"><ul><li><a href="/community/">Getting >Involved</a><span class="spacer">></span></li><li><span >class="last">Contribute a Webhook</span></li></ul></div><div >id="page-title"><h1>Contribute a Webhooks Connector</h1></div></div><div >class="content"><div class="alert-message note"><p>Please check out the <a >href="https://github.com/apache/incubator -predictionio">latest develop branch</a>.</p></div><p>Event server can collect data from other third-party sites or software through their webhooks services (for example, SegmentIO, MailChimp). To support that, a <em>Webhooks Connector</em> for the third-party data is needed to be integrated into Event Server. The job of the <em>Webhooks Connector</em> is as simply as converting the third-party data into Event JSON. You can find an example below.</p><p>Currently we support two types of connectors: <code>JsonConnector</code> and <code>FormConnector</code>, which is responsible for accepting <em>JSON</em> data and <em>Form-submission</em> data, respectively.</p><p><strong>JsonConnector</strong>:</p><div class="highlight scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13</pre></td><td class="code"><pre><span class="k">package</span> <span class="nn">org.apache.predictionio.data.webhooks</span> + +<span class="cm">/** Connector for Webhooks connection */</span> +<span class="k">private</span><span class="o">[</span><span class="kt">predictionio</span><span class="o">]</span> <span class="k">trait</span> <span class="nc">JsonConnector</span> <span class="o">{</span> + + <span class="cm">/** Convert from original JObject to Event JObject + * @param data original JObject recevived through webhooks + * @return Event JObject + */</span> + <span class="k">def</span> <span class="n">toEventJson</span><span class="o">(</span><span class="n">data</span><span class="k">:</span> <span class="kt">JObject</span><span class="o">)</span><span class="k">:</span> <span class="kt">JObject</span> + +<span class="o">}</span> + +</pre></td></tr></tbody></table> </div> <p>The EventServer URL path to collect webhooks JSON data:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>http://<EVENT SERVER URL>/webhooks/<CONNECTOR_NAME>.json?accessKey<span class="o">=</span><YOUR_ACCESS_KEY>&channel<span class="o">=</span><CHANNEL_NAME> +</pre></td></tr></tbody></table> </div> <p>Note that you may collect Webhooks data into default channel (without the <code>channel</code> parameter in the URL) but it's highly recommended to create dedicated <a href="/datacollection/channel/">Channel</a> to collect specific Webhooks data (e.g. create one channel "segmentio" for SegmentIO and another channel "mailchimp" for Mailchimp data) because it allows you to manage and query data more easily, and the Webhooks data won't be mixed with your other normal app data.</p><p><strong>FormConnector</strong>:</p><div class="highlight scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14</pre></td><td class="code"><pre><span class="k">package</span> <span class="nn">org.apache.predictionio.data.webhooks</span> + +<span class="cm">/** Connector for Webhooks connection with Form submission data format + */</span> +<span class="k">private</span><span class="o">[</span><span class="kt">predictionio</span><span class="o">]</span> <span class="k">trait</span> <span class="nc">FormConnector</span> <span class="o">{</span> + + <span class="cm">/** Convert from original Form submission data to Event JObject + * @param data Map of key-value pairs in String type received through webhooks + * @return Event JObject + */</span> + <span class="k">def</span> <span class="n">toEventJson</span><span class="o">(</span><span class="n">data</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">String</span><span class="o">])</span><span class="k">:</span> <span class="kt">JObject</span> + +<span class="o">}</span> + +</pre></td></tr></tbody></table> </div> <p>The EventServer URL path to collect webhooks form-subimssion data (no .json):</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>http://<EVENT SERVER URL>/webhooks/<CONNECTOR_NAME>?accessKey<span class="o">=</span><YOUR_ACCESS_KEY>&channel<span class="o">=</span><CHANNEL_NAME> +</pre></td></tr></tbody></table> </div> <p>Note that you may collect Webhooks data into default channel (without the <code>channel</code> parameter in the URL) but it's highly recommended to create dedicated <a href="/datacollection/channel/">Channel</a> to collect specific Webhooks data (e.g. create one channel "segmentio" for SegmentIO and another channel "mailchimp" for Mailchimp data) because it allows you to manage and query data more easily, and the Webhooks data won't be mixed with your other normal app data.</p><h1 id='example' class='header-anchors'>Example</h1><p>For example, let's say there is a third-party website (say, it is named "ExampleJson") which can send the following JSON data through its webhooks service and we would like to collect it into Event Store.</p><p><strong>UserActionItem</strong>:</p><div class="highlight json"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre cla ss="lineno">1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14</pre></td><td class="code"><pre><span class="p">{</span><span class="w"> + </span><span class="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"userActionItem"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"userId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"as34smg4"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"event"</span><span class="p">:</span><span class="w"> </span><span class="s2">"do_something_on"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"itemId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"kfjd312bc"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"context"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> + </span><span class="s2">"ip"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.23.4.56"</span><span class="p">,</span><span class="w"> + </span><span class="s2">"prop1"</span><span class="p">:</span><span class="w"> </span><span class="mf">2.345</span><span class="p">,</span><span class="w"> + </span><span class="s2">"prop2"</span><span class="p">:</span><span class="w"> </span><span class="s2">"value1"</span><span class="w"> + </span><span class="p">},</span><span class="w"> + </span><span class="s2">"anotherPropertyA"</span><span class="p">:</span><span class="w"> </span><span class="mf">4.567</span><span class="p">,</span><span class="w"> + </span><span class="s2">"anotherPropertyB"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"> + </span><span class="s2">"timestamp"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2015-01-15T04:20:23.567Z"</span><span class="w"> +</span><span class="p">}</span><span class="w"> +</span></pre></td></tr></tbody></table> </div> <h2 id='1.-implement-webhooks-connector' class='header-anchors'>1. Implement Webhooks Connector</h2><p>Because the data sent by this third-party "ExampleJson" site is in JSON format, we implement an object <code>ExampleJsonConnector</code> which extends <code>JsonConnector</code>:</p><div class="highlight scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66</pre></td><td class="code"><pre><span class="k">private</span><span class="o">[</span><span class="kt">predictionio</span><span class="o">]</span> <span class="k">object</span> <span class="nc">ExampleJsonConnector</span> <span class="k">extends</span> <span class="nc">JsonConnector</span> <span class="o">{</span> + + <span class="k">implicit</span> <span class="k">val</span> <span class="n">json4sFormats</span><span class="k">:</span> <span class="kt">Formats</span> <span class="o">=</span> <span class="nc">DefaultFormats</span> + + <span class="k">override</span> <span class="k">def</span> <span class="n">toEventJson</span><span class="o">(</span><span class="n">data</span><span class="k">:</span> <span class="kt">JObject</span><span class="o">)</span><span class="k">:</span> <span class="kt">JObject</span> <span class="o">=</span> <span class="o">{</span> + <span class="k">val</span> <span class="n">common</span> <span class="k">=</span> <span class="k">try</span> <span class="o">{</span> + <span class="n">data</span><span class="o">.</span><span class="n">extract</span><span class="o">[</span><span class="kt">Common</span><span class="o">]</span> + <span class="o">}</span> <span class="k">catch</span> <span class="o">{</span> + <span class="k">case</span> <span class="n">e</span><span class="k">:</span> <span class="kt">Exception</span> <span class="o">=></span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">ConnectorException</span><span class="o">(</span> + <span class="n">s</span><span class="s">"Cannot extract Common field from ${data}. ${e.getMessage()}"</span><span class="o">,</span> <span class="n">e</span><span class="o">)</span> + <span class="o">}</span> + + <span class="k">val</span> <span class="n">json</span> <span class="k">=</span> <span class="k">try</span> <span class="o">{</span> + <span class="n">common</span><span class="o">.</span><span class="n">`type`</span> <span class="k">match</span> <span class="o">{</span> + <span class="k">case</span> <span class="s">"userActionItem"</span> <span class="k">=></span> + <span class="n">toEventJson</span><span class="o">(</span><span class="n">common</span> <span class="k">=</span> <span class="n">common</span><span class="o">,</span> <span class="n">userActionItem</span> <span class="k">=</span> <span class="n">data</span><span class="o">.</span><span class="n">extract</span><span class="o">[</span><span class="kt">UserActionItem</span><span class="o">])</span> + <span class="k">case</span> <span class="n">x</span><span class="k">:</span> <span class="kt">String</span> <span class="o">=></span> + <span class="k">throw</span> <span class="k">new</span> <span class="nc">ConnectorException</span><span class="o">(</span> + <span class="n">s</span><span class="s">"Cannot convert unknown type '${x}' to Event JSON."</span><span class="o">)</span> + <span class="o">}</span> + <span class="o">}</span> <span class="k">catch</span> <span class="o">{</span> + <span class="k">case</span> <span class="n">e</span><span class="k">:</span> <span class="kt">ConnectorException</span> <span class="o">=></span> <span class="k">throw</span> <span class="n">e</span> + <span class="k">case</span> <span class="n">e</span><span class="k">:</span> <span class="kt">Exception</span> <span class="o">=></span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">ConnectorException</span><span class="o">(</span> + <span class="n">s</span><span class="s">"Cannot convert ${data} to eventJson. ${e.getMessage()}"</span><span class="o">,</span> <span class="n">e</span><span class="o">)</span> + <span class="o">}</span> + + <span class="n">json</span> + <span class="o">}</span> + + <span class="c1">// Convert the UserActionItem JSON to Event JSON +</span> <span class="k">def</span> <span class="n">toEventJson</span><span class="o">(</span><span class="n">common</span><span class="k">:</span> <span class="kt">Common</span><span class="o">,</span> <span class="n">userActionItem</span><span class="k">:</span> <span class="kt">UserActionItem</span><span class="o">)</span><span class="k">:</span> <span class="kt">JObject</span> <span class="o">=</span> <span class="o">{</span> + <span class="k">import</span> <span class="nn">org.json4s.JsonDSL._</span> + + <span class="c1">// map to EventAPI JSON +</span> <span class="k">val</span> <span class="n">json</span> <span class="k">=</span> + <span class="o">(</span><span class="s">"event"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">event</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"entityType"</span> <span class="o">-></span> <span class="s">"user"</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"entityId"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">userId</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"targetEntityType"</span> <span class="o">-></span> <span class="s">"item"</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"targetEntityId"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">itemId</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"eventTime"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">timestamp</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"properties"</span> <span class="o">-></span> <span class="o">(</span> + <span class="o">(</span><span class="s">"context"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">context</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"anotherPropertyA"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">anotherPropertyA</span><span class="o">)</span> <span class="o">~</span> + <span class="o">(</span><span class="s">"anotherPropertyB"</span> <span class="o">-></span> <span class="n">userActionItem</span><span class="o">.</span><span class="n">anotherPropertyB</span><span class="o">)</span> + <span class="o">))</span> + <span class="n">json</span> + <span class="o">}</span> + + <span class="c1">// Common required fields +</span> <span class="k">case</span> <span class="k">class</span> <span class="nc">Common</span><span class="o">(</span> + <span class="n">`type`</span><span class="k">:</span> <span class="kt">String</span> + <span class="o">)</span> + + <span class="c1">// UserActionItem fields +</span> <span class="k">case</span> <span class="k">class</span> <span class="nc">UserActionItem</span> <span class="o">(</span> + <span class="n">userId</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> + <span class="n">event</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> + <span class="n">itemId</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> + <span class="n">context</span><span class="k">:</span> <span class="kt">JObject</span><span class="o">,</span> + <span class="n">anotherPropertyA</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">Double</span><span class="o">],</span> + <span class="n">anotherPropertyB</span><span class="k">:</span> <span class="kt">Option</span><span class="o">[</span><span class="kt">Boolean</span><span class="o">],</span> + <span class="n">timestamp</span><span class="k">:</span> <span class="kt">String</span> + <span class="o">)</span> + +<span class="o">}</span> +</pre></td></tr></tbody></table> </div> <p>You can find the complete example in <a href="https://github.com/apache/incubator-predictionio/blob/develop/data/src/main/scala/io/prediction/data/webhooks/examplejson/ExampleJsonConnector.scala">the GitHub repo</a> and how to write <a href="https://github.com/apache/incubator-predictionio/blob/develop/data/src/test/scala/io/prediction/data/webhooks/examplejson/ExampleJsonConnectorSpec.scala">tests for the connector</a>.</p><p>Please put the connector code in a separate directory for each site. For example, code for segmentio connector should be in</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>data/src/main/scala/org.apache.predictionio/data/webhooks/segmentio/ +</pre></td></tr></tbody></table> </div> <p>and tests should be in</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>data/src/test/scala/org.apache.predictionio/data/webhooks/segmentio/ +</pre></td></tr></tbody></table> </div> <p><strong>For form-submission data</strong>, you can find the comple example <a href="https://github.com/apache/incubator-predictionio/blob/develop/data/src/main/scala/io/prediction/data/webhooks/exampleform/ExampleFormConnector.scala">the GitHub repo</a> and how to write <a href="https://github.com/apache/incubator-predictionio/blob/develop/data/src/test/scala/io/prediction/data/webhooks/exampleform/ExampleFormConnectorSpec.scala">tests for the connector</a>.</p><h2 id='2.-integrate-the-connector-into-event-server' class='header-anchors'>2. Integrate the Connector into Event Server</h2><p>Once we have the connector implemented, we can add this to the EventServer so we can collect real-time data.</p><p>Add the connector to <a href="https://github.com/apache/incubator-predictionio/blob/develop/data/src/main/scala/io/prediction/data/api/WebhooksConnectors.scala"><code>WebhooksConnectors</code> object</a>:</p><div class="highlight scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17</pre></td><td class="code"><pre> +<span class="k">import</span> <span class="nn">org.apache.predictionio.data.webhooks.examplejson.ExampleJsonConnector</span> <span class="c1">// ADDED +</span> +<span class="k">private</span><span class="o">[</span><span class="kt">predictionio</span><span class="o">]</span> <span class="k">object</span> <span class="nc">WebhooksConnectors</span> <span class="o">{</span> + + <span class="c1">// Map of Connector Name to Connector +</span> <span class="k">val</span> <span class="n">json</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">JsonConnector</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Map</span><span class="o">(</span> + <span class="s">"segmentio"</span> <span class="o">-></span> <span class="nc">SegmentIOConnector</span><span class="o">,</span> + <span class="s">"examplejson"</span> <span class="o">-></span> <span class="nc">ExampleJsonConnector</span> <span class="c1">// ADDED +</span> <span class="o">)</span> + + <span class="c1">// Map of Connector Name to Connector +</span> <span class="k">val</span> <span class="n">form</span><span class="k">:</span> <span class="kt">Map</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">FormConnector</span><span class="o">]</span> <span class="k">=</span> <span class="nc">Map</span><span class="o">(</span> + <span class="s">"mailchimp"</span> <span class="o">-></span> <span class="nc">MailChimpConnector</span> + <span class="o">)</span> + +<span class="o">}</span> +</pre></td></tr></tbody></table> </div> <p>Note that the name of the connectors (e.g. "examplejson", "segmentio") will be used as the webhooks URL. In this example, the event server URL to collect data from "ExampleJson" would be:</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>http://<EVENT SERVER URL>/webhooks/examplejson.json?accessKey<span class="o">=</span><YOUR_ACCESS_KEY>&channel<span class="o">=</span><CHANNEL_NAME> +</pre></td></tr></tbody></table> </div> <p>For <code>FormConnector</code>, the URL doesn't have <code>.json</code>. For example,</p><div class="highlight shell"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>http://<EVENT SERVER URL>/webhooks/mailchimp?accessKey<span class="o">=</span><YOUR_ACCESS_KEY>&channel<span class="o">=</span><CHANNEL_NAME> +</pre></td></tr></tbody></table> </div> <p>That's it. Once you re-compile Apache PredictionIO (incubating), you can send the ExampleJson data to the following URL and the data will be stored to the App of the corresponding Access Key.</p></div></div></div></div><footer><div class="container"><div class="seperator"></div><div class="row"><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Community</h4><ul><li><a href="//docs.prediction.io/install/" target="blank">Download</a></li><li><a href="//docs.prediction.io/" target="blank">Docs</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">GitHub</a></li><li><a href="mailto:[email protected]" target="blank">Subscribe to User Mailing List</a></li><li><a href="//stackoverflow.com/questions/tagged/predictionio" target="blank">Stackoverflow</a></li></ul></div></div><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-col umn-row"><h4>Contribute</h4><ul><li><a href="//predictionio.incubator.apache.org/community/contribute-code/" target="blank">Contribute</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">Source Code</a></li><li><a href="//issues.apache.org/jira/browse/PIO" target="blank">Bug Tracker</a></li><li><a href="mailto:[email protected]" target="blank">Subscribe to Development Mailing List</a></li></ul></div></div></div></div><div id="footer-bottom"><div class="container"><div class="row"><div class="col-md-12"><div id="footer-logo-wrapper"><img alt="PredictionIO" src="/images/logos/logo-white-d1e9c6e6.png"/></div><div id="social-icons-wrapper"><a class="github-button" href="https://github.com/apache/incubator-predictionio" data-style="mega" data-count-href="/apache/incubator-predictionio/stargazers" data-count-api="/repos/apache/incubator-predictionio#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star a pache/incubator-predictionio on GitHub">Star</a> <a class="github-button" href="https://github.com/apache/incubator-predictionio/fork" data-icon="octicon-git-branch" data-style="mega" data-count-href="/apache/incubator-predictionio/network" data-count-api="/repos/apache/incubator-predictionio#forks_count" data-count-aria-label="# forks on GitHub" aria-label="Fork apache/incubator-predictionio on GitHub">Fork</a> <script id="github-bjs" async="" defer="" src="https://buttons.github.io/buttons.js"></script><a href="//www.facebook.com/predictionio" target="blank"><img alt="PredictionIO on Twitter" src="/images/icons/twitter-ea9dc152.png"/></a> <a href="//twitter.com/predictionio" target="blank"><img alt="PredictionIO on Facebook" src="/images/icons/facebook-5c57939c.png"/></a> </div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){ +(w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t); +e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e); +})(window,document,'script','//s.swiftypecdn.com/install/v1/st.js','_st'); + +_st('install','HaUfpXXV87xoB_zzCQ45');</script><script src="/javascripts/application-f819cf19.js"></script></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/921d6861/docs/manual/build/community/contribute-webhook/index.html.gz ---------------------------------------------------------------------- diff --git a/docs/manual/build/community/contribute-webhook/index.html.gz b/docs/manual/build/community/contribute-webhook/index.html.gz new file mode 100644 index 0000000..b3049b5 Binary files /dev/null and b/docs/manual/build/community/contribute-webhook/index.html.gz differ http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/921d6861/docs/manual/build/community/index.html ---------------------------------------------------------------------- diff --git a/docs/manual/build/community/index.html b/docs/manual/build/community/index.html new file mode 100644 index 0000000..fc74fa2 --- /dev/null +++ b/docs/manual/build/community/index.html @@ -0,0 +1,6 @@ +<!DOCTYPE html><html><head><title>Community Page</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta class="swiftype" name="title" data-type="string" content="Community Page"/><link rel="canonical" href="https://docs.prediction.io/community/"/><link href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet"/><link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet"/><link href="/stylesheets/application-3a3867f7.css" rel="stylesheet" type="text/css"/><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script><script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-M ML_HTMLorMML"></script><script src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: true });}catch(e){}</script></head><body><div id="global"><header><div class="container" id="header-wrapper"><div class="row"><div class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a href="#"></a><a href="http://predictionio.incubator.apache.org/"><img alt="PredictionIO" id="logo" src="/images/logos/logo-ee2b9bb3.png"/></a></div><div id="menu-wrapper"><div id="pill-wrapper"><a class="pill left" href="/gallery/template-gallery">TEMPLATES</a> <a class="pill right" href="//github.com/apache/incubator-predictionio/">OPEN SOURCE</a></div></div><img class="mobile-search-bar-toggler hidden-md hidden-lg" src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div id="search-bar-row-wrapper"><div class="container-fluid" id="search-bar-row"><div class="row"><div class="col-md-9 col-sm-11 col-xs-11"><div class="hidden-md hidden-lg" id="mobile-p age-heading-wrapper"><p>PredictionIO Docs</p><h4>Community Page</h4></div><h4 class="hidden-sm hidden-xs">PredictionIO Docs</h4></div><div class="col-md-3 col-sm-1 col-xs-1 hidden-md hidden-lg"><img id="left-menu-indicator" src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img src="/images/icons/search-glass-704bd4ff.png"/><input type="text" id="st-search-input" class="st-search-input" placeholder="Search Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div class="mobile-left-menu-toggler hidden-md hidden-lg"></div></div></div></div><div id="page" class="container-fluid"><div class="row"><div id="left-menu-wrapper" class="col-md-3"><nav id="nav-main"><ul><li class ="level-1"><a class="expandible" href="/"><span>Apache PredictionIO (incubating) Documentation</span></a><ul><li class="level-2"><a class="final" href="/"><span>Welcome to Apache PredictionIO (incubating)</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Started</span></a><ul><li class="level-2"><a class="final" href="/start/"><span>A Quick Intro</span></a></li><li class="level-2"><a class="final" href="/install/"><span>Installing Apache PredictionIO (incubating)</span></a></li><li class="level-2"><a class="final" href="/start/download/"><span>Downloading an Engine Template</span></a></li><li class="level-2"><a class="final" href="/start/deploy/"><span>Deploying Your First Engine</span></a></li><li class="level-2"><a class="final" href="/start/customize/"><span>Customizing the Engine</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Integrating with Your App</span></a><ul><li class="level-2"><a class="final" hre f="/appintegration/"><span>App Integration Overview</span></a></li><li class="level-2"><a class="expandible" href="/sdk/"><span>List of SDKs</span></a><ul><li class="level-3"><a class="final" href="/sdk/java/"><span>Java & Android SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/php/"><span>PHP SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li class="level-3"><a class="final" href="/sdk/community/"><span>Community Powered SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web Service</span></a></li><li class="level-2"><a class="final" href="/cli/#engine-commands"><span>Engine Command-line Interface</span></a></li><li class="level-2"><a class="final" href="/deploy/monito ring/"><span>Monitoring Engine</span></a></li><li class="level-2"><a class="final" href="/deploy/engineparams/"><span>Setting Engine Parameters</span></a></li><li class="level-2"><a class="final" href="/deploy/enginevariants/"><span>Deploying Multiple Engine Variants</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Customizing an Engine</span></a><ul><li class="level-2"><a class="final" href="/customize/"><span>Learning DASE</span></a></li><li class="level-2"><a class="final" href="/customize/dase/"><span>Implement DASE</span></a></li><li class="level-2"><a class="final" href="/customize/troubleshooting/"><span>Troubleshooting Engine Development</span></a></li><li class="level-2"><a class="final" href="/api/current/#package"><span>Engine Scala APIs</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Collecting and Analyzing Data</span></a><ul><li class="level-2"><a class="final" href="/datacollection/"><span>Event Server Overview</span></a></li><li class="level-2"><a class="final" href="/cli/#event-server-commands"><span>Event Server Command-line Interface</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventapi/"><span>Collecting Data with REST/SDKs</span></a></li><li class="level-2"><a class="final" href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li class="level-2"><a class="final" href="/datacollection/webhooks/"><span>Unifying Multichannel Data with Webhooks</span></a></li><li class="level-2"><a class="final" href="/datacollection/channel/"><span>Channel</span></a></li><li class="level-2"><a class="final" href="/datacollection/batchimport/"><span>Importing Data in Batch</span></a></li><li class="level-2"><a class="final" href="/datacollection/analytics/"><span>Using Analytics Tools</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Choosing an Algorithm(s)</span></a><ul><li class="level-2"><a class="final" href="/ algorithm/"><span>Built-in Algorithm Libraries</span></a></li><li class="level-2"><a class="final" href="/algorithm/switch/"><span>Switching to Another Algorithm</span></a></li><li class="level-2"><a class="final" href="/algorithm/multiple/"><span>Combining Multiple Algorithms</span></a></li><li class="level-2"><a class="final" href="/algorithm/custom/"><span>Adding Your Own Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a class="final" href="/evaluation/"><span>Overview</span></a></li><li class="level-2"><a class="final" href="/evaluation/paramtuning/"><span>Hyperparameter Tuning</span></a></li><li class="level-2"><a class="final" href="/evaluation/evaluationdashboard/"><span>Evaluation Dashboard</span></a></li><li class="level-2"><a class="final" href="/evaluation/metricchoose/"><span>Choosing Evaluation Metrics</span></a></li><li class="level-2"><a class="final" href="/evalua tion/metricbuild/"><span>Building Evaluation Metrics</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>System Architecture</span></a><ul><li class="level-2"><a class="final" href="/system/"><span>Architecture Overview</span></a></li><li class="level-2"><a class="final" href="/system/anotherdatastore/"><span>Using Another Data Store</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li class="level-2"><a class="final" href="/gallery/template-gallery/"><span>Browse</span></a></li><li class="level-2"><a class="final" href="/community/submit-template/"><span>Submit your Engine as a Template</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Demo Tutorials</span></a><ul><li class="level-2"><a class="final" href="/demo/tapster/"><span>Comics Recommendation Demo</span></a></li><li class="level-2"><a class="final" href="/demo/community/"><span>Community Contri buted Demo</span></a></li><li class="level-2"><a class="final" href="/demo/textclassification/"><span>Text Classification Engine Tutorial</span></a></li></ul></li><li class="level-1"><a class="expandible active" href="/community/"><span>Getting Involved</span></a><ul><li class="level-2"><a class="final" href="/community/contribute-code/"><span>Contribute Code</span></a></li><li class="level-2"><a class="final" href="/community/contribute-documentation/"><span>Contribute Documentation</span></a></li><li class="level-2"><a class="final" href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li class="level-2"><a class="final" href="/community/contribute-webhook/"><span>Contribute a Webhook</span></a></li><li class="level-2"><a class="final" href="/community/projects/"><span>Community Projects</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Getting Help</span></a><ul><li class="level-2"><a class="final" href="/resources/faq/"><span>FA Qs</span></a></li><li class="level-2"><a class="final" href="/support/"><span>Support</span></a></li></ul></li><li class="level-1"><a class="expandible" href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" href="/resources/intellij/"><span>Developing Engines with IntelliJ IDEA</span></a></li><li class="level-2"><a class="final" href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li class="level-2"><a class="final" href="/resources/glossary/"><span>Glossary</span></a></li></ul></li></ul></nav></div><div class="col-md-9 col-sm-12"><div class="content-header hidden-md hidden-lg"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><span class="last">Getting Involved</span></li></ul></div><div id="page-title"><h1>Community Page</h1></div></div><div id="table-of-content-wrapper"><h5>On this page</h5><aside id="table-of-contents"><ul> <li> <a href="#user-mailing-list">User Mailing List</a> </li> <li> <a href="#twitter">Twitter</a> </li> <li> < a href="#facebook-page">Facebook Page</a> </li> <li> <a href="#github">GitHub</a> </li> </ul> </aside><hr/><a id="edit-page-link" href="https://github.com/apache/incubator-predictionio/tree/livedoc/docs/manual/source/community/index.html.md"><img src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div class="content-header hidden-sm hidden-xs"><div id="breadcrumbs" class="hidden-sm hidden xs"><ul><li><span class="last">Getting Involved</span></li></ul></div><div id="page-title"><h1>Community Page</h1></div></div><div class="content"><h2 id='user-mailing-list' class='header-anchors'>User Mailing List</h2><p>This list is for users of Apache PredictionIO (incubating) to ask questions, share knowledge, and discuss issues. Do send mail to this list with usage and configuration questions and problems. Also, please send questions to this list to verify your problem before filing issues in JIRA.</p><p><a href="mailto:[email protected]">Subsc ribe</a> to our User Mailing List. <a href="mailto:[email protected]">Unsubscribe</a> from our User Mailing List.</p><h2 id='twitter' class='header-anchors'>Twitter</h2><p>Follow us on Twitter <a href="https://twitter.com/PredictionIO">@predictionio</a>.</p><h2 id='facebook-page' class='header-anchors'>Facebook Page</h2><p>Like us on Facebook at <a href="https://www.facebook.com/predictionio">https://www.facebook.com/predictionio</a>.</p><h2 id='github' class='header-anchors'>GitHub</h2><p>View our code on GitHub at <a href="https://github.com/apache/incubator-predictionio">https://github.com/apache/incubator-predictionio</a>.</p><iframe src="/github/?user=apache&repo=incubator-predictionio&type=fork&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="170" height="30"></iframe> <iframe src="/github/?user=apache&repo=incubator-predictionio&type=watch&count=true&size=large" allowtransparency="true" frameborder="0" scrol ling="0" width="170" height="30"></iframe> </div></div></div></div><footer><div class="container"><div class="seperator"></div><div class="row"><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Community</h4><ul><li><a href="//docs.prediction.io/install/" target="blank">Download</a></li><li><a href="//docs.prediction.io/" target="blank">Docs</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">GitHub</a></li><li><a href="mailto:[email protected]" target="blank">Subscribe to User Mailing List</a></li><li><a href="//stackoverflow.com/questions/tagged/predictionio" target="blank">Stackoverflow</a></li></ul></div></div><div class="col-md-6 col-xs-6 footer-link-column"><div class="footer-link-column-row"><h4>Contribute</h4><ul><li><a href="//predictionio.incubator.apache.org/community/contribute-code/" target="blank">Contribute</a></li><li><a href="//github.com/apache/incubator-predictionio" target="blank">Source Code</a></li><li><a href="//issues.apache.org/jira/browse/PIO" target="blank">Bug Tracker</a></li><li><a href="mailto:[email protected]" target="blank">Subscribe to Development Mailing List</a></li></ul></div></div></div></div><div id="footer-bottom"><div class="container"><div class="row"><div class="col-md-12"><div id="footer-logo-wrapper"><img alt="PredictionIO" src="/images/logos/logo-white-d1e9c6e6.png"/></div><div id="social-icons-wrapper"><a class="github-button" href="https://github.com/apache/incubator-predictionio" data-style="mega" data-count-href="/apache/incubator-predictionio/stargazers" data-count-api="/repos/apache/incubator-predictionio#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star apache/incubator-predictionio on GitHub">Star</a> <a class="github-button" href="https://github.com/apache/incubator-predictionio/fork" data-icon="octicon-git-branch" data-style="mega" data-count-href ="/apache/incubator-predictionio/network" data-count-api="/repos/apache/incubator-predictionio#forks_count" data-count-aria-label="# forks on GitHub" aria-label="Fork apache/incubator-predictionio on GitHub">Fork</a> <script id="github-bjs" async="" defer="" src="https://buttons.github.io/buttons.js"></script><a href="//www.facebook.com/predictionio" target="blank"><img alt="PredictionIO on Twitter" src="/images/icons/twitter-ea9dc152.png"/></a> <a href="//twitter.com/predictionio" target="blank"><img alt="PredictionIO on Facebook" src="/images/icons/facebook-5c57939c.png"/></a> </div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){ +(w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t); +e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e); +})(window,document,'script','//s.swiftypecdn.com/install/v1/st.js','_st'); + +_st('install','HaUfpXXV87xoB_zzCQ45');</script><script src="/javascripts/application-f819cf19.js"></script></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/921d6861/docs/manual/build/community/index.html.gz ---------------------------------------------------------------------- diff --git a/docs/manual/build/community/index.html.gz b/docs/manual/build/community/index.html.gz new file mode 100644 index 0000000..511d46d Binary files /dev/null and b/docs/manual/build/community/index.html.gz differ
