felipe n. moura

Working with web development for about 12 years, also giving talks and trainings.
Felipe is a founder and owner at Nasc. He is a founder/organiser of BrazilJS, FrontInPoa and RSJS conferences.
Felipe is a Google Developer Expert (GDE) in Web Technologies, as well.

JavaScript and Front End developer and enthusiast.

Open Source projects taught me a lot, and inspired me to start projects from my own.

I am graduated at Senac/RS, a technician from CTT Maxwell, Project Manager by PMTech and have some different specialization courses.
Actually, I have worked on McDonalds, was an alxiliar of a baker, worked on a super market, on a warehouse...but it doesn't really matter now :p

An advice?
Do it because you love it!
Be passionate to learning and creating new things!
I work with web development for almost a decade, and nowadays I work at Terra as a Senior Development Analyst.
Also, I love giving talks in conferences and enjoy giving trainings(I enjoy being an attendee, too!).

Among my projects, you can find Power-polygon, theWebMind, Botaoteca, PHPDevBar and of course, I am an organizer of the RSJS and BrazilJS.
Conferences, the first Brazilian JavaScript Conference, also, the biggest one in Latin America, and one of the biggest in the world!
With the same name, the BrazilJS Foundation.

Changing the world is the least I expect from myself Myself

Accessibility!

In this talk, we discuss about accessibility on the web, and how to make the best use of web technologies to make it better.

CSS Animation

Meet some of the greatest techniques to animate and optimize animations using CSS3.
Besides that, also some interesting techniques to use and combine with your HTML.

Learn ES6

Start learning ES6 now, try and run some code, see how to transpile, understand the differences from the previous version of JavaScript.
This is a talk full of code and examples.

What is that all for?

Cool new technologies are great! But how can we really use them? Lets see cool and creative ways to combine techniques and tecnologies to build incredible stuff, using the latest features of HTML5, JavaScript and CSS3.

The web, as interface

An interface is what is between people, and how they reach their goals...nowadays, web is part of it!
Let's make some comparizons with real world, check some techniques to have better interfaces for users, some classic mistakes and good practices.

A Power Polygon parallax demo

This talk is a demo presentation using some of the Power Polygon features.
FWorld: Sozinhos

FWorld: Sozinhos

Sabe aquele sentimento de solidão? Que estamos sozinhos no mundo? Mas hoje em dia, não fazemos NADA sozinhos...sério! Descubra algumas pessoas ou coisas que estiveram mais isolados, que se tenha notícia, e também, uma forma de nunca mais se sentir realmente sozinho neste mundo!
Matéria na Record sobre a BrazilJS 2014

Matéria na Record sobre a BrazilJS 2014

A TV Record foi até a BrazilJS este ano, para fazer uma cobertura sobre o evento e coletar algumas entrevistas. O material ficou bem legal e muito bem produzido! Saímos no ar, no jornal das 19 horas, no dia 21 em TV Aberta.
Entrevista Jaydson & Felipe sobre o BrazilJS - Programa Tudo Mais TVCom

Entrevista Jaydson & Felipe sobre o BrazilJS - Programa Tudo Mais TVCom

Entrevista feita com os organizadores do BrazilJS (Jaydson Gomes e Felipe Moura) no programa Tudo Mais da TVCom, canal da RBS de Porto Alegre. Na entrevista, os organizadores falam sobre a linguagem JavaScript e sobre o BrazilJS 2012.
Matéria no Gabinete Digital sobre o BrazilJS

Matéria no Gabinete Digital sobre o BrazilJS

O Gabinete Digital esteve no BrazilJS e fez uma série de mini-entrevistas com alguns participantes, e com os organizadores do evento, Jaydson Gomes e Felipe Moura.
Por que eu amo a web

Por que eu amo a web

É difícil explicar este sentimento, mas é o que tento fazer em 5 minutos neste video que a W3C/Nic.br pediu para a WebBR 2014.
Review: LG G3 após 1 mês de uso (português pt-br)

Review: LG G3 após 1 mês de uso (português pt-br)

Review do LG G3 que fiz após um mês de experiência usando ele. Veja algumas vantagens e desvantagens que encontrei no aparelho, usando-o no dia-a-dia. Sou um "heavy user", usando várias apps, redes sociais, e configurando e personalizando bastante coisa, também. Neste video, mostro a interface padrão, mas atualmente utilizo launchers e diallers. Até então, estão rodando sem problemas. Caso queira conhecer alguns dos launchers mais conhecidos para Android, assista a este outro vídeo, em que demonstro um pouco como cada uma funciona, e seus prós e contras: 7 Launchers (homes) Android: https://www.youtube.com/watch?v=Im9b98P5-Vw
Experiment/Talk: Chroma key in JS - live code at W3C WebBR 2012

Experiment/Talk: Chroma key in JS - live code at W3C WebBR 2012

During the W3C's WebBR-2012 I had the opportunity to give two talks. This talk had no slides, just live coding! We built in one hour, with just 100 JavaScript lines of code, a chroma key effect with Open Web Technologies, such as HTML5 and CSS3. To do that, we used canvas, html5 video and the user's camera(user media). And also, a lot of math! The source code and running demo is on github: https://github.com/felipenmoura/js-chroma-key
3D CG - The tower with flag

3D CG - The tower with flag

This is the 5th time I take a day off, to learn 3D stuff. Studying and mixing some of the learned lessons, I managed to build this, using wind, tissue, array transforms, lights, WAY more polygons, and texture effects! It took 2.5 days rendering! The tool used was Bender with Cycles.
Experiment: HTML5 Image Editor

Experiment: HTML5 Image Editor

See it working at: http://felipenmoura.org/labs/html5-imager/ This tool helps you changing the hue and saturation of images, as well as it can be used as a color picker. You can also pick a color, and remove all the pixels in the image that correspond to that color. Check this out on github: https://github.com/felipenmoura/html5-imager
20 dias com o LG G4 - Review de usuário do celular (português pt-br)

20 dias com o LG G4 - Review de usuário do celular (português pt-br)

Após 20 dias de uso, do LG G4, fiz este video review do aparelho contando minha experiência como usuário! Falo sobre algumas vantagens e desvantagens do aparelho, dificuldades enfrentadas e destaco alguns pontos bastante positivos. Me considero um "heavy user" pois uso diversas apps, muitas ao mesmo tempo, além de testar novos launchers e diallers, estar conectado em muitas redes sociais e configuro muita coisa do meu jeito. Neste vídeo, porém, mostro a interface e funcionalidades padrão do aparelho.
Vibe.js

Vibe.js

Create and test vibrate patterns in a visual tool generating code to use with the JavaScript's vibrate API.

Github
See it working
Tool: HTML5 Image Editor

Tool: HTML5 Image Editor

This tool helps you changing the hue and saturation of images, as well as it can be used as a color picker. You can also remove all the pixels in the image based on a color.

Github
See it working
Game: Test your markup

Game: Test your markup

An HTML, CSS and JavaScript based game.
Test your knowledge about HTML tags in a fun way.
It's also great to practice and learn, as well.

Github
See it working
Experiment: ChromaKey in JavaScript

Experiment: ChromaKey in JavaScript

Chroma key effect using HTML, CSS and JavaScript.
I used canvas, html5 video and the user's camera(user media).

Github
See it working
Experiment: Stereoscopic 3D using JS, HTML and CSS

Experiment: Stereoscopic 3D using JS, HTML and CSS

A video where I demonstrate an experiment of mine, applying Stereoscopic 3D to a webpage using HTML, CSS and JavaScript.

See it working
Experiment: CSS3 3D environment tool

Experiment: CSS3 3D environment tool

This is the Root3D, a CSS3, 3D environment, for you to build some cool 3D groups

Github
See it working
Chrome Summit 2016

Chrome Summit 2016

Took this picture during the Chrome Summit 2016, in San Francisco.
Google São Paulo - 2016

Google São Paulo - 2016

After my talk at Goole São Paulo, in 2016
BrazilJS 2015

BrazilJS 2015

Final picture of BrazilJS 2015, in Porto Alegre
Watching a talk

Watching a talk

This is me, sitting on stage behind the courtains, watching a talk in BrazilJS 2013.
Fisl 2012

Fisl 2012

Picture from a talk I gave about CSS3, in 2012.
Presenting at BrazilJS 2012

Presenting at BrazilJS 2012

On stage, presenting at BrazilJS, in 2012
Me, Jaydson and Brendan Eich at BrazilJS 2012

Me, Jaydson and Brendan Eich at BrazilJS 2012

In 2012, we invited Brendan Eich to give a talk at Brazil for the first time, and he accepted!
Great experience!
Dougals Crockford and I at BrazilJS 2013

Dougals Crockford and I at BrazilJS 2013

In 2013, we could bring Douglas Crockfor to give an awesome talk at BrazilJS.
On stage, at BrazilJS 2013

On stage, at BrazilJS 2013

Jaydson and I on stage at BrazilJS 2013

Jaydson and I on stage at BrazilJS 2013

Closing BrazilJS 2013 with the audience

Closing BrazilJS 2013 with the audience

Jaydson and I closing BrazilJS 2013 with the audience, behind us.
Jaydson and I, at BrazilJS 2013

Jaydson and I, at BrazilJS 2013

Picture taken on BrazilJS 2013, alongside with Jaydson.
TalksSlides from Talks VideosMy youtube channels LabsProjects/Tools/experiments/demos ArticlesArticles PhotosPictures and Albums
close >>

call, bind e apply no JavaScript - parte 2

call, bind e apply no JavaScript - parte 2
Sept 22nd, 2014 : es6, javascript, ecma6, es2015 Este post, é uma continuação de outro post, mais focado em funções.
Neste, focaremos realmente nos três métodos do título deste artigo, .call, .bind e .apply.

Agora que você já leu sobre hoisting, escopos, e como as funções funcionam e podem ser declaradas e executadas na primeira parte deste artigo, podemos abordar esta, que considero ser uma parte um pouco mais avançada do JavaScript.

Estes três métodos estão presentes no prototype de Function, ou seja, toda função terá estes métodos, nativamente.
Uma coisa bacana, também, é que isto funciona igualzinho em nodejs ;)
.call() O método .call, literalmente, "chama" a sua função.

function func1(){
    return 1;
}

var func2= function(){
    return 2;
}

func1.call(); // 1
func2.call(); // 2

A diferença, está nos argumentos(parâmetros) passados a esta função. Ela permite que você possa setar qual o escopo daquela função.

// criando uma variável global apenas para demonstração
window.blah= 1;

// uma função que utiliza o this
function func1 () {
    console.log(this.blah);
}

// um objeto a ser usado como exemplo
var obj= {
    blah: 2
};

func1(); // 1 (vindo do objeto window), escopo atual
func1.call(obj); // 2 (vindo do objecto obj)

Além disso, podemos passar parâmetros para aquela função, além do escopo atual.


function func1 (arg1, arg2) {
    console.log(this.blah, arg1, arg2);
}

var obj= {
    blah: "x"
};

func1.call(obj, "a", 3); // "x", "a", 3

Um macete interessante, é que por exemplo, ao utilizar o objeto arguments, ele trata-se de uma collection, e não uma Array, por tanto, não tem alguns métodos do prototype de Array, como .forEach, ou .sort. Daí, podemos resolver isto usando:

function (){
    var args= Array.prototype.slice.call(arguments);
    args.forEach(...);
}
Isto funciona por que o método slice da Array basicamente pega uma "fatia" da array (o this, do ponto de vista do prototype), devolvendo em uma nova Array. Neste caso, estamos dizendo para o método slice, que o "this" dele, é na verdade aquela collection, e ele nos devolverá uma nova Array, com a fatia de 0 até o final dela(pois não passamos nenhum outro argumento a ela). .apply() O método apply da função, é parecido com o call, porém, ele recebe uma lista de argumentos, na forma de uma Array, mesmo.

// igual exemplo anterior
function func1 (arg1, arg2) {
    console.log(this.blah, arg1, arg2);
}

var obj= {
    blah: "x"
};

// apply está enviando uma Array, com a lista de parâmetros
func1.apply(obj, ["a", 3]); // "x", "a", 3
A principal vantagem é que algumas vezes, queremos apenas repassar os argumentos recebidos em uma função, diretamente para outra, usando o próprio arguments.

function func1(){
    someOtherFunc.apply(obj, Array.prototype.slice.call(arguments));
}
.bind() O bind, funciona um pouco diferente. Ele não executará sua função na mesma hora, como o call e o apply, ao contrário disto, ele RETORNARÁ uma nova função, a qual já estará com seu escopo definido.

// igual exemplo anterior
function func1 (arg1, arg2) {
    console.log(this.blah, arg1, arg2);
}

var obj= {
    blah: "x"
};

// a variável theFunction se tornará a função func1
// amarrada ao obj.
var theFunction= func1.bind(obj);

// ao chamar theFunction, o "this" dela já é o obj
theFunction("a", 123); // "x", "a", 123

Quando finalmente chamamos a função "theFunction", ela já ligada ao objeto "obj", e então, passamos neste momento os argumentos. Uma coisa interessante que vale lembrar, é que o bind, infelizmente, tem uma performance meio pobre! Então, cuidado ao sair usando e abusando dele por aí(em especial em loops)! Eis uma alternativa que o pessoal faz:

// igual exemplo anterior
function func1 (arg1, arg2) {
    console.log(this.blah, arg1, arg2);
}

var obj= {
    blah: "x"
};

// theFunction recebe, literalmente, uma função, a qual usará
// o .apply, quando chamada
var theFunction= function(){
    func1.apply(obj, Array.prototype.slice.call(arguments));
};

theFunction("a", 123); // "x", "a", 123

O resultado produzido é o mesmo, mas ao contrário de utilizar o .bind, estamos utilizando o .apply, passando adiante qualquer parâmetro passado àquela função. Finalizando Uma outra coisa interessante, é que o "this" em uma função, pode ser qualquer coisa...

function func3() {
    console.log(this);
}

func3(); // window
func3.call({ some: "prop" }); // object { some: "prop" }
func3.call("just a string"); // string "just a string"
func3.call(123); // number 123
func3.call(document.body); // object HTMLBodyElement

O que pode acabar sendo usado em situações como esta:

function calc(val1, val2){
    console.log(this.max(val1, val2));
    console.log(this.cos(val2));
    console.log(this.min(val1, val2));
    console.log(this.pow(val1, val2));
}

calc.call(Math, 2, 3); // 3, -0.9899924966004446, 2, 8

Espero que tenha sido um post útil e bem explicativo! :) Não deixem de divulgar o post, e dar sua opinião.