<li>Ingest data into Wendelin using Fluentd. (open source data collector used to ingest data to Wendelin) <ahref="https://www.fluentd.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Fluentd Website</a>.</li>
<li>Manipulate data in Wendelin using Jupyter Notebook. <ahref="https://jupyter.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Jupyter Website</a>.</li>
<li>Present data in Wendelin on a web site using Renderjs and jIO javascript libraries.</li>
</ul>
</li>
</ul>
</section>
<section>
<h1>1. Getting Wendelin on your KVM</h1>
</section>
<sectionclass="screenshot">
<h1>Request a KVM</h1>
<ul>
<li>For this tutorial, you will use services provided by vifib.com.</li>
<li>On Vifib request a KVM:</li>
<li>Go to services.</li>
<li>Click on Add button.</li>
<li>Choose KVM software and the latest version</li>
</ul>
<detailsopen="open">
<ul>
<li>More info: <ahref="http://slapos.nexedi.com/slapos-HowTo.Instantiate.Kvm"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">How to instantiate a KVM</a>.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Request a KVM</h1>
<ul>
<li>Choose a name for your KVM and enter parameters:
<ul>
<li>4 GB of RAM</li>
<li>at least 25 GB of disk space.</li>
<li>list of NAT rules: 22, 80, 433, 20000, 20001, 20002, 20003 (Ports from 20000 to 20003 will be used for Wendelin services.)</li>
</ul>
</li>
<li>Click Proceed.</li>
</ul>
<detailsopen="open">
<ul>
<li>More info: <ahref="http://slapos.nexedi.com/slapos-HowTo.Instantiate.Kvm"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">How to instantiate a KVM</a>.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Request a KVM</h1>
<ul>
<li>Wait for monitoring status to turn green and connection parameters to appear.</li>
<li>Click on url parameter and install debian.</li>
<li>From software to install choose only SSH server!</li>
</ul>
<detailsopen="open">
<ul>
<li>More info: <ahref="http://slapos.nexedi.com/slapos-HowTo.Instantiate.Kvm"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">How to instantiate a KVM</a>.</li>
</ul>
</details>
</section>
<section>
<h1>Access your KVM from terminal</h1>
<ul>
<li>Under connection parameters of your KVM look for IPv6.</li>
<li>Go to terminal. (Can be anywhere, you just need IPv6 access.)</li>
<li>From terminal access your KVM on port 10022 via ssh:</li>
<li>This is one line code used to install Wendelin.</li>
</ul>
</section>
<section>
<h1>Monitor Installaton process</h1>
<ul>
<li>First time, you run the installer, you will probably get an error with a message: "Your software is still building, be patient it can take a while." Do not panic. This is expected. Installation is now running.</li>
<li>You can check that installation is going ok by following SlapOS software installation log:</li>
<li>This will activate urls provided to access Jupyter/ERP5.</li>
<li>Check if socat works: ps aux | grep socat</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Request frontend</h1>
<ul>
<li>Same way like you requested KVM, now request Frontend on Vifib with parameters Backend URL: http://[!YOUR_IPv6!]:30001 and Backend Type: Zope.</li>
<li>Wait for connection parameters to appear and click on the URL parameter</li>
</ul>
</section>
<section>
<h1>Login</h1>
<ul>
<li>Click on Zope management interface</li>
<li>Login using username and password</li>
<li>go to: http://softinstxxxx.host.vifib.net/erp5</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Configure Site</h1>
<ul>
<li>Go to: My Favorites ><strong>Configure your Site</strong> .</li>
</ul>
<detailsopen="open">
<ul>
<li>Your ERP5 instance is now ready, but it has only very generic core library. This core can be specialized through different business templates for different purposes.</li>
<li>This can be done manually, installing individual business templates that provide your ERP5 instance with utilities that you need.</li>
<li>That can be done in My Favorites ><strong>Manage Business Templates</strong></li>
<li>But Wendelin uses a lot of different business templates and that would be a lot of work, so configurator is provided that makes that work for you and installs just the business templates that are important for Wendelin.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Install Configuration</h1>
<ul>
<li>Select Wendelin Configuration.</li>
</ul>
<detailsopen="open">
<ul>
<li>IF there is no Wendelin Configurator, you have to install it:
<ul>
<li>Go to My Favourites ><strong>Manage Business Templates</strong> .</li>
<li>Click on Import/Export button (blue and red arrows).</li>
<li>Select Exchange ><strong>Install Business Templates from Repositories</strong> .</li>
<li>Check box before erp5_wendelin_configurator business template and click Install Business Templates from Repositories.</li>
</ul>
</li>
<li>Configuration will take some minutes.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Install Configuration</h1>
<ul>
<li>On next screen make sure that the boxes <strong>set wendelin tutorial</strong> and <strong>set up Data Notebook module for Jupyter integration</strong> are checked.</li>
<li>Click <strong>Set of data Notebook module</strong> and on the next screen <strong>Install</strong> .</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Wait</h1>
<ul>
<li>Installation may take a few minutes</li>
<li>Once down, click "Start using your ERP5 System"</li>
<li>Login again.</li>
</ul>
</section>
<section>
<h1>Main Interface</h1>
<ul>
<li>Your instance is now ready to use</li>
</ul>
<detailsopen="true">
<ul>
<li>The start screen shows a list of modules (data-types) directly accessible.</li>
<li>You can also access them through <strong>Modules</strong> selection tab at the top of the screen.</li>
<li>Probably you noticed that after configuration there are a lot more of them.</li>
<li>Modules can be contain anything from Persons, Organizations to Data Streams.</li>
<li>Modules prefixed with <strong>Portal</strong> are not displayed (e.g. portal ingestion policies)</li>
<li>Click "Record" to Start/Stop audio and "Save" to save</li>
<li>Or you can download <ahref="https://nexedi.erp5.net/document_module/9858/Base_download"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">sample.wav</a></li>
</ul>
</section>
<section>
<h1>Webrunner using fluentD</h1>
<ul>
<li>For this part of tutorial you will need a webrunner using Fluentd:
<ul>
<li>Request a new service on vifib, choose webrunner, and wait for connection parameters to appear.</li>
<li>Click on the URL, and enter username and password provided.</li>
<li>Click Open Softwate release, choose slapos > software > fluentd and click Open Software.</li>
<li>Click green arrow and wait for installation to finnish.</li>
</ul>
</li>
</ul>
</section>
<section>
<h1>Upload to Monitor</h1>
<ul>
<li>Go to the Editor, click "This Project"</li>
<li>Make a folder for this tutorial</li>
<li>Left click and select upload file</li>
<li>Upload your .vaw file.</li>
</ul>
</section>
<section>
<h1>Forward File to fluentD</h1>
<ul>
<li>In the Editor, open folder that you created.</li>
<li>Create a new file, name it YOUR_NAME.cfg</li>
<li>Code on next slide (please copy&paste)</li>
</ul>
<detailsopen="true">
<ul>
<li>We are now creating a configuration file to pass to fluentd</li>
<li>The file contains all parameters for fluentD regarding data source and destination</li>
<li>Normally this is set upfront, but for the tutorial we hardcode</li>
<li>Copy this script to new file that you created and edit paths to the vaw file and to the pos file, uri to your wendelin and username and password.</li>
<li>Fluentd configuration file has two parts.</li>
<li>Source part contains path to file that you wish to upload, path to pos file which is used to track position while sending the data, and a tag, which is used to match source to the output</li>
<li>Output part is a match tag. It must match a tag given to the data in the source part. It contains uri to your ingestion policy, and username and password for your Wendelin</li>
<li>Make sure all the paths are correct.</li>
</ul>
<detailsopen="true">
<ul>
<li>For more information on writing Fluentd configuration files check out: <ahref="https://docs.fluentd.org/configuration"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Fluentd configuration documentation</a>.</li>
</ul>
</details>
</section>
<section>
<h1>Save and send from Terminal</h1>
<ul>
<li>Switch to the terminal and run fluentd with:</li>
<li>To run fluents with your configuration including what file to send to Wendelin.</li>
<li>This will create new Data Stream in your Wendelin instance, and send data to it.</li>
</ul>
<detailsopen="true">
<ul>
<li>Notice that Fluentd is running until you interrupt it and waiting for new input.</li>
<li>In our case, we had just a small .vaw file, but we could also have continuous stream of data from the sensor and fluentd would be continuously appending it to Data Stream.</li>
</ul>
</details>
</section>
<section>
<h1>Check created Data Stream</h1>
<ul>
<li>Head back to Wendelin/ERP5.</li>
<li>In the Data Stream Module, check the file size of the pydata stream.</li>
<li>It should show a file size larger than 0.</li>
</ul>
</section>
<section>
<h1>3. Work with Ingested Data</h1>
</section>
<section>
<h1>Out-of-Core</h1>
<ul>
<li>Wendelin.Core enables computation beyond limits of existing RAM</li>
<li>We have integrated Wendelin and Wendelin.Core With Jupyter</li>
<li>In Jupyter we can use ERP5 Kernel (out-of-core compliant) vs. Python 2 Kernel (default Jupyter)</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Enable Data Notebook</h1>
<ul>
<li>Head to My Favourites > Preferences.</li>
<li>Click Default System Preferences and open Data Notebook tag.</li>
<li>Check the box to enable Data Notebook and click the save icon.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Head to Jupyter</h1>
<ul>
<li>Request a frontend with Backand URL: https://[IPv6]:30000 and Backend Type: notebook. Wait for connection parameters and click on secure_access_url.</li>
<li>For password check the file knowledge0.cfg on a partition, where Jupyter is installed in your KVM (first use: slapos node | grep jupyter to check partition, and then: cat /srv/slapgrid/slappart__/knowledge0.cfg)</li>
<li>Go to: https://softinstxxxxxx.host.vifib.net/tree</li>
<li>Start a new ERP5 Notebook</li>
<li>This will make sure you use the <strong>ERP5 Kernel</strong></li>
</ul>
<detailsopen="open">
<ul>
<li>The Python 2 Kernel is the default Jupyter Kernel</li>
<li>Using Python 2 will disregard Wendelin and Wendelin.Core, so it's basic Jupyter.</li>
<li>Using ERP5 Kernel will use Wendelin.core in the background.</li>
<li>To make good use of it, all code written should be Out-of-core "compatible"</li>
<li>For example you should not just load a large file into memory (see below).</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Learn ERP5 Kernel</h1>
<ul>
<li>Help yourself with <ahref="https://nbviewer.jupyter.org/url/nexedi.erp5.net/document_module/9794/getData"style="color: #002e3f; text-decoration: none; background-color: inherit;">Notebook</a></li>
</ul>
<detailsopen="open">
<ul>
<li>Note that your ERP5_URL in this case should be your internal url</li>
<li>You can retrieve it by running erp5-show -s in your KVM</li>
<li>Note, outside of the tutorial we would set the external IPv6 adress of ZOPE</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Getting Started</h1>
<ul>
<li>Authenticate and set arbitrary reference for your notebook.</li>
</ul>
<detailsopen="open">
<ul>
<li>This is always the first step when you start a new Notebook with ERP5 Kernel.</li>
<li>It makes sure that you are connected to ERP5/Wendelin instance any you can work with objects on it.</li>
<li>It also creates Data Notebook object on your ERP5/Wendelin instance.</li>
<li>You can go to Data Notebook Module and see that your Data Notebook object is now saved there.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Accessing Objects</h1>
<ul>
<li>Type context, this will give you the Wendelin/ERP5 Object.</li>
<li>Type context.data_stream_module["1"] to get your uploaded sound file.</li>
</ul>
<detailsopen="open">
<ul>
<li>Accessing data works the same ways throughout [IPv6]:30002/erp5/[module_name]/[id].</li>
<li>All modules you see on the Wendelin/ERP5 start page can be accessed like this.</li>
<li>Once you have an object you can manipulate it.</li>
<li>Note that accessing a file by internal id (1) is only one way.</li>
<li>The standard way would be using the reference of the respective object, which will also allow to user portal_catalog to query.</li>
<li>Try to get the length of the file using getData and via iterate</li>
<li>Note then when using ERP5 kernel all manipulations should be "Big Data Aware"</li>
<li>Just loading a file via getData() works for small files, but will break with volume</li>
</ul>
<detailsopen="open">
<ul>
<li>It's important to understand that manipulations outside of Wendelin.Core need to be Big Data "compatible"</li>
<li>Internally Wendelin.Core will run all manipulations "context-aware"</li>
<li>An alternative way to work would be to create your scripts inside Wendelin/ERP5 and call them from Juypter</li>
<li>Scripts/Manipulations are stored in <strong>Data Operations Module</strong></li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Compute Fourier</h1>
<ul>
<li>Proceed to fetch data using getData for now</li>
<li>Extract one channel, save it back to Wendelin and compute FFT</li>
</ul>
<detailsopen="open">
<ul>
<li>Note the way to call methods from Wendelin/ERP5 (<code>Base_renderAsHtml</code> )</li>
<li>Wendelin/ERP5 has a system of method acquistion. Every module can come with its own module specific methods and method names are always context specific ([object_name]_[method_name] ). Base methods on the other hand are core methods of Wendelin/ERP5 and applicable to more than one object.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Display Fourier</h1>
<ul>
<li>Check the rendered Fourier graphs of your recorded sound file</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Save Image</h1>
<ul>
<li>Save the image back to Wendelin/ERP5.</li>
<li>Close figure with plt.close(), otherwise it will show on all outputs.</li>
</ul>
<detailsopen="open"> </details>
</section>
<sectionclass="screenshot">
<h1>Create BigFile Reader</h1>
<ul>
<li>Add a new class BigFileReader</li>
<li>Allows to pass out-of-core objects</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Rerun using Big File Reader</h1>
<ul>
<li>Rerun using the Big File Reader</li>
<li>Now one more step is out of core compliant</li>
<li>Verify graphs render the same</li>
</ul>
<detailsopen="open">
<ul>
<li>We are now showing how to step by step convert our code to being Out-of-Core compatible</li>
<li>This will only be possible for code we write ourselves</li>
<li>Whenever we have to rely on 3rd party libraries, there is no guarantee that data will be handled in the correct way. The only option to be truly Out-of-Core is to either make sure the 3rd party methods used are compatible and fixing them accordingly/committing back or to reimplement a 3rd party library completely.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Redraw from Wendelin</h1>
<ul>
<li>This is the way to redraw the plot directly from data stored in Wendelin/ERP5</li>
<li>Imidiatelly after you create content, you cannot redraw it. You must wait for the object to be catalogued.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Verify Images are Stored</h1>
<ul>
<li>Head back to Wendelin/ERP5</li>
<li>Go to Image module and verify your stored images are there.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Verify Data Arrays are Stored</h1>
<ul>
<li>Switch to the Data Array module</li>
<li>Verify all computed files are there.</li>
</ul>
</section>
<section>
<h1>4. Visualize, Display computed data</h1>
</section>
<section>
<h1>Running Web Sites from Wendelin</h1>
<ul>
<li>Last step is to display results in a web app</li>
<li>Head back to main section in Wendelin/ERP5</li>
<li>Go to Website Module</li>
</ul>
<detailsopen="true">
<ul>
<li>One of the modules in erp5 is Web Site Module.</li>
<li>We will use it to create simple Web Site for presentation of our result.</li>
<li>Front end components are written with two frameworks, <ahref="http://www.j-io.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="jIO | Virtual Document Filesystem">jIO</a> and <ahref="http://www.renderjs.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="RenderJS | Web Component Framework">renderJS</a></li>
<li>jIO (<ahref="https://lab.nexedi.com/nexedi/jio"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="jIO | Gitlab Repository">Gitlab</a>) is used to access documents across different storages</li>
<td>//button[@type="submit" and @title="Save"]</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Data updated.</td>
<td></td>
</tr>
</tbody>
</table>
</test>
</section>
<sectionclass="screenshot">
<h1>Publish Website</h1>
<ul>
<li>Select action <strong>Publish</strong> and publish the site</li>
<li>This changes object state from embedded to published</li>
<li>Try to access: http://softinstxxxx/erp5/web_site_module/pydata_runner/</li>
</ul>
<detailsopen="open">
<ul>
<li>Every object in ERP5 has a state (For example draft, published,...).</li>
<li>Workflows are used to change the state of objects.</li>
<li>A workflow in this case is to publish a webpage, which means changing its status from Embedded to Published.</li>
<li>Workflows (among other properties) can be security restricted. For example, everybody can see Web Site in published state, but only its creator can see it while it is still in draft state.</li>
<li>This concept applies to all documents in ERP5.</li>
<li>Copy and paste this <ahref="https://gist.github.com/frequent/794f8374560380a39c74718736c08ced"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> to the contents of the gadget.</li>
</ul>
<detailsopen="open">
<ul>
<li>This is a default gadget setup with some HTML.</li>
<li>Gadgets should be self containable so they always include all dependencies</li>
<li>RenderJS is using a custom version of RSVP for promises (we can cancel promises)</li>
<li>The global gadget includes promisified event binding (single, infinite event listener)</li>
<li>We are using RenderJS and jIO javascript libraries.</li>
<li>Copy and paste this <ahref="https://gist.github.com/frequent/1d12343b86332d43f4262ab6dda5e415"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> to the javascript gadget (in the edit tab).</li>
<li>Update html gadget with this <ahref="https://gist.github.com/frequent/1269cadfcda31ec6a03fc0778d55c3dd"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a>.</li>
</ul>
<detailsopen="open">
<ul>
<li>Took from existing project, HTML was created to fit a responsive grid of graphs</li>
<li>Update js gadget with this <ahref="https://gist.github.com/frequent/da0dd977fb0cf0e9177a32f9a08fd379"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> (screanshots on this and next slides).</li>
</ul>
<detailsopen="open">
<ul>
<li>First we only defined options for the Dygraph plugin</li>
<li>In production system these are either set as defaults or stored along with respective data</li>
<li>Install and configure Wendelin on Linux machine.</li>
<li>Ingest data into Wendelin using Fluentd. (open source data collector used to ingest data to Wendelin) <ahref="https://www.fluentd.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Fluentd Website</a>.</li>
<li>Manipulate data in Wendelin using Jupyter Notebook. <ahref="https://jupyter.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Jupyter Website</a>.</li>
<li>Present data in Wendelin on a web site using Renderjs and jIO javascript libraries.</li>
<li>For this tutorial, you will need a Debian Stretch or Debian Jesse running machine with at least 4GB of RAM and 20GB of free disk space.</li>
<li>Optionally, you can set up a virtual machine with: <ahref="http://www.brianlinkletter.com/installing-debian-linux-in-a-virtualbox-virtual-machine/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">VirtualBox</a>.</li>
<li>First time, you run the installer, you will probably get an error with a message: "Your software is still building, be patient it can take a while." Do not panic. This is expected. Installation is now running.</li>
<li>You can check that installation is going ok by following SlapOS software installation log:</li>
<li>Go to: My Favorites ><strong>Configure your Site</strong> .</li>
</ul>
<detailsopen="open">
<ul>
<li>Your ERP5 instance is now ready, but it has only very generic core library. This core can be specialized through different business templates for different purposes.</li>
<li>This can be done manually, installing individual business templates that provide your ERP5 instance with utilities that you need.</li>
<li>That can be done in My Favorites ><strong>Manage Business Templates</strong></li>
<li>But Wendelin uses a lot of different business templates and that would be a lot of work, so configurator is provided that makes that work for you and installs just the business templates that are important for Wendelin.</li>
<li>On next screen make sure that the boxes <strong>set wendelin tutorial</strong> and <strong>set up Data Notebook module for Jupyter integration</strong> are checked.</li>
<li>Click <strong>Set of data Notebook module</strong> and on the next screen <strong>Install</strong> .</li>
<li>Click "Record" to Start/Stop audio and "Save" to save</li>
<li>Or you can download <ahref="https://nexedi.erp5.net/document_module/9858/Base_download"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">sample.wav</a></li>
<li>For this part of tutorial you will need Fluentd (<ahref="https://docs.fluentd.org/installation/install-by-deb"style="color: #002e3f; text-decoration: none; background-color: inherit;">Fluentd documentation page</a>):</li>
<li>In Fluentd, data input/output is managed by plugins. Each plugin knows how to communicate with external endpoint.</li>
<li>In our case external endpoint of output is Wendelin, so we will use wendelin output plugin, and input is binary file, so we will use bin input plugin.</li>
<li>Plugins that come with fluentd are located in ruby gems directory, but for our custom plugins we make new folder /etc/fluent/plugin.</li>
<li>To setup default configuration file for fluentd run:</li>
<li>sudo fluentd --setup /etc/fluent</li>
<li>Now you have default configuration for fluentd to use in file /etc/fluent/fluent.conf. You can open it and see how fluentd configuration file looks like.</li>
<li>Source tag is configuration for input and match tag for outputs. You can also have different tags like filter, etc. Our configuration for tutorial will be wery simple, so we will hardcode it. Create a new file with:</li>
<li>vi /etc/fluent/pydata.conf, enter code from the next slide and save</li>
</ul>
<detailsopen="open">
<ul>
<li>We are now creating a configuration file to pass to fluentd</li>
<li>The file contains all parameters for fluentD regarding data source and destination</li>
<li>Normally configuration is set upfront in the /etc/fluent/fluent.conf. If you open it you can see that it can be quite complex.</li>
<li>But for tutorial we will hardcode a simple example of configuration file.</li>
<li>Copy this script to new file that you created and edit parts inside exclamation marks.</li>
<li>Fluentd configuration file has two parts.</li>
<li>In source part edit path to your home directory</li>
<li>In output part edit url of your wendelin, and password.</li>
</ul>
<detailsopen="true">
<ul>
<li>Fluentd configuration file has two parts: Input or source part and output part.</li>
<li>Source part contains path to file that you wish to upload, path to pos file which is used to track position while sending the data, and a tag, which is used to match source to the output</li>
<li>Output part is a match tag. It must match a tag given to the data in the source part. It contains uri to external endpoint (which is in out case ingestion policy, that we created in Wendelin), and username and password to authenticate your Wendelin</li>
<li>Both parts also have type, which is yust a plugin, that it should use</li>
<li>Note that in tutorial we can use internal IPv4, since we have Wendelin and Fluentd on the same machine. To send data to Wendelin on another machine, we would have to use external IP address.</li>
<li>For more information on writing Fluentd configuration files check out: <ahref="https://docs.fluentd.org/configuration"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Fluentd configuration documentation</a>.</li>
<li>Save configuration, go back to the terminal and run fluentd with:</li>
<li>fluentd -c /etc/fluent/pydata.cfg</li>
<li>Notice that we use option -c to pass out custon configuration to fluentd.</li>
<li>This will create new Data Stream in your Wendelin instance, and append sent data to it.</li>
</ul>
<detailsopen="open">
<ul>
<li>Notice that Fluentd is running and waiting for new input, until you interrupt it.</li>
<li>When you see that data is on your wendelin instance, you can interrupt it with keyboard interrupt Ctrl+C</li>
<li>In our case, we had just a small .vaw file, but we could also have continuous stream of data from the sensor and fluentd would be continuously appending it to Data Stream.</li>
<li>Jupyter service is on port 20000. In new tab in browser open: https://internal IPv4:20000/tree</li>
<li>For password check the file knowledge0.cfg on a partition, where Jupyter is installed in your KVM (first use: slapos node | grep jupyter to check partition, and then: cat /srv/slapgrid/slappart__/knowledge0.cfg). Authenticate.</li>
<li>Start a new ERP5 Notebook</li>
<li>This will make sure you use the <strong>ERP5 Kernel</strong></li>
</ul>
<detailsopen="open">
<ul>
<li>The Python 2 Kernel is the default Jupyter Kernel</li>
<li>Using Python 2 will disregard Wendelin and Wendelin.Core, so it's basic Jupyter.</li>
<li>Using ERP5 Kernel will use Wendelin.core in the background.</li>
<li>To make good use of it, all code written should be Out-of-core "compatible"</li>
<li>For example you should not just load a large file into memory (see below).</li>
<li>Proceed to fetch data using getData for now</li>
<li>Extract one channel, save it back to Wendelin and compute FFT</li>
</ul>
<detailsopen="open">
<ul>
<li>Note the way to call methods from Wendelin/ERP5 (<code>Base_renderAsHtml</code> )</li>
<li>Wendelin/ERP5 has a system of method acquistion. Every module can come with its own module specific methods and method names are always context specific ([object_name]_[method_name] ). Base methods on the other hand are core methods of Wendelin/ERP5 and applicable to more than one object.</li>
<li>Now one more step is out of core compliant</li>
<li>Verify graphs render the same</li>
</ul>
<detailsopen="open">
<ul>
<li>We are now showing how to step by step convert our code to being Out-of-Core compatible</li>
<li>This will only be possible for code we write ourselves</li>
<li>Whenever we have to rely on 3rd party libraries, there is no guarantee that data will be handled in the correct way. The only option to be truly Out-of-Core is to either make sure the 3rd party methods used are compatible and fixing them accordingly/committing back or to reimplement a 3rd party library completely.</li>
<li>Front end components are written with two frameworks, <ahref="http://www.j-io.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="jIO | Virtual Document Filesystem">jIO</a> and <ahref="http://www.renderjs.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="RenderJS | Web Component Framework">renderJS</a></li>
<li>jIO (<ahref="https://lab.nexedi.com/nexedi/jio"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="jIO | Gitlab Repository">Gitlab</a>) is used to access documents across different storages</li>
<li>Select action <strong>Publish</strong> and publish the site</li>
<li>This changes object state from embedded to published</li>
<li>Try to access: http://internal IPv4:20001/erp5/web_site_module/pydata_runner/</li>
</ul>
<detailsopen="open">
<ul>
<li>Every object in ERP5 has a state (For example draft, published,...).</li>
<li>Workflows are used to change the state of objects.</li>
<li>A workflow in this case is to publish a webpage, which means changing its status from Embedded to Published.</li>
<li>Workflows (among other properties) can be security restricted. For example, everybody can see Web Site in published state, but only its creator can see it while it is still in draft state.</li>
<li>This concept applies to all documents in ERP5.</li>
<li>Copy and paste this <ahref="https://gist.github.com/frequent/794f8374560380a39c74718736c08ced"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> to the contents of the gadget.</li>
</ul>
<detailsopen="open">
<ul>
<li>This is a default gadget setup with some HTML.</li>
<li>Gadgets should be self containable so they always include all dependencies</li>
<li>RenderJS is using a custom version of RSVP for promises (we can cancel promises)</li>
<li>The global gadget includes promisified event binding (single, infinite event listener)</li>
<li>We are using RenderJS and jIO javascript libraries.</li>
<li>Copy and paste this <ahref="https://gist.github.com/frequent/1d12343b86332d43f4262ab6dda5e415"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> to the javascript gadget (in the edit tab).</li>
<li>Update html gadget with this <ahref="https://gist.github.com/frequent/1269cadfcda31ec6a03fc0778d55c3dd"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a>.</li>
</ul>
<detailsopen="open">
<ul>
<li>Took from existing project, HTML was created to fit a responsive grid of graphs</li>
<li>Update js gadget with this <ahref="https://gist.github.com/frequent/da0dd977fb0cf0e9177a32f9a08fd379"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> (screanshots on this and next slides).</li>
</ul>
<detailsopen="open">
<ul>
<li>First we only defined options for the Dygraph plugin</li>
<li>In production system these are either set as defaults or stored along with respective data</li>
<value><string>Tutorial showing how to install Wendelin on Linux Machine, how to ingest data, how to manipulate data and how to present data.</string></value>
<li>Install and configure Wendelin on a webrunner.</li>
<li>Ingest data into Wendelin using Fluentd. (open source data collector used to ingest data to Wendelin) <ahref="https://www.fluentd.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Fluentd Website</a>.</li>
<li>Manipulate data in Wendelin using Jupyter Notebook. <ahref="https://jupyter.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Jupyter Website</a>.</li>
<li>Present data in Wendelin on a web site using Renderjs and jIO javascript libraries.</li>
<li>For this tutorial, you will use services provided by vifib.com.</li>
<li>On Vifib request a Webrunner:</li>
<li>Go to services.</li>
<li>Click on Add button.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Request a Webrunner</h1>
<ul>
<li>Choose Webrunner software.</li>
<li>On the next screen choose the latest version.</li>
<li>Choose a name for your Webrunner and click Proceed.</li>
<li>Wait for connection parameters to appear and Monitoring Status turn green.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Request a Webrunner</h1>
<ul>
<li>You will need three connection parameters: url, init-user and init-password.</li>
<li>Click on url parameter and use the user and password parameters for authentication.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Install Wendelin</h1>
<ul>
<li>Click Open Softwere Release.</li>
<li>Open Slapos > Sofrware > Wendelin and click Open Software.</li>
<li>You should now see text file with first line [buildout]. Click Green arrow to start compilation.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Install Wendelin</h1>
<ul>
<li>Follow the log on the screen.</li>
<li>Compilation takes several hours.</li>
<li>IF compilation fails, click the green arrow again. It might be needed to restart the compilation few times.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Connection Information</h1>
<ul>
<li>When installation is complete, switch to the Services and click Connection Information tab.</li>
<li>In slappart0 you should see something like in the screenshot above. If not, click the green arrow again, wait until finishes and refresh.</li>
<li>Note down family-default-v6, inituser-login and inituser-password parameters.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Request frontend</h1>
<ul>
<li>Go back to Vifib screen of your Webrunner service and scroll down to find parameters Custom Frontend Backend URL and Type.</li>
<li>For Custom Frontend Backend url enter family_default_v6 parameter, and for the Custom Frontend Backend Type enter Zope and click Save.</li>
<li>Wait until custom-frontend-url appears under connectin parameters and click on it.</li>
</ul>
</section>
<section>
<h1>Login</h1>
<ul>
<li>Click on Zope management interface.</li>
<li>Login using username and password, that you noted down.</li>
<li>go to: http://softinstxxxx.host.vifib.net/erp5.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Configure Site</h1>
<ul>
<li>Go to: My Favorites ><strong>Configure your Site</strong> .</li>
</ul>
<detailsopen="open">
<ul>
<li>Your ERP5 instance is now ready, but it has only very generic core library. This core can be specialized through different business templates for different purposes.</li>
<li>This can be done manually, installing individual business templates that provide your ERP5 instance with utilities that you need.</li>
<li>That can be done in My Favorites ><strong>Manage Business Templates</strong></li>
<li>But Wendelin uses a lot of different business templates and that would be a lot of work, so configurator is provided that makes that work for you and installs just the business templates that are important for Wendelin.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Install Configuration</h1>
<ul>
<li>Select Wendelin Configuration.</li>
</ul>
<detailsopen="open">
<ul>
<li>IF there is no Wendelin Configurator, you have to install it:
<ul>
<li>Go to My Favourites ><strong>Manage Business Templates</strong> .</li>
<li>Click on Import/Export button (blue and red arrows).</li>
<li>Select Exchange ><strong>Install Business Templates from Repositories</strong> .</li>
<li>Check box before erp5_wendelin_configurator business template and click Install Business Templates from Repositories.</li>
</ul>
</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Install Configuration</h1>
<ul>
<li>Make sure that all the boxes are checked.</li>
<li>Click <strong>Set of data Notebook module</strong> and on the next screen <strong>Install</strong> .</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Wait</h1>
<ul>
<li>Installation may take a few minutes</li>
<li>Once down, click "Start using your ERP5 System"</li>
<li>Login again.</li>
</ul>
</section>
<section>
<h1>Main Interface</h1>
<ul>
<li>Your instance is now ready to use</li>
</ul>
<detailsopen="true">
<ul>
<li>The start screen shows a list of modules (data-types) directly accessible.</li>
<li>You can also access them through <strong>Modules</strong> selection tab at the top of the screen.</li>
<li>Probably you noticed that after configuration there are a lot more of them.</li>
<li>Modules can be contain anything from Persons, Organizations to Data Streams.</li>
<li>Modules prefixed with <strong>Portal</strong> are not displayed (e.g. portal ingestion policies)</li>
<li>Click "Record" to Start/Stop audio and "Save" to save</li>
<li>Or you can download <ahref="https://nexedi.erp5.net/document_module/9858/Base_download"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">sample.wav</a></li>
</ul>
</section>
<section>
<h1>Webrunner using fluentD</h1>
<ul>
<li>For this part of tutorial you will need a webrunner using Fluentd:
<ul>
<li>Request another webrunner for Fluentd.</li>
<li>Install the same way, just now choose slapos > software > fluentd.</li>
<li>When installation completes, go to Editor (You dont need to request frontend.)</li>
</ul>
</li>
</ul>
</section>
<section>
<h1>Upload to Monitor</h1>
<ul>
<li>Go to the Editor, click "This Project"</li>
<li>Make a folder for this tutorial</li>
<li>Left click and select upload file</li>
<li>Upload your .wav file.</li>
</ul>
</section>
<section>
<h1>Forward File to fluentD</h1>
<ul>
<li>In the Editor, open folder that you created.</li>
<li>Create a new file, name it YOUR_NAME.cfg</li>
<li>Code on next slide (please copy&paste)</li>
</ul>
<detailsopen="true">
<ul>
<li>We are now creating a configuration file to pass to fluentd</li>
<li>The file contains all parameters for fluentD regarding data source and destination</li>
<li>Normally this is set upfront, but for the tutorial we hardcode</li>
<li>Copy this script to new file that you created and edit paths to the vaw file and to the pos file, uri to your wendelin and username and password.</li>
<li>Make sure all the paths are correct.</li>
</ul>
<detailsopen="true">
<ul>
<li>Fluentd configuration file has two parts. Input part, represented by the source tag and output part represented by the match tag.</li>
<li>Each part first define which plugin shall fluentd use with @type variable.</li>
<li>Source tag then define path to file that you wish to upload, and path for .pos file with @file and @pos_file variables.</li>
<li>.pos file is created by fluentd and is used for tracking position in a file during ingestion.</li>
<li>@tag variable in the source part should match the match tag</li>
<li>Output part is a match tag. It must match a tag given to the data in the source part. It contains uri to your ingestion policy, and username and password for your Wendelin</li>
<li>For more information on writing Fluentd configuration files check out: <ahref="https://docs.fluentd.org/configuration"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">Fluentd configuration documentation</a>.</li>
</ul>
</details>
</section>
<section>
<h1>Save and send from Terminal</h1>
<ul>
<li>Switch to the terminal and run fluentd with:</li>
<li>To run fluents with your configuration including what file to send to Wendelin.</li>
<li>This will create new Data Stream in your Wendelin instance, and send data to it.</li>
</ul>
<detailsopen="true">
<ul>
<li>Notice that Fluentd is running until you interrupt it and waiting for new input.</li>
<li>In our case, we had just a small .vaw file, but we could also have continuous stream of data from the sensor and fluentd would be continuously appending it to Data Stream.</li>
</ul>
</details>
</section>
<section>
<h1>Check created Data Stream</h1>
<ul>
<li>Head back to Wendelin/ERP5.</li>
<li>In the Data Stream Module, check the file size of the pydata stream.</li>
<li>It should show a file size larger than 0.</li>
</ul>
</section>
<section>
<h1>3. Work with Ingested Data</h1>
</section>
<section>
<h1>Out-of-Core</h1>
<ul>
<li>Wendelin.Core enables computation beyond limits of existing RAM</li>
<li>We have integrated Wendelin and Wendelin.Core With Jupyter</li>
<li>In Jupyter we can use ERP5 Kernel (out-of-core compliant) vs. Python 2 Kernel (default Jupyter)</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Enable Data Notebook</h1>
<ul>
<li>Head to My Favourites > Preferences.</li>
<li>Click Default System Preferences and open Data Notebook tag.</li>
<li>Check the box to enable Data Notebook and click the save icon.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Head to Jupyter</h1>
<ul>
<li>Go back to connection information in webrunner and open jupyter-url.</li>
<li>For password we have to find a partition, where Jupyter is installed. For that go to services>process tab, check in which slappart is Jupyter (e.g slappart 7), then you will find the password in instance/slappart7/knowledge0.cfg</li>
<li>Authenticate.</li>
<li>Start a new ERP5 Notebook. This will make sure you use the <strong>ERP5 Kernel</strong> .</li>
</ul>
<detailsopen="open">
<ul>
<li>Note that to open jupyter-url you need IPv6 access. If you don't have it, you have to request a new frontend on vifib with jupyter-url as backend url, and backend type notebook, and then click on secure access url to access it.</li>
<li>The Python 2 Kernel is the default Jupyter Kernel</li>
<li>Using Python 2 will disregard Wendelin and Wendelin.Core, so it's basic Jupyter.</li>
<li>Using ERP5 Kernel will use Wendelin.core in the background.</li>
<li>To make good use of it, all code written should be Out-of-core "compatible"</li>
<li>For example you should not just load a large file into memory (see below).</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Learn ERP5 Kernel</h1>
<ul>
<li>Help yourself with <ahref="https://nbviewer.jupyter.org/url/nexedi.erp5.net/document_module/9794/getData"style="color: #002e3f; text-decoration: none; background-color: inherit;">Notebook</a></li>
</ul>
<detailsopen="open">
<ul>
<li>Passing login/password will authenticate Juypter with Wendelin/ERP5</li>
<li>The reference you set will store your notebook in the <strong>Date Notebook Module</strong></li>
<li>Authenticate, and set arbitrary reference for your notebook.</li>
</ul>
<detailsopen="open">
<ul>
<li>This is always the first step when you start a new Notebook with ERP5 Kernel.</li>
<li>It makes sure that you are connected to ERP5/Wendelin instance any you can work with objects on it.</li>
<li>It also creates Data Notebook object on your ERP5/Wendelin instance.</li>
<li>You can go to Data Notebook Module and see that your Data Notebook object is now saved there.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Accessing Objects</h1>
<ul>
<li>Type context, this will give you the Wendelin/ERP5 Object.</li>
<li>Type context.data_stream_module["1"] to get your uploaded sound file.</li>
</ul>
<detailsopen="open">
<ul>
<li>Accessing data works the same ways throughout [IPv6]:30002/erp5/[module_name]/[id].</li>
<li>All modules you see on the Wendelin/ERP5 start page can be accessed like this.</li>
<li>Once you have an object you can manipulate it.</li>
<li>Note that accessing a file by internal id (1) is only one way.</li>
<li>The standard way would be using the reference of the respective object, which will also allow to user portal_catalog to query.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Import libraries</h1>
<ul>
<li>Import necessary libs.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Accessing Data Itself</h1>
<ul>
<li>Try to get the length of the file using getData and via iterate</li>
<li>Note then when using ERP5 kernel all manipulations should be "Big Data Aware"</li>
<li>Just loading a file via getData() works for small files, but will break with volume</li>
</ul>
<detailsopen="open">
<ul>
<li>It's important to understand that manipulations outside of Wendelin.Core need to be Big Data "compatible"</li>
<li>Internally Wendelin.Core will run all manipulations "context-aware"</li>
<li>An alternative way to work would be to create your scripts inside Wendelin/ERP5 and call them from Juypter</li>
<li>Scripts/Manipulations are stored in <strong>Data Operations Module</strong></li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Compute Fourier</h1>
<ul>
<li>Proceed to fetch data using getData for now</li>
<li>Extract one channel, save it back to Wendelin and compute FFT</li>
</ul>
<detailsopen="open">
<ul>
<li>Note the way to call methods from Wendelin/ERP5 (<code>Base_renderAsHtml</code> )</li>
<li>Wendelin/ERP5 has a system of method acquistion. Every module can come with its own module specific methods and method names are always context specific ([object_name]_[method_name] ). Base methods on the other hand are core methods of Wendelin/ERP5 and applicable to more than one object.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Display Fourier</h1>
<ul>
<li>Check the rendered Fourier graphs of your recorded sound file</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Save Image</h1>
<ul>
<li>Save the image back to Wendelin/ERP5.</li>
<li>Close figure with plt.close() function, otherwise it will show on all outputs</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Create BigFile Reader</h1>
<ul>
<li>Add a new class BigFileReader</li>
<li>Allows to pass out-of-core objects</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Rerun using Big File Reader</h1>
<ul>
<li>Rerun using the Big File Reader</li>
<li>Now one more step is out of core compliant</li>
<li>Verify graphs render the same</li>
</ul>
<detailsopen="open">
<ul>
<li>We are now showing how to step by step convert our code to being Out-of-Core compatible</li>
<li>This will only be possible for code we write ourselves</li>
<li>Whenever we have to rely on 3rd party libraries, there is no guarantee that data will be handled in the correct way. The only option to be truly Out-of-Core is to either make sure the 3rd party methods used are compatible and fixing them accordingly/committing back or to reimplement a 3rd party library completely.</li>
</ul>
</details>
</section>
<sectionclass="screenshot">
<h1>Check the graphs</h1>
<ul>
<li>Verify graphs render the same</li>
<li>Don't forget to close the figure.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Redraw from Wendelin</h1>
<ul>
<li>This is the way to redraw the plot directly from data stored in Wendelin/ERP5</li>
<li>Imidiatelly after you create content, though, it doesn't work. You must wait for the object to be catalogued.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Verify Images are Stored</h1>
<ul>
<li>Head back to Wendelin/ERP5</li>
<li>Go to Image module and verify your stored images are there.</li>
</ul>
</section>
<sectionclass="screenshot">
<h1>Verify Data Arrays are Stored</h1>
<ul>
<li>Switch to the Data Array module</li>
<li>Verify all computed files are there.</li>
</ul>
</section>
<section>
<h1>4. Visualize, Display computed data</h1>
</section>
<section>
<h1>Running Web Sites from Wendelin</h1>
<ul>
<li>Last step is to display results in a web app</li>
<li>Head back to main section in Wendelin/ERP5</li>
<li>Go to Website Module</li>
</ul>
<detailsopen="true">
<ul>
<li>One of the modules in erp5 is Web Site Module.</li>
<li>We will use it to create simple Web Site for presentation of our result.</li>
<li>Front end components are written with two frameworks, <ahref="http://www.j-io.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="jIO | Virtual Document Filesystem">jIO</a> and <ahref="http://www.renderjs.org/"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="RenderJS | Web Component Framework">renderJS</a></li>
<li>jIO (<ahref="https://lab.nexedi.com/nexedi/jio"style="color: #002e3f; text-decoration: none; background-color: inherit;"title="jIO | Gitlab Repository">Gitlab</a>) is used to access documents across different storages</li>
<td>//button[@type="submit" and @title="Save"]</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Data updated.</td>
<td></td>
</tr>
</tbody>
</table>
</test>
</section>
<sectionclass="screenshot">
<h1>Publish Website</h1>
<ul>
<li>Select action <strong>Publish</strong> and publish the site</li>
<li>This changes object state from embedded to published</li>
<li>Try to access: http://softinstxxxx/erp5/web_site_module/pydata_runner/</li>
</ul>
<detailsopen="open">
<ul>
<li>Every object in ERP5 has a state (For example draft, published,...).</li>
<li>Workflows are used to change the state of objects.</li>
<li>A workflow in this case is to publish a webpage, which means changing its status from Embedded to Published.</li>
<li>Workflows (among other properties) can be security restricted. For example, everybody can see Web Site in published state, but only its creator can see it while it is still in draft state.</li>
<li>This concept applies to all documents in ERP5.</li>
<li>Copy and paste this <ahref="https://gist.github.com/frequent/794f8374560380a39c74718736c08ced"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> to the contents of the gadget.</li>
</ul>
<detailsopen="open">
<ul>
<li>This is a default gadget setup with some HTML.</li>
<li>Gadgets should be self containable so they always include all dependencies</li>
<li>RenderJS is using a custom version of RSVP for promises (we can cancel promises)</li>
<li>The global gadget includes promisified event binding (single, infinite event listener)</li>
<li>We are using RenderJS and jIO javascript libraries.</li>
<li>Copy and paste this <ahref="https://gist.github.com/frequent/1d12343b86332d43f4262ab6dda5e415"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> to the javascript gadget (in the edit tab).</li>
<li>Update html gadget with this <ahref="https://gist.github.com/frequent/1269cadfcda31ec6a03fc0778d55c3dd"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a>.</li>
</ul>
<detailsopen="open">
<ul>
<li>Took from existing project, HTML was created to fit a responsive grid of graphs</li>
<li>Update js gadget with this <ahref="https://gist.github.com/frequent/da0dd977fb0cf0e9177a32f9a08fd379"style="color: #002e3f; text-decoration: none; background-color: inherit;"target="_blank">script</a> (screanshots on this and next slides).</li>
</ul>
<detailsopen="open">
<ul>
<li>First we only defined options for the Dygraph plugin</li>
<li>In production system these are either set as defaults or stored along with respective data</li>
<value><string>Tutorial showing how to install Wendelin on Webrunner, how to ingest data, how to manipulate data and how to present data.</string></value>