[Tutorial] Utilizando forEach em JavaScript

Em um programa de controle de notas, é criado uma tabela de visualização dos dados recuperados com as informações e notas dos alunos de uma turma X. Essa tabela possui 5 colunas de informação, são elas: Registro Acadêmico (RA), Nome, Nota da Avaliação 1 e da Avaliação 2, e a Média.

Exceto pela informação da média, todas as demais foram preenchidas a partir da consulta no banco de dados (premissa para o exemplo). A informação da média deve ser calculada após a construção da tela pelo navegador.

PS: É apenas para efeitos didáticos, os cálculos devem ser realizados a partir da aplicação back-end.

Ao abrir a página no navegador tem-se o seguinte resultado:

Página com as notas dos alunos, aguardando o cálculo das médias.

O primeiro passo é identifica o elemento do html que será manipulado, pelo JavaScript:

O elemento que interessa nesse momento é a tr, pois é nela que existem as informações sobre o aluno que são necessárias para o cálculo da média. O primeiro passo é identificar um seletor único que represente o objeto principal do sistema. Nesse caso é a classe aluno aplicada na tr da tabela. Depois, deve-se percorrer a lista de objetos gerada e a partir dos valores da avaliação 1 e 2, realizar o cálculo da média dos alunos. Veja o código a seguir:

Agora, a figura abaixo, apresenta o resultado visual do código em JavaScript aplicado:

Resultado após o primeiro código realizado.

O resultado não foi exatamente como o esperado, todas as médias tiveram o valor atribuído a NaN, isso significa nulo. Esse evento ocorreu, porque o tipo de valor retornado pela propriedade textContent é uma string (texto). Então, existe uma concatenação entre duas strings na linha 20, e na sequência uma divisão por 2 dessa concatenação. O resultado é um valor nulo, não existente.

Para realizar a correção desse código deve-se aplicar uma conversão das variáveis a1 e a2, que representam as notas das avaliações. Essa conversão é realizada através do método parseFloat (já que são números reais). Veja o código refinado:

O resultado obtido é:

Resultado após o parseFloat

Agora que foi possível realizar o cálculo da média das notas de cada aluno, é necessário estabelecer o padrão de exibição dos valores. O ideal é a exibição de duas casas decimais. O JavaScript auxilia o desenvolvedor com a função toFixed que recebe como parâmetro um inteiro que delimita a quantidade de casas decimais exibidas na tela. O código a seguir está com a função toFixed implementada no resultado do cálculo da média:

A linha 20 está destacada no código para apresentar a implementação da função toFixed. Agora o resultado obtido é apresentado na figura abaixo:

Exibição final do cálculo das médiasAté o momento utilizou-se o for tradicional. A implementação com o forEach é um pouco mais simples de realizar. Ele é um método incluso em qualquer objeto do tipo lista, no JavaScript. No caso do exemplo, a lista alunos possui esse método. O método forEach, recebe como parâmetro uma função anônima, que também possui um parâmetro. O parâmetro da função anônima representa um objeto do mesmo tipo do armazenado na lista. A cada iteração, o parâmetro da função anônima recebe um elemento da lista, até que esta seja totalmente percorrida. O código a seguir demonstra a implementação do código final para cálculo das médias dos alunos, utilizando a função forEach:

Basicamente, a linha 5 do código acima substitui as seguintes linhas do for tradicional:

A implementação com o forEach é mais simples e deixa o código mais legível. É uma boa prática para percorrer a lista inteira utilizando os recursos da linguagem JavaScript.

Qualquer dúvida que tiverem, podem deixar nos comentários ou entrar em contato que terei o prazer de esclarecer todas as dúvidas tiverem.

 

[Tutorial] Services no ROS

Assim como publisherssubscribers, um service permite que dados sejam passados de um nó para o outro. Só que os services têm uma característica diferente. A passagem é feita através de uma função de um nó servidor para o nó cliente, ou seja, são enviados paramêtros para essa função e é aguardado um valor de retorno. Por exemplo: o nó A chama a função x do nó B, esperando um retorno y para continuar a execução do seu código. As entradas e saídas dessa função são definidas através de mensagens.

Como comentado acima, existem dois elementos principais na criação de um service:

  • Server (Servidor): especifica um callback que é responsável por tratar a requisição ao service e avisá-lo sobre a requisição. (provedor do service)
  • Client (Cliente): tem acesso ao service através de um proxy local. (executa a chamada ao service)

Hello Service!

O primeiro passo para definição de um service é determinar quais são os paramêtros de entrada e saída. Isso é feito em um arquivo separado de código, como um arquivo de configuração. A estrutrura deste arquivo é similar a definição de uma mensagem do ROS.

Como exemplo, têm-se um programa que realiza a contagem de palavras em um array. Pode-se definir então, um paramêtro de entrada do tipo String e um paramêtro de saída do tipo inteiro. Agora, cria-se o arquivo ContaPalavras.srv, que contém a descrição dos paramêtros de entrada e saída. Seu conteúdo é:

Os três traços (—) delimitam a área de definição dos paramêtros de entrada e saída. Os arquivos que definem um service devem ser salvos com a extensão .srv dentro de um diretório de mesmo nome (srv), do seu pacote.

Com a definição do arquivo de serviço concluída, é necessário informar ao ROS que existe um service para compilar no pacote. O procedimento é bem similarao de gerar mensagens, onde deve-se incluir algumas diretizes no arquivo CMakeLists.txt respectivo ao pacote.

Na diretriz find_packages inclui-se o pacote de dependência message_generation, veja abaixo:

Na sequência deve-se informar quais são os arquivos .srv que devem ser adicionados ao processo de compilação do pacote:

Por fim, é necessário informar a diretriz que realiza o processo de gerar as dependências do arquivo de configuração do serviço:

Após a definição das diretrizes de compilação do pacote no arquivo CMakeLists.txt, é necessário executar o comando catkin_make no diretório raiz do seu workspace (ex: /home/user/catkin_ws/). Para conferir se tudo ocorreu com êxito, execute o comando rossrv show ContaPalavras.srv . Ele deve exibir o conteúdo do arquivo .srv .

Dando vida ao Service

Com todas as definições de um service feitas, é hora de implementar o código do server , que irá prover a função callback para a chamada do client. O server  fica ativo esperando durante a execução do sistema, esperando as requisições.

Um server para o arquivo ContaPalavras.srv é apresentado a seguir. Utiliza-se a linguagem Python para a criação do código. Veja o arquivo server.py:

Consumindo um Service

Para consumir um service deve-se criar uma chamada para sua função. Existem duas maneiras para realizar a requisição. A primeira é através do comando rosservice e a outra é através de um código client. Veja a seguir.

ROSSERVICE

Criando o client.py

Executando Clients and Services

São necessários três janelas de terminais, uma para cada comando, confira a seguir:

Para mais informações sobre o ROS, acesse aqui.

Referências utilizadas:

  1. Quigley, Morgan, et al. ROS: An Open-Source Robot Operating System. ICRA workshop on open source software. Vol. 3. No. 3.2. 2009.
  2. Martinez, Aaron, and Fernández, Enrique. Learning ROS for robotics programming. Packt Publishing Ltd, 2013.
  3. Joseph, Lentin. Mastering ROS for robotics programming. Packt Publishing Ltd, 2015.
  4. Quigley, Morgan, Gerkey, Brian, and Smart, William D.. Programming Robots with ROS: A Practical Introduction to the Robot Operating System. O’Reilly Media, Inc., 2015.

[Crítica] Livro – Star Wars: Marcas da Guerra

O universo de Star Wars é amplo e simplesmente fascinante. Ele consegue cativar um carinho de todos que se propõem a entrar nele. Com o livro Marcas da Guerra não foi diferente, Wendig trouxe uma narrativa interessante, fazendo com que o leitor consiga sentir angústia, felicidade, sufoco, alívio, sinta de cada um dos personagens os sentimentos e emoções por eles vivenciados durante toda trama.

O enredo do livro cria um apetite para saber o que vem na página seguinte, fazendo com que o leitor não queira parar de ler, nem por um único momento. Os novos personagens apresentados são absolutamente incríveis. A empatia por eles é imediata. A combinação feita das fraquezas e forças de cada um deles é mágica, um trabalho perfeito fazendo com que cada um complete o outro. Isso, sem mencionar como é a evolução de cada um dentro da história, feita de maneira suave, na medida correta para o leitor apreciar cada momento na companhia deles. Uma obra sublime.

Star Wars: Marcas da Guerra

Toda a contextualização do que acontece entre os sistemas governamentais do universo Star Wars, como as atitudes do governo afetam e influenciam o dia-a-dia da população, pode ser espelhada nas questões políticas que enfrentamos no nosso cotidiano. O papel do Império, Aliança Rebelde, República, Sindicato dos Crimes, entre outros, mostra como as coisas precisam funcionar e ainda que todos os sistemas possuem suas falhas perante o povo.

Em meu ponto de vista, essa obra só reforça o que Star Wars significa, a briga entre o bem e o mal, o certo e o errado, mas acima de tudo é como manter o equilíbrio da força. Seja este equilíbrio pessoal e dentro de si, com as questões profissionais, pessoais, os dilemas que enfrentamos em nossa jornada. Seja em questões coletivas e dentro do contexto de convivência mundial. E parafraseando o último interlúdio do livro:

Não é a questão de fazer algo certo, por que isso não tem como, mas é tentar fazer o certo e ouvir a todas as vozes da melhor maneira possível.

 

O livro é fantástico, só posso agradecer ao autor Chuck Wendig por retratar e escrever algo tão motivador e empolgante. Não vejo a hora de colocar as mãos no volume 2 dessa trilogia e continuar essa saga maravilhosa que é Marcas da Guerra.

Que a força esteja com todos vocês.

LARC/CBR 2015 – Uberlândia/MG

Entre os dias 28 de outubro e 01 de novembro de 2015, ocorreu a competição latino-americana e também brasileira de robótica. Durante esse periodo equipes de toda América Latina compentem para saber quem conseguiu desenvolver os robôs que melhor realizam os desafios propostos. Gostaria de contar um pouco sobre a experiência que tive esse ano, mas antes vou falar as categorias que são oferecidas no evento.

As categorias que envolvem a competição, podem propor desafios através de simuladores ou, como a maioria, embarcadados em robôs reais. São elas:

  • Robocup Soccer
    • Small Size (F180)
    • Simulation 2D
    • Simulation 3D
    • Humanoid League and Standard Platform League(SPL)
  • RoboCup Rescue Simulation Agents
  • RoboCup @Home
  • RoboCup Junior
  • RoboCup Festo Logistics
  • IEEE Standard Educational Kits(SEK)
  • IEEE Open
  • IEEE Very Small Size Soccer
  • IEEE Humanoid Robot Racing

Para saber mais sobre cada categoria acesse o site da competição, clicando aqui.

Esse ano foi uma experiência totalmente nova para a minha pessoa. Foi o primeiro ano em que participei não só como chair (coordenador) da categoria IEEE SEK, mas também como competidor na categoria RoboCup @Home, com nossa robô Judite. Essa robôzinha é muito especial, pois ela está nascendo em conjunto com meu doutorado, então tenho um grande carinho por ela e por meus grandes mestres e amigos que estão tornando tudo isso possível.

Além da @Home, também levamos mais duas equipes RoboFEI para a competição. Elas participaram da categoria F180 e Humanoid League.

A energia dentro do LARC/CBR é sempre maravilhosa, pois as equipes trabalham bem, apoiam umas as outras, brigam, se divertem, aprendem e principalmente dão muitas risadas juntas. Fico feliz de ver as equipes evoluindo cada vez mais nos desafios. Já fazem 3 anos que faço parte desse mundo e sou extremamente grato por isso.

Na SEK, as equipes são sempre muito competitivas e elevam o desafio a um nível muito alto que chega a dar orgulho de todas as equipes. São equipes que muitas vezes não possuem auxilio financeiro para vir até a competição e mesmo assim assumem um compromisso, com a intenção de no futuro fazerem grandes avanços para auxiliar a humanidade. Gostaria aqui de deixar o meu agradecimento a todos que participaram, vocês fazem essa competição ser sempre um orgulho a todos os envolvidos.

Como competidor a experiência foi nova. É estressante, prazeroso, cansativo, de muitas felicidades (mesmo quando não dá certo). Ficar programando o robô no hall do hotel até as 4 horas da madrugada e estar em pé as 6h30 e levar o robô para mais uma tarefa foi algo indescritivel (eu sei parece maluco). Mas, tudo isso valeu muito a pena, afinal conseguimos conquistar o 3º lugar na nossa primeira participação. Claro que isso não seria possível sem a equipe RoboFEI, todos vocês são fenomenais e merecem ser aplaudidos em pé. Ralaram, deram o sangue e suaram demais ao longo do semestre para fazer a Judite chegar no pódio.

E uma vez FEI, sempre FEI, e com a RoboFEI não é diferente. Uma vez parte da família, não importa qual foi o robô que você programou, você vai brigar igual em todas as categorias que a equipe participa. E como suor, trabalho, esforço e determinação definem o seu resultado, na F180 a equipe consegui o 1º lugar e na Humanoid League, ficamos em 2º lugar. Parabéns a todos! É algo que devemos sempre ter orgulho, fazer parte da família RoboFEI não é para qualquer um.

Além das competições, rever amigos de pesquisas e grandes profissionais, que tentam fazer a robótica algo melho na vida de todos, é sempre muito bom.

Não posso deixar de agradecer aqui a todo o pessoal da UFU e UFTM pelo carinho e dedicação, que fizeram dessa, uma das melhores competições que já participei. Esse agradecimento, vai para os professores e alunos que foram voluntários durante todo esse período e mais um pouquinho. E obrigado Uberlândia, que manteve a simpatia e o sorriso no rosto, para receber a todos durante o período do evento.

Acho que é isso pessoal! Vejam algumas fotos na galeria abaixo e não esqueçam de curti a página do RoboFEI.

*fotos por Fabrício F. Bonfim (FEI)