You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by ah...@apache.org on 2017/04/17 07:01:50 UTC

svn commit: r1791664 [4/5] - in /zeppelin/site/docs/0.8.0-SNAPSHOT: ./ development/ displaysystem/ install/ interpreter/ manual/ quickstart/ rest-api/ security/ storage/

Modified: zeppelin/site/docs/0.8.0-SNAPSHOT/search.html
URL: http://svn.apache.org/viewvc/zeppelin/site/docs/0.8.0-SNAPSHOT/search.html?rev=1791664&r1=1791663&r2=1791664&view=diff
==============================================================================
--- zeppelin/site/docs/0.8.0-SNAPSHOT/search.html (original)
+++ zeppelin/site/docs/0.8.0-SNAPSHOT/search.html Mon Apr 17 07:01:48 2017
@@ -164,10 +164,11 @@
                 <li><a href="/docs/0.8.0-SNAPSHOT/security/notebook_authorization.html">Notebook Authorization</a></li>
                 <li><a href="/docs/0.8.0-SNAPSHOT/security/datasource_authorization.html">Data Source Authorization</a></li>
                 <li role="separator" class="divider"></li>
-                <li class="title"><span><b>Helium Framework</b><span></li>
-                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinapplication.html">Writing Zeppelin Application (Experimental)</a></li>
-                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinspell.html">Writing Zeppelin Spell (Experimental)</a></li>
-                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinvisualization.html">Writing Zeppelin Visualization (Experimental)</a></li>
+                <li class="title"><span><b>Helium Framework (Experimental)</b></span></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinapplication.html">Writing Zeppelin Application</a></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinspell.html">Writing Zeppelin Spell</a></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinvisualization.html">Writing Zeppelin Visualization: Basics</a></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinvisualization_transformation.html">Writing Zeppelin Visualization: Transformation</a></li>
                 <li role="separator" class="divider"></li>
                 <li class="title"><span><b>Advanced</b><span></li>
                 <li><a href="/docs/0.8.0-SNAPSHOT/install/virtual_machine.html">Zeppelin on Vagrant VM</a></li>

Modified: zeppelin/site/docs/0.8.0-SNAPSHOT/search_data.json
URL: http://svn.apache.org/viewvc/zeppelin/site/docs/0.8.0-SNAPSHOT/search_data.json?rev=1791664&r1=1791663&r2=1791664&view=diff
==============================================================================
--- zeppelin/site/docs/0.8.0-SNAPSHOT/search_data.json (original)
+++ zeppelin/site/docs/0.8.0-SNAPSHOT/search_data.json Mon Apr 17 07:01:48 2017
@@ -26,8 +26,8 @@
   
 
     "/development/writingzeppelinapplication.html": {
-      "title": "Writing a new Application(Experimental)",
-      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Writing a new Application (Experimental)What is Apache Zeppelin ApplicationApache Zeppelin Application is a package that runs on Interpreter process and displays it&amp;#39;s output inside of the notebook. While application runs on Interpreter process, it&amp;#39;s able to access resources provided by Interpreter through ResourcePool. Output is always rendered by AngularDisplaySystem. Therefore application provides all the possibli
 ties of making interactive graphical application that uses data and processing power of any Interpreter.Make your own ApplicationWriting Application means extending org.apache.zeppelin.helium.Application. You can use your favorite IDE and language while Java class files are packaged into jar. Application class looks like/** * Constructor. Invoked when application is loaded */public Application(ApplicationContext context);/** * Invoked when there&amp;#39;re (possible) updates in required resource set. * i.e. invoked after application load and after paragraph finishes. */public abstract void run(ResourceSet args);/** * Invoked before application unload. * Application is automatically unloaded with paragraph/notebook removal */public abstract void unload();You can check example applications under ./zeppelin-examples directory.Development modeIn the development mode, you can run your Application in your IDE as a normal java application and see the result inside of Zeppelin notebook.org.
 apache.zeppelin.helium.ZeppelinApplicationDevServer can run Zeppelin Application in development mode.// entry point for development modepublic static void main(String[] args) throws Exception {  // add resources for development mode  LocalResourcePool pool = new LocalResourcePool(&amp;quot;dev&amp;quot;);  pool.put(&amp;quot;date&amp;quot;, new Date());  // run application in devlopment mode with given resource  // in this case, Clock.class.getName() will be the application class name    org.apache.zeppelin.helium.ZeppelinApplicationDevServer devServer = new org.apache.zeppelin.helium.ZeppelinApplicationDevServer(    Clock.class.getName(), pool.getAll());  // start development mode  devServer.start();  devServer.join();}In the Zeppelin notebook, run %dev run will connect to application running in development mode.Package filePackage file is a json file that provides information about the application.Json file contains the following information{  name : &amp;quot;[organization].[name
 ]&amp;quot;,  description : &amp;quot;Description&amp;quot;,  artifact : &amp;quot;groupId:artifactId:version&amp;quot;,  className : &amp;quot;your.package.name.YourApplicationClass&amp;quot;,  resources : [    [&amp;quot;resource.name&amp;quot;, &amp;quot;:resource.class.name&amp;quot;],    [&amp;quot;alternative.resource.name&amp;quot;, &amp;quot;:alternative.class.name&amp;quot;]  ],  icon : &amp;quot;&amp;lt;i class=&amp;quot;icon&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;}nameName is a string in [group].[name] format.[group] and [name] allow only [A-Za-z0-9_].Group is normally the name of an organization who creates this application.descriptionA short description about the applicationartifactLocation of the jar artifact.&amp;quot;groupId:artifactId:version&amp;quot; will load artifact from maven repository.If jar exists in the local filesystem, absolute/relative can be used.e.g.When artifact exists in Maven repositoryartifact: &amp;quot;org.apache.zeppelin:zeppelin-examples
 :0.6.0&amp;quot;When artifact exists in the local filesystemartifact: &amp;quot;zeppelin-example/target/zeppelin-example-0.6.0.jar&amp;quot;classNameEntry point. Class that extends org.apache.zeppelin.helium.ApplicationresourcesTwo dimensional array that defines required resources by name or by className. Helium Application launcher will compare resources in the ResourcePool with the information in this field and suggest application only when all required resources are available in the ResourcePool.Resouce name is a string which will be compared with the name of objects in the ResourcePool. className is a string with &amp;quot;:&amp;quot; prepended, which will be compared with className of the objects in the ResourcePool.Application may require two or more resources. Required resources can be listed inside of the json array. For example, if the application requires object &amp;quot;name1&amp;quot;, &amp;quot;name2&amp;quot; and &amp;quot;className1&amp;quot; type of object to run, r
 esources field can beresources: [  [ &amp;quot;name1&amp;quot;, &amp;quot;name2&amp;quot;, &amp;quot;:className1&amp;quot;, ...]]If Application can handle alternative combination of required resources, alternative set can be listed as below.resources: [  [ &amp;quot;name&amp;quot;, &amp;quot;:className&amp;quot;],  [ &amp;quot;altName&amp;quot;, &amp;quot;:altClassName1&amp;quot;],  ...]Easier way to understand this scheme isresources: [   [ &amp;#39;resource&amp;#39; AND &amp;#39;resource&amp;#39; AND ... ] OR   [ &amp;#39;resource&amp;#39; AND &amp;#39;resource&amp;#39; AND ... ] OR   ...]iconIcon to be used on the application button. String in this field will be rendered as a HTML tag.e.g.icon: &amp;quot;&amp;lt;i class=&amp;#39;fa fa-clock-o&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;",
+      "title": "Writing a new Application",
+      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Writing a new ApplicationWhat is Apache Zeppelin ApplicationApache Zeppelin Application is a package that runs on Interpreter process and displays it&amp;#39;s output inside of the notebook. While application runs on Interpreter process, it&amp;#39;s able to access resources provided by Interpreter through ResourcePool. Output is always rendered by AngularDisplaySystem. Therefore application provides all the possiblities of making 
 interactive graphical application that uses data and processing power of any Interpreter.Make your own ApplicationWriting Application means extending org.apache.zeppelin.helium.Application. You can use your favorite IDE and language while Java class files are packaged into jar. Application class looks like/** * Constructor. Invoked when application is loaded */public Application(ApplicationContext context);/** * Invoked when there&amp;#39;re (possible) updates in required resource set. * i.e. invoked after application load and after paragraph finishes. */public abstract void run(ResourceSet args);/** * Invoked before application unload. * Application is automatically unloaded with paragraph/notebook removal */public abstract void unload();You can check example applications under ./zeppelin-examples directory.Development modeIn the development mode, you can run your Application in your IDE as a normal java application and see the result inside of Zeppelin notebook.org.apache.zeppelin
 .helium.ZeppelinApplicationDevServer can run Zeppelin Application in development mode.// entry point for development modepublic static void main(String[] args) throws Exception {  // add resources for development mode  LocalResourcePool pool = new LocalResourcePool(&amp;quot;dev&amp;quot;);  pool.put(&amp;quot;date&amp;quot;, new Date());  // run application in devlopment mode with given resource  // in this case, Clock.class.getName() will be the application class name    org.apache.zeppelin.helium.ZeppelinApplicationDevServer devServer = new org.apache.zeppelin.helium.ZeppelinApplicationDevServer(    Clock.class.getName(), pool.getAll());  // start development mode  devServer.start();  devServer.join();}In the Zeppelin notebook, run %dev run will connect to application running in development mode.Package filePackage file is a json file that provides information about the application.Json file contains the following information{  &amp;quot;name&amp;quot; : &amp;quot;[organization].
 [name]&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Description&amp;quot;,  &amp;quot;artifact&amp;quot; : &amp;quot;groupId:artifactId:version&amp;quot;,  &amp;quot;className&amp;quot; : &amp;quot;your.package.name.YourApplicationClass&amp;quot;,  &amp;quot;resources&amp;quot; : [    [&amp;quot;resource.name&amp;quot;, &amp;quot;:resource.class.name&amp;quot;],    [&amp;quot;alternative.resource.name&amp;quot;, &amp;quot;:alternative.class.name&amp;quot;]  ],  &amp;quot;icon&amp;quot; : &amp;quot;&amp;lt;i class=&amp;#39;icon&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;}nameName is a string in [group].[name] format.[group] and [name] allow only [A-Za-z0-9_].Group is normally the name of an organization who creates this application.descriptionA short description about the applicationartifactLocation of the jar artifact.&amp;quot;groupId:artifactId:version&amp;quot; will load artifact from maven repository.If jar exists in the local filesystem, absolute/relative can be use
 d.e.g.When artifact exists in Maven repositoryartifact: &amp;quot;org.apache.zeppelin:zeppelin-examples:0.6.0&amp;quot;When artifact exists in the local filesystemartifact: &amp;quot;zeppelin-example/target/zeppelin-example-0.6.0.jar&amp;quot;classNameEntry point. Class that extends org.apache.zeppelin.helium.ApplicationresourcesTwo dimensional array that defines required resources by name or by className. Helium Application launcher will compare resources in the ResourcePool with the information in this field and suggest application only when all required resources are available in the ResourcePool.Resouce name is a string which will be compared with the name of objects in the ResourcePool. className is a string with &amp;quot;:&amp;quot; prepended, which will be compared with className of the objects in the ResourcePool.Application may require two or more resources. Required resources can be listed inside of the json array. For example, if the application requires object &amp;quot
 ;name1&amp;quot;, &amp;quot;name2&amp;quot; and &amp;quot;className1&amp;quot; type of object to run, resources field can beresources: [  [ &amp;quot;name1&amp;quot;, &amp;quot;name2&amp;quot;, &amp;quot;:className1&amp;quot;, ...]]If Application can handle alternative combination of required resources, alternative set can be listed as below.resources: [  [ &amp;quot;name&amp;quot;, &amp;quot;:className&amp;quot;],  [ &amp;quot;altName&amp;quot;, &amp;quot;:altClassName1&amp;quot;],  ...]Easier way to understand this scheme isresources: [   [ &amp;#39;resource&amp;#39; AND &amp;#39;resource&amp;#39; AND ... ] OR   [ &amp;#39;resource&amp;#39; AND &amp;#39;resource&amp;#39; AND ... ] OR   ...]iconIcon to be used on the application button. String in this field will be rendered as a HTML tag.e.g.icon: &amp;quot;&amp;lt;i class=&amp;#39;fa fa-clock-o&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;",
       "url": " /development/writingzeppelinapplication.html",
       "group": "development",
       "excerpt": "Apache Zeppelin Application is a package that runs on Interpreter process and displays it's output inside of the notebook. Make your own Application in Apache Zeppelin is quite easy."
@@ -48,8 +48,8 @@
   
 
     "/development/writingzeppelinspell.html": {
-      "title": "Writing a new Spell(Experimental)",
-      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Writing a new Spell (Experimental)What is Apache Zeppelin SpellSpell is a kind of interpreter that runs on browser not on backend. So, technically it&amp;#39;s the frontend interpreter. It can provide many benefits.Spell is pluggable frontend interpreter. So it can be installed and removed easily using helium registry. Every spell is written in javascript. It means you can use existing javascript libraries whatever you want.Spell r
 uns on browser like display system (%html, %table). In other words, every spell can be used as display system as well.How it worksHelium Spell works like Helium Visualization.Every helium packages are loaded from central (online) registry or local registryYou can see loaded packages in /helium page.When you enable a spell, it&amp;#39;s built from server and sent to clientFinally it will be loaded into browser.How to use spell1. EnablingFind a spell what you want to use in /helium package and click Enable button.2. UsingSpell works like an interpreter. Use the MAGIC value to execute spell in a note. (you might need to refresh after enabling)For example, Use %echo for the Echo Spell.Write a new SpellMaking a new spell is similar to Helium Visualization#write-new-visualization.Add framework dependency called zeppelin-spell into package.jsonWrite code using frameworkPublish your spell to npm1. Create a npm packageCreate a package.json in new directory for spell. You have to add a framew
 ork called zeppelin-spell as a dependency to create spell (zeppelin-spell)Also, you can add any dependencies you want to utilise.Here&amp;#39;s an example{  &amp;quot;name&amp;quot;: &amp;quot;zeppelin-echo-spell&amp;quot;,  &amp;quot;description&amp;quot;: &amp;quot;Zeppelin Echo Spell (example)&amp;quot;,  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  &amp;quot;main&amp;quot;: &amp;quot;index&amp;quot;,  &amp;quot;author&amp;quot;: &amp;quot;&amp;quot;,  &amp;quot;license&amp;quot;: &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;dependencies&amp;quot;: {    &amp;quot;zeppelin-spell&amp;quot;: &amp;quot;*&amp;quot;  },  &amp;quot;helium&amp;quot;: {    &amp;quot;icon&amp;quot; : &amp;quot;&amp;lt;i class=&amp;#39;fa fa-repeat&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;,    &amp;quot;spell&amp;quot;: {      &amp;quot;magic&amp;quot;: &amp;quot;%echo&amp;quot;,      &amp;quot;usage&amp;quot;: &amp;quot;%echo &amp;lt;TEXT&amp;gt;&amp;quot;    }  }}2. Write spell using framewor
 kHere are some examples you can referEcho SpellMarkdown Spell: Using libraryFlowchart Spell: Using DOMGoogle Translation API Spell: Using API (returning promise)Now, you need to write code to create spell which processing text.import {    SpellBase,    SpellResult,    DefaultDisplayType,} from &amp;#39;zeppelin-spell&amp;#39;;export default class EchoSpell extends SpellBase {    constructor() {        /** pass magic to super class&amp;#39;s constructor parameter */        super(&amp;quot;%echo&amp;quot;);    }    interpret(paragraphText) {        const processed = paragraphText + &amp;#39;!&amp;#39;;        /**          * should return `SpellResult` which including `data` and `type`         * default type is `TEXT` if you don&amp;#39;t specify.           */        return new SpellResult(processed);    }}Here is another example. Let&amp;#39;s say we want to create markdown spell. First of all, we should add a dependency for markdown in package.json// package.json &amp;quot;dependenci
 es&amp;quot;: {    &amp;quot;markdown&amp;quot;: &amp;quot;0.5.0&amp;quot;,    &amp;quot;zeppelin-spell&amp;quot;: &amp;quot;*&amp;quot;  },And here is spell code.import {    SpellBase,    SpellResult,    DefaultDisplayType,} from &amp;#39;zeppelin-spell&amp;#39;;import md from &amp;#39;markdown&amp;#39;;const markdown = md.markdown;export default class MarkdownSpell extends SpellBase {    constructor() {        super(&amp;quot;%markdown&amp;quot;);    }    interpret(paragraphText) {        const parsed = markdown.toHTML(paragraphText);        /**         * specify `DefaultDisplayType.HTML` since `parsed` will contain DOM         * otherwise it will be rendered as `DefaultDisplayType.TEXT` (default)         */        return new SpellResult(parsed, DefaultDisplayType.HTML);    }}You might want to manipulate DOM directly (e.g google d3.js), then refer Flowchart Spell You might want to return promise not string (e.g API call), then refer Google Translation API Spell3. Create Helium pac
 kage file for local deploymentYou don&amp;#39;t want to publish your package every time you make a change in your spell. Zeppelin provides local deploy.The only thing you need to do is creating a Helium Package file (JSON) for local deploy. It&amp;#39;s automatically created when you publish to npm repository but in local case, you should make it by yourself.{  &amp;quot;type&amp;quot; : &amp;quot;SPELL&amp;quot;,  &amp;quot;name&amp;quot; : &amp;quot;zeppelin-echo-spell&amp;quot;,  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Return just what receive (example)&amp;quot;,  &amp;quot;artifact&amp;quot; : &amp;quot;./zeppelin-examples/zeppelin-example-spell-echo&amp;quot;,  &amp;quot;license&amp;quot; : &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;spell&amp;quot;: {    &amp;quot;magic&amp;quot;: &amp;quot;%echo&amp;quot;,    &amp;quot;usage&amp;quot;: &amp;quot;%echo &amp;lt;TEXT&amp;gt;&amp;quot;  }}Place this file in your local r
 egistry directory (default $ZEPPELIN_HOME/helium).type should be SPELLMake sure that artifact should be same as your spell directory. You can get information about other fields in Helium Visualization#3-create-helium-package-file-and-locally-deploy.4. Run in dev modecd zeppelin-webyarn run dev:helium You can browse localhost:9000. Every time refresh your browser, Zeppelin will rebuild your spell and reload changes.5. Publish your spell to the npm repositorySee Publishing npm packages",
+      "title": "Writing a new Spell",
+      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Writing a new SpellWhat is Apache Zeppelin SpellSpell is a kind of interpreter that runs on browser not on backend. So, technically it&amp;#39;s the frontend interpreter.It can provide many benefits.Spell is pluggable frontend interpreter. So it can be installed and removed easily using helium registry.Every spell is written in javascript. It means you can use existing javascript libraries whatever you want.Spell runs on browser li
 ke display system (%html, %table). In other words, every spell can be used as display system as well.How it worksHelium Spell works like Helium Visualization.Every helium packages are loaded from central (online) registry or local registryYou can see loaded packages in /helium page.When you enable a spell, it&amp;#39;s built from server and sent to clientFinally it will be loaded into browser.How to use spell1. EnablingFind a spell what you want to use in /helium package and click Enable button.2. UsingSpell works like an interpreter. Use the MAGIC value to execute spell in a note. (you might need to refresh after enabling)For example, Use %echo for the Echo Spell.Write a new SpellMaking a new spell is similar to Helium Visualization#write-new-visualization.Add framework dependency called zeppelin-spell into package.jsonWrite code using frameworkPublish your spell to npm1. Create a npm packageCreate a package.json in new directory for spell.You have to add a framework called zeppeli
 n-spell as a dependency to create spell (zeppelin-spell)Also, you can add any dependencies you want to utilise.Here&amp;#39;s an example{  &amp;quot;name&amp;quot;: &amp;quot;zeppelin-echo-spell&amp;quot;,  &amp;quot;description&amp;quot;: &amp;quot;Zeppelin Echo Spell (example)&amp;quot;,  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  &amp;quot;main&amp;quot;: &amp;quot;index&amp;quot;,  &amp;quot;author&amp;quot;: &amp;quot;&amp;quot;,  &amp;quot;license&amp;quot;: &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;dependencies&amp;quot;: {    &amp;quot;zeppelin-spell&amp;quot;: &amp;quot;*&amp;quot;  },  &amp;quot;helium&amp;quot;: {    &amp;quot;icon&amp;quot; : &amp;quot;&amp;lt;i class=&amp;#39;fa fa-repeat&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;,    &amp;quot;spell&amp;quot;: {      &amp;quot;magic&amp;quot;: &amp;quot;%echo&amp;quot;,      &amp;quot;usage&amp;quot;: &amp;quot;%echo &amp;lt;TEXT&amp;gt;&amp;quot;    }  }}2. Write spell using frameworkHere are some exa
 mples you can referEcho SpellMarkdown Spell: Using libraryFlowchart Spell: Using DOMGoogle Translation API Spell: Using API (returning promise)Now, you need to write code to create spell which processing text.import {    SpellBase,    SpellResult,    DefaultDisplayType,} from &amp;#39;zeppelin-spell&amp;#39;;export default class EchoSpell extends SpellBase {    constructor() {        /** pass magic to super class&amp;#39;s constructor parameter */        super(&amp;quot;%echo&amp;quot;);    }    interpret(paragraphText) {        const processed = paragraphText + &amp;#39;!&amp;#39;;        /**         * should return `SpellResult` which including `data` and `type`         * default type is `TEXT` if you don&amp;#39;t specify.           */        return new SpellResult(processed);    }}Here is another example. Let&amp;#39;s say we want to create markdown spell. First of all, we should add a dependency for markdown in package.json// package.json &amp;quot;dependencies&amp;quot;: {    
 &amp;quot;markdown&amp;quot;: &amp;quot;0.5.0&amp;quot;,    &amp;quot;zeppelin-spell&amp;quot;: &amp;quot;*&amp;quot;  },And here is spell code.import {    SpellBase,    SpellResult,    DefaultDisplayType,} from &amp;#39;zeppelin-spell&amp;#39;;import md from &amp;#39;markdown&amp;#39;;const markdown = md.markdown;export default class MarkdownSpell extends SpellBase {    constructor() {        super(&amp;quot;%markdown&amp;quot;);    }    interpret(paragraphText) {        const parsed = markdown.toHTML(paragraphText);        /**         * specify `DefaultDisplayType.HTML` since `parsed` will contain DOM         * otherwise it will be rendered as `DefaultDisplayType.TEXT` (default)         */        return new SpellResult(parsed, DefaultDisplayType.HTML);    }}You might want to manipulate DOM directly (e.g google d3.js), then refer Flowchart SpellYou might want to return promise not string (e.g API call), then refer Google Translation API Spell3. Create Helium package file for local 
 deploymentYou don&amp;#39;t want to publish your package every time you make a change in your spell. Zeppelin provides local deploy.The only thing you need to do is creating a Helium Package file (JSON) for local deploy.It&amp;#39;s automatically created when you publish to npm repository but in local case, you should make it by yourself.{  &amp;quot;type&amp;quot; : &amp;quot;SPELL&amp;quot;,  &amp;quot;name&amp;quot; : &amp;quot;zeppelin-echo-spell&amp;quot;,  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Return just what receive (example)&amp;quot;,  &amp;quot;artifact&amp;quot; : &amp;quot;./zeppelin-examples/zeppelin-example-spell-echo&amp;quot;,  &amp;quot;license&amp;quot; : &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;spell&amp;quot;: {    &amp;quot;magic&amp;quot;: &amp;quot;%echo&amp;quot;,    &amp;quot;usage&amp;quot;: &amp;quot;%echo &amp;lt;TEXT&amp;gt;&amp;quot;  }}Place this file in your local registry directory (de
 fault $ZEPPELIN_HOME/helium).type should be SPELLMake sure that artifact should be same as your spell directory.You can get information about other fields in Helium Visualization#3-create-helium-package-file-and-locally-deploy.4. Run in dev modecd zeppelin-webyarn run dev:heliumYou can browse localhost:9000. Every time refresh your browser, Zeppelin will rebuild your spell and reload changes.5. Publish your spell to the npm repositorySee Publishing npm packages",
       "url": " /development/writingzeppelinspell.html",
       "group": "development",
       "excerpt": "Spell is a kind of interpreter that runs on browser not on backend. So, technically it's the frontend interpreter. "
@@ -59,8 +59,8 @@
   
 
     "/development/writingzeppelinvisualization.html": {
-      "title": "Writing a new Visualization(Experimental)",
-      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Writing a new Visualization (Experimental)What is Apache Zeppelin VisualizationApache Zeppelin Visualization is a pluggable package that can be loaded/unloaded on runtime through Helium framework in Zeppelin. A Visualization is a javascript npm package and user can use them just like any other built-in visualization in notebook.How it works1. Load Helium package files from registryZeppelin needs to know what Visualization packages 
 are available. Zeppelin will read information of packages from both online and local registry.Registries are configurable through ZEPPELIN_HELIUM_LOCALREGISTRY_DEFAULT env variable or zeppelin.helium.localregistry.default property.2. Enable packagesOnce Zeppelin loads Helium package files from registries, available packages are displayed in Helium menu.Click &amp;#39;enable&amp;#39; button.3. Create and load visualization bundle on the flyOnce a Visualization package is enabled, HeliumBundleFactory creates a js bundle. The js bundle is served by helium/bundle/load rest api endpoint.4. Run visualizationZeppelin shows additional button for loaded Visualizations.User can use just like any other built-in visualizations.Write new Visualization1. Create a npm packageCreate a package.json in your new Visualization directory. Normally, you can add any dependencies in package.json however Zeppelin Visualization package only allows two dependencies: zeppelin-vis and zeppelin-tabledata.Here&am
 p;#39;s an example{  &amp;quot;name&amp;quot;: &amp;quot;zeppelin_horizontalbar&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Horizontal Bar chart&amp;quot;,  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  &amp;quot;main&amp;quot;: &amp;quot;horizontalbar&amp;quot;,  &amp;quot;author&amp;quot;: &amp;quot;&amp;quot;,  &amp;quot;license&amp;quot;: &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;dependencies&amp;quot;: {    &amp;quot;zeppelin-tabledata&amp;quot;: &amp;quot;*&amp;quot;,    &amp;quot;zeppelin-vis&amp;quot;: &amp;quot;*&amp;quot;  }}2. Create your own visualizationTo create your own visualization, you need to create a js file and import Visualization class from zeppelin-vis package and extend the class. zeppelin-tabledata package provides some useful transformations, like pivot, you can use in your visualization. (you can create your own transformation, too).Visualization class, there&amp;#39;re several methods that you need to override and implement. Here&
 amp;#39;s simple visualization that just prints Hello world.import Visualization from &amp;#39;zeppelin-vis&amp;#39;import PassthroughTransformation from &amp;#39;zeppelin-tabledata/passthrough&amp;#39;export default class helloworld extends Visualization {  constructor(targetEl, config) {    super(targetEl, config)    this.passthrough = new PassthroughTransformation(config);  }  render(tableData) {    this.targetEl.html(&amp;#39;Hello world!&amp;#39;)  }  getTransformation() {    return this.passthrough  }}To learn more about Visualization class, check visualization.js.You can check complete visualization package example here.Zeppelin&amp;#39;s built-in visualization uses the same API, so you can check built-in visualizations as additional examples.3. Create Helium package file and locally deployHelium Package file is a json file that provides information about the application.Json file contains the following information{  &amp;quot;type&amp;quot; : &amp;quot;VISUALIZATION&amp;quot
 ;,  &amp;quot;name&amp;quot; : &amp;quot;zeppelin_horizontalbar&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Horizontal Bar chart (example)&amp;quot;,  &amp;quot;license&amp;quot; : &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;artifact&amp;quot; : &amp;quot;./zeppelin-examples/zeppelin-example-horizontalbar&amp;quot;,  &amp;quot;icon&amp;quot; : &amp;quot;&amp;lt;i class=&amp;#39;fa fa-bar-chart rotate90flipX&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;}Place this file in your local registry directory (default ./helium).typeWhen you&amp;#39;re creating a visualization, &amp;#39;type&amp;#39; should be &amp;#39;VISUALIZATION&amp;#39;.Check application type if you&amp;#39;re interested in the other types of package.nameName of visualization. Should be unique. Allows [A-Za-z90-9_].descriptionA short description about visualization.artifactLocation of the visualization npm package. Support npm package with version or local filesystem path.e.g.When artifact exists in npm reposit
 oryartifact: &amp;quot;my-visualiztion@1.0.0&amp;quot;When artifact exists in local file systemartifact: &amp;quot;/path/to/my/visualization&amp;quot;licenseLicense information.e.g.license: &amp;quot;Apache-2.0&amp;quot;iconIcon to be used in visualization select button. String in this field will be rendered as a HTML tag.e.g.icon: &amp;quot;&amp;lt;i class=&amp;#39;fa fa-coffee&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;4. Run in dev modePlace your Helium package file in local registry (ZEPPELIN_HOME/helium).Run Zeppelin. And then run zeppelin-web in visualization dev mode.cd zeppelin-webyarn run dev:helium You can browse localhost:9000. Everytime refresh your browser, Zeppelin will rebuild your visualization and reload changes.5. Publish your visualizationOnce it&amp;#39;s done, publish your visualization package using npm publish.That&amp;#39;s it. With in an hour, your visualization will be available in Zeppelin&amp;#39;s helium menu.",
+      "title": "Writing a new Visualization",
+      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Writing a new VisualizationWhat is Apache Zeppelin VisualizationApache Zeppelin Visualization is a pluggable package that can be loaded/unloaded on runtime through Helium framework in Zeppelin. A Visualization is a javascript npm package and user can use them just like any other built-in visualization in notebook.How it works1. Load Helium package files from registryZeppelin needs to know what Visualization packages are available. 
 Zeppelin will read information of packages from both online and local registry.Registries are configurable through ZEPPELIN_HELIUM_LOCALREGISTRY_DEFAULT env variable or zeppelin.helium.localregistry.default property.2. Enable packagesOnce Zeppelin loads Helium package files from registries, available packages are displayed in Helium menu.Click &amp;#39;enable&amp;#39; button.3. Create and load visualization bundle on the flyOnce a Visualization package is enabled, HeliumBundleFactory creates a js bundle. The js bundle is served by helium/bundle/load rest api endpoint.4. Run visualizationZeppelin shows additional button for loaded Visualizations.User can use just like any other built-in visualizations.Write new Visualization1. Create a npm packageCreate a package.json in your new Visualization directory. You can add any dependencies in package.json, but you must include two dependencies: zeppelin-vis and zeppelin-tabledata.Here&amp;#39;s an example{  &amp;quot;name&amp;quot;: &amp;qu
 ot;zeppelin_horizontalbar&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Horizontal Bar chart&amp;quot;,  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,  &amp;quot;main&amp;quot;: &amp;quot;horizontalbar&amp;quot;,  &amp;quot;author&amp;quot;: &amp;quot;&amp;quot;,  &amp;quot;license&amp;quot;: &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;dependencies&amp;quot;: {    &amp;quot;zeppelin-tabledata&amp;quot;: &amp;quot;*&amp;quot;,    &amp;quot;zeppelin-vis&amp;quot;: &amp;quot;*&amp;quot;  }}2. Create your own visualizationTo create your own visualization, you need to create a js file and import Visualization class from zeppelin-vis package and extend the class. zeppelin-tabledata package provides some useful transformations, like pivot, you can use in your visualization. (you can create your own transformation, too).Visualization class, there&amp;#39;re several methods that you need to override and implement. Here&amp;#39;s simple visualization that just prints Hello 
 world.import Visualization from &amp;#39;zeppelin-vis&amp;#39;import PassthroughTransformation from &amp;#39;zeppelin-tabledata/passthrough&amp;#39;export default class helloworld extends Visualization {  constructor(targetEl, config) {    super(targetEl, config)    this.passthrough = new PassthroughTransformation(config);  }  render(tableData) {    this.targetEl.html(&amp;#39;Hello world!&amp;#39;)  }  getTransformation() {    return this.passthrough  }}To learn more about Visualization class, check visualization.js.You can check complete visualization package example here.Zeppelin&amp;#39;s built-in visualization uses the same API, so you can check built-in visualizations as additional examples.3. Create Helium package file and locally deployHelium Package file is a json file that provides information about the application.Json file contains the following information{  &amp;quot;type&amp;quot; : &amp;quot;VISUALIZATION&amp;quot;,  &amp;quot;name&amp;quot; : &amp;quot;zeppelin_hori
 zontalbar&amp;quot;,  &amp;quot;description&amp;quot; : &amp;quot;Horizontal Bar chart (example)&amp;quot;,  &amp;quot;license&amp;quot; : &amp;quot;Apache-2.0&amp;quot;,  &amp;quot;artifact&amp;quot; : &amp;quot;./zeppelin-examples/zeppelin-example-horizontalbar&amp;quot;,  &amp;quot;icon&amp;quot; : &amp;quot;&amp;lt;i class=&amp;#39;fa fa-bar-chart rotate90flipX&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;}Place this file in your local registry directory (default ./helium).typeWhen you&amp;#39;re creating a visualization, &amp;#39;type&amp;#39; should be &amp;#39;VISUALIZATION&amp;#39;.Check application type if you&amp;#39;re interested in the other types of package.nameName of visualization. Should be unique. Allows [A-Za-z90-9_].descriptionA short description about visualization.artifactLocation of the visualization npm package. Support npm package with version or local filesystem path.e.g.When artifact exists in npm repository&amp;quot;artifact&amp;quot;: &amp;quot;my-visualiz
 tion@1.0.0&amp;quot;When artifact exists in local file system&amp;quot;artifact&amp;quot;: &amp;quot;/path/to/my/visualization&amp;quot;licenseLicense information.e.g.&amp;quot;license&amp;quot;: &amp;quot;Apache-2.0&amp;quot;iconIcon to be used in visualization select button. String in this field will be rendered as a HTML tag.e.g.&amp;quot;icon&amp;quot;: &amp;quot;&amp;lt;i class=&amp;#39;fa fa-coffee&amp;#39;&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;4. Run in dev modePlace your Helium package file in local registry (ZEPPELIN_HOME/helium).Run Zeppelin. And then run zeppelin-web in visualization dev mode.cd zeppelin-webyarn run dev:heliumYou can browse localhost:9000. Everytime refresh your browser, Zeppelin will rebuild your visualization and reload changes.5. Publish your visualizationOnce it&amp;#39;s done, publish your visualization package using npm publish.That&amp;#39;s it. With in an hour, your visualization will be available in Zeppelin&amp;#39;s helium menu.",
       "url": " /development/writingzeppelinvisualization.html",
       "group": "development",
       "excerpt": "Apache Zeppelin Visualization is a pluggable package that can be loaded/unloaded on runtime through Helium framework in Zeppelin. A Visualization is a javascript npm package and user can use them just like any other built-in visualization in a note."
@@ -69,6 +69,17 @@
     
   
 
+    "/development/writingzeppelinvisualization_transformation.html": {
+      "title": "Transformations for Zeppelin Visualization",
+      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Transformations for Zeppelin VisualizationOverviewTransformations renders setting which allows users to set columns and transforms table rows according to the configured columns.Zeppelin provides 4 types of transformations.1. PassthroughTransformationPassthroughTransformation is the simple transformation which does not convert original tabledata at all.See passthrough.js2. ColumnselectorTransformationColumnselectorTransformation is
  uses when you need N axes but do not need aggregation. See columnselector.js3. PivotTransformationPivotTransformation provides group by and aggregation. Every chart using PivotTransformation has 3 axes. Keys, Groups and Values.See pivot.js4. AdvancedTransformationAdvancedTransformation has more detailed options while providing existing features of PivotTransformation and ColumnselectorTransformationmultiple sub chartsconfigurable chart axesparameter widgets: input, checkbox, option, textareaparsing parameters automatically based on their typesexpand / fold axis and parameter panelsmultiple transformation methods while supporting lazy converting re-initialize the whole configuration based on spec hash.SpecAdvancedTransformation requires spec which includes axis and parameter details for charts.Let&amp;#39;s create 2 sub-charts called line and no-group. Each sub chart can have different axis and parameter depending on their requirements.class AwesomeVisualization extends Visualizatio
 n {  constructor(targetEl, config) {    super(targetEl, config)    const spec = {      charts: {        &amp;#39;line&amp;#39;: {          transform: { method: &amp;#39;object&amp;#39;, },          sharedAxis: false, /** set if you want to share axes between sub charts, default is `false` */          axis: {            &amp;#39;xAxis&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;key&amp;#39;, description: &amp;#39;serial&amp;#39;, },            &amp;#39;yAxis&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;aggregator&amp;#39;, description: &amp;#39;serial&amp;#39;, },            &amp;#39;category&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;group&amp;#39;, description: &amp;#39;categorical&amp;#39;, },          },          parameter: {            &amp;#39;xAxisUnit&amp;#39;: { valueType: &amp;#39;string&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: &amp;#39;unit of xAxis&amp;#39;, },            &amp;#3
 9;yAxisUnit&amp;#39;: { valueType: &amp;#39;string&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: &amp;#39;unit of yAxis&amp;#39;, },            &amp;#39;lineWidth&amp;#39;: { valueType: &amp;#39;int&amp;#39;, defaultValue: 0, description: &amp;#39;width of line&amp;#39;, },          },        },        &amp;#39;no-group&amp;#39;: {          transform: { method: &amp;#39;object&amp;#39;, },          sharedAxis: false,          axis: {            &amp;#39;xAxis&amp;#39;: { dimension: &amp;#39;single&amp;#39;, axisType: &amp;#39;key&amp;#39;, },            &amp;#39;yAxis&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;value&amp;#39;, },          },          parameter: {            &amp;#39;xAxisUnit&amp;#39;: { valueType: &amp;#39;string&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: &amp;#39;unit of xAxis&amp;#39;, },            &amp;#39;yAxisUnit&amp;#39;: { valueType: &amp;#39;string&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: 
 &amp;#39;unit of yAxis&amp;#39;, },        },      },    }    this.transformation = new AdvancedTransformation(config, spec)  }  ...  // `render` will be called whenever `axis` or `parameter` is changed   render(data) {    const { chart, parameter, column, transformer, } = data    if (chart === &amp;#39;line&amp;#39;) {      const transformed = transformer()      // draw line chart     } else if (chart === &amp;#39;no-group&amp;#39;) {      const transformed = transformer()      // draw no-group chart     }  }}Spec: axisField NameAvailable Values (type)DescriptiondimensionsingleAxis can contains only 1 columndimensionmultipleAxis can contains multiple columnsaxisTypekeyColumn(s) in this axis will be used as key like in PivotTransformation. These columns will be served in column.keyaxisTypeaggregatorColumn(s) in this axis will be used as value like in PivotTransformation. These columns will be served in column.aggregatoraxisTypegroupColumn(s) in this axis will be used as group like i
 n PivotTransformation. These columns will be served in column.groupaxisType(string)Any string value can be used here. These columns will be served in column.custommaxAxisCount (optional)(int)The max number of columns that this axis can contain. (unlimited if undefined)minAxisCount (optional)(int)The min number of columns that this axis should contain to draw chart. (1 in case of single dimension)description (optional)(string)Description for the axis.Here is an example.axis: {  &amp;#39;xAxis&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;key&amp;#39;,  },  &amp;#39;yAxis&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;aggregator&amp;#39;},  &amp;#39;category&amp;#39;: { dimension: &amp;#39;multiple&amp;#39;, axisType: &amp;#39;group&amp;#39;, maxAxisCount: 2, valueType: &amp;#39;string&amp;#39;, },},Spec: sharedAxisIf you set sharedAxis: false for sub charts, then their axes are persisted in global space (shared). It&amp;#39;s useful for 
 when you creating multiple sub charts sharing their axes but have different parameters. For example, basic-column, stacked-column, percent-columnpie and donutHere is an example.    const spec = {      charts: {        &amp;#39;column&amp;#39;: {          transform: { method: &amp;#39;array&amp;#39;, },          sharedAxis: true,          axis: { ... },          parameter: { ... },        },        &amp;#39;stacked&amp;#39;: {          transform: { method: &amp;#39;array&amp;#39;, },          sharedAxis: true,          axis: { ... }          parameter: { ... },        },Spec: parameterField NameAvailable Values (type)DescriptionvalueTypestringParameter which has string valuevalueTypeintParameter which has int valuevalueTypefloatParameter which has float valuevalueTypebooleanParameter which has boolean value used with checkbox widget usuallyvalueTypeJSONParameter which has JSON value used with textarea widget usually. defaultValue should be &amp;quot;&amp;quot; (empty string). Thisdes
 cription(string)Description of this parameter. This value will be parsed as HTML for pretty outputwidgetinputUse input widget. This is the default widget (if widget is undefined)widgetcheckboxUse checkbox widget.widgettextareaUse textarea widget.widgetoptionUse select + option widget. This parameter should have optionValues field as well.optionValues(Array)Available option values used with the option widgetHere is an example.parameter: {  // string type, input widget  &amp;#39;xAxisUnit&amp;#39;: { valueType: &amp;#39;string&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: &amp;#39;unit of xAxis&amp;#39;, },  // boolean type, checkbox widget  &amp;#39;inverted&amp;#39;: { widget: &amp;#39;checkbox&amp;#39;, valueType: &amp;#39;boolean&amp;#39;, defaultValue: false, description: &amp;#39;invert x and y axes&amp;#39;, },  // string type, option widget with `optionValues`  &amp;#39;graphType&amp;#39;: { widget: &amp;#39;option&amp;#39;, valueType: &amp;#39;string&amp;#39;, defa
 ultValue: &amp;#39;line&amp;#39;, description: &amp;#39;graph type&amp;#39;, optionValues: [ &amp;#39;line&amp;#39;, &amp;#39;smoothedLine&amp;#39;, &amp;#39;step&amp;#39;, ], },  // HTML in `description`  &amp;#39;dateFormat&amp;#39;: { valueType: &amp;#39;string&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: &amp;#39;format of date (&amp;lt;a href=&amp;quot;https://docs.amcharts.com/3/javascriptcharts/AmGraph#dateFormat&amp;quot;&amp;gt;doc&amp;lt;/a&amp;gt;) (e.g YYYY-MM-DD)&amp;#39;, },  // JSON type, textarea widget  &amp;#39;yAxisGuides&amp;#39;: { widget: &amp;#39;textarea&amp;#39;, valueType: &amp;#39;JSON&amp;#39;, defaultValue: &amp;#39;&amp;#39;, description: &amp;#39;guides of yAxis &amp;#39;, },Spec: transformField NameAvailable Values (type)Descriptionmethodobjectdesigned for rows requiring object manipulationmethodarraydesigned for rows requiring array manipulationmethodarray:2-keydesigned for xyz charts (e.g bubble chart)methoddrill-downdesigned for drill-d
 own chartsmethodrawwill return the original tableData.rowsWhatever you specified as transform.method, the transformer value will be always function for lazy computation. // advanced-transformation.util#getTransformerif (transformSpec.method === &amp;#39;raw&amp;#39;) {  transformer = () =&amp;gt; { return rows; }} else if (transformSpec.method === &amp;#39;array&amp;#39;) {  transformer = () =&amp;gt; {    ...    return { ... }  }}Here is actual usage.class AwesomeVisualization extends Visualization {  constructor(...) { /** setup your spec */ }  ...   // `render` will be called whenever `axis` or `parameter` are changed  render(data) {    const { chart, parameter, column, transformer, } = data    if (chart === &amp;#39;line&amp;#39;) {      const transformed = transformer()      // draw line chart     } else if (chart === &amp;#39;no-group&amp;#39;) {      const transformed = transformer()      // draw no-group chart     }  }  ...}",
+      "url": " /development/writingzeppelinvisualization_transformation.html",
+      "group": "development",
+      "excerpt": "Description for Transformations"
+    }
+    ,
+    
+  
+
     "/displaysystem/back-end-angular.html": {
       "title": "Back-end Angular API in Apache Zeppelin",
       "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Back-end Angular API in Apache ZeppelinOverviewAngular display system treats output as a view template for AngularJS.It compiles templates and displays them inside of Apache Zeppelin. Zeppelin provides a gateway between your interpreter and your compiled AngularJS view templates.Therefore, you can not only update scope variables from your interpreter but also watch them in the interpreter, which is JVM process.Basic UsagePrint Angu
 larJS viewTo use angular display system, you should start with %angular.Since name is not defined, Hello will display Hello.Please Note: Display system is backend independent.Bind / Unbind VariablesThrough ZeppelinContext, you can bind / unbind variables to AngularJS view. Currently, it only works in Spark Interpreter ( scala ).// bind my &amp;#39;object&amp;#39; as angular scope variable &amp;#39;name&amp;#39; in current notebook.z.angularBind(String name, Object object)// bind my &amp;#39;object&amp;#39; as angular scope variable &amp;#39;name&amp;#39; in all notebooks related to current interpreter.z.angularBindGlobal(String name, Object object)// unbind angular scope variable &amp;#39;name&amp;#39; in current notebook.z.angularUnbind(String name)// unbind angular scope variable &amp;#39;name&amp;#39; in all notebooks related to current interpreter.z.angularUnbindGlobal(String name)Using the above example, let&amp;#39;s bind world variable to name. Then you can see AngularJs view
  is immediately updated.Watch / Unwatch VariablesThrough ZeppelinContext, you can watch / unwatch variables in AngularJs view. Currently, it only works in Spark Interpreter ( scala ).// register for angular scope variable &amp;#39;name&amp;#39; (notebook)z.angularWatch(String name, (before, after) =&amp;gt; { ... })// unregister watcher for angular variable &amp;#39;name&amp;#39; (notebook)z.angularUnwatch(String name)// register for angular scope variable &amp;#39;name&amp;#39; (global)z.angularWatchGlobal(String name, (before, after) =&amp;gt; { ... })// unregister watcher for angular variable &amp;#39;name&amp;#39; (global)z.angularUnwatchGlobal(String name)Let&amp;#39;s make a button. When it is clicked, the value of run will be increased 1 by 1.z.angularBind(&amp;quot;run&amp;quot;, 0) will initialize run to zero. And then, it will be also applied to run in z.angularWatch().When the button is clicked, you&amp;#39;ll see both run and numWatched are incremented by 1.Let&amp;#39;s
  make it Simpler and more IntuitiveIn this section, we will introduce a simpler and more intuitive way of using Angular Display System in Zeppelin.Here are some usages.Import// In notebook scopeimport org.apache.zeppelin.display.angular.notebookscope._import AngularElem._// In paragraph scopeimport org.apache.zeppelin.display.angular.paragraphscope._import AngularElem._Display Element// automatically convert to string and print with %angular display system directive in front.&amp;lt;div&amp;gt;&amp;lt;div&amp;gt;.displayEvent Handler// on click&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;.onClick(() =&amp;gt; {   my callback routine}).display// on change&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;.onChange(() =&amp;gt; {  my callback routine}).display// arbitrary event&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;.onEvent(&amp;quot;ng-click&amp;quot;, () =&amp;gt; {  my callback routine}).displayBind Model// bind model&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;.model(&amp;quot;myModel&amp;quot;).display/
 / bind model with initial value&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;.model(&amp;quot;myModel&amp;quot;, initialValue).displayInteract with Model// read modelAngularModel(&amp;quot;myModel&amp;quot;)()// update modelAngularModel(&amp;quot;myModel&amp;quot;, &amp;quot;newValue&amp;quot;)Example: Basic UsageUsing the above basic usages, you can apply them like below examples.Display Elements&amp;lt;div style=&amp;quot;color:blue&amp;quot;&amp;gt;  &amp;lt;h4&amp;gt;Hello Angular Display System&amp;lt;/h4&amp;gt;&amp;lt;/div&amp;gt;.displayOnClick Event&amp;lt;div class=&amp;quot;btn btn-success&amp;quot;&amp;gt;  Click me&amp;lt;/div&amp;gt;.onClick{() =&amp;gt;  // callback for button click}.displayBind Model  &amp;lt;div&amp;gt;{{{{myModel}}}}&amp;lt;/div&amp;gt;.model(&amp;quot;myModel&amp;quot;, &amp;quot;Initial Value&amp;quot;).displayInteract With Model// read the valueAngularModel(&amp;quot;myModel&amp;quot;)()// update the valueAngularModel(&amp;quot;myModel&amp;quot;, &amp;
 quot;New value&amp;quot;)Example: String ConverterUsing below example, you can convert the lowercase string to uppercase.// clear previously created angular object.AngularElem.disassociateval button = &amp;lt;div class=&amp;quot;btn btn-success btn-sm&amp;quot;&amp;gt;Convert&amp;lt;/div&amp;gt;.onClick{() =&amp;gt;  val inputString = AngularModel(&amp;quot;input&amp;quot;)().toString  AngularModel(&amp;quot;title&amp;quot;, inputString.toUpperCase)}&amp;lt;div&amp;gt;  { &amp;lt;h4&amp;gt; {{{{title}}}}&amp;lt;/h4&amp;gt;.model(&amp;quot;title&amp;quot;, &amp;quot;Please type text to convert uppercase&amp;quot;) }   Your text { &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;.model(&amp;quot;input&amp;quot;, &amp;quot;&amp;quot;) }  {button}&amp;lt;/div&amp;gt;.display",
@@ -105,7 +116,7 @@
 
     "/install/build.html": {
       "title": "Build from Source",
-      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Building from SourceIf you want to build from source, you must first install the following dependencies:      Name    Value        Git    (Any Version)        Maven    3.1.x or higher        JDK    1.7  If you haven&amp;#39;t installed Git and Maven yet, check the Build requirements section and follow the step by step instructions from there.1. Clone the Apache Zeppelin repositorygit clone https://github.com/apache/zeppelin.git2. B
 uild sourceYou can build Zeppelin with following maven command:mvn clean package -DskipTests [Options]If you&amp;#39;re unsure about the options, use the same commands that creates official binary package.# update all pom.xml to use scala 2.11./dev/change_scala_version.sh 2.11# build zeppelin with all interpreters and include latest version of Apache spark support for local mode.mvn clean package -DskipTests -Pspark-2.0 -Phadoop-2.4 -Pyarn -Ppyspark -Psparkr -Pr -Pscala-2.113. DoneYou can directly start Zeppelin by running after successful build:./bin/zeppelin-daemon.sh startCheck build-profiles section for further build options.If you are behind proxy, follow instructions in Proxy setting section.If you&amp;#39;re interested in contribution, please check Contributing to Apache Zeppelin (Code) and Contributing to Apache Zeppelin (Website).Build profilesSpark InterpreterTo build with a specific Spark version, Hadoop version or specific features, define one or more of the following pr
 ofiles and options:-Pspark-[version]Set spark major versionAvailable profiles are-Pspark-2.1-Pspark-2.0-Pspark-1.6-Pspark-1.5-Pspark-1.4-Pcassandra-spark-1.5-Pcassandra-spark-1.4-Pcassandra-spark-1.3-Pcassandra-spark-1.2-Pcassandra-spark-1.1minor version can be adjusted by -Dspark.version=x.x.x-Phadoop-[version]set hadoop major versionAvailable profiles are-Phadoop-0.23-Phadoop-1-Phadoop-2.2-Phadoop-2.3-Phadoop-2.4-Phadoop-2.6-Phadoop-2.7minor version can be adjusted by -Dhadoop.version=x.x.x-Pscala-[version] (optional)set scala version (default 2.10)Available profiles are-Pscala-2.10-Pscala-2.11-Pyarn (optional)enable YARN support for local modeYARN for local mode is not supported for Spark v1.5.0 or higher. Set SPARK_HOME instead.-Ppyspark (optional)enable PySpark support for local mode.-Pr (optional)enable R support with SparkR integration.-Psparkr (optional)another R support with SparkR integration as well as local mode support.-Pvendor-repo (optional)enable 3rd party vendor rep
 ository (cloudera)-Pmapr[version] (optional)For the MapR Hadoop Distribution, these profiles will handle the Hadoop version. As MapR allows different versions of Spark to be installed, you should specify which version of Spark is installed on the cluster by adding a Spark profile (-Pspark-1.6, -Pspark-2.0, etc.) as needed.The correct Maven artifacts can be found for every version of MapR at http://doc.mapr.comAvailable profiles are-Pmapr3-Pmapr40-Pmapr41-Pmapr50-Pmapr51-Pexamples (optional)Bulid examples under zeppelin-examples directoryBuild command examplesHere are some examples with several options:# build with spark-2.1, scala-2.11./dev/change_scala_version.sh 2.11mvn clean package -Pspark-2.1 -Phadoop-2.4 -Pyarn -Ppyspark -Psparkr -Pscala-2.11 -DskipTests# build with spark-2.0, scala-2.11./dev/change_scala_version.sh 2.11mvn clean package -Pspark-2.0 -Phadoop-2.4 -Pyarn -Ppyspark -Psparkr -Pscala-2.11 -DskipTests# build with spark-1.6, scala-2.10mvn clean package -Pspark-1.6 -P
 hadoop-2.4 -Pyarn -Ppyspark -Psparkr -DskipTests# spark-cassandra integrationmvn clean package -Pcassandra-spark-1.5 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests -DskipTests# with CDHmvn clean package -Pspark-1.5 -Dhadoop.version=2.6.0-cdh5.5.0 -Phadoop-2.6 -Pvendor-repo -DskipTests# with MapRmvn clean package -Pspark-1.5 -Pmapr50 -DskipTestsIgnite Interpretermvn clean package -Dignite.version=1.9.0 -DskipTestsScalding Interpretermvn clean package -Pscalding -DskipTestsBuild requirementsInstall requirementsIf you don&amp;#39;t have requirements prepared, install it.(The installation method may vary according to your environment, example is for Ubuntu.)sudo apt-get updatesudo apt-get install gitsudo apt-get install openjdk-7-jdksudo apt-get install npmsudo apt-get install libfontconfigInstall mavenwget http://www.eu.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gzsudo tar -zxf apache-maven-3.3.9-bin.tar.gz -C /usr/local/sudo ln -s /usr/local/apache-maven-
 3.3.9/bin/mvn /usr/local/bin/mvnNotes: - Ensure node is installed by running node --version - Ensure maven is running version 3.1.x or higher with mvn -version - Configure maven to use more memory than usual by export MAVEN_OPTS=&amp;quot;-Xmx2g -XX:MaxPermSize=1024m&amp;quot;Proxy setting (optional)If you&amp;#39;re behind the proxy, you&amp;#39;ll need to configure maven and npm to pass through it.First of all, configure maven in your ~/.m2/settings.xml.&amp;lt;settings&amp;gt;  &amp;lt;proxies&amp;gt;    &amp;lt;proxy&amp;gt;      &amp;lt;id&amp;gt;proxy-http&amp;lt;/id&amp;gt;      &amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;      &amp;lt;protocol&amp;gt;http&amp;lt;/protocol&amp;gt;      &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;      &amp;lt;port&amp;gt;3128&amp;lt;/port&amp;gt;      &amp;lt;!-- &amp;lt;username&amp;gt;usr&amp;lt;/username&amp;gt;      &amp;lt;password&amp;gt;pwd&amp;lt;/password&amp;gt; --&amp;gt;      &amp;lt;nonProxyHosts&amp;gt;localhost|127.0
 .0.1&amp;lt;/nonProxyHosts&amp;gt;    &amp;lt;/proxy&amp;gt;    &amp;lt;proxy&amp;gt;      &amp;lt;id&amp;gt;proxy-https&amp;lt;/id&amp;gt;      &amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;      &amp;lt;protocol&amp;gt;https&amp;lt;/protocol&amp;gt;      &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;      &amp;lt;port&amp;gt;3128&amp;lt;/port&amp;gt;      &amp;lt;!-- &amp;lt;username&amp;gt;usr&amp;lt;/username&amp;gt;      &amp;lt;password&amp;gt;pwd&amp;lt;/password&amp;gt; --&amp;gt;      &amp;lt;nonProxyHosts&amp;gt;localhost|127.0.0.1&amp;lt;/nonProxyHosts&amp;gt;    &amp;lt;/proxy&amp;gt;  &amp;lt;/proxies&amp;gt;&amp;lt;/settings&amp;gt;Then, next commands will configure npm.npm config set proxy http://localhost:3128npm config set https-proxy http://localhost:3128npm config set registry &amp;quot;http://registry.npmjs.org/&amp;quot;npm config set strict-ssl falseConfigure git as wellgit config --global http.proxy http://localhost:3128git config --global https.proxy h
 ttp://localhost:3128git config --global url.&amp;quot;http://&amp;quot;.insteadOf git://To clean up, set active false in Maven settings.xml and run these commands.npm config rm proxynpm config rm https-proxygit config --global --unset http.proxygit config --global --unset https.proxygit config --global --unset url.&amp;quot;http://&amp;quot;.insteadOfNotes: - If you are behind NTLM proxy you can use Cntlm Authentication Proxy. - Replace localhost:3128 with the standard pattern http://user:pwd@host:port.PackageTo package the final distribution including the compressed archive, run:mvn clean package -Pbuild-distrTo build a distribution with specific profiles, run:mvn clean package -Pbuild-distr -Pspark-1.5 -Phadoop-2.4 -Pyarn -PpysparkThe profiles -Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark can be adjusted if you wish to build to a specific spark versions, or omit support such as yarn.  The archive is generated under zeppelin-distribution/target directoryRun end-to-end testsZeppelin com
 es with a set of end-to-end acceptance tests driving headless selenium browser# assumes zeppelin-server running on localhost:8080 (use -Durl=.. to override)mvn verify# or take care of starting/stoping zeppelin-server from packaged zeppelin-distribuion/targetmvn verify -P using-packaged-distr",
+      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Building from SourceIf you want to build from source, you must first install the following dependencies:      Name    Value        Git    (Any Version)        Maven    3.1.x or higher        JDK    1.7  If you haven&amp;#39;t installed Git and Maven yet, check the Build requirements section and follow the step by step instructions from there.1. Clone the Apache Zeppelin repositorygit clone https://github.com/apache/zeppelin.git2. B
 uild sourceYou can build Zeppelin with following maven command:mvn clean package -DskipTests [Options]If you&amp;#39;re unsure about the options, use the same commands that creates official binary package.# update all pom.xml to use scala 2.11./dev/change_scala_version.sh 2.11# build zeppelin with all interpreters and include latest version of Apache spark support for local mode.mvn clean package -DskipTests -Pspark-2.0 -Phadoop-2.4 -Pr -Pscala-2.113. DoneYou can directly start Zeppelin by running after successful build:./bin/zeppelin-daemon.sh startCheck build-profiles section for further build options.If you are behind proxy, follow instructions in Proxy setting section.If you&amp;#39;re interested in contribution, please check Contributing to Apache Zeppelin (Code) and Contributing to Apache Zeppelin (Website).Build profilesSpark InterpreterTo build with a specific Spark version, Hadoop version or specific features, define one or more of the following profiles and options:-Pspark
 -[version]Set spark major versionAvailable profiles are-Pspark-2.1-Pspark-2.0-Pspark-1.6-Pspark-1.5-Pspark-1.4-Pcassandra-spark-1.5-Pcassandra-spark-1.4-Pcassandra-spark-1.3-Pcassandra-spark-1.2-Pcassandra-spark-1.1minor version can be adjusted by -Dspark.version=x.x.x-Phadoop-[version]set hadoop major versionAvailable profiles are-Phadoop-0.23-Phadoop-1-Phadoop-2.2-Phadoop-2.3-Phadoop-2.4-Phadoop-2.6-Phadoop-2.7minor version can be adjusted by -Dhadoop.version=x.x.x-Pscala-[version] (optional)set scala version (default 2.10)Available profiles are-Pscala-2.10-Pscala-2.11-Pr (optional)enable R support with SparkR integration.-Pvendor-repo (optional)enable 3rd party vendor repository (cloudera)-Pmapr[version] (optional)For the MapR Hadoop Distribution, these profiles will handle the Hadoop version. As MapR allows different versions of Spark to be installed, you should specify which version of Spark is installed on the cluster by adding a Spark profile (-Pspark-1.6, -Pspark-2.0, etc.) 
 as needed.The correct Maven artifacts can be found for every version of MapR at http://doc.mapr.comAvailable profiles are-Pmapr3-Pmapr40-Pmapr41-Pmapr50-Pmapr51-Pexamples (optional)Bulid examples under zeppelin-examples directoryBuild command examplesHere are some examples with several options:# build with spark-2.1, scala-2.11./dev/change_scala_version.sh 2.11mvn clean package -Pspark-2.1 -Phadoop-2.4 -Pscala-2.11 -DskipTests# build with spark-2.0, scala-2.11./dev/change_scala_version.sh 2.11mvn clean package -Pspark-2.0 -Phadoop-2.4 -Pscala-2.11 -DskipTests# build with spark-1.6, scala-2.10mvn clean package -Pspark-1.6 -Phadoop-2.4 -DskipTests# spark-cassandra integrationmvn clean package -Pcassandra-spark-1.5 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests -DskipTests# with CDHmvn clean package -Pspark-1.5 -Dhadoop.version=2.6.0-cdh5.5.0 -Phadoop-2.6 -Pvendor-repo -DskipTests# with MapRmvn clean package -Pspark-1.5 -Pmapr50 -DskipTestsIgnite Interpretermvn clean package -Dignite.
 version=1.9.0 -DskipTestsScalding Interpretermvn clean package -Pscalding -DskipTestsBuild requirementsInstall requirementsIf you don&amp;#39;t have requirements prepared, install it.(The installation method may vary according to your environment, example is for Ubuntu.)sudo apt-get updatesudo apt-get install gitsudo apt-get install openjdk-7-jdksudo apt-get install npmsudo apt-get install libfontconfigInstall mavenwget http://www.eu.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gzsudo tar -zxf apache-maven-3.3.9-bin.tar.gz -C /usr/local/sudo ln -s /usr/local/apache-maven-3.3.9/bin/mvn /usr/local/bin/mvnNotes: - Ensure node is installed by running node --version - Ensure maven is running version 3.1.x or higher with mvn -version - Configure maven to use more memory than usual by export MAVEN_OPTS=&amp;quot;-Xmx2g -XX:MaxPermSize=1024m&amp;quot;Proxy setting (optional)If you&amp;#39;re behind the proxy, you&amp;#39;ll need to configure maven and npm to pass 
 through it.First of all, configure maven in your ~/.m2/settings.xml.&amp;lt;settings&amp;gt;  &amp;lt;proxies&amp;gt;    &amp;lt;proxy&amp;gt;      &amp;lt;id&amp;gt;proxy-http&amp;lt;/id&amp;gt;      &amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;      &amp;lt;protocol&amp;gt;http&amp;lt;/protocol&amp;gt;      &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;      &amp;lt;port&amp;gt;3128&amp;lt;/port&amp;gt;      &amp;lt;!-- &amp;lt;username&amp;gt;usr&amp;lt;/username&amp;gt;      &amp;lt;password&amp;gt;pwd&amp;lt;/password&amp;gt; --&amp;gt;      &amp;lt;nonProxyHosts&amp;gt;localhost|127.0.0.1&amp;lt;/nonProxyHosts&amp;gt;    &amp;lt;/proxy&amp;gt;    &amp;lt;proxy&amp;gt;      &amp;lt;id&amp;gt;proxy-https&amp;lt;/id&amp;gt;      &amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;      &amp;lt;protocol&amp;gt;https&amp;lt;/protocol&amp;gt;      &amp;lt;host&amp;gt;localhost&amp;lt;/host&amp;gt;      &amp;lt;port&amp;gt;3128&amp;lt;/port&amp;gt;      &amp;lt;!-- &amp;lt;usern
 ame&amp;gt;usr&amp;lt;/username&amp;gt;      &amp;lt;password&amp;gt;pwd&amp;lt;/password&amp;gt; --&amp;gt;      &amp;lt;nonProxyHosts&amp;gt;localhost|127.0.0.1&amp;lt;/nonProxyHosts&amp;gt;    &amp;lt;/proxy&amp;gt;  &amp;lt;/proxies&amp;gt;&amp;lt;/settings&amp;gt;Then, next commands will configure npm.npm config set proxy http://localhost:3128npm config set https-proxy http://localhost:3128npm config set registry &amp;quot;http://registry.npmjs.org/&amp;quot;npm config set strict-ssl falseConfigure git as wellgit config --global http.proxy http://localhost:3128git config --global https.proxy http://localhost:3128git config --global url.&amp;quot;http://&amp;quot;.insteadOf git://To clean up, set active false in Maven settings.xml and run these commands.npm config rm proxynpm config rm https-proxygit config --global --unset http.proxygit config --global --unset https.proxygit config --global --unset url.&amp;quot;http://&amp;quot;.insteadOfNotes: - If you are behind NTLM proxy y
 ou can use Cntlm Authentication Proxy. - Replace localhost:3128 with the standard pattern http://user:pwd@host:port.PackageTo package the final distribution including the compressed archive, run:mvn clean package -Pbuild-distrTo build a distribution with specific profiles, run:mvn clean package -Pbuild-distr -Pspark-1.5 -Phadoop-2.4The profiles -Pspark-1.5 -Phadoop-2.4 can be adjusted if you wish to build to a specific spark versions.  The archive is generated under zeppelin-distribution/target directoryRun end-to-end testsZeppelin comes with a set of end-to-end acceptance tests driving headless selenium browser# assumes zeppelin-server running on localhost:8080 (use -Durl=.. to override)mvn verify# or take care of starting/stoping zeppelin-server from packaged zeppelin-distribuion/targetmvn verify -P using-packaged-distr",
       "url": " /install/build.html",
       "group": "install",
       "excerpt": "How to build Zeppelin from source"
@@ -171,7 +182,7 @@
 
     "/install/upgrade.html": {
       "title": "Manual Zeppelin version upgrade procedure",
-      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Manual upgrade procedure for ZeppelinBasically, newer version of Zeppelin works with previous version notebook directory and configurations.So, copying notebook and conf directory should be enough.InstructionsStop Zeppelinbin/zeppelin-daemon.sh stopCopy your notebook and conf directory into a backup directoryDownload newer version of Zeppelin and Install. See Install page.Copy backup notebook and conf directory into newer version o
 f Zeppelin notebook and conf directoryStart Zeppelinbin/zeppelin-daemon.sh startMigration GuideUpgrading from Zeppelin 0.6 to 0.7From 0.7, we don&amp;#39;t use ZEPPELIN_JAVA_OPTS as default value of ZEPPELIN_INTP_JAVA_OPTS and also the same for ZEPPELIN_MEM/ZEPPELIN_INTP_MEM. If user want to configure the jvm opts of interpreter process, please set ZEPPELIN_INTP_JAVA_OPTS and ZEPPELIN_INTP_MEM explicitly. If you don&amp;#39;t set ZEPPELIN_INTP_MEM, Zeppelin will set it to -Xms1024m -Xmx1024m -XX:MaxPermSize=512m by default.Mapping from %jdbc(prefix) to %prefix is no longer available. Instead, you can use %[interpreter alias] with multiple interpreter setttings on GUI.Usage of ZEPPELIN_PORT is not supported in ssl mode. Instead use ZEPPELIN_SSL_PORT to configure the ssl port. Value from ZEPPELIN_PORT is used only when ZEPPELIN_SSL is set to false.The support on Spark 1.1.x to 1.3.x is deprecated.From 0.7, we uses pegdown as the markdown.parser.type option for the %md interpreter. Ren
 dered markdown might be different from what you expectedFrom 0.7 note.json format has been changed to support multiple outputs in a paragraph. Zeppelin will automatically convert old format to new format. 0.6 or lower version can read new note.json format but output will not be displayed. For the detail, see ZEPPELIN-212 and pull request.From 0.7 note storage layer will utilize GitNotebookRepo by default instead of VFSNotebookRepo storage layer, which is an extension of latter one with versioning capabilities on top of it.Upgrading from Zeppelin 0.7 to 0.8From 0.8, we recommend to use PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON instead of zeppelin.pyspark.python as zeppelin.pyspark.python only effects driver. You can use PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON as using them in spark.",
+      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Manual upgrade procedure for ZeppelinBasically, newer version of Zeppelin works with previous version notebook directory and configurations.So, copying notebook and conf directory should be enough.InstructionsStop Zeppelinbin/zeppelin-daemon.sh stopCopy your notebook and conf directory into a backup directoryDownload newer version of Zeppelin and Install. See Install page.Copy backup notebook and conf directory into newer version o
 f Zeppelin notebook and conf directoryStart Zeppelinbin/zeppelin-daemon.sh startMigration GuideUpgrading from Zeppelin 0.6 to 0.7From 0.7, we don&amp;#39;t use ZEPPELIN_JAVA_OPTS as default value of ZEPPELIN_INTP_JAVA_OPTS and also the same for ZEPPELIN_MEM/ZEPPELIN_INTP_MEM. If user want to configure the jvm opts of interpreter process, please set ZEPPELIN_INTP_JAVA_OPTS and ZEPPELIN_INTP_MEM explicitly. If you don&amp;#39;t set ZEPPELIN_INTP_MEM, Zeppelin will set it to -Xms1024m -Xmx1024m -XX:MaxPermSize=512m by default.Mapping from %jdbc(prefix) to %prefix is no longer available. Instead, you can use %[interpreter alias] with multiple interpreter setttings on GUI.Usage of ZEPPELIN_PORT is not supported in ssl mode. Instead use ZEPPELIN_SSL_PORT to configure the ssl port. Value from ZEPPELIN_PORT is used only when ZEPPELIN_SSL is set to false.The support on Spark 1.1.x to 1.3.x is deprecated.From 0.7, we uses pegdown as the markdown.parser.type option for the %md interpreter. Ren
 dered markdown might be different from what you expectedFrom 0.7 note.json format has been changed to support multiple outputs in a paragraph. Zeppelin will automatically convert old format to new format. 0.6 or lower version can read new note.json format but output will not be displayed. For the detail, see ZEPPELIN-212 and pull request.From 0.7 note storage layer will utilize GitNotebookRepo by default instead of VFSNotebookRepo storage layer, which is an extension of latter one with versioning capabilities on top of it.Upgrading from Zeppelin 0.7 to 0.8From 0.8, we recommend to use PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON instead of zeppelin.pyspark.python as zeppelin.pyspark.python only effects driver. You can use PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON as using them in spark.From 0.8, depending on your device, the keyboard shortcut Ctrl-L or Command-L which goes to the line somewhere user wants is not supported. ",
       "url": " /install/upgrade.html",
       "group": "install",
       "excerpt": "This document will guide you through a procedure of manual upgrade your Apache Zeppelin instance to a newer version. Apache Zeppelin keeps backward compatibility for the notebook file format."
@@ -182,7 +193,7 @@
 
     "/install/virtual_machine.html": {
       "title": "Apache Zeppelin on Vagrant Virtual Machine",
-      "content"  : "&lt;!--Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an &quot;AS IS&quot; BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--&gt;Apache Zeppelin on Vagrant Virtual MachineOverviewApache Zeppelin distribution includes a script directoryscripts/vagrant/zeppelin-devThis script creates a virtual machine that launches a repeatable, known set of core dependencies required for developing Zeppelin. It can also be used to run an existing Zeppelin build if you don&amp;#39;t plan to build from source.For PySpark users, this script includes several helpful Python Librar
 ies.For SparkR users, this script includes several helpful R Libraries.PrerequisitesThis script requires three applications, Ansible, Vagrant and Virtual Box.  All of these applications are freely available as Open Source projects and extremely easy to set up on most operating systems.Create a Zeppelin Ready VMIf you are running Windows and don&amp;#39;t yet have python installed, install Python 2.7.x first.Download and Install Vagrant:  Vagrant DownloadsInstall Ansible:  Ansible Python pip installsudo easy_install pipsudo pip install ansibleansible --versionAfter then, please check whether it reports ansible version 1.9.2 or higher.Install Virtual Box: Virtual Box DownloadsType vagrant up  from within the /scripts/vagrant/zeppelin-dev directoryThats it ! You can now run vagrant ssh and this will place you into the guest machines terminal prompt.If you don&amp;#39;t wish to build Zeppelin from scratch, run the z-manager installer script while running in the guest VM:curl -fsSL https
 ://raw.githubusercontent.com/NFLabs/z-manager/master/zeppelin-installer.sh | bashBuilding ZeppelinYou can now git clone git://git.apache.org/zeppelin.gitinto a directory on your host machine, or directly in your virtual machine.Cloning Zeppelin into the /scripts/vagrant/zeppelin-dev directory from the host, will allow the directory to be shared between your host and the guest machine.Cloning the project again may seem counter intuitive, since this script likely originated from the project repository.  Consider copying just the vagrant/zeppelin-dev script from the Zeppelin project as a stand alone directory, then once again clone the specific branch you wish to build.Synced folders enable Vagrant to sync a folder on the host machine to the guest machine, allowing you to continue working on your project&amp;#39;s files on your host machine, but use the resources in the guest machine to compile or run your project. (1) Synced Folder Description from Vagrant UpBy default, Vagrant will s
 hare your project directory (the directory with the Vagrantfile) to /vagrant.  Which means you should be able to build within the guest machine after youcd /vagrant/zeppelinWhat&amp;#39;s in this VM?Running the following commands in the guest machine should display these expected versions:node --version should report v0.12.7mvn --version should report Apache Maven 3.3.9 and Java version: 1.7.0_85The virtual machine consists of:Ubuntu Server 14.04 LTSNode.js 0.12.7npm 2.11.3ruby 1.9.3 + rake, make and bundler (only required if building jekyll documentation)Maven 3.3.9GitUnziplibfontconfig to avoid phatomJs missing dependency issuesopenjdk-7-jdkPython addons: pip, matplotlib, scipy, numpy, pandasR and R Packages required to run the R Interpreter and the related R tutorial notebook, including:  Knitr, devtools, repr, rCharts, ggplot2, googleVis, mplot, htmltools, base64enc, data.tableHow to build &amp;amp; run ZeppelinThis assumes you&amp;#39;ve already cloned the project either on the
  host machine in the zeppelin-dev directory (to be shared with the guest machine) or cloned directly into a directory while running inside the guest machine.  The following build steps will also include Python and R support via PySpark and SparkR:cd /zeppelinmvn clean package -Pspark-1.6 -Ppyspark -Phadoop-2.4 -Psparkr -DskipTests./bin/zeppelin-daemon.sh startOn your host machine browse to http://localhost:8080/If you turned off port forwarding in the Vagrantfile browse to http://192.168.51.52:8080Tweaking the Virtual MachineIf you plan to run this virtual machine along side other Vagrant images, you may wish to bind the virtual machine to a specific IP address, and not use port fowarding from your local host.Comment out the forward_port line, and uncomment the private_network line in Vagrantfile.  The subnet that works best for your local network will vary so adjust 192.168.*.* accordingly.#config.vm.network &amp;quot;forwarded_port&amp;quot;, guest: 8080, host: 8080config.vm.netwo
 rk &amp;quot;private_network&amp;quot;, ip: &amp;quot;192.168.51.52&amp;quot;vagrant halt followed by vagrant up will restart the guest machine bound to the IP address of 192.168.51.52.This approach usually is typically required if running other virtual machines that discover each other directly by IP address, such as Spark Masters and Slaves as well as Cassandra Nodes, Elasticsearch Nodes, and other Spark data sources.  You may wish to launch nodes in virtual machines with IP addresses in a subnet that works for your local network, such as: 192.168.51.53, 192.168.51.54, 192.168.51.53, etc..ExtrasPython ExtrasWith Zeppelin running, Numpy, SciPy, Pandas and Matplotlib will be available.  Create a pyspark notebook, and try the below code.%pysparkimport numpyimport scipyimport pandasimport matplotlibprint &amp;quot;numpy &amp;quot; + numpy.__version__print &amp;quot;scipy &amp;quot; + scipy.__version__print &amp;quot;pandas &amp;quot; + pandas.__version__print &amp;quot;matplotlib &amp
 ;quot; + matplotlib.__version__To Test plotting using Matplotlib into a rendered %html SVG image, try%pysparkimport matplotlibmatplotlib.use(&amp;#39;Agg&amp;#39;)   # turn off interactive charting so this works for server side SVG renderingimport matplotlib.pyplot as pltimport numpy as npimport StringIO# clear out any previous plots on this noteplt.clf()def show(p):    img = StringIO.StringIO()    p.savefig(img, format=&amp;#39;svg&amp;#39;)    img.seek(0)    print &amp;quot;%html &amp;lt;div style=&amp;#39;width:600px&amp;#39;&amp;gt;&amp;quot; + img.buf + &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;# Example datapeople = (&amp;#39;Tom&amp;#39;, &amp;#39;Dick&amp;#39;, &amp;#39;Harry&amp;#39;, &amp;#39;Slim&amp;#39;, &amp;#39;Jim&amp;#39;)y_pos = np.arange(len(people))performance = 3 + 10 * np.random.rand(len(people))error = np.random.rand(len(people))plt.barh(y_pos, performance, xerr=error, align=&amp;#39;center&amp;#39;, alpha=0.4)plt.yticks(y_pos, people)plt.xlabel(&amp;#39;Perform
 ance&amp;#39;)plt.title(&amp;#39;How fast do you want to go today?&amp;#39;)show(plt)R ExtrasWith zeppelin running, an R Tutorial notebook will be available.  The R packages required to run the examples and graphs in this tutorial notebook were installed by this virtual machine.The installed R Packages include: Knitr, devtools, repr, rCharts, ggplot2, googleVis, mplot, htmltools, base64enc, data.table",

[... 23 lines stripped ...]
Modified: zeppelin/site/docs/0.8.0-SNAPSHOT/security/authentication.html
URL: http://svn.apache.org/viewvc/zeppelin/site/docs/0.8.0-SNAPSHOT/security/authentication.html?rev=1791664&r1=1791663&r2=1791664&view=diff
==============================================================================
--- zeppelin/site/docs/0.8.0-SNAPSHOT/security/authentication.html (original)
+++ zeppelin/site/docs/0.8.0-SNAPSHOT/security/authentication.html Mon Apr 17 07:01:48 2017
@@ -164,10 +164,11 @@
                 <li><a href="/docs/0.8.0-SNAPSHOT/security/notebook_authorization.html">Notebook Authorization</a></li>
                 <li><a href="/docs/0.8.0-SNAPSHOT/security/datasource_authorization.html">Data Source Authorization</a></li>
                 <li role="separator" class="divider"></li>
-                <li class="title"><span><b>Helium Framework</b><span></li>
-                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinapplication.html">Writing Zeppelin Application (Experimental)</a></li>
-                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinspell.html">Writing Zeppelin Spell (Experimental)</a></li>
-                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinvisualization.html">Writing Zeppelin Visualization (Experimental)</a></li>
+                <li class="title"><span><b>Helium Framework (Experimental)</b></span></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinapplication.html">Writing Zeppelin Application</a></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinspell.html">Writing Zeppelin Spell</a></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinvisualization.html">Writing Zeppelin Visualization: Basics</a></li>
+                <li><a href="/docs/0.8.0-SNAPSHOT/development/writingzeppelinvisualization_transformation.html">Writing Zeppelin Visualization: Transformation</a></li>
                 <li role="separator" class="divider"></li>
                 <li class="title"><span><b>Advanced</b><span></li>
                 <li><a href="/docs/0.8.0-SNAPSHOT/install/virtual_machine.html">Zeppelin on Vagrant VM</a></li>