Reffed a article of 「Instruction of Web Audio API」 composed by @g200kg a lot, and also using some of the contents, sample codes and diagrams from that article. Thank you very much for sharing those contents to use here.
Installing Google Chrome
Download suitable package for your platform from here. And click/tap "Add to Chrome" to install.
Installing Chrome Dev Editor
Please open this URL by Google Chrome, and install the Chrome Dev Editor.
folder_openCreating directory where to build application.
Launch Chrome Dev Editor Input chrome://apps in URL bar in Chrome, and Click Chrome Dev Editor to launch Chrome Dev Editor.
Specify the working directory in [CHOOSE FOLDER] area in the dialog of popping up when to click/tap the add_circle button in right corner in below of left pain. ※ First time in launching Chrome Deve Editor, the pop up to specify "Project Name" and "Script type" appears. In here, specifying ~/Documents/chrome_dev_editor/ for that.
Specifying and selected these values in here.
Project Name: test_webaudioapi
Project type: JavaScript web app
Play sound by using Oscillator Node.
Copy & paste code below to index.html.
<button onclick="Play()">Play</button>

Click/tap play button play_arrow in left top of Chrome Dev Editor to start the application.
Sucess when playing sound with clicking/tapping button in the brower window. In this code does NOT care to stop playing sound. Please reload this page to stop the sound.
Creating Node Graph by following process below.
Creating AudioContext by new AudioContext();.
Creating Oscillator by audioctx.createOscillator();.
Complete Node Graph by connecting to destination by osc.connect(audioctx.destination);.
Start Oscillator by clicking/tapping button.
Oscillator is the one of the primitive parts in Web Audio API, and those primitive parts are named "Node". Lots of these kinds of primitive nodes are prepared by default. Basically, a way of creating application with Web Audio API is by connecting these node each other, and creates Node Graph.
And the end point of Node Graph is named destination (destination node). The destination node is automatically created when AudioContext is constructed. Node Graph is ready to play sound by connecting to the destination node.
By the way, Node Graph which has created is just like this diagram.
(From next step, omit explanation how to run the application.)
Oscillatro is able to create sound, but the sound is a bit monotone. So let's try to swing the oscillator by another oscillator.
Delete code added in previous step from index.html, and add new code below to index.html.

LFO Freq : 	<input type="text" size="10" id="lfofreq" value="5"/>

Depth : 	<input type="text" size="10" id="depth" value="10"/>

VCO Freq : 	<input type="text" size="10" id="vcofreq" value="440"/>

<button onclick="Setup()">Set</button>

Application is working properly when this is reproduced. Sound is played by clicking button. And then clicking button with changing parameters in the textboxes reflects to the swing of the sound.
VCO Freq = 440
LFO Freq = 5
Depth = 10
Explanation for new words.
VCO ： [Voltage-Controlled Oscillator] Oscillator which Oscillator which controls frequency of oscillator by voltage.
LFO ： [Low Frequency Oscillator Oscillator] Low frequency Oscillator
Basic idea is that by controlling frequency of oscillator, which making sound, by another oscillator makes swing of the sound. And the width of the swing is called depth.
About Node Graph of this step.
Creating AudioContext by new AudioContext();
Creating Oscillator which makes sounds by audioctx.createOscillator();
Creating Oscillator which controls frequency of the oscillator making sounds by audioctx.createOscillator();
Creating Node to change depth parameter by audioCtx.createGain();
Connecting to audioctx.destination to completed Node Graph by vco.connect(audioctx.destination);
Connecting to depth for the swing by lfo.connect(depth);
Connecting to Oscillator which making sound by depth.connect(vco.frequency);
Starting Oscillator and updating parameter by clicking/tapping button.
Node Graph which has created in this step is just like this diagram.
Download snare.wav, and drop the downloaded file into "Project name("test_webaudioapi" in here) area" of left pane of Chrome Dev Editor.
Delete code added in previous step from index.html, and add new code below to index.html.
Application is successfully created when to be heard snare drum sound by clicking/tapping button.
Algorithm is below.
Fetching file by XMLHttpRequest(); from server
Copy sound data to buffer is prepared by audioctx.createBufferSource();
Connecting to audioctx.destination to complete Node Graph bysrc.connect(audioctx.destination);
Play sound in the buffer by clicking/tapping button
Node Graph which has created in this step is just like this diagram.
Using audio file that has long duration than audio file that is used at previous step.
So, please download loop.wav, and drop the downloaded file into "Project name("test_webaudioapi" in here) area" of left pane of Chrome Dev Editor.
Next, delete code added in previous step from index.html, and add HTML code below to index.html at first.
At this step, diagram below is the target Node Graph to create.
Explanation for new words that has just appeared.
Dry ： A sound that is originaly input.
Wet ： A sound that is applied audio effect to original input.
Audio Effect ： Creating different sound by applying something. For example, Delay is one of the audio effect that records an input signal to an audio storage medium, and then plays it back after a period of time, Reverb is also one of the audio effect that is the persistence of sound after a sound is produced.
Roles of these nodes
Gain(Dry) and Gain(Wet) : Control the ratio of original sound and audio effected sound.
Delay ： Playback sound after some duration.
Gain(Feedback) ： Feedback delay effected sound to original source.

Explanation of Node Graph.
Connect input to Delay and Gain(Dry)(Dry側のGain)
Connect output from Delay to Gain(Wet)
Connect output from Delay to Gain(Feedback)
Connect output from Gain(Feedback) to Delay
Finally, write event handler for clicking/tapping button.
From the beginning of this codelab Event Handlers are write inside of HTML, but from here Event Handlers are written by JavaScript.
After adding 3 of above, run the application. Clicking/tapping button makes sound playing, and changing parameter and check/uncheck the chackbox of ByPass makes on/off delay effect.tapping button makes sound playing, and changing parameter and check/uncheck the checkbox of ByPass makes changing the depth and on/off of delay effect.
Bypass:
Adding nodes below to obtain each audio effect by same way of adding delay node.
PannerNode ： to allocate sound to each speakers
BiquadFilterNode ： fillter a sound （ e.g: low-pass, high-pass, etc）
GainNode ： control amplitude （controlling volume）
Analyser node is providing users to visualizing sound. With this node, visualizing sound is really easy. Let's visualize sound file.
Use loop.wav, which is used in previous step, to analyse sound.
If you have not downloaded this file, please download from here, and drop the downloaded file into "Project name("test_webaudioapi" in here) area" of left pane of Chrome Dev Editor.
Next, delete code added in previous step from index.html, and add HTML code below to index.html at first.
Drawing by DrawGraph(), and also this method updated the drawing when parameter in the windows is updated. Explation for drawing.
Create analyser by createAnalyser();
Specify the data size of FFT as fftSize
Get values from Analyser node with running animation loop by requestAnimationFrame(); makes updating drawing on canvas in each iteration to visualize values.
Finally, add event handler for when clicking/tapping button.
After adding these 3 blocks of code, run the application. Clicking/tapping button to play songs and displaying graph in canvas. And be updated graphs with changing parameters of Frequency/TimeDomain. ※ In this page, clicking/tapping graph area makes changing the type(Frequency/TimeDomain) of the graph.
In this step, visualizing the sound from Mic(realtime input).
Here, adding code to previous step. So do not delete the code, please.
Add HTML to index.html. Adding HTML in where you want to add.(place is not important)
<button id="startmic">Start Mic</button>

Next, adding JavaScript code. Same as HTML that is added previously, place to add is not important, so please add them where you want to add.
Node Graph is below, since visualize mic input without adding any audio effects.
Algorithm is below.
Get mic input by getUserMedia();.
Get Audio Stream from stream by audioctx.createMediaStreamSource(stream)
Connect Audio Stream that is just obtained to analyser by micsrc.connect(audioctx.destination);
Connect Audio Stream that is just obtained to audioctx.destination by micsrc.connect(audioctx.destination); to complete Node Graph
Clicking/tapping button to start visualizing mic input.
Run application by clicking/tapping . Changing of parameters(e.g. Frequency/TimeDomain) make graph style update. ※ in here, clicking/tapping graph makes changing the graph style.
Adding audio effect by convoluting source audio input/file and impulse response audio file.
It sounds difficult, but Web Audio API is providing ConvolverNode by default to make convolution by really easy way.
Download impulse response audio file form here s1_r1_bd.wav, and drop the downloaded file into "Project name("test_webaudioapi" in here) area" of left pane of Chrome Dev Editor.
※ The file just downloaded(s1_r1_bd.wav) is only provided in here, and is provided for free when the use case is in non-commerical.
Delete code added in previous step from index.html, and add new HTHL below to index.html.(place is not important)


Engoy designing your own carpet or select from our big gallery.
- The Persian carpet is an essential part of Persian art and culture. Distinguished manifestations of Persian culture and art, and dates back to ancient Persia.
The Persian carpet is an essential part of Persian art and culture. Carpet-weaving is undoubtedly one of the most distinguished manifestations of Persian culture and art, and dates back to ancient Persia. In 2008, Iran’s exports of hand-woven carpets was $420 million or 30% of the world's market.[3][4] There is an estimated population of 1.2 million weavers in Iran producing carpets for domestic markets and international export.[5] Iran exports carpets to more than 100 countries, as hand-woven rugs are one of its main non-oil export items. The country produces about five million square metres of carpets annually—80 percent of which are sold in international markets.[6] In recent times Iranian carpets have come under fierce competition from other countries producing reproductions of the original Iranian designs as well as cheaper substitutes.
The Persian carpet is an essential part of Persian art and culture. Carpet-weaving is undoubtedly one of the most distinguished manifestations of Persian culture and art, and dates back to ancient Persia. In 2008, Iran’s exports of hand-woven carpets was $420 million or 30% of the world's market.[3][4] There is an estimated population of 1.2 million weavers in Iran producing carpets for domestic markets and international export.
[5] Iran exports carpets to more than 100 countries, as hand-woven rugs are one of its main non-oil export items. The country produces about five million square metres of carpets annually—80 percent of which are sold in international markets.[6] In recent times Iranian carpets have come under fierce competition from other countries producing reproductions of the original Iranian designs as well as cheaper substitutes.
(See more templates ...)
Registration
Select carpet
Design your carpet
Upload your photo
Make payment
Deliver your carpet


Users
Roles
Genre
Books
Orders
Addresses
Manage Users
[[${error}]]
[[${message}]]
User ID
Email
First Name
Last Name
Balance
Roles
Enabled
[[${user.id}]]
[[${user.email}]]
[[${user.firstName}]]
[[${user.lastName}]]
[[${user.balance}]]
[[${user.roles}]]
Showing Users # [[${startCount}]] to [[${endCount}]] of [[${totalItems}]]
No Users Found
First
Previous
[[${i}]]
Next
Last


Hey there.
Devin Jones.
27.
Canadian.
💜 💜 💜
Hi again. Thanks for taking the time to visit my portfolio website.
I have been working as a Sales Coordinator at an LED lighting company for almost 2 years now.
I really love my job, but I've been looking for a challenge and a change.
I have a Bachelors in English. I love reading and writing, but I never wanted to make that my career.
My hobbies include: knitting, crochet, needlepoint, reading, and makeup
I am looking forward to learning more about coding, programming and computer science.
💜 💜 💜 💜 💜 💜


DataView displays data in grid or list layout with pagination and sorting features.
DataView utilizes PrimeFlex so it is required to be installed in your application. Refer to the documentation for details.
DataView requires a collection of items as its value and one or more templates depending on the layout mode e.g. list and grid.
Throughout the samples, a car interface having vin, brand, year and color properties are used to define an object to be displayed by the dataview. Cars are loaded by a CarService that connects to a server to fetch the cars.
DataView has two layout modes; "list" and "grid" where a separate template is used to render an item in each mode. In list mode name of the template is "listItem" whereas in grid mode it is "gridItem". In grid mode, the ng-template element should contain a div element as a wrapper with PrimeFlex style class of your choice.
Note that there is no restriction to use both layouts at the same time, you may configure only one layout using the layout property with the corresponding ng-template.
Header and Footers sections can be customized using header and footer templates.
When both layout modes are enabled in DataView, a UI element would be necessary to let the user toggle between the view. p-dataViewLayoutOptions is a helper component to display a buttonset to choose the layout mode in DataView. Location of the p-dataViewLayoutOptions should be inside the DataView component. If you prefer a different UI element you can create your own that updates the layout property of the DataView.
Pagination is enabled by setting paginator property to true, rows attribute defines the number of rows per page and pageLinks specify the the number of page links to display. To customize the paginator, use paginatorLeftTemplate, paginatorRightTemplate and paginatorDropdownItemTemplate templates.
Lazy mode is handy to deal with large datasets, instead of loading the entire data, small chunks of data is loaded by invoking onLazyLoad callback everytime paging happens. To implement lazy loading, enable lazy attribute and provide a method callback using onLazyLoad that actually loads the data from a remote datasource. onLazyLoad gets an event object that contains information about what to load. It is also important to assign the logical number of rows to totalRecords by doing a projection query for paginator configuration so that paginator displays the UI assuming there are actually records of totalRecords size although in reality they aren't as in lazy mode, only the records that are displayed on the current page exist.
sortField and sortOrder properties are available for sorting functionality, for flexibility there is no built-in UI available so that a custom UI can be used for the sorting element. Here is an example that uses a dropdown where simply updating the sortField - sortOrder bindings of the DataView initiates sorting.
Filtering is implemented by defining the filterBy property, match mode parameters and calling the filter function of the component, for flexibility there is no built-in UI available so that a custom UI can be used for the filter element. Available match modes are "contains"(Default), "startsWith", "endsWith", "equals", "notEquals", "in", "lt", "lte", "gt" and "gte". Here is an example that uses an input field. filterBy is a string and multiple fields can be defined with a comma separated list.
As mentioned above, layout options selector, sorting and filtering are baked-in and no strict UI is enforces to make it possible to come up with your own UI elements to enable these features.
DataView has a loading property, when enabled a spinner icon is displayed to indicate data load. An optional loadingIcon property can be passed in case you'd like a different loading icon.
| Name | Type | Default | Description |
|---|---|---|---|
| value | array | null | An array of objects to display. |
| layout | string | list | Layout of the items, valid values are "list" and "grid". |
| paginator | boolean | false | When specified as true, enables the pagination. |
| rows | number | null | Number of rows to display per page. |
| totalRecords | number | null | Number of total records, defaults to length of value when not defined. |
| pageLinks | number | 5 | Number of page links to display in paginator. |
| rowsPerPageOptions | array | null | Array of integer/object values to display inside rows per page dropdown of paginator |
| paginatorPosition | string | bottom | Position of the paginator, options are "top","bottom" or "both". |
| alwaysShowPaginator | boolean | true | Whether to show it even there is only one page. |
| showFirstLastIcon | boolean | true | When enabled, icons are displayed on paginator to go first and last page. |
| paginatorDropdownAppendTo | any | null | Target element to attach the paginator dropdown overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). |
| paginatorDropdownScrollHeight | string | 200px | Paginator dropdown height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value. |
| currentPageReportTemplate | string | ({currentPage} of {totalPages}) | Template of the current page report element. Available placeholders are {currentPage},{totalPages},{rows},{first},{last} and {totalRecords} |
| showCurrentPageReport | boolean | false | Whether to display current page report. |
| showJumpToPageDropdown | boolean | false | Whether to display a dropdown to navigate to any page. |
| showPageLinks | boolean | true | Whether to show page links. |
| lazy | boolean | false | Defines if data is loaded and interacted with in lazy manner. |
| emptyMessage | string | No records found. | Text to display when there is no data. Defaults to global value in i18n translation configuration. |
| style | string | null | Inline style of the component. |
| styleClass | string | null | Style class of the component. |
| trackBy | Function | null | Function to optimize the dom operations by delegating to ngForTrackBy, default algoritm checks for object identity. |
| filterBy | string | null | Comma separated list of fields in the object graph to search against. |
| filterLocale | string | undefined | Locale to use in filtering. The default locale is the host environment's current locale. |
| loading | boolean | false | Displays a loader to indicate data load is in progress. |
| loadingIcon | string | pi pi-spinner | The icon to show while indicating data load is in progress. |
| first | number | 0 | Index of the first row to be displayed. |
| Name | Parameters | Description |
|---|---|---|
| onLazyLoad | event.first = First row offset event.rows = Number of rows per page |
Callback to invoke when paging, sorting or filtering happens in lazy mode. |
| onPage | event.first: Index of first record in page event.rows: Number of rows on the page |
Callback to invoke when pagination occurs. |
| onSort | event.sortField: Name of the sort field. event.sortOrder: Order of the sort. |
Callback to invoke when sorting occurs. |
| onChangeLayout | event.layout: New layout | Callback to invoke when changing layout. |
| Name | Parameters |
|---|---|
| header | - |
| paginatorLeft | - |
| paginatorRight | - |
| gridItem | $implicit: Data of the grid index: Index of the grid |
| listItemTemplate | $implicit: Data of the row index: Index of the row |
| empty | - |
| footer | - |
Following is the list of structural style classes, for theming classes visit theming page.
| Name | Element |
|---|---|
| p-dataview | Container element. |
| p-dataview-list | Container element in list layout. |
| p-dataview-grid | Container element in grid layout. |
| p-dataview-header | Header section. |
| p-dataview-footer | Footer section. |
| p-dataview-content | Container of items. |
| p-dataview-emptymessage | Empty message element. |
PrimeFlex.


{% extends 'base/base.html' %} {% block info-bar %} Verification {% endblock info-bar %} {% block page_header %} BILBY WEB {% if type == 'registration_submitted' %}Registration submitted {% endif %} {% if type == 'email_verify' %}Email address verification {% endif %} {% endblock page_header %} {% block content %} {% if type == 'registration_submitted' %}
Dear {{ data.first_name }} {{ data.last_name }},
To activate your account into the system you need to verify your email address.
We have sent an email to the email address you provided during registration. Please click on the link sent to you via email to verify your email address.
{% endif %} {% if type == 'email_verify' %} {% if data.success %}Thank you very much for verifying your email address.
The account has been activated in the system.
You should now be able to log in the system via login page.
{% else %}Sorry the system could not verify your email address.
The following error occurred during the process
{{ data.message }}
{% endif %} {% endif %} {% endblock content %}


AWS::WorkSpaces::Workspace
The AWS::WorkSpaces::Workspace
resource creates an Amazon WorkSpaces workspace, which is a
cloud-based desktop experience for end users. Before creating a Workspace
in CloudFormation, you must register a Directory Service directory with
Workspaces. This process is documented at Register a Directory with Amazon WorkSpaces. For more information, see the Amazon WorkSpaces Administration Guide.
Syntax
To declare this entity in your AWS CloudFormation template, use the following syntax:
JSON
{ "Type" : "AWS::WorkSpaces::Workspace", "Properties" : { "BundleId" :
String
, "DirectoryId" :String
, "RootVolumeEncryptionEnabled" :Boolean
, "Tags" : [ Tag, ... ], "UserName" :String
, "UserVolumeEncryptionEnabled" :Boolean
, "VolumeEncryptionKey" :String
, "WorkspaceProperties" : WorkspaceProperties } }
YAML
Type: "AWS::WorkSpaces::Workspace" Properties: BundleId:
String
DirectoryId:String
RootVolumeEncryptionEnabled:Boolean
Tags: - Tag UserName:String
UserVolumeEncryptionEnabled:Boolean
VolumeEncryptionKey:String
WorkspaceProperties: WorkspaceProperties
Properties
BundleId
-
The identifier of the bundle from which you want to create the workspace. A bundle specifies the details of the workspace, such as the installed applications and the size of CPU, memory, and storage. Use the DescribeWorkspaceBundles action to list the bundles that AWS offers.
Required: Yes
Type: String
Update requires: Updates are not supported.. To update this property, you must also update another property that triggers a replacement, such as the
UserName
property. DirectoryId
-
The identifier of the AWS Directory Service directory in which you want to create the workspace. The directory must already be registered with Amazon WorkSpaces. Use the DescribeWorkspaceDirectories action to list the directories that are available.
Required: Yes
Type: String
Update requires: Replacement
RootVolumeEncryptionEnabled
-
Indicates whether Amazon WorkSpaces encrypts data stored on the root volume (
C:
drive).Required: No
Type: Boolean
Update requires: Updates are not supported.. To update this property, you must also update another property that triggers a replacement, such as the
UserName
property. Tags
-
The tags (key-value pairs) for the WorkSpace.
Required: No
Type: List of Resource Tag
Update requires: No interruption
UserName
-
The name of the user to which the workspace is assigned. This user name must exist in the specified AWS Directory Service directory.
Required: Yes
Type: String
Update requires: Replacement
UserVolumeEncryptionEnabled
-
Indicates whether Amazon WorkSpaces encrypts data stored on the user volume (
D:
drive).Required: No
Type: Boolean
Update requires: Updates are not supported.. To update this property, you must also update another property that triggers a replacement, such as the
UserName
property. VolumeEncryptionKey
-
The AWS Key Management Service (AWS KMS) key ID that Amazon WorkSpaces uses to encrypt data stored on your workspace.
Required: No
Type: String
Update requires: Updates are not supported.. To update this property, you must also update another property that triggers a replacement, such as the
UserName
property. WorkspaceProperties
-
The WorkSpace properties.
Required: No
Type: Amazon WorkSpaces Workspace WorkspaceProperties
Update requires: No interruption
Return Values
Ref
When the logical ID of this resource is provided to the Ref
intrinsic
function, Ref
returns the resource name.
For more information about using the Ref
function, see Ref.
Example
The following example creates a workspace for user test
. The bundle and
directory IDs are specified as parameters in the same template.
JSON
"workspace1" : { "Type" : "AWS::WorkSpaces::Workspace", "Properties" : { "BundleId" : {"Ref" : "BundleId"}, "DirectoryId" : {"Ref" : "DirectoryId"}, "UserName" : "test" } }
YAML
workspace1: Type: "AWS::WorkSpaces::Workspace" Properties: BundleId: Ref: "BundleId" DirectoryId: Ref: "DirectoryId" UserName: "test"


In linear algebra, a rotation matrix is a matrix that is used to perform a rotation in Euclidean space. For example, using the convention below, the matrix.
| Cos(Θ) | -Sin(Θ) |
| Sin(Θ) | Cos(Θ) |
This matrix rotates points in the xy-plane counterclockwise through an angle θ about the origin of the Cartesian coordinate system. To perform the rotation using a rotation matrix R, the position of each point must be represented by a column vector v, containing the coordinates of the point. A rotated vector is obtained by using the matrix multiplication Rv.
As previously seen, in the example:
| X' |
| Y' |
| Cos(Θ) | -Sin(Θ) |
| Sin(Θ) | Cos(Θ) |
| X |
| Y |
This operation the same as writing the following formulas :
A basic rotation (also called elemental rotation) is a rotation about one of the axes of a Coordinate system. The following three basic rotation matrices rotate vectors by an angle θ about the x, y, or z axis, in three dimensions, using the right-hand-rule which codifies their alternating signs. It's very important for you to familiarize yourself with the right-hand-rule because these matrices can be taken as clockwise or counter-clockwise and it is important to have a commune convention when working with others.
The following example shows a rotation of θ = 90 done around the Z-axis.
As expected, a vector facing the X-axis, when rotated around the Z-axis by 90 degrees, is now facing the Y-axis.
When we are required to use multiple elementary rotations, we need to find a way to combine these rotations in a simpler format. Again using matrices for this purpose really simplifies things enormously.
For example, let's say we need to rotate a reference frame by the Y axis followed by the Z axis, as shown in the below picture.
In order to achieve this multiple rotation matrix, we simply need to figure out by how much we need to rotate each axis and simply multiple them.
Now we have a combination of elementary rotations which is in a very compact format. And all we need to do to go from reference frame A to B is to calculate B = R*A
Now it's your turn to practice! Please go to the next page in order to find some practice examples.


Try it!
The first version of our service is ready. It is still an alpha release so if you would encounter any unexpected behaviour feel free to contact us.
our Services
Identification
Thanks to our unique AI algorithm, we are able to quickly identify your scalp characteristic and the problem you are facing.
Evaluation
Choose between hundreds of different products and find the most suitable for you.
Customize
Customize your search in order to fulfill every single need you have.
History
Check the history of your scalp evolution and keep track of your progress.
Our team
Lorenzo Cavada
Hi. I'm Lorenzo Cavada I'm an ICT student. I work on the website of the project.
Olga Iasson
Hi, I'm Olga Iasson I'm studying Economics and Business Law. I cooperate with the team especially as regards the economic side of the project.
Lucrezia Tosato
Hi. I'm Lucrezia Tosato I'm an ICT student with a specialisation in advance image understanding. I am the coordinator and editing manager.
Remi' Chierchia
Hi, I'm Remì Chierchia, I'm studying Visual Computing Communication. I cooperated in the general development of the project till now.
Ádám Orosz
Hi, I'm Ádám Orosz I am an Autonomous Systems student with experience in Robotics and Unity development. I work on the app of the project.
Iwona Podsiadlo
Hi I am Iwona Podsiadlo, I am PhD student at the Remote sensing Laboratory, University of Trento. I am responsible for your Hair image processing and AI.