Centro Estadual de Educação Tecnológica Paula Souza Faculdade

Transcrição

Centro Estadual de Educação Tecnológica Paula Souza Faculdade
Centro Estadual de Educação Tecnológica Paula Souza
Faculdade de Tecnologia da Zona Sul
Curso Superior de Tecnologia em
Análise e Desenvolvimento de Sistemas
BLACKBOARD
Como desenvolver aplicativos para o Firefox OS
Nicholas Camp Barcellos
RA 1370481111242
São Paulo
2014
2
SUMÁRIO
Introdução …............................................................................................................... 3
Metodologia …............................................................................................................ 4
1. Primeiros passos .................................................................................................... 5
2. Organização do ambiente …................................................................................... 6
3. Desenvolvendo o Blackboard ............................................................................... 10
Conclusão ................................................................................................................. 22
Referências .............................................................................................................. 23
3
INTRODUÇÃO
O Firefox OS é um novo Sistema Operacional desenvolvido pela Mozilla & sua
comunidade de desenvolvedores para dispositivos móveis. É baseado no
navegador Mozilla Firefox e em tecnologias livres e abertas, como HTML, CSS,
JavaScript e Linux.
Ter o seu aplicativo em múltiplos sistemas operacionais costumava ser algo
trabalhoso. Cada um deles possui sua linguagem – Java no Android, Objective C no
iOS. Desta forma, para a criação de aplicativos nativos, era preciso pensar também
em como portabilizar o código para as outras plataformas. O paradigma do Firefox
OS mostra que a web é a plataforma, sendo assim, aplicativos devem ser instalados
no dispositivo a partir dela mesma. São conhecidos como aplicativos da web aberta,
open web apps.
Este trabalho trata de explicar como cadastrar um aplicativo no Firefox Marketplace
passo a passo, descrevendo todo o processo até esta etapa: desde os recursos
utilizados (como um framework de front-end, biblioteca utilizada que facilita o início
da codificação e fontes baixadas de “baús” de fontes) até os códigos escritos.
4
METODOLOGIA
Este trabalho foi feito através do levantamento de diversos materiais e artigos
disponíveis na internet a respeito do Firefox OS e da criação/conversão de
aplicações em aplicativos. Artigos principalmente da Mozilla Developer Network
(https://developer.mozilla.org/).
Até o momento no qual foi escrito, haviam poucas informações e materiais na
internet disponíveis para criação de um aplicativo, do início ao fim, para o Firefox
OS, tal qual é o objetivo deste trabalho. Além disso, com a introdução da internet
móvel em mercados emergentes com o Firefox OS, este documento, por explicar
detalhadamente cada módulo do aplicativo, pode vir a ser o primeiro contato com o
desenvolvimento de ideia/projeto/conteúdo/código com a web.
Há disponível no Firefox Marketplace alguns milhares de aplicativos, quantidade
ainda bastante pequena, se comparada ao milhão disponível nos Sistemas
Operacionais Android e iOS. Este documento visa também a popularização do
desenvolvimento da web e de aplicativos da web aberta.
5
1. PRIMEIROS PASSOS
Antes de começar a desenvolver um aplicativo, é necessário ter uma ideia do que
gostaria de ser feito. Essa ideia pode vir observando o funcionamento de outros
aplicativos, procurando funcionalidades não disponíveis no dispositivo, no banho ou
durante uma conversa.
Tendo a ideia, passa-se à etapa de desenvolvimento. Aplicativos para o Firefox OS
são feitos assim como páginas da web: com HTML (Hyper Text Markup Language),
CSS (Cascading Style Sheets) e JS (JavaScript). HTML é linguagem de marcação
de conteúdo, CSS, de estilização, e JS, de manipulação. Além destas, é
importantíssimo conhecimento intermediário de inglês.
Essas são as linguagens que precisa-se aprender a “falar” para desenvolver
aplicativos para o Firefox OS e para a web. Este trabalho tem como intuito caminhar
pelas etapas de desenvolvimento de um aplicativo, neste caso o Blackboard.
6
2. ORGANIZAÇÃO DO AMBIENTE
Como aplicativos para o Firefox OS são feitos utilizando HTML, CSS e JS, utiliza-se
um modelo, um template, para basear a aplicação e evitar repetição de código a
cada novo projeto. Como ainda não há um modelo específico para o Firefox OS,
pode-se usar o HTML5 Boilerplate (http://www.html5boilerplate.com/). É a mesma
base que muitos desenvolvedores front-end (aquele que mexe com HTML, CSS e
JS – que trabalha a interface) utilizam para desenvolver sites.
Abrindo o modelo, vemos a seguinte estrutura:
Figura 1: Estrutura do HTML5 Boilerplate
Fonte: Colaborado pelo autor, 2014
A pasta doc pode ser apagada, pois contém manual do modelo HTML5 Boilerplate
(não requerido pelo aplicativo). Nas pastas css, img e js ficarão, respectivamente, o
CSS, as imagens e o JS. O Blackboard não utilizará os arquivos 404.html, appletouch-icon-precomposed.png,
CHANGELOG.md,
CONTRIBUTING.md,
7
crossdomain.xml, LICENSE.md, README.md e robots.txt; podem ser deletados.
Juntamente com todos os arquivos da pasta js – o JS será escrito desde o ínicio. Na
pasta css, copiar o conteúdo do arquivo normalize.css (serve para dar consistência
de renderização aos elementos entre navegadores. Semelhante aos CSS reset) e
colar no início do main.css. Dessa forma usa-se menos uma requisição, a qual é
custosa
para
o
navegador
(mais
informações:
https://stackoverflow.com/questions/9855545/http-requests-vs-file-size).
Feito, abrir a index.html com um editor de código. O autor utiliza o Sublime Text 3
(http://www.sublimetext.com/3). Remover os if da tag html – necessários somente
ao desenvolvimento para o Internet Explorer. Deixar somente <html>. As referências
ao normalize e ao modernizr não são necessárias – o normalize foi agregado ao
main.css e o modernizr, utilizado para detectar funcionalidades dos navegadores,
não será utilizado.
Definir o <title> como Blackboard e apagar todo o conteúdo dentro do body. A
página está assim:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Blackboard</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="css/main.css">
</head>
<body></body>
</html>
Agora, para transformar o pacote num aplicativo para o Firefox OS, basta criar, na
raiz do projeto, ao lado da index.html, o manifest.webapp:
{
"name": "Blackboard",
"description": "Paint the board",
"launch_path": "/index.html",
"icons": {
"128": "/img/icon-128.png"
},
"developer": {
8
"name": "Nicholas Camp Barcellos",
"url": "http://nicholascamp.com.br"
},
"default_locale": "en"
}
Este arquivo especifica as informações do aplicativo e do autor, tais como nome,
descrição, ícone e contato com o desenvolvedor. Sendo assim, temos um aplicativo.
Mais informações e outros parâmetros de especificação do App Manifest podem ser
encontrados
aqui:
App
manifest
https://developer.mozilla.org/en-
US/Apps/Build/Manifest.
A partir da versão 26 do navegador Mozilla Firefox, é possível simular o Firefox OS
dentro dele. Para isso, basta ir em configurações (ícone ≡, no canto direito superior),
desenvolvedor e gerenciador de aplicativos. Lá há opção de conectar seu Firefox OS
ou rodar o simulador. Neste trabalho, faz-se a última opção.
Aberto o simulador do Firefox OS, tem-se a interface do Sistema Operacional, com
grande parte de suas funcionalidades, tais como navegador, mensagens, relógio,
configurações. Pode-se inclusive fazer a instalação de aplicativos. Para isso, voltar
para a janela anterior (que abriu o simulador), clicar na aba Apps e adicionar a pasta
aonde se encontra o aplicativo. Assim, o aplicativo é instalado e seu ícone aparece
ao lado dos outros no simulador:
9
Figura 2: Blackboard instalado no
simulador
Fonte: Colaborado pelo autor, 2014
10
3. DESENVOLVIMENTO DO APLICATIVO
O Blackboard é uma lousa. Suas funcionalidades consistem em pintá-la com
diversas cores e mudar a grossura da linha. Agora se trata de desenvolver essas
funcionalidades.
Introduzir no body a tag canvas, com id e class blackboard. id para manipular o
JavaScript, class para o CSS. Em HTML5, a tag canvas é responsável por
renderizar gráficos e outras imagens. No Blackboard, é a própria lousa.
No CSS, definir para a classe blackboard background: #000. Tem-se então uma
lousa preta. Criar script chamado blackboard.js na pasta js. Inserir no HTML a tag
script e apontar o atributo src para o arquivo recém criado. Inserir então no arquivo
o objeto app, responsável pela estruturação das propriedades e métodos do
aplicativo:
var app = {
blackboard: document.getElementById('blackboard'),
ctx: this.blackboard.getContext('2d'),
lineColor: '#fff', // default color
lineThickness: 4,
ongoingTouches: [], // touches in-progress
startup: function () {
app.blackboard.width = window.innerWidth;
app.blackboard.height = window.innerHeight;
app.blackboard.addEventListener('touchstart', handleTStart, false);
// app.blackboard.addEventListener('touchcancel', handleTCancel,
false);
app.blackboard.addEventListener('touchmove', handleTMove, false);
app.blackboard.addEventListener('touchend', handleTEnd, false);
app.blackboard.addEventListener('touchleave', handleTEnd, false);
}
}
document.addEventListener('DOMContentLoaded', app.startup);
11
Foi definido a propriedade blackboard, que captura a tag canvas pelo id. ctx define
o contexto 2d da lousa, no qual desenha-se. LineColor e lineThickness definem a
cor e a grossura da linha, respectivamente.
ongoingTouches para registrar os toques, trabalhado e, em seguida, startup, método
de inicialização da aplicação, que define a largura e altura da lousa para a largura do
dispositivo e adiciona EventListeners de toque à app.blackboard.
Em JavaScript, manipula-se os eventos de toque – iniciar, cancelar, mover, terminar
e deixar – com os EventListeners touchstart, touchcancel, touchmove, touchend e
touchleave, respectivamente. Então, depois que o documento estiver carregado
(DOMContentLoaded), executa-se a função startup de app.
Agora é necessário definir as 3 funções adicionadas aos eventos de toque,
handleTStart, handleTMove e handleTEnd. handleTStart():
function handleTStart(evt) {
evt.preventDefault();
var touches = evt.changedTouches;
var i = 0;
var len = touches.length;
for(; i < len; i++) {
app.ongoingTouches.push(touches[i]);
app.ctx.beginPath();
app.ctx.arc(touches[i].pageX, touches[i].pageY, app.lineThickness, 0,
2*Math.PI, false); // a circle
app.ctx.fillStyle = app.lineColor;
app.ctx.fill();
}
}
A primeira linha da função impede a ação padrão do toque (caso fosse um botão,
preveniria a mudança de página, ou limpar campos de um formulário, etc). A variável
touches registra por meio de um identificador único todos os dados referente a cada
toque (se o dispositivo suporta múltiplos toques – múltiplos objetos dentro da
variável, que é um array de objetos –, será criado um para cada toque). A ordem dos
toques, que começa em 0, é estabelecida de acordo com o contato de cada toque
simultâneo na tela.
12
Após temos as variáveis i e len, cacheadas para otimizar a performance do laço
for. Nele, itera-se (inicia e termina o laço, recomeçando-o) por cada touches, e, a
seguir, a explicação de cada linha deste laço:
1. adiciona-se a app.ongoingTopuches o objeto do toque em questão (o qual
contém todas suas informações);
2. beginPath() cria um novo caminho a ser desenhado;
3. arc() cria um arco, no caso, um círculo: o primeiro parâmetro representa o
ponto x onde o arco começará a ser traçado, o segundo, o ponto y, o terceiro,
o raio, o quarto, o ângulo inicial, o quinto, o ângulo final e, finalmente, o sexto,
boolean referente ao sentido dos ponteiros do relógio – anti-horário,
verdadeiro, horário, falso;
4. fillStyle é usado para determinar uma cor para o path;
5. E fill() é usado para preencher a área do path.
Assim, quando clicamos na tela, desenha-se pontos (ainda que não segmentados)
brancos (que é a cor definida em app.lineColor):
13
Figura 3: Pontos brancos
desenhados na tela
Fonte: Colaborado pelo autor, 2014
Terminada handleTStart(), para a função handleTMove(). Até o laço for da função,
foi definido o mesmo que em handleTStart(), portanto, para breviedade, expõe-se
somente o conteúdo dentro do for:
var idx = ongoingTouchIndexById(touches[i].identifier);
// There's a touch?
if(idx >= 0) {
app.ctx.beginPath();
app.ctx.moveTo(app.ongoingTouches[idx].pageX,
app.ongoingTouches[idx].pageY);
app.ctx.lineTo(touches[i].pageX, touches[i].pageY);
app.ctx.lineWidth = app.lineThickness;
app.ctx.strokeStyle = app.lineColor;
app.ctx.stroke();
app.ongoingTouches.splice(idx, 1, touches[i]);
// swap in the new touch
record
}
Fora do escopo da função, ongoingTouchIndexById(), função usada por idx:
function ongoingTouchIndexById(idToFind) {
var i = 0;
var len = app.ongoingTouches.length;
for(; i < len; i++) {
14
var id = app.ongoingTouches[i].identifier;
if (id === idToFind) {
return i;
}
}
return -1; // not found
}
A função ongoingTouchIndexById() captura o idenficador único do touch em questão
(idToFind)
para
abstrair
suas
informações,
que
estão
armazenadas
em
app.ongoingTouches, sendo armazenado na variável idx. Como é um array, inicia do
zero, por isso a verificação do if >= 0. Então temos:
1. o início do path;
2. a movimentação do dedo representada pelo método moveTo(), que pede os
eixos x e y;
3. lineTo(), que pede os mesmos eixos x e y, ou seja, é feita uma linha do
ponto anterior até o ponto atual;
4. lineThickness(), que define a largura da linha;
5. strokeStyle(), que define a cor do preenchimento;
6. stroke(), que preenche a linha com a estilo definido;
7. o método splice(), que troca o ponto idx anterior pelo novo touches[i].
A função handleTEnd() também tem o mesmo início das anteriores; difere o
conteúdo do for:
var idx = ongoingTouchIndexById(touches[i].identifier);
// There's a touch?
if(idx >= 0) {
app.ctx.beginPath();
app.ctx.moveTo(app.ongoingTouches[idx].pageX,
app.ongoingTouches[idx].pageY);
app.ctx.lineTo(touches[i].pageX, touches[i].pageY);
app.ctx.arc(touches[i].pageX, touches[i].pageY, app.lineThickness / 2, 0, 2
* Math.PI, false);
app.ctx.fillStyle = app.lineColor;
app.ctx.fill();
app.ongoingTouches.splice(idx, 1); // remove it; we're done
15
}
idx captura o idenficador único do touch em questão, passado o if, temos o início
do path, a movimentação e a linha até o ponto, o arco (círculo, como definido em
handleTStart()), preenchendo-o com a cor definida, e então, a remoção do ponto
com o método splice(), fechando o ciclo.
Agora é possível desenhar continuamente na lousa!
Figura 4: Desenhando na lousa
Fonte: Colaborado pelo autor, 2014
A próxima etapa é adicionar cores à Blackboard. Adicione ao body uma lista com o
atributo data-color com as cores que você desejar:
<ul id="colors" class="colors">
<li data-color="#FFFFFF"></li>
<li data-color="#CCCCCC"></li>
<li data-color="#000000"></li>
<li data-color="#C90000"></li>
<li data-color="#2111B9"></li>
<li data-color="#01AC11"></li>
<li data-color="#FFFF00"></li>
<li data-color="#005ED2"></li>
<li data-color="#E65700"></li>
<li data-color="#9E005D"></li>
<!-- <li class="more-colors">+</li> -->
</ul>
16
Para estilizá-la:
.colors { bottom: 3%; left: 3%; margin: 0 0 -5px -5px; padding: 0; position:
absolute; }
.colors li { border: 1px solid #666; border-radius: 50%; cursor: pointer;
display: inline-block; height: 12px; margin: 5px; width: 12px; }
Dessa forma temos ícones redondos lado a lado. Adicionar a app.startup a
chamada à função colors(), definida a seguir:
function colors() {
var colors = document.getElementById('colors');
var li = colors.getElementsByTagName('li');
var i = 0;
var len = li.length;
for(; i < len; i++) {
var color = li[i].getAttribute('data-color');
li[i].style.backgroundColor = color;
}
colors.addEventListener('click', function (evt) {
var color = evt.target.getAttribute('data-color');
app.lineColor = color;
});
}
Faz-se referência à lista de cores nas duas primeiras variáveis, itera-se sobre cada
uma delas no laço, aonde captura-se o atributo data-color da li e o adiciona ao
backgroundColor. Fora do laço, adiciona-se um EventListener de click à lista, aonde
captura-se o atributo data-color do objeto clicado e atribui-o à cor da linha.
Legal, não é? Agora é possível mudar a cor do tracejado.
17
Figura 5: Desenhando com várias
cores
Fonte: Colaborado pelo autor, 2014
Blackboard está quase pronta, falta adicionar a funcionalidade de mudar a grossura
da linha. Para isso, adiciona-se o elemento de lista não ordenada, ul, ao documento:
<ul class="line-thickness">
<li id="thinner-line" class="thinner-line"></li>
<li id="thicker-line" class="thicker-line"></li>
</ul>
E o CSS, para posicioná-lo no canto direito superior:
.colors { bottom: 3%; left: 3%; margin: 0 0 -12px -5px; padding: 0; position:
absolute; }
.colors li, .line-thickness li { border: 1px solid #333; border-radius:
50%; cursor: pointer; display: inline-block; height: 12px; margin: 5px; width:
12px; }
.line-thickness { margin: -7px -5px 0 0; padding: 0; position: absolute; right:
3%; top: 3%; }
.line-thickness li { background: url(../img/line-thickness.png); backgroundsize: 24px; }
.line-thickness .thicker-line { background-position: right 0; }
Foi adicionado uma imagem para representar o tracejado menor e maior. A junção
de
uma
ou
mais
imagens
em
uma
chama-se
sprite
(http://www.maujor.com/tutorial/css-sprites.php) – serve para economizar requisições
18
de arquivos. Foi utilizado background-size para diminuir o tamanho da imagem em
relação ao tamanho do círculo, 12x12px. Esta é a imagem utilizada para representar
o tracejado menor e maior, respectivamente:
Figura 6: line-thickness.png
(ampliada)
Fonte: Colaborado pelo
autor, 2014
Agora o JavaScript:
function lineThickness() {
var plusBtn = document.getElementById('thicker-line');
var lessBtn = document.getElementById('thinner-line');
plusBtn.addEventListener('click', function () {
console.log('+1');
app.lineThickness += 1;
});
lessBtn.addEventListener('click', function () {
if (app.lineThickness > 1) {
console.log('-1');
app.lineThickness -= 1;
}
});
}
19
Figura 7: Funcionalidade de
espessura da linha implementada
Fonte: Colaborado pelo autor, 2014
Captura-se os elementos de aumentar e diminuir a espessura da linha e adiciona-se
EventListeners de clique, que aumentam e diminuem o valor de app.lineThickness.
Lembre-se de adicionar à app.startup a chamada à função, como em colors().
Pronto! Pode-se terminar por aqui. Mas pode-se ainda escrever o nome do
Blackboard no canto esquerdo superior e, ao mudar a cor da linha, mudar o nome da
cor em Blackboard, ou seja, mudando para branco, tem-se escrito Whiteboard.
Assim tem-se uma representação da cor ativa do Blackboard.
Para isso, precisamos adicionar o título Blackboard ao documento, buscar uma fonte
adequada, embuti-la no CSS, alterar a função colors() e adicionar os nomes das
cores à lista de cores.
<h1><span id="color-board">Black</span>board</h1>
Adicionada a logo ao body. Nenhuma fonte padrão do sistema representou bem o
Blackboard, então foi buscada uma em FontSquirrel: HVD Comic Serif Pro
http://www.fontsquirrel.com/fonts/HVD-Comic-Serif-Pro. Baixar somente o formato
woff, formato livre, que é usado pelo Firefox. Criar uma pasta chamada font na raiz
do aplicativo e adicionar a fonte à ela.
20
Adicionar o CSS gerado ao main.css, excluir os src não utilizados (.eot, .svg, etc) e
mudar a url de acordo com a pasta aonde se encontra a fonte:
@font-face {
font-family: 'HVD Comic';
src: url('../font/HVD_Comic_Serif_Pro-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
Adicionar também o CSS para o título:
h1 { color: #000; font: 30px/1 'HVD Comic', sans-serif; left: 3%; margin: 0;
position: absolute; text-shadow: 0 0 1px #ddd; top: 2%; }
Figura 8: Logo do aplicativo
Fonte: Colaborado pelo
autor, 2014
Agora, adicionar os respectivos nomes das cores à lista de cores:
<li
<li
<li
<li
<li
<li
<li
<li
<li
<li
data-color="#FFFFFF"
data-color="#CCCCCC"
data-color="#000000"
data-color="#C90000"
data-color="#2111B9"
data-color="#01AC11"
data-color="#FFFF00"
data-color="#005ED2"
data-color="#E65700"
data-color="#9E005D"
data-name="White"></li>
data-name="Grey"></li>
data-name="Black"></li>
data-name="Red"></li>
data-name="Blue"></li>
data-name="Green"></li>
data-name="Yellow"></li>
data-name="LightBlue"></li>
data-name="Orange"></li>
data-name="Pink"></li>
No JavaScript é preciso capturar também o atributo data-name e escrevê-lo no
span#color-board, da logo. As linhas adicionadas à função para isso estão em
negrito:
function colors() {
var colorNameInLogo = document.getElementById('color-board');
var colors = document.getElementById('colors');
var li = colors.getElementsByTagName('li');
21
var i = 0;
var len = li.length;
for(; i < len; i++) {
var color = li[i].getAttribute('data-color');
li[i].style.backgroundColor = color;
}
colors.addEventListener('click', function (evt) {
var color = evt.target.getAttribute('data-color');
var name = evt.target.getAttribute('data-name');
app.lineColor = color;
colorNameInLogo.innerHTML = name;
colorNameInLogo.style.color = color;
});
}
Agora, quando a cor da linha é alterada, é alterada também o nome da cor em
Blackboard. O Blackboard, independentemente da cor ativa, continua preta, porém
representa, por meio da logo, visual e textualmente a cor da linha ativa. Assim,
terminamos o aplicativo.
Figura 9: Desenhando com o
Blackboard
Fonte: Colaborado pelo autor, 2014
Dica: para salvar o desenho utilizando o Firefox OS, pressione o botão de travar a
tela simultaneamente com o botão de início.
22
O Blackboard pode ser encontrada no Firefox Marketplace. Este trabalho, assim
como
o
aplicativo,
é
código
aberto,
https://github.com/nicholascamp/Blackboard.
e
está
disponível
no
Github:
23
CONCLUSÃO
O Firefox OS é um Sistema Operacional produto da web, que veio trazer a web livre
para os dispositivos móveis. Utiliza, em si e em seus aplicativos, as mesmas
tecnologias de desenvolvimento de aplicativos que a web utiliza para desenvolver
sites. Não há um filtro, um impecílio, uma outra linguagem pela qual o aplicativo tem
que passar, diferentemente dos Sistemas Operacionais concorrentes.
Como o Firefox OS utiliza tecnologias livres e abertas, já conhecidas por
desenvolvedores web, é fácil populá-lo de aplicativos e melhorá-lo. A beleza do
Sistema Operacional se vê em sua extensionalidade. Além dos aplicativos serem
feitos utilizando estas tecnologias livres, toda a interface gráfica também é, portanto
trata-se de algo facilmente expansível e customizável.
Foi visto neste documento que, tecnicamente, não é algo de dificuldade elevada
desenvolver aplicativos para o Sistema Operacional e, inclusive, não requer muita
habilidade e conhecimento em programação. Sendo assim, basta interesse e
curiosidade para desenvolver aplicativos. Mais pra frente, pode vir a tornar-se um
grande Sistema Operacional, utilizado tanto em dispositivos móveis (óculos,
celulares e tabletes), quanto nos fixos (computadores de mesa, geladeiras e
televisões).
24
REFERÊNCIAS
Mozilla Developer Network. Touch events. Disponível em:
https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Touch_events. Acesso
em: 12/04/14.
Mozilla Developer Network. TouchEvent. Disponível em:
https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent. Acesso em: 13/04/14
Mozilla Developer Network. EventListener. Disponível em:
https://developer.mozilla.org/en-US/docs/Web/API/EventListener. Acesso em:
14/04/14
Mozilla Developer Network. Touch. Disponível em: https://developer.mozilla.org/enUS/docs/Web/API/Touch. Acesso em: 15/04/14
Mozilla Developer Network. App manifest. Disponível em:
https://developer.mozilla.org/en-US/Apps/Build/Manifest. Acesso em: 16/04/14
Mozilla Developer Network. Drawing Shapes. Disponível em:
https://developer.mozilla.org/enUS/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes. Acesso em: 17/04/14
Font Squirrel. Disponível em: http://www.fontsquirrel.com/. Acesso em: 28/04/14